diff --git a/paket.dependencies b/paket.dependencies index 1b817243..fa67ecfc 100644 --- a/paket.dependencies +++ b/paket.dependencies @@ -48,7 +48,7 @@ nuget BenchmarkDotNet ~> 0.13.1 nuget TurboJpegWrapper ~> 1.5.2 nuget Suave ~> 2.5.6 -nuget Aardium ~> 2.1.0-prerelease0002 +nuget Aardium ~> 2.1.0-prerelease0003 nuget Chiron nuget Another.Unofficial.Xilium.CefGlue ~> 0.4.0 diff --git a/paket.lock b/paket.lock index a9e74bc4..7be0d2a4 100644 --- a/paket.lock +++ b/paket.lock @@ -2,7 +2,7 @@ STORAGE: NONE RESTRICTION: || (== net471) (== net6.0) (== net6.0-windows7.0) (== netstandard2.0) NUGET remote: https://api.nuget.org/v3/index.json - Aardium (2.1.0-prerelease0002) + Aardium (2.1.0-prerelease0003) Aardvark.Base (>= 5.2.13 < 5.3) FSharp.Core (>= 5.0.1) FSys (>= 0.0.1 < 0.1) diff --git a/src/Scratch/25 - GoldenLayout/resources/golden-layout/bundle/umd/golden-layout.js b/src/Scratch/25 - GoldenLayout/resources/golden-layout/bundle/umd/golden-layout.js index 7331e240..e9e3911f 100644 --- a/src/Scratch/25 - GoldenLayout/resources/golden-layout/bundle/umd/golden-layout.js +++ b/src/Scratch/25 - GoldenLayout/resources/golden-layout/bundle/umd/golden-layout.js @@ -2116,9 +2116,15 @@ class BrowserPopout extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Ev // Initial window size parameters describe client (i.e. inner) position and size // Since the border of the popout may have different borders than the main window, we have // to adjust the position and size once the window has been created. - const border = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_2__.getWindowTopLeftBorder)(this._popoutWindow); - this._popoutWindow.moveTo(this._initialWindowSize.left - border.width, this._initialWindowSize.top - border.height); - this._popoutWindow.resizeTo(this._initialWindowSize.width + (this._popoutWindow.outerWidth - this._popoutWindow.innerWidth), this._initialWindowSize.height + (this._popoutWindow.outerHeight - this._popoutWindow.innerHeight)); + // Only do this if the window parameters are plausible (e.g. on Linux inner dimension is zero sometimes) + if (this._popoutWindow.innerWidth > 0 && this._popoutWindow.innerHeight > 0 && + this._popoutWindow.outerWidth > 0 && this._popoutWindow.outerHeight > 0 && + this._popoutWindow.innerWidth <= this._popoutWindow.outerWidth && + this._popoutWindow.innerHeight <= this._popoutWindow.outerHeight) { + const border = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_2__.getWindowTopLeftBorder)(this._popoutWindow); + this._popoutWindow.moveTo(this._initialWindowSize.left - border.width, this._initialWindowSize.top - border.height); + this._popoutWindow.resizeTo(this._initialWindowSize.width + (this._popoutWindow.outerWidth - this._popoutWindow.innerWidth), this._initialWindowSize.height + (this._popoutWindow.outerHeight - this._popoutWindow.innerHeight)); + } this._popoutWindow.focus(); } /** @@ -2271,8 +2277,8 @@ class DragAction extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Event pageY >= this._boundingRect.top - proxy.outerHeight && pageY < this._boundingRect.bottom); } - createProxy(item, stack, x, y) { - this._dragProxy = new _drag_proxy__WEBPACK_IMPORTED_MODULE_3__.DragProxy(this, item, stack, x, y); + createProxy(item, x, y) { + this._dragProxy = new _drag_proxy__WEBPACK_IMPORTED_MODULE_3__.DragProxy(this, item, x, y); } dragLocal(pageX, pageY) { if (this._dragProxy !== null) { @@ -2299,7 +2305,7 @@ class DragAction extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Event } const config = source.componentItem.toConfig(); const dragItem = new _items_component_item__WEBPACK_IMPORTED_MODULE_4__.ComponentItem(this.layoutManager, config, parent); - this.createProxy(dragItem, null, pageX, pageY); + this.createProxy(dragItem, pageX, pageY); } } else { @@ -2335,7 +2341,7 @@ class DragAction extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Event else if (this._dragProxy !== null) { t = this.dragLocal(event.pageX, event.pageY); } - if (target === null) { + if (target === null || (t !== null && target.owner.layoutManager.parent === null)) { target = t; } } @@ -2363,10 +2369,9 @@ class DragAction extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Event return new DragAction(layoutManager, false, parent); } // Start a drag action, immediately showing a proxy element. - static start(layoutManager, listener, item, stack, x, y) { - const allowPopout = layoutManager.layoutConfig.settings.dragToNewWindow && (item.findAncestorWithSiblings() !== null); + static start(layoutManager, listener, item, x, y, allowPopout) { const action = new DragAction(layoutManager, allowPopout); - action.createProxy(item, stack, x, y); + action.createProxy(item, x, y); action._dragListener = listener; listener.on('drag', action._dragEventHandler); listener.on('dragStop', action._dragStopEventHandler); @@ -2407,11 +2412,10 @@ class DragProxy extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.EventE * @param y - The initial y position * @internal */ - constructor(_action, _componentItem, _originalStack, x, y) { + constructor(_action, _componentItem, x, y) { super(); this._action = _action; this._componentItem = _componentItem; - this._originalStack = _originalStack; this._originalSize = this._componentItem.getOuterBoundingClientRect(); this.createDragProxyElements(x, y); if (this._componentItem.parent === null) { @@ -2422,6 +2426,7 @@ class DragProxy extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.EventE if (this._componentItemFocused) { this._componentItem.blur(); } + this._dockPoint = this._componentItem.findDockPoint(); if (this._componentItem.parent.contentItems.includes(this._componentItem)) { this._componentItem.parent.removeChild(this._componentItem, true); } @@ -2437,7 +2442,7 @@ class DragProxy extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.EventE get layoutManager() { return this._action.layoutManager; } /** Create Stack-like structure to contain the dragged component */ createDragProxyElements(initialX, initialY) { - var _a, _b, _c, _d; + var _a; this._element = document.createElement('div'); this._element.classList.add("lm_dragProxy" /* DragProxy */); const headerElement = document.createElement('div'); @@ -2455,11 +2460,11 @@ class DragProxy extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.EventE this._proxyContainerElement.classList.add("lm_content" /* Content */); this._element.appendChild(headerElement); this._element.appendChild(this._proxyContainerElement); - const stack = (_d = (_a = this._originalStack) !== null && _a !== void 0 ? _a : (_c = (_b = this._action.parent) === null || _b === void 0 ? void 0 : _b.proxy) === null || _c === void 0 ? void 0 : _c._originalStack) !== null && _d !== void 0 ? _d : null; - if (stack !== null && stack.headerShow) { - this._sided = stack.headerLeftRightSided; - this._element.classList.add('lm_' + stack.headerSide); - if ([_utils_types__WEBPACK_IMPORTED_MODULE_2__.Side.right, _utils_types__WEBPACK_IMPORTED_MODULE_2__.Side.bottom].indexOf(stack.headerSide) >= 0) { + const side = (_a = this._componentItem.headerConfig) === null || _a === void 0 ? void 0 : _a.show; + if (side) { + this._sided = [_utils_types__WEBPACK_IMPORTED_MODULE_2__.Side.right, _utils_types__WEBPACK_IMPORTED_MODULE_2__.Side.left].includes(side); + this._element.classList.add('lm_' + side); + if ([_utils_types__WEBPACK_IMPORTED_MODULE_2__.Side.right, _utils_types__WEBPACK_IMPORTED_MODULE_2__.Side.bottom].indexOf(side) >= 0) { this._proxyContainerElement.insertAdjacentElement('afterend', headerElement); } } @@ -2528,7 +2533,7 @@ class DragProxy extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.EventE width: this._originalSize.width, height: this._originalSize.height }; - this.layoutManager.createPopoutFromContentItem(this._componentItem, window, (0,_utils_utils__WEBPACK_IMPORTED_MODULE_3__.getUniqueId)(), undefined); + this.layoutManager.createPopoutFromContentItem(this._componentItem, window, (0,_utils_utils__WEBPACK_IMPORTED_MODULE_3__.getUniqueId)(), this._dockPoint); this._componentItem.destroy(); /** * The drag didn't ultimately end up with adding the content item to @@ -2698,7 +2703,7 @@ class DragSource { throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_5__.UnexpectedNullError('DSODSD66746'); } else { - const action = _drag_action__WEBPACK_IMPORTED_MODULE_6__.DragAction.start(this._layoutManager, this._dragListener, componentItem, null, x, y); + const action = _drag_action__WEBPACK_IMPORTED_MODULE_6__.DragAction.start(this._layoutManager, this._dragListener, componentItem, x, y, false); const transitionIndicator = this._layoutManager.transitionIndicator; if (transitionIndicator === null) { throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_5__.UnexpectedNullError('DSODST66746'); @@ -2992,8 +2997,9 @@ class Header extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.EventEmit * @internal */ updateButtons() { - var _a, _b; + var _a, _b, _c; const activeComponentItem = this._getActiveComponentItemEvent(); + const isLast = this._parent.findAncestorWithSiblings() === null; // Close button is only visible if all items of the stack are closable // and the active component has its close button set to visible. Note that // hiding the close button in a header of an item is not equivalent to making @@ -3002,22 +3008,20 @@ class Header extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.EventEmit const close = ((_a = activeComponentItem === null || activeComponentItem === void 0 ? void 0 : activeComponentItem.headerConfig) === null || _a === void 0 ? void 0 : _a.close) !== false; (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.setElementDisplayVisibility)(this._closeButton.element, allClosable && close); // Popout button is visible if the active component is closable and has its popout button enabled. - // If popoutWholeStack = true, the button is visible if this is true for every item. - let popout; + // If popoutWholeStack = true, the button is only visible if every item is closable. // Also we want to prevent popping out if that would leave us with an empty layout. - let isLast = this.tabs[0].componentItem.findAncestorWithSiblings() === null; + let popout = ((_b = activeComponentItem === null || activeComponentItem === void 0 ? void 0 : activeComponentItem.headerConfig) === null || _b === void 0 ? void 0 : _b.popout) !== false; if (this._layoutManager.layoutConfig.settings.popoutWholeStack) { - const allPopoutable = this.tabs.every(tab => { var _a; return ((_a = tab.componentItem.headerConfig) === null || _a === void 0 ? void 0 : _a.popout) !== false; }); - popout = !isLast && allClosable && allPopoutable; + popout && (popout = !isLast && allClosable); } else { - isLast && (isLast = this.tabs.length === 1); const closable = (activeComponentItem === null || activeComponentItem === void 0 ? void 0 : activeComponentItem.isClosable) !== false; - popout = !isLast && closable && (((_b = activeComponentItem === null || activeComponentItem === void 0 ? void 0 : activeComponentItem.headerConfig) === null || _b === void 0 ? void 0 : _b.popout) !== false); + popout && (popout = !(isLast && this.tabs.length === 1) && closable); } (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.setElementDisplayVisibility)(this._popoutButton.element, popout); - // Maximize button is only visible if all items have their maximize button enabled. - const maximize = this.tabs.every(tab => { var _a; return ((_a = tab.componentItem.headerConfig) === null || _a === void 0 ? void 0 : _a.maximise) !== false; }); + // Maximize button is visible if the active component has its maximize button enabled or the stack is already maximized. + // Also hide it if stack is the last item in the layout. + const maximize = (((_c = activeComponentItem === null || activeComponentItem === void 0 ? void 0 : activeComponentItem.headerConfig) === null || _c === void 0 ? void 0 : _c.maximise) !== false || this._parent.isMaximised) && !isLast; (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.setElementDisplayVisibility)(this._maximiseButton.element, maximize); } /** @internal */ @@ -4774,6 +4778,7 @@ class ContentItem extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Even contentItem: this }; } + /** @internal */ findAncestorWithSiblings() { let curr = this; while (curr !== null) { @@ -4784,6 +4789,21 @@ class ContentItem extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Even } return null; } + /** + * Finds an ancestor that will exist even after the item is removed and returns it as dock point. + * + * @internal */ + findDockPoint() { + const anchor = this.findAncestorWithSiblings(); + if (anchor !== null && anchor.parent !== null) { + const index = anchor.parent._contentItems.indexOf(anchor); + return { parent: anchor.parent, index }; + } + else if (this.layoutManager.groundItem) { + return { parent: this.layoutManager.groundItem, index: null }; + } + return null; + } /** * The tree of content items is created in two steps: First all content items are instantiated, * then init is called recursively from top to bottem. This is the basic init function, @@ -6634,9 +6654,9 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp const tabDropPlaceholderRect = this.layoutManager.tabDropPlaceholder.getBoundingClientRect(); const tabDropPlaceholderRectTop = tabDropPlaceholderRect.top + document.body.scrollTop; const tabDropPlaceholderRectLeft = tabDropPlaceholderRect.left + document.body.scrollLeft; - const tabDropPlaceholderRectWidth = tabDropPlaceholderRect.width; if (this._header.leftRightSided) { const placeHolderTop = tabDropPlaceholderRectTop; + const tabDropPlaceholderRectWidth = tabDropPlaceholderRect.height; area = { x1: tabTop, x2: tabTop + tabElement.clientHeight, @@ -6646,6 +6666,7 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp } else { const placeHolderLeft = tabDropPlaceholderRectLeft; + const tabDropPlaceholderRectWidth = tabDropPlaceholderRect.width; area = { x1: placeHolderLeft, x2: placeHolderLeft + tabDropPlaceholderRectWidth, @@ -6665,7 +6686,7 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp setupHeaderPosition() { (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.setElementDisplayVisibility)(this._header.element, this._header.show); this.element.classList.remove("lm_left" /* Left */, "lm_right" /* Right */, "lm_bottom" /* Bottom */); - if (this._header.leftRightSided) { + if (this._header.side !== _utils_types__WEBPACK_IMPORTED_MODULE_1__.Side.top) { this.element.classList.add('lm_' + this._header.side); } //if ([Side.right, Side.bottom].includes(this._header.side)) { @@ -6732,7 +6753,7 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp if (this.isMaximised === true) { this.toggleMaximise(); } - this.layoutManager.startComponentDrag(x, y, dragListener, componentItem, this); + this.layoutManager.startComponentDrag(x, y, dragListener, componentItem); } /** @internal */ createHeaderConfig() { @@ -6885,6 +6906,8 @@ class LayoutManager extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Ev /** @internal */ this._parent = null; /** @internal */ + this._lastArea = null; + /** @internal */ this._resizeObserver = new ResizeObserver(() => this.handleContainerResize()); /** @internal @deprecated to be removed in version 3 */ this._windowBeforeUnloadListener = () => this.onBeforeUnload(); @@ -7465,26 +7488,9 @@ class LayoutManager extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Ev return this.findFirstContentItemTypeByIdRecursive(_utils_types__WEBPACK_IMPORTED_MODULE_8__.ItemType.component, id, this._groundItem); } } - /** - * Creates a popout window with the specified content at the specified position - * - * @param itemConfigOrContentItem - The content of the popout window's layout manager derived from either - * a {@link (ContentItem:class)} or {@link (ItemConfig:interface)} or ResolvedItemConfig content (array of {@link (ItemConfig:interface)}) - * @param positionAndSize - The width, height, left and top of Popout window - * @param parentId -The id of the element this item will be appended to when popIn is called - * @param indexInParent - The position of this item within its parent element - */ - createPopout(itemConfigOrContentItem, positionAndSize, parentId, indexInParent) { - if (itemConfigOrContentItem instanceof _items_content_item__WEBPACK_IMPORTED_MODULE_11__.ContentItem) { - return this.createPopoutFromContentItem(itemConfigOrContentItem, positionAndSize, parentId, indexInParent); - } - else { - return this.createPopoutFromItemConfig(itemConfigOrContentItem, positionAndSize, parentId, indexInParent); - } - } /** @internal */ - createPopoutFromContentItem(item, window, parentId, indexInParent) { - var _a, _b, _c; + createPopoutFromContentItem(item, window, parentId, dockPoint) { + var _a; /** * If the item is the only component within a stack or for some * other reason the only child of its parent the parent will be destroyed @@ -7493,19 +7499,13 @@ class LayoutManager extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Ev * In order to support this we move up the tree until we find something * that will remain after the item is being popped out */ - const anchor = (_a = item.findAncestorWithSiblings()) !== null && _a !== void 0 ? _a : (_b = this.groundItem) === null || _b === void 0 ? void 0 : _b.contentItems[0]; - if (anchor === undefined) { - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_9__.UnexpectedUndefinedError('LMCPFCI00833'); - } - if (anchor.parent === null) { + const dock = dockPoint !== null && dockPoint !== void 0 ? dockPoint : item.findDockPoint(); + if (dock === null) { throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_9__.UnexpectedNullError('LMCPFCI00834'); } else { - if (indexInParent === undefined) { - indexInParent = anchor.parent.contentItems.indexOf(anchor); - } if (parentId !== null) { - anchor.parent.addPopInParentId(parentId); + dock.parent.addPopInParentId(parentId); } if (window === undefined) { const innerScreen = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_12__.getWindowInnerScreenPosition)(globalThis); @@ -7518,14 +7518,14 @@ class LayoutManager extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Ev }; } const itemConfig = item.toConfig(); - if ((_c = item.parent) === null || _c === void 0 ? void 0 : _c.contentItems.includes(item)) { + if ((_a = item.parent) === null || _a === void 0 ? void 0 : _a.contentItems.includes(item)) { item.remove(); } if (!_config_resolved_config__WEBPACK_IMPORTED_MODULE_4__.ResolvedRootItemConfig.isRootItemConfig(itemConfig)) { throw new Error(`${_utils_i18n_strings__WEBPACK_IMPORTED_MODULE_2__.i18nStrings[0 /* PopoutCannotBeCreatedWithGroundItemConfig */]}`); } else { - return this.createPopoutFromItemConfig(itemConfig, window, parentId, indexInParent); + return this.createPopoutFromItemConfig(itemConfig, window, parentId, dock.index); } } } @@ -7650,16 +7650,23 @@ class LayoutManager extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Ev _controls_drag_action__WEBPACK_IMPORTED_MODULE_18__.DragAction.spawn(this, parent); } /** @internal */ - startComponentDrag(x, y, dragListener, componentItem, stack) { - // Cancel the drag of the last remaining component immediately if: - // (1) this is the main window (which must not be destroyed, popouts are closed when the last component is removed) - // (2) or dragging between windows is disabled (only the current location is a valid drop target) - if ((this._parent === null || !this.layoutConfig.settings.dragBetweenWindows) && componentItem.findAncestorWithSiblings() === null) { + startComponentDrag(x, y, dragListener, componentItem) { + var _a; + const isLast = componentItem.findAncestorWithSiblings() === null; + const allowPopout = componentItem.isClosable && + this.layoutConfig.settings.dragToNewWindow && + (this.parent === null || !isLast); // Popout is destroyed when last component is removed, drag to new popout makes no sense + const canMoveBetweenWindows = componentItem.isClosable && + this.layoutConfig.settings.dragBetweenWindows && + ((_a = this._parent) !== null && _a !== void 0 ? _a : this)._openPopouts.length > 0; // Are there even multiple windows? + // Cancel the drag if this is the last component and there are no valid external targets. + // In this case, only the current layout configuration is possible, so there is no point in dragging. + if (isLast && !allowPopout && !canMoveBetweenWindows) { dragListener.cancelDrag(); return; } - const action = _controls_drag_action__WEBPACK_IMPORTED_MODULE_18__.DragAction.start(this, dragListener, componentItem, stack, x, y); - if (this.layoutConfig.settings.dragBetweenWindows) { + const action = _controls_drag_action__WEBPACK_IMPORTED_MODULE_18__.DragAction.start(this, dragListener, componentItem, x, y, allowPopout); + if (canMoveBetweenWindows) { for (let lm of this.instances) { if (lm !== this) { lm.startExternalComponentDrag(action); @@ -7828,6 +7835,10 @@ class LayoutManager extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Ev } /** @internal */ getArea(x, y) { + if (this._groundItem === undefined) { + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_9__.UnexpectedUndefinedError('LMGA44365'); + } + const groundArea = this._groundItem.getElementArea(); let matchingArea = null; let smallestSurface = Infinity; for (let i = 0; i < this._itemAreas.length; i++) { @@ -7841,7 +7852,12 @@ class LayoutManager extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Ev matchingArea = area; } } - return matchingArea; + // If we have no matching area, return the last area instead (unless we are out of bounds of the ground item). + // Avoids issues with splitters which don't have an area themselves. + if (matchingArea !== null || x < groundArea.x1 || x >= groundArea.x2 || y < groundArea.y1 || y >= groundArea.y2) { + this._lastArea = matchingArea; + } + return this._lastArea; } /** @internal */ calculateItemAreas() { @@ -9506,7 +9522,7 @@ function getWindowTopLeftBorder(window) { borderX = innerScreenX - window.screenX; borderY = innerScreenY - window.screenY; } - return { width: borderX, height: borderY }; + return { width: Math.max(0, borderX), height: Math.max(0, borderY) }; } /** @internal */ function getWindowInnerScreenPosition(window) { @@ -10066,4 +10082,4 @@ __webpack_require__.r(__webpack_exports__); /******/ })() ; }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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OztXQ1BBOzs7OztXQ0FBO1dBQ0E7V0FDQTtXQUNBLHVEQUF1RCxpQkFBaUI7V0FDeEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNObUM7QUFDUztBQUM0QjtBQUNYO0FBQ047QUFDVDtBQUNOO0FBQ0c7QUFDTztBQUNRO0FBQ0o7QUFDQztBQUNkO0FBQ1c7QUFDSTtBQUNSO0FBQ1I7QUFDb0I7QUFDM0I7QUFDbUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy8uL3NyYy90cy9jb25maWcvY29uZmlnLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb25maWcvcmVzb2x2ZWQtY29uZmlnLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250YWluZXIvY29tcG9uZW50LWNvbnRhaW5lci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvYnJvd3Nlci1wb3BvdXQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL2RyYWctYWN0aW9uLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9kcmFnLXByb3h5LnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9kcmFnLXNvdXJjZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvZHJvcC10YXJnZXQtaW5kaWNhdG9yLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9oZWFkZXItYnV0dG9uLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9oZWFkZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL3NwbGl0dGVyLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy90YWIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL3RhYnMtY29udGFpbmVyLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy90cmFuc2l0aW9uLWluZGljYXRvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvZXJyb3JzL2V4dGVybmFsLWVycm9yLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9lcnJvcnMvaW50ZXJuYWwtZXJyb3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2dvbGRlbi1sYXlvdXQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2l0ZW1zL2NvbXBvbmVudC1pdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9pdGVtcy9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9pdGVtcy9jb250ZW50LWl0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2l0ZW1zL2dyb3VuZC1pdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9pdGVtcy9yb3ctb3ItY29sdW1uLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9pdGVtcy9zdGFjay50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvbGF5b3V0LW1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL2NvbmZpZy1taW5pZmllci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdXRpbHMvZHJhZy1saXN0ZW5lci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdXRpbHMvZXZlbnQtZW1pdHRlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdXRpbHMvZXZlbnQtaHViLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy9pMThuLXN0cmluZ3MudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL3N0eWxlLWNvbnN0YW50cy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdXRpbHMvdHlwZXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL3V0aWxzLnRzIiwid2VicGFjazovLy8uL3NyYy90cy92aXJ0dWFsLWxheW91dC50cyIsIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZ29sZGVuTGF5b3V0XCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImdvbGRlbkxheW91dFwiXSA9IGZhY3RvcnkoKTtcbn0pKGdsb2JhbFRoaXMsICgpID0+IHtcbnJldHVybiAiLCJpbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvZXh0ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yLCBVbnJlYWNoYWJsZUNhc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IEkxOG5TdHJpbmdJZCwgaTE4blN0cmluZ3MgfSBmcm9tICcuLi91dGlscy9pMThuLXN0cmluZ3MnO1xyXG5pbXBvcnQgeyBJdGVtVHlwZSwgSnNvblZhbHVlLCBSZXNwb25zaXZlTW9kZSwgU2lkZSwgU2l6ZVVuaXRFbnVtIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBkZWVwRXh0ZW5kVmFsdWUsIHNwbGl0U3RyaW5nQXRGaXJzdE5vbk51bWVyaWNDaGFyIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQge1xyXG4gICAgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZEl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZExheW91dENvbmZpZyxcclxuICAgIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLFxyXG4gICAgUmVzb2x2ZWRSb290SXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWdcclxufSBmcm9tIFwiLi9yZXNvbHZlZC1jb25maWdcIjtcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUNvbmZpZyB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBpdGVtLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdyb3cnLCAnY29sdW1uJywgJ3N0YWNrJywgJ2NvbXBvbmVudCcuXHJcbiAgICAgKi9cclxuICAgIHR5cGU6IEl0ZW1UeXBlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2YgY29uZmlndXJhdGlvbnMgZm9yIGl0ZW1zIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGFzIGNoaWxkcmVuIG9mIHRoaXMgaXRlbS5cclxuICAgICAqL1xyXG4gICAgY29udGVudD86IEl0ZW1Db25maWdbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB3aWR0aCBvZiB0aGlzIGl0ZW0sIHJlbGF0aXZlIHRvIHRoZSBvdGhlciBjaGlsZHJlbiBvZiBpdHMgcGFyZW50IGluIHBlcmNlbnRcclxuICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKEl0ZW1Db25maWc6aW50ZXJmYWNlKS5zaXplfSBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIHdpZHRoPzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1pbmltdW0gd2lkdGggb2YgdGhpcyBpdGVtIGluIHBpeGVsc1xyXG4gICAgICogQ0FVVElPTiAtIE5vdCB0ZXN0ZWQgLSBkbyBub3QgdXNlXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChJdGVtQ29uZmlnOmludGVyZmFjZSkubWluU2l6ZX0gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBtaW5XaWR0aD86IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBoZWlnaHQgb2YgdGhpcyBpdGVtLCByZWxhdGl2ZSB0byB0aGUgb3RoZXIgY2hpbGRyZW4gb2YgaXRzIHBhcmVudCBpbiBwZXJjZW50XHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChJdGVtQ29uZmlnOmludGVyZmFjZSkuc2l6ZX0gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBoZWlnaHQ/OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWluaW11bSBoZWlnaHQgb2YgdGhpcyBpdGVtIGluIHBpeGVsc1xyXG4gICAgICogQ0FVVElPTiAtIE5vdCB0ZXN0ZWQgLSBkbyBub3QgdXNlXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChJdGVtQ29uZmlnOmludGVyZmFjZSkubWluU2l6ZX0gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBtaW5IZWlnaHQ/OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGlzIGl0ZW0uXHJcbiAgICAgKiBGb3Igcm93cywgaXQgc3BlY2lmaWVzIGhlaWdodC4gRm9yIGNvbHVtbnMsIGl0IHNwZWNpZmllcyB3aWR0aC5cclxuICAgICAqIEhhcyBmb3JtYXQgXFw8bnVtYmVyXFw+XFw8e0BsaW5rIFNpemVVbml0fVxcPi4gQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgdW5pdHMgYGZyYCBhbmQgYCVgLlxyXG4gICAgICpcclxuICAgICAqIFNwYWNlIGlzIGZpcnN0IHByb3BvcnRpb25hbGx5IGFsbG9jYXRlZCB0byBpdGVtcyB3aXRoIHNpemVVbml0IGAlYC5cclxuICAgICAqIElmIHRoZXJlIGlzIGFueSBzcGFjZSBsZWZ0IG92ZXIgKGxlc3MgdGhhbiAxMDAlIGFsbG9jYXRlZCksIHRoZW4gdGhlXHJcbiAgICAgKiByZW1haW5kZXIgaXMgYWxsb2NhdGVkIHRvIHRoZSBpdGVtcyB3aXRoIHVuaXQgYGZyYCBhY2NvcmRpbmcgdG8gdGhlIGZyYWN0aW9uYWwgc2l6ZS5cclxuICAgICAqIElmIG1vcmUgdGhhbiAxMDAlIGlzIGFsbG9jYXRlZCwgdGhlbiBhbiBleHRyYSA1MCUgaXMgYWxsb2NhdGVkIHRvIGl0ZW1zIHdpdGggdW5pdCBgZnJgIGFuZFxyXG4gICAgICogaXMgYWxsb2NhdGVkIHRvIGVhY2ggaXRlbSBhY2NvcmRpbmcgdG8gaXRzIGZyYWN0aW9uYWwgc2l6ZS4gQWxsIGl0ZW0gc2l6ZXMgYXJlIHRoZW4gYWRqdXN0ZWRcclxuICAgICAqIHRvIGJyaW5nIHRoZSB0b3RhbCBiYWNrIHRvIDEwMCVcclxuICAgICAqL1xyXG4gICAgc2l6ZT86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzaXplIG9mIHRoaXMgaXRlbS5cclxuICAgICAqIEZvciByb3dzLCBpdCBzcGVjaWZpZXMgaGVpZ2h0LiBGb3IgY29sdW1ucywgaXQgc3BlY2lmaWVzIHdpZHRoLlxyXG4gICAgICogSGFzIGZvcm1hdCA8bnVtYmVyPjxzaXplVW5pdD4uIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHVuaXRzIGBweGBcclxuICAgICAqL1xyXG4gICAgbWluU2l6ZT86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBDb250ZW50SXRlbS5cclxuICAgICAqIERvIE5PVCBhc3NpZ24gYW4gYXJyYXkuICBUaGlzIG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgcHVycG9zZXMuICBJZiBhbiBhcnJheSBpcyBhc3NpZ25lZCwgdGhlIGZpcnN0IGVsZW1lbnRcclxuICAgICAqIHdpbGwgYmVjb21lIHRoZSBpZC5cclxuICAgICAqL1xyXG4gICAgaWQ/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBpdGVtIGlzIGNsb3NhYmxlLiBJZiBmYWxzZSwgdGhlIHggb24gdGhlIGl0ZW1zIHRhYiB3aWxsIGJlIGhpZGRlbiBhbmQgY29udGFpbmVyLmNsb3NlKClcclxuICAgICAqIHdpbGwgcmV0dXJuIGZhbHNlXHJcbiAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgKi9cclxuICAgIGlzQ2xvc2FibGU/OiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRpdGxlIG9mIHRoZSBpdGVtIGFzIGRpc3BsYXllZCBvbiBpdHMgdGFiIGFuZCBvbiBwb3BvdXQgd2luZG93c1xyXG4gICAgICogRGVmYXVsdDogY29tcG9uZW50VHlwZS50b1N0cmluZygpIG9yICcnXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBvbmx5IENvbXBvbmVudCBoYXMgYSB0aXRsZVxyXG4gICAgICovXHJcbiAgICB0aXRsZT86IHN0cmluZztcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBJdGVtQ29uZmlnIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBjb25zdCBlbnVtIFNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlIHtcclxuICAgICAgICBOb25lLFxyXG4gICAgICAgIFNpemUsXHJcbiAgICAgICAgV2lkdGhPckhlaWdodCxcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShpdGVtQ29uZmlnOiBJdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0OiBib29sZWFuKTogUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgICAgICBzd2l0Y2ggKGl0ZW1Db25maWcudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoJ0l0ZW1Db25maWcgY2Fubm90IHNwZWNpZnkgdHlwZSBncm91bmQnLCBKU09OLnN0cmluZ2lmeShpdGVtQ29uZmlnKSk7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBSb3dPckNvbHVtbkl0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnIGFzIFJvd09yQ29sdW1uSXRlbUNvbmZpZywgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0YWNrSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcgYXMgU3RhY2tJdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudEl0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnIGFzIENvbXBvbmVudEl0ZW1Db25maWcsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQpO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignVUNVSUNSNTU0OTknLCBpdGVtQ29uZmlnLnR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNvbnRlbnQoY29udGVudDogSXRlbUNvbmZpZ1tdIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gY29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBJdGVtQ29uZmlnLnJlc29sdmUoY29udGVudFtpXSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSWQoaWQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlkLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpZFswXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNpemUoXHJcbiAgICAgICAgc2l6ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIHdpZHRoOiBudW1iZXIgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgaGVpZ2h0OiBudW1iZXIgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdDogYm9vbGVhbik6XHJcbiAgICBTaXplV2l0aFVuaXQge1xyXG4gICAgICAgIC8vIFJlbW92ZSBzdXBwb3J0IGZvciByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0IGluIGEgbWFqb3IgdmVyc2lvbiByZWxlYXNlXHJcblxyXG4gICAgICAgIGlmIChzaXplICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlU2l6ZShzaXplLCBbU2l6ZVVuaXRFbnVtLlBlcmNlbnQsIFNpemVVbml0RW51bS5GcmFjdGlvbmFsXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHdpZHRoICE9PSB1bmRlZmluZWQgfHwgaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh3aWR0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogd2lkdGgsIHNpemVVbml0OiBTaXplVW5pdEVudW0uUGVyY2VudCB9O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogaGVpZ2h0LCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBlcmNlbnQgfTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdDUlMzMzM5MCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChyb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogNTAsIHNpemVVbml0OiBTaXplVW5pdEVudW0uUGVyY2VudCB9O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZSwgc2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplVW5pdCB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTWluU2l6ZShtaW5TaXplOiBzdHJpbmcgfCB1bmRlZmluZWQsIG1pbldpZHRoOiBudW1iZXIgfCB1bmRlZmluZWQsIG1pbkhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkKTogVW5kZWZpbmFibGVTaXplV2l0aFVuaXQge1xyXG4gICAgICAgIGlmIChtaW5TaXplICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlU2l6ZShtaW5TaXplLCBbU2l6ZVVuaXRFbnVtLlBpeGVsXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbWluV2lkdGhEZWZpbmVkID0gbWluV2lkdGggIT09IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgY29uc3QgbWluSGVpZ2h0RGVmaW5lZCA9IG1pbkhlaWdodCAhPT0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBpZiAobWluV2lkdGhEZWZpbmVkIHx8IG1pbkhlaWdodERlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtaW5XaWR0aERlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiBtaW5XaWR0aCwgc2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QaXhlbCB9O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiBtaW5IZWlnaHQsIHNpemVVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplLCBzaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLm1pblNpemVVbml0IH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlKGNvbmZpZzogSXRlbUNvbmZpZyk6IFNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlIHtcclxuICAgICAgICBpZiAoY29uZmlnLnNpemUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUuU2l6ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY29uZmlnLndpZHRoICE9PSB1bmRlZmluZWQgfHwgY29uZmlnLmhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUuV2lkdGhPckhlaWdodDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBTaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZS5Ob25lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0dyb3VuZChjb25maWc6IEl0ZW1Db25maWcpOiBjb25maWcgaXMgSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5ncm91bmQ7XHJcbiAgICB9XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNSb3coY29uZmlnOiBJdGVtQ29uZmlnKTogY29uZmlnIGlzIEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBjb25maWcudHlwZSA9PT0gSXRlbVR5cGUucm93O1xyXG4gICAgfVxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ29sdW1uKGNvbmZpZzogSXRlbUNvbmZpZyk6IGNvbmZpZyBpcyBJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gY29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLmNvbHVtbjtcclxuICAgIH1cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1N0YWNrKGNvbmZpZzogSXRlbUNvbmZpZyk6IGNvbmZpZyBpcyBJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gY29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLnN0YWNrO1xyXG4gICAgfVxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcG9uZW50KGNvbmZpZzogSXRlbUNvbmZpZyk6IGNvbmZpZyBpcyBDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gY29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLmNvbXBvbmVudDtcclxuICAgIH1cclxufVxyXG5cclxuLy8gU3RhY2sgb3IgQ29tcG9uZW50XHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyZWRJdGVtQ29uZmlnIGV4dGVuZHMgSXRlbUNvbmZpZyB7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoSGVhZGVyZWRJdGVtQ29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnNob3d9IGluc3RlYWQgKi9cclxuICAgIGhhc0hlYWRlcnM/OiBib29sZWFuO1xyXG4gICAgaGVhZGVyPzogSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlcjtcclxuICAgIG1heGltaXNlZD86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSGVhZGVyZWRJdGVtQ29uZmlnIHtcclxuICAgIGNvbnN0IGxlZ2FjeU1heGltaXNlZElkID0gJ19fZ2xNYXhpbWlzZWQnO1xyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyIHtcclxuICAgICAgICBzaG93PzogZmFsc2UgfCBTaWRlO1xyXG4gICAgICAgIHBvcG91dD86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIGRvY2s/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICBtYXhpbWlzZT86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIGNsb3NlPzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgbWluaW1pc2U/OiBzdHJpbmc7XHJcbiAgICAgICAgdGFiRHJvcGRvd24/OiBmYWxzZSB8IHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIEhlYWRlciB7XHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaGVhZGVyOiBIZWFkZXIgfCB1bmRlZmluZWQsIGhhc0hlYWRlcnM6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIgfCB1bmRlZmluZWQge1xyXG4gICAgICAgICAgICBpZiAoaGVhZGVyID09PSB1bmRlZmluZWQgJiYgaGFzSGVhZGVycyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdzogaGVhZGVyPy5zaG93ID8/IChoYXNIZWFkZXJzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBoYXNIZWFkZXJzID8gUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnNob3cgOiBmYWxzZSksXHJcbiAgICAgICAgICAgICAgICAgICAgcG9wb3V0OiBoZWFkZXI/LnBvcG91dCxcclxuICAgICAgICAgICAgICAgICAgICBtYXhpbWlzZTogaGVhZGVyPy5tYXhpbWlzZSxcclxuICAgICAgICAgICAgICAgICAgICBjbG9zZTogaGVhZGVyPy5jbG9zZSxcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbWlzZTogaGVhZGVyPy5taW5pbWlzZSxcclxuICAgICAgICAgICAgICAgICAgICB0YWJEcm9wZG93bjogaGVhZGVyPy50YWJEcm9wZG93bixcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJZEFuZE1heGltaXNlZChjb25maWc6IEhlYWRlcmVkSXRlbUNvbmZpZyk6IHsgaWQ6IHN0cmluZywgbWF4aW1pc2VkOiBib29sZWFufSB7XHJcbiAgICAgICAgbGV0IGlkOiBzdHJpbmc7XHJcbiAgICAgICAgLy8gVG8gc3VwcG9ydCBsZWdhY3kgY29uZmlncyB3aXRoIElkIHNhdmVkIGFzIGFuIGFycmF5IG9mIHN0cmluZywgYXNzaWduIGNvbmZpZy5pZCB0byBhIHR5cGUgd2hpY2ggaW5jbHVkZXMgc3RyaW5nIGFycmF5XHJcbiAgICAgICAgbGV0IGxlZ2FjeUlkOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IGNvbmZpZy5pZDtcclxuICAgICAgICBsZXQgbGVnYWN5TWF4aW1pc2VkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGxlZ2FjeUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWQgPSBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGVnYWN5SWQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpZHggPSBsZWdhY3lJZC5maW5kSW5kZXgoKGlkKSA9PiBpZCA9PT0gbGVnYWN5TWF4aW1pc2VkSWQpXHJcbiAgICAgICAgICAgICAgICBpZiAoaWR4ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeU1heGltaXNlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5SWQgPSBsZWdhY3lJZC5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChsZWdhY3lJZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWQgPSBsZWdhY3lJZFswXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWQgPSBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZCA9IGxlZ2FjeUlkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbWF4aW1pc2VkOiBib29sZWFuO1xyXG4gICAgICAgIGlmIChjb25maWcubWF4aW1pc2VkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbWF4aW1pc2VkID0gY29uZmlnLm1heGltaXNlZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtYXhpbWlzZWQgPSBsZWdhY3lNYXhpbWlzZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geyBpZCwgbWF4aW1pc2VkIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdGFja0l0ZW1Db25maWcgZXh0ZW5kcyBIZWFkZXJlZEl0ZW1Db25maWcge1xyXG4gICAgdHlwZTogJ3N0YWNrJztcclxuICAgIGNvbnRlbnQ6IENvbXBvbmVudEl0ZW1Db25maWdbXTtcclxuICAgIC8qKiBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gY29udGVudCB3aGljaCBpcyB0byBiZSBhY3RpdmUqL1xyXG4gICAgYWN0aXZlSXRlbUluZGV4PzogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShpdGVtQ29uZmlnOiBTdGFja0l0ZW1Db25maWcsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQ6IGJvb2xlYW4pOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgeyBpZCwgbWF4aW1pc2VkIH0gPSBIZWFkZXJlZEl0ZW1Db25maWcucmVzb2x2ZUlkQW5kTWF4aW1pc2VkKGl0ZW1Db25maWcpO1xyXG4gICAgICAgIGNvbnN0IHsgc2l6ZSwgc2l6ZVVuaXQgfSA9IEl0ZW1Db25maWcucmVzb2x2ZVNpemUoaXRlbUNvbmZpZy5zaXplLCBpdGVtQ29uZmlnLndpZHRoLCBpdGVtQ29uZmlnLmhlaWdodCwgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCk7XHJcbiAgICAgICAgY29uc3QgeyBzaXplOiBtaW5TaXplLCBzaXplVW5pdDogbWluU2l6ZVVuaXQgfSA9IEl0ZW1Db25maWcucmVzb2x2ZU1pblNpemUoaXRlbUNvbmZpZy5taW5TaXplLCBpdGVtQ29uZmlnLm1pbldpZHRoLCBpdGVtQ29uZmlnLm1pbkhlaWdodCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLnN0YWNrLFxyXG4gICAgICAgICAgICBjb250ZW50OiByZXNvbHZlQ29udGVudChpdGVtQ29uZmlnLmNvbnRlbnQpLFxyXG4gICAgICAgICAgICBzaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IGl0ZW1Db25maWcuaXNDbG9zYWJsZSA/PyBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4OiBpdGVtQ29uZmlnLmFjdGl2ZUl0ZW1JbmRleCA/PyBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZy5kZWZhdWx0QWN0aXZlSXRlbUluZGV4LFxyXG4gICAgICAgICAgICBoZWFkZXI6IEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIucmVzb2x2ZShpdGVtQ29uZmlnLmhlYWRlciwgaXRlbUNvbmZpZy5oYXNIZWFkZXJzKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZChyZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcpOiBTdGFja0l0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogU3RhY2tJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgY29udGVudDogZnJvbVJlc29sdmVkQ29udGVudChyZXNvbHZlZENvbmZpZy5jb250ZW50KSxcclxuICAgICAgICAgICAgc2l6ZTogZm9ybWF0U2l6ZShyZXNvbHZlZENvbmZpZy5zaXplLCByZXNvbHZlZENvbmZpZy5zaXplVW5pdCksXHJcbiAgICAgICAgICAgIG1pblNpemU6IGZvcm1hdFVuZGVmaW5hYmxlU2l6ZShyZXNvbHZlZENvbmZpZy5taW5TaXplLCByZXNvbHZlZENvbmZpZy5taW5TaXplVW5pdCksXHJcbiAgICAgICAgICAgIGlkOiByZXNvbHZlZENvbmZpZy5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiByZXNvbHZlZENvbmZpZy5tYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IHJlc29sdmVkQ29uZmlnLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIGFjdGl2ZUl0ZW1JbmRleDogcmVzb2x2ZWRDb25maWcuYWN0aXZlSXRlbUluZGV4LFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KHJlc29sdmVkQ29uZmlnLmhlYWRlciksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmdW5jdGlvbiByZXNvbHZlQ29udGVudChjb250ZW50OiBDb21wb25lbnRJdGVtQ29uZmlnW10gfCB1bmRlZmluZWQpOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnQgPSBjb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkSXRlbUNvbmZpZyA9IGNvbnRlbnRbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gSXRlbUNvbmZpZy5yZXNvbHZlKGNoaWxkSXRlbUNvbmZpZywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFSZXNvbHZlZEl0ZW1Db25maWcuaXNDb21wb25lbnRJdGVtKGl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdVQ1VTSUNSQzkxMTE0JywgSlNPTi5zdHJpbmdpZnkoaXRlbUNvbmZpZykpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBpdGVtQ29uZmlnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGZ1bmN0aW9uIGZyb21SZXNvbHZlZENvbnRlbnQocmVzb2x2ZWRDb250ZW50OiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWdbXSk6IENvbXBvbmVudEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSByZXNvbHZlZENvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxDb21wb25lbnRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ29udGVudENvbmZpZyA9IHJlc29sdmVkQ29udGVudFtpXTtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gQ29tcG9uZW50SXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb250ZW50Q29uZmlnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRJdGVtQ29uZmlnIGV4dGVuZHMgSGVhZGVyZWRJdGVtQ29uZmlnIHtcclxuICAgIHR5cGU6ICdjb21wb25lbnQnO1xyXG4gICAgcmVhZG9ubHkgY29udGVudD86IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRpdGxlIG9mIHRoZSBpdGVtIGFzIGRpc3BsYXllZCBvbiBpdHMgdGFiIGFuZCBvbiBwb3BvdXQgd2luZG93c1xyXG4gICAgICogRGVmYXVsdDogY29tcG9uZW50VHlwZS50b1N0cmluZygpIG9yICcnXHJcbiAgICAgKi9cclxuICAgIHRpdGxlPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudC5cclxuICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKENvbXBvbmVudEl0ZW1Db25maWc6aW50ZXJmYWNlKS5jb21wb25lbnRUeXBlfSBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIGNvbXBvbmVudE5hbWU/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgY29tcG9uZW50LlxyXG4gICAgICogYGNvbXBvbmVudFR5cGVgIG11c3QgYmUgb2YgdHlwZSBgc3RyaW5nYCBpZiBpdCBpcyByZWdpc3RlcmVkIHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOlxyXG4gICAgICogKiB7QGxpbmsgKEdvbGRlbkxheW91dDpjbGFzcykucmVnaXN0ZXJDb21wb25lbnR9IChkZXByZWNhdGVkKVxyXG4gICAgICogKiB7QGxpbmsgKEdvbGRlbkxheW91dDpjbGFzcykucmVnaXN0ZXJDb21wb25lbnRDb25zdHJ1Y3Rvcn1cclxuICAgICAqICoge0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9ufVxyXG4gICAgICovXHJcbiAgICBjb21wb25lbnRUeXBlOiBKc29uVmFsdWU7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzdGF0ZSBpbmZvcm1hdGlvbiB3aXRoIHdoaWNoIGEgY29tcG9uZW50IHdpbGwgYmUgaW5pdGlhbGlzZWQgd2l0aC5cclxuICAgICAqIFdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjb21wb25lbnQgY29uc3RydWN0b3IgZnVuY3Rpb24gYW5kIHdpbGwgYmUgdGhlIHZhbHVlIHJldHVybmVkIGJ5XHJcbiAgICAgKiBjb250YWluZXIuaW5pdGlhbFN0YXRlLlxyXG4gICAgICovXHJcbiAgICBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAqL1xyXG4gICAgcmVvcmRlckVuYWJsZWQ/OiBib29sZWFuOyAgLy8gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIExheW91dENvbmZpZy5yZW9yZGVyRW5hYmxlZC5cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGl0ZW1Db25maWc6IENvbXBvbmVudEl0ZW1Db25maWcsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQ6IGJvb2xlYW4pOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIGxldCBjb21wb25lbnRUeXBlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQgPSBpdGVtQ29uZmlnLmNvbXBvbmVudFR5cGU7XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlID0gaXRlbUNvbmZpZy5jb21wb25lbnROYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29tcG9uZW50VHlwZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tcG9uZW50SXRlbUNvbmZpZy5jb21wb25lbnRUeXBlIGlzIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgaWQsIG1heGltaXNlZCB9ID0gSGVhZGVyZWRJdGVtQ29uZmlnLnJlc29sdmVJZEFuZE1heGltaXNlZChpdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgbGV0IHRpdGxlOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIGlmIChpdGVtQ29uZmlnLnRpdGxlID09PSB1bmRlZmluZWQgfHwgaXRlbUNvbmZpZy50aXRsZSA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHRpdGxlID0gQ29tcG9uZW50SXRlbUNvbmZpZy5jb21wb25lbnRUeXBlVG9UaXRsZShjb21wb25lbnRUeXBlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRpdGxlID0gaXRlbUNvbmZpZy50aXRsZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB7IHNpemUsIHNpemVVbml0IH0gPSBJdGVtQ29uZmlnLnJlc29sdmVTaXplKGl0ZW1Db25maWcuc2l6ZSwgaXRlbUNvbmZpZy53aWR0aCwgaXRlbUNvbmZpZy5oZWlnaHQsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQpO1xyXG4gICAgICAgICAgICBjb25zdCB7IHNpemU6IG1pblNpemUsIHNpemVVbml0OiBtaW5TaXplVW5pdCB9ID0gSXRlbUNvbmZpZy5yZXNvbHZlTWluU2l6ZShpdGVtQ29uZmlnLm1pblNpemUsIGl0ZW1Db25maWcubWluV2lkdGgsIGl0ZW1Db25maWcubWluSGVpZ2h0KTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBpdGVtQ29uZmlnLnR5cGUsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbXSxcclxuICAgICAgICAgICAgICAgIHNpemUsXHJcbiAgICAgICAgICAgICAgICBzaXplVW5pdCxcclxuICAgICAgICAgICAgICAgIG1pblNpemUsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplVW5pdCxcclxuICAgICAgICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgICAgICAgbWF4aW1pc2VkLFxyXG4gICAgICAgICAgICAgICAgaXNDbG9zYWJsZTogaXRlbUNvbmZpZy5pc0Nsb3NhYmxlID8/IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IGl0ZW1Db25maWcucmVvcmRlckVuYWJsZWQgPz8gUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLmRlZmF1bHRSZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiBIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLnJlc29sdmUoaXRlbUNvbmZpZy5oZWFkZXIsIGl0ZW1Db25maWcuaGFzSGVhZGVycyksXHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRUeXBlLFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50U3RhdGU6IGl0ZW1Db25maWcuY29tcG9uZW50U3RhdGUgPz8ge30sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgICBzaXplOiBmb3JtYXRTaXplKHJlc29sdmVkQ29uZmlnLnNpemUsIHJlc29sdmVkQ29uZmlnLnNpemVVbml0KSxcclxuICAgICAgICAgICAgbWluU2l6ZTogZm9ybWF0VW5kZWZpbmFibGVTaXplKHJlc29sdmVkQ29uZmlnLm1pblNpemUsIHJlc29sdmVkQ29uZmlnLm1pblNpemVVbml0KSxcclxuICAgICAgICAgICAgaWQ6IHJlc29sdmVkQ29uZmlnLmlkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZWQ6IHJlc29sdmVkQ29uZmlnLm1heGltaXNlZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogcmVzb2x2ZWRDb25maWcuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IHJlc29sdmVkQ29uZmlnLnJlb3JkZXJFbmFibGVkLFxyXG4gICAgICAgICAgICB0aXRsZTogcmVzb2x2ZWRDb25maWcudGl0bGUsXHJcbiAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLmNyZWF0ZUNvcHkocmVzb2x2ZWRDb25maWcuaGVhZGVyKSxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZTogcmVzb2x2ZWRDb25maWcuY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGU6IGRlZXBFeHRlbmRWYWx1ZSh1bmRlZmluZWQsIHJlc29sdmVkQ29uZmlnLmNvbXBvbmVudFN0YXRlKSBhcyBKc29uVmFsdWUsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb21wb25lbnRUeXBlVG9UaXRsZShjb21wb25lbnRUeXBlOiBKc29uVmFsdWUpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFR5cGVUeXBlID0gdHlwZW9mIGNvbXBvbmVudFR5cGU7XHJcbiAgICAgICAgc3dpdGNoIChjb21wb25lbnRUeXBlVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOiByZXR1cm4gY29tcG9uZW50VHlwZSBhcyBzdHJpbmc7XHJcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6IHJldHVybiAoY29tcG9uZW50VHlwZSBhcyBudW1iZXIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOiByZXR1cm4gKGNvbXBvbmVudFR5cGUgYXMgYm9vbGVhbikudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLy8gUm93T3JDb2x1bW5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSb3dPckNvbHVtbkl0ZW1Db25maWcgZXh0ZW5kcyBJdGVtQ29uZmlnIHtcclxuICAgIHR5cGU6ICdyb3cnIHwgJ2NvbHVtbic7XHJcbiAgICBjb250ZW50OiAoUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZylbXTtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSb3dPckNvbHVtbkl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IHR5cGUgQ2hpbGRJdGVtQ29uZmlnID0gUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZztcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNDaGlsZEl0ZW1Db25maWcoaXRlbUNvbmZpZzogSXRlbUNvbmZpZyk6IGl0ZW1Db25maWcgaXMgQ2hpbGRJdGVtQ29uZmlnIHtcclxuICAgICAgICBzd2l0Y2ggKGl0ZW1Db25maWcudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuZ3JvdW5kOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdVUk9DT1NQQ0lDSUMxMzY4NycsIGl0ZW1Db25maWcudHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZywgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdDogYm9vbGVhbik6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCB7IHNpemUsIHNpemVVbml0IH0gPSBJdGVtQ29uZmlnLnJlc29sdmVTaXplKGl0ZW1Db25maWcuc2l6ZSwgaXRlbUNvbmZpZy53aWR0aCwgaXRlbUNvbmZpZy5oZWlnaHQsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQpO1xyXG4gICAgICAgIGNvbnN0IHsgc2l6ZTogbWluU2l6ZSwgc2l6ZVVuaXQ6IG1pblNpemVVbml0IH0gPSBJdGVtQ29uZmlnLnJlc29sdmVNaW5TaXplKGl0ZW1Db25maWcubWluU2l6ZSwgaXRlbUNvbmZpZy5taW5XaWR0aCwgaXRlbUNvbmZpZy5taW5IZWlnaHQpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IGl0ZW1Db25maWcudHlwZSxcclxuICAgICAgICAgICAgY29udGVudDogUm93T3JDb2x1bW5JdGVtQ29uZmlnLnJlc29sdmVDb250ZW50KGl0ZW1Db25maWcuY29udGVudCksXHJcbiAgICAgICAgICAgIHNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IEl0ZW1Db25maWcucmVzb2x2ZUlkKGl0ZW1Db25maWcuaWQpLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBpdGVtQ29uZmlnLmlzQ2xvc2FibGUgPz8gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZChyZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcpOiBSb3dPckNvbHVtbkl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUm93T3JDb2x1bW5JdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiByZXNvbHZlZENvbmZpZy50eXBlLFxyXG4gICAgICAgICAgICBjb250ZW50OiBmcm9tUmVzb2x2ZWRDb250ZW50KHJlc29sdmVkQ29uZmlnLmNvbnRlbnQpLFxyXG4gICAgICAgICAgICBzaXplOiBmb3JtYXRTaXplKHJlc29sdmVkQ29uZmlnLnNpemUsIHJlc29sdmVkQ29uZmlnLnNpemVVbml0KSxcclxuICAgICAgICAgICAgbWluU2l6ZTogZm9ybWF0VW5kZWZpbmFibGVTaXplKHJlc29sdmVkQ29uZmlnLm1pblNpemUsIHJlc29sdmVkQ29uZmlnLm1pblNpemVVbml0KSxcclxuICAgICAgICAgICAgaWQ6IHJlc29sdmVkQ29uZmlnLmlkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiByZXNvbHZlZENvbmZpZy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNvbnRlbnQoY29udGVudDogQ2hpbGRJdGVtQ29uZmlnW10gfCB1bmRlZmluZWQpOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnQgPSBjb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRJdGVtQ29uZmlncyA9IG5ldyBBcnJheTxSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgICAgIGxldCB3aWR0aE9ySGVpZ2h0U3BlY2lmaWVkQXRMZWFzdE9uY2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHNpemVTcGVjaWZpZWRBdExlYXN0T25jZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkSXRlbUNvbmZpZyA9IGNvbnRlbnRbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIVJvd09yQ29sdW1uSXRlbUNvbmZpZy5pc0NoaWxkSXRlbUNvbmZpZyhjaGlsZEl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcignSXRlbUNvbmZpZyBpcyBub3QgUm93LCBDb2x1bW4gb3IgU3RhY2snLCBjaGlsZEl0ZW1Db25maWcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNpemVTcGVjaWZpZWRBdExlYXN0T25jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZSA9IEl0ZW1Db25maWcuY2FsY3VsYXRlU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUoY2hpbGRJdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtQ29uZmlnLlNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlLk5vbmU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1Db25maWcuU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUuV2lkdGhPckhlaWdodDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aE9ySGVpZ2h0U3BlY2lmaWVkQXRMZWFzdE9uY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtQ29uZmlnLlNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlLlNpemU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZVNwZWNpZmllZEF0TGVhc3RPbmNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdST0NJQ1JDODc1NTYnLCBzaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRJdGVtQ29uZmlnc1tpXSA9IGNoaWxkSXRlbUNvbmZpZztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGxlZ2FjeVNpemVEZWZhdWx0OiBib29sZWFuO1xyXG4gICAgICAgICAgICBpZiAoc2l6ZVNwZWNpZmllZEF0TGVhc3RPbmNlKSB7XHJcbiAgICAgICAgICAgICAgICBsZWdhY3lTaXplRGVmYXVsdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHdpZHRoT3JIZWlnaHRTcGVjaWZpZWRBdExlYXN0T25jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVNpemVEZWZhdWx0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5U2l6ZURlZmF1bHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkSXRlbUNvbmZpZyA9IGNoaWxkSXRlbUNvbmZpZ3NbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENoaWxkSXRlbUNvbmZpZyA9IEl0ZW1Db25maWcucmVzb2x2ZShjaGlsZEl0ZW1Db25maWcsIGxlZ2FjeVNpemVEZWZhdWx0KTtcclxuICAgICAgICAgICAgICAgIGlmICghUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuaXNDaGlsZEl0ZW1Db25maWcocmVzb2x2ZWRDaGlsZEl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdVUk9DT1NQSUM5OTUxMicsIEpTT04uc3RyaW5naWZ5KHJlc29sdmVkQ2hpbGRJdGVtQ29uZmlnKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHJlc29sdmVkQ2hpbGRJdGVtQ29uZmlnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGZ1bmN0aW9uIGZyb21SZXNvbHZlZENvbnRlbnQocmVzb2x2ZWRDb250ZW50OiByZWFkb25seSBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWdbXSk6IFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSByZXNvbHZlZENvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ29udGVudENvbmZpZyA9IHJlc29sdmVkQ29udGVudFtpXTtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHJlc29sdmVkQ29udGVudENvbmZpZy50eXBlO1xyXG4gICAgICAgICAgICBsZXQgY29udGVudENvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZztcclxuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRDb25maWcgPSBSb3dPckNvbHVtbkl0ZW1Db25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29udGVudENvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRDb25maWcgPSBTdGFja0l0ZW1Db25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29udGVudENvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Q29uZmlnID0gQ29tcG9uZW50SXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb250ZW50Q29uZmlnKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdST0NJQ0ZSQzQ0Nzk3JywgdHlwZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gY29udGVudENvbmZpZztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IHR5cGUgUm9vdEl0ZW1Db25maWcgPSBSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSb290SXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNSb290SXRlbUNvbmZpZyhpdGVtQ29uZmlnOiBJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBSb290SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgc3dpdGNoIChpdGVtQ29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignVVJJQ0lSMjM2ODcnLCBpdGVtQ29uZmlnLnR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShpdGVtQ29uZmlnOiBSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCk6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmIChpdGVtQ29uZmlnID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBJdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZywgZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAoIVJlc29sdmVkUm9vdEl0ZW1Db25maWcuaXNSb290SXRlbUNvbmZpZyhyZXN1bHQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKCdJdGVtQ29uZmlnIGlzIG5vdCBSb3csIENvbHVtbiBvciBTdGFjaycsIEpTT04uc3RyaW5naWZ5KGl0ZW1Db25maWcpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZE9yVW5kZWZpbmVkKHJlc29sdmVkSXRlbUNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCk6IFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAocmVzb2x2ZWRJdGVtQ29uZmlnID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gcmVzb2x2ZWRJdGVtQ29uZmlnLnR5cGU7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUm93T3JDb2x1bW5JdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZEl0ZW1Db25maWcpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RhY2tJdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZEl0ZW1Db25maWcpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudEl0ZW1Db25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkSXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignUklDRlJPVTg5OTIxJywgdHlwZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0Q29uZmlnIHtcclxuICAgIHJvb3Q6IFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKExheW91dENvbmZpZzppbnRlcmZhY2UpLnJvb3R9ICovXHJcbiAgICBjb250ZW50PzogKFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcpW107XHJcbiAgICBvcGVuUG9wb3V0cz86IFBvcG91dExheW91dENvbmZpZ1tdO1xyXG4gICAgZGltZW5zaW9ucz86IExheW91dENvbmZpZy5EaW1lbnNpb25zO1xyXG4gICAgc2V0dGluZ3M/OiBMYXlvdXRDb25maWcuU2V0dGluZ3M7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOmludGVyZmFjZSkuaGVhZGVyfSBpbnN0ZWFkICovXHJcbiAgICBsYWJlbHM/OiBMYXlvdXRDb25maWcuTGFiZWxzO1xyXG4gICAgaGVhZGVyPzogTGF5b3V0Q29uZmlnLkhlYWRlcjtcclxufVxyXG5cclxuLyoqIFVzZSB0byBzcGVjaWZ5IExheW91dENvbmZpZyB3aXRoIGRlZmF1bHRzIG9yIGRlc2VyaWFsaXNlIGEgTGF5b3V0Q29uZmlnLlxyXG4gKiBEZXNlcmlhbGlzYXRpb24gd2lsbCBoYW5kbGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXHJcbiAqIE5vdGUgdGhhdCBMYXlvdXRDb25maWcgc2hvdWxkIGJlIHVzZWQgZm9yIHNlcmlhbGlzYXRpb24gKG5vdCBMYXlvdXRDb25maWcpXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgTGF5b3V0Q29uZmlnIHtcclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3Mge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSAke0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkuc2hvd30gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGhhc0hlYWRlcnM/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0cnVlLCB0aGUgdXNlciBjYW4gZHJhZyBjb21wb25lbnRzIGZyb20gb25lIHdpbmRvdyB0byBhbm90aGVyLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAgICAgKi9cclxuICAgICAgICBkcmFnQmV0d2VlbldpbmRvd3M/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0cnVlLCB0aGUgdXNlciBjYW4gZHJhZyBhbmQgZHJvcCBjb21wb25lbnRzIG91dHNpZGUgdGhlaXIgY29udGFpbmluZyB3aW5kb3csIGNyZWF0aW5nIGEgbmV3IHBvcG91dCB3aW5kb3cuXHJcbiAgICAgICAgICogRGVmYXVsdDogdHJ1ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRyYWdUb05ld1dpbmRvdz86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRydWUsIHRoZSB1c2VyIGNhbiByZS1hcnJhbmdlIHRoZSBsYXlvdXQgYnkgZHJhZ2dpbmcgaXRlbXMgYnkgdGhlaXIgdGFicyB0byB0aGUgZGVzaXJlZCBsb2NhdGlvbi5cclxuICAgICAgICAgKiBDYW4gYmUgb3ZlcnJpZGRlbiBieSBJdGVtQ29uZmlnLnJlb3JkZXJFbmFibGVkIGZvciBzcGVjaWZpYyBJdGVtQ29uZmlnc1xyXG4gICAgICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAgICAgKi9cclxuICAgICAgICByZW9yZGVyRW5hYmxlZD86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERlY2lkZXMgd2hhdCB3aWxsIGJlIG9wZW5lZCBpbiBhIG5ldyB3aW5kb3cgaWYgdGhlIHVzZXIgY2xpY2tzIHRoZSBwb3BvdXQgaWNvbi4gSWYgdHJ1ZSB0aGUgZW50aXJlIHN0YWNrIHdpbGxcclxuICAgICAgICAgKiBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgbmV3IHdpbmRvdywgaWYgZmFsc2Ugb25seSB0aGUgYWN0aXZlIGNvbXBvbmVudCB3aWxsIGJlIG9wZW5lZC5cclxuICAgICAgICAgKiBEZWZhdWx0OiBmYWxzZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHBvcG91dFdob2xlU3RhY2s/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgYW4gZXJyb3IgaXMgdGhyb3duIHdoZW4gYSBwb3BvdXQgaXMgYmxvY2tlZCBieSB0aGUgYnJvd3NlciAoZS5nLiBieSBvcGVuaW5nIGl0IHByb2dyYW1tYXRpY2FsbHkpLlxyXG4gICAgICAgICAqIElmIGZhbHNlLCB0aGUgcG9wb3V0IGNhbGwgd2lsbCBmYWlsIHNpbGVudGx5LlxyXG4gICAgICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAgICAgKi9cclxuICAgICAgICBibG9ja2VkUG9wb3V0c1Rocm93RXJyb3I/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgYWxsIHBvcG91dHMgc2hvdWxkIGJlIGNsb3NlZCB3aGVuIHRoZSBwYWdlIHRoYXQgY3JlYXRlZCB0aGVtIGlzIGNsb3NlZC4gUG9wb3V0cyBkb24ndCBoYXZlIGFcclxuICAgICAgICAgKiBzdHJvbmcgZGVwZW5kZW5jeSBvbiB0aGVpciBwYXJlbnQgYW5kIGNhbiBleGlzdCBvbiB0aGVpciBvd24sIGJ1dCBjYW4gYmUgcXVpdGUgYW5ub3lpbmcgdG8gY2xvc2UgYnkgaGFuZC4gSW5cclxuICAgICAgICAgKiBhZGRpdGlvbiwgYW55IGNoYW5nZXMgbWFkZSB0byBwb3BvdXRzIHdvbid0IGJlIHN0b3JlZCBhZnRlciB0aGUgcGFyZW50IGlzIGNsb3NlZC5cclxuICAgICAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIHZlcnNpb24gMy5cclxuICAgICAgICAgKi9cclxuICAgICAgICBjbG9zZVBvcG91dHNPblVubG9hZD86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyBpZiB0aGUgcG9wb3V0IGljb24gc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgaGVhZGVyLWJhci5cclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkucG9wb3V0fSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd1BvcG91dEljb24/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIG1heGltaXNlIGljb24gc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgaGVhZGVyLWJhci5cclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkubWF4aW1pc2V9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBzaG93TWF4aW1pc2VJY29uPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIHRoZSBjbG9zZSBpY29uIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlci1iYXIuXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLmNsb3NlfSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd0Nsb3NlSWNvbj86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyBSZXNwb25zaXZlIE1vZGUgKG1vcmUgaW5mbyBuZWVkZWQpLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IG5vbmVcclxuICAgICAgICAgKi9cclxuICAgICAgICByZXNwb25zaXZlTW9kZT86IFJlc3BvbnNpdmVNb2RlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgTWF4aW11bSBwaXhlbCBvdmVybGFwIHBlciB0YWIuXHJcbiAgICAgICAgICogRGVmYXVsdDogMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRhYk92ZXJsYXBBbGxvd2FuY2U/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogRGVmYXVsdDogdHJ1ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJlb3JkZXJPblRhYk1lbnVDbGljaz86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDEwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGFiQ29udHJvbE9mZnNldD86IG51bWJlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gcG9wIGluIGVsZW1lbnRzIHdoZW4gY2xvc2luZyBhIHBvcG91dCB3aW5kb3cuXHJcbiAgICAgICAgICogRGVmYXVsdDogZmFsc2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBwb3BJbk9uQ2xvc2U/OiBib29sZWFuO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgU2V0dGluZ3Mge1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKHNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZCk6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncyA9IHtcclxuICAgICAgICAgICAgICAgIGRyYWdCZXR3ZWVuV2luZG93czogc2V0dGluZ3M/LmRyYWdCZXR3ZWVuV2luZG93cyA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5kcmFnQmV0d2VlbldpbmRvd3MsXHJcbiAgICAgICAgICAgICAgICBkcmFnVG9OZXdXaW5kb3c6IHNldHRpbmdzPy5kcmFnVG9OZXdXaW5kb3cgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMuZHJhZ1RvTmV3V2luZG93LFxyXG4gICAgICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IHNldHRpbmdzPy5yZW9yZGVyRW5hYmxlZCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5yZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgICAgIHBvcG91dFdob2xlU3RhY2s6IHNldHRpbmdzPy5wb3BvdXRXaG9sZVN0YWNrID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLnBvcG91dFdob2xlU3RhY2ssXHJcbiAgICAgICAgICAgICAgICBibG9ja2VkUG9wb3V0c1Rocm93RXJyb3I6IHNldHRpbmdzPy5ibG9ja2VkUG9wb3V0c1Rocm93RXJyb3IgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMuYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yLFxyXG4gICAgICAgICAgICAgICAgY2xvc2VQb3BvdXRzT25VbmxvYWQ6IHNldHRpbmdzPy5jbG9zZVBvcG91dHNPblVubG9hZCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5jbG9zZVBvcG91dHNPblVubG9hZCxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNpdmVNb2RlOiBzZXR0aW5ncz8ucmVzcG9uc2l2ZU1vZGUgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMucmVzcG9uc2l2ZU1vZGUsXHJcbiAgICAgICAgICAgICAgICB0YWJPdmVybGFwQWxsb3dhbmNlOiBzZXR0aW5ncz8udGFiT3ZlcmxhcEFsbG93YW5jZSA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy50YWJPdmVybGFwQWxsb3dhbmNlLFxyXG4gICAgICAgICAgICAgICAgcmVvcmRlck9uVGFiTWVudUNsaWNrOiBzZXR0aW5ncz8ucmVvcmRlck9uVGFiTWVudUNsaWNrID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLnJlb3JkZXJPblRhYk1lbnVDbGljayxcclxuICAgICAgICAgICAgICAgIHRhYkNvbnRyb2xPZmZzZXQ6IHNldHRpbmdzPy50YWJDb250cm9sT2Zmc2V0ID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLnRhYkNvbnRyb2xPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICBwb3BJbk9uQ2xvc2U6IHNldHRpbmdzPy5wb3BJbk9uQ2xvc2UgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMucG9wSW5PbkNsb3NlLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRGltZW5zaW9ucyB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBib3JkZXJzIGJldHdlZW4gdGhlIGxheW91dCBpdGVtcyBpbiBwaXhlbC4gUGxlYXNlIG5vdGU6IFRoZSBhY3R1YWwgZHJhZ2dhYmxlIGFyZWEgaXMgd2lkZXJcclxuICAgICAgICAgKiB0aGFuIHRoZSB2aXNpYmxlIG9uZSwgbWFraW5nIGl0IHNhZmUgdG8gc2V0IHRoaXMgdG8gc21hbGwgdmFsdWVzIHdpdGhvdXQgYWZmZWN0aW5nIHVzYWJpbGl0eS5cclxuICAgICAgICAgKiBEZWZhdWx0OiA1XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgYm9yZGVyV2lkdGg/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDE1XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgYm9yZGVyR3JhYldpZHRoPzogbnVtYmVyLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWluaW11bSBoZWlnaHQgYW4gaXRlbSBjYW4gYmUgcmVzaXplZCB0byAoaW4gcGl4ZWwpLlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihEaW1lbnNpb25zOmludGVyZmFjZSkuZGVmYXVsdE1pbkl0ZW1IZWlnaHR9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBtaW5JdGVtSGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWluaW11bSBoZWlnaHQgYW4gaXRlbSBjYW4gYmUgcmVzaXplZCB0by5cclxuICAgICAgICAgKiBEZWZhdWx0OiAwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHQ/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtaW5pbXVtIHdpZHRoIGFuIGl0ZW0gY2FuIGJlIHJlc2l6ZWQgdG8gKGluIHBpeGVsKS5cclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oRGltZW5zaW9uczppbnRlcmZhY2UpLmRlZmF1bHRNaW5JdGVtV2lkdGh9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBtaW5JdGVtV2lkdGg/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtaW5pbXVtIHdpZHRoIGFuIGl0ZW0gY2FuIGJlIHJlc2l6ZWQgdG8uXHJcbiAgICAgICAgICogRGVmYXVsdDogMTBweFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGg/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGhlYWRlciBlbGVtZW50cyBpbiBwaXhlbC4gVGhpcyBjYW4gYmUgY2hhbmdlZCwgYnV0IHlvdXIgdGhlbWUncyBoZWFkZXIgY3NzIG5lZWRzIHRvIGJlXHJcbiAgICAgICAgICogYWRqdXN0ZWQgYWNjb3JkaW5nbHkuXHJcbiAgICAgICAgICogRGVmYXVsdDogMjBcclxuICAgICAgICAgKi9cclxuICAgICAgICBoZWFkZXJIZWlnaHQ/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgZWxlbWVudCB0aGF0IGFwcGVhcnMgd2hlbiBhbiBpdGVtIGlzIGRyYWdnZWQgKGluIHBpeGVsKS5cclxuICAgICAgICAgKiBEZWZhdWx0OiAzMDBcclxuICAgICAgICAgKi9cclxuICAgICAgICBkcmFnUHJveHlXaWR0aD86IG51bWJlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgZWxlbWVudCB0aGF0IGFwcGVhcnMgd2hlbiBhbiBpdGVtIGlzIGRyYWdnZWQgKGluIHBpeGVsKS5cclxuICAgICAgICAgKiBEZWZhdWx0OiAyMDBcclxuICAgICAgICAgKi9cclxuICAgICAgICBkcmFnUHJveHlIZWlnaHQ/OiBudW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBEaW1lbnNpb25zIHtcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoZGltZW5zaW9uczogRGltZW5zaW9ucyB8IHVuZGVmaW5lZCk6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMge1xyXG4gICAgICAgICAgICBjb25zdCB7IHNpemU6IGRlZmF1bHRNaW5JdGVtSGVpZ2h0LCBzaXplVW5pdDogZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0IH0gPSBEaW1lbnNpb25zLnJlc29sdmVEZWZhdWx0TWluSXRlbUhlaWdodChkaW1lbnNpb25zKTtcclxuICAgICAgICAgICAgY29uc3QgeyBzaXplOiBkZWZhdWx0TWluSXRlbVdpZHRoLCBzaXplVW5pdDogZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQgfSA9IERpbWVuc2lvbnMucmVzb2x2ZURlZmF1bHRNaW5JdGVtV2lkdGgoZGltZW5zaW9ucyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoOiBkaW1lbnNpb25zPy5ib3JkZXJXaWR0aCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmJvcmRlcldpZHRoLFxyXG4gICAgICAgICAgICAgICAgYm9yZGVyR3JhYldpZHRoOiBkaW1lbnNpb25zPy5ib3JkZXJHcmFiV2lkdGggPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5ib3JkZXJHcmFiV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbUhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoVW5pdCxcclxuICAgICAgICAgICAgICAgIGhlYWRlckhlaWdodDogZGltZW5zaW9ucz8uaGVhZGVySGVpZ2h0ID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuaGVhZGVySGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5V2lkdGg6IGRpbWVuc2lvbnM/LmRyYWdQcm94eVdpZHRoID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuZHJhZ1Byb3h5V2lkdGgsXHJcbiAgICAgICAgICAgICAgICBkcmFnUHJveHlIZWlnaHQ6IGRpbWVuc2lvbnM/LmRyYWdQcm94eUhlaWdodCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmRyYWdQcm94eUhlaWdodCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWQocmVzb2x2ZWREaW1lbnNpb25zOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zKTogRGltZW5zaW9ucyB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogRGltZW5zaW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoOiByZXNvbHZlZERpbWVuc2lvbnMuYm9yZGVyV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBib3JkZXJHcmFiV2lkdGg6IHJlc29sdmVkRGltZW5zaW9ucy5ib3JkZXJHcmFiV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbUhlaWdodDogZm9ybWF0U2l6ZShyZXNvbHZlZERpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1IZWlnaHQsIHJlc29sdmVkRGltZW5zaW9ucy5kZWZhdWx0TWluSXRlbUhlaWdodFVuaXQpLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aDogZm9ybWF0U2l6ZShyZXNvbHZlZERpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1XaWR0aCwgcmVzb2x2ZWREaW1lbnNpb25zLmRlZmF1bHRNaW5JdGVtV2lkdGhVbml0KSxcclxuICAgICAgICAgICAgICAgIGhlYWRlckhlaWdodDogcmVzb2x2ZWREaW1lbnNpb25zLmhlYWRlckhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRyYWdQcm94eVdpZHRoOiByZXNvbHZlZERpbWVuc2lvbnMuZHJhZ1Byb3h5V2lkdGgsXHJcbiAgICAgICAgICAgICAgICBkcmFnUHJveHlIZWlnaHQ6IHJlc29sdmVkRGltZW5zaW9ucy5kcmFnUHJveHlIZWlnaHQsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGVmYXVsdE1pbkl0ZW1IZWlnaHQoZGltZW5zaW9uczogRGltZW5zaW9ucyB8IHVuZGVmaW5lZCk6IFNpemVXaXRoVW5pdCB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGRpbWVuc2lvbnM/LmRlZmF1bHRNaW5JdGVtSGVpZ2h0O1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuZGVmYXVsdE1pbkl0ZW1IZWlnaHQsIHNpemVVbml0OiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdCB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlU2l6ZShoZWlnaHQsIFtTaXplVW5pdEVudW0uUGl4ZWxdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGVmYXVsdE1pbkl0ZW1XaWR0aChkaW1lbnNpb25zOiBEaW1lbnNpb25zIHwgdW5kZWZpbmVkKTogU2l6ZVdpdGhVbml0IHtcclxuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBkaW1lbnNpb25zPy5kZWZhdWx0TWluSXRlbVdpZHRoO1xyXG4gICAgICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5kZWZhdWx0TWluSXRlbVdpZHRoLCBzaXplVW5pdDogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5kZWZhdWx0TWluSXRlbVdpZHRoVW5pdCB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlU2l6ZSh3aWR0aCwgW1NpemVVbml0RW51bS5QaXhlbF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgTGFiZWxzIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkuY2xvc2V9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBjbG9zZT86IHN0cmluZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLm1heGltaXNlfSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbWF4aW1pc2U/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5taW5pbWlzZX0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG1pbmltaXNlPzogc3RyaW5nO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkucG9waW59IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBwb3Bpbj86IHN0cmluZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnBvcG91dH0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHBvcG91dD86IHN0cmluZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnRhYkRyb3Bkb3dufSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGFiRHJvcGRvd24/OiBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBIZWFkZXIge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIGhlYWRlciBzaG91bGQgYmUgZGlzcGxheWVkLCBhbmQgaWYgc28sIG9uIHdoaWNoIHNpZGUuXHJcbiAgICAgICAgICogSWYgZmFsc2UsIHRoZSBsYXlvdXQgd2lsbCBiZSBkaXNwbGF5ZWQgd2l0aCBzcGxpdHRlcnMgb25seS5cclxuICAgICAgICAgKiBEZWZhdWx0OiAndG9wJ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3c/OiBmYWxzZSB8IFNpZGU7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvb2x0aXAgdGV4dCB0aGF0IGFwcGVhcnMgd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBwb3BvdXQgaWNvbiBvciBmYWxzZSBpZiBwb3BvdXQgYnV0dG9uIG5vdCBkaXNwbGF5ZWQuXHJcbiAgICAgICAgICogRGVmYXVsdDogJ29wZW4gaW4gbmV3IHdpbmRvdydcclxuICAgICAgICAgKi9cclxuICAgICAgICBwb3BvdXQ/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdG9vbHRpcCB0ZXh0IHRoYXQgYXBwZWFycyB3aGVuIGhvdmVyaW5nIG92ZXIgdGhlIHBvcGluIGljb24uXHJcbiAgICAgICAgICogRGVmYXVsdDogJ3BvcCBpbidcclxuICAgICAgICAgKi9cclxuICAgICAgICBwb3Bpbj86IHN0cmluZztcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdG9vbHRpcCB0ZXh0IHRoYXQgYXBwZWFycyB3aGVuIGhvdmVyaW5nIG92ZXIgdGhlIG1heGltaXNlIGljb24gb3IgZmFsc2UgaWYgbWF4aW1pc2VkIGJ1dHRvbiBub3QgZGlzcGxheWVkLlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdtYXhpbWlzZSdcclxuICAgICAgICAgKi9cclxuICAgICAgICBtYXhpbWlzZT86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0b29sdGlwIHRleHQgdGhhdCBhcHBlYXJzIHdoZW4gaG92ZXJpbmcgb3ZlciB0aGUgY2xvc2UgaWNvbi5cclxuICAgICAgICAgKiBEZWZhdWx0OiAnY2xvc2UnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xvc2U/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdG9vbHRpcCB0ZXh0IHRoYXQgYXBwZWFycyB3aGVuIGhvdmVyaW5nIG92ZXIgdGhlIG1pbmltaXNlIGljb24uXHJcbiAgICAgICAgICogRGVmYXVsdDogJ21pbmltaXNlJ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG1pbmltaXNlPzogc3RyaW5nO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogRGVmYXVsdDogJ2FkZGl0aW9uYWwgdGFicydcclxuICAgICAgICAgKi9cclxuICAgICAgICB0YWJEcm9wZG93bj86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgSGVhZGVyIHtcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaGVhZGVyOiBIZWFkZXIgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBMYXlvdXRDb25maWcuU2V0dGluZ3MgfCB1bmRlZmluZWQsIGxhYmVsczogTGF5b3V0Q29uZmlnLkxhYmVscyB8IHVuZGVmaW5lZFxyXG4gICAgICAgICk6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlciB7XHJcbiAgICAgICAgICAgIGxldCBzaG93OiBmYWxzZSB8IFNpZGU7XHJcbiAgICAgICAgICAgIGlmIChoZWFkZXI/LnNob3cgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgc2hvdyA9IGhlYWRlci5zaG93O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzICE9PSB1bmRlZmluZWQgJiYgc2V0dGluZ3MuaGFzSGVhZGVycyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdyA9IHNldHRpbmdzLmhhc0hlYWRlcnMgPyBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMuc2hvdyA6IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93ID0gUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnNob3c7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIgPSB7XHJcbiAgICAgICAgICAgICAgICBzaG93LFxyXG4gICAgICAgICAgICAgICAgcG9wb3V0OiBoZWFkZXI/LnBvcG91dCA/PyBsYWJlbHM/LnBvcG91dCA/P1xyXG4gICAgICAgICAgICAgICAgICAgIChzZXR0aW5ncz8uc2hvd1BvcG91dEljb24gPT09IGZhbHNlID8gZmFsc2UgOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMucG9wb3V0KSxcclxuICAgICAgICAgICAgICAgIHBvcGluOiBoZWFkZXI/LnBvcGluID8/IGxhYmVscz8ucG9waW4gPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnBvcGluLFxyXG4gICAgICAgICAgICAgICAgbWF4aW1pc2U6IGhlYWRlcj8ubWF4aW1pc2UgPz8gbGFiZWxzPy5tYXhpbWlzZSA/P1xyXG4gICAgICAgICAgICAgICAgICAgIChzZXR0aW5ncz8uc2hvd01heGltaXNlSWNvbiA9PT0gZmFsc2UgPyBmYWxzZSA6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5tYXhpbWlzZSksXHJcbiAgICAgICAgICAgICAgICBjbG9zZTogaGVhZGVyPy5jbG9zZSA/PyBsYWJlbHM/LmNsb3NlID8/XHJcbiAgICAgICAgICAgICAgICAgICAgKHNldHRpbmdzPy5zaG93Q2xvc2VJY29uID09PSBmYWxzZSA/IGZhbHNlIDogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLmNsb3NlKSxcclxuICAgICAgICAgICAgICAgIG1pbmltaXNlOiBoZWFkZXI/Lm1pbmltaXNlID8/IGxhYmVscz8ubWluaW1pc2UgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLm1pbmltaXNlLFxyXG4gICAgICAgICAgICAgICAgdGFiRHJvcGRvd246IGhlYWRlcj8udGFiRHJvcGRvd24gPz8gbGFiZWxzPy50YWJEcm9wZG93biA/PyBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMudGFiRHJvcGRvd24sXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUG9wb3V0KGNvbmZpZzogTGF5b3V0Q29uZmlnKTogY29uZmlnIGlzIFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuICdwYXJlbnRJZCcgaW4gY29uZmlnIHx8ICdpbmRleEluUGFyZW50JyBpbiBjb25maWcgfHwgJ3dpbmRvdycgaW4gY29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGxheW91dENvbmZpZzogTGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIGlmIChpc1BvcG91dChsYXlvdXRDb25maWcpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQb3BvdXRMYXlvdXRDb25maWcucmVzb2x2ZShsYXlvdXRDb25maWcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCByb290OiBSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaWYgKGxheW91dENvbmZpZy5yb290ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJvb3QgPSBsYXlvdXRDb25maWcucm9vdDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChsYXlvdXRDb25maWcuY29udGVudCAhPT0gdW5kZWZpbmVkICYmIGxheW91dENvbmZpZy5jb250ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByb290ID0gbGF5b3V0Q29uZmlnLmNvbnRlbnRbMF07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvb3QgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgY29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgcm9vdDogUm9vdEl0ZW1Db25maWcucmVzb2x2ZShyb290KSxcclxuICAgICAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBMYXlvdXRDb25maWcucmVzb2x2ZU9wZW5Qb3BvdXRzKGxheW91dENvbmZpZy5vcGVuUG9wb3V0cyksXHJcbiAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiBMYXlvdXRDb25maWcuRGltZW5zaW9ucy5yZXNvbHZlKGxheW91dENvbmZpZy5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzOiBMYXlvdXRDb25maWcuU2V0dGluZ3MucmVzb2x2ZShsYXlvdXRDb25maWcuc2V0dGluZ3MpLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiBMYXlvdXRDb25maWcuSGVhZGVyLnJlc29sdmUobGF5b3V0Q29uZmlnLmhlYWRlciwgbGF5b3V0Q29uZmlnLnNldHRpbmdzLCBsYXlvdXRDb25maWcubGFiZWxzKSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBMYXlvdXRDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogTGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICByb290OiBSb290SXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWRPclVuZGVmaW5lZChjb25maWcucm9vdCksXHJcbiAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBQb3BvdXRMYXlvdXRDb25maWcuZnJvbVJlc29sdmVkQXJyYXkoY29uZmlnLm9wZW5Qb3BvdXRzKSxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmNyZWF0ZUNvcHkoY29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgZGltZW5zaW9uczogTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZnJvbVJlc29sdmVkKGNvbmZpZy5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShjb25maWcuaGVhZGVyKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb2x2ZWQoY29uZmlnT3JSZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcgfCBMYXlvdXRDb25maWcpOiBjb25maWdPclJlc29sdmVkQ29uZmlnIGlzIFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBjb25maWdPclJlc29sdmVkQ29uZmlnIGFzIFJlc29sdmVkTGF5b3V0Q29uZmlnO1xyXG4gICAgICAgIHJldHVybiBjb25maWcucmVzb2x2ZWQgIT09IHVuZGVmaW5lZCAmJiAoY29uZmlnLnJlc29sdmVkID09PSB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU9wZW5Qb3BvdXRzKHBvcG91dENvbmZpZ3M6IFBvcG91dExheW91dENvbmZpZ1tdIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWdbXSB7XHJcbiAgICAgICAgaWYgKHBvcG91dENvbmZpZ3MgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnQgPSBwb3BvdXRDb25maWdzLmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gUG9wb3V0TGF5b3V0Q29uZmlnLnJlc29sdmUocG9wb3V0Q29uZmlnc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUG9wb3V0TGF5b3V0Q29uZmlnIGV4dGVuZHMgTGF5b3V0Q29uZmlnIHtcclxuICAgIC8qKiBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdGhlIGl0ZW0gd2lsbCBiZSBhcHBlbmRlZCB0byBvbiBwb3BJblxyXG4gICAgKiBJZiBudWxsLCBhcHBlbmQgdG8gdG9wbW9zdCBsYXlvdXQgZWxlbWVudFxyXG4gICAgKi9cclxuICAgIHBhcmVudElkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIFRoZSBwb3NpdGlvbiBvZiB0aGlzIGVsZW1lbnQgd2l0aGluIGl0cyBwYXJlbnRcclxuICAgICogSWYgbnVsbCwgcG9zaXRpb24gaXMgbGFzdFxyXG4gICAgKi9cclxuICAgIGluZGV4SW5QYXJlbnQ6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUG9wb3V0TGF5b3V0Q29uZmlnOmludGVyZmFjZSkud2luZG93fSAqL1xyXG4gICAgZGltZW5zaW9uczogUG9wb3V0TGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMgfCB1bmRlZmluZWQ7IC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG4gICAgd2luZG93OiBQb3BvdXRMYXlvdXRDb25maWcuV2luZG93IHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAvLyBQcmV2aW91cyB2ZXJzaW9ucyBrZXB0IHdpbmRvdyBpbmZvcm1hdGlvbiBpbiBEaW1lbnNpb25zIGtleS4gIE9ubHkgdXNlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzpuYW1lc3BhY2UpLihXaW5kb3c6aW50ZXJmYWNlKX0gKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRGltZW5zaW9ucyBleHRlbmRzIExheW91dENvbmZpZy5EaW1lbnNpb25zIHtcclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUG9wb3V0TGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKFdpbmRvdzppbnRlcmZhY2UpLndpZHRofSAqL1xyXG4gICAgICAgIHdpZHRoPzogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUG9wb3V0TGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKFdpbmRvdzppbnRlcmZhY2UpLmhlaWdodH0gKi9cclxuICAgICAgICBoZWlnaHQ/OiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChQb3BvdXRMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oV2luZG93OmludGVyZmFjZSkubGVmdH0gKi9cclxuICAgICAgICBsZWZ0PzogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUG9wb3V0TGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKFdpbmRvdzppbnRlcmZhY2UpLnRvcH0gKi9cclxuICAgICAgICB0b3A/OiBudW1iZXIgfCBudWxsLFxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgV2luZG93IHtcclxuICAgICAgICB3aWR0aD86IG51bWJlcixcclxuICAgICAgICBoZWlnaHQ/OiBudW1iZXIsXHJcbiAgICAgICAgbGVmdD86IG51bWJlcixcclxuICAgICAgICB0b3A/OiBudW1iZXIsXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBXaW5kb3cge1xyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZSh3aW5kb3c6IFdpbmRvdyB8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgZGltZW5zaW9uczogRGltZW5zaW9ucyB8IHVuZGVmaW5lZCk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvd1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdDogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93O1xyXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0cyA9IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdy5kZWZhdWx0cztcclxuICAgICAgICAgICAgaWYgKHdpbmRvdyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpbmRvdy53aWR0aCA/PyBkZWZhdWx0cy53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHdpbmRvdy5oZWlnaHQgPz8gZGVmYXVsdHMuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IHdpbmRvdy5sZWZ0ID8/IGRlZmF1bHRzLmxlZnQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiB3aW5kb3cudG9wID8/IGRlZmF1bHRzLnRvcCxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogZGltZW5zaW9ucz8ud2lkdGggPz8gZGVmYXVsdHMud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBkaW1lbnNpb25zPy5oZWlnaHQgPz8gZGVmYXVsdHMuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IGRpbWVuc2lvbnM/LmxlZnQgPz8gZGVmYXVsdHMubGVmdCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IGRpbWVuc2lvbnM/LnRvcCA/PyBkZWZhdWx0cy50b3AsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKHJlc29sdmVkV2luZG93OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cpOiBXaW5kb3cge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFdpbmRvdyA9IHtcclxuICAgICAgICAgICAgICAgIHdpZHRoOiByZXNvbHZlZFdpbmRvdy53aWR0aCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJlc29sdmVkV2luZG93LndpZHRoLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiByZXNvbHZlZFdpbmRvdy5oZWlnaHQgPT09IG51bGwgPyB1bmRlZmluZWQgOiByZXNvbHZlZFdpbmRvdy5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiByZXNvbHZlZFdpbmRvdy5sZWZ0ID09PSBudWxsID8gdW5kZWZpbmVkIDogcmVzb2x2ZWRXaW5kb3cubGVmdCxcclxuICAgICAgICAgICAgICAgIHRvcDogcmVzb2x2ZWRXaW5kb3cudG9wID09PSBudWxsID8gdW5kZWZpbmVkIDogcmVzb2x2ZWRXaW5kb3cudG9wLFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShwb3BvdXRDb25maWc6IFBvcG91dExheW91dENvbmZpZyk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBsZXQgcm9vdDogUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKHBvcG91dENvbmZpZy5yb290ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcm9vdCA9IHBvcG91dENvbmZpZy5yb290O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChwb3BvdXRDb25maWcuY29udGVudCAhPT0gdW5kZWZpbmVkICYmIHBvcG91dENvbmZpZy5jb250ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJvb3QgPSBwb3BvdXRDb25maWcuY29udGVudFswXTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJvb3QgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbmZpZzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IFJvb3RJdGVtQ29uZmlnLnJlc29sdmUocm9vdCksXHJcbiAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBMYXlvdXRDb25maWcucmVzb2x2ZU9wZW5Qb3BvdXRzKHBvcG91dENvbmZpZy5vcGVuUG9wb3V0cyksXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IExheW91dENvbmZpZy5EaW1lbnNpb25zLnJlc29sdmUocG9wb3V0Q29uZmlnLmRpbWVuc2lvbnMpLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogTGF5b3V0Q29uZmlnLlNldHRpbmdzLnJlc29sdmUocG9wb3V0Q29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgaGVhZGVyOiBMYXlvdXRDb25maWcuSGVhZGVyLnJlc29sdmUocG9wb3V0Q29uZmlnLmhlYWRlciwgcG9wb3V0Q29uZmlnLnNldHRpbmdzLCBwb3BvdXRDb25maWcubGFiZWxzKSxcclxuICAgICAgICAgICAgcGFyZW50SWQ6IHBvcG91dENvbmZpZy5wYXJlbnRJZCA/PyBudWxsLFxyXG4gICAgICAgICAgICBpbmRleEluUGFyZW50OiBwb3BvdXRDb25maWcuaW5kZXhJblBhcmVudCA/PyBudWxsLFxyXG4gICAgICAgICAgICB3aW5kb3c6IFBvcG91dExheW91dENvbmZpZy5XaW5kb3cucmVzb2x2ZShwb3BvdXRDb25maWcud2luZG93LCBwb3BvdXRDb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWc6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnKTogUG9wb3V0TGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFBvcG91dExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgcm9vdDogUm9vdEl0ZW1Db25maWcuZnJvbVJlc29sdmVkT3JVbmRlZmluZWQocmVzb2x2ZWRDb25maWcucm9vdCksXHJcbiAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBmcm9tUmVzb2x2ZWRBcnJheShyZXNvbHZlZENvbmZpZy5vcGVuUG9wb3V0cyksXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IExheW91dENvbmZpZy5EaW1lbnNpb25zLmZyb21SZXNvbHZlZChyZXNvbHZlZENvbmZpZy5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmNyZWF0ZUNvcHkocmVzb2x2ZWRDb25maWcuc2V0dGluZ3MpLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KHJlc29sdmVkQ29uZmlnLmhlYWRlciksXHJcbiAgICAgICAgICAgIHBhcmVudElkOiByZXNvbHZlZENvbmZpZy5wYXJlbnRJZCxcclxuICAgICAgICAgICAgaW5kZXhJblBhcmVudDogcmVzb2x2ZWRDb25maWcuaW5kZXhJblBhcmVudCxcclxuICAgICAgICAgICAgd2luZG93OiBQb3BvdXRMYXlvdXRDb25maWcuV2luZG93LmZyb21SZXNvbHZlZChyZXNvbHZlZENvbmZpZy53aW5kb3cpLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkQXJyYXkocmVzb2x2ZWRBcnJheTogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWdbXSk6IFBvcG91dExheW91dENvbmZpZ1tdIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZE9wZW5Qb3BvdXRDb3VudCA9IHJlc29sdmVkQXJyYXkubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxQb3BvdXRMYXlvdXRDb25maWc+KHJlc29sdmVkT3BlblBvcG91dENvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc29sdmVkT3BlblBvcG91dENvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRPcGVuUG9wb3V0ID0gcmVzb2x2ZWRBcnJheVtpXTtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gUG9wb3V0TGF5b3V0Q29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZE9wZW5Qb3BvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNpemVXaXRoVW5pdCB7XHJcbiAgICBzaXplOiBudW1iZXI7XHJcbiAgICBzaXplVW5pdDogU2l6ZVVuaXRFbnVtO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVW5kZWZpbmFibGVTaXplV2l0aFVuaXQge1xyXG4gICAgc2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gICAgc2l6ZVVuaXQ6IFNpemVVbml0RW51bTtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTaXplKHNpemVTdHJpbmc6IHN0cmluZywgYWxsb3dhYmxlU2l6ZVVuaXRzOiByZWFkb25seSBTaXplVW5pdEVudW1bXSk6IFNpemVXaXRoVW5pdCB7XHJcbiAgICBjb25zdCB7IG51bWVyaWNQYXJ0OiBkaWdpdHNQYXJ0LCBmaXJzdE5vbk51bWVyaWNDaGFyUGFydDogZmlyc3ROb25EaWdpdFBhcnQgfSA9IHNwbGl0U3RyaW5nQXRGaXJzdE5vbk51bWVyaWNDaGFyKHNpemVTdHJpbmcpO1xyXG4gICAgY29uc3Qgc2l6ZSA9IE51bWJlci5wYXJzZUludChkaWdpdHNQYXJ0LCAxMCk7XHJcbiAgICBpZiAoaXNOYU4oc2l6ZSkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5JbnZhbGlkTnVtYmVyUGFydEluU2l6ZVN0cmluZ119OiAke3NpemVTdHJpbmd9YCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHNpemVVbml0ID0gU2l6ZVVuaXRFbnVtLnRyeVBhcnNlKGZpcnN0Tm9uRGlnaXRQYXJ0KTtcclxuICAgICAgICBpZiAoc2l6ZVVuaXQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Vbmtub3duVW5pdEluU2l6ZVN0cmluZ119OiAke3NpemVTdHJpbmd9YClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIWFsbG93YWJsZVNpemVVbml0cy5pbmNsdWRlcyhzaXplVW5pdCkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoYCR7aTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLlVuc3VwcG9ydGVkVW5pdEluU2l6ZVN0cmluZ119OiAke3NpemVTdHJpbmd9YClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemUsIHNpemVVbml0IH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNpemUoc2l6ZTogbnVtYmVyLCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtKSB7XHJcbiAgICByZXR1cm4gc2l6ZS50b1N0cmluZygxMCkgKyBTaXplVW5pdEVudW0uZm9ybWF0KHNpemVVbml0KTtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VW5kZWZpbmFibGVTaXplKHNpemU6IG51bWJlcnwgdW5kZWZpbmVkLCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtKSB7XHJcbiAgICBpZiAoc2l6ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHNpemUudG9TdHJpbmcoMTApICsgU2l6ZVVuaXRFbnVtLmZvcm1hdChzaXplVW5pdCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljIEBkZXByZWNhdGVkIC0gdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOmludGVyZmFjZSl9ICovXHJcbmV4cG9ydCB0eXBlIENvbmZpZyA9IExheW91dENvbmZpZztcclxuIiwiaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVucmVhY2hhYmxlQ2FzZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29uZmlnTWluaWZpZXIgfSBmcm9tICcuLi91dGlscy9jb25maWctbWluaWZpZXInO1xyXG5pbXBvcnQgeyBJdGVtVHlwZSwgSnNvblZhbHVlLCBSZXNwb25zaXZlTW9kZSwgU2lkZSwgU2l6ZVVuaXRFbnVtIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBkZWVwRXh0ZW5kVmFsdWUgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICAvLyBzZWUgSXRlbUNvbmZpZyBmb3IgY29tbWVudHNcclxuICAgIHJlYWRvbmx5IHR5cGU6IEl0ZW1UeXBlO1xyXG4gICAgcmVhZG9ubHkgY29udGVudDogcmVhZG9ubHkgUmVzb2x2ZWRJdGVtQ29uZmlnW107XHJcbiAgICByZWFkb25seSBzaXplOiBudW1iZXI7XHJcbiAgICByZWFkb25seSBzaXplVW5pdDogU2l6ZVVuaXRFbnVtO1xyXG4gICAgcmVhZG9ubHkgbWluU2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gICAgcmVhZG9ubHkgbWluU2l6ZVVuaXQ6IFNpemVVbml0RW51bTtcclxuICAgIC8vIGlkIG5vIGxvbmdlciBzcGVjaWZpZXMgd2hldGhlciBhbiBJdGVtIGlzIG1heGltaXNlZC4gIFRoaXMgaXMgbm93IGRvbmUgYnkgSGVhZGVySXRlbUNvbmZpZy5tYXhpbWlzZWRcclxuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XHJcbiAgICByZWFkb25seSBpc0Nsb3NhYmxlOiBib29sZWFuO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdHM6IFJlc29sdmVkSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICB0eXBlOiBJdGVtVHlwZS5ncm91bmQsIC8vIG5vdCByZWFsbHkgZGVmYXVsdCBidXQgbmVlZCBzb21ldGhpbmdcclxuICAgICAgICBjb250ZW50OiBbXSxcclxuICAgICAgICBzaXplOiAxLFxyXG4gICAgICAgIHNpemVVbml0OiBTaXplVW5pdEVudW0uRnJhY3Rpb25hbCxcclxuICAgICAgICBtaW5TaXplOiB1bmRlZmluZWQsXHJcbiAgICAgICAgbWluU2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QaXhlbCxcclxuICAgICAgICBpZDogJycsXHJcbiAgICAgICAgaXNDbG9zYWJsZTogdHJ1ZSxcclxuICAgIH0gYXMgY29uc3Q7XHJcblxyXG4gICAgLyoqIENyZWF0ZXMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBSZXNvbHZlZEl0ZW1Db25maWcgdXNpbmcgYW4gYWx0ZXJuYXRpdmUgY29udGVudCBpZiBzcGVjaWZpZWQgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBSZXNvbHZlZEl0ZW1Db25maWcsIGNvbnRlbnQ/OiBSZXNvbHZlZEl0ZW1Db25maWdbXSk6IFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgc3dpdGNoIChvcmlnaW5hbC50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuZ3JvdW5kOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuY3JlYXRlQ29weShvcmlnaW5hbCBhcyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50IGFzIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZ1tdKTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuY3JlYXRlQ29weShvcmlnaW5hbCBhcyBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZywgY29udGVudCBhcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWdbXSk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcuY3JlYXRlQ29weShvcmlnaW5hbCBhcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignQ0lDQzkxMzU0Jywgb3JpZ2luYWwudHlwZSwgJ0ludmFsaWQgQ29uZmlnIEl0ZW0gdHlwZSBzcGVjaWZpZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHQodHlwZTogSXRlbVR5cGUpOiBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignQ0lDQ0RSOTE1NjInKTsgLy8gR2V0IGRlZmF1bHQgcm9vdCBmcm9tIExheW91dENvbmZpZ1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCh0eXBlKTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0NJQ0NERDkxNTYzJywgdHlwZSwgJ0ludmFsaWQgQ29uZmlnIEl0ZW0gdHlwZSBzcGVjaWZpZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcG9uZW50SXRlbShpdGVtQ29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1Db25maWcudHlwZSA9PT0gSXRlbVR5cGUuY29tcG9uZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1N0YWNrSXRlbShpdGVtQ29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gaXRlbUNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5zdGFjaztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNHcm91bmRJdGVtKGl0ZW1Db25maWc6IFJlc29sdmVkSXRlbUNvbmZpZyk6IGl0ZW1Db25maWcgaXMgUmVzb2x2ZWRHcm91bmRJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gaXRlbUNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5ncm91bmQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIFN0YWNrIG9yIENvbXBvbmVudFxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgIGhlYWRlcjogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyIHwgdW5kZWZpbmVkOyAvLyB1bmRlZmluZWQgbWVhbnMgZ2V0IGhlYWRlciBzZXR0aW5ncyBmcm9tIExheW91dENvbmZpZ1xyXG4gICAgcmVhZG9ubHkgbWF4aW1pc2VkOiBib29sZWFuO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0TWF4aW1pc2VkID0gZmFsc2U7XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBIZWFkZXIge1xyXG4gICAgICAgIC8vIHVuZGVmaW5lZCBtZWFucyBnZXQgcHJvcGVydHkgdmFsdWUgZnJvbSBMYXlvdXRDb25maWdcclxuICAgICAgICByZWFkb25seSBzaG93OiBmYWxzZSB8IFNpZGUgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmVhZG9ubHkgcG9wb3V0OiBmYWxzZSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICByZWFkb25seSBtYXhpbWlzZTogZmFsc2UgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmVhZG9ubHkgY2xvc2U6IGZhbHNlIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHJlYWRvbmx5IG1pbmltaXNlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmVhZG9ubHkgdGFiRHJvcGRvd246IGZhbHNlIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgSGVhZGVyIHtcclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogSGVhZGVyIHwgdW5kZWZpbmVkLCBzaG93PzogZmFsc2UgfCBTaWRlKTogSGVhZGVyIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3c6IHNob3cgPz8gb3JpZ2luYWwuc2hvdyxcclxuICAgICAgICAgICAgICAgICAgICBwb3BvdXQ6IG9yaWdpbmFsLnBvcG91dCxcclxuICAgICAgICAgICAgICAgICAgICBjbG9zZTogb3JpZ2luYWwuY2xvc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4aW1pc2U6IG9yaWdpbmFsLm1heGltaXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbmltaXNlOiBvcmlnaW5hbC5taW5pbWlzZSxcclxuICAgICAgICAgICAgICAgICAgICB0YWJEcm9wZG93bjogb3JpZ2luYWwudGFiRHJvcGRvd24sXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgZXh0ZW5kcyBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICByZWFkb25seSB0eXBlOiAnc3RhY2snO1xyXG4gICAgcmVhZG9ubHkgY29udGVudDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW107XHJcbiAgICAvKiogVGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgaXRlbSBpbiB0aGUgU3RhY2suICBPbmx5IHVuZGVmaW5lZCBpZiB0aGUgU3RhY2sgaXMgZW1wdHkuICovXHJcbiAgICByZWFkb25seSBhY3RpdmVJdGVtSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdEFjdGl2ZUl0ZW1JbmRleCA9IDA7XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLCBjb250ZW50PzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10pOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogb3JpZ2luYWwudHlwZSxcclxuICAgICAgICAgICAgY29udGVudDogY29udGVudCAhPT0gdW5kZWZpbmVkID8gY29weUNvbnRlbnQoY29udGVudCkgOiBjb3B5Q29udGVudChvcmlnaW5hbC5jb250ZW50KSxcclxuICAgICAgICAgICAgc2l6ZTogb3JpZ2luYWwuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IG9yaWdpbmFsLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBvcmlnaW5hbC5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogb3JpZ2luYWwubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBvcmlnaW5hbC5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiBvcmlnaW5hbC5tYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IG9yaWdpbmFsLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIGFjdGl2ZUl0ZW1JbmRleDogb3JpZ2luYWwuYWN0aXZlSXRlbUluZGV4LFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KG9yaWdpbmFsLmhlYWRlciksXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNvcHlDb250ZW50KG9yaWdpbmFsOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWdbXSk6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdIHtcclxuICAgICAgICBjb25zdCBjb3VudCA9IG9yaWdpbmFsLmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IFJlc29sdmVkSXRlbUNvbmZpZy5jcmVhdGVDb3B5KG9yaWdpbmFsW2ldKSBhcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHQoKTogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLnN0YWNrLFxyXG4gICAgICAgICAgICBjb250ZW50OiBbXSxcclxuICAgICAgICAgICAgc2l6ZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZWQ6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLmRlZmF1bHRNYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXg6IGRlZmF1bHRBY3RpdmVJdGVtSW5kZXgsXHJcbiAgICAgICAgICAgIGhlYWRlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyBleHRlbmRzIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnIHtcclxuICAgIC8vIHNlZSBDb21wb25lbnRJdGVtQ29uZmlnIGZvciBjb21tZW50c1xyXG4gICAgcmVhZG9ubHkgdHlwZTogJ2NvbXBvbmVudCc7XHJcbiAgICByZWFkb25seSBjb250ZW50OiBbXTtcclxuICAgIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XHJcbiAgICByZWFkb25seSByZW9yZGVyRW5hYmxlZDogYm9vbGVhbjsgLy8gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIExheW91dENvbmZpZy5yZW9yZGVyRW5hYmxlZC5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBhcyBzcGVjaWZpZWQgaW4gbGF5b3V0LnJlZ2lzdGVyQ29tcG9uZW50LiBNYW5kYXRvcnkgaWYgdHlwZSBpcyAnY29tcG9uZW50Jy5cclxuICAgICAqL1xyXG4gICAgcmVhZG9ubHkgY29tcG9uZW50VHlwZTogSnNvblZhbHVlO1xyXG4gICAgcmVhZG9ubHkgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWU7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0UmVvcmRlckVuYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ29tcG9uZW50VHlwZU5hbWUoaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRUeXBlID0gaXRlbUNvbmZpZy5jb21wb25lbnRUeXBlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50VHlwZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFR5cGU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IG9yaWdpbmFsLnR5cGUsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtdLFxyXG4gICAgICAgICAgICBzaXplOiBvcmlnaW5hbC5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogb3JpZ2luYWwuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IG9yaWdpbmFsLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiBvcmlnaW5hbC5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IG9yaWdpbmFsLmlkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZWQ6IG9yaWdpbmFsLm1heGltaXNlZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogb3JpZ2luYWwuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IG9yaWdpbmFsLnJlb3JkZXJFbmFibGVkLFxyXG4gICAgICAgICAgICB0aXRsZTogb3JpZ2luYWwudGl0bGUsXHJcbiAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLmNyZWF0ZUNvcHkob3JpZ2luYWwuaGVhZGVyKSxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZTogb3JpZ2luYWwuY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGU6IGRlZXBFeHRlbmRWYWx1ZSh1bmRlZmluZWQsIG9yaWdpbmFsLmNvbXBvbmVudFN0YXRlKSBhcyBKc29uVmFsdWUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHQoY29tcG9uZW50VHlwZTogSnNvblZhbHVlID0gJycsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZSA9ICcnKTogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgICBjb250ZW50OiBbXSxcclxuICAgICAgICAgICAgc2l6ZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZWQ6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLmRlZmF1bHRNYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLmRlZmF1bHRSZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgICAgIGhlYWRlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlLFxyXG4gICAgICAgICAgICBjb21wb25lbnRTdGF0ZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY29weUNvbXBvbmVudFR5cGUoY29tcG9uZW50VHlwZTogSnNvblZhbHVlKTogSnNvblZhbHVlIHtcclxuICAgICAgICByZXR1cm4gZGVlcEV4dGVuZFZhbHVlKHt9LCBjb21wb25lbnRUeXBlKSBhcyBKc29uVmFsdWVcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEJhc2UgZm9yIFJvb3Qgb3IgUm93T3JDb2x1bW4gSXRlbUNvbmZpZ3NcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyBleHRlbmRzIFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICByZWFkb25seSB0eXBlOiAncm93JyB8ICdjb2x1bW4nO1xyXG4gICAgLyoqIE5vdGUgdGhhdCBSb3dPckNvbHVtbiBSZXNvbHZlZEl0ZW1Db25maWcgY29udGVudHMsIGNhbiBjb250YWluIENvbXBvbmVudEl0ZW0gaXRlbUNvbmZpZ3MuICBIb3dldmVyXHJcbiAgICAgKiB3aGVuIENvbnRlbnRJdGVtcyBhcmUgY3JlYXRlZCwgdGhlc2UgQ29tcG9uZW50SXRlbSBpdGVtQ29uZmlncyB3aWxsIGNyZWF0ZSBhIFN0YWNrIHdpdGggYSBjaGlsZCBDb21wb25lbnRJdGVtLlxyXG4gICAgICovXHJcbiAgICByZWFkb25seSBjb250ZW50OiByZWFkb25seSAoUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB8IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZylbXTtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgdHlwZSBDaGlsZEl0ZW1Db25maWcgPSBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIHwgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NoaWxkSXRlbUNvbmZpZyhpdGVtQ29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIENoaWxkSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgc3dpdGNoIChpdGVtQ29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignQ1JPQ09TUENJQ0lDMTM2ODcnLCBpdGVtQ29uZmlnLnR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsIGNvbnRlbnQ/OiBDaGlsZEl0ZW1Db25maWdbXSk6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBvcmlnaW5hbC50eXBlLFxyXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50ICE9PSB1bmRlZmluZWQgPyBjb3B5Q29udGVudChjb250ZW50KSA6IGNvcHlDb250ZW50KG9yaWdpbmFsLmNvbnRlbnQpLFxyXG4gICAgICAgICAgICBzaXplOiBvcmlnaW5hbC5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogb3JpZ2luYWwuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IG9yaWdpbmFsLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiBvcmlnaW5hbC5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IG9yaWdpbmFsLmlkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBvcmlnaW5hbC5pc0Nsb3NhYmxlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb3B5Q29udGVudChvcmlnaW5hbDogcmVhZG9ubHkgQ2hpbGRJdGVtQ29uZmlnW10pOiBDaGlsZEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBvcmlnaW5hbC5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PENoaWxkSXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBSZXNvbHZlZEl0ZW1Db25maWcuY3JlYXRlQ29weShvcmlnaW5hbFtpXSkgYXMgQ2hpbGRJdGVtQ29uZmlnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0KHR5cGU6ICdyb3cnIHwgJ2NvbHVtbicpOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZSxcclxuICAgICAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgICAgIHNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSb290SXRlbUNvbmZpZyBpcyB0aGUgdG9wbW9zdCBSZXNvbHZlZEl0ZW1Db25maWcgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLlxyXG4gKiBOb3RlIHRoYXQgaXQgZG9lcyBub3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgY29udGVudEl0ZW0uICBJdCBzcGVjaWZpZXMgdGhlIG9uZSBhbmQgb25seSBjaGlsZCBvZiB0aGUgR3JvdW5kIENvbnRlbnRJdGVtXHJcbiAqIE5vdGUgdGhhdCBSb290SXRlbUNvbmZpZyBjYW4gYmUgYW4gQ29tcG9uZW50SXRlbSBpdGVtQ29uZmlnLiAgSG93ZXZlciB3aGVuIHRoZSBHcm91bmQgQ29udGVudEl0ZW0ncyBjaGlsZCBpcyBjcmVhdGVkXHJcbiAqIGEgQ29tcG9uZW50SXRlbSBpdGVtQ29uZmlnIHdpbGwgY3JlYXRlIGEgU3RhY2sgd2l0aCBhIGNoaWxkIENvbXBvbmVudEl0ZW0uXHJcbiAqIEBwdWJsaWNcclxuKi9cclxuZXhwb3J0IHR5cGUgUmVzb2x2ZWRSb290SXRlbUNvbmZpZyA9IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgfCBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkUm9vdEl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkoY29uZmlnOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnKTogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIFJlc29sdmVkSXRlbUNvbmZpZy5jcmVhdGVDb3B5KGNvbmZpZykgYXMgUmVzb2x2ZWRSb290SXRlbUNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNSb290SXRlbUNvbmZpZyhpdGVtQ29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIFJlc29sdmVkUm9vdEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAoaXRlbUNvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0NST0NPU1BDSUNJQzEzNjg3JywgaXRlbUNvbmZpZy50eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEdyb3VuZEl0ZW1Db25maWcgZXh0ZW5kcyBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgcmVhZG9ubHkgdHlwZTogJ2dyb3VuZCc7XHJcbiAgICByZWFkb25seSBzaXplOiAxMDAsXHJcbiAgICByZWFkb25seSBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBlcmNlbnQsXHJcbiAgICByZWFkb25seSBtaW5TaXplOiAwLFxyXG4gICAgcmVhZG9ubHkgbWluU2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QaXhlbCxcclxuICAgIHJlYWRvbmx5IGlkOiAnJyxcclxuICAgIHJlYWRvbmx5IGlzQ2xvc2FibGU6IGZhbHNlLFxyXG4gICAgcmVhZG9ubHkgdGl0bGU6ICcnLFxyXG4gICAgcmVhZG9ubHkgcmVvcmRlckVuYWJsZWQ6IGZhbHNlLFxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRHcm91bmRJdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGUocm9vdEl0ZW1Db25maWc6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQpOlJlc29sdmVkR3JvdW5kSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgY29udGVudCA9IHJvb3RJdGVtQ29uZmlnID09PSB1bmRlZmluZWQgPyBbXSA6IFtyb290SXRlbUNvbmZpZ107XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuZ3JvdW5kLFxyXG4gICAgICAgICAgICBjb250ZW50LFxyXG4gICAgICAgICAgICBzaXplOiAxMDAsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiBTaXplVW5pdEVudW0uUGVyY2VudCxcclxuICAgICAgICAgICAgbWluU2l6ZTogMCxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QaXhlbCxcclxuICAgICAgICAgICAgaWQ6ICcnLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgIHJlYWRvbmx5IHJvb3Q6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICByZWFkb25seSBvcGVuUG9wb3V0czogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWdbXTtcclxuICAgIHJlYWRvbmx5IGRpbWVuc2lvbnM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnM7XHJcbiAgICByZWFkb25seSBzZXR0aW5nczogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3M7XHJcbiAgICByZWFkb25seSBoZWFkZXI6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlcjtcclxuICAgIHJlYWRvbmx5IHJlc29sdmVkOiB0cnVlLFxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3Mge1xyXG4gICAgICAgIC8vIHNlZSBDb25maWcuU2V0dGluZ3MgZm9yIGNvbW1lbnRzXHJcbiAgICAgICAgcmVhZG9ubHkgZHJhZ0JldHdlZW5XaW5kb3dzOiBib29sZWFuO1xyXG4gICAgICAgIHJlYWRvbmx5IGRyYWdUb05ld1dpbmRvdzogYm9vbGVhbjtcclxuICAgICAgICByZWFkb25seSByZW9yZGVyRW5hYmxlZDogYm9vbGVhbjsgLy8gYWxzbyBpbiBSZXNvbHZlZEl0ZW1Db25maWcgd2hpY2ggdGFrZXMgcHJlY2VkZW5jZVxyXG4gICAgICAgIHJlYWRvbmx5IHBvcG91dFdob2xlU3RhY2s6IGJvb2xlYW47XHJcbiAgICAgICAgcmVhZG9ubHkgYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yOiBib29sZWFuO1xyXG4gICAgICAgIC8qKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gdmVyc2lvbiAzLiAqL1xyXG4gICAgICAgIHJlYWRvbmx5IGNsb3NlUG9wb3V0c09uVW5sb2FkOiBib29sZWFuO1xyXG4gICAgICAgIHJlYWRvbmx5IHJlc3BvbnNpdmVNb2RlOiBSZXNwb25zaXZlTW9kZTtcclxuICAgICAgICByZWFkb25seSB0YWJPdmVybGFwQWxsb3dhbmNlOiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgcmVvcmRlck9uVGFiTWVudUNsaWNrOiBib29sZWFuO1xyXG4gICAgICAgIHJlYWRvbmx5IHRhYkNvbnRyb2xPZmZzZXQ6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBwb3BJbk9uQ2xvc2U6IGJvb2xlYW47XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBTZXR0aW5ncyB7XHJcbiAgICAgICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncyA9IHtcclxuICAgICAgICAgICAgZHJhZ0JldHdlZW5XaW5kb3dzOiB0cnVlLFxyXG4gICAgICAgICAgICBkcmFnVG9OZXdXaW5kb3c6IHRydWUsXHJcbiAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICBwb3BvdXRXaG9sZVN0YWNrOiBmYWxzZSxcclxuICAgICAgICAgICAgYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yOiB0cnVlLFxyXG4gICAgICAgICAgICBjbG9zZVBvcG91dHNPblVubG9hZDogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzcG9uc2l2ZU1vZGU6IFJlc3BvbnNpdmVNb2RlLm5vbmUsIC8vIHdhcyBvbmxvYWRcclxuICAgICAgICAgICAgdGFiT3ZlcmxhcEFsbG93YW5jZTogMCxcclxuICAgICAgICAgICAgcmVvcmRlck9uVGFiTWVudUNsaWNrOiB0cnVlLFxyXG4gICAgICAgICAgICB0YWJDb250cm9sT2Zmc2V0OiAxMCxcclxuICAgICAgICAgICAgcG9wSW5PbkNsb3NlOiBmYWxzZSxcclxuICAgICAgICB9IGFzIGNvbnN0O1xyXG5cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogU2V0dGluZ3MpOiBTZXR0aW5ncyB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkcmFnQmV0d2VlbldpbmRvd3M6IG9yaWdpbmFsLmRyYWdCZXR3ZWVuV2luZG93cyxcclxuICAgICAgICAgICAgICAgIGRyYWdUb05ld1dpbmRvdzogb3JpZ2luYWwuZHJhZ1RvTmV3V2luZG93LFxyXG4gICAgICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IG9yaWdpbmFsLnJlb3JkZXJFbmFibGVkLFxyXG4gICAgICAgICAgICAgICAgcG9wb3V0V2hvbGVTdGFjazogb3JpZ2luYWwucG9wb3V0V2hvbGVTdGFjayxcclxuICAgICAgICAgICAgICAgIGJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcjogb3JpZ2luYWwuYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yLFxyXG4gICAgICAgICAgICAgICAgY2xvc2VQb3BvdXRzT25VbmxvYWQ6IG9yaWdpbmFsLmNsb3NlUG9wb3V0c09uVW5sb2FkLFxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2l2ZU1vZGU6IG9yaWdpbmFsLnJlc3BvbnNpdmVNb2RlLFxyXG4gICAgICAgICAgICAgICAgdGFiT3ZlcmxhcEFsbG93YW5jZTogb3JpZ2luYWwudGFiT3ZlcmxhcEFsbG93YW5jZSxcclxuICAgICAgICAgICAgICAgIHJlb3JkZXJPblRhYk1lbnVDbGljazogb3JpZ2luYWwucmVvcmRlck9uVGFiTWVudUNsaWNrLFxyXG4gICAgICAgICAgICAgICAgdGFiQ29udHJvbE9mZnNldDogb3JpZ2luYWwudGFiQ29udHJvbE9mZnNldCxcclxuICAgICAgICAgICAgICAgIHBvcEluT25DbG9zZTogb3JpZ2luYWwucG9wSW5PbkNsb3NlLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRGltZW5zaW9ucyB7XHJcbiAgICAgICAgLy8gc2VlIExheW91dENvbmZpZy5EaW1lbnNpb25zIGZvciBjb21tZW50c1xyXG4gICAgICAgIHJlYWRvbmx5IGJvcmRlcldpZHRoOiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgYm9yZGVyR3JhYldpZHRoOiBudW1iZXIsXHJcbiAgICAgICAgcmVhZG9ubHkgZGVmYXVsdE1pbkl0ZW1IZWlnaHQ6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBkZWZhdWx0TWluSXRlbUhlaWdodFVuaXQ6IFNpemVVbml0RW51bTtcclxuICAgICAgICByZWFkb25seSBkZWZhdWx0TWluSXRlbVdpZHRoOiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQ6IFNpemVVbml0RW51bTtcclxuICAgICAgICByZWFkb25seSBoZWFkZXJIZWlnaHQ6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBkcmFnUHJveHlXaWR0aDogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IGRyYWdQcm94eUhlaWdodDogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgRGltZW5zaW9ucyB7XHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IERpbWVuc2lvbnMpOiBEaW1lbnNpb25zIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoOiBvcmlnaW5hbC5ib3JkZXJXaWR0aCxcclxuICAgICAgICAgICAgICAgIGJvcmRlckdyYWJXaWR0aDogb3JpZ2luYWwuYm9yZGVyR3JhYldpZHRoLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHQ6IG9yaWdpbmFsLmRlZmF1bHRNaW5JdGVtSGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0OiBvcmlnaW5hbC5kZWZhdWx0TWluSXRlbUhlaWdodFVuaXQsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoOiBvcmlnaW5hbC5kZWZhdWx0TWluSXRlbVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQ6IG9yaWdpbmFsLmRlZmF1bHRNaW5JdGVtV2lkdGhVbml0LFxyXG4gICAgICAgICAgICAgICAgaGVhZGVySGVpZ2h0OiBvcmlnaW5hbC5oZWFkZXJIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBkcmFnUHJveHlXaWR0aDogb3JpZ2luYWwuZHJhZ1Byb3h5V2lkdGgsXHJcbiAgICAgICAgICAgICAgICBkcmFnUHJveHlIZWlnaHQ6IG9yaWdpbmFsLmRyYWdQcm94eUhlaWdodCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zID0ge1xyXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogNSxcclxuICAgICAgICAgICAgYm9yZGVyR3JhYldpZHRoOiA1LFxyXG4gICAgICAgICAgICBkZWZhdWx0TWluSXRlbUhlaWdodDogMCxcclxuICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwsXHJcbiAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGg6IDEwLFxyXG4gICAgICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoVW5pdDogU2l6ZVVuaXRFbnVtLlBpeGVsLFxyXG4gICAgICAgICAgICBoZWFkZXJIZWlnaHQ6IDIwLFxyXG4gICAgICAgICAgICBkcmFnUHJveHlXaWR0aDogMzAwLFxyXG4gICAgICAgICAgICBkcmFnUHJveHlIZWlnaHQ6IDIwMFxyXG4gICAgICAgIH0gYXMgY29uc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBIZWFkZXIge1xyXG4gICAgICAgIHJlYWRvbmx5IHNob3c6IGZhbHNlIHwgU2lkZTtcclxuICAgICAgICByZWFkb25seSBwb3BvdXQ6IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIHJlYWRvbmx5IHBvcGluOiBzdHJpbmc7XHJcbiAgICAgICAgcmVhZG9ubHkgbWF4aW1pc2U6IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIHJlYWRvbmx5IG1pbmltaXNlOiBzdHJpbmc7XHJcbiAgICAgICAgcmVhZG9ubHkgY2xvc2U6IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIHJlYWRvbmx5IHRhYkRyb3Bkb3duOiBmYWxzZSB8IHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIEhlYWRlciB7XHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IEhlYWRlcik6IEhlYWRlciB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBzaG93OiBvcmlnaW5hbC5zaG93LFxyXG4gICAgICAgICAgICAgICAgcG9wb3V0OiBvcmlnaW5hbC5wb3BvdXQsXHJcbiAgICAgICAgICAgICAgICBwb3Bpbjogb3JpZ2luYWwucG9waW4sXHJcbiAgICAgICAgICAgICAgICBjbG9zZTogb3JpZ2luYWwuY2xvc2UsXHJcbiAgICAgICAgICAgICAgICBtYXhpbWlzZTogb3JpZ2luYWwubWF4aW1pc2UsXHJcbiAgICAgICAgICAgICAgICBtaW5pbWlzZTogb3JpZ2luYWwubWluaW1pc2UsXHJcbiAgICAgICAgICAgICAgICB0YWJEcm9wZG93bjogb3JpZ2luYWwudGFiRHJvcGRvd24sXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0czogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyID0ge1xyXG4gICAgICAgICAgICBzaG93OiBTaWRlLnRvcCxcclxuICAgICAgICAgICAgcG9wb3V0OiAnb3BlbiBpbiBuZXcgd2luZG93JyxcclxuICAgICAgICAgICAgcG9waW46ICdkb2NrJyxcclxuICAgICAgICAgICAgbWF4aW1pc2U6ICdtYXhpbWlzZScsXHJcbiAgICAgICAgICAgIG1pbmltaXNlOiAnbWluaW1pc2UnLFxyXG4gICAgICAgICAgICBjbG9zZTogJ2Nsb3NlJyxcclxuICAgICAgICAgICAgdGFiRHJvcGRvd246ICdhZGRpdGlvbmFsIHRhYnMnXHJcbiAgICAgICAgfSBhcyBjb25zdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNQb3BvdXQoY29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZyk6IGNvbmZpZyBpcyBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuICdwYXJlbnRJZCcgaW4gY29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0KCk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkTGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICByb290OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBbXSxcclxuICAgICAgICAgICAgZGltZW5zaW9uczogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cyxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cyxcclxuICAgICAgICAgICAgcmVzb2x2ZWQ6IHRydWUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkoY29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZyk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBpZiAoaXNQb3BvdXQoY29uZmlnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuY3JlYXRlQ29weShjb25maWcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICByb290OiBjb25maWcucm9vdCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogUmVzb2x2ZWRSb290SXRlbUNvbmZpZy5jcmVhdGVDb3B5KGNvbmZpZy5yb290KSxcclxuICAgICAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBSZXNvbHZlZExheW91dENvbmZpZy5jb3B5T3BlblBvcG91dHMoY29uZmlnLm9wZW5Qb3BvdXRzKSxcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5jcmVhdGVDb3B5KGNvbmZpZy5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmNyZWF0ZUNvcHkoY29uZmlnLmRpbWVuc2lvbnMpLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShjb25maWcuaGVhZGVyKSxcclxuICAgICAgICAgICAgICAgIHJlc29sdmVkOiBjb25maWcucmVzb2x2ZWQsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNvcHlPcGVuUG9wb3V0cyhvcmlnaW5hbDogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWdbXSk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gb3JpZ2luYWwubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZFBvcG91dExheW91dENvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5jcmVhdGVDb3B5KG9yaWdpbmFsW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgR29sZGVuTGF5b3V0IGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFuZFxyXG4gICAgICogcmVwbGFjZXMgaXRzIGtleXMgYW5kIHZhbHVlcyByZWN1cnNpdmVseSB3aXRoXHJcbiAgICAgKiBvbmUgbGV0dGVyIGNvdW50ZXJwYXJ0c1xyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gbWluaWZ5Q29uZmlnKGxheW91dENvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIENvbmZpZ01pbmlmaWVyLnRyYW5zbGF0ZU9iamVjdChsYXlvdXRDb25maWcsIHRydWUpIGFzIFJlc29sdmVkTGF5b3V0Q29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBjb25maWd1cmF0aW9uIE9iamVjdCB0aGF0IHdhcyBwcmV2aW91c2x5IG1pbmlmaWVkXHJcbiAgICAgKiB1c2luZyBtaW5pZnlDb25maWcgYW5kIHJldHVybnMgaXRzIG9yaWdpbmFsIHZlcnNpb25cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHVubWluaWZ5Q29uZmlnKG1pbmlmaWVkQ29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZyk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICByZXR1cm4gQ29uZmlnTWluaWZpZXIudHJhbnNsYXRlT2JqZWN0KG1pbmlmaWVkQ29uZmlnLCBmYWxzZSkgYXMgUmVzb2x2ZWRMYXlvdXRDb25maWc7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcgZXh0ZW5kcyBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICByZWFkb25seSBwYXJlbnRJZDogc3RyaW5nIHwgbnVsbDtcclxuICAgIHJlYWRvbmx5IGluZGV4SW5QYXJlbnQ6IG51bWJlciB8IG51bGw7XHJcbiAgICByZWFkb25seSB3aW5kb3c6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdztcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICAgICAgcmVhZG9ubHkgd2lkdGg6IG51bWJlciB8IG51bGwsXHJcbiAgICAgICAgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIHJlYWRvbmx5IGxlZnQ6IG51bWJlciB8IG51bGwsXHJcbiAgICAgICAgcmVhZG9ubHkgdG9wOiBudW1iZXIgfCBudWxsLFxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgV2luZG93IHtcclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogV2luZG93KTogV2luZG93IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHdpZHRoOiBvcmlnaW5hbC53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogb3JpZ2luYWwuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgbGVmdDogb3JpZ2luYWwubGVmdCxcclxuICAgICAgICAgICAgICAgIHRvcDogb3JpZ2luYWwudG9wLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBleHBvcnQgY29uc3QgZGVmYXVsdHM6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdyA9IHtcclxuICAgICAgICAgICAgd2lkdGg6IG51bGwsXHJcbiAgICAgICAgICAgIGhlaWdodDogbnVsbCxcclxuICAgICAgICAgICAgbGVmdDogbnVsbCxcclxuICAgICAgICAgICAgdG9wOiBudWxsLFxyXG4gICAgICAgIH0gYXMgY29uc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IG9yaWdpbmFsLnJvb3QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcuY3JlYXRlQ29weShvcmlnaW5hbC5yb290KSxcclxuICAgICAgICAgICAgb3BlblBvcG91dHM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLmNvcHlPcGVuUG9wb3V0cyhvcmlnaW5hbC5vcGVuUG9wb3V0cyksXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5jcmVhdGVDb3B5KG9yaWdpbmFsLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgZGltZW5zaW9uczogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5jcmVhdGVDb3B5KG9yaWdpbmFsLmRpbWVuc2lvbnMpLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KG9yaWdpbmFsLmhlYWRlciksXHJcbiAgICAgICAgICAgIHBhcmVudElkOiBvcmlnaW5hbC5wYXJlbnRJZCxcclxuICAgICAgICAgICAgaW5kZXhJblBhcmVudDogb3JpZ2luYWwuaW5kZXhJblBhcmVudCxcclxuICAgICAgICAgICAgd2luZG93OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cuY3JlYXRlQ29weShvcmlnaW5hbC53aW5kb3cpLFxyXG4gICAgICAgICAgICByZXNvbHZlZDogb3JpZ2luYWwucmVzb2x2ZWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50SXRlbUNvbmZpZywgSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9jb25maWcnO1xyXG5pbXBvcnQgeyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgVGFiIH0gZnJvbSAnLi4vY29udHJvbHMvdGFiJztcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWROdWxsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbnRlbnQtaXRlbSc7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBKc29uVmFsdWUsIExvZ2ljYWxaSW5kZXgsIExvZ2ljYWxaSW5kZXhUb0RlZmF1bHRNYXAgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7IGRlZXBFeHRlbmQsIHNldEVsZW1lbnRIZWlnaHQsIHNldEVsZW1lbnRXaWR0aCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRDb250YWluZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29tcG9uZW50VHlwZTogSnNvblZhbHVlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfYm91bmRDb21wb25lbnQ6IENvbXBvbmVudENvbnRhaW5lci5CaW5kYWJsZUNvbXBvbmVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3dpZHRoOiBudW1iZXI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9oZWlnaHQ6IG51bWJlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2lzQ2xvc2FibGU7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pbml0aWFsU3RhdGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3N0YXRlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF92aXNpYmxlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXNTaG93bldpdGhaZXJvRGltZW5zaW9ucztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3RhYjogVGFiO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc3RhY2tNYXhpbWlzZWQgPSBmYWxzZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2xvZ2ljYWxaSW5kZXg6IExvZ2ljYWxaSW5kZXg7XHJcblxyXG4gICAgc3RhdGVSZXF1ZXN0RXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5TdGF0ZVJlcXVlc3RFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcbiAgICB2aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5WaXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQgfCB1bmRlZmluZWQ7XHJcbiAgICB2aXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5WaXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQgfCB1bmRlZmluZWQ7XHJcbiAgICB2aXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLlZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIGdldCB3aWR0aCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fd2lkdGg7IH1cclxuICAgIGdldCBoZWlnaHQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2hlaWdodDsgfVxyXG4gICAgZ2V0IHBhcmVudCgpOiBDb21wb25lbnRJdGVtIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChDb21wb25lbnRDb250YWluZXI6Y2xhc3MpLmNvbXBvbmVudFR5cGV9ICovXHJcbiAgICBnZXQgY29tcG9uZW50TmFtZSgpOiBKc29uVmFsdWUgeyByZXR1cm4gdGhpcy5fY29tcG9uZW50VHlwZTsgfVxyXG4gICAgZ2V0IGNvbXBvbmVudFR5cGUoKTogSnNvblZhbHVlIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudFR5cGU7IH1cclxuICAgIGdldCB2aXJ0dWFsKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fYm91bmRDb21wb25lbnQudmlydHVhbDsgfVxyXG4gICAgZ2V0IGNvbXBvbmVudCgpOiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50IHsgcmV0dXJuIHRoaXMuX2JvdW5kQ29tcG9uZW50LmNvbXBvbmVudDsgfVxyXG4gICAgZ2V0IHRhYigpOiBUYWIgeyByZXR1cm4gdGhpcy5fdGFiOyB9XHJcbiAgICBnZXQgdGl0bGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX3BhcmVudC50aXRsZTsgfVxyXG4gICAgZ2V0IGxheW91dE1hbmFnZXIoKTogTGF5b3V0TWFuYWdlciB7IHJldHVybiB0aGlzLl9sYXlvdXRNYW5hZ2VyOyB9XHJcbiAgICBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7IHJldHVybiAhdGhpcy5fdmlzaWJsZTsgfVxyXG4gICAgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl92aXNpYmxlOyB9XHJcbiAgICBnZXQgc3RhdGUoKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX3N0YXRlOyB9XHJcbiAgICAvKiogUmV0dXJuIHRoZSBpbml0aWFsIGNvbXBvbmVudCBzdGF0ZSAqL1xyXG4gICAgZ2V0IGluaXRpYWxTdGF0ZSgpOiBKc29uVmFsdWUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5faW5pdGlhbFN0YXRlOyB9XHJcbiAgICAvKiogVGhlIGlubmVyIERPTSBlbGVtZW50IHdoZXJlIHRoZSBjb250YWluZXIncyBjb250ZW50IGlzIGludGVuZGVkIHRvIGxpdmUgaW4gKi9cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3BhcmVudDogQ29tcG9uZW50SXRlbSxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTEVsZW1lbnQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3VwZGF0ZUl0ZW1Db25maWdFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLlVwZGF0ZUl0ZW1Db25maWdFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3Nob3dFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLlNob3dFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2hpZGVFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLkhpZGVFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2ZvY3VzRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5Gb2N1c0V2ZW50SGFuZGxlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfYmx1ckV2ZW50OiBDb21wb25lbnRDb250YWluZXIuQmx1ckV2ZW50SGFuZGxlcixcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gMDtcclxuICAgICAgICB0aGlzLl9oZWlnaHQgPSAwO1xyXG4gICAgICAgIHRoaXMuX3Zpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9jb21wb25lbnRUeXBlID0gX2NvbmZpZy5jb21wb25lbnRUeXBlO1xyXG4gICAgICAgIHRoaXMuX2lzQ2xvc2FibGUgPSBfY29uZmlnLmlzQ2xvc2FibGU7XHJcbiAgICAgICAgdGhpcy5faW5pdGlhbFN0YXRlID0gX2NvbmZpZy5jb21wb25lbnRTdGF0ZTtcclxuICAgICAgICB0aGlzLl9zdGF0ZSA9IHRoaXMuX2luaXRpYWxTdGF0ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fYm91bmRDb21wb25lbnQgPSB0aGlzLmxheW91dE1hbmFnZXIuYmluZENvbXBvbmVudCh0aGlzLCBfY29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50UG9zaXRpb25Qcm9wZXJ0eUZyb21Cb3VuZENvbXBvbmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZWxlYXNlQ29tcG9uZW50KCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZVJlcXVlc3RFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3knKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoQ29tcG9uZW50Q29udGFpbmVyOmNsYXNzKS5lbGVtZW50IH0gKi9cclxuICAgIGdldEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGlkZXMgdGhlIGNvbnRhaW5lcidzIGNvbXBvbmVudCBpdGVtIChhbmQgaGVuY2UsIHRoZSBjb250YWluZXIpIGlmIG5vdCBhbHJlYWR5IGhpZGRlbi5cclxuICAgICAqIEVtaXRzIGhpZGUgZXZlbnQgcHJpb3IgdG8gaGlkaW5nIHRoZSBjb250YWluZXIuXHJcbiAgICAgKi9cclxuICAgIGhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faGlkZUV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93cyB0aGUgY29udGFpbmVyJ3MgY29tcG9uZW50IGl0ZW0gKGFuZCBoZW5jZSwgdGhlIGNvbnRhaW5lcikgaWYgbm90IHZpc2libGUuXHJcbiAgICAgKiBFbWl0cyBzaG93IGV2ZW50IHByaW9yIHRvIGhpZGluZyB0aGUgY29udGFpbmVyLlxyXG4gICAgICovXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Nob3dFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXMgdGhpcyBjb21wb25lbnQgaW4gTGF5b3V0LlxyXG4gICAgICovXHJcbiAgICBmb2N1cyhzdXBwcmVzc0V2ZW50ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9mb2N1c0V2ZW50KHN1cHByZXNzRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIGZvY3VzIGZyb20gdGhpcyBjb21wb25lbnQgaW4gTGF5b3V0LlxyXG4gICAgICovXHJcbiAgICBibHVyKHN1cHByZXNzRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2JsdXJFdmVudChzdXBwcmVzc0V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgc2l6ZSBmcm9tIHdpdGhpbiB0aGUgY29udGFpbmVyLiBUcmF2ZXJzZXMgdXBcclxuICAgICAqIHRoZSBpdGVtIHRyZWUgdW50aWwgaXQgZmluZHMgYSByb3cgb3IgY29sdW1uIGVsZW1lbnRcclxuICAgICAqIGFuZCByZXNpemVzIGl0cyBpdGVtcyBhY2NvcmRpbmdseS5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGlzIGNvbnRhaW5lciBpc24ndCBhIGRlc2NlbmRhbnQgb2YgYSByb3cgb3IgY29sdW1uXHJcbiAgICAgKiBpdCByZXR1cm5zIGZhbHNlXHJcbiAgICAgKiBAcGFyYW0gd2lkdGggLSBUaGUgbmV3IHdpZHRoIGluIHBpeGVsXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gVGhlIG5ldyBoZWlnaHQgaW4gcGl4ZWxcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyByZXNpemVTdWNjZXNmdWxcclxuICAgICAqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgc2V0U2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBhbmNlc3Rvckl0ZW06IENvbnRlbnRJdGVtIHwgbnVsbCA9IHRoaXMuX3BhcmVudDtcclxuICAgICAgICBpZiAoYW5jZXN0b3JJdGVtLmlzQ29sdW1uIHx8IGFuY2VzdG9ySXRlbS5pc1JvdyB8fCBhbmNlc3Rvckl0ZW0ucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignSUNTU1BSQycsICdDb21wb25lbnRDb250YWluZXIgY2Fubm90IGhhdmUgUm93Q29sdW1uIFBhcmVudCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBhbmNlc3RvckNoaWxkSXRlbTogQ29udGVudEl0ZW07XHJcbiAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICAgIGFuY2VzdG9yQ2hpbGRJdGVtID0gYW5jZXN0b3JJdGVtO1xyXG4gICAgICAgICAgICAgICAgYW5jZXN0b3JJdGVtID0gYW5jZXN0b3JJdGVtLnBhcmVudDtcclxuICAgICAgICAgICAgfSB3aGlsZSAoYW5jZXN0b3JJdGVtICE9PSBudWxsICYmICFhbmNlc3Rvckl0ZW0uaXNDb2x1bW4gJiYgIWFuY2VzdG9ySXRlbS5pc1Jvdyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYW5jZXN0b3JJdGVtID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBubyBSb3cgb3IgQ29sdW1uIGZvdW5kXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBhbmNlc3Rvckl0ZW0gaXMgUm93IG9yIENvbHVtblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gYW5jZXN0b3JJdGVtLmlzQ29sdW1uID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNpemUgPSB0aGlzW2RpcmVjdGlvbl07XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNpemUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignSUNTU0NTMTExOTQnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3U2l6ZSA9IGRpcmVjdGlvbiA9PT0gJ2hlaWdodCcgPyBoZWlnaHQgOiB3aWR0aDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90YWxQaXhlbCA9IGN1cnJlbnRTaXplICogKDEgLyAoYW5jZXN0b3JDaGlsZEl0ZW0uc2l6ZSAvIDEwMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAobmV3U2l6ZSAvIHRvdGFsUGl4ZWwpICogMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gKGFuY2VzdG9yQ2hpbGRJdGVtLnNpemUgLSBwZXJjZW50YWdlKSAvIChhbmNlc3Rvckl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aCAtIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFuY2VzdG9ySXRlbS5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JJdGVtQ29udGVudEl0ZW0gPSBhbmNlc3Rvckl0ZW0uY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JJdGVtQ29udGVudEl0ZW0gPT09IGFuY2VzdG9yQ2hpbGRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3Rvckl0ZW1Db250ZW50SXRlbS5zaXplID0gcGVyY2VudGFnZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9ySXRlbUNvbnRlbnRJdGVtLnNpemUgKz0gZGVsdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGFuY2VzdG9ySXRlbS51cGRhdGVTaXplKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbG9zZXMgdGhlIGNvbnRhaW5lciBpZiBpdCBpcyBjbG9zYWJsZS4gQ2FuIGJlIGNhbGxlZCBieVxyXG4gICAgICogYm90aCB0aGUgY29tcG9uZW50IHdpdGhpbiBhdCBhcyB3ZWxsIGFzIHRoZSBjb250ZW50SXRlbSBjb250YWluaW5nXHJcbiAgICAgKiBpdC4gRW1pdHMgYSBjbG9zZSBldmVudCBiZWZvcmUgdGhlIGNvbnRhaW5lciBpdHNlbGYgaXMgY2xvc2VkLlxyXG4gICAgICovXHJcbiAgICBjbG9zZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5faXNDbG9zYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogUmVwbGFjZXMgY29tcG9uZW50IHdpdGhvdXQgYWZmZWN0aW5nIGxheW91dCAqL1xyXG4gICAgcmVwbGFjZUNvbXBvbmVudChpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZWxlYXNlQ29tcG9uZW50KCk7XHJcblxyXG4gICAgICAgIGlmICghSXRlbUNvbmZpZy5pc0NvbXBvbmVudChpdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcGxhY2VDb21wb25lbnQgbm90IHBhc3NlZCBhIGNvbXBvbmVudCBJdGVtQ29uZmlnJylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBDb21wb25lbnRJdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZywgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsU3RhdGUgPSBjb25maWcuY29tcG9uZW50U3RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gdGhpcy5faW5pdGlhbFN0YXRlO1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRUeXBlID0gY29uZmlnLmNvbXBvbmVudFR5cGU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVJdGVtQ29uZmlnRXZlbnQoY29uZmlnKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2JvdW5kQ29tcG9uZW50ID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmJpbmRDb21wb25lbnQodGhpcywgY29uZmlnKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50UG9zaXRpb25Qcm9wZXJ0eUZyb21Cb3VuZENvbXBvbmVudCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWwpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQodGhpcywgdGhpcy5fdmlzaWJsZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuZmlyZUJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQodGhpcywgdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5maXJlQWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRCYXNlTG9naWNhbFpJbmRleCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGluaXRpYWwgY29tcG9uZW50IHN0YXRlIG9yIHRoZSBsYXRlc3QgcGFzc2VkIGluIHNldFN0YXRlKClcclxuICAgICAqIEByZXR1cm5zIHN0YXRlXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChDb21wb25lbnRDb250YWluZXI6Y2xhc3MpLmluaXRpYWxTdGF0ZX1cclxuICAgICAqL1xyXG4gICAgZ2V0U3RhdGUoKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXJnZXMgdGhlIHByb3ZpZGVkIHN0YXRlIGludG8gdGhlIGN1cnJlbnQgb25lXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChDb21wb25lbnRDb250YWluZXI6Y2xhc3MpLnN0YXRlUmVxdWVzdEV2ZW50fVxyXG4gICAgICovXHJcbiAgICBleHRlbmRTdGF0ZShzdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBleHRlbmRlZFN0YXRlID0gZGVlcEV4dGVuZCh0aGlzLl9zdGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc3RhdGUpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoZXh0ZW5kZWRTdGF0ZSBhcyBKc29uVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29tcG9uZW50IHN0YXRlXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChDb21wb25lbnRDb250YWluZXI6Y2xhc3MpLnN0YXRlUmVxdWVzdEV2ZW50fVxyXG4gICAgICovXHJcbiAgICBzZXRTdGF0ZShzdGF0ZTogSnNvblZhbHVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCdzIHRoZSBjb21wb25lbnRzIHRpdGxlXHJcbiAgICAgKi9cclxuICAgIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuc2V0VGl0bGUodGl0bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldFRhYih0YWI6IFRhYik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RhYiA9IHRhYjtcclxuICAgICAgICB0aGlzLmVtaXQoJ3RhYicsIHRhYilcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzZXRWaXNpYmlsaXR5KHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWwpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50KHRoaXMsIHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fdmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faGVpZ2h0ID09PSAwICYmIHRoaXMuX3dpZHRoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNpemVUb05vZGVTaXplKHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNob3coKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zICYmICh0aGlzLl9oZWlnaHQgIT09IDAgfHwgdGhpcy5fd2lkdGggIT09IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2l6ZVRvTm9kZVNpemUodGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0U2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Zpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Zpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRCYXNlTG9naWNhbFpJbmRleCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldExvZ2ljYWxaSW5kZXgoTG9naWNhbFpJbmRleC5iYXNlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRMb2dpY2FsWkluZGV4KGxvZ2ljYWxaSW5kZXg6IExvZ2ljYWxaSW5kZXgpOiB2b2lkIHtcclxuICAgICAgICBpZiAobG9naWNhbFpJbmRleCAhPT0gdGhpcy5fbG9naWNhbFpJbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2dpY2FsWkluZGV4ID0gbG9naWNhbFpJbmRleDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubm90aWZ5VmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBjb250YWluZXIncyBzaXplLCBidXQgY29uc2lkZXJlZCB0ZW1wb3JhcnkgKGZvciBkcmFnZ2luZylcclxuICAgICAqIHNvIGRvbid0IGVtaXQgYW55IGV2ZW50cy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBlbnRlckRyYWdNb2RlKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuX2VsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuX2VsZW1lbnQsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0TG9naWNhbFpJbmRleChMb2dpY2FsWkluZGV4LmRyYWcpO1xyXG5cclxuICAgICAgICB0aGlzLmRyYWcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleGl0RHJhZ01vZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRCYXNlTG9naWNhbFpJbmRleCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVudGVyU3RhY2tNYXhpbWlzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc3RhY2tNYXhpbWlzZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0TG9naWNhbFpJbmRleChMb2dpY2FsWkluZGV4LnN0YWNrTWF4aW1pc2VkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleGl0U3RhY2tNYXhpbWlzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRCYXNlTG9naWNhbFpJbmRleCgpO1xyXG4gICAgICAgIHRoaXMuX3N0YWNrTWF4aW1pc2VkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZHJhZygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fYm91bmRDb21wb25lbnQudmlydHVhbCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5maXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudCgxKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQodGhpcywgdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XHJcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuZmlyZUFmdGVyVmlydHVhbFJlY3RpbmdFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29udGFpbmVyJ3Mgc2l6ZS4gQ2FsbGVkIGJ5IHRoZSBjb250YWluZXIncyBjb21wb25lbnQgaXRlbS5cclxuICAgICAqIFRvIGluc3RlYWQgc2V0IHRoZSBzaXplIHByb2dyYW1tYXRpY2FsbHkgZnJvbSB3aXRoaW4gdGhlIGNvbXBvbmVudCBpdHNlbGYsXHJcbiAgICAgKiB1c2UgdGhlIHB1YmxpYyBzZXRTaXplIG1ldGhvZFxyXG4gICAgICogQHBhcmFtIHdpZHRoIC0gaW4gcHhcclxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBpbiBweFxyXG4gICAgICogQHBhcmFtIGZvcmNlIC0gc2V0IGV2ZW4gaWYgbm8gY2hhbmdlXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgc2V0U2l6ZVRvTm9kZVNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHdpZHRoICE9PSB0aGlzLl93aWR0aCB8fCBoZWlnaHQgIT09IHRoaXMuX2hlaWdodCB8fCBmb3JjZSkge1xyXG4gICAgICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLl9lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5fZWxlbWVudCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9ib3VuZENvbXBvbmVudC52aXJ0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFZpcnR1YWxTaXplZENvbnRhaW5lclRvTGF5b3V0TWFuYWdlcigpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZXNpemUnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tTaG93bkZyb21aZXJvRGltZW5zaW9ucygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG5vdGlmeVZpcnR1YWxSZWN0aW5nUmVxdWlyZWQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQodGhpcywgdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVzaXplJyk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaG93bkZyb21aZXJvRGltZW5zaW9ucygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIG5vdGlmeVZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy52aXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ2ljYWxaSW5kZXggPSB0aGlzLl9sb2dpY2FsWkluZGV4O1xyXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0WkluZGV4ID0gTG9naWNhbFpJbmRleFRvRGVmYXVsdE1hcFtsb2dpY2FsWkluZGV4XTtcclxuICAgICAgICAgICAgdGhpcy52aXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudCh0aGlzLCBsb2dpY2FsWkluZGV4LCBkZWZhdWx0WkluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVFbGVtZW50UG9zaXRpb25Qcm9wZXJ0eUZyb21Cb3VuZENvbXBvbmVudCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fYm91bmRDb21wb25lbnQudmlydHVhbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3N0YXRpYyc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICcnOyAvLyBzZXQgaXQgYmFjayB0byBhdHRyaWJ1dGUgdmFsdWVcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBhZGRWaXJ0dWFsU2l6ZWRDb250YWluZXJUb0xheW91dE1hbmFnZXIoKSB7XHJcbiAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5iZWdpblZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuYWRkVmlydHVhbFNpemVkQ29udGFpbmVyKHRoaXMpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuZW5kVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgY2hlY2tTaG93bkZyb21aZXJvRGltZW5zaW9ucygpIHtcclxuICAgICAgICBpZiAodGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyAmJiAodGhpcy5faGVpZ2h0ICE9PSAwIHx8IHRoaXMuX3dpZHRoICE9PSAwKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNob3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBlbWl0U2hvdygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ3Nob3duJyk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzaG93Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBlbWl0SGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ2hpZGUnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlbGVhc2VDb21wb25lbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3N0YWNrTWF4aW1pc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXhpdFN0YWNrTWF4aW1pc2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZW1pdCgnYmVmb3JlQ29tcG9uZW50UmVsZWFzZScsIHRoaXMuX2JvdW5kQ29tcG9uZW50LmNvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnVuYmluZENvbXBvbmVudCh0aGlzLCB0aGlzLl9ib3VuZENvbXBvbmVudC52aXJ0dWFsLCB0aGlzLl9ib3VuZENvbXBvbmVudC5jb21wb25lbnQpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIENvbXBvbmVudENvbnRhaW5lcn0gKi9cclxuZXhwb3J0IHR5cGUgSXRlbUNvbnRhaW5lciA9IENvbXBvbmVudENvbnRhaW5lcjtcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgQ29tcG9uZW50Q29udGFpbmVyIHtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudCA9IHVua25vd247XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBCaW5kYWJsZUNvbXBvbmVudCB7XHJcbiAgICAgICAgY29tcG9uZW50OiBDb21wb25lbnQ7XHJcbiAgICAgICAgdmlydHVhbDogYm9vbGVhbjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgdHlwZSBTdGF0ZVJlcXVlc3RFdmVudEhhbmRsZXIgPSAodGhpczogdm9pZCkgPT4gSnNvblZhbHVlIHwgdW5kZWZpbmVkO1xyXG4gICAgZXhwb3J0IHR5cGUgVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50ID0gKHRoaXM6IHZvaWQsIGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4gdm9pZDtcclxuICAgIGV4cG9ydCB0eXBlIFZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudCA9ICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgdmlzaWJsZTogYm9vbGVhbikgPT4gdm9pZDtcclxuICAgIGV4cG9ydCB0eXBlIFZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50ID1cclxuICAgICAgICAodGhpczogdm9pZCwgY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIGxvZ2ljYWxaSW5kZXg6IExvZ2ljYWxaSW5kZXgsIGRlZmF1bHRaSW5kZXg6IHN0cmluZykgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIFNob3dFdmVudEhhbmRsZXIgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIEhpZGVFdmVudEhhbmRsZXIgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIEZvY3VzRXZlbnRIYW5kbGVyID0gKHRoaXM6IHZvaWQsIHN1cHByZXNzRXZlbnQ6IGJvb2xlYW4pID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBCbHVyRXZlbnRIYW5kbGVyID0gKHRoaXM6IHZvaWQsIHN1cHByZXNzRXZlbnQ6IGJvb2xlYW4pID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBVcGRhdGVJdGVtQ29uZmlnRXZlbnRIYW5kbGVyID0gKGl0ZW1Db25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZykgPT4gdm9pZDtcclxufVxyXG4iLCJpbXBvcnQgeyBSZXNvbHZlZExheW91dENvbmZpZywgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcsIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IFBvcG91dEJsb2NrZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9leHRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IFVuZXhwZWN0ZWROdWxsRXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29udGVudC1pdGVtJztcclxuaW1wb3J0IHsgUm93T3JDb2x1bW4gfSBmcm9tICcuLi9pdGVtcy9yb3ctb3ItY29sdW1uJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQtZW1pdHRlcic7XHJcbmltcG9ydCB7IFJlY3QsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBkZWVwRXh0ZW5kLCBnZXRFcnJvck1lc3NhZ2UsIGdldFVuaXF1ZUlkLCBnZXRXaW5kb3dUb3BMZWZ0Qm9yZGVyIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqXHJcbiAqIFBvcHMgYSBjb250ZW50IGl0ZW0gb3V0IGludG8gYSBuZXcgYnJvd3NlciB3aW5kb3cuXHJcbiAqIFRoaXMgaXMgYWNoaWV2ZWQgYnlcclxuICpcclxuICogICAgLSBDcmVhdGluZyBhIG5ldyBjb25maWd1cmF0aW9uIHdpdGggdGhlIGNvbnRlbnQgaXRlbSBhcyByb290IGVsZW1lbnRcclxuICogICAgLSBTZXJpYWxpemluZyBhbmQgbWluaWZ5aW5nIHRoZSBjb25maWd1cmF0aW9uXHJcbiAqICAgIC0gT3BlbmluZyB0aGUgY3VycmVudCB3aW5kb3cncyBVUkwgd2l0aCB0aGUgY29uZmlndXJhdGlvbiBhcyBhIEdFVCBwYXJhbWV0ZXJcclxuICogICAgLSBHb2xkZW5MYXlvdXQgd2hlbiBvcGVuZWQgaW4gdGhlIG5ldyB3aW5kb3cgd2lsbCBsb29rIGZvciB0aGUgR0VUIHBhcmFtZXRlclxyXG4gKiAgICAgIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvblxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEJyb3dzZXJQb3BvdXQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcG9wb3V0V2luZG93OiBXaW5kb3cgfCBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXNJbml0aWFsaXNlZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NoZWNrUmVhZHlJbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9wcmV2ZW50UG9wSW5PbkNsb3NlOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIF9jb25maWcgLSBHb2xkZW5MYXlvdXQgaXRlbSBjb25maWdcclxuICAgICAqIEBwYXJhbSBfaW5pdGlhbFdpbmRvd1NpemUgLSBBIG1hcCB3aXRoIHdpZHRoLCBoZWlnaHQsIHRvcCBhbmQgbGVmdFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jb25maWc6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9pbml0aWFsV2luZG93U2l6ZTogUmVjdCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3ByZXZlbnRQb3BJbk9uQ2xvc2UgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNyZWF0ZVdpbmRvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvQ29uZmlnKCk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXNlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGNyZWF0ZSBjb25maWcsIGxheW91dCBub3QgeWV0IGluaXRpYWxpc2VkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBnbEluc3RhbmNlID0gdGhpcy5nZXRHbEluc3RhbmNlKCk7XHJcbiAgICAgICAgY29uc3QgZ2xJbnN0YW5jZUNvbmZpZyA9IGdsSW5zdGFuY2Uuc2F2ZUxheW91dCgpO1xyXG5cclxuICAgICAgICBsZXQgbGVmdDogbnVtYmVyIHwgbnVsbDtcclxuICAgICAgICBsZXQgdG9wOiBudW1iZXIgfCBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3BvdXRXaW5kb3cgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgbGVmdCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRvcCA9IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGVmdCA9IHRoaXMuX3BvcG91dFdpbmRvdy5zY3JlZW5YID8/IHRoaXMuX3BvcG91dFdpbmRvdy5zY3JlZW5MZWZ0O1xyXG4gICAgICAgICAgICB0b3AgPSB0aGlzLl9wb3BvdXRXaW5kb3cuc2NyZWVuWSA/PyB0aGlzLl9wb3BvdXRXaW5kb3cuc2NyZWVuVG9wO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgd2luZG93OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cgPSB7XHJcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLmdldEdsSW5zdGFuY2UoKS53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmdldEdsSW5zdGFuY2UoKS5oZWlnaHQsXHJcbiAgICAgICAgICAgIGxlZnQsXHJcbiAgICAgICAgICAgIHRvcCxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBjb25maWc6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICByb290OiBnbEluc3RhbmNlQ29uZmlnLnJvb3QsXHJcbiAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBnbEluc3RhbmNlQ29uZmlnLm9wZW5Qb3BvdXRzLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogZ2xJbnN0YW5jZUNvbmZpZy5zZXR0aW5ncyxcclxuICAgICAgICAgICAgZGltZW5zaW9uczogZ2xJbnN0YW5jZUNvbmZpZy5kaW1lbnNpb25zLFxyXG4gICAgICAgICAgICBoZWFkZXI6IGdsSW5zdGFuY2VDb25maWcuaGVhZGVyLFxyXG4gICAgICAgICAgICB3aW5kb3csXHJcbiAgICAgICAgICAgIHBhcmVudElkOiB0aGlzLl9jb25maWcucGFyZW50SWQsXHJcbiAgICAgICAgICAgIGluZGV4SW5QYXJlbnQ6IHRoaXMuX2NvbmZpZy5pbmRleEluUGFyZW50LFxyXG4gICAgICAgICAgICByZXNvbHZlZDogdHJ1ZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gY29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEdsSW5zdGFuY2UoKTogTGF5b3V0TWFuYWdlciB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQlBHR0kyNDY5MycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wb3V0V2luZG93Ll9fZ2xJbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgbmF0aXZlIEJyb3dzZXJXaW5kb3cgYmFja2luZyB0aGlzIHBvcG91dC5cclxuICAgICAqIE1pZ2h0IHRocm93IGFuIFVuZXhwZWN0ZWROdWxsRXJyb3IgZXhjZXB0aW9uIHdoZW4gdGhlIHdpbmRvdyBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LlxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBnZXRXaW5kb3coKTogV2luZG93IHtcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdCUEdXMDg3MjE1Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3BvdXRXaW5kb3c7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UocHJldmVudFBvcEluID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAocHJldmVudFBvcEluKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXZlbnRQb3BJbk9uQ2xvc2UgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0R2xJbnN0YW5jZSgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0R2xJbnN0YW5jZSgpLmNsb3NlV2luZG93KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0V2luZG93KCkuY2xvc2UoKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHBvcHBlZCBvdXQgaXRlbSB0byBpdHMgb3JpZ2luYWwgcG9zaXRpb24uIElmIHRoZSBvcmlnaW5hbFxyXG4gICAgICogcGFyZW50IGlzbid0IGF2YWlsYWJsZSBhbnltb3JlIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGxheW91dCdzIHRvcG1vc3QgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwb3BJbigpOiB2b2lkIHtcclxuICAgICAgICBsZXQgcGFyZW50SXRlbTogQ29udGVudEl0ZW07XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5fY29uZmlnLmluZGV4SW5QYXJlbnQ7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmVudElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgKiBUaGUgZGVlcEV4dGVuZCBjYWxsIHNlZW1zIGEgYml0IHBvaW50bGVzcywgYnV0IGl0J3MgY3J1Y2lhbCB0b1xyXG4gICAgICAgICogY29weSB0aGUgY29uZmlnIHJldHVybmVkIGJ5IHRoaXMuZ2V0R2xJbnN0YW5jZSgpLnRvQ29uZmlnKClcclxuICAgICAgICAqIG9udG8gYSBuZXcgb2JqZWN0LiBJbnRlcm5ldCBFeHBsb3JlciBrZWVwcyB0aGUgcmVmZXJlbmNlc1xyXG4gICAgICAgICogdG8gb2JqZWN0cyBvbiB0aGUgY2hpbGQgd2luZG93LCByZXN1bHRpbmcgaW4gdGhlIGZvbGxvd2luZyBlcnJvclxyXG4gICAgICAgICogb25jZSB0aGUgY2hpbGQgd2luZG93IGlzIGNsb3NlZDpcclxuICAgICAgICAqXHJcbiAgICAgICAgKiBUaGUgY2FsbGVlIChzZXJ2ZXIgW25vdCBzZXJ2ZXIgYXBwbGljYXRpb25dKSBpcyBub3QgYXZhaWxhYmxlIGFuZCBkaXNhcHBlYXJlZFxyXG4gICAgICAgICovXHJcbiAgICAgICAgY29uc3QgZ2xJbnN0YW5jZUxheW91dENvbmZpZyA9IHRoaXMuZ2V0R2xJbnN0YW5jZSgpLnNhdmVMYXlvdXQoKTtcclxuICAgICAgICBjb25zdCBjb3BpZWRHbEluc3RhbmNlTGF5b3V0Q29uZmlnID0gZGVlcEV4dGVuZCh7fSwgZ2xJbnN0YW5jZUxheW91dENvbmZpZykgYXMgUmVzb2x2ZWRMYXlvdXRDb25maWc7XHJcbiAgICAgICAgbGV0IGNvcGllZFJvb3QgPSBjb3BpZWRHbEluc3RhbmNlTGF5b3V0Q29uZmlnLnJvb3Q7XHJcbiAgICAgICAgaWYgKGNvcGllZFJvb3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGdyb3VuZEl0ZW0gPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLmdyb3VuZEl0ZW07XHJcbiAgICAgICAgaWYgKGdyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdCUFBJRzM0OTcyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhcmVudEl0ZW0gPSBncm91bmRJdGVtLmdldEl0ZW1zQnlQb3BJblBhcmVudElkKHRoaXMuX2NvbmZpZy5wYXJlbnRJZClbMF07XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgKiBGYWxsYmFjayBpZiBwYXJlbnRJdGVtIGlzIG5vdCBhdmFpbGFibGUuIEVpdGhlciBhZGQgaXQgdG8gdGhlIHRvcG1vc3RcclxuICAgICAgICAqIGl0ZW0gb3IgbWFrZSBpdCB0aGUgdG9wbW9zdCBpdGVtIGlmIHRoZSBsYXlvdXQgaXMgZW1wdHlcclxuICAgICAgICAqL1xyXG4gICAgICAgIGlmICghcGFyZW50SXRlbSkge1xyXG4gICAgICAgICAgICBpZiAoZ3JvdW5kSXRlbS5jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IGdyb3VuZEl0ZW0uY29udGVudEl0ZW1zWzBdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IGdyb3VuZEl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXggPSBwYXJlbnRJdGVtLmNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGFyZW50SXRlbS5pc1N0YWNrKSB7ICAgXHJcbiAgICAgICAgICAgIC8vIFN0YWNrcyBjYW4gb25seSBob2xkIGNvbXBvbmVudCBpdGVtcyAtPiB0cnkgdG8gZmluZCBvbmUgYnkgdW5yYXZlbGluZyBjb250YWluZXJzIHdpdGggYSBzaW5nbGUgY2hpbGRcclxuICAgICAgICAgICAgd2hpbGUgKGNvcGllZFJvb3QudHlwZSAhPT0gSXRlbVR5cGUuY29tcG9uZW50ICYmIGNvcGllZFJvb3QuY29udGVudC5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGNvcGllZFJvb3QgPSBjb3BpZWRSb290LmNvbnRlbnRbMF07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEZhaWxlZCB0byBmaW5kIGEgY29tcG9uZW50IGl0ZW0sIHdyYXAgdGhlIHBhcmVudCBpdGVtIGFuZCBkb2NrZWQgaXRlbSBpbiBhIHJvdyBhcyBzaWJsaW5nc1xyXG4gICAgICAgICAgICBpZiAoY29waWVkUm9vdC50eXBlICE9PSBJdGVtVHlwZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJdGVtLnBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdCUFBJRzM0OTczJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gbmV3IFJvd09yQ29sdW1uKGZhbHNlLCB0aGlzLl9sYXlvdXRNYW5hZ2VyLCBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCdyb3cnKSwgcGFyZW50SXRlbS5wYXJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50SXRlbS5wYXJlbnQucmVwbGFjZUNoaWxkKHBhcmVudEl0ZW0sIHJvdywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcm93LmFkZENoaWxkKHBhcmVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IHJvdztcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbmV3Q29udGVudEl0ZW0gPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShjb3BpZWRSb290LCBwYXJlbnRJdGVtKTtcclxuXHJcbiAgICAgICAgcGFyZW50SXRlbS5hZGRDaGlsZChuZXdDb250ZW50SXRlbSwgaW5kZXgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy5wb3BJbk9uQ2xvc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5fb25DbG9zZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBVUkwgYW5kIHdpbmRvdyBwYXJhbWV0ZXJcclxuICAgICAqIGFuZCBvcGVucyBhIG5ldyB3aW5kb3dcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVdpbmRvdygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVVybCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBCb2d1cyB0aXRsZSB0byBwcmV2ZW50IHJlLXVzYWdlIG9mIGV4aXN0aW5nIHdpbmRvdyB3aXRoIHRoZVxyXG4gICAgICAgICAqIHNhbWUgdGl0bGUuIFRoZSBhY3R1YWwgdGl0bGUgd2lsbCBiZSBzZXQgYnkgdGhlIG5ldyB3aW5kb3cnc1xyXG4gICAgICAgICAqIEdvbGRlbkxheW91dCBpbnN0YW5jZSBpZiBpdCBkZXRlY3RzIHRoYXQgaXQgaXMgaW4gc3ViV2luZG93TW9kZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApLnRvU3RyaW5nKDM2KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG9wdGlvbnMgYXMgdXNlZCBpbiB0aGUgd2luZG93Lm9wZW4gc3RyaW5nXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLnNlcmlhbGl6ZVdpbmRvd0ZlYXR1cmVzKHtcclxuICAgICAgICAgICAgbGVmdDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUubGVmdCxcclxuICAgICAgICAgICAgdG9wOiB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS50b3AsXHJcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS5oZWlnaHQsXHJcbiAgICAgICAgICAgIGlubmVyV2lkdGg6IHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLndpZHRoLFxyXG4gICAgICAgICAgICBpbm5lckhlaWdodDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUuaGVpZ2h0LFxyXG4gICAgICAgICAgICBtZW51YmFyOiAnbm8nLFxyXG4gICAgICAgICAgICB0b29sYmFyOiAnbm8nLFxyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ25vJyxcclxuICAgICAgICAgICAgcGVyc29uYWxiYXI6ICdubycsXHJcbiAgICAgICAgICAgIHJlc2l6YWJsZTogJ3llcycsXHJcbiAgICAgICAgICAgIHNjcm9sbGJhcnM6ICdubycsXHJcbiAgICAgICAgICAgIHN0YXR1czogJ25vJ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cgPSBnbG9iYWxUaGlzLm9wZW4odXJsLCB0YXJnZXQsIGZlYXR1cmVzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9wb3BvdXRXaW5kb3cpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLmJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvciA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgUG9wb3V0QmxvY2tlZEVycm9yKCdQb3BvdXQgYmxvY2tlZCcpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4geyAgICBcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkFuZFJlc2l6ZVdpbmRvdygpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MucG9wSW5PbkNsb3NlICYmICF0aGlzLl9wcmV2ZW50UG9wSW5PbkNsb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wSW4oKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBQb2xsaW5nIHRoZSBjaGlsZHdpbmRvdyB0byBmaW5kIG91dCBpZiBHb2xkZW5MYXlvdXQgaGFzIGJlZW4gaW5pdGlhbGlzZWRcclxuICAgICAgICAgKiBkb2Vzbid0IHNlZW0gb3B0aW1hbCwgYnV0IHRoZSBhbHRlcm5hdGl2ZXMgLSBhZGRpbmcgYSBjYWxsYmFjayB0byB0aGUgcGFyZW50XHJcbiAgICAgICAgICogd2luZG93IG9yIHJhaXNpbmcgYW4gZXZlbnQgb24gdGhlIHdpbmRvdyBvYmplY3QgLSBib3RoIHdvdWxkIGludHJvZHVjZSBrbm93bGVkZ2VcclxuICAgICAgICAgKiBhYm91dCB0aGUgcGFyZW50IHRvIHRoZSBjaGlsZCB3aW5kb3cgd2hpY2ggd2UnZCByYXRoZXIgYXZvaWRcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jaGVja1JlYWR5SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLmNoZWNrUmVhZHkoKSwgMTApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgY2hlY2tSZWFkeSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdCUENSMDE4NDQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93Ll9fZ2xJbnN0YW5jZSAmJiB0aGlzLl9wb3BvdXRXaW5kb3cuX19nbEluc3RhbmNlLmlzSW5pdGlhbGlzZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdy5fX2dsSW5zdGFuY2UucGFyZW50ID0gdGhpcy5fbGF5b3V0TWFuYWdlcjtcclxuICAgICAgICAgICAgICAgIHRoaXMub25Jbml0aWFsaXNlZCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrUmVhZHlJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9jaGVja1JlYWR5SW50ZXJ2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrUmVhZHlJbnRlcnZhbCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBvc2l0aW9uQW5kUmVzaXplV2luZG93KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3BvdXRXaW5kb3cgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0JQUEFSVzEnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEluaXRpYWwgd2luZG93IHNpemUgcGFyYW1ldGVycyBkZXNjcmliZSBjbGllbnQgKGkuZS4gaW5uZXIpIHBvc2l0aW9uIGFuZCBzaXplXHJcbiAgICAgICAgLy8gU2luY2UgdGhlIGJvcmRlciBvZiB0aGUgcG9wb3V0IG1heSBoYXZlIGRpZmZlcmVudCBib3JkZXJzIHRoYW4gdGhlIG1haW4gd2luZG93LCB3ZSBoYXZlXHJcbiAgICAgICAgLy8gdG8gYWRqdXN0IHRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBvbmNlIHRoZSB3aW5kb3cgaGFzIGJlZW4gY3JlYXRlZC5cclxuICAgICAgICBjb25zdCBib3JkZXIgPSBnZXRXaW5kb3dUb3BMZWZ0Qm9yZGVyKHRoaXMuX3BvcG91dFdpbmRvdyk7XHJcbiAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93Lm1vdmVUbyhcclxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbFdpbmRvd1NpemUubGVmdCAtIGJvcmRlci53aWR0aCxcclxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbFdpbmRvd1NpemUudG9wIC0gYm9yZGVyLmhlaWdodCxcclxuICAgICAgICApXHJcblxyXG4gICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdy5yZXNpemVUbyhcclxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbFdpbmRvd1NpemUud2lkdGggKyAodGhpcy5fcG9wb3V0V2luZG93Lm91dGVyV2lkdGggLSB0aGlzLl9wb3BvdXRXaW5kb3cuaW5uZXJXaWR0aCksXHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLmhlaWdodCArICh0aGlzLl9wb3BvdXRXaW5kb3cub3V0ZXJIZWlnaHQgLSB0aGlzLl9wb3BvdXRXaW5kb3cuaW5uZXJIZWlnaHQpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXJpYWxpc2VzIGEgbWFwIG9mIGtleTp2YWx1ZXMgdG8gYSB3aW5kb3cgb3B0aW9ucyBzdHJpbmdcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gd2luZG93T3B0aW9ucyAtXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgc2VyaWFsaXNlZCB3aW5kb3cgb3B0aW9uc1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2VyaWFsaXplV2luZG93RmVhdHVyZXMod2luZG93T3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPik6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3Qgd2luZG93T3B0aW9uc1N0cmluZzogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gd2luZG93T3B0aW9ucykge1xyXG4gICAgICAgICAgICB3aW5kb3dPcHRpb25zU3RyaW5nLnB1c2goa2V5ICsgJz0nICsgd2luZG93T3B0aW9uc1trZXldLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHdpbmRvd09wdGlvbnNTdHJpbmcuam9pbignLCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgVVJMIGZvciB0aGUgbmV3IHdpbmRvdywgaW5jbHVkaW5nIHRoZVxyXG4gICAgICogY29uZmlnIEdFVCBwYXJhbWV0ZXJcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBVUkxcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVVybCgpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSAnZ2wtd2luZG93LWNvbmZpZy0nICsgZ2V0VW5pcXVlSWQoKTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBSZXNvbHZlZExheW91dENvbmZpZy5taW5pZnlDb25maWcodGhpcy5fY29uZmlnKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIHdoaWxlIHdyaXRpbmcgdG8gbG9jYWxTdG9yYWdlICcgKyBnZXRFcnJvck1lc3NhZ2UoZSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCgnL2dsLXBvcG91dCcsIGxvY2F0aW9uLm9yaWdpbik7XHJcbiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2dsLXdpbmRvdycsIHN0b3JhZ2VLZXkpO1xyXG5cclxuICAgICAgICBjb25zdCB0aGVtZSA9IHRoaXMuX2xheW91dE1hbmFnZXIuY29udGFpbmVyLmRhdGFzZXQudGhlbWU7XHJcbiAgICAgICAgaWYgKHRoZW1lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2dsLXRoZW1lJywgdGhlbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHVybC50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgd2hlbiB0aGUgbmV3IHdpbmRvdyBpcyBvcGVuZWQgYW5kIHRoZSBHb2xkZW5MYXlvdXQgaW5zdGFuY2VcclxuICAgICAqIHdpdGhpbiBpdCBpcyBpbml0aWFsaXNlZFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25Jbml0aWFsaXNlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpc2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmdldEdsSW5zdGFuY2UoKS5vbigncG9wSW4nLCAoKSA9PiB0aGlzLnBvcEluKCkpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnaW5pdGlhbGlzZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludm9rZWQgNTBtcyBhZnRlciB0aGUgd2luZG93IHVubG9hZCBldmVudFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX29uQ2xvc2UoKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmVtaXQoJ2Nsb3NlZCcpLCA1MCk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRHJhZ1Byb3h5IH0gZnJvbSAnLi9kcmFnLXByb3h5JztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgVW5leHBlY3RlZE51bGxFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQtZW1pdHRlcic7XHJcbmltcG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29udGVudC1pdGVtJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgRHJhZ0xpc3RlbmVyIH0gZnJvbSAnLi4vdXRpbHMvZHJhZy1saXN0ZW5lcic7XHJcbmltcG9ydCB7IGdldFdpbmRvd0lubmVyU2NyZWVuUG9zaXRpb24gfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi4vaXRlbXMvc3RhY2snO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5jbGFzcyBEcmFnVGFyZ2V0IHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX293bmVyOiBEcmFnQWN0aW9uLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2FyZWE6IENvbnRlbnRJdGVtLkFyZWEsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfcGFnZVg6IG51bWJlcixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9wYWdlWTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKF9vd25lci5sYXlvdXRNYW5hZ2VyICE9PSBfYXJlYS5jb250ZW50SXRlbS5sYXlvdXRNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdMYXlvdXRNYW5hZ2VyIG9mIEFyZWEgYW5kIERyYWdQcm94eSBtdXN0IG1hdGNoJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBvd25lcigpOiBEcmFnQWN0aW9uIHsgcmV0dXJuIHRoaXMuX293bmVyOyB9XHJcbiAgICBnZXQgYXJlYSgpOiBDb250ZW50SXRlbS5BcmVhIHsgcmV0dXJuIHRoaXMuX2FyZWE7IH1cclxuXHJcbiAgICBkcm9wKGl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICB0aGlzLl9hcmVhLmNvbnRlbnRJdGVtLm9uRHJvcChpdGVtLCB0aGlzLl9hcmVhKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWdobGlnaHREcm9wWm9uZSgpIHtcclxuICAgICAgICB0aGlzLmFyZWEuY29udGVudEl0ZW0uaGlnaGxpZ2h0RHJvcFpvbmUodGhpcy5fcGFnZVgsIHRoaXMuX3BhZ2VZLCB0aGlzLl9hcmVhKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgRHJhZ0FjdGlvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBwcml2YXRlIF9kcmFnUHJveHk6IERyYWdQcm94eSB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfY3VycmVudFRhcmdldDogRHJhZ1RhcmdldCB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX2JvdW5kaW5nUmVjdDogRE9NUmVjdDtcclxuICAgIHByaXZhdGUgX2FjdGlvbnM6IERyYWdBY3Rpb25bXSA9IFtdO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RyYWdFdmVudEhhbmRsZXIgPSAoX29mZnNldFg6IG51bWJlciwgX29mZnNldFk6IG51bWJlciwgZXZlbnQ6IEV2ZW50RW1pdHRlci5EcmFnRXZlbnQpID0+IHRoaXMub25EcmFnKGV2ZW50KTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RyYWdTdG9wRXZlbnRIYW5kbGVyID0gKCkgPT4gdGhpcy5vbkRyYWdTdG9wKCk7XHJcblxyXG4gICAgZ2V0IGxheW91dE1hbmFnZXIoKTogTGF5b3V0TWFuYWdlciB7IHJldHVybiB0aGlzLl9sYXlvdXRNYW5hZ2VyOyB9XHJcbiAgICBnZXQgcGFyZW50KCk6IERyYWdBY3Rpb24gfCBudWxsIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfVxyXG4gICAgZ2V0IHByb3h5KCk6IERyYWdQcm94eSB8IG51bGwgeyByZXR1cm4gdGhpcy5fZHJhZ1Byb3h5OyB9XHJcbiAgICBwcml2YXRlIGdldCBwYXJlbnRPclNlbGYoKTogRHJhZ0FjdGlvbiB7IHJldHVybiB0aGlzLl9wYXJlbnQgPz8gdGhpczsgfVxyXG4gICAgZ2V0IGN1cnJlbnRUYXJnZXQoKTogRHJhZ1RhcmdldCB8IG51bGwgeyByZXR1cm4gdGhpcy5wYXJlbnRPclNlbGYuX2N1cnJlbnRUYXJnZXQ7IH1cclxuICAgIHByaXZhdGUgc2V0IGN1cnJlbnRUYXJnZXQodmFsdWUgOiBEcmFnVGFyZ2V0IHwgbnVsbCkgeyB0aGlzLnBhcmVudE9yU2VsZi5fY3VycmVudFRhcmdldCA9IHZhbHVlOyB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9sYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2FsbG93UG9wb3V0OiBib29sZWFuID0gZmFsc2UsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfcGFyZW50OiBEcmFnQWN0aW9uIHwgbnVsbCA9IG51bGxcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fYm91bmRpbmdSZWN0ID0gdGhpcy5jb21wdXRlQm91bmRpbmdSZWN0KCk7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRPclNlbGYuX2FjdGlvbnMucHVzaCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbXB1dGVCb3VuZGluZ1JlY3QoKTogRE9NUmVjdCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIuZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0RBQ0JSMTExMjAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5fbGF5b3V0TWFuYWdlci5ncm91bmRJdGVtLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBET01SZWN0LmZyb21SZWN0KHtcclxuICAgICAgICAgICAgICAgIHg6IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCArIHJlY3QubGVmdCxcclxuICAgICAgICAgICAgICAgIHk6IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wICsgcmVjdC50b3AsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2NyZWVuVG9QYWdlKHNjcmVlblg6IG51bWJlciwgc2NyZWVuWTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgaW5uZXJTY3JlZW4gPSBnZXRXaW5kb3dJbm5lclNjcmVlblBvc2l0aW9uKGdsb2JhbFRoaXMpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB4OiBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgKyBzY3JlZW5YIC0gaW5uZXJTY3JlZW4ubGVmdCxcclxuICAgICAgICAgICAgeTogZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgKyBzY3JlZW5ZIC0gaW5uZXJTY3JlZW4udG9wXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzUHJveHlWaXNpYmxlKHByb3h5OiBEcmFnUHJveHksIHBhZ2VYIDogbnVtYmVyLCBwYWdlWTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgcGFnZVggPj0gdGhpcy5fYm91bmRpbmdSZWN0LmxlZnQgLSBwcm94eS5vdXRlcldpZHRoICYmXHJcbiAgICAgICAgICAgIHBhZ2VYIDwgdGhpcy5fYm91bmRpbmdSZWN0LnJpZ2h0ICYmXHJcbiAgICAgICAgICAgIHBhZ2VZID49IHRoaXMuX2JvdW5kaW5nUmVjdC50b3AgLSBwcm94eS5vdXRlckhlaWdodCAmJlxyXG4gICAgICAgICAgICBwYWdlWSA8IHRoaXMuX2JvdW5kaW5nUmVjdC5ib3R0b21cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlUHJveHkoaXRlbTogQ29tcG9uZW50SXRlbSwgc3RhY2s6IFN0YWNrIHwgbnVsbCwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9kcmFnUHJveHkgPSBuZXcgRHJhZ1Byb3h5KHRoaXMsIGl0ZW0sIHN0YWNrLCB4LCB5KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRyYWdMb2NhbChwYWdlWDogbnVtYmVyLCBwYWdlWTogbnVtYmVyKTogRHJhZ1RhcmdldCB8IG51bGwge1xyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnUHJveHkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJlYSA9IHRoaXMuX2RyYWdQcm94eS5kcmFnKHBhZ2VYLCBwYWdlWSk7XHJcbiAgICAgICAgICAgIHJldHVybiAoYXJlYSAhPT0gbnVsbCkgPyBuZXcgRHJhZ1RhcmdldCh0aGlzLCBhcmVhLCBwYWdlWCwgcGFnZVkpIDogbnVsbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkcmFnR2xvYmFsKHNjcmVlblg6IG51bWJlciwgc2NyZWVuWTogbnVtYmVyKTogRHJhZ1RhcmdldCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuX3BhcmVudD8uX2RyYWdQcm94eTtcclxuICAgICAgICBpZiAoIXNvdXJjZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignREFERzEnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHsgeDogcGFnZVgsIHk6IHBhZ2VZIH0gPSB0aGlzLnNjcmVlblRvUGFnZShzY3JlZW5YLCBzY3JlZW5ZKTtcclxuICAgICAgICBjb25zdCB2aXNpYmxlID0gZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScgJiYgdGhpcy5pc1Byb3h5VmlzaWJsZShzb3VyY2UsIHBhZ2VYLCBwYWdlWSk7XHJcblxyXG4gICAgICAgIGlmICh2aXNpYmxlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcmFnUHJveHkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMubGF5b3V0TWFuYWdlci5ncm91bmRJdGVtO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEQURHMicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSBzb3VyY2UuY29tcG9uZW50SXRlbS50b0NvbmZpZygpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ0l0ZW0gPSBuZXcgQ29tcG9uZW50SXRlbSh0aGlzLmxheW91dE1hbmFnZXIsIGNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUHJveHkoZHJhZ0l0ZW0sIG51bGwsIHBhZ2VYLCBwYWdlWSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBQcm94eSBpcyBubyBsb25nZXIgdmlzaWJsZSBhbmQgbm90IGN1cnJlbnRseSB0aGUgZHJhZyB0YXJnZXQgLT4gZGVzdHJveVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZHJhZ1Byb3h5ICE9PSBudWxsICYmIHRoaXMuY3VycmVudFRhcmdldD8ub3duZXIgIT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25EcmFnU3RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5kcmFnTG9jYWwocGFnZVgsIHBhZ2VZKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRHJhZ1N0b3AoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5fYWN0aW9ucykge1xyXG4gICAgICAgICAgICBhY3Rpb24ubGF5b3V0TWFuYWdlci5oaWRlRHJvcFRhcmdldEluZGljYXRvcigpO1xyXG4gICAgICAgICAgICBhY3Rpb24uX2RyYWdQcm94eT8uZHJvcCgpO1xyXG4gICAgICAgICAgICBhY3Rpb24uX2RyYWdQcm94eSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXI/Lm9mZignZHJhZycsIHRoaXMuX2RyYWdFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lcj8ub2ZmKCdkcmFnU3RvcCcsIHRoaXMuX2RyYWdTdG9wRXZlbnRIYW5kbGVyKTtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYXJnZXQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25EcmFnKGV2ZW50OiBFdmVudEVtaXR0ZXIuRHJhZ0V2ZW50KSB7XHJcbiAgICAgICAgbGV0IHRhcmdldDogRHJhZ1RhcmdldCB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgICBcclxuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGRyYWcgdGFyZ2V0IGJ5IGludm9raW5nIGFsbCBhY3Rpb25zLlxyXG4gICAgICAgIC8vIEZvciBzZWNvbmRhcnkgYWN0aW9ucyB0aGUgc2NyZWVuIHBvc2l0aW9uIG9mIHRoZSBldmVudCBoYXZlIHRvIGJlIHRyYW5zbGF0ZWQuXHJcbiAgICAgICAgLy8gVGhlIGZpcnN0IHZhbGlkIHRhcmdldCBpcyBzZWxlY3RlZCwgc3RpbGwgd2Ugd2FudCB0byBpbnZva2UgYWxsIGFjdGlvbnMgZHVlIHRvIHRoZSBjdWxsaW5nIGxvZ2ljIGluIGRyYWdHbG9iYWwuXHJcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5fYWN0aW9ucykge1xyXG4gICAgICAgICAgICBsZXQgdDogRHJhZ1RhcmdldCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFjdGlvbiAhPT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgdCA9IGFjdGlvbi5kcmFnR2xvYmFsKGV2ZW50LnNjcmVlblgsIGV2ZW50LnNjcmVlblkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RyYWdQcm94eSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdCA9IHRoaXMuZHJhZ0xvY2FsKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXQgIT09IG51bGwgfHwgdGhpcy5fYWxsb3dQb3BvdXQpIHtcclxuICAgICAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIGEgZHJvcCBhcmVhIGJ1dCBpdCBpcyBpbiBhIGRpZmZlcmVudCB3aW5kb3csIGhpZGUgdGhlIGluZGljYXRvci5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFRhcmdldCAhPT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRUYXJnZXQub3duZXIgIT09IHRhcmdldD8ub3duZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRhcmdldC5vd25lci5sYXlvdXRNYW5hZ2VyLmhpZGVEcm9wVGFyZ2V0SW5kaWNhdG9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIE1vdmUgdGhlIG93bmVyIG9mIHRoZSB0YXJnZXQgdG8gdGhlIGZyb250LCBzbyBpdCBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgZm9yIGZ1dHVyZSBkcmFnIGV2ZW50cy5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fYWN0aW9ucy5pbmRleE9mKHRhcmdldC5vd25lcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3Rpb25zLnVuc2hpZnQodGFyZ2V0Lm93bmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0YXJnZXQuaGlnaGxpZ2h0RHJvcFpvbmUoKTtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5vd25lci5sYXlvdXRNYW5hZ2VyLm1vdmVXaW5kb3dUb3AoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBTcGF3biBhIHNlY29uZGFyeSBkcmFnIGFjdGlvbiwgdGhlIHByb3h5IGVsZW1lbnQgaXMgb25seSBjcmVhdGVkIHdoZW4gdGhlIHBvaW50ZXIgZW50ZXJzIGl0cyB3aW5kb3cuXHJcbiAgICBzdGF0aWMgc3Bhd24obGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlciwgcGFyZW50OiBEcmFnQWN0aW9uKTogRHJhZ0FjdGlvbiB7XHJcbiAgICAgICAgaWYgKHBhcmVudC5fcGFyZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2Vjb25kYXJ5IERyYWdBY3Rpb24gY2Fubm90IHNwYXduIGFub3RoZXIgRHJhZ0FjdGlvbi4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgRHJhZ0FjdGlvbihsYXlvdXRNYW5hZ2VyLCBmYWxzZSwgcGFyZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTdGFydCBhIGRyYWcgYWN0aW9uLCBpbW1lZGlhdGVseSBzaG93aW5nIGEgcHJveHkgZWxlbWVudC5cclxuICAgIHN0YXRpYyBzdGFydChsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLCBsaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBpdGVtOiBDb21wb25lbnRJdGVtLCBzdGFjazogU3RhY2sgfCBudWxsLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IERyYWdBY3Rpb24ge1xyXG4gICAgICAgIGNvbnN0IGFsbG93UG9wb3V0ID0gbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MuZHJhZ1RvTmV3V2luZG93ICYmIChpdGVtLmZpbmRBbmNlc3RvcldpdGhTaWJsaW5ncygpICE9PSBudWxsKTtcclxuICAgICAgICBjb25zdCBhY3Rpb24gPSBuZXcgRHJhZ0FjdGlvbihsYXlvdXRNYW5hZ2VyLCBhbGxvd1BvcG91dCk7XHJcbiAgICAgICAgYWN0aW9uLmNyZWF0ZVByb3h5KGl0ZW0sIHN0YWNrLCB4LCB5KTtcclxuICAgICAgICBhY3Rpb24uX2RyYWdMaXN0ZW5lciA9IGxpc3RlbmVyO1xyXG4gICAgICAgIGxpc3RlbmVyLm9uKCdkcmFnJywgYWN0aW9uLl9kcmFnRXZlbnRIYW5kbGVyKTtcclxuICAgICAgICBsaXN0ZW5lci5vbignZHJhZ1N0b3AnLCBhY3Rpb24uX2RyYWdTdG9wRXZlbnRIYW5kbGVyKTtcclxuICAgICAgICByZXR1cm4gYWN0aW9uO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcgfSBmcm9tICcuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgVW5leHBlY3RlZE51bGxFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb250ZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBTdGFjayB9IGZyb20gJy4uL2l0ZW1zL3N0YWNrJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBTaWRlLCBXaWR0aEFuZEhlaWdodCB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHtcclxuICAgIGdldFVuaXF1ZUlkLFxyXG4gICAgZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbixcclxuICAgIG51bWJlclRvUGl4ZWxzXHJcbn0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgeyBEcmFnQWN0aW9uIH0gZnJvbSAnLi9kcmFnLWFjdGlvbic7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBjcmVhdGVzIGEgdGVtcG9yYXJ5IGNvbnRhaW5lclxyXG4gKiBmb3IgdGhlIGNvbXBvbmVudCB3aGlsc3QgaXQgaXMgYmVpbmcgZHJhZ2dlZFxyXG4gKiBhbmQgaGFuZGxlcyBkcmFnIGV2ZW50c1xyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBjbGFzcyBEcmFnUHJveHkgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgcHJpdmF0ZSBfb3V0ZXJXaWR0aDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfb3V0ZXJIZWlnaHQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX3NpZGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF9wcm94eUNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfY29tcG9uZW50SXRlbUZvY3VzZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcmlnaW5hbFNpemU6IFdpZHRoQW5kSGVpZ2h0O1xyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuICAgIGdldCBvdXRlcldpZHRoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9vdXRlcldpZHRoOyB9XHJcbiAgICBnZXQgb3V0ZXJIZWlnaHQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX291dGVySGVpZ2h0OyB9XHJcbiAgICBnZXQgY29tcG9uZW50SXRlbSgpOiBDb21wb25lbnRJdGVtIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudEl0ZW07IH1cclxuICAgIGdldCBsYXlvdXRNYW5hZ2VyKCk6IExheW91dE1hbmFnZXIgeyByZXR1cm4gdGhpcy5fYWN0aW9uLmxheW91dE1hbmFnZXI7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB4IC0gVGhlIGluaXRpYWwgeCBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHkgLSBUaGUgaW5pdGlhbCB5IHBvc2l0aW9uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfYWN0aW9uOiBEcmFnQWN0aW9uLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0sXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfb3JpZ2luYWxTdGFjazogU3RhY2sgfCBudWxsLFxyXG4gICAgICAgIHg6IG51bWJlciwgeTogbnVtYmVyXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl9vcmlnaW5hbFNpemUgPSB0aGlzLl9jb21wb25lbnRJdGVtLmdldE91dGVyQm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVEcmFnUHJveHlFbGVtZW50cyh4LCB5KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW0ucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBfY29udGVudEl0ZW0gd2lsbCBoYXZlIGR1bW15IEdyb3VuZEl0ZW0gYXMgcGFyZW50IGlmIGluaXRpYXRlZCBieSBhIGV4dGVybmFsIGRyYWcgc291cmNlXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdEUEMxMDA5NycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbUZvY3VzZWQgPSB0aGlzLl9jb21wb25lbnRJdGVtLmZvY3VzZWQ7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW1Gb2N1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uYmx1cigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW0ucGFyZW50LmNvbnRlbnRJdGVtcy5pbmNsdWRlcyh0aGlzLl9jb21wb25lbnRJdGVtKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLnBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLl9jb21wb25lbnRJdGVtLCB0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0RGltZW5zaW9ucygpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuY2FsY3VsYXRlSXRlbUFyZWFzKCk7XHJcbiAgICAgICAgdGhpcy5zZXREcm9wUG9zaXRpb24oeCwgeSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENyZWF0ZSBTdGFjay1saWtlIHN0cnVjdHVyZSB0byBjb250YWluIHRoZSBkcmFnZ2VkIGNvbXBvbmVudCAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVEcmFnUHJveHlFbGVtZW50cyhpbml0aWFsWDogbnVtYmVyLCBpbml0aWFsWTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyYWdQcm94eSk7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGhlYWRlckVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkhlYWRlcik7XHJcbiAgICAgICAgY29uc3QgdGFic0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0YWJzRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGFicyk7XHJcbiAgICAgICAgY29uc3QgdGFiRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRhYkVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlRhYik7XHJcbiAgICAgICAgY29uc3QgdGl0bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICAgIHRpdGxlRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGl0bGUpO1xyXG4gICAgICAgIHRhYkVsZW1lbnQuYXBwZW5kQ2hpbGQodGl0bGVFbGVtZW50KTtcclxuICAgICAgICB0YWJzRWxlbWVudC5hcHBlbmRDaGlsZCh0YWJFbGVtZW50KTtcclxuICAgICAgICBoZWFkZXJFbGVtZW50LmFwcGVuZENoaWxkKHRhYnNFbGVtZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJveHlDb250YWluZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fcHJveHlDb250YWluZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Db250ZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZChoZWFkZXJFbGVtZW50KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5fb3JpZ2luYWxTdGFjayA/PyB0aGlzLl9hY3Rpb24ucGFyZW50Py5wcm94eT8uX29yaWdpbmFsU3RhY2sgPz8gbnVsbDtcclxuICAgICAgICBpZiAoc3RhY2sgIT09IG51bGwgJiYgc3RhY2suaGVhZGVyU2hvdykge1xyXG4gICAgICAgICAgICB0aGlzLl9zaWRlZCA9IHN0YWNrLmhlYWRlckxlZnRSaWdodFNpZGVkO1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xtXycgKyBzdGFjay5oZWFkZXJTaWRlKTtcclxuICAgICAgICAgICAgaWYgKFtTaWRlLnJpZ2h0LCBTaWRlLmJvdHRvbV0uaW5kZXhPZihzdGFjay5oZWFkZXJTaWRlKSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm94eUNvbnRhaW5lckVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIGhlYWRlckVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUubGVmdCA9IG51bWJlclRvUGl4ZWxzKGluaXRpYWxYKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnRvcCA9IG51bWJlclRvUGl4ZWxzKGluaXRpYWxZKTtcclxuICAgICAgICB0YWJFbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aGlzLl9jb21wb25lbnRJdGVtLnRpdGxlKTtcclxuICAgICAgICB0aXRsZUVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRUZXh0KCdhZnRlcmJlZ2luJywgdGhpcy5fY29tcG9uZW50SXRlbS50aXRsZSk7XHJcbiAgICAgICAgdGhpcy5fcHJveHlDb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NvbXBvbmVudEl0ZW0uZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayBvbiBldmVyeSBtb3VzZU1vdmUgZXZlbnQgZHVyaW5nIGEgZHJhZy4gRGV0ZXJtaW5lcyBpZiB0aGUgZHJhZyBpc1xyXG4gICAgICogc3RpbGwgd2l0aGluIHRoZSB2YWxpZCBkcmFnIGFyZWEgYW5kIGNhbGxzIHRoZSBsYXlvdXRNYW5hZ2VyIHRvIGhpZ2hsaWdodCB0aGVcclxuICAgICAqIGN1cnJlbnQgZHJvcCBhcmVhXHJcbiAgICAgKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGRyYWcoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBDb250ZW50SXRlbS5BcmVhIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYXJlYSA9IHRoaXMuc2V0RHJvcFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uZHJhZygpO1xyXG4gICAgICAgIHJldHVybiBhcmVhO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGFyZ2V0IHBvc2l0aW9uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHggLSBUaGUgeCBwb3NpdGlvbiBpbiBweFxyXG4gICAgICogQHBhcmFtIHkgLSBUaGUgeSBwb3NpdGlvbiBpbiBweFxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldERyb3BQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscyh4KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnRvcCA9IG51bWJlclRvUGl4ZWxzKHkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dE1hbmFnZXIuZ2V0QXJlYSh4LCB5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIHdoZW4gdGhlIGRyYWcgaGFzIGZpbmlzaGVkLiBEZXRlcm1pbmVzIHRoZSBkcm9wIGFyZWFcclxuICAgICAqIGFuZCBhZGRzIHRoZSBjaGlsZCB0byBpdFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGRyb3AoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5leGl0RHJhZ01vZGUoKTtcclxuXHJcbiAgICAgICAgbGV0IGFyZWE6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBsZXQgZHJvcHBlZENvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5fYWN0aW9uLmN1cnJlbnRUYXJnZXQ7XHJcbiAgICAgICAgaWYgKHRhcmdldD8ub3duZXIgPT09IHRoaXMuX2FjdGlvbikge1xyXG4gICAgICAgICAgICBhcmVhID0gdGFyZ2V0LmFyZWE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICogVmFsaWQgZHJvcCBhcmVhIGZvdW5kXHJcbiAgICAgICAgKi9cclxuICAgICAgICBpZiAoYXJlYSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBkcm9wcGVkQ29tcG9uZW50SXRlbSA9IHRoaXMuX2NvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhcmVudENvbnRlbnRJdGVtID0gYXJlYS5jb250ZW50SXRlbTtcclxuICAgICAgICAgICAgbmV3UGFyZW50Q29udGVudEl0ZW0ub25Ecm9wKGRyb3BwZWRDb21wb25lbnRJdGVtLCBhcmVhKTtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmZvY3VzV2luZG93KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE5vIHZhbGlkIGRyb3AgYXJlYSBmb3VuZCBkdXJpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkcmFnLlxyXG4gICAgICAgICAqIENyZWF0ZSBhIHBvcG91dC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PT0gbnVsbCAmJiB0aGlzLl9hY3Rpb24ucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlubmVyU2NyZWVuID0gZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbihnbG9iYWxUaGlzKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdyA9IHtcclxuICAgICAgICAgICAgICAgIGxlZnQ6IGlubmVyU2NyZWVuLmxlZnQgKyB0aGlzLmVsZW1lbnQub2Zmc2V0TGVmdCxcclxuICAgICAgICAgICAgICAgIHRvcDogaW5uZXJTY3JlZW4udG9wICsgdGhpcy5lbGVtZW50Lm9mZnNldFRvcCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9vcmlnaW5hbFNpemUud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuX29yaWdpbmFsU2l6ZS5oZWlnaHRcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZVBvcG91dEZyb21Db250ZW50SXRlbSh0aGlzLl9jb21wb25lbnRJdGVtLCB3aW5kb3csIGdldFVuaXF1ZUlkKCksIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uZGVzdHJveSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZHJhZyBkaWRuJ3QgdWx0aW1hdGVseSBlbmQgdXAgd2l0aCBhZGRpbmcgdGhlIGNvbnRlbnQgaXRlbSB0b1xyXG4gICAgICAgICAqIGFueSBjb250YWluZXIuIEluIG9yZGVyIHRvIGVuc3VyZSBjbGVhbiB1cCBoYXBwZW5zLCBkZXN0cm95IHRoZVxyXG4gICAgICAgICAqIGNvbnRlbnQgaXRlbS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLmRlc3Ryb3koKTsgLy8gY29udGVudEl0ZW0gY2hpbGRyZW4gYXJlIG5vdyBkZXN0cm95ZWQgYXMgd2VsbFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVtaXQoJ2l0ZW1Ecm9wcGVkJywgdGhpcy5fY29tcG9uZW50SXRlbSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jb21wb25lbnRJdGVtRm9jdXNlZCkge1xyXG4gICAgICAgICAgICBkcm9wcGVkQ29tcG9uZW50SXRlbT8uZm9jdXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBEcmFnIFByb3h5J3MgZGltZW5zaW9uc1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0RGltZW5zaW9ucygpIHtcclxuICAgICAgICBjb25zdCBkaW1lbnNpb25zID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5kaW1lbnNpb25zO1xyXG4gICAgICAgIGlmIChkaW1lbnNpb25zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEcmFnUHJveHkuc2V0RGltZW5zaW9uczogZGltZW5zaW9ucyB1bmRlZmluZWQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB3aWR0aCA9IGRpbWVuc2lvbnMuZHJhZ1Byb3h5V2lkdGg7XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IGRpbWVuc2lvbnMuZHJhZ1Byb3h5SGVpZ2h0O1xyXG4gICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkIHx8IGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRHJhZ1Byb3h5LnNldERpbWVuc2lvbnM6IHdpZHRoIGFuZC9vciBoZWlnaHQgdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9vdXRlcldpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5fb3V0ZXJIZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgaGVhZGVySGVpZ2h0ID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5oZWFkZXIuc2hvdyA9PT0gZmFsc2UgPyAwIDogZGltZW5zaW9ucy5oZWFkZXJIZWlnaHQ7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS53aWR0aCA9IG51bWJlclRvUGl4ZWxzKHdpZHRoKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKGhlaWdodClcclxuICAgICAgICB3aWR0aCAtPSAodGhpcy5fc2lkZWQgPyBoZWFkZXJIZWlnaHQgOiAwKTtcclxuICAgICAgICBoZWlnaHQgLT0gKCF0aGlzLl9zaWRlZCA/IGhlYWRlckhlaWdodCA6IDApO1xyXG4gICAgICAgIHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudC5zdHlsZS53aWR0aCA9IG51bWJlclRvUGl4ZWxzKHdpZHRoKTtcclxuICAgICAgICB0aGlzLl9wcm94eUNvbnRhaW5lckVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gbnVtYmVyVG9QaXhlbHMoaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLmVudGVyRHJhZ01vZGUod2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5zaG93KCk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50SXRlbUNvbmZpZyBhcyBDb25maWdDb21wb25lbnRJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZyc7IC8vIHJlbW92ZSBhbGlhcyBpbiB2ZXJzaW9uIDNcclxuaW1wb3J0IHsgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgfSBmcm9tIFwiLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZ1wiO1xyXG5pbXBvcnQgeyBVbmV4cGVjdGVkTnVsbEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBHcm91bmRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvZ3JvdW5kLWl0ZW0nO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEcmFnTGlzdGVuZXIgfSBmcm9tICcuLi91dGlscy9kcmFnLWxpc3RlbmVyJztcclxuaW1wb3J0IHsgSnNvblZhbHVlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBEcmFnQWN0aW9uIH0gZnJvbSAnLi9kcmFnLWFjdGlvbic7XHJcblxyXG4vKipcclxuICogQWxsb3dzIGZvciBhbnkgRE9NIGl0ZW0gdG8gY3JlYXRlIGEgY29tcG9uZW50IG9uIGRyYWdcclxuICogc3RhcnQgdG8gYmUgZHJhZ2dlZCBpbnRvIHRoZSBMYXlvdXRcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERyYWdTb3VyY2Uge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIgfCBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHVtbXlHcm91bmRDb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHVtbXlHcm91bmRDb250ZW50SXRlbTogR3JvdW5kSXRlbTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTEVsZW1lbnQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2V4dHJhQWxsb3dhYmxlQ2hpbGRUYXJnZXRzOiBIVE1MRWxlbWVudFtdLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgcmVwbGFjZSB3aXRoIGNvbXBvbmVudEl0ZW1Db25maWdPckZ0biBpbiB2ZXJzaW9uIDMgKi9cclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRUeXBlT3JGdG46IEpzb25WYWx1ZSB8ICgoKSA9PiAoRHJhZ1NvdXJjZS5Db21wb25lbnRJdGVtQ29uZmlnIHwgQ29uZmlnQ29tcG9uZW50SXRlbUNvbmZpZykpLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgcmVtb3ZlIGluIHZlcnNpb24gMyAqL1xyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudFN0YXRlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCByZW1vdmUgaW4gdmVyc2lvbiAzICovXHJcbiAgICAgICAgcHJpdmF0ZSBfdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcclxuICAgICAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHJlbW92ZSBpbiB2ZXJzaW9uIDMgKi9cclxuICAgICAgICBwcml2YXRlIF9pZDogc3RyaW5nIHwgdW5kZWZpbmVkXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLl9kdW1teUdyb3VuZENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cclxuICAgICAgICBjb25zdCBkdW1teVJvb3RJdGVtQ29uZmlnID0gUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgncm93Jyk7XHJcbiAgICAgICAgdGhpcy5fZHVtbXlHcm91bmRDb250ZW50SXRlbSA9IG5ldyBHcm91bmRJdGVtKHRoaXMuX2xheW91dE1hbmFnZXIsIGR1bW15Um9vdEl0ZW1Db25maWcsIHRoaXMuX2R1bW15R3JvdW5kQ29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgdGhpcy5jcmVhdGVEcmFnTGlzdGVuZXIoKTtcclxuICAgIH1cclxuXHJcblx0LyoqXHJcblx0ICogRGlzcG9zZXMgb2YgdGhlIGRyYWcgbGlzdGVuZXJzIHNvIHRoZSBkcmFnIHNvdXJjZSBpcyBub3QgdXNhYmxlIGFueSBtb3JlLlxyXG4gICAgICogQGludGVybmFsXHJcblx0ICovXHJcblx0ZGVzdHJveSgpOiB2b2lkIHtcclxuXHRcdHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgaW5pdGlhbGx5IGFuZCBhZnRlciBldmVyeSBkcmFnXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVEcmFnTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyID0gbmV3IERyYWdMaXN0ZW5lcih0aGlzLl9lbGVtZW50LCB0aGlzLl9leHRyYUFsbG93YWJsZUNoaWxkVGFyZ2V0cyk7XHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyLm9uKCdkcmFnU3RhcnQnLCAoeCwgeSkgPT4gdGhpcy5vbkRyYWdTdGFydCh4LCB5KSk7XHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyLm9uKCdkcmFnU3RvcCcsICgpID0+IHRoaXMub25EcmFnU3RvcCgpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIGZvciB0aGUgRHJhZ0xpc3RlbmVyJ3MgZHJhZ1N0YXJ0IGV2ZW50XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHggLSBUaGUgeCBwb3NpdGlvbiBvZiB0aGUgbW91c2Ugb24gZHJhZ1N0YXJ0XHJcbiAgICAgKiBAcGFyYW0geSAtIFRoZSB4IHBvc2l0aW9uIG9mIHRoZSBtb3VzZSBvbiBkcmFnU3RhcnRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uRHJhZ1N0YXJ0KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9ICdjb21wb25lbnQnO1xyXG4gICAgICAgIGxldCBkcmFnU291cmNlSXRlbUNvbmZpZzogQ29uZmlnQ29tcG9uZW50SXRlbUNvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9jb21wb25lbnRUeXBlT3JGdG4gPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICBjb25zdCBmdG5EcmFnU291cmNlSXRlbUNvbmZpZyA9IHRoaXMuX2NvbXBvbmVudFR5cGVPckZ0bigpIGFzIChEcmFnU291cmNlLkNvbXBvbmVudEl0ZW1Db25maWcgfCBDb25maWdDb21wb25lbnRJdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgLy8gSWYgdGhlIGNvbXBvbmVudFR5cGUgcHJvcGVydHkgZXhpc3RzLCB0aGVuIGl0IGlzIGFscmVhZHkgYSBDb21wb25lbnRJdGVtQ29uZmlnIHNvIG5vdGhpbmcgdG8gZG9cclxuICAgICAgICAgICAgaWYgKERyYWdTb3VyY2UuaXNEcmFnU291cmNlQ29tcG9uZW50SXRlbUNvbmZpZyhmdG5EcmFnU291cmNlSXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgICAgIGRyYWdTb3VyY2VJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U3RhdGU6IGZ0bkRyYWdTb3VyY2VJdGVtQ29uZmlnLnN0YXRlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFR5cGU6IGZ0bkRyYWdTb3VyY2VJdGVtQ29uZmlnLnR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGZ0bkRyYWdTb3VyY2VJdGVtQ29uZmlnLnRpdGxlID8/IHRoaXMuX3RpdGxlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRyYWdTb3VyY2VJdGVtQ29uZmlnID0gZnRuRHJhZ1NvdXJjZUl0ZW1Db25maWc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkcmFnU291cmNlSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRTdGF0ZTogdGhpcy5fY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRUeXBlOiB0aGlzLl9jb21wb25lbnRUeXBlT3JGdG4sXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5fdGl0bGUsXHJcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5faWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDcmVhdGUgYSBkdW1teSBDb250ZW50SXRlbSBvbmx5IGZvciBkcmFnIHB1cnBvc2VzXHJcbiAgICAgICAgLy8gQWxsIENvbnRlbnRJdGVtcyAoZXhjZXB0IGZvciBHcm91bmRJdGVtKSBuZWVkIGEgcGFyZW50LiAgV2hlbiBkcmFnZ2luZywgdGhlIHBhcmVudCBpcyBub3QgdXNlZC5cclxuICAgICAgICAvLyBJbnN0ZWFkIG9mIGFsbG93aW5nIG51bGwgcGFyZW50cyAoYXMgSmF2YXNjcmlwdCB2ZXJzaW9uIGRpZCksIHVzZSBhIHRlbXBvcmFyeSBkdW1teSBHcm91bmRJdGVtIHBhcmVudCBhbmQgYWRkIENvbnRlbnRJdGVtIHRvIHRoYXRcclxuICAgICAgICAvLyBJZiB0aGlzIGRvZXMgbm90IHdvcmssIG5lZWQgdG8gY3JlYXRlIGFsdGVybmF0aXZlIEdyb3VuZEl0ZW0gY2xhc3NcclxuXHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRJdGVtQ29uZmlnID0gQ29uZmlnQ29tcG9uZW50SXRlbUNvbmZpZy5yZXNvbHZlKGRyYWdTb3VyY2VJdGVtQ29uZmlnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEl0ZW0gPSBuZXcgQ29tcG9uZW50SXRlbSh0aGlzLl9sYXlvdXRNYW5hZ2VyLCByZXNvbHZlZEl0ZW1Db25maWcsIHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0pXHJcbiAgICAgICAgdGhpcy5fZHVtbXlHcm91bmRDb250ZW50SXRlbS5jb250ZW50SXRlbXMucHVzaChjb21wb25lbnRJdGVtKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdMaXN0ZW5lciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignRFNPRFNENjY3NDYnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb24gPSBEcmFnQWN0aW9uLnN0YXJ0KHRoaXMuX2xheW91dE1hbmFnZXIsIHRoaXMuX2RyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbSwgbnVsbCwgeCwgeSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0cmFuc2l0aW9uSW5kaWNhdG9yID0gdGhpcy5fbGF5b3V0TWFuYWdlci50cmFuc2l0aW9uSW5kaWNhdG9yO1xyXG4gICAgICAgICAgICBpZiAodHJhbnNpdGlvbkluZGljYXRvciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0RTT0RTVDY2NzQ2Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm94eUVsZW1lbnQgPSBhY3Rpb24ucHJveHk/LmVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJveHlFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEU09EU1Q2Njc0NycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25JbmRpY2F0b3IudHJhbnNpdGlvbkVsZW1lbnRzKHRoaXMuX2VsZW1lbnQsIHByb3h5RWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBvbkRyYWdTdG9wKCkge1xyXG4gICAgICAgIC8vIGlmICh0aGlzLl9kdW1teUdyb3VuZENvbnRlbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignRFNPRFNEUlUwODExNicpO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0uXyRkZXN0cm95XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIHRoaXMuY3JlYXRlRHJhZ0xpc3RlbmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogQ2FsbGVkIGFmdGVyIGV2ZXJ5IGRyYWcgYW5kIHdoZW4gdGhlIGRyYWcgc291cmNlIGlzIGJlaW5nIGRpc3Bvc2VkIG9mLlxyXG4gICAgICogQGludGVybmFsXHJcblx0ICovXHJcblx0cHJpdmF0ZSByZW1vdmVEcmFnTGlzdGVuZXIoKSB7XHJcblx0XHRpZiAodGhpcy5fZHJhZ0xpc3RlbmVyICE9PSBudWxsICkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBudWxsO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBEcmFnU291cmNlIHtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCAgdXNlIENvbmZpZyB7QGxpbmsgKENvbXBvbmVudEl0ZW1Db25maWc6aW50ZXJmYWNlKX0gKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgdHlwZTogSnNvblZhbHVlLFxyXG4gICAgICAgIHN0YXRlPzogSnNvblZhbHVlLFxyXG4gICAgICAgIHRpdGxlPzogc3RyaW5nLFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCByZW1vdmUgaW4gdmVyc2lvbiAzICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNEcmFnU291cmNlQ29tcG9uZW50SXRlbUNvbmZpZyhcclxuICAgICAgICBjb25maWc6IERyYWdTb3VyY2UuQ29tcG9uZW50SXRlbUNvbmZpZyB8IENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWdcclxuICAgICk6IGNvbmZpZyBpcyBEcmFnU291cmNlLkNvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiAhKFwiY29tcG9uZW50VHlwZVwiIGluIGNvbmZpZyk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEFyZWFMaW5rZWRSZWN0IH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBudW1iZXJUb1BpeGVscyB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIERyb3BUYXJnZXRJbmRpY2F0b3Ige1xyXG4gICAgcHJpdmF0ZSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgLy8gTWF5YmUgdXNlIGNvbnRhaW5lciBpbnN0ZWFkIG9mIERvY3VtZW50IEJvZHk/XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyb3BUYXJnZXRJbmRpY2F0b3IpO1xyXG4gICAgICAgIGNvbnN0IGlubmVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGlubmVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSW5uZXIpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQoaW5uZXJFbGVtZW50KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlnaGxpZ2h0QXJlYShhcmVhOiBBcmVhTGlua2VkUmVjdCwgbWFyZ2luOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscyhhcmVhLngxICsgbWFyZ2luKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnRvcCA9IG51bWJlclRvUGl4ZWxzKGFyZWEueTEgKyBtYXJnaW4pO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyhhcmVhLngyIC0gYXJlYS54MSAtIG1hcmdpbiAtIDEpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gbnVtYmVyVG9QaXhlbHMoYXJlYS55MiAtIGFyZWEueTEgLSBtYXJnaW4gLSAxKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBIZWFkZXIgfSBmcm9tICcuL2hlYWRlcic7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBIZWFkZXJCdXR0b24ge1xyXG4gICAgcHJpdmF0ZSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF9jbGlja0V2ZW50TGlzdGVuZXIgPSAoZXY6IE1vdXNlRXZlbnQpID0+IHRoaXMub25DbGljayhldik7XHJcbiAgICBwcml2YXRlIF90b3VjaFN0YXJ0RXZlbnRMaXN0ZW5lciA9IChldjogVG91Y2hFdmVudCkgPT4gdGhpcy5vblRvdWNoU3RhcnQoZXYpO1xyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9oZWFkZXI6IEhlYWRlciwgbGFiZWw6IHN0cmluZywgY3NzQ2xhc3M6IHN0cmluZywgcHJpdmF0ZSBfcHVzaEV2ZW50OiBIZWFkZXJCdXR0b24uUHVzaEV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChjc3NDbGFzcyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC50aXRsZSA9IGxhYmVsO1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci5vbignZGVzdHJveScsICgpID0+IHRoaXMuZGVzdHJveSgpKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fY2xpY2tFdmVudExpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fdG91Y2hTdGFydEV2ZW50TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9oZWFkZXIuY29udHJvbHNDb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2NsaWNrRXZlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fdG91Y2hTdGFydEV2ZW50TGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5fZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkNsaWNrKGV2OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fcHVzaEV2ZW50KGV2KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uVG91Y2hTdGFydChldjogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIHRoaXMuX3B1c2hFdmVudChldik7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBIZWFkZXJCdXR0b24ge1xyXG4gICAgZXhwb3J0IHR5cGUgUHVzaEV2ZW50ID0gKHRoaXM6IHZvaWQsIGV2OiBFdmVudCkgPT4gdm9pZDtcclxufVxyXG4iLCJpbXBvcnQgeyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBTdGFjayB9IGZyb20gJy4uL2l0ZW1zL3N0YWNrJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgU2lkZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgbnVtYmVyVG9QaXhlbHMsIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgSGVhZGVyQnV0dG9uIH0gZnJvbSAnLi9oZWFkZXItYnV0dG9uJztcclxuaW1wb3J0IHsgVGFiIH0gZnJvbSAnLi90YWInO1xyXG5pbXBvcnQgeyBUYWJzQ29udGFpbmVyIH0gZnJvbSAnLi90YWJzLWNvbnRhaW5lcic7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgaGVhZGVyIGFib3ZlIGEgU3RhY2sgQ29udGVudEl0ZW0uXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBIZWFkZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFic0NvbnRhaW5lcjogVGFic0NvbnRhaW5lcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udHJvbHNDb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zaG93OiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcG9wb3V0TGFiZWw6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21heGltaXNlTGFiZWw6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21pbmltaXNlTGFiZWw6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Nsb3NlTGFiZWw6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkRyb3Bkb3duRW5hYmxlZDogYm9vbGVhbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkRyb3Bkb3duTGFiZWw6IHN0cmluZztcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJDb250cm9sT2Zmc2V0OiBudW1iZXI7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xpY2tMaXN0ZW5lciA9IChldjogTW91c2VFdmVudCkgPT4gdGhpcy5vbkNsaWNrKGV2KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RvdWNoU3RhcnRMaXN0ZW5lciA9IChldjogVG91Y2hFdmVudCkgPT4gdGhpcy5vblRvdWNoU3RhcnQoZXYpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnRNb3VzZVVwTGlzdGVuZXI6ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbGF5b3V0U3RhdGVMaXN0ZW5lciA9ICgpID0+IHRoaXMub25MYXlvdXRDaGFuZ2VkKCk7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc2lkZTogU2lkZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2xlZnRSaWdodFNpZGVkOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2VCdXR0b246IEhlYWRlckJ1dHRvbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3BvcG91dEJ1dHRvbjogSGVhZGVyQnV0dG9uO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiRHJvcGRvd25CdXR0b246IEhlYWRlckJ1dHRvbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21heGltaXNlQnV0dG9uOiBIZWFkZXJCdXR0b247XHJcbiAgICAvLyAvKiogQGludGVybmFsICovXHJcbiAgICAvLyBwcml2YXRlIF9hY3RpdmVDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtIHwgbnVsbCA9IG51bGw7IC8vIG9ubHkgdXNlZCB0byBpZGVudGlmeSBhY3RpdmUgdGFiXHJcblxyXG4gICAgZ2V0IHNob3coKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9zaG93OyB9XHJcbiAgICBnZXQgc2lkZSgpOiBTaWRlIHsgcmV0dXJuIHRoaXMuX3NpZGU7IH1cclxuICAgIGdldCBsZWZ0UmlnaHRTaWRlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2xlZnRSaWdodFNpZGVkOyB9XHJcblxyXG4gICAgZ2V0IGxheW91dE1hbmFnZXIoKTogTGF5b3V0TWFuYWdlciB7IHJldHVybiB0aGlzLl9sYXlvdXRNYW5hZ2VyOyB9XHJcbiAgICBnZXQgcGFyZW50KCk6IFN0YWNrIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfVxyXG4gICAgZ2V0IHRhYnMoKTogVGFiW10geyByZXR1cm4gdGhpcy5fdGFic0NvbnRhaW5lci50YWJzOyB9XHJcbiAgICBnZXQgbGFzdFZpc2libGVUYWJJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fdGFic0NvbnRhaW5lci5sYXN0VmlzaWJsZVRhYkluZGV4OyB9XHJcblxyXG4gICAgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZWxlbWVudDsgfVxyXG4gICAgZ2V0IHRhYnNDb250YWluZXJFbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX3RhYnNDb250YWluZXIuZWxlbWVudDsgfVxyXG4gICAgZ2V0IGNvbnRyb2xzQ29udGFpbmVyRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQ7IH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfcGFyZW50OiBTdGFjayxcclxuICAgICAgICBzZXR0aW5nczogSGVhZGVyLlNldHRpbmdzLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9nZXRBY3RpdmVDb21wb25lbnRJdGVtRXZlbnQ6IEhlYWRlci5HZXRBY3RpdmVDb21wb25lbnRJdGVtRXZlbnQsXHJcbiAgICAgICAgY2xvc2VFdmVudDogSGVhZGVyLkNsb3NlRXZlbnQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX3BvcG91dEV2ZW50OiBIZWFkZXIuUG9wb3V0RXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX21heGltaXNlVG9nZ2xlRXZlbnQ6IEhlYWRlci5NYXhpbWlzZVRvZ2dsZUV2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jbGlja0V2ZW50OiBIZWFkZXIuQ2xpY2tFdmVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfdG91Y2hTdGFydEV2ZW50OiBIZWFkZXIuVG91Y2hTdGFydEV2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRSZW1vdmVFdmVudDogSGVhZGVyLkNvbXBvbmVudFJlbW92ZUV2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRGb2N1c0V2ZW50OiBIZWFkZXIuQ29tcG9uZW50Rm9jdXNFdmVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQ6IEhlYWRlci5Db21wb25lbnREcmFnU3RhcnRFdmVudCB8IHVuZGVmaW5lZCxcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RhYnNDb250YWluZXIgPSBuZXcgVGFic0NvbnRhaW5lcih0aGlzLl9sYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJJbml0aWF0ZWRDb21wb25lbnRSZW1vdmVFdmVudChpdGVtKSxcclxuICAgICAgICAgICAgKGl0ZW0pID0+IHRoaXMuaGFuZGxlVGFiSW5pdGlhdGVkQ29tcG9uZW50Rm9jdXNFdmVudChpdGVtKSxcclxuICAgICAgICAgICAgKHgsIHksIGRyYWdMaXN0ZW5lciwgaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJJbml0aWF0ZWREcmFnU3RhcnRFdmVudCh4LCB5LCBkcmFnTGlzdGVuZXIsIGl0ZW0pLFxyXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnByb2Nlc3NUYWJEcm9wZG93bkFjdGl2ZUNoYW5nZWQoKSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLl9zaG93ID0gc2V0dGluZ3Muc2hvdztcclxuICAgICAgICB0aGlzLl9wb3BvdXRMYWJlbCA9IHNldHRpbmdzLnBvcG91dExhYmVsO1xyXG4gICAgICAgIHRoaXMuX21heGltaXNlTGFiZWwgPSBzZXR0aW5ncy5tYXhpbWlzZUxhYmVsO1xyXG4gICAgICAgIHRoaXMuX21pbmltaXNlTGFiZWwgPSBzZXR0aW5ncy5taW5pbWlzZUxhYmVsO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlTGFiZWwgPSBzZXR0aW5ncy5jbG9zZUxhYmVsO1xyXG4gICAgICAgIHRoaXMuX3RhYkRyb3Bkb3duRW5hYmxlZCA9IHNldHRpbmdzLnRhYkRyb3Bkb3duRW5hYmxlZDtcclxuICAgICAgICB0aGlzLl90YWJEcm9wZG93bkxhYmVsID0gc2V0dGluZ3MudGFiRHJvcGRvd25MYWJlbDtcclxuICAgICAgICB0aGlzLnNldFNpZGUoc2V0dGluZ3Muc2lkZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSGVhZGVyKTtcclxuICAgICAgICB0aGlzLl9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XHJcbiAgICAgICAgdGhpcy5fY29udHJvbHNDb250YWluZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Db250cm9scyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl90YWJzQ29udGFpbmVyLmVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY29udHJvbHNDb250YWluZXJFbGVtZW50KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RhYnNDb250YWluZXIuZHJvcGRvd25FbGVtZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2NsaWNrTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90b3VjaFN0YXJ0TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZG9jdW1lbnRNb3VzZVVwTGlzdGVuZXIgPSAoKSA9PiB0aGlzLl90YWJzQ29udGFpbmVyLmhpZGVBZGRpdGlvbmFsVGFic0Ryb3Bkb3duKClcclxuICAgICAgICBnbG9iYWxUaGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9kb2N1bWVudE1vdXNlVXBMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl90YWJDb250cm9sT2Zmc2V0ID0gdGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MudGFiQ29udHJvbE9mZnNldDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3RhYkRyb3Bkb3duRW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJEcm9wZG93bkJ1dHRvbiA9IG5ldyBIZWFkZXJCdXR0b24odGhpcywgdGhpcy5fdGFiRHJvcGRvd25MYWJlbCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWJEcm9wZG93bixcclxuICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX3RhYnNDb250YWluZXIuc2hvd0FkZGl0aW9uYWxUYWJzRHJvcGRvd24oKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcG9wb3V0QnV0dG9uID0gbmV3IEhlYWRlckJ1dHRvbih0aGlzLCB0aGlzLl9wb3BvdXRMYWJlbCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Qb3BvdXQsICgpID0+IHRoaXMuaGFuZGxlQnV0dG9uUG9wb3V0RXZlbnQoKSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1heGltaXNlIGNvbnRyb2wgLSBzZXQgdGhlIGNvbXBvbmVudCB0byB0aGUgZnVsbCBzaXplIG9mIHRoZSBsYXlvdXRcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9tYXhpbWlzZUJ1dHRvbiA9IG5ldyBIZWFkZXJCdXR0b24odGhpcywgdGhpcy5fbWF4aW1pc2VMYWJlbCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5NYXhpbWlzZSxcclxuICAgICAgICAgICAgKGV2KSA9PiB0aGlzLmhhbmRsZUJ1dHRvbk1heGltaXNlVG9nZ2xlRXZlbnQoZXYpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ2xvc2UgYnV0dG9uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24gPSBuZXcgSGVhZGVyQnV0dG9uKHRoaXMsIHRoaXMuX2Nsb3NlTGFiZWwsIERvbUNvbnN0YW50cy5DbGFzc05hbWUuQ2xvc2UsICgpID0+IGNsb3NlRXZlbnQoKSk7XHJcblxyXG4gICAgICAgIHRoaXMucHJvY2Vzc1RhYkRyb3Bkb3duQWN0aXZlQ2hhbmdlZCgpO1xyXG5cclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcignc3RhdGVDaGFuZ2VkJywgdGhpcy5fbGF5b3V0U3RhdGVMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGUgZW50aXJlIGhlYWRlclxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkZXN0cm95Jyk7XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcG91dEV2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX21heGltaXNlVG9nZ2xlRXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl90b3VjaFN0YXJ0RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Rm9jdXNFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnREcmFnU3RhcnRFdmVudCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgIGdsb2JhbFRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2RvY3VtZW50TW91c2VVcExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3RhdGVDaGFuZ2VkJywgdGhpcy5fbGF5b3V0U3RhdGVMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGFiIGFuZCBhc3NvY2lhdGVzIGl0IHdpdGggYSBjb250ZW50SXRlbVxyXG4gICAgICogQHBhcmFtIGluZGV4IC0gVGhlIHBvc2l0aW9uIG9mIHRoZSB0YWJcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBjcmVhdGVUYWIoY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RhYnNDb250YWluZXIuY3JlYXRlVGFiKGNvbXBvbmVudEl0ZW0sIGluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIGEgdGFiIGJhc2VkIG9uIHRoZSBjb250ZW50SXRlbSBpdHMgYXNzb2NpYXRlZCB3aXRoIGFuZCByZW1vdmVzIGl0LlxyXG4gICAgICogQ2Fubm90IHJlbW92ZSB0YWIgaWYgaXQgaGFzIHRoZSBhY3RpdmUgQ29tcG9uZW50SXRlbVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZVRhYihjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci5yZW1vdmVUYWIoY29tcG9uZW50SXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvY2Vzc0FjdGl2ZUNvbXBvbmVudENoYW5nZWQobmV3QWN0aXZlQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RhYnNDb250YWluZXIucHJvY2Vzc0FjdGl2ZUNvbXBvbmVudENoYW5nZWQobmV3QWN0aXZlQ29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVUYWJTaXplcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldFNpZGUodmFsdWU6IFNpZGUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zaWRlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5fbGVmdFJpZ2h0U2lkZWQgPSBbU2lkZS5yaWdodCwgU2lkZS5sZWZ0XS5pbmNsdWRlcyh0aGlzLl9zaWRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGhlYWRlciBidXR0b25zLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlQnV0dG9ucygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhY3RpdmVDb21wb25lbnRJdGVtID0gdGhpcy5fZ2V0QWN0aXZlQ29tcG9uZW50SXRlbUV2ZW50KCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ2xvc2UgYnV0dG9uIGlzIG9ubHkgdmlzaWJsZSBpZiBhbGwgaXRlbXMgb2YgdGhlIHN0YWNrIGFyZSBjbG9zYWJsZVxyXG4gICAgICAgIC8vIGFuZCB0aGUgYWN0aXZlIGNvbXBvbmVudCBoYXMgaXRzIGNsb3NlIGJ1dHRvbiBzZXQgdG8gdmlzaWJsZS4gTm90ZSB0aGF0XHJcbiAgICAgICAgLy8gaGlkaW5nIHRoZSBjbG9zZSBidXR0b24gaW4gYSBoZWFkZXIgb2YgYW4gaXRlbSBpcyBub3QgZXF1aXZhbGVudCB0byBtYWtpbmdcclxuICAgICAgICAvLyB0aGF0IGl0ZW0gdW5jbG9zYWJsZS5cclxuICAgICAgICBjb25zdCBhbGxDbG9zYWJsZSA9IHRoaXMudGFicy5ldmVyeSh0YWIgPT4gdGFiLmNvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSk7XHJcbiAgICAgICAgY29uc3QgY2xvc2UgPSBhY3RpdmVDb21wb25lbnRJdGVtPy5oZWFkZXJDb25maWc/LmNsb3NlICE9PSBmYWxzZTtcclxuICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fY2xvc2VCdXR0b24uZWxlbWVudCwgYWxsQ2xvc2FibGUgJiYgY2xvc2UpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFBvcG91dCBidXR0b24gaXMgdmlzaWJsZSBpZiB0aGUgYWN0aXZlIGNvbXBvbmVudCBpcyBjbG9zYWJsZSBhbmQgaGFzIGl0cyBwb3BvdXQgYnV0dG9uIGVuYWJsZWQuXHJcbiAgICAgICAgLy8gSWYgcG9wb3V0V2hvbGVTdGFjayA9IHRydWUsIHRoZSBidXR0b24gaXMgdmlzaWJsZSBpZiB0aGlzIGlzIHRydWUgZm9yIGV2ZXJ5IGl0ZW0uXHJcbiAgICAgICAgbGV0IHBvcG91dDogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLy8gQWxzbyB3ZSB3YW50IHRvIHByZXZlbnQgcG9wcGluZyBvdXQgaWYgdGhhdCB3b3VsZCBsZWF2ZSB1cyB3aXRoIGFuIGVtcHR5IGxheW91dC5cclxuICAgICAgICBsZXQgaXNMYXN0ID0gdGhpcy50YWJzWzBdLmNvbXBvbmVudEl0ZW0uZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCkgPT09IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy5wb3BvdXRXaG9sZVN0YWNrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFsbFBvcG91dGFibGUgPSB0aGlzLnRhYnMuZXZlcnkodGFiID0+IHRhYi5jb21wb25lbnRJdGVtLmhlYWRlckNvbmZpZz8ucG9wb3V0ICE9PSBmYWxzZSkgXHJcbiAgICAgICAgICAgIHBvcG91dCA9ICFpc0xhc3QgJiYgYWxsQ2xvc2FibGUgJiYgYWxsUG9wb3V0YWJsZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpc0xhc3QgJiY9IHRoaXMudGFicy5sZW5ndGggPT09IDE7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsb3NhYmxlID0gYWN0aXZlQ29tcG9uZW50SXRlbT8uaXNDbG9zYWJsZSAhPT0gZmFsc2U7XHJcbiAgICAgICAgICAgIHBvcG91dCA9ICFpc0xhc3QgJiYgY2xvc2FibGUgJiYgKGFjdGl2ZUNvbXBvbmVudEl0ZW0/LmhlYWRlckNvbmZpZz8ucG9wb3V0ICE9PSBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fcG9wb3V0QnV0dG9uLmVsZW1lbnQsIHBvcG91dCk7XHJcblxyXG4gICAgICAgIC8vIE1heGltaXplIGJ1dHRvbiBpcyBvbmx5IHZpc2libGUgaWYgYWxsIGl0ZW1zIGhhdmUgdGhlaXIgbWF4aW1pemUgYnV0dG9uIGVuYWJsZWQuXHJcbiAgICAgICAgY29uc3QgbWF4aW1pemUgPSB0aGlzLnRhYnMuZXZlcnkodGFiID0+IHRhYi5jb21wb25lbnRJdGVtLmhlYWRlckNvbmZpZz8ubWF4aW1pc2UgIT09IGZhbHNlKTtcclxuICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fbWF4aW1pc2VCdXR0b24uZWxlbWVudCwgbWF4aW1pemUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGFwcGx5Rm9jdXNlZFZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm9jZXNzTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hQTUFYMTY5OTcnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZUJ1dHRvbi5lbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aGlzLl9taW5pbWlzZUxhYmVsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvY2Vzc01pbmltaXNlZCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VCdXR0b24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdIUE1JTjE2OTk3Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VCdXR0b24uZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5fbWF4aW1pc2VMYWJlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHVzaGVzIHRoZSB0YWJzIHRvIHRoZSB0YWIgZHJvcGRvd24gaWYgdGhlIGF2YWlsYWJsZSBzcGFjZSBpcyBub3Qgc3VmZmljaWVudFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVRhYlNpemVzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl90YWJzQ29udGFpbmVyLnRhYkNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSB0aGlzLl9zaG93ID8gdGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucy5oZWFkZXJIZWlnaHQgOiAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xlZnRSaWdodFNpZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS53aWR0aCA9IG51bWJlclRvUGl4ZWxzKGhlYWRlckhlaWdodCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKGhlYWRlckhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGF2YWlsYWJsZVdpZHRoOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9sZWZ0UmlnaHRTaWRlZCkge1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSB0aGlzLl9lbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMuX2NvbnRyb2xzQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQgLSB0aGlzLl90YWJDb250cm9sT2Zmc2V0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSB0aGlzLl9lbGVtZW50Lm9mZnNldFdpZHRoIC0gdGhpcy5fY29udHJvbHNDb250YWluZXJFbGVtZW50Lm9mZnNldFdpZHRoIC0gdGhpcy5fdGFiQ29udHJvbE9mZnNldDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci51cGRhdGVUYWJTaXplcyhhdmFpbGFibGVXaWR0aCwgdGhpcy5fZ2V0QWN0aXZlQ29tcG9uZW50SXRlbUV2ZW50KCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYkluaXRpYXRlZENvbXBvbmVudFJlbW92ZUV2ZW50KGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFRDRTIyMjk0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQoY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlVGFiSW5pdGlhdGVkQ29tcG9uZW50Rm9jdXNFdmVudChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEZvY3VzRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFRBRTIyMjk0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Rm9jdXNFdmVudChjb21wb25lbnRJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVUYWJJbml0aWF0ZWREcmFnU3RhcnRFdmVudCh4OiBudW1iZXIsIHk6IG51bWJlciwgZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFREU0UyMjI5NCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudERyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcHJvY2Vzc1RhYkRyb3Bkb3duQWN0aXZlQ2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGFiRHJvcGRvd25CdXR0b24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fdGFiRHJvcGRvd25CdXR0b24uZWxlbWVudCwgdGhpcy5fdGFic0NvbnRhaW5lci5kcm9wZG93bkFjdGl2ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQnV0dG9uUG9wb3V0RXZlbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcG91dFdob2xlU3RhY2spIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcG91dEV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hIQlBPRTE3ODM0Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3BvdXRFdmVudCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlQ29tcG9uZW50SXRlbSA9IHRoaXMuX2dldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudCgpO1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgYWN0aXZlQ29tcG9uZW50SXRlbS5wb3BvdXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBlbHNlOiBpZiB0aGUgc3RhY2sgaXMgZW1wdHkgdGhlcmUgd29uJ3QgYmUgYW4gYWN0aXZlIGl0ZW0gKGFuZCBub3RoaW5nIHRvIHBvcG91dClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVCdXR0b25NYXhpbWlzZVRvZ2dsZUV2ZW50KGV2OiBFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZVRvZ2dsZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignSEhCTVRFMTY4MzQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZVRvZ2dsZUV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBoZWFkZXIncyBiYWNrZ3JvdW5kIGlzIGNsaWNrZWQgKG5vdCBpdCdzIHRhYnMgb3IgY29udHJvbHMpXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNsaWNrKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGhlYWRlcidzIGJhY2tncm91bmQgaXMgdG91Y2hlZCAobm90IGl0J3MgdGFicyBvciBjb250cm9scylcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uVG91Y2hTdGFydChldmVudDogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZnlUb3VjaFN0YXJ0KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBvbkxheW91dENoYW5nZWQoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVCdXR0b25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBub3RpZnlDbGljayhldjogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jbGlja0V2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignSE5IQzQ2ODM0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tFdmVudChldik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5VG91Y2hTdGFydChldjogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl90b3VjaFN0YXJ0RXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdITkhUUzQ2ODM0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fdG91Y2hTdGFydEV2ZW50KGV2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSGVhZGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIEdldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudCA9ICh0aGlzOiB2b2lkKSA9PiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2xvc2VFdmVudCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgUG9wb3V0RXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIE1heGltaXNlVG9nZ2xlRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIENsaWNrRXZlbnQgPSAodGhpczogdm9pZCwgZXY6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBUb3VjaFN0YXJ0RXZlbnQgPSAodGhpczogdm9pZCwgZXY6IFRvdWNoRXZlbnQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRSZW1vdmVFdmVudCA9ICh0aGlzOiB2b2lkLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50Rm9jdXNFdmVudCA9ICh0aGlzOiB2b2lkLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQgPSAodGhpczogdm9pZCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgU3RhdGVDaGFuZ2VkRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuICAgICAgICBzaG93OiBib29sZWFuO1xyXG4gICAgICAgIHNpZGU6IFNpZGU7XHJcbiAgICAgICAgcG9wb3V0RW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICBwb3BvdXRMYWJlbDogc3RyaW5nO1xyXG4gICAgICAgIG1heGltaXNlRW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICBtYXhpbWlzZUxhYmVsOiBzdHJpbmc7XHJcbiAgICAgICAgbWluaW1pc2VFbmFibGVkOiBib29sZWFuO1xyXG4gICAgICAgIG1pbmltaXNlTGFiZWw6IHN0cmluZztcclxuICAgICAgICBjbG9zZUVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICAgICAgY2xvc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgICAgIHRhYkRyb3Bkb3duRW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICB0YWJEcm9wZG93bkxhYmVsOiBzdHJpbmc7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgbnVtYmVyVG9QaXhlbHMgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBTcGxpdHRlciB7XHJcbiAgICBwcml2YXRlIF9ncmFiU2l6ZTtcclxuICAgIHByaXZhdGUgX2RyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxEaXZFbGVtZW50O1xyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxEaXZFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pc1ZlcnRpY2FsOiBib29sZWFuLCBwcml2YXRlIF9zaXplOiBudW1iZXIsIGdyYWJTaXplOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9ncmFiU2l6ZSA9IGdyYWJTaXplIDwgdGhpcy5fc2l6ZSA/IHRoaXMuX3NpemUgOiBncmFiU2l6ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlNwbGl0dGVyKTtcclxuICAgICAgICBjb25zdCBkcmFnSGFuZGxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnSGFuZGxlKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGFuZGxlRXhjZXNzU2l6ZSA9IHRoaXMuX2dyYWJTaXplIC0gdGhpcy5fc2l6ZTtcclxuICAgICAgICBjb25zdCBoYW5kbGVFeGNlc3NQb3MgPSBoYW5kbGVFeGNlc3NTaXplIC8gMjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZUVsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHMoLWhhbmRsZUV4Y2Vzc1Bvcyk7XHJcbiAgICAgICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKHRoaXMuX3NpemUgKyBoYW5kbGVFeGNlc3NTaXplKTtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVmVydGljYWwpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKHRoaXMuX3NpemUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscygtaGFuZGxlRXhjZXNzUG9zKTtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZUVsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyh0aGlzLl9zaXplICsgaGFuZGxlRXhjZXNzU2l6ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkhvcml6b250YWwpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLndpZHRoID0gbnVtYmVyVG9QaXhlbHModGhpcy5fc2l6ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKGRyYWdIYW5kbGVFbGVtZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyID0gbmV3IERyYWdMaXN0ZW5lcih0aGlzLl9lbGVtZW50LCBbZHJhZ0hhbmRsZUVsZW1lbnRdKTtcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb248SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLkNhbGxiYWNrPEs+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyLm9uPEs+KGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBEcmFnTGlzdGVuZXIgfSBmcm9tICcuLi91dGlscy9kcmFnLWxpc3RlbmVyJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgdGFiIHdpdGhpbiBhIFN0YWNrJ3MgaGVhZGVyXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUYWIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aXRsZUVsZW1lbnQ6IEhUTUxTcGFuRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Nsb3NlRWxlbWVudDogSFRNTERpdkVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0FjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkNsaWNrTGlzdGVuZXIgPSAoZXY6IE1vdXNlRXZlbnQpID0+IHRoaXMub25UYWJDbGlja0Rvd24oZXYpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiVG91Y2hTdGFydExpc3RlbmVyID0gKGV2OiBUb3VjaEV2ZW50KSA9PiB0aGlzLm9uVGFiVG91Y2hTdGFydChldik7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZUNsaWNrTGlzdGVuZXIgPSAoKSA9PiB0aGlzLm9uQ2xvc2VDbGljaygpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2VUb3VjaFN0YXJ0TGlzdGVuZXIgPSAoKSA9PiB0aGlzLm9uQ2xvc2VUb3VjaFN0YXJ0KCk7XHJcbiAgICAvLyAvKiogQGludGVybmFsICovXHJcbiAgICAvLyBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZU1vdXNlRG93bkxpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkNsb3NlTW91c2Vkb3duKCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kcmFnU3RhcnRMaXN0ZW5lciA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gdGhpcy5vbkRyYWdTdGFydCh4LCB5KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRlbnRJdGVtRGVzdHJveUxpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkNvbnRlbnRJdGVtRGVzdHJveSgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiVGl0bGVDaGFuZ2VkTGlzdGVuZXIgPSAodGl0bGU6IHN0cmluZykgPT4gdGhpcy5zZXRUaXRsZSh0aXRsZSlcclxuXHJcbiAgICBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc0FjdGl2ZTsgfVxyXG4gICAgLy8gZ2V0IGhlYWRlcigpOiBIZWFkZXIgeyByZXR1cm4gdGhpcy5faGVhZGVyOyB9XHJcbiAgICBnZXQgY29tcG9uZW50SXRlbSgpOiBDb21wb25lbnRJdGVtIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudEl0ZW07IH1cclxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChUYWI6Y2xhc3MpLmNvbXBvbmVudEl0ZW19ICovXHJcbiAgICBnZXQgY29udGVudEl0ZW0oKTogQ29tcG9uZW50SXRlbSB7IHJldHVybiB0aGlzLl9jb21wb25lbnRJdGVtOyB9XHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcbiAgICBnZXQgdGl0bGVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX3RpdGxlRWxlbWVudDsgfVxyXG4gICAgZ2V0IGNsb3NlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9jbG9zZUVsZW1lbnQ7IH1cclxuICAgIGdldCByZW9yZGVyRW5hYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2RyYWdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkOyB9XHJcbiAgICBzZXQgcmVvcmRlckVuYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMucmVvcmRlckVuYWJsZWQpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVJlb3JkZXIoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZVJlb3JkZXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY2xvc2VFdmVudDogVGFiLkNsb3NlRXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2ZvY3VzRXZlbnQ6IFRhYi5Gb2N1c0V2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9kcmFnU3RhcnRFdmVudDogVGFiLkRyYWdTdGFydEV2ZW50IHwgdW5kZWZpbmVkXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGFiKTtcclxuICAgICAgICB0aGlzLl90aXRsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IFxyXG4gICAgICAgIHRoaXMuX3RpdGxlRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGl0bGUpO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBcclxuICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNsb3NlVGFiKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RpdGxlRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jbG9zZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAoX2NvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNsb3NhYmxlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGl0bGUoX2NvbXBvbmVudEl0ZW0udGl0bGUpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0ub24oJ3RpdGxlQ2hhbmdlZCcsIHRoaXMuX3RhYlRpdGxlQ2hhbmdlZExpc3RlbmVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVvcmRlckVuYWJsZWQgPSBfY29tcG9uZW50SXRlbS5yZW9yZGVyRW5hYmxlZCA/PyB0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy5yZW9yZGVyRW5hYmxlZDtcclxuXHJcbiAgICAgICAgaWYgKHJlb3JkZXJFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUmVvcmRlcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX3RhYkNsaWNrTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90YWJUb3VjaFN0YXJ0TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9jbG9zZUNsaWNrTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9jbG9zZVRvdWNoU3RhcnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAvLyB0aGlzLl9jbG9zZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fY2xvc2VNb3VzZURvd25MaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5zZXRUYWIodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5lbWl0KCd0YWJDcmVhdGVkJywgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0YWIncyB0aXRsZSB0byB0aGUgcHJvdmlkZWQgc3RyaW5nIGFuZCBzZXRzXHJcbiAgICAgKiBpdHMgdGl0bGUgYXR0cmlidXRlIHRvIGEgcHVyZSB0ZXh0IHJlcHJlc2VudGF0aW9uICh3aXRob3V0XHJcbiAgICAgKiBodG1sIHRhZ3MpIG9mIHRoZSBzYW1lIHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgc2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RpdGxlRWxlbWVudC5pbm5lclRleHQgPSB0aXRsZTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnRpdGxlID0gdGl0bGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgdGFiJ3MgYWN0aXZlIHN0YXRlLiBUbyBwcm9ncmFtbWF0aWNhbGx5XHJcbiAgICAgKiBzd2l0Y2ggdGFicywgdXNlIFN0YWNrLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oIGl0ZW0gKSBpbnN0ZWFkLlxyXG4gICAgICovXHJcbiAgICBzZXRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAoaXNBY3RpdmUgPT09IHRoaXMuX2lzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNBY3RpdmUgPSBpc0FjdGl2ZTtcclxuXHJcbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkFjdGl2ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQWN0aXZlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGUgdGFiXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jbG9zZUV2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX2ZvY3VzRXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX3RhYkNsaWNrTGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX3RhYlRvdWNoU3RhcnRMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2Nsb3NlQ2xpY2tMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fY2xvc2VUb3VjaFN0YXJ0TGlzdGVuZXIpO1xyXG4gICAgICAgIC8vIHRoaXMuX2Nsb3NlRWxlbWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fY2xvc2VNb3VzZURvd25MaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5vZmYoJ3RpdGxlQ2hhbmdlZCcsIHRoaXMuX3RhYlRpdGxlQ2hhbmdlZExpc3RlbmVyKTtcclxuICAgICAgICBpZiAodGhpcy5yZW9yZGVyRW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVSZW9yZGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0Qmx1cnJlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Gb2N1c2VkKTtcclxuICAgICAgICB0aGlzLl90aXRsZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldEZvY3VzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRm9jdXNlZCk7XHJcbiAgICAgICAgdGhpcy5fdGl0bGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Gb2N1c2VkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIGZvciB0aGUgRHJhZ0xpc3RlbmVyXHJcbiAgICAgKiBAcGFyYW0geCAtIFRoZSB0YWJzIGFic29sdXRlIHggcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB5IC0gVGhlIHRhYnMgYWJzb2x1dGUgeSBwb3NpdGlvblxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25EcmFnU3RhcnQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fZHJhZ0xpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignVE9EU0RMVTEwMDkzJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RyYWdTdGFydEV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1RPRFMyMzMwOScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0RXZlbnQoeCwgeSwgdGhpcy5fZHJhZ0xpc3RlbmVyLCB0aGlzLmNvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIG9uQ29udGVudEl0ZW1EZXN0cm95KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgd2hlbiB0aGUgdGFiIGlzIGNsaWNrZWRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uVGFiQ2xpY2tEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgIGlmICh0YXJnZXQgPT09IHRoaXMuX2VsZW1lbnQgfHwgdGFyZ2V0ID09PSB0aGlzLl90aXRsZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgLy8gbGVmdCBtb3VzZSBidXR0b25cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gbWlkZGxlIG1vdXNlIGJ1dHRvblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMSAmJiB0aGlzLl9jb21wb25lbnRJdGVtLmlzQ2xvc2FibGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgb25UYWJUb3VjaFN0YXJ0KGV2ZW50OiBUb3VjaEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgd2hlbiB0aGUgdGFiJ3MgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uQ2xvc2VDbGljaygpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeUNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBvbkNsb3NlVG91Y2hTdGFydCgpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeUNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB0byBjYXB0dXJlIHRhYiBjbG9zZSBidXR0b24gbW91c2Vkb3duXHJcbiAgICAgKiB0byBwcmV2ZW50IHRhYiBmcm9tIGFjdGl2YXRpbmcuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBvbkNsb3NlTW91c2Vkb3duKCk6IHZvaWQge1xyXG4gICAgLy8gICAgIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5Q2xvc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Nsb3NlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdUTkMxNTAwNycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRXZlbnQodGhpcy5fY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5Rm9jdXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZvY3VzRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdUTkExNTAwNycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzRXZlbnQodGhpcy5fY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW5hYmxlUmVvcmRlcigpIHtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBuZXcgRHJhZ0xpc3RlbmVyKHRoaXMuX2VsZW1lbnQsIFt0aGlzLl90aXRsZUVsZW1lbnRdKTtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIub24oJ2RyYWdTdGFydCcsIHRoaXMuX2RyYWdTdGFydExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLm9uKCdkZXN0cm95JywgdGhpcy5fY29udGVudEl0ZW1EZXN0cm95TGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZGlzYWJsZVJlb3JkZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1REUjg3NzQ1Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5vZmYoJ2Rlc3Ryb3knLCB0aGlzLl9jb250ZW50SXRlbURlc3Ryb3lMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5vZmYoJ2RyYWdTdGFydCcsIHRoaXMuX2RyYWdTdGFydExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBUYWIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2xvc2VFdmVudCA9IChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgRm9jdXNFdmVudCA9IChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgRHJhZ1N0YXJ0RXZlbnQgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG59XHJcbiIsImltcG9ydCB7IEFzc2VydEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBudW1iZXJUb1BpeGVscywgcGl4ZWxzVG9OdW1iZXIgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4vdGFiJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFRhYnNDb250YWluZXIge1xyXG4gICAgLy8gVGhlcmUgaXMgb25lIHRhYiBwZXIgQ29tcG9uZW50SXRlbSBpbiBzdGFjay4gIEhvd2V2ZXIgdGhleSBtYXkgbm90IGJlIG9yZGVyZWQgdGhlIHNhbWVcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYnM6IFRhYltdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZHJvcGRvd25FbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfbGFzdFZpc2libGVUYWJJbmRleCA9IC0xO1xyXG4gICAgcHJpdmF0ZSBfZHJvcGRvd25BY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgdGFicygpOiBUYWJbXSB7IHJldHVybiB0aGlzLl90YWJzOyB9XHJcbiAgICBnZXQgdGFiQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3RhYnMubGVuZ3RoOyB9XHJcbiAgICBnZXQgbGFzdFZpc2libGVUYWJJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fbGFzdFZpc2libGVUYWJJbmRleDsgfVxyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuICAgIGdldCBkcm9wZG93bkVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZHJvcGRvd25FbGVtZW50OyB9XHJcbiAgICBnZXQgZHJvcGRvd25BY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9kcm9wZG93bkFjdGl2ZTsgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50UmVtb3ZlRXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbVJlbW92ZUV2ZW50LFxyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudEZvY3VzRXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbUZvY3VzRXZlbnQsXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbURyYWdTdGFydEV2ZW50LFxyXG4gICAgICAgIHByaXZhdGUgX2Ryb3Bkb3duQWN0aXZlQ2hhbmdlZEV2ZW50OiBUYWJzQ29udGFpbmVyLkRyb3Bkb3duQWN0aXZlQ2hhbmdlZEV2ZW50LFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWJzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJvcGRvd25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xyXG4gICAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGFiRHJvcGRvd25MaXN0KTtcclxuICAgICAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdGFicy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJzW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYiBhbmQgYXNzb2NpYXRlcyBpdCB3aXRoIGEgY29udGVudEl0ZW1cclxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGFiXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVRhYihjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgLy9JZiB0aGVyZSdzIGFscmVhZHkgYSB0YWIgcmVsYXRpbmcgdG8gdGhlXHJcbiAgICAgICAgLy9jb250ZW50IGl0ZW0sIGRvbid0IGRvIGFueXRoaW5nXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90YWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90YWJzW2ldLmNvbXBvbmVudEl0ZW0gPT09IGNvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGFiID0gbmV3IFRhYih0aGlzLl9sYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgICAgICBjb21wb25lbnRJdGVtLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJDbG9zZUV2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJGb2N1c0V2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoeCwgeSwgZHJhZ0xpc3RlbmVyLCBpdGVtKSA9PiB0aGlzLmhhbmRsZVRhYkRyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgaXRlbSkpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuX3RhYnMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdGFicy5zcGxpY2UoaW5kZXgsIDAsIHRhYik7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2VsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5pbnNlcnRCZWZvcmUodGFiLmVsZW1lbnQsIHRoaXMuX2VsZW1lbnQuY2hpbGROb2Rlc1tpbmRleF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVUYWIoY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIC8vIGNvbXBvbmVudEl0ZW0gY2Fubm90IGJlIEFjdGl2ZUNvbXBvbmVudEl0ZW1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3RhYnNbaV0uY29tcG9uZW50SXRlbSA9PT0gY29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiID0gdGhpcy5fdGFic1tpXTtcclxuICAgICAgICAgICAgICAgIHRhYi5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90YWJzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb250ZW50SXRlbSBpcyBub3QgY29udHJvbGxlZCBieSB0aGlzIGhlYWRlcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NBY3RpdmVDb21wb25lbnRDaGFuZ2VkKG5ld0FjdGl2ZUNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBsZXQgYWN0aXZlSW5kZXggPSAtMTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXNBY3RpdmUgPSB0aGlzLl90YWJzW2ldLmNvbXBvbmVudEl0ZW0gPT09IG5ld0FjdGl2ZUNvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYnNbaV0uc2V0QWN0aXZlKGlzQWN0aXZlKTtcclxuICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmVJbmRleCA9IGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmVJbmRleCA8IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdIU0FDSTU2NjMyJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnJlb3JkZXJPblRhYk1lbnVDbGljaykge1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBJZiB0aGUgdGFiIHNlbGVjdGVkIHdhcyBpbiB0aGUgZHJvcGRvd24sIG1vdmUgZXZlcnl0aGluZyBkb3duIG9uZSB0byBtYWtlIHdheSBmb3IgdGhpcyBvbmUgdG8gYmUgdGhlIGZpcnN0LlxyXG4gICAgICAgICAgICAgICAgICogVGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGUgbW9zdCB1c2VkIHRhYnMgc3RheSB2aXNpYmxlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGFzdFZpc2libGVUYWJJbmRleCAhPT0gLTEgJiYgYWN0aXZlSW5kZXggPiB0aGlzLl9sYXN0VmlzaWJsZVRhYkluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlVGFiID0gdGhpcy5fdGFic1thY3RpdmVJbmRleF07XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGFjdGl2ZUluZGV4OyBqID4gMDsgai0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhYnNbal0gPSB0aGlzLl90YWJzW2ogLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFic1swXSA9IGFjdGl2ZVRhYjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlVGFiU2l6ZXMgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGFmdGVyIHRoaXMgYW5kIGl0IHdpbGwgcmVwb3NpdGlvbiB0YWIgZWxlbWVudHNcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFB1c2hlcyB0aGUgdGFicyB0byB0aGUgdGFiIGRyb3Bkb3duIGlmIHRoZSBhdmFpbGFibGUgc3BhY2UgaXMgbm90IHN1ZmZpY2llbnRcclxuICAgICAqL1xyXG4gICAgdXBkYXRlVGFiU2l6ZXMoYXZhaWxhYmxlV2lkdGg6IG51bWJlciwgYWN0aXZlQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIGxldCBkcm9wRG93bkFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLnRyeVVwZGF0ZVRhYlNpemVzKGRyb3BEb3duQWN0aXZlLCBhdmFpbGFibGVXaWR0aCwgYWN0aXZlQ29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIGRyb3BEb3duQWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkXHJcbiAgICAgICAgICAgIHRoaXMudHJ5VXBkYXRlVGFiU2l6ZXMoZHJvcERvd25BY3RpdmUsIGF2YWlsYWJsZVdpZHRoLCBhY3RpdmVDb21wb25lbnRJdGVtKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRyb3BEb3duQWN0aXZlICE9PSB0aGlzLl9kcm9wZG93bkFjdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcm9wZG93bkFjdGl2ZSA9IGRyb3BEb3duQWN0aXZlO1xyXG4gICAgICAgICAgICB0aGlzLl9kcm9wZG93bkFjdGl2ZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0cnlVcGRhdGVUYWJTaXplcyhkcm9wZG93bkFjdGl2ZTogYm9vbGVhbiwgYXZhaWxhYmxlV2lkdGg6IG51bWJlciwgYWN0aXZlQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLl90YWJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKGFjdGl2ZUNvbXBvbmVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub24tZW1wdHkgdGFicyBtdXN0IGhhdmUgYWN0aXZlIGNvbXBvbmVudCBpdGVtJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBjdW11bGF0aXZlVGFiV2lkdGggPSAwO1xyXG4gICAgICAgICAgICBsZXQgdGFiT3ZlcmxhcEFsbG93YW5jZUV4Y2VlZGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYk92ZXJsYXBBbGxvd2FuY2UgPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy50YWJPdmVybGFwQWxsb3dhbmNlO1xyXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuX3RhYnMuaW5kZXhPZihhY3RpdmVDb21wb25lbnRJdGVtLnRhYik7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVRhYiA9IHRoaXMuX3RhYnNbYWN0aXZlSW5kZXhdO1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0VmlzaWJsZVRhYkluZGV4ID0gLTE7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYkVsZW1lbnQgPSB0aGlzLl90YWJzW2ldLmVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9QdXQgdGhlIHRhYiBpbiB0aGUgdGFiQ29udGFpbmVyIHNvIGl0cyB0cnVlIHdpZHRoIGNhbiBiZSBjaGVja2VkXHJcbiAgICAgICAgICAgICAgICBpZiAodGFiRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0YWJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYk1hcmdpblJpZ2h0UGl4ZWxzID0gZ2V0Q29tcHV0ZWRTdHlsZShhY3RpdmVUYWIuZWxlbWVudCkubWFyZ2luUmlnaHQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJNYXJnaW5SaWdodCA9IHBpeGVsc1RvTnVtYmVyKHRhYk1hcmdpblJpZ2h0UGl4ZWxzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYldpZHRoID0gdGFiRWxlbWVudC5vZmZzZXRXaWR0aCArIHRhYk1hcmdpblJpZ2h0O1xyXG5cclxuICAgICAgICAgICAgICAgIGN1bXVsYXRpdmVUYWJXaWR0aCArPSB0YWJXaWR0aDtcclxuXHJcbiAgICAgICAgICAgICAgICAvL0luY2x1ZGUgdGhlIGFjdGl2ZSB0YWIncyB3aWR0aCBpZiBpdCBpc24ndCBhbHJlYWR5XHJcbiAgICAgICAgICAgICAgICAvL1RoaXMgaXMgdG8gZW5zdXJlIHRoZXJlIGlzIHJvb20gdG8gc2hvdyB0aGUgYWN0aXZlIHRhYlxyXG4gICAgICAgICAgICAgICAgbGV0IHZpc2libGVUYWJXaWR0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlSW5kZXggPD0gaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGVUYWJXaWR0aCA9IGN1bXVsYXRpdmVUYWJXaWR0aDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlVGFiTWFyZ2luUmlnaHRQaXhlbHMgPSBnZXRDb21wdXRlZFN0eWxlKGFjdGl2ZVRhYi5lbGVtZW50KS5tYXJnaW5SaWdodDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVUYWJNYXJnaW5SaWdodCA9IHBpeGVsc1RvTnVtYmVyKGFjdGl2ZVRhYk1hcmdpblJpZ2h0UGl4ZWxzKTtcclxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlVGFiV2lkdGggPSBjdW11bGF0aXZlVGFiV2lkdGggKyBhY3RpdmVUYWIuZWxlbWVudC5vZmZzZXRXaWR0aCArIGFjdGl2ZVRhYk1hcmdpblJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0YWJzIHdvbid0IGZpdCwgY2hlY2sgdGhlIG92ZXJsYXAgYWxsb3dhbmNlLlxyXG4gICAgICAgICAgICAgICAgaWYgKHZpc2libGVUYWJXaWR0aCA+IGF2YWlsYWJsZVdpZHRoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vT25jZSBhbGxvd2FuY2UgaXMgZXhjZWVkZWQsIGFsbCByZW1haW5pbmcgdGFicyBnbyB0byBtZW51LlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFiT3ZlcmxhcEFsbG93YW5jZUV4Y2VlZGVkKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL05vIG92ZXJsYXAgZm9yIGZpcnN0IHRhYiBvciBhY3RpdmUgdGFiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vT3ZlcmxhcCBzcHJlYWRzIGFtb25nIG5vbi1hY3RpdmUsIG5vbi1maXJzdCB0YWJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvdmVybGFwOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVJbmRleCA+IDAgJiYgYWN0aXZlSW5kZXggPD0gaSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcCA9ICh2aXNpYmxlVGFiV2lkdGggLSBhdmFpbGFibGVXaWR0aCkgLyAoaSAtIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcCA9ICh2aXNpYmxlVGFiV2lkdGggLSBhdmFpbGFibGVXaWR0aCkgLyBpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIG92ZXJsYXAgYWdhaW5zdCBhbGxvd2FuY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdmVybGFwIDwgdGFiT3ZlcmxhcEFsbG93YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPD0gaTsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFyZ2luTGVmdCA9IChqICE9PSBhY3RpdmVJbmRleCAmJiBqICE9PSAwKSA/ICctJyArIG51bWJlclRvUGl4ZWxzKG92ZXJsYXApIDogJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFic1tqXS5lbGVtZW50LnN0eWxlLnpJbmRleCA9IG51bWJlclRvUGl4ZWxzKGkgLSBqKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90YWJzW2pdLmVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9IG1hcmdpbkxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0VmlzaWJsZVRhYkluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRhYkVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiT3ZlcmxhcEFsbG93YW5jZUV4Y2VlZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IGFjdGl2ZUluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQWN0aXZlIHRhYiBzaG91bGQgc2hvdyBldmVuIGlmIGFsbG93YW5jZSBleGNlZWRlZC4gKFdlIGxlZnQgcm9vbS4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQuc3R5bGUuekluZGV4ID0gJ2F1dG8nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYkVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0YWJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhYk92ZXJsYXBBbGxvd2FuY2VFeGNlZWRlZCAmJiBpICE9PSBhY3RpdmVJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcGRvd25BY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGFiIG1lbnUgYWxyZWFkeSBzaG93biwgc28gd2UganVzdCBhZGQgdG8gaXQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLnpJbmRleCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9ICcnO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IHRoaXMuX2Ryb3Bkb3duRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5hcHBlbmRDaGlsZCh0YWJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vV2Ugbm93IGtub3cgdGhlIHRhYiBtZW51IG11c3QgYmUgc2hvd24sIHNvIHdlIGhhdmUgdG8gcmVjYWxjdWxhdGUgZXZlcnl0aGluZy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RWaXNpYmxlVGFiSW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQuc3R5bGUuekluZGV4ID0gJ2F1dG8nO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWJFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0YWJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvd3MgZHJvcCBkb3duIGZvciBhZGRpdGlvbmFsIHRhYnMgd2hlbiB0aGVyZSBhcmUgdG9vIG1hbnkgdG8gZGlzcGxheS5cclxuICAgICAqL1xyXG4gICAgc2hvd0FkZGl0aW9uYWxUYWJzRHJvcGRvd24oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZHJvcGRvd25FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhpZGVzIGRyb3AgZG93biBmb3IgYWRkaXRpb25hbCB0YWJzIHdoZW4gdGhlcmUgYXJlIHRvbyBtYW55IHRvIGRpc3BsYXkuXHJcbiAgICAgKi9cclxuICAgIGhpZGVBZGRpdGlvbmFsVGFic0Ryb3Bkb3duKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlVGFiQ2xvc2VFdmVudChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQoY29tcG9uZW50SXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVUYWJGb2N1c0V2ZW50KGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRGb2N1c0V2ZW50KGNvbXBvbmVudEl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlVGFiRHJhZ1N0YXJ0RXZlbnQoeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQoeCwgeSwgZHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBUYWJzQ29udGFpbmVyIHtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudEl0ZW1SZW1vdmVFdmVudCA9ICh0aGlzOiB2b2lkLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50SXRlbUZvY3VzRXZlbnQgPSAodGhpczogdm9pZCwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkgPT4gdm9pZDtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudEl0ZW1EcmFnU3RhcnRFdmVudCA9ICh0aGlzOiB2b2lkLCB4OiBudW1iZXIsIHk6IG51bWJlciwgZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBEcm9wZG93bkFjdGl2ZUNoYW5nZWRFdmVudCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG59XHJcbiIsImltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBSZWN0IH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkICovXHJcbmV4cG9ydCBjbGFzcyBUcmFuc2l0aW9uSW5kaWNhdG9yIHtcclxuICAgIHByaXZhdGUgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfdG9FbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAgICBwcml2YXRlIF9mcm9tRGltZW5zaW9uczogbnVsbDtcclxuICAgIHByaXZhdGUgX3RvdGFsQW5pbWF0aW9uRHVyYXRpb246IG51bWJlcjtcclxuICAgIHByaXZhdGUgX2FuaW1hdGlvblN0YXJ0VGltZTogbnVtYmVyIHwgbnVsbDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVHJhbnNpdGlvbkluZGljYXRvcik7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5fdG9FbGVtZW50ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9mcm9tRGltZW5zaW9ucyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fdG90YWxBbmltYXRpb25EdXJhdGlvbiA9IDIwMDtcclxuICAgICAgICB0aGlzLl9hbmltYXRpb25TdGFydFRpbWUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICB0cmFuc2l0aW9uRWxlbWVudHMoZnJvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0b0VsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVE9ETyAtIFRoaXMgaXMgbm90IHF1aXRlIGFzIGNvb2wgYXMgZXhwZWN0ZWQuIFJldmlldy5cclxuICAgICAgICAgKi9cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gdGhpcy5fdG9FbGVtZW50ID0gdG9FbGVtZW50O1xyXG4gICAgICAgIC8vIHRoaXMuX2FuaW1hdGlvblN0YXJ0VGltZSA9IG5vdygpO1xyXG4gICAgICAgIC8vIHRoaXMuX2Zyb21EaW1lbnNpb25zID0gdGhpcy5fbWVhc3VyZShmcm9tRWxlbWVudCk7XHJcbiAgICAgICAgLy8gdGhpcy5fZnJvbURpbWVuc2lvbnMub3BhY2l0eSA9IDAuODtcclxuICAgICAgICAvLyB0aGlzLl9lbGVtZW50LnNob3coKS5jc3ModGhpcy5fZnJvbURpbWVuc2lvbnMpO1xyXG4gICAgICAgIC8vIGFuaW1GcmFtZShmbkJpbmQodGhpcy5fbmV4dEFuaW1hdGlvbkZyYW1lLCB0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBuZXh0QW5pbWF0aW9uRnJhbWUoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuX3RvRWxlbWVudCA9PT0gbnVsbCB8fCB0aGlzLl9mcm9tRGltZW5zaW9ucyA9PT0gbnVsbCB8fCB0aGlzLl9hbmltYXRpb25TdGFydFRpbWUgPT09IG51bGwpIHtcclxuICAgICAgICAvLyAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1RJTkFGVEQ5NzExNScpO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHRvRGltZW5zaW9ucyA9IHRoaXMubWVhc3VyZSh0aGlzLl90b0VsZW1lbnQpO1xyXG4gICAgICAgIC8vICAgICBjb25zdCBhbmltYXRpb25Qcm9ncmVzcyA9IChub3coKSAtIHRoaXMuX2FuaW1hdGlvblN0YXJ0VGltZSkgLyB0aGlzLl90b3RhbEFuaW1hdGlvbkR1cmF0aW9uO1xyXG4gICAgICAgIC8vICAgICBjb25zdCBjdXJyZW50RnJhbWVTdHlsZXMgPSB7fTtcclxuICAgICAgICAvLyAgICAgY29uc3QgY3NzUHJvcGVydHk7XHJcblxyXG4gICAgICAgIC8vICAgICBpZiAoYW5pbWF0aW9uUHJvZ3Jlc3MgPj0gMSkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICB0b0RpbWVuc2lvbnMub3BhY2l0eSA9IDA7XHJcblxyXG4gICAgICAgIC8vICAgICBmb3IgKGNvbnN0IGNzc1Byb3BlcnR5IGluIHRoaXMuX2Zyb21EaW1lbnNpb25zKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBjdXJyZW50RnJhbWVTdHlsZXNbY3NzUHJvcGVydHldID0gdGhpcy5fZnJvbURpbWVuc2lvbnNbY3NzUHJvcGVydHldICtcclxuICAgICAgICAvLyAgICAgICAgICAgICAodG9EaW1lbnNpb25zW2Nzc1Byb3BlcnR5XSAtIHRoaXMuX2Zyb21EaW1lbnNpb25zW2Nzc1Byb3BlcnR5XSkgKlxyXG4gICAgICAgIC8vICAgICAgICAgICAgIGFuaW1hdGlvblByb2dyZXNzO1xyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICB0aGlzLl9lbGVtZW50LmNzcyhjdXJyZW50RnJhbWVTdHlsZXMpO1xyXG4gICAgICAgIC8vICAgICBhbmltRnJhbWUoZm5CaW5kKHRoaXMuX25leHRBbmltYXRpb25GcmFtZSwgdGhpcykpO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1lYXN1cmUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBSZWN0IHtcclxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0LFxyXG4gICAgICAgICAgICB0b3A6IHJlY3QudG9wLFxyXG4gICAgICAgICAgICB3aWR0aDogZWxlbWVudC5vZmZzZXRXaWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBlbGVtZW50Lm9mZnNldEhlaWdodCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiIsIi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFeHRlcm5hbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBFeHRlcm5hbEVycm9yIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IG5vZGU/OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignQ29uZmlndXJhdGlvbicsIG1lc3NhZ2UpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgUG9wb3V0QmxvY2tlZEVycm9yIGV4dGVuZHMgRXh0ZXJuYWxFcnJvciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignUG9wb3V0QmxvY2tlZCcsIG1lc3NhZ2UpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgQXBpRXJyb3IgZXh0ZW5kcyBFeHRlcm5hbEVycm9yIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCdBUEknLCBtZXNzYWdlKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIEJpbmRFcnJvciBleHRlbmRzIEV4dGVybmFsRXJyb3Ige1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ0JpbmQnLCBtZXNzYWdlKTtcclxuICAgIH1cclxufVxyXG4iLCIvKiogQGludGVybmFsICovXHJcbmFic3RyYWN0IGNsYXNzIEludGVybmFsRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGAke3R5cGV9OiAke2NvZGV9JHttZXNzYWdlID09PSB1bmRlZmluZWQgPyAnJyA6ICc6ICcgKyBtZXNzYWdlfWApXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIEFzc2VydEVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb2RlOiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignQXNzZXJ0JywgY29kZSwgbWVzc2FnZSlcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgVW5yZWFjaGFibGVDYXNlRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKGNvZGU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogbmV2ZXIsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignVW5yZWFjaGFibGVDYXNlJywgY29kZSwgYCR7dmFyaWFibGVWYWx1ZX0ke21lc3NhZ2UgPT09IHVuZGVmaW5lZCA/ICcnIDogJzogJyArIG1lc3NhZ2V9YClcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgVW5leHBlY3RlZE51bGxFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoY29kZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ1VuZXhwZWN0ZWROdWxsJywgY29kZSwgbWVzc2FnZSlcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb2RlOiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignVW5leHBlY3RlZFVuZGVmaW5lZCcsIGNvZGUsIG1lc3NhZ2UpXHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgTGF5b3V0Q29uZmlnIH0gZnJvbSAnLi9jb25maWcvY29uZmlnJztcclxuaW1wb3J0IHsgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIH0gZnJvbSAnLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnLi9jb250YWluZXIvY29tcG9uZW50LWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IEFwaUVycm9yLCBCaW5kRXJyb3IgfSBmcm9tICcuL2Vycm9ycy9leHRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IEFzc2VydEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IEkxOG5TdHJpbmdJZCwgaTE4blN0cmluZ3MgfSBmcm9tICcuL3V0aWxzL2kxOG4tc3RyaW5ncyc7XHJcbmltcG9ydCB7IEpzb25WYWx1ZSwgTG9naWNhbFpJbmRleCB9IGZyb20gJy4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBkZWVwRXh0ZW5kVmFsdWUsIGVuc3VyZUVsZW1lbnRQb3NpdGlvbkFic29sdXRlLCBudW1iZXJUb1BpeGVscywgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5LCBzZXRFbGVtZW50SGVpZ2h0LCBzZXRFbGVtZW50V2lkdGggfSBmcm9tICcuL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgVmlydHVhbExheW91dCB9IGZyb20gJy4vdmlydHVhbC1sYXlvdXQnO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIEdvbGRlbkxheW91dCBleHRlbmRzIFZpcnR1YWxMYXlvdXQge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29tcG9uZW50VHlwZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgR29sZGVuTGF5b3V0LkNvbXBvbmVudEluc3RhbnRpYXRvcj4oKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuOiBHb2xkZW5MYXlvdXQuR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFjaztcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9yZWdpc3RlcmVkQ29tcG9uZW50TWFwID0gbmV3IE1hcDxDb21wb25lbnRDb250YWluZXIsIENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQ+KCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF92aXJ0dWFibGVDb21wb25lbnRNYXAgPSBuZXcgTWFwPENvbXBvbmVudENvbnRhaW5lciwgR29sZGVuTGF5b3V0LlZpcnR1YWJsZUNvbXBvbmVudD4oKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2dvbGRlbkxheW91dEJvdW5kaW5nQ2xpZW50UmVjdDogRE9NUmVjdDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb250YWluZXJWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnRMaXN0ZW5lciA9XHJcbiAgICAgICAgKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4gdGhpcy5oYW5kbGVDb250YWluZXJWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQoY29udGFpbmVyLCB3aWR0aCwgaGVpZ2h0KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbnRhaW5lclZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudExpc3RlbmVyID1cclxuICAgICAgICAoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHZpc2libGU6IGJvb2xlYW4pID0+IHRoaXMuaGFuZGxlQ29udGFpbmVyVmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50KGNvbnRhaW5lciwgdmlzaWJsZSk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb250YWluZXJWaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudExpc3RlbmVyID1cclxuICAgICAgICAoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIGxvZ2ljYWxaSW5kZXg6IExvZ2ljYWxaSW5kZXgsIGRlZmF1bHRaSW5kZXg6IHN0cmluZykgPT5cclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVDb250YWluZXJWaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudChjb250YWluZXIsIGxvZ2ljYWxaSW5kZXgsIGRlZmF1bHRaSW5kZXgpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGNvbnRhaW5lciAtIEEgRG9tIEhUTUwgZWxlbWVudC4gRGVmYXVsdHMgdG8gYm9keVxyXG4gICAgICogQHBhcmFtIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIHRvIGJpbmQgY29tcG9uZW50c1xyXG4gICAgICogQHBhcmFtIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIHRvIHVuYmluZCBjb21wb25lbnRzXHJcbiAgICAgKiBJZiBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIGlzIGRlZmluZWQsIHRoZW4gY29uc3RydWN0b3Igd2lsbCBiZSBkZXRlcm1pbmF0ZS4gSXQgd2lsbCBhbHdheXMgY2FsbCB0aGUgaW5pdCgpXHJcbiAgICAgKiBmdW5jdGlvbiBhbmQgdGhlIGluaXQoKSBmdW5jdGlvbiB3aWxsIGFsd2F5cyBjb21wbGV0ZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIHdpbGwgYmUgY2FsbGVkXHJcbiAgICAgKiBpZiBjb25zdHJ1Y3RvciBpcyBmb3IgYSBwb3BvdXQgd2luZG93LiBNYWtlIHN1cmUgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciBpcyByZWFkeSBmb3IgZXZlbnRzLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBjb250YWluZXI/OiBIVE1MRWxlbWVudCxcclxuICAgICAgICBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IFZpcnR1YWxMYXlvdXQuVW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLFxyXG4gICAgKTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBzcGVjaWZ5IGxheW91dENvbmZpZyBpbiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLmxvYWRMYXlvdXR9ICovXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExheW91dENvbmZpZywgY29udGFpbmVyPzogSFRNTEVsZW1lbnQpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lcjogTGF5b3V0Q29uZmlnIHwgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogSFRNTEVsZW1lbnQgfCBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgdW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihjb25maWdPck9wdGlvbmFsQ29udGFpbmVyLCBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsIHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciwgdHJ1ZSk7XHJcbiAgICAgICAgLy8gd2UgdG9sZCBWaXJ0dWFsTGF5b3V0IHRvIG5vdCBjYWxsIGluaXQoKSAoc2tpcEluaXQgc2V0IHRvIHRydWUpIHNvIHRoYXQgR29sZGVuIExheW91dCBjYW4gaW5pdGlhbGlzZSBpdHMgcHJvcGVydGllcyBiZWZvcmUgaW5pdCBpcyBjYWxsZWRcclxuICAgICAgICBpZiAoIXRoaXMuZGVwcmVjYXRlZENvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgbmV3IGNvbXBvbmVudCB0eXBlIHdpdGggdGhlIGxheW91dCBtYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBkZXByZWNhdGVkIFNlZSB7QGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDA5MjI1MzEvaG93LXRvLWNoZWNrLWlmLWEtamF2YXNjcmlwdC1mdW5jdGlvbi1pcy1hLWNvbnN0cnVjdG9yfVxyXG4gICAgICogaW5zdGVhZCB1c2Uge0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyQ29tcG9uZW50Q29uc3RydWN0b3J9XHJcbiAgICAgKiBvciB7QGxpbmsgKEdvbGRlbkxheW91dDpjbGFzcykucmVnaXN0ZXJDb21wb25lbnRGYWN0b3J5RnVuY3Rpb259XHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyQ29tcG9uZW50KG5hbWU6IHN0cmluZyxcclxuICAgICAgICBjb21wb25lbnRDb25zdHJ1Y3Rvck9yRmFjdG9yeUZ0bjogR29sZGVuTGF5b3V0LkNvbXBvbmVudENvbnN0cnVjdG9yIHwgR29sZGVuTGF5b3V0LkNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbixcclxuICAgICAgICB2aXJ0dWFsID0gZmFsc2VcclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50Q29uc3RydWN0b3JPckZhY3RvcnlGdG4gIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFwaUVycm9yKCdyZWdpc3RlckNvbXBvbmVudCgpIGNvbXBvbmVudENvbnN0cnVjdG9yT3JGYWN0b3J5RnRuIHBhcmFtZXRlciBpcyBub3QgYSBmdW5jdGlvbicpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudENvbnN0cnVjdG9yT3JGYWN0b3J5RnRuLmhhc093blByb3BlcnR5KCdwcm90b3R5cGUnKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Q29uc3RydWN0b3IgPSBjb21wb25lbnRDb25zdHJ1Y3Rvck9yRmFjdG9yeUZ0biBhcyBHb2xkZW5MYXlvdXQuQ29tcG9uZW50Q29uc3RydWN0b3I7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyQ29tcG9uZW50Q29uc3RydWN0b3IobmFtZSwgY29tcG9uZW50Q29uc3RydWN0b3IsIHZpcnR1YWwpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50RmFjdG9yeUZ0biA9IGNvbXBvbmVudENvbnN0cnVjdG9yT3JGYWN0b3J5RnRuIGFzIEdvbGRlbkxheW91dC5Db21wb25lbnRGYWN0b3J5RnVuY3Rpb247XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uKG5hbWUsIGNvbXBvbmVudEZhY3RvcnlGdG4sIHZpcnR1YWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgYSBuZXcgY29tcG9uZW50IHR5cGUgd2l0aCB0aGUgbGF5b3V0IG1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyQ29tcG9uZW50Q29uc3RydWN0b3IodHlwZU5hbWU6IHN0cmluZywgY29tcG9uZW50Q29uc3RydWN0b3I6IEdvbGRlbkxheW91dC5Db21wb25lbnRDb25zdHJ1Y3RvciwgdmlydHVhbCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnRDb25zdHJ1Y3RvciAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLlBsZWFzZVJlZ2lzdGVyQUNvbnN0cnVjdG9yRnVuY3Rpb25dKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29tcG9uZW50VHlwZSA9IHRoaXMuX2NvbXBvbmVudFR5cGVzTWFwLmdldCh0eXBlTmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChleGlzdGluZ0NvbXBvbmVudFR5cGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Db21wb25lbnRJc0FscmVhZHlSZWdpc3RlcmVkXX06ICR7dHlwZU5hbWV9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5zZXQodHlwZU5hbWUsIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBjb21wb25lbnRDb25zdHJ1Y3RvcixcclxuICAgICAgICAgICAgICAgIGZhY3RvcnlGdW5jdGlvbjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgdmlydHVhbCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciBhIG5ldyBjb21wb25lbnQgd2l0aCB0aGUgbGF5b3V0IG1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uKHR5cGVOYW1lOiBzdHJpbmcsIGNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbjogR29sZGVuTGF5b3V0LkNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbiwgdmlydHVhbCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnRGYWN0b3J5RnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcignUGxlYXNlIHJlZ2lzdGVyIGEgY29uc3RydWN0b3IgZnVuY3Rpb24nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29tcG9uZW50VHlwZSA9IHRoaXMuX2NvbXBvbmVudFR5cGVzTWFwLmdldCh0eXBlTmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChleGlzdGluZ0NvbXBvbmVudFR5cGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Db21wb25lbnRJc0FscmVhZHlSZWdpc3RlcmVkXX06ICR7dHlwZU5hbWV9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5zZXQodHlwZU5hbWUsIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICBmYWN0b3J5RnVuY3Rpb246IGNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbixcclxuICAgICAgICAgICAgICAgIHZpcnR1YWwsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgYSBjb21wb25lbnQgZnVuY3Rpb24gd2l0aCB0aGUgbGF5b3V0IG1hbmFnZXIuIFRoaXMgZnVuY3Rpb24gc2hvdWxkXHJcbiAgICAgKiByZXR1cm4gYSBjb25zdHJ1Y3RvciBmb3IgYSBjb21wb25lbnQgYmFzZWQgb24gYSBjb25maWcuXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGlmIGEgY29tcG9uZW50IHR5cGUgd2l0aCB0aGUgcmVxdWlyZWQgbmFtZSBpcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkLlxyXG4gICAgICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhcHBsaWNhdGlvbnMgdXNlIHRoZSB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmdldENvbXBvbmVudEV2ZW50fSBhbmRcclxuICAgICAqIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykucmVsZWFzZUNvbXBvbmVudEV2ZW50fSBpbnN0ZWFkIG9mIHJlZ2lzdGVyaW5nIGEgY29uc3RydWN0b3IgY2FsbGJhY2tcclxuICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKEdvbGRlbkxheW91dDpjbGFzcykucmVnaXN0ZXJHZXRDb21wb25lbnRDb25zdHJ1Y3RvckNhbGxiYWNrfVxyXG4gICAgICovXHJcbiAgICByZWdpc3RlckNvbXBvbmVudEZ1bmN0aW9uKGNhbGxiYWNrOiBHb2xkZW5MYXlvdXQuR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFjayk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJHZXRDb21wb25lbnRDb25zdHJ1Y3RvckNhbGxiYWNrKGNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgY2xvc3VyZSB3aXRoIHRoZSBsYXlvdXQgbWFuYWdlciB3aGljaCBzdXBwbGllcyBhIENvbXBvbmVudCBDb25zdHJ1Y3Rvci5cclxuICAgICAqIFRoaXMgY2FsbGJhY2sgc2hvdWxkIHJldHVybiBhIGNvbnN0cnVjdG9yIGZvciBhIGNvbXBvbmVudCBiYXNlZCBvbiBhIGNvbmZpZy5cclxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaWYgYSBjb21wb25lbnQgdHlwZSB3aXRoIHRoZSByZXF1aXJlZCBuYW1lIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQuXHJcbiAgICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFwcGxpY2F0aW9ucyB1c2UgdGhlIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykuZ2V0Q29tcG9uZW50RXZlbnR9IGFuZFxyXG4gICAgICoge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5yZWxlYXNlQ29tcG9uZW50RXZlbnR9IGluc3RlYWQgb2YgcmVnaXN0ZXJpbmcgYSBjb25zdHJ1Y3RvciBjYWxsYmFja1xyXG4gICAgICovXHJcbiAgICByZWdpc3RlckdldENvbXBvbmVudENvbnN0cnVjdG9yQ2FsbGJhY2soY2FsbGJhY2s6IEdvbGRlbkxheW91dC5HZXRDb21wb25lbnRDb25zdHJ1Y3RvckNhbGxiYWNrKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fZ2V0Q29tcG9uZW50Q29uc3RydWN0b3JGdG4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ011bHRpcGxlIGNvbXBvbmVudCBmdW5jdGlvbnMgYXJlIGJlaW5nIHJlZ2lzdGVyZWQuICBPbmx5IHRoZSBmaW5hbCByZWdpc3RlcmVkIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZC4nKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZ2V0Q29tcG9uZW50Q29uc3RydWN0b3JGdG4gPSBjYWxsYmFjaztcclxuICAgIH1cclxuXHJcbiAgICBnZXRSZWdpc3RlcmVkQ29tcG9uZW50VHlwZU5hbWVzKCk6IHN0cmluZ1tdIHtcclxuICAgICAgICBjb25zdCB0eXBlTmFtZXNJdGVyYWJsZUl0ZXJhdG9yID0gdGhpcy5fY29tcG9uZW50VHlwZXNNYXAua2V5cygpO1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHR5cGVOYW1lc0l0ZXJhYmxlSXRlcmF0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjb21wb25lbnQgaW5zdGFudGlhdG9yLiAgQXR0ZW1wdHMgdG8gdXRpbGl6ZSByZWdpc3RlcmVkXHJcbiAgICAgKiBjb21wb25lbnQgdHlwZSBieSBmaXJzdCwgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBjb21wb25lbnQgY29uc3RydWN0b3IgY2FsbGJhY2sgZnVuY3Rpb24gKGlmIHJlZ2lzdGVyZWQpLlxyXG4gICAgICogSWYgbmVpdGhlciBnZXRzIGFuIGluc3RhbnRpYXRvciwgdGhlbiByZXR1cm5zIGB1bmRlZmluZWRgLlxyXG4gICAgICogTm90ZSB0aGF0IGB1bmRlZmluZWRgIHdpbGwgcmV0dXJuIGlmIGNvbmZpZy5jb21wb25lbnRUeXBlIGlzIG5vdCBhIHN0cmluZ1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb25maWcgLSBUaGUgaXRlbSBjb25maWdcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZ2V0Q29tcG9uZW50SW5zdGFudGlhdG9yKGNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogR29sZGVuTGF5b3V0LkNvbXBvbmVudEluc3RhbnRpYXRvciB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgbGV0IGluc3RhbnRpYXRvcjogR29sZGVuTGF5b3V0LkNvbXBvbmVudEluc3RhbnRpYXRvciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgY29uc3QgdHlwZU5hbWUgPSBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcucmVzb2x2ZUNvbXBvbmVudFR5cGVOYW1lKGNvbmZpZylcclxuICAgICAgICBpZiAodHlwZU5hbWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpbnN0YW50aWF0b3IgPSB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5nZXQodHlwZU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaW5zdGFudGlhdG9yID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGluc3RhbnRpYXRvciA9IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogdGhpcy5fZ2V0Q29tcG9uZW50Q29uc3RydWN0b3JGdG4oY29uZmlnKSxcclxuICAgICAgICAgICAgICAgICAgICBmYWN0b3J5RnVuY3Rpb246IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBiaW5kQ29tcG9uZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBpdGVtQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiBDb21wb25lbnRDb250YWluZXIuQmluZGFibGVDb21wb25lbnQge1xyXG4gICAgICAgIGxldCBpbnN0YW50aWF0b3I6IEdvbGRlbkxheW91dC5Db21wb25lbnRJbnN0YW50aWF0b3IgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHR5cGVOYW1lID0gUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLnJlc29sdmVDb21wb25lbnRUeXBlTmFtZShpdGVtQ29uZmlnKTtcclxuICAgICAgICBpZiAodHlwZU5hbWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpbnN0YW50aWF0b3IgPSB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5nZXQodHlwZU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaW5zdGFudGlhdG9yID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGluc3RhbnRpYXRvciA9IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogdGhpcy5fZ2V0Q29tcG9uZW50Q29uc3RydWN0b3JGdG4oaXRlbUNvbmZpZyksXHJcbiAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUZ1bmN0aW9uOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdmlydHVhbDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ6IENvbXBvbmVudENvbnRhaW5lci5CaW5kYWJsZUNvbXBvbmVudDtcclxuICAgICAgICBpZiAoaW5zdGFudGlhdG9yICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgdmlydHVhbCA9IGluc3RhbnRpYXRvci52aXJ0dWFsO1xyXG4gICAgICAgICAgICAvLyBoYW5kbGUgY2FzZSB3aGVyZSBjb21wb25lbnQgaXMgb2J0YWluZWQgYnkgbmFtZSBvciBjb21wb25lbnQgY29uc3RydWN0b3IgY2FsbGJhY2tcclxuICAgICAgICAgICAgbGV0IGNvbXBvbmVudFN0YXRlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGlmIChpdGVtQ29uZmlnLmNvbXBvbmVudFN0YXRlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gbWFrZSBjb3B5XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRTdGF0ZSA9IGRlZXBFeHRlbmRWYWx1ZSh7fSwgaXRlbUNvbmZpZy5jb21wb25lbnRTdGF0ZSkgYXMgSnNvblZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY29tcG9uZW50OiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRDb25zdHJ1Y3RvciA9IGluc3RhbnRpYXRvci5jb25zdHJ1Y3RvcjtcclxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudENvbnN0cnVjdG9yICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IG5ldyBjb21wb25lbnRDb25zdHJ1Y3Rvcihjb250YWluZXIsIGNvbXBvbmVudFN0YXRlLCB2aXJ0dWFsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZhY3RvcnlGdW5jdGlvbiA9IGluc3RhbnRpYXRvci5mYWN0b3J5RnVuY3Rpb247XHJcbiAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeUZ1bmN0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBmYWN0b3J5RnVuY3Rpb24oY29udGFpbmVyLCBjb21wb25lbnRTdGF0ZSwgdmlydHVhbCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1CQ0ZGVTEwMDA4Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh2aXJ0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdHTEJDVkNVOTg4Nzc0Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpcnR1YWJsZUNvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBHb2xkZW5MYXlvdXQuVmlydHVhYmxlQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFJvb3RFbGVtZW50ID0gdmlydHVhYmxlQ29tcG9uZW50LnJvb3RIdG1sRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Um9vdEVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5WaXJ0dWFsQ29tcG9uZW50RG9lc05vdEhhdmVSb290SHRtbEVsZW1lbnRdfTogJHt0eXBlTmFtZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmVFbGVtZW50UG9zaXRpb25BYnNvbHV0ZShjb21wb25lbnRSb290RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGNvbXBvbmVudFJvb3RFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlydHVhYmxlQ29tcG9uZW50TWFwLnNldChjb250YWluZXIsIHZpcnR1YWJsZUNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQgPSB0aGlzLl9jb250YWluZXJWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnRMaXN0ZW5lcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudCA9IHRoaXMuX2NvbnRhaW5lclZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudExpc3RlbmVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIudmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQgPSB0aGlzLl9jb250YWluZXJWaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudExpc3RlbmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZENvbXBvbmVudE1hcC5zZXQoY29udGFpbmVyLCBjb21wb25lbnQpO1xyXG5cclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgdmlydHVhbDogaW5zdGFudGlhdG9yLnZpcnR1YWwsXHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFVzZSBnZXRDb21wb25lbnRFdmVudFxyXG4gICAgICAgICAgICByZXN1bHQgPSBzdXBlci5iaW5kQ29tcG9uZW50KGNvbnRhaW5lciwgaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIHVuYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgdmlydHVhbDogYm9vbGVhbiwgY29tcG9uZW50OiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50IHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJlZENvbXBvbmVudCA9IHRoaXMuX3JlZ2lzdGVyZWRDb21wb25lbnRNYXAuZ2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgaWYgKHJlZ2lzdGVyZWRDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzdXBlci51bmJpbmRDb21wb25lbnQoY29udGFpbmVyLCB2aXJ0dWFsLCBjb21wb25lbnQpOyAvLyB3YXMgbm90IGNyZWF0ZWQgZnJvbSByZWdpc3RyYXRpb24gc28gdXNlIHZpcnR1YWwgdW5iaW5kIGV2ZW50c1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZpcnR1YWJsZUNvbXBvbmVudCA9IHRoaXMuX3ZpcnR1YWJsZUNvbXBvbmVudE1hcC5nZXQoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgaWYgKHZpcnR1YWJsZUNvbXBvbmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRSb290RWxlbWVudCA9IHZpcnR1YWJsZUNvbXBvbmVudC5yb290SHRtbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Um9vdEVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignR0xVQzc3NzQzJywgY29udGFpbmVyLnRpdGxlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQoY29tcG9uZW50Um9vdEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWJsZUNvbXBvbmVudE1hcC5kZWxldGUoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBmaXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZ29sZGVuTGF5b3V0Qm91bmRpbmdDbGllbnRSZWN0ID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgc3VwZXIuZmlyZUJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQoY291bnQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUNvbnRhaW5lclZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB2aXJ0dWFibGVDb21wb25lbnQgPSB0aGlzLl92aXJ0dWFibGVDb21wb25lbnRNYXAuZ2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgaWYgKHZpcnR1YWJsZUNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0dMSENTQ0U1NTkzMycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gdmlydHVhYmxlQ29tcG9uZW50LnJvb3RIdG1sRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKHJvb3RFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IoaTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLkNvbXBvbmVudElzTm90VmlydHVhYmxlXSArICcgJyArIGNvbnRhaW5lci50aXRsZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJCb3VuZGluZ0NsaWVudFJlY3QgPSBjb250YWluZXIuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBjb250YWluZXJCb3VuZGluZ0NsaWVudFJlY3QubGVmdCAtIHRoaXMuX2dvbGRlbkxheW91dEJvdW5kaW5nQ2xpZW50UmVjdC5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUubGVmdCA9IG51bWJlclRvUGl4ZWxzKGxlZnQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdG9wID0gY29udGFpbmVyQm91bmRpbmdDbGllbnRSZWN0LnRvcCAtIHRoaXMuX2dvbGRlbkxheW91dEJvdW5kaW5nQ2xpZW50UmVjdC50b3A7XHJcbiAgICAgICAgICAgICAgICByb290RWxlbWVudC5zdHlsZS50b3AgPSBudW1iZXJUb1BpeGVscyh0b3ApO1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHJvb3RFbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHJvb3RFbGVtZW50LCBoZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQ29udGFpbmVyVmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdmlydHVhYmxlQ29tcG9uZW50ID0gdGhpcy5fdmlydHVhYmxlQ29tcG9uZW50TWFwLmdldChjb250YWluZXIpO1xyXG4gICAgICAgIGlmICh2aXJ0dWFibGVDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdHTEhDVlZDUkU1NTkzNCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gdmlydHVhYmxlQ29tcG9uZW50LnJvb3RIdG1sRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKHJvb3RFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IoaTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLkNvbXBvbmVudElzTm90VmlydHVhYmxlXSArICcgJyArIGNvbnRhaW5lci50aXRsZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkocm9vdEVsZW1lbnQsIHZpc2libGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQ29udGFpbmVyVmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIGxvZ2ljYWxaSW5kZXg6IExvZ2ljYWxaSW5kZXgsIGRlZmF1bHRaSW5kZXg6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHZpcnR1YWJsZUNvbXBvbmVudCA9IHRoaXMuX3ZpcnR1YWJsZUNvbXBvbmVudE1hcC5nZXQoY29udGFpbmVyKTtcclxuICAgICAgICBpZiAodmlydHVhYmxlQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignR0xIQ1ZaSUNSRTU1OTM1Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSB2aXJ0dWFibGVDb21wb25lbnQucm9vdEh0bWxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAocm9vdEVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcihpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuQ29tcG9uZW50SXNOb3RWaXJ0dWFibGVdICsgJyAnICsgY29udGFpbmVyLnRpdGxlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLnpJbmRleCA9IGRlZmF1bHRaSW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgR29sZGVuTGF5b3V0IHtcclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVmlydHVhYmxlQ29tcG9uZW50IHtcclxuICAgICAgICByb290SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudENvbnN0cnVjdG9yID0gbmV3KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBzdGF0ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkLCB2aXJ0dWFsOiBib29sZWFuKSA9PiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50O1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uID0gKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBzdGF0ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkLCB2aXJ0dWFsOiBib29sZWFuKSA9PiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgZXhwb3J0IHR5cGUgR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFjayA9ICh0aGlzOiB2b2lkLCBjb25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZykgPT4gQ29tcG9uZW50Q29uc3RydWN0b3I7XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRJbnN0YW50aWF0b3Ige1xyXG4gICAgICAgIGNvbnN0cnVjdG9yOiBDb21wb25lbnRDb25zdHJ1Y3RvciB8IHVuZGVmaW5lZDtcclxuICAgICAgICBmYWN0b3J5RnVuY3Rpb246IENvbXBvbmVudEZhY3RvcnlGdW5jdGlvbiB8IHVuZGVmaW5lZDtcclxuICAgICAgICB2aXJ0dWFsOiBib29sZWFuO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZywgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcsIFJlc29sdmVkTGF5b3V0Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gJy4uL2NvbnRhaW5lci9jb21wb25lbnQtY29udGFpbmVyJztcclxuaW1wb3J0IHsgVGFiIH0gZnJvbSAnLi4vY29udHJvbHMvdGFiJztcclxuaW1wb3J0IHsgVW5leHBlY3RlZE51bGxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBJdGVtVHlwZSwgSnNvblZhbHVlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQsIHNldEVsZW1lbnRIZWlnaHQsIHNldEVsZW1lbnRXaWR0aCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1wYXJlbnRhYmxlLWl0ZW0nO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vY29udGVudC1pdGVtJztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRJdGVtIGV4dGVuZHMgQ29udGVudEl0ZW0ge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcmVvcmRlckVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9oZWFkZXJDb25maWc6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3RpdGxlOiBzdHJpbmc7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0aWFsV2FudE1heGltaXNlOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90YWI6IFRhYjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2ZvY3VzZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKENvbXBvbmVudEl0ZW06Y2xhc3MpLmNvbXBvbmVudFR5cGV9ICovXHJcbiAgICBnZXQgY29tcG9uZW50TmFtZSgpOiBKc29uVmFsdWUgeyByZXR1cm4gdGhpcy5fY29udGFpbmVyLmNvbXBvbmVudFR5cGU7IH1cclxuICAgIGdldCBjb21wb25lbnRUeXBlKCk6IEpzb25WYWx1ZSB7IHJldHVybiB0aGlzLl9jb250YWluZXIuY29tcG9uZW50VHlwZTsgfVxyXG4gICAgZ2V0IHJlb3JkZXJFbmFibGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fcmVvcmRlckVuYWJsZWQ7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCBpbml0aWFsV2FudE1heGltaXNlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faW5pdGlhbFdhbnRNYXhpbWlzZTsgfVxyXG4gICAgZ2V0IGNvbXBvbmVudCgpOiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50IHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2NvbnRhaW5lci5jb21wb25lbnQ7IH1cclxuICAgIGdldCBjb250YWluZXIoKTogQ29tcG9uZW50Q29udGFpbmVyIHsgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjsgfVxyXG4gICAgZ2V0IHBhcmVudEl0ZW0oKTogQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0geyByZXR1cm4gdGhpcy5fcGFyZW50SXRlbTsgfVxyXG5cclxuICAgIGdldCBoZWFkZXJDb25maWcoKTogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2hlYWRlckNvbmZpZzsgfVxyXG4gICAgZ2V0IHRpdGxlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl90aXRsZTsgfVxyXG4gICAgZ2V0IHRhYigpOiBUYWIgeyByZXR1cm4gdGhpcy5fdGFiOyB9XHJcbiAgICBnZXQgZm9jdXNlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2ZvY3VzZWQ7IH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgIGNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9wYXJlbnRJdGVtOiBDb21wb25lbnRQYXJlbnRhYmxlSXRlbVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIobGF5b3V0TWFuYWdlciwgY29uZmlnLCBfcGFyZW50SXRlbSwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xyXG5cclxuICAgICAgICB0aGlzLmlzQ29tcG9uZW50ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVvcmRlckVuYWJsZWQgPSBjb25maWcucmVvcmRlckVuYWJsZWQ7XHJcblxyXG4gICAgICAgIHRoaXMuYXBwbHlVcGRhdGFibGVDb25maWcoY29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy5faW5pdGlhbFdhbnRNYXhpbWlzZSA9IGNvbmZpZy5tYXhpbWlzZWQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBjb250YWluZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Db250ZW50KTtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gbmV3IENvbXBvbmVudENvbnRhaW5lcihjb25maWcsIHRoaXMsIGxheW91dE1hbmFnZXIsIGNvbnRhaW5lckVsZW1lbnQsXHJcbiAgICAgICAgICAgIChpdGVtQ29uZmlnKSA9PiB0aGlzLmhhbmRsZVVwZGF0ZUl0ZW1Db25maWdFdmVudChpdGVtQ29uZmlnKSxcclxuICAgICAgICAgICAgKCkgPT4gdGhpcy5zaG93KCksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMuaGlkZSgpLFxyXG4gICAgICAgICAgICAoc3VwcHJlc3NFdmVudCkgPT4gdGhpcy5mb2N1cyhzdXBwcmVzc0V2ZW50KSxcclxuICAgICAgICAgICAgKHN1cHByZXNzRXZlbnQpID0+IHRoaXMuYmx1cihzdXBwcmVzc0V2ZW50KSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmRlc3Ryb3koKVxyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseVVwZGF0YWJsZUNvbmZpZyhjb25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0VGl0bGUoY29uZmlnLnRpdGxlKTtcclxuICAgICAgICB0aGlzLl9oZWFkZXJDb25maWcgPSBjb25maWcuaGVhZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHRvQ29uZmlnKCk6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3Qgc3RhdGVSZXF1ZXN0RXZlbnQgPSB0aGlzLl9jb250YWluZXIuc3RhdGVSZXF1ZXN0RXZlbnQ7XHJcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdGF0ZVJlcXVlc3RFdmVudCA9PT0gdW5kZWZpbmVkID8gdGhpcy5fY29udGFpbmVyLnN0YXRlIDogc3RhdGVSZXF1ZXN0RXZlbnQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLmNvbXBvbmVudCxcclxuICAgICAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgICAgIHNpemU6IHRoaXMuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IHRoaXMuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IHRoaXMubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IHRoaXMubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiB0aGlzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiB0aGlzLl9yZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgdGl0bGU6IHRoaXMuX3RpdGxlLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KHRoaXMuX2hlYWRlckNvbmZpZyksXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGU6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5jb3B5Q29tcG9uZW50VHlwZSh0aGlzLmNvbXBvbmVudFR5cGUpLFxyXG4gICAgICAgICAgICBjb21wb25lbnRTdGF0ZTogc3RhdGUsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQ0lDNjg4ODMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFVzZWQgYnkgRHJhZyBQcm94eVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZW50ZXJEcmFnTW9kZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuZWxlbWVudCwgaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuZW50ZXJEcmFnTW9kZSh3aWR0aCwgaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleGl0RHJhZ01vZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmV4aXREcmFnTW9kZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVudGVyU3RhY2tNYXhpbWlzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmVudGVyU3RhY2tNYXhpbWlzZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleGl0U3RhY2tNYXhpbWlzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmV4aXRTdGFja01heGltaXNlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFVzZWQgYnkgRHJhZyBQcm94eVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZHJhZygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuZHJhZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldE91dGVyQm91bmRpbmdDbGllbnRSZWN0KCk6IERPTVJlY3QgeyBcclxuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IHNob3cgPSB0aGlzLmhlYWRlckNvbmZpZz8uc2hvdztcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmhlYWRlckhlaWdodDtcclxuXHJcbiAgICAgICAgY29uc3QgaGVhZGVyV2lkdGggPSAoc2hvdyA9PT0gJ2xlZnQnIHx8IHNob3cgPT09ICdyaWdodCcpID8gaGVpZ2h0IDogMDtcclxuICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSAoc2hvdyA9PT0gJ3RvcCcgfHwgc2hvdyA9PT0gJ2JvdHRvbScgfHwgc2hvdyA9PT0gdW5kZWZpbmVkKSA/IGhlaWdodCA6IDA7XHJcblxyXG4gICAgICAgIHJldHVybiBET01SZWN0LmZyb21SZWN0KHtcclxuICAgICAgICAgICAgeDogcmVjdC5sZWZ0IC0gaGVhZGVyV2lkdGgsXHJcbiAgICAgICAgICAgIHk6IHJlY3QudG9wIC0gaGVhZGVySGVpZ2h0LFxyXG4gICAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aCArIGhlYWRlcldpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0ICsgaGVhZGVySGVpZ2h0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIHVwZGF0ZVNpemUoZm9yY2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKGZvcmNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBpbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlTm9kZVNpemUoZmFsc2UpO1xyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmVtaXQoJ29wZW4nKTtcclxuICAgICAgICB0aGlzLmluaXRDb250ZW50SXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGlzIGNvbXBvbmVudCdzIHRpdGxlXHJcbiAgICAgKlxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICogQHBhcmFtIHRpdGxlIC1cclxuICAgICAqL1xyXG5cclxuICAgIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMuZW1pdCgndGl0bGVDaGFuZ2VkJywgdGl0bGUpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGFiKHRhYjogVGFiKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGFiID0gdGFiO1xyXG4gICAgICAgIHRoaXMuZW1pdCgndGFiJywgdGFiKVxyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5zZXRUYWIodGFiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLmhpZGUoKTtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuc2V0VmlzaWJpbGl0eShmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgc2hvdygpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5zaG93KCk7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnNldFZpc2liaWxpdHkodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb2N1c2VzIHRoZSBpdGVtIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGZvY3VzZWRcclxuICAgICAqL1xyXG4gICAgZm9jdXMoc3VwcHJlc3NFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRJdGVtLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0odGhpcywgdHJ1ZSwgc3VwcHJlc3NFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0Rm9jdXNlZChzdXBwcmVzc0V2ZW50OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZm9jdXNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy50YWIuc2V0Rm9jdXNlZCgpO1xyXG4gICAgICAgIGlmICghc3VwcHJlc3NFdmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnZm9jdXMnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCbHVycyAoZGVmb2N1c2VzKSB0aGUgaXRlbSBpZiBpdCBpcyBmb2N1c2VkXHJcbiAgICAgKi9cclxuICAgIGJsdXIoc3VwcHJlc3NFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZvY3VzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnNldEZvY3VzZWRDb21wb25lbnRJdGVtKHVuZGVmaW5lZCwgc3VwcHJlc3NFdmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldEJsdXJyZWQoc3VwcHJlc3NFdmVudDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRhYi5zZXRCbHVycmVkKCk7XHJcbiAgICAgICAgaWYgKCFzdXBwcmVzc0V2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdibHVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBzZXRQYXJlbnQocGFyZW50OiBDb250ZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3BhcmVudEl0ZW0gPSBwYXJlbnQgYXMgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW07XHJcbiAgICAgICAgc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVVcGRhdGVJdGVtQ29uZmlnRXZlbnQoaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVVwZGF0YWJsZUNvbmZpZyhpdGVtQ29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZU5vZGVTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcclxuICAgICAgICAgICAgLy8gRG8gbm90IHVwZGF0ZSBzaXplIG9mIGhpZGRlbiBjb21wb25lbnRzIHRvIHByZXZlbnQgdW53YW50ZWQgcmVmbG93c1xyXG5cclxuICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQodGhpcy5lbGVtZW50KTtcclxuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnNldFNpemVUb05vZGVTaXplKHdpZHRoLCBoZWlnaHQsIGZvcmNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKENvbXBvbmVudEl0ZW06Y2xhc3MpfSAqL1xyXG5leHBvcnQgdHlwZSBDb21wb25lbnQgPSBDb21wb25lbnRJdGVtO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBDb21wb25lbnRJdGVtIHtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudCA9IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQ7XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4vY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vY29udGVudC1pdGVtJztcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSBleHRlbmRzIENvbnRlbnRJdGVtIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2ZvY3VzZWQgPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgZm9jdXNlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2ZvY3VzZWQ7IH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzZXRGb2N1c2VkVmFsdWUodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9mb2N1c2VkID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgYWJzdHJhY3Qgc2V0QWN0aXZlQ29tcG9uZW50SXRlbShpdGVtOiBDb21wb25lbnRJdGVtLCBmb2N1czogYm9vbGVhbiwgc3VwcHJlc3NGb2N1c0V2ZW50OiBib29sZWFuKTogdm9pZDtcclxufVxyXG4iLCJpbXBvcnQgeyBSZXNvbHZlZEl0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJ1xyXG5pbXBvcnQgeyBCcm93c2VyUG9wb3V0IH0gZnJvbSAnLi4vY29udHJvbHMvYnJvd3Nlci1wb3BvdXQnXHJcbmltcG9ydCB7IEFzc2VydEVycm9yLCBVbmV4cGVjdGVkTnVsbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJ1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInXHJcbmltcG9ydCB7IEFyZWFMaW5rZWRSZWN0LCBJdGVtVHlwZSwgU2l6ZVVuaXRFbnVtIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnXHJcbmltcG9ydCB7IGdldFVuaXF1ZUlkLCBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkgfSBmcm9tICcuLi91dGlscy91dGlscydcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4vY29tcG9uZW50LWl0ZW0nXHJcbmltcG9ydCB7IENvbXBvbmVudFBhcmVudGFibGVJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtJ1xyXG5pbXBvcnQgeyBTdGFjayB9IGZyb20gJy4vc3RhY2snXHJcblxyXG4vKipcclxuICogVGhpcyBpcyB0aGUgYmFzZWNsYXNzIHRoYXQgYWxsIGNvbnRlbnQgaXRlbXMgaW5oZXJpdCBmcm9tLlxyXG4gKiBNb3N0IG1ldGhvZHMgcHJvdmlkZSBhIHN1YnNldCBvZiB3aGF0IHRoZSBzdWItY2xhc3NlcyBkby5cclxuICpcclxuICogSXQgYWxzbyBwcm92aWRlcyBhIG51bWJlciBvZiBmdW5jdGlvbnMgZm9yIHRyZWUgdHJhdmVyc2FsXHJcbiAqIEBwdWJsaWNcclxuICovXHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29udGVudEl0ZW0gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdHlwZTogSXRlbVR5cGU7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pZDogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcG9wSW5QYXJlbnRJZHM6IHN0cmluZ1tdID0gW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb250ZW50SXRlbXM6IENvbnRlbnRJdGVtW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0Nsb3NhYmxlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcGVuZGluZ0V2ZW50UHJvcGFnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3Rocm90dGxlZEV2ZW50czogc3RyaW5nW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0luaXRpYWxpc2VkO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNpemU6IG51bWJlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNpemVVbml0OiBTaXplVW5pdEVudW07XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBtaW5TaXplOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBtaW5TaXplVW5pdDogU2l6ZVVuaXRFbnVtO1xyXG5cclxuICAgIGlzR3JvdW5kOiBib29sZWFuXHJcbiAgICBpc1JvdzogYm9vbGVhblxyXG4gICAgaXNDb2x1bW46IGJvb2xlYW5cclxuICAgIGlzU3RhY2s6IGJvb2xlYW5cclxuICAgIGlzQ29tcG9uZW50OiBib29sZWFuXHJcblxyXG4gICAgZ2V0IHR5cGUoKTogSXRlbVR5cGUgeyByZXR1cm4gdGhpcy5fdHlwZTsgfVxyXG4gICAgZ2V0IGlkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9pZDsgfVxyXG4gICAgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHsgdGhpcy5faWQgPSB2YWx1ZTsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0IHBvcEluUGFyZW50SWRzKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMuX3BvcEluUGFyZW50SWRzOyB9XHJcbiAgICBnZXQgcGFyZW50KCk6IENvbnRlbnRJdGVtIHwgbnVsbCB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH1cclxuICAgIGdldCBjb250ZW50SXRlbXMoKTogQ29udGVudEl0ZW1bXSB7IHJldHVybiB0aGlzLl9jb250ZW50SXRlbXM7IH1cclxuICAgIGdldCBpc0Nsb3NhYmxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faXNDbG9zYWJsZTsgfVxyXG4gICAgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZWxlbWVudDsgfVxyXG4gICAgZ2V0IGlzSW5pdGlhbGlzZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc0luaXRpYWxpc2VkOyB9XHJcblxyXG4gICAgc3RhdGljIGlzU3RhY2soaXRlbTogQ29udGVudEl0ZW0pOiBpdGVtIGlzIFN0YWNrIHtcclxuICAgICAgICByZXR1cm4gaXRlbS5pc1N0YWNrO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0NvbXBvbmVudEl0ZW0oaXRlbTogQ29udGVudEl0ZW0pOiBpdGVtIGlzIENvbXBvbmVudEl0ZW0ge1xyXG4gICAgICAgIHJldHVybiBpdGVtLmlzQ29tcG9uZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0NvbXBvbmVudFBhcmVudGFibGVJdGVtKGl0ZW06IENvbnRlbnRJdGVtKTogaXRlbSBpcyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0uaXNTdGFjayB8fCBpdGVtLmlzR3JvdW5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgIGNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9wYXJlbnQ6IENvbnRlbnRJdGVtIHwgbnVsbCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTEVsZW1lbnRcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3R5cGUgPSBjb25maWcudHlwZTtcclxuICAgICAgICB0aGlzLl9pZCA9IGNvbmZpZy5pZDtcclxuXHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNHcm91bmQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzUm93ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0NvbHVtbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNTdGFjayA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNDb21wb25lbnQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5zaXplID0gY29uZmlnLnNpemU7XHJcbiAgICAgICAgdGhpcy5zaXplVW5pdCA9IGNvbmZpZy5zaXplVW5pdDtcclxuICAgICAgICB0aGlzLm1pblNpemUgPSBjb25maWcubWluU2l6ZTtcclxuICAgICAgICB0aGlzLm1pblNpemVVbml0ID0gY29uZmlnLm1pblNpemVVbml0O1xyXG5cclxuICAgICAgICB0aGlzLl9pc0Nsb3NhYmxlID0gY29uZmlnLmlzQ2xvc2FibGU7XHJcblxyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdFdmVudFByb3BhZ2F0aW9ucyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX3Rocm90dGxlZEV2ZW50cyA9IFsnc3RhdGVDaGFuZ2VkJ107XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtcyA9IHRoaXMuY3JlYXRlQ29udGVudEl0ZW1zKGNvbmZpZy5jb250ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXJzIHRoZSBzaXplIG9mIHRoZSBjb21wb25lbnQgYW5kIGl0cyBjaGlsZHJlbiwgY2FsbGVkIHJlY3Vyc2l2ZWx5XHJcbiAgICAgKiBAcGFyYW0gZm9yY2UgLSBJbiBzb21lIGNhc2VzIHRoZSBzaXplIGlzIG5vdCB1cGRhdGVkIGlmIGl0IGhhcyBub3QgY2hhbmdlZC4gSW4gdGhpcyBjYXNlLCBldmVudHNcclxuICAgICAqIChzdWNoIGFzIENvbXBvbmVudENvbnRhaW5lci52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQpIGFyZSBub3QgZmlyZWQuIFNldHRpbmcgZm9yY2UgdG8gdHJ1ZSwgZW5zdXJlcyB0aGUgc2l6ZSBpcyB1cGRhdGVkIHJlZ2FyZGxlc3MsIGFuZFxyXG4gICAgICogdGhlIHJlc3BlY3RpdmUgZXZlbnRzIGFyZSBmaXJlZC4gVGhpcyBpcyBzb21ldGltZXMgbmVjZXNzYXJ5IHdoZW4gYSBjb21wb25lbnQncyBzaXplIGhhcyBub3QgY2hhbmdlZCBidXQgaXQgaGFzIGJlY29tZSB2aXNpYmxlLCBhbmQgdGhlXHJcbiAgICAgKiByZWxldmFudCBldmVudHMgbmVlZCB0byBiZSBmaXJlZC5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBhYnN0cmFjdCB1cGRhdGVTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBjaGlsZCBub2RlIChhbmQgaXRzIGNoaWxkcmVuKSBmcm9tIHRoZSB0cmVlXHJcbiAgICAgKiBAcGFyYW0gY29udGVudEl0ZW0gLSBUaGUgY2hpbGQgaXRlbSB0byByZW1vdmVcclxuICAgICAqIEBwYXJhbSBrZWVwQ2hpbGQgLSBXaGV0aGVyIHRvIGRlc3Ryb3kgdGhlIHJlbW92ZWQgaXRlbVxyXG4gICAgICovXHJcbiAgICByZW1vdmVDaGlsZChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGtlZXBDaGlsZCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIHRoYXQncyB0byBiZSByZW1vdmVkIHdpdGhpbiBhbGwgY29udGVudCBpdGVtcyB0aGlzIG5vZGUgY29udGFpbnNcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2NvbnRlbnRJdGVtcy5pbmRleE9mKGNvbnRlbnRJdGVtKTtcclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBNYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXRlbSB0byBiZSByZW1vdmVkIGlzIGFjdHVhbGx5IGEgY2hpbGQgb2YgdGhpcyBpdGVtXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgcmVtb3ZlIGNoaWxkIGl0ZW0uIFVua25vd24gY29udGVudCBpdGVtJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuXHRcdCAqIENhbGwgZGVzdHJveSBvbiB0aGUgY29udGVudCBpdGVtLlxyXG5cdFx0ICogQWxsIGNoaWxkcmVuIGFyZSBkZXN0cm95ZWQgYXMgd2VsbFxyXG5cdFx0ICovXHJcbiAgICAgICAgaWYgKCFrZWVwQ2hpbGQpIHtcclxuXHRcdFx0dGhpcy5fY29udGVudEl0ZW1zW2luZGV4XS5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBSZW1vdmUgdGhlIGNvbnRlbnQgaXRlbSBmcm9tIHRoaXMgbm9kZXMgYXJyYXkgb2YgY2hpbGRyZW5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jb250ZW50SXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhpcyBub2RlIHN0aWxsIGNvbnRhaW5zIG90aGVyIGNvbnRlbnQgaXRlbXMsIGFkanVzdCB0aGVpciBzaXplXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIElmIHRoaXMgd2FzIHRoZSBsYXN0IGNvbnRlbnQgaXRlbSwgcmVtb3ZlIHRoaXMgbm9kZSBhcyB3ZWxsXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAvLyBpZiAoIXRoaXMuaXNHcm91bmQgJiYgdGhpcy5faXNDbG9zYWJsZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNHcm91bmQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQ0lVQzAwODc0Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdXAgdGhlIHRyZWUgc3RydWN0dXJlIGZvciB0aGUgbmV3bHkgYWRkZWQgY2hpbGRcclxuICAgICAqIFRoZSByZXNwb25zaWJpbGl0eSBmb3IgdGhlIGFjdHVhbCBET00gbWFuaXB1bGF0aW9ucyBsaWVzXHJcbiAgICAgKiB3aXRoIHRoZSBjb25jcmV0ZSBpdGVtXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbnRlbnRJdGVtIC1cclxuICAgICAqIEBwYXJhbSBpbmRleCAtIElmIG9taXR0ZWQgaXRlbSB3aWxsIGJlIGFwcGVuZGVkXHJcbiAgICAgKiBAcGFyYW0gc3VzcGVuZFJlc2l6ZSAtIFVzZWQgYnkgZGVzY2VuZGVudCBpbXBsZW1lbnRhdGlvbnNcclxuICAgICAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgYWRkQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBpbmRleD86IG51bWJlciB8IG51bGwsIHN1c3BlbmRSZXNpemU/OiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgICAgICBpbmRleCA/Pz0gdGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zLnNwbGljZShpbmRleCwgMCwgY29udGVudEl0ZW0pO1xyXG4gICAgICAgIGNvbnRlbnRJdGVtLnNldFBhcmVudCh0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IHRydWUgJiYgY29udGVudEl0ZW0uX2lzSW5pdGlhbGlzZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtLmluaXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpbmRleDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2VzIG9sZENoaWxkIHdpdGggbmV3Q2hpbGRcclxuICAgICAqIEBwYXJhbSBvbGRDaGlsZCAtXHJcbiAgICAgKiBAcGFyYW0gbmV3Q2hpbGQgLVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHJlcGxhY2VDaGlsZChvbGRDaGlsZDogQ29udGVudEl0ZW0sIG5ld0NoaWxkOiBDb250ZW50SXRlbSwgZGVzdHJveU9sZENoaWxkID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICAvLyBEbyBub3QgdHJ5IHRvIHJlcGxhY2UgQ29tcG9uZW50SXRlbSAtIHdpbGwgbm90IHdvcmtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2NvbnRlbnRJdGVtcy5pbmRleE9mKG9sZENoaWxkKTtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gb2xkQ2hpbGQuX2VsZW1lbnQucGFyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0NJUkNJMjMyMzInLCAnQ2FuXFwndCByZXBsYWNlIGNoaWxkLiBvbGRDaGlsZCBpcyBub3QgY2hpbGQgb2YgdGhpcycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhcmVudE5vZGUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0NJUkNQMjMyMzInKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdDaGlsZC5fZWxlbWVudCwgb2xkQ2hpbGQuX2VsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgKiBPcHRpb25hbGx5IGRlc3Ryb3kgdGhlIG9sZCBjb250ZW50IGl0ZW1cclxuICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgaWYgKGRlc3Ryb3lPbGRDaGlsZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgb2xkQ2hpbGQuX3BhcmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBvbGRDaGlsZC5kZXN0cm95KCk7IC8vIHdpbGwgbm93IGFsc28gZGVzdHJveSBhbGwgY2hpbGRyZW4gb2Ygb2xkQ2hpbGRcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgKiBXaXJlIHRoZSBuZXcgY29udGVudEl0ZW0gaW50byB0aGUgdHJlZVxyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50SXRlbXNbaW5kZXhdID0gbmV3Q2hpbGQ7XHJcbiAgICAgICAgICAgIG5ld0NoaWxkLnNldFBhcmVudCh0aGlzKTtcclxuICAgICAgICAgICAgLy8gbmV3Q2hpbGQgaW5oZXJpdHMgdGhlIHNpemVzIGZyb20gdGhlIG9sZCBjaGlsZDpcclxuICAgICAgICAgICAgbmV3Q2hpbGQuc2l6ZSA9IG9sZENoaWxkLnNpemU7XHJcbiAgICAgICAgICAgIG5ld0NoaWxkLnNpemVVbml0ID0gb2xkQ2hpbGQuc2l6ZVVuaXQ7XHJcbiAgICAgICAgICAgIG5ld0NoaWxkLm1pblNpemUgPSBvbGRDaGlsZC5taW5TaXplO1xyXG4gICAgICAgICAgICBuZXdDaGlsZC5taW5TaXplVW5pdCA9IG9sZENoaWxkLm1pblNpemVVbml0O1xyXG5cclxuICAgICAgICAgICAgLy9UT0RPIFRoaXMgZG9lc24ndCB1cGRhdGUgdGhlIGNvbmZpZy4uLiByZWZhY3RvciB0byBsZWF2ZSBpdGVtIG5vZGVzIHVudG91Y2hlZCBhZnRlciBjcmVhdGlvblxyXG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQuX3BhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0NJUkNOQzQ1Njk5Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV3Q2hpbGQuX3BhcmVudC5faXNJbml0aWFsaXNlZCA9PT0gdHJ1ZSAmJiBuZXdDaGlsZC5faXNJbml0aWFsaXNlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZC5pbml0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZC5cclxuICAgICAqIFNob3J0aGFuZCBmb3IgdGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQoIHRoaXMgKVxyXG4gICAgICovXHJcbiAgICByZW1vdmUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQ0lSMTExMTAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgY29tcG9uZW50IGZyb20gdGhlIGxheW91dCBhbmQgY3JlYXRlcyBhIG5ld1xyXG4gICAgICogYnJvd3NlciB3aW5kb3cgd2l0aCB0aGUgY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4gaW5zaWRlXHJcbiAgICAgKi9cclxuICAgIHBvcG91dCgpOiBCcm93c2VyUG9wb3V0IHtcclxuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IGdldFVuaXF1ZUlkKCk7XHJcbiAgICAgICAgY29uc3QgYnJvd3NlclBvcG91dCA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVQb3BvdXRGcm9tQ29udGVudEl0ZW0odGhpcywgdW5kZWZpbmVkLCBwYXJlbnRJZCwgdW5kZWZpbmVkKTtcclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgcmV0dXJuIGJyb3dzZXJQb3BvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgYWJzdHJhY3QgdG9Db25maWcoKTogUmVzb2x2ZWRJdGVtQ29uZmlnO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNhbGN1bGF0ZUNvbmZpZ0NvbnRlbnQoKTogUmVzb2x2ZWRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IHRoaXMuX2NvbnRlbnRJdGVtcztcclxuICAgICAgICBjb25zdCBjb3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlc29sdmVkSXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBpdGVtLnRvQ29uZmlnKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgaGlnaGxpZ2h0RHJvcFpvbmUoeDogbnVtYmVyLCB5OiBudW1iZXIsIGFyZWE6IEFyZWFMaW5rZWRSZWN0KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZHJvcFRhcmdldEluZGljYXRvciA9IHRoaXMubGF5b3V0TWFuYWdlci5kcm9wVGFyZ2V0SW5kaWNhdG9yO1xyXG4gICAgICAgIGlmIChkcm9wVGFyZ2V0SW5kaWNhdG9yID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdBQ0lIRFo1NTkzJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZHJvcFRhcmdldEluZGljYXRvci5oaWdobGlnaHRBcmVhKGFyZWEsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBvbkRyb3AoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBhcmVhOiBDb250ZW50SXRlbS5BcmVhKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hZGRDaGlsZChjb250ZW50SXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2hvdygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuYmVnaW5TaXplSW52YWxpZGF0aW9uKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gTm90IHN1cmUgd2h5IHNob3dBbGxBY3RpdmVDb250ZW50SXRlbXMoKSB3YXMgY2FsbGVkLiBHb2xkZW5MYXlvdXQgc2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgaXQuICBMZWZ0IGNvbW1lbnRlZCBjb2RlXHJcbiAgICAgICAgICAgIC8vIGluIHNvdXJjZSBpbiBjYXNlIGEgcmVhc29uIGZvciBpdCBiZWNvbWVzIGFwcGFyZW50LlxyXG4gICAgICAgICAgICAvLyB0aGlzLmxheW91dE1hbmFnZXIuc2hvd0FsbEFjdGl2ZUNvbnRlbnRJdGVtcygpO1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fZWxlbWVudCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMubGF5b3V0TWFuYWdlci51cGRhdGVTaXplRnJvbUNvbnRhaW5lcigpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtc1tpXS5zaG93KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW5kU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgaXRlbSBhbmRzIGl0cyBjaGlsZHJlblxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zID0gW107XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdiZWZvcmVJdGVtRGVzdHJveWVkJyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnaXRlbURlc3Ryb3llZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgYXJlYSB0aGUgY29tcG9uZW50IGN1cnJlbnRseSBvY2N1cGllc1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGdldEVsZW1lbnRBcmVhKGVsZW1lbnQ/OiBIVE1MRWxlbWVudCk6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsIHtcclxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudCA/PyB0aGlzLl9lbGVtZW50O1xyXG5cclxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCB0b3AgPSByZWN0LnRvcCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xyXG4gICAgICAgIGNvbnN0IGxlZnQgPSByZWN0LmxlZnQgKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gcmVjdC53aWR0aDtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSByZWN0LmhlaWdodDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgeDE6IGxlZnQsXHJcbiAgICAgICAgICAgIHkxOiB0b3AsXHJcbiAgICAgICAgICAgIHgyOiBsZWZ0ICsgd2lkdGgsXHJcbiAgICAgICAgICAgIHkyOiB0b3AgKyBoZWlnaHQsXHJcbiAgICAgICAgICAgIHN1cmZhY2U6IHdpZHRoICogaGVpZ2h0LFxyXG4gICAgICAgICAgICBjb250ZW50SXRlbTogdGhpc1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCk6IENvbnRlbnRJdGVtIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGN1cnI6IENvbnRlbnRJdGVtIHwgbnVsbCA9IHRoaXM7XHJcblxyXG4gICAgICAgIHdoaWxlIChjdXJyICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyLnBhcmVudCAhPT0gbnVsbCAmJiBjdXJyLnBhcmVudC5jb250ZW50SXRlbXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VyciA9IGN1cnIucGFyZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdHJlZSBvZiBjb250ZW50IGl0ZW1zIGlzIGNyZWF0ZWQgaW4gdHdvIHN0ZXBzOiBGaXJzdCBhbGwgY29udGVudCBpdGVtcyBhcmUgaW5zdGFudGlhdGVkLFxyXG4gICAgICogdGhlbiBpbml0IGlzIGNhbGxlZCByZWN1cnNpdmVseSBmcm9tIHRvcCB0byBib3R0ZW0uIFRoaXMgaXMgdGhlIGJhc2ljIGluaXQgZnVuY3Rpb24sXHJcbiAgICAgKiBpdCBjYW4gYmUgdXNlZCwgZXh0ZW5kZWQgb3Igb3ZlcndyaXR0ZW4gYnkgdGhlIGNvbnRlbnQgaXRlbXNcclxuICAgICAqXHJcbiAgICAgKiBJdHMgYmVoYXZpb3VyIGRlcGVuZHMgb24gdGhlIGNvbnRlbnQgaXRlbVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ2l0ZW1DcmVhdGVkJyk7XHJcbiAgICAgICAgdGhpcy5lbWl0VW5rbm93bkJ1YmJsaW5nRXZlbnQodGhpcy50eXBlICsgJ0NyZWF0ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgc2V0UGFyZW50KHBhcmVudDogQ29udGVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYWRkUG9wSW5QYXJlbnRJZChpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnBvcEluUGFyZW50SWRzLmluY2x1ZGVzKGlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLnBvcEluUGFyZW50SWRzLnB1c2goaWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgaW5pdENvbnRlbnRJdGVtcygpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2NvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50SXRlbXNbaV0uaW5pdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuYmVnaW5TaXplSW52YWxpZGF0aW9uKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KHRoaXMuX2VsZW1lbnQsIGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5sYXlvdXRNYW5hZ2VyLnVwZGF0ZVNpemVGcm9tQ29udGFpbmVyKCk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVuZFNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUNvbnRlbnRJdGVtc1NpemUoZm9yY2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2NvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50SXRlbXNbaV0udXBkYXRlU2l6ZShmb3JjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogY3JlYXRlcyBhbGwgY29udGVudCBpdGVtcyBmb3IgdGhpcyBub2RlIGF0IGluaXRpYWxpc2F0aW9uIHRpbWVcclxuICAgICAqIFBMRUFTRSBOT1RFLCBwbGVhc2Ugc2VlIGFkZENoaWxkIGZvciBhZGRpbmcgY29udGVudEl0ZW1zIGF0IHJ1bnRpbWVcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUNvbnRlbnRJdGVtcyhjb250ZW50OiByZWFkb25seSBSZXNvbHZlZEl0ZW1Db25maWdbXSkge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gY29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PENvbnRlbnRJdGVtPihjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVDb250ZW50SXRlbShjb250ZW50W2ldLCB0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBmb3IgZXZlcnkgZXZlbnQgb24gdGhlIGl0ZW0gdHJlZS4gRGVjaWRlcyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIGJ1YmJsaW5nXHJcbiAgICAgKiBldmVudCBhbmQgcHJvcGFnYXRlcyBpdCB0byBpdHMgcGFyZW50XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcclxuICAgICAqIEBwYXJhbSBldmVudCAtXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwcm9wYWdhdGVFdmVudChuYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSkge1xyXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGFyZ3NbMF07XHJcbiAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50ICYmXHJcbiAgICAgICAgICAgICAgICBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9PT0gZmFsc2UgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IHRydWUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEluIHNvbWUgY2FzZXMgKGUuZy4gaWYgYW4gZWxlbWVudCBpcyBjcmVhdGVkIGZyb20gYSBEcmFnU291cmNlKSBpdFxyXG4gICAgICAgICAgICAgICAgICogZG9lc24ndCBoYXZlIGEgcGFyZW50IGFuZCBpcyBub3QgYSBjaGlsZCBvZiBHcm91bmRJdGVtLiBJZiB0aGF0J3MgdGhlIGNhc2VcclxuICAgICAgICAgICAgICAgICAqIHByb3BhZ2F0ZSB0aGUgYnViYmxpbmcgZXZlbnQgZnJvbSB0aGUgdG9wIGxldmVsIG9mIHRoZSBzdWJzdHJlZSBkaXJlY3RseVxyXG4gICAgICAgICAgICAgICAgICogdG8gdGhlIGxheW91dE1hbmFnZXJcclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNHcm91bmQgPT09IGZhbHNlICYmIHRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5lbWl0VW5rbm93bihuYW1lLCBldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVFdmVudFByb3BhZ2F0aW9uVG9MYXlvdXRNYW5hZ2VyKG5hbWUsIGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSB0cnlCdWJibGVFdmVudChuYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGFyZ3NbMF07XHJcbiAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50ICYmXHJcbiAgICAgICAgICAgICAgICBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9PT0gZmFsc2UgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IHRydWVcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEluIHNvbWUgY2FzZXMgKGUuZy4gaWYgYW4gZWxlbWVudCBpcyBjcmVhdGVkIGZyb20gYSBEcmFnU291cmNlKSBpdFxyXG4gICAgICAgICAgICAgICAgICogZG9lc24ndCBoYXZlIGEgcGFyZW50IGFuZCBpcyBub3QgYSBjaGlsZCBvZiBHcm91bmRJdGVtLiBJZiB0aGF0J3MgdGhlIGNhc2VcclxuICAgICAgICAgICAgICAgICAqIHByb3BhZ2F0ZSB0aGUgYnViYmxpbmcgZXZlbnQgZnJvbSB0aGUgdG9wIGxldmVsIG9mIHRoZSBzdWJzdHJlZSBkaXJlY3RseVxyXG4gICAgICAgICAgICAgICAgICogdG8gdGhlIGxheW91dE1hbmFnZXJcclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNHcm91bmQgPT09IGZhbHNlICYmIHRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5lbWl0VW5rbm93bihuYW1lLCBldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVFdmVudFByb3BhZ2F0aW9uVG9MYXlvdXRNYW5hZ2VyKG5hbWUsIGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsbCByYXcgZXZlbnRzIGJ1YmJsZSB1cCB0byB0aGUgR3JvdW5kIGVsZW1lbnQuIFNvbWUgZXZlbnRzIHRoYXRcclxuICAgICAqIGFyZSBwcm9wYWdhdGVkIHRvIC0gYW5kIGVtaXR0ZWQgYnkgLSB0aGUgbGF5b3V0TWFuYWdlciBob3dldmVyIGFyZVxyXG4gICAgICogb25seSBzdHJpbmctYmFzZWQsIGJhdGNoZWQgYW5kIHNhbml0aXplZCB0byBtYWtlIHRoZW0gbW9yZSB1c2FibGVcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2NoZWR1bGVFdmVudFByb3BhZ2F0aW9uVG9MYXlvdXRNYW5hZ2VyKG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3Rocm90dGxlZEV2ZW50cy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW1pdFVua25vd24obmFtZSwgZXZlbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9wZW5kaW5nRXZlbnRQcm9wYWdhdGlvbnNbbmFtZV0gIT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdFdmVudFByb3BhZ2F0aW9uc1tuYW1lXSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnByb3BhZ2F0ZUV2ZW50VG9MYXlvdXRNYW5hZ2VyKG5hbWUsIGV2ZW50KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgZm9yIGV2ZW50cyBzY2hlZHVsZWQgYnkgX3NjaGVkdWxlRXZlbnRQcm9wYWdhdGlvblRvTGF5b3V0TWFuYWdlclxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwcm9wYWdhdGVFdmVudFRvTGF5b3V0TWFuYWdlcihuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudCkge1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdFdmVudFByb3BhZ2F0aW9uc1tuYW1lXSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbWl0VW5rbm93bihuYW1lLCBldmVudCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgQ29udGVudEl0ZW0ge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBBcmVhIGV4dGVuZHMgQXJlYUxpbmtlZFJlY3Qge1xyXG4gICAgICAgIHN1cmZhY2U6IG51bWJlcjtcclxuICAgICAgICBjb250ZW50SXRlbTogQ29udGVudEl0ZW07XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKENvbnRlbnRJdGVtOmNsYXNzKX0gKi9cclxuZXhwb3J0IHR5cGUgQWJzdHJhY3RDb250ZW50SXRlbSA9IENvbnRlbnRJdGVtO1xyXG4iLCJpbXBvcnQgeyBDb21wb25lbnRJdGVtQ29uZmlnLCBJdGVtQ29uZmlnLCBSb3dPckNvbHVtbkl0ZW1Db25maWcsIFN0YWNrSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9jb25maWcnO1xyXG5pbXBvcnQgeyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsIFJlc29sdmVkR3JvdW5kSXRlbUNvbmZpZywgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcsIFJlc29sdmVkSXRlbUNvbmZpZywgUmVzb2x2ZWRSb290SXRlbUNvbmZpZywgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWROdWxsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQXJlYUxpbmtlZFJlY3QsIEl0ZW1UeXBlLCBTaXplVW5pdEVudW0gfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCwgc2V0RWxlbWVudEhlaWdodCwgc2V0RWxlbWVudFdpZHRoIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBhcmVudGFibGVJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2NvbnRlbnQtaXRlbSc7XHJcbmltcG9ydCB7IFJvd09yQ29sdW1uIH0gZnJvbSAnLi9yb3ctb3ItY29sdW1uJztcclxuXHJcbi8qKlxyXG4gKiBHcm91bmRJdGVtIGlzIHRoZSBDb250ZW50SXRlbSB3aG9zZSBvbmUgY2hpbGQgaXMgdGhlIHJvb3QgQ29udGVudEl0ZW0gKFJvb3QgaXMgcGxhbnRlZCBpbiBHcm91bmQpLlxyXG4gKiAoUHJldmlvdXNseSBpdCB3YXMgY2FsbGVkIHJvb3QgaG93ZXZlciB0aGlzIHdhcyBpbmNvcnJlY3QgYXMgaXRzIGNoaWxkIGlzIHRoZSByb290IGl0ZW0pXHJcbiAqIFRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlIG9mIEdyb3VuZEl0ZW0gYW5kIGl0IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB0aGUgTGF5b3V0IE1hbmFnZXJcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgR3JvdW5kSXRlbSBleHRlbmRzIENvbXBvbmVudFBhcmVudGFibGVJdGVtIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoaWxkRWxlbWVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLCByb290SXRlbUNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCwgY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuXHJcbiAgICAgICAgc3VwZXIobGF5b3V0TWFuYWdlciwgUmVzb2x2ZWRHcm91bmRJdGVtQ29uZmlnLmNyZWF0ZShyb290SXRlbUNvbmZpZyksIG51bGwsIEdyb3VuZEl0ZW0uY3JlYXRlRWxlbWVudChkb2N1bWVudCkpO1xyXG5cclxuICAgICAgICB0aGlzLmlzR3JvdW5kID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIgPSB0aGlzLmVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lckVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vIGluc2VydCBiZWZvcmUgYW55IHByZS1leGlzdGluZyBjb250ZW50IGVsZW1lbnRzXHJcbiAgICAgICAgbGV0IGJlZm9yZTogQ2hpbGROb2RlIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJldjogQ2hpbGROb2RlIHwgbnVsbCA9XHJcbiAgICAgICAgICAgICAgICBiZWZvcmUgPyBiZWZvcmUucHJldmlvdXNTaWJsaW5nIDogdGhpcy5fY29udGFpbmVyRWxlbWVudC5sYXN0Q2hpbGQ7XHJcbiAgICAgICAgICAgIGlmIChwcmV2IGluc3RhbmNlb2YgRWxlbWVudFxyXG4gICAgICAgICAgICAgICAgJiYgcHJldi5jbGFzc0xpc3QuY29udGFpbnMoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Db250ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgYmVmb3JlID0gcHJldjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgYmVmb3JlKTtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBpbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGlzZWQgPT09IHRydWUpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLmluaXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0Q29udGVudEl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIG5ldyBMYXlvdXRcclxuICAgICAqIEludGVybmFsIG9ubHkuICBUbyBsb2FkIGEgbmV3IGxheW91dCB3aXRoIEFQSSwgdXNlIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykubG9hZExheW91dH1cclxuICAgICAqL1xyXG4gICAgbG9hZFJvb3Qocm9vdEl0ZW1Db25maWc6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICAvLyBSZW1vdmUgZXhpc3Rpbmcgcm9vdCBpZiBpdCBleGlzdHNcclxuICAgICAgICB0aGlzLmNsZWFyUm9vdCgpO1xyXG5cclxuICAgICAgICBpZiAocm9vdEl0ZW1Db25maWcgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCByb290Q29udGVudEl0ZW0gPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQW5kSW5pdENvbnRlbnRJdGVtKHJvb3RJdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZChyb290Q29udGVudEl0ZW0sIDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbGVhclJvb3QoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHJvb3QgaWYgaXQgZXhpc3RzXHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgc3dpdGNoIChjb250ZW50SXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMDoge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgMToge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdSb290Q29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgICAgICBleGlzdGluZ1Jvb3RDb250ZW50SXRlbS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0dJTFIwNzcyMScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIENvbnRlbnRJdGVtIGNoaWxkIHRvIHJvb3QgQ29udGVudEl0ZW0uXHJcbiAgICAgKiBJbnRlcm5hbCBvbmx5LiAgVG8gbG9hZCBhIGFkZCB3aXRoIEFQSSwgdXNlIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykuYWRkSXRlbX1cclxuICAgICAqIEByZXR1cm5zIC0xIGlmIGFkZGVkIGFzIHJvb3Qgb3RoZXJ3aXNlIGluZGV4IGluIHJvb3QgQ29udGVudEl0ZW0ncyBjb250ZW50XHJcbiAgICAgKi9cclxuICAgIGFkZEl0ZW0oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgICAgICBpbmRleD86IG51bWJlclxyXG4gICAgKTogbnVtYmVyIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuY2hlY2tNaW5pbWlzZU1heGltaXNlZFN0YWNrKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkSXRlbUNvbmZpZyA9IEl0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnLCBmYWxzZSk7XHJcbiAgICAgICAgbGV0IHBhcmVudDogQ29udGVudEl0ZW07XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcGFyZW50ID0gdGhpcy5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXHJcbiAgICAgICAgICAgIHBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYXJlbnQuaXNDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGl0ZW0gYXMgY2hpbGQgdG8gQ29tcG9uZW50SXRlbScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShyZXNvbHZlZEl0ZW1Db25maWcsIHBhcmVudCk7XHJcbiAgICAgICAgICAgIGluZGV4ID0gcGFyZW50LmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbmRleCk7XHJcbiAgICAgICAgICAgIHJldHVybiAocGFyZW50ID09PSB0aGlzKSA/IC0xIDogaW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxvYWRDb21wb25lbnRBc1Jvb3QoaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyk6IHZvaWQge1xyXG4gICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyByb290IGlmIGl0IGV4aXN0c1xyXG4gICAgICAgIHRoaXMuY2xlYXJSb290KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkSXRlbUNvbmZpZyA9IEl0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnLCBmYWxzZSkgYXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnO1xyXG5cclxuICAgICAgICBpZiAocmVzb2x2ZWRJdGVtQ29uZmlnLm1heGltaXNlZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgQ29tcG9uZW50IGNhbm5vdCBiZSBtYXhpbWlzZWQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByb290Q29udGVudEl0ZW0gPSBuZXcgQ29tcG9uZW50SXRlbSh0aGlzLmxheW91dE1hbmFnZXIsIHJlc29sdmVkSXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgIHJvb3RDb250ZW50SXRlbS5pbml0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGQocm9vdENvbnRlbnRJdGVtLCAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgUm9vdCBDb250ZW50SXRlbS5cclxuICAgICAqIEludGVybmFsIG9ubHkuICBUbyByZXBsYWNlIFJvb3QgQ29udGVudEl0ZW0gd2l0aCBBUEksIHVzZSB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLmxvYWRMYXlvdXR9XHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIGFkZENoaWxkKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwgaW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR3JvdW5kIG5vZGUgY2FuIG9ubHkgaGF2ZSBhIHNpbmdsZSBjaGlsZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnRlbnRJdGVtID0gdGhpcy5sYXlvdXRNYW5hZ2VyLl8kbm9ybWFsaXplQ29udGVudEl0ZW0oY29udGVudEl0ZW0sIHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuYXBwZW5kQ2hpbGQoY29udGVudEl0ZW0uZWxlbWVudCk7XHJcbiAgICAgICAgICAgIGluZGV4ID0gc3VwZXIuYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluZGV4KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgY2FsY3VsYXRlQ29uZmlnQ29udGVudCgpOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IHRoaXMuY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gY29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UmVzb2x2ZWRSb290SXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gaXRlbS50b0NvbmZpZygpO1xyXG4gICAgICAgICAgICBpZiAoUmVzb2x2ZWRSb290SXRlbUNvbmZpZy5pc1Jvb3RJdGVtQ29uZmlnKGl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBpdGVtQ29uZmlnO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdSQ0NDNjY4MzInKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCB8fCBoZWlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpOyAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB2MS54IEFQSVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmVsZW1lbnQsIGhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICAvLyBHcm91bmRJdGVtIGNhbiBiZSBlbXB0eVxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuY29udGVudEl0ZW1zWzBdLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5jb250ZW50SXRlbXNbMF0uZWxlbWVudCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb250ZW50SXRlbXNTaXplKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgUm9vdCBDb250ZW50SXRlbS5cclxuICAgICAqIEludGVybmFsIG9ubHkuICBUbyByZXBsYWNlIFJvb3QgQ29udGVudEl0ZW0gd2l0aCBBUEksIHVzZSB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLnVwZGF0ZVJvb3RTaXplfVxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSB1cGRhdGVTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmJlZ2luVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRJdGVtc1NpemUoZm9yY2UpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbmRWaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlU2lkZUFyZWFzKCk6IEdyb3VuZEl0ZW0uQXJlYVtdIHtcclxuICAgICAgICBjb25zdCBhcmVhU2l6ZSA9IDUwO1xyXG5cclxuICAgICAgICBjb25zdCBvcHBvc2l0ZVNpZGVzID0gR3JvdW5kSXRlbS5BcmVhLm9wcG9zaXRlU2lkZXM7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PEdyb3VuZEl0ZW0uQXJlYT4oT2JqZWN0LmtleXMob3Bwb3NpdGVTaWRlcykubGVuZ3RoKTtcclxuICAgICAgICBsZXQgaWR4ID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb3Bwb3NpdGVTaWRlcykge1xyXG4gICAgICAgICAgICBjb25zdCBzaWRlID0ga2V5IGFzIGtleW9mIEdyb3VuZEl0ZW0uQXJlYS5TaWRlcztcclxuICAgICAgICAgICAgY29uc3QgYXJlYSA9IHRoaXMuZ2V0RWxlbWVudEFyZWEoKSBhcyBHcm91bmRJdGVtLkFyZWE7XHJcbiAgICAgICAgICAgIGlmIChhcmVhID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignUkNTQTc3NTUzJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhcmVhLnNpZGUgPSBzaWRlO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wcG9zaXRlU2lkZXNbc2lkZV1bMV0gPT09ICcyJyApXHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYVtzaWRlXSA9IGFyZWFbb3Bwb3NpdGVTaWRlc1tzaWRlXV0gLSBhcmVhU2l6ZTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBhcmVhW3NpZGVdID0gYXJlYVtvcHBvc2l0ZVNpZGVzW3NpZGVdXSArIGFyZWFTaXplO1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zdXJmYWNlID0gKGFyZWEueDIgLSBhcmVhLngxKSAqIChhcmVhLnkyIC0gYXJlYS55MSk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaWR4KytdID0gYXJlYTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBoaWdobGlnaHREcm9wWm9uZSh4OiBudW1iZXIsIHk6IG51bWJlciwgYXJlYTogQXJlYUxpbmtlZFJlY3QpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIudGFiRHJvcFBsYWNlaG9sZGVyLnJlbW92ZSgpO1xyXG4gICAgICAgIHN1cGVyLmhpZ2hsaWdodERyb3Bab25lKHgsIHksIGFyZWEpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIG9uRHJvcChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGFyZWE6IEdyb3VuZEl0ZW0uQXJlYSk6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAoY29udGVudEl0ZW0uaXNDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoKTtcclxuICAgICAgICAgICAgLy8gc2luY2UgUmVzb2x2ZWRJdGVtQ29uZmlnLmNvbnRlbnRJdGVtcyBub3Qgc2V0IHVwLCB3ZSBuZWVkIHRvIGFkZCBoZWFkZXIgZnJvbSBDb21wb25lbnRcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gY29udGVudEl0ZW0gYXMgQ29tcG9uZW50SXRlbTtcclxuICAgICAgICAgICAgaXRlbUNvbmZpZy5oZWFkZXIgPSBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShjb21wb25lbnQuaGVhZGVyQ29uZmlnKTtcclxuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQW5kSW5pdENvbnRlbnRJdGVtKGl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgICAgICBzdGFjay5hZGRDaGlsZChjb250ZW50SXRlbSk7XHJcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtID0gc3RhY2s7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGQoY29udGVudEl0ZW0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAqIElmIHRoZSBjb250ZW50SXRlbSB0aGF0J3MgYmVpbmcgZHJvcHBlZCBpcyBub3QgZHJvcHBlZCBvbiBhIFN0YWNrIChjYXNlcyB3aGljaCBqdXN0IHBhc3NlZCBhYm92ZSBhbmRcclxuICAgICAgICAgICAgICogd2hpY2ggd291bGQgd3JhcCB0aGUgY29udGVudEl0ZW0gaW4gYSBTdGFjaykgd2UgbmVlZCB0byBjaGVjayB3aGV0aGVyIGNvbnRlbnRJdGVtIGlzIGEgUm93T3JDb2x1bW4uXHJcbiAgICAgICAgICAgICAqIElmIGl0IGlzLCB3ZSBuZWVkIHRvIHJlLXdyYXAgaXQgaW4gYSBTdGFjayBsaWtlIGl0IHdhcyB3aGVuIGl0IHdhcyBkcmFnZ2VkIGJ5IGl0cyBUYWIgKGl0IHdhcyBkcmFnZ2VkISkuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZihjb250ZW50SXRlbS50eXBlID09PSBJdGVtVHlwZS5yb3cgfHwgY29udGVudEl0ZW0udHlwZSA9PT0gSXRlbVR5cGUuY29sdW1uKXtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVDb250ZW50SXRlbShpdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIHN0YWNrLmFkZENoaWxkKGNvbnRlbnRJdGVtKVxyXG4gICAgICAgICAgICAgICAgY29udGVudEl0ZW0gPSBzdGFja1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gYXJlYS5zaWRlWzBdID09ICd4JyA/IEl0ZW1UeXBlLnJvdyA6IEl0ZW1UeXBlLmNvbHVtbjtcclxuICAgICAgICAgICAgY29uc3QgaW5zZXJ0QmVmb3JlID0gYXJlYS5zaWRlWzFdID09ICcyJztcclxuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgIGlmICghKGNvbHVtbiBpbnN0YW5jZW9mIFJvd09yQ29sdW1uKSB8fCBjb2x1bW4udHlwZSAhPT0gdHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IFJlc29sdmVkSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KHR5cGUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93T3JDb2x1bW4gPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQ29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VDaGlsZChjb2x1bW4sIHJvd09yQ29sdW1uKTtcclxuICAgICAgICAgICAgICAgIHJvd09yQ29sdW1uLmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbnNlcnRCZWZvcmUgPyAwIDogdW5kZWZpbmVkLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHJvd09yQ29sdW1uLmFkZENoaWxkKGNvbHVtbiwgaW5zZXJ0QmVmb3JlID8gdW5kZWZpbmVkIDogMCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW4uc2l6ZSA9IDUwO1xyXG4gICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IDUwO1xyXG4gICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZVVuaXQgPSBTaXplVW5pdEVudW0uUGVyY2VudDtcclxuICAgICAgICAgICAgICAgIHJvd09yQ29sdW1uLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2libGluZyA9IGNvbHVtbi5jb250ZW50SXRlbXNbaW5zZXJ0QmVmb3JlID8gMCA6IGNvbHVtbi5jb250ZW50SXRlbXMubGVuZ3RoIC0gMV1cclxuICAgICAgICAgICAgICAgIGNvbHVtbi5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5zZXJ0QmVmb3JlID8gMCA6IHVuZGVmaW5lZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBzaWJsaW5nLnNpemUgKj0gMC41O1xyXG4gICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IHNpYmxpbmcuc2l6ZTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW4udXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTm8gQ29udGVudEl0ZW0gY2FuIGRvY2sgd2l0aCBncm91bmRJdGVtLiAgSG93ZXZlciBTdGFjayBjYW4gaGF2ZSBhIEdyb3VuZEl0ZW0gcGFyZW50IGFuZCBTdGFjayByZXF1aXJlcyB0aGF0XHJcbiAgICAvLyBpdHMgcGFyZW50IGltcGxlbWVudCBkb2NrKCkgZnVuY3Rpb24uICBBY2NvcmRpbmdseSB0aGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGJ1dCB0aHJvd3MgYW4gZXhjZXB0aW9uIGFzIGl0IHNob3VsZFxyXG4gICAgLy8gbmV2ZXIgYmUgY2FsbGVkXHJcbiAgICBkb2NrKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignR0lEODc3MzEnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBObyBDb250ZW50SXRlbSBjYW4gZG9jayB3aXRoIGdyb3VuZEl0ZW0uICBIb3dldmVyIFN0YWNrIGNhbiBoYXZlIGEgR3JvdW5kSXRlbSBwYXJlbnQgYW5kIFN0YWNrIHJlcXVpcmVzIHRoYXRcclxuICAgIC8vIGl0cyBwYXJlbnQgaW1wbGVtZW50IHZhbGlkYXRlRG9ja2luZygpIGZ1bmN0aW9uLiAgQWNjb3JkaW5nbHkgdGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBidXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBhcyBpdCBzaG91bGRcclxuICAgIC8vIG5ldmVyIGJlIGNhbGxlZFxyXG4gICAgdmFsaWRhdGVEb2NraW5nKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignR0lWRDg3NzMyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWxsQ29udGVudEl0ZW1zKCk6IENvbnRlbnRJdGVtW10ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQ29udGVudEl0ZW1bXSA9IFt0aGlzXTtcclxuICAgICAgICB0aGlzLmRlZXBHZXRBbGxDb250ZW50SXRlbXModGhpcy5jb250ZW50SXRlbXMsIHJlc3VsdCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGxDb21wb25lbnRJdGVtcygpOiBDb21wb25lbnRJdGVtW10ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQ29udGVudEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIHRoaXMuZGVlcEZpbHRlckNvbnRlbnRJdGVtcyh0aGlzLmNvbnRlbnRJdGVtcywgcmVzdWx0LCAoaXRlbSkgPT4gaXRlbS5pc0NvbXBvbmVudCk7XHJcbiAgICAgICAgcmV0dXJuIDxDb21wb25lbnRJdGVtW10+cmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldENvbmZpZ01heGltaXNlZEl0ZW1zKCk6IENvbnRlbnRJdGVtW10ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQ29udGVudEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIHRoaXMuZGVlcEZpbHRlckNvbnRlbnRJdGVtcyh0aGlzLmNvbnRlbnRJdGVtcywgcmVzdWx0LCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoQ29udGVudEl0ZW0uaXNTdGFjayhpdGVtKSAmJiBpdGVtLmluaXRpYWxXYW50TWF4aW1pc2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzQ29tcG9uZW50SXRlbShpdGVtKSAmJiBpdGVtLmluaXRpYWxXYW50TWF4aW1pc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SXRlbXNCeVBvcEluUGFyZW50SWQocG9wSW5QYXJlbnRJZDogc3RyaW5nKTogQ29udGVudEl0ZW1bXSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBDb250ZW50SXRlbVtdID0gW107XHJcbiAgICAgICAgdGhpcy5kZWVwRmlsdGVyQ29udGVudEl0ZW1zKHRoaXMuY29udGVudEl0ZW1zLCByZXN1bHQsIChpdGVtKSA9PiBpdGVtLnBvcEluUGFyZW50SWRzLmluY2x1ZGVzKHBvcEluUGFyZW50SWQpKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHRvQ29uZmlnKCk6IFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2VuZXJhdGUgR3JvdW5kSXRlbSBjb25maWcnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBzZXRBY3RpdmVDb21wb25lbnRJdGVtKGl0ZW06IENvbXBvbmVudEl0ZW0sIGZvY3VzOiBib29sZWFuLCBzdXBwcmVzc0ZvY3VzRXZlbnQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICAvLyBvbmx5IGFwcGxpY2FibGUgaWYgQ29tcG9uZW50SXRlbSBpcyByb290IGFuZCB0aGVuIGl0IGFsd2F5cyBoYXMgZm9jdXNcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZU5vZGVTaXplKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0KHRoaXMuX2NvbnRhaW5lckVsZW1lbnQpO1xyXG5cclxuICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmVsZW1lbnQsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogR3JvdW5kSXRlbSBjYW4gYmUgZW1wdHlcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5jb250ZW50SXRlbXNbMF0uZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuY29udGVudEl0ZW1zWzBdLmVsZW1lbnQsIGhlaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVlcEdldEFsbENvbnRlbnRJdGVtcyhjb250ZW50OiByZWFkb25seSBDb250ZW50SXRlbVtdLCByZXN1bHQ6IENvbnRlbnRJdGVtW10pOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50W2ldO1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaChjb250ZW50SXRlbSk7XHJcbiAgICAgICAgICAgIHRoaXMuZGVlcEdldEFsbENvbnRlbnRJdGVtcyhjb250ZW50SXRlbS5jb250ZW50SXRlbXMsIHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVlcEZpbHRlckNvbnRlbnRJdGVtcyhjb250ZW50OiByZWFkb25seSBDb250ZW50SXRlbVtdLCByZXN1bHQ6IENvbnRlbnRJdGVtW10sXHJcbiAgICAgICAgY2hlY2tBY2NlcHRGdG46ICgodGhpczogdm9pZCwgaXRlbTogQ29udGVudEl0ZW0pID0+IGJvb2xlYW4pXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50W2ldO1xyXG4gICAgICAgICAgICBpZiAoY2hlY2tBY2NlcHRGdG4oY29udGVudEl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjb250ZW50SXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kZWVwRmlsdGVyQ29udGVudEl0ZW1zKGNvbnRlbnRJdGVtLmNvbnRlbnRJdGVtcywgcmVzdWx0LCBjaGVja0FjY2VwdEZ0bik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEdyb3VuZEl0ZW0ge1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBBcmVhIGV4dGVuZHMgQ29udGVudEl0ZW0uQXJlYSB7XHJcbiAgICAgICAgc2lkZToga2V5b2YgdHlwZW9mIEFyZWEuU2lkZTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIEFyZWEge1xyXG4gICAgICAgIGV4cG9ydCBjb25zdCBlbnVtIFNpZGUge1xyXG4gICAgICAgICAgICB5MixcclxuICAgICAgICAgICAgeDIsXHJcbiAgICAgICAgICAgIHkxLFxyXG4gICAgICAgICAgICB4MSxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGV4cG9ydCB0eXBlIFNpZGVzID0geyBbc2lkZSBpbiBrZXlvZiB0eXBlb2YgU2lkZV06IGtleW9mIHR5cGVvZiBTaWRlOyB9XHJcblxyXG4gICAgICAgIGV4cG9ydCBjb25zdCBvcHBvc2l0ZVNpZGVzOiBTaWRlcyA9IHtcclxuICAgICAgICAgICAgeTI6ICd5MScsXHJcbiAgICAgICAgICAgIHgyOiAneDEnLFxyXG4gICAgICAgICAgICB5MTogJ3kyJyxcclxuICAgICAgICAgICAgeDE6ICd4MicsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxlbWVudChkb2N1bWVudDogRG9jdW1lbnQpOiBIVE1MRGl2RWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkdvbGRlbkxheW91dCk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSXRlbSk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuUm9vdCk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50SXRlbUNvbmZpZywgSXRlbUNvbmZpZywgUm93T3JDb2x1bW5JdGVtQ29uZmlnLCBTdGFja0l0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnJ1xyXG5pbXBvcnQgeyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZywgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJ1xyXG5pbXBvcnQgeyBTcGxpdHRlciB9IGZyb20gJy4uL2NvbnRyb2xzL3NwbGl0dGVyJ1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZE51bGxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcidcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJ1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJ1xyXG5pbXBvcnQgeyBJdGVtVHlwZSwgSnNvblZhbHVlLCBTaXplVW5pdEVudW0sIFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUgfSBmcm9tICcuLi91dGlscy90eXBlcydcclxuaW1wb3J0IHtcclxuICAgIGdldEVsZW1lbnRIZWlnaHQsXHJcbiAgICBnZXRFbGVtZW50V2lkdGgsXHJcbiAgICBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQsXHJcbiAgICBudW1iZXJUb1BpeGVscyxcclxuICAgIHBpeGVsc1RvTnVtYmVyLFxyXG4gICAgc2V0RWxlbWVudEhlaWdodCxcclxuICAgIHNldEVsZW1lbnRXaWR0aFxyXG59IGZyb20gXCIuLi91dGlscy91dGlsc1wiXHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1pdGVtJ1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vY29udGVudC1pdGVtJ1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIFJvd09yQ29sdW1uIGV4dGVuZHMgQ29udGVudEl0ZW0ge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hpbGRFbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZ1R5cGU6ICdyb3cnIHwgJ2NvbHVtbic7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pc0NvbHVtbjogYm9vbGVhbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NwbGl0dGVyU2l6ZTogbnVtYmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3BsaXR0ZXJHcmFiU2l6ZTogbnVtYmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGltZW5zaW9uOiBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3BsaXR0ZXI6IFNwbGl0dGVyW10gPSBbXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3NwbGl0dGVyUG9zaXRpb246IG51bWJlciB8IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zcGxpdHRlck1pblBvc2l0aW9uOiBudW1iZXIgfCBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc3BsaXR0ZXJNYXhQb3NpdGlvbjogbnVtYmVyIHwgbnVsbDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3Rvcihpc0NvbHVtbjogYm9vbGVhbiwgbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlciwgY29uZmlnOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfcm93T3JDb2x1bW5QYXJlbnQ6IENvbnRlbnRJdGVtXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihsYXlvdXRNYW5hZ2VyLCBjb25maWcsIF9yb3dPckNvbHVtblBhcmVudCwgUm93T3JDb2x1bW4uY3JlYXRlRWxlbWVudChkb2N1bWVudCwgaXNDb2x1bW4pKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc1JvdyA9ICFpc0NvbHVtbjtcclxuICAgICAgICB0aGlzLmlzQ29sdW1uID0gaXNDb2x1bW47XHJcblxyXG4gICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lciA9IHRoaXMuZWxlbWVudDtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlclNpemUgPSBsYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5kaW1lbnNpb25zLmJvcmRlcldpZHRoO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyR3JhYlNpemUgPSBsYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5kaW1lbnNpb25zLmJvcmRlckdyYWJXaWR0aDtcclxuICAgICAgICB0aGlzLl9pc0NvbHVtbiA9IGlzQ29sdW1uO1xyXG4gICAgICAgIHRoaXMuX2RpbWVuc2lvbiA9IGlzQ29sdW1uID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyUG9zaXRpb24gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyTWluUG9zaXRpb24gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyTWF4UG9zaXRpb24gPSBudWxsO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGNvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZ1R5cGUgPSBjb25maWcudHlwZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdST0NDQ1QwMDkyNScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZXdDb21wb25lbnQoY29tcG9uZW50VHlwZTogSnNvblZhbHVlLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGU/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogQ29tcG9uZW50SXRlbSB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5ld0l0ZW0oaXRlbUNvbmZpZywgaW5kZXgpIGFzIENvbXBvbmVudEl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ29tcG9uZW50KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nLCBpbmRleD86IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW0oaXRlbUNvbmZpZywgaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5ld0l0ZW0oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZywgIGluZGV4PzogbnVtYmVyKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIGluZGV4ID0gdGhpcy5hZGRJdGVtKGl0ZW1Db25maWcsIGluZGV4KTtcclxuICAgICAgICBjb25zdCBjcmVhdGVkSXRlbSA9IHRoaXMuY29udGVudEl0ZW1zW2luZGV4XTtcclxuXHJcbiAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzU3RhY2soY3JlYXRlZEl0ZW0pICYmIChJdGVtQ29uZmlnLmlzQ29tcG9uZW50KGl0ZW1Db25maWcpKSkge1xyXG4gICAgICAgICAgICAvLyBjcmVhdGVkSXRlbSBpcyBhIFN0YWNrIHdoaWNoIHdhcyBjcmVhdGVkIHRvIGhvbGQgd2FudGVkIGNvbXBvbmVudC4gIFJldHVybiBjb21wb25lbnRcclxuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRJdGVtLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlZEl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFkZEl0ZW0oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgICAgICBpbmRleD86IG51bWJlclxyXG4gICAgKTogbnVtYmVyIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuY2hlY2tNaW5pbWlzZU1heGltaXNlZFN0YWNrKCk7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRJdGVtQ29uZmlnID0gSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0ocmVzb2x2ZWRJdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5kZXgsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIG5ldyBjb250ZW50SXRlbSB0byB0aGUgUm93IG9yIENvbHVtblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb250ZW50SXRlbSAtXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgcG9zaXRpb24gb2YgdGhlIG5ldyBpdGVtIHdpdGhpbiB0aGUgUm93IG9yIENvbHVtbi5cclxuICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGluZGV4IGlzIHByb3ZpZGVkIHRoZSBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZFxyXG4gICAgICogQHBhcmFtIHN1c3BlbmRSZXNpemUgLSBJZiB0cnVlIHRoZSBpdGVtcyB3b24ndCBiZSByZXNpemVkLiBUaGlzIHdpbGwgbGVhdmUgdGhlIGl0ZW0gaW5cclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgYW4gaW5jb25zaXN0ZW50IHN0YXRlIGFuZCBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgaWYgbXVsdGlwbGVcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gbmVlZCB0byBiZSBhZGRlZCBpbiBvbmUgZ28gYW5kIHJlc2l6ZSBpcyBjYWxsZWQgYWZ0ZXJ3YXJkc1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIGFkZENoaWxkKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwgaW5kZXg/OiBudW1iZXIsIHN1c3BlbmRSZXNpemU/OiBib29sZWFuKTogbnVtYmVyIHtcclxuXHJcbiAgICAgICAgLy8gY29udGVudEl0ZW0gPSB0aGlzLmxheW91dE1hbmFnZXIuXyRub3JtYWxpemVDb250ZW50SXRlbShjb250ZW50SXRlbSwgdGhpcyk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgc3BsaXR0ZXJFbGVtZW50ID0gdGhpcy5jcmVhdGVTcGxpdHRlcihNYXRoLm1heCgwLCBpbmRleCAtIDEpKS5lbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50SXRlbXNbaW5kZXggLSAxXS5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBzcGxpdHRlckVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgc3BsaXR0ZXJFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBjb250ZW50SXRlbS5lbGVtZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEl0ZW1zWzBdLmVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIHNwbGl0dGVyRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBzcGxpdHRlckVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIGNvbnRlbnRJdGVtLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKGNvbnRlbnRJdGVtLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIuYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluZGV4KTtcclxuXHJcbiAgICAgICAgY29uc3QgbmV3SXRlbVNpemUgPSAoMSAvIHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCkgKiAxMDA7XHJcblxyXG4gICAgICAgIGlmIChzdXNwZW5kUmVzaXplID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleGVkQ29udGVudEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ZWRDb250ZW50SXRlbSA9PT0gY29udGVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSBuZXdJdGVtU2l6ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1TaXplID0gaW5kZXhlZENvbnRlbnRJdGVtLnNpemUgKj0gKDEwMCAtIG5ld0l0ZW1TaXplKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgIGluZGV4ZWRDb250ZW50SXRlbS5zaXplID0gaXRlbVNpemU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG5cclxuICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgY2hpbGQgb2YgdGhpcyBlbGVtZW50XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbnRlbnRJdGVtIC1cclxuICAgICAqIEBwYXJhbSBrZWVwQ2hpbGQgLSBJZiB0cnVlIHRoZSBjaGlsZCB3aWxsIGJlIHJlbW92ZWQsIGJ1dCBub3QgZGVzdHJveWVkXHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSByZW1vdmVDaGlsZChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGtlZXBDaGlsZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb250ZW50SXRlbXMuaW5kZXhPZihjb250ZW50SXRlbSk7XHJcbiAgICAgICAgY29uc3Qgc3BsaXR0ZXJJbmRleCA9IE1hdGgubWF4KGluZGV4IC0gMSwgMCk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IHJlbW92ZSBjaGlsZC4gQ29udGVudEl0ZW0gaXMgbm90IGNoaWxkIG9mIHRoaXMgUm93IG9yIENvbHVtbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVtb3ZlIHRoZSBzcGxpdHRlciBiZWZvcmUgdGhlIGl0ZW0gb3IgYWZ0ZXIgaWYgdGhlIGl0ZW0gaGFwcGVuc1xyXG4gICAgICAgICAqIHRvIGJlIHRoZSBmaXJzdCBpbiB0aGUgcm93L2NvbHVtblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLl9zcGxpdHRlcltzcGxpdHRlckluZGV4XSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zcGxpdHRlcltzcGxpdHRlckluZGV4XS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NwbGl0dGVyLnNwbGljZShzcGxpdHRlckluZGV4LCAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLnJlbW92ZUNoaWxkKGNvbnRlbnRJdGVtLCBrZWVwQ2hpbGQpO1xyXG5cclxuICAgICAgICAvLyBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID09PSAxICYmIHRoaXMuaXNDbG9zYWJsZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIC8vICAgICBjb25zdCBjaGlsZEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAvLyAgICAgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID0gMDtcclxuICAgICAgICAvLyAgICAgdGhpcy5fcm93T3JDb2x1bW5QYXJlbnQucmVwbGFjZUNoaWxkKHRoaXMsIGNoaWxkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlcyBhIGNoaWxkIG9mIHRoaXMgUm93IG9yIENvbHVtbiB3aXRoIGFub3RoZXIgY29udGVudEl0ZW1cclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgcmVwbGFjZUNoaWxkKG9sZENoaWxkOiBDb250ZW50SXRlbSwgbmV3Q2hpbGQ6IENvbnRlbnRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IG9sZENoaWxkLnNpemU7XHJcbiAgICAgICAgc3VwZXIucmVwbGFjZUNoaWxkKG9sZENoaWxkLCBuZXdDaGlsZCk7XHJcbiAgICAgICAgbmV3Q2hpbGQuc2l6ZSA9IHNpemU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBpdGVtIG9yIG9uZSBvZiBpdHMgcGFyZW50cyBjaGFuZ2VcclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgdXBkYXRlU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5iZWdpblZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTm9kZVNpemUoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb250ZW50SXRlbXNTaXplKGZvcmNlKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW5kVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCByZWN1cnNpdmVseSBieSB0aGUgbGF5b3V0IG1hbmFnZXIuIENvbnRlbnRJdGVtLmluaXQgYXBwZW5kc1xyXG4gICAgICogdGhlIGNvbnRlbnRJdGVtJ3MgRE9NIGVsZW1lbnRzIHRvIHRoZSBjb250YWluZXIsIFJvd09yQ29sdW1uIGluaXQgYWRkcyBzcGxpdHRlcnNcclxuICAgICAqIGluIGJldHdlZW4gdGhlbVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXNlZCA9PT0gdHJ1ZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCB0aGlzLmNyZWF0ZVNwbGl0dGVyKGkpLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbml0Q29udGVudEl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9Db25maWcoKTogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSBhcyAncm93JyB8ICdjb2x1bW4nLFxyXG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLmNhbGN1bGF0ZUNvbmZpZ0NvbnRlbnQoKSBhcyAoUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZylbXSxcclxuICAgICAgICAgICAgc2l6ZTogdGhpcy5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogdGhpcy5zaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZTogdGhpcy5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogdGhpcy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IHRoaXMuaXNDbG9zYWJsZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2V0UGFyZW50KHBhcmVudDogQ29udGVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9yb3dPckNvbHVtblBhcmVudCA9IHBhcmVudDtcclxuICAgICAgICBzdXBlci5zZXRQYXJlbnQocGFyZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZU5vZGVTaXplKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmVsYXRpdmVTaXplcygpO1xyXG4gICAgICAgICAgICB0aGlzLnNldEFic29sdXRlU2l6ZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgncmVzaXplJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUdXJucyB0aGUgcmVsYXRpdmUgc2l6ZXMgY2FsY3VsYXRlZCBieSBjYWxjdWxhdGVSZWxhdGl2ZVNpemVzIGludG9cclxuICAgICAqIGFic29sdXRlIHBpeGVsIHZhbHVlcyBhbmQgYXBwbGllcyB0aGVtIHRvIHRoZSBjaGlsZHJlbidzIERPTSBlbGVtZW50c1xyXG4gICAgICpcclxuICAgICAqIEFzc2lnbnMgYWRkaXRpb25hbCBwaXhlbHMgdG8gY291bnRlcmFjdCBNYXRoLmZsb29yXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXRBYnNvbHV0ZVNpemVzKCkge1xyXG4gICAgICAgIGNvbnN0IGFic29sdXRlU2l6ZXMgPSB0aGlzLmNhbGN1bGF0ZUFic29sdXRlU2l6ZXMoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoYWJzb2x1dGVTaXplcy5hZGRpdGlvbmFsUGl4ZWwgLSBpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgYWJzb2x1dGVTaXplcy5pdGVtU2l6ZXNbaV0rKztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzQ29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCwgYWJzb2x1dGVTaXplcy5jcm9zc0F4aXNTaXplKTtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCwgYWJzb2x1dGVTaXplcy5pdGVtU2l6ZXNbaV0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQsIGFic29sdXRlU2l6ZXMuaXRlbVNpemVzW2ldKTtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCwgYWJzb2x1dGVTaXplcy5jcm9zc0F4aXNTaXplKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGFic29sdXRlIHNpemVzIG9mIGFsbCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBJdGVtLlxyXG4gICAgICogQHJldHVybnMgU2V0IHdpdGggYWJzb2x1dGUgc2l6ZXMgYW5kIGFkZGl0aW9uYWwgcGl4ZWxzLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlQWJzb2x1dGVTaXplcygpOiBSb3dPckNvbHVtbi5BYnNvbHV0ZVNpemVzIHtcclxuICAgICAgICBjb25zdCB0b3RhbFNwbGl0dGVyU2l6ZSA9ICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggLSAxKSAqIHRoaXMuX3NwbGl0dGVyU2l6ZTtcclxuICAgICAgICBjb25zdCB7IHdpZHRoOiBlbGVtZW50V2lkdGgsIGhlaWdodDogZWxlbWVudEhlaWdodCB9ID0gZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0KHRoaXMuZWxlbWVudCk7XHJcblxyXG4gICAgICAgIGxldCB0b3RhbFNpemU6IG51bWJlcjtcclxuICAgICAgICBsZXQgY3Jvc3NBeGlzU2l6ZTogbnVtYmVyO1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0NvbHVtbikge1xyXG4gICAgICAgICAgICB0b3RhbFNpemUgPSBlbGVtZW50SGVpZ2h0IC0gdG90YWxTcGxpdHRlclNpemU7XHJcbiAgICAgICAgICAgIGNyb3NzQXhpc1NpemUgPSBlbGVtZW50V2lkdGg7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdG90YWxTaXplID0gZWxlbWVudFdpZHRoIC0gdG90YWxTcGxpdHRlclNpemU7XHJcbiAgICAgICAgICAgIGNyb3NzQXhpc1NpemUgPSBlbGVtZW50SGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRvdGFsQXNzaWduZWQgPSAwO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1TaXplczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMuY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBsZXQgaXRlbVNpemU6IG51bWJlcjtcclxuICAgICAgICAgICAgaWYgKGNvbnRlbnRJdGVtLnNpemVVbml0ID09PSBTaXplVW5pdEVudW0uUGVyY2VudCkge1xyXG4gICAgICAgICAgICAgICAgaXRlbVNpemUgPSBNYXRoLmZsb29yKHRvdGFsU2l6ZSAqIChjb250ZW50SXRlbS5zaXplIC8gMTAwKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1JPQ0NBUzY2OTInKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdG90YWxBc3NpZ25lZCArPSBpdGVtU2l6ZTtcclxuICAgICAgICAgICAgaXRlbVNpemVzLnB1c2goaXRlbVNpemUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFBpeGVsID0gTWF0aC5mbG9vcih0b3RhbFNpemUgLSB0b3RhbEFzc2lnbmVkKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaXRlbVNpemVzLFxyXG4gICAgICAgICAgICBhZGRpdGlvbmFsUGl4ZWwsXHJcbiAgICAgICAgICAgIHRvdGFsU2l6ZSxcclxuICAgICAgICAgICAgY3Jvc3NBeGlzU2l6ZSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgcmVsYXRpdmUgc2l6ZXMgb2YgYWxsIGNoaWxkcmVuIG9mIHRoaXMgSXRlbS4gVGhlIGxvZ2ljXHJcbiAgICAgKiBpcyBhcyBmb2xsb3dzOlxyXG4gICAgICpcclxuICAgICAqIC0gQWRkIHVwIHRoZSB0b3RhbCBzaXplIG9mIGFsbCBpdGVtcyB0aGF0IGhhdmUgYSBjb25maWd1cmVkIHNpemVcclxuICAgICAqXHJcbiAgICAgKiAtIElmIHRoZSB0b3RhbCA9PSAxMDAgKGNoZWNrIGZvciBmbG9hdGluZyBwb2ludCBlcnJvcnMpXHJcbiAgICAgKiAgICAgICAgRXhjZWxsZW50LCBqb2IgZG9uZVxyXG4gICAgICpcclxuICAgICAqIC0gSWYgdGhlIHRvdGFsIGlzIFxcPiAxMDAsXHJcbiAgICAgKiAgICAgICAgc2V0IHRoZSBzaXplIG9mIGl0ZW1zIHdpdGhvdXQgc2V0IGRpbWVuc2lvbnMgdG8gMS8zIGFuZCBhZGQgdGhpcyB0byB0aGUgdG90YWxcclxuICAgICAqICAgICAgICBzZXQgdGhlIHNpemUgb2ZmIGFsbCBpdGVtcyBzbyB0aGF0IHRoZSB0b3RhbCBpcyBodW5kcmVkIHJlbGF0aXZlIHRvIHRoZWlyIG9yaWdpbmFsIHNpemVcclxuICAgICAqXHJcbiAgICAgKiAtIElmIHRoZSB0b3RhbCBpcyBcXDwgMTAwXHJcbiAgICAgKiAgICAgICAgSWYgdGhlcmUgYXJlIGl0ZW1zIHdpdGhvdXQgc2V0IGRpbWVuc2lvbnMsIGRpc3RyaWJ1dGUgdGhlIHJlbWFpbmRlciB0byAxMDAgZXZlbmx5IGJldHdlZW4gdGhlbVxyXG4gICAgICogICAgICAgIElmIHRoZXJlIGFyZSBubyBpdGVtcyB3aXRob3V0IHNldCBkaW1lbnNpb25zLCBpbmNyZWFzZSBhbGwgaXRlbXMgc2l6ZXMgcmVsYXRpdmUgdG9cclxuICAgICAqICAgICAgICB0aGVpciBvcmlnaW5hbCBzaXplIHNvIHRoYXQgdGhleSBhZGQgdXAgdG8gMTAwXHJcbiAgICAgKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlUmVsYXRpdmVTaXplcygpIHtcclxuXHJcbiAgICAgICAgbGV0IHRvdGFsID0gMDtcclxuICAgICAgICBjb25zdCBpdGVtc1dpdGhGcmFjdGlvbmFsU2l6ZTogQ29udGVudEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIGxldCB0b3RhbEZyYWN0aW9uYWxTaXplID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMuY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBzaXplVW5pdCA9IGNvbnRlbnRJdGVtLnNpemVVbml0O1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHNpemVVbml0KSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5QZXJjZW50OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY29udGVudEl0ZW0uc2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLkZyYWN0aW9uYWw6IHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtc1dpdGhGcmFjdGlvbmFsU2l6ZS5wdXNoKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbEZyYWN0aW9uYWxTaXplICs9IGNvbnRlbnRJdGVtLnNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignUk9DQ1JTNDkxMTAnLCBKU09OLnN0cmluZ2lmeShjb250ZW50SXRlbSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBFdmVyeXRoaW5nIGFkZHMgdXAgdG8gaHVuZHJlZCwgYWxsIGdvb2QgOi0pXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKE1hdGgucm91bmQodG90YWwpID09PSAxMDApIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNwZWN0TWluSXRlbVNpemUoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgcmVtYWluaW5nIHNpemUgdG8gdGhlIGl0ZW1zIHdpdGggYSBmcmFjdGlvbmFsIHNpemVcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKHRvdGFsKSA8IDEwMCAmJiBpdGVtc1dpdGhGcmFjdGlvbmFsU2l6ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmcmFjdGlvbmFsQWxsb2NhdGVkU2l6ZSA9IDEwMCAtIHRvdGFsO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtc1dpdGhGcmFjdGlvbmFsU2l6ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gaXRlbXNXaXRoRnJhY3Rpb25hbFNpemVbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IGZyYWN0aW9uYWxBbGxvY2F0ZWRTaXplICogKGNvbnRlbnRJdGVtLnNpemUgLyB0b3RhbEZyYWN0aW9uYWxTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplVW5pdCA9IFNpemVVbml0RW51bS5QZXJjZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNwZWN0TWluSXRlbVNpemUoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIElmIHRoZSB0b3RhbCBpcyA+IDEwMCwgYnV0IHRoZXJlIGFyZSBhbHNvIGl0ZW1zIHdpdGggYSBmcmFjdGlvbmFsIHNpemUsIGFzc2lnbiBhbm90aGVyIDUwJVxyXG4gICAgICAgICAgICAgICAgICogdG8gdGhlIGZyYWN0aW9uYWwgaXRlbXNcclxuICAgICAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAgICAgKiBUaGlzIHdpbGwgYmUgcmVzZXQgaW4gdGhlIG5leHQgc3RlcFxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5yb3VuZCh0b3RhbCkgPiAxMDAgJiYgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBpdGVtc1dpdGhGcmFjdGlvbmFsU2l6ZVtpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IDUwICogKGNvbnRlbnRJdGVtLnNpemUgLyB0b3RhbEZyYWN0aW9uYWxTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZVVuaXQgPSBTaXplVW5pdEVudW0uUGVyY2VudDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gNTA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBTZXQgZXZlcnkgaXRlbXMgc2l6ZSByZWxhdGl2ZSB0byAxMDAgcmVsYXRpdmUgdG8gaXRzIHNpemUgdG8gdG90YWxcclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5jb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IChjb250ZW50SXRlbS5zaXplIC8gdG90YWwpICogMTAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVzcGVjdE1pbkl0ZW1TaXplKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGp1c3RzIHRoZSBjb2x1bW4gd2lkdGhzIHRvIHJlc3BlY3QgdGhlIGRpbWVuc2lvbnMgbWluSXRlbVdpZHRoIGlmIHNldC5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlc3BlY3RNaW5JdGVtU2l6ZSgpIHtcclxuICAgICAgICBpbnRlcmZhY2UgRW50cnkge1xyXG4gICAgICAgICAgICBzaXplOiBudW1iZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBtaW5JdGVtU2l6ZSA9IHRoaXMuY2FsY3VsYXRlQ29udGVudEl0ZW1NaW5TaXplKHRoaXMpO1xyXG5cclxuICAgICAgICBpZiAobWluSXRlbVNpemUgPD0gMCB8fCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPD0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRvdGFsT3Zlck1pbiA9IDA7XHJcbiAgICAgICAgICAgIGxldCB0b3RhbFVuZGVyTWluID0gMDtcclxuICAgICAgICAgICAgY29uc3QgZW50cmllc092ZXJNaW46IEVudHJ5W10gPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgYWxsRW50cmllczogRW50cnlbXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGVTaXplcyA9IHRoaXMuY2FsY3VsYXRlQWJzb2x1dGVTaXplcygpO1xyXG5cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEZpZ3VyZSBvdXQgaG93IG11Y2ggd2UgYXJlIHVuZGVyIHRoZSBtaW4gaXRlbSBzaXplIHRvdGFsIGFuZCBob3cgbXVjaCByb29tIHdlIGhhdmUgdG8gdXNlLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhYnNvbHV0ZVNpemVzLml0ZW1TaXplcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbVNpemUgPSBhYnNvbHV0ZVNpemVzLml0ZW1TaXplc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZW50cnk6IEVudHJ5O1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1TaXplIDwgbWluSXRlbVNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbFVuZGVyTWluICs9IG1pbkl0ZW1TaXplIC0gaXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgZW50cnkgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IG1pbkl0ZW1TaXplXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsT3Zlck1pbiArPSBpdGVtU2l6ZSAtIG1pbkl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGVudHJ5ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBpdGVtU2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgZW50cmllc092ZXJNaW4ucHVzaChlbnRyeSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgYWxsRW50cmllcy5wdXNoKGVudHJ5KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIElmIHRoZXJlIGlzIG5vdGhpbmcgdW5kZXIgbWluLCBvciB0aGVyZSBpcyBub3QgZW5vdWdoIG92ZXIgdG8gbWFrZSB1cCB0aGUgZGlmZmVyZW5jZSwgZG8gbm90aGluZy5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmICh0b3RhbFVuZGVyTWluID09PSAwIHx8IHRvdGFsVW5kZXJNaW4gPiB0b3RhbE92ZXJNaW4pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogRXZlbmx5IHJlZHVjZSBhbGwgY29sdW1ucyB0aGF0IGFyZSBvdmVyIHRoZSBtaW4gaXRlbSB3aWR0aCB0byBtYWtlIHVwIHRoZSBkaWZmZXJlbmNlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWR1Y2VQZXJjZW50ID0gdG90YWxVbmRlck1pbiAvIHRvdGFsT3Zlck1pbjtcclxuICAgICAgICAgICAgICAgIGxldCByZW1haW5pbmdTaXplID0gdG90YWxVbmRlck1pbjtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllc092ZXJNaW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNPdmVyTWluW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZHVjZWRTaXplID0gTWF0aC5yb3VuZCgoZW50cnkuc2l6ZSAtIG1pbkl0ZW1TaXplKSAqIHJlZHVjZVBlcmNlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ1NpemUgLT0gcmVkdWNlZFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgZW50cnkuc2l6ZSAtPSByZWR1Y2VkU2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFRha2UgYW55dGhpbmcgcmVtYWluaW5nIGZyb20gdGhlIGxhc3QgaXRlbS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ1NpemUgIT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhbGxFbnRyaWVzW2FsbEVudHJpZXMubGVuZ3RoIC0gMV0uc2l6ZSAtPSByZW1haW5pbmdTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogU2V0IGV2ZXJ5IGl0ZW1zIHNpemUgcmVsYXRpdmUgdG8gMTAwIHJlbGF0aXZlIHRvIGl0cyBzaXplIHRvIHRvdGFsXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMuY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSAoYWxsRW50cmllc1tpXS5zaXplIC8gYWJzb2x1dGVTaXplcy50b3RhbFNpemUpICogMTAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFNwbGl0dGVyLCBiaW5kcyBldmVudHMgdG8gaXQgYW5kIGFkZHNcclxuICAgICAqIGl0IHRvIHRoZSBhcnJheSBvZiBzcGxpdHRlcnMgYXQgdGhlIHBvc2l0aW9uIHNwZWNpZmllZCBhcyB0aGUgaW5kZXggYXJndW1lbnRcclxuICAgICAqXHJcbiAgICAgKiBXaGF0IGl0IGRvZXNuJ3QgZG8gdGhvdWdoIGlzIGFwcGVuZCB0aGUgc3BsaXR0ZXIgdG8gdGhlIERPTVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgc3BsaXR0ZXJcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlU3BsaXR0ZXIoaW5kZXg6IG51bWJlcik6IFNwbGl0dGVyIHtcclxuICAgICAgICBjb25zdCBzcGxpdHRlciA9IG5ldyBTcGxpdHRlcih0aGlzLl9pc0NvbHVtbiwgdGhpcy5fc3BsaXR0ZXJTaXplLCB0aGlzLl9zcGxpdHRlckdyYWJTaXplKTtcclxuICAgICAgICBzcGxpdHRlci5vbignZHJhZycsIChvZmZzZXRYLCBvZmZzZXRZKSA9PiB0aGlzLm9uU3BsaXR0ZXJEcmFnKHNwbGl0dGVyLCBvZmZzZXRYLCBvZmZzZXRZKSk7XHJcbiAgICAgICAgc3BsaXR0ZXIub24oJ2RyYWdTdG9wJywgKCkgPT4gdGhpcy5vblNwbGl0dGVyRHJhZ1N0b3Aoc3BsaXR0ZXIpKTtcclxuICAgICAgICBzcGxpdHRlci5vbignZHJhZ1N0YXJ0JywgKCkgPT4gdGhpcy5vblNwbGl0dGVyRHJhZ1N0YXJ0KHNwbGl0dGVyKSk7XHJcbiAgICAgICAgdGhpcy5fc3BsaXR0ZXIuc3BsaWNlKGluZGV4LCAwLCBzcGxpdHRlcik7XHJcbiAgICAgICAgcmV0dXJuIHNwbGl0dGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9jYXRlcyB0aGUgaW5zdGFuY2Ugb2YgU3BsaXR0ZXIgaW4gdGhlIGFycmF5IG9mXHJcbiAgICAgKiByZWdpc3RlcmVkIHNwbGl0dGVycyBhbmQgcmV0dXJucyBhIG1hcCBjb250YWluaW5nIHRoZSBjb250ZW50SXRlbVxyXG4gICAgICogYmVmb3JlIGFuZCBhZnRlciB0aGUgc3BsaXR0ZXJzLCBib3RoIG9mIHdoaWNoIGFyZSBhZmZlY3RlZCBpZiB0aGVcclxuICAgICAqIHNwbGl0dGVyIGlzIG1vdmVkXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgQSBtYXAgb2YgY29udGVudEl0ZW1zIHRoYXQgdGhlIHNwbGl0dGVyIGFmZmVjdHNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFNwbGl0SXRlbXMoc3BsaXR0ZXI6IFNwbGl0dGVyKSB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9zcGxpdHRlci5pbmRleE9mKHNwbGl0dGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmVmb3JlOiB0aGlzLmNvbnRlbnRJdGVtc1tpbmRleF0sXHJcbiAgICAgICAgICAgIGFmdGVyOiB0aGlzLmNvbnRlbnRJdGVtc1tpbmRleCArIDFdXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUNvbnRlbnRJdGVtTWluU2l6ZShjb250ZW50SXRlbTogQ29udGVudEl0ZW0pIHtcclxuICAgICAgICBjb25zdCBtaW5TaXplID0gY29udGVudEl0ZW0ubWluU2l6ZTtcclxuICAgICAgICBpZiAobWluU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250ZW50SXRlbS5taW5TaXplVW5pdCA9PT0gU2l6ZVVuaXRFbnVtLlBpeGVsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWluU2l6ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignUk9DR01EOTg4MzEnLCBKU09OLnN0cmluZ2lmeShjb250ZW50SXRlbSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IHRoaXMubGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucztcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzQ29sdW1uID8gZGltZW5zaW9ucy5kZWZhdWx0TWluSXRlbUhlaWdodCA6IGRpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1XaWR0aDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIGRpbWVuc2lvbnMgZm9yIHRoZSBnaXZlbiBpdGVtIGNvbmZpZ3VyYXRpb24gYXJyYXlcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUNvbnRlbnRJdGVtc1RvdGFsTWluU2l6ZShjb250ZW50SXRlbXM6IHJlYWRvbmx5IENvbnRlbnRJdGVtW10pIHtcclxuICAgICAgICBsZXQgdG90YWxNaW5TaXplID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjb250ZW50SXRlbSBvZiBjb250ZW50SXRlbXMpIHtcclxuICAgICAgICAgICAgdG90YWxNaW5TaXplICs9IHRoaXMuY2FsY3VsYXRlQ29udGVudEl0ZW1NaW5TaXplKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0b3RhbE1pblNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIHdoZW4gYSBzcGxpdHRlcidzIGRyYWdMaXN0ZW5lciBmaXJlcyBkcmFnU3RhcnQuIENhbGN1bGF0ZXMgdGhlIHNwbGl0dGVyc1xyXG4gICAgICogbW92ZW1lbnQgYXJlYSBvbmNlIChzbyB0aGF0IGl0IGRvZXNuJ3QgbmVlZCBjYWxjdWxhdGluZyBvbiBldmVyeSBtb3VzZW1vdmUgZXZlbnQpXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvblNwbGl0dGVyRHJhZ1N0YXJ0KHNwbGl0dGVyOiBTcGxpdHRlcikge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRTcGxpdEl0ZW1zKHNwbGl0dGVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgYmVmb3JlV2lkdGggPSBwaXhlbHNUb051bWJlcihpdGVtcy5iZWZvcmUuZWxlbWVudC5zdHlsZVt0aGlzLl9kaW1lbnNpb25dKTtcclxuICAgICAgICBjb25zdCBhZnRlclNpemUgPSBwaXhlbHNUb051bWJlcihpdGVtcy5hZnRlci5lbGVtZW50LnN0eWxlW3RoaXMuX2RpbWVuc2lvbl0pO1xyXG4gICAgICAgIGNvbnN0IGJlZm9yZU1pblNpemUgPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRJdGVtc1RvdGFsTWluU2l6ZShpdGVtcy5iZWZvcmUuY29udGVudEl0ZW1zKTtcclxuICAgICAgICBjb25zdCBhZnRlck1pblNpemUgPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRJdGVtc1RvdGFsTWluU2l6ZShpdGVtcy5hZnRlci5jb250ZW50SXRlbXMpO1xyXG5cclxuICAgICAgICB0aGlzLl9zcGxpdHRlclBvc2l0aW9uID0gMDtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlck1pblBvc2l0aW9uID0gLTEgKiAoYmVmb3JlV2lkdGggLSBiZWZvcmVNaW5TaXplKTtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlck1heFBvc2l0aW9uID0gYWZ0ZXJTaXplIC0gYWZ0ZXJNaW5TaXplO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCB3aGVuIGEgc3BsaXR0ZXIncyBEcmFnTGlzdGVuZXIgZmlyZXMgZHJhZy4gVXBkYXRlcyB0aGUgc3BsaXR0ZXIncyBET00gcG9zaXRpb24sXHJcbiAgICAgKiBidXQgbm90IHRoZSBzaXplcyBvZiB0aGUgZWxlbWVudHMgdGhlIHNwbGl0dGVyIGNvbnRyb2xzIGluIG9yZGVyIHRvIG1pbmltaXplIHJlc2l6ZSBldmVudHNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc3BsaXR0ZXIgLVxyXG4gICAgICogQHBhcmFtIG9mZnNldFggLSBSZWxhdGl2ZSBwaXhlbCB2YWx1ZXMgdG8gdGhlIHNwbGl0dGVyJ3Mgb3JpZ2luYWwgcG9zaXRpb24uIENhbiBiZSBuZWdhdGl2ZVxyXG4gICAgICogQHBhcmFtIG9mZnNldFkgLSBSZWxhdGl2ZSBwaXhlbCB2YWx1ZXMgdG8gdGhlIHNwbGl0dGVyJ3Mgb3JpZ2luYWwgcG9zaXRpb24uIENhbiBiZSBuZWdhdGl2ZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25TcGxpdHRlckRyYWcoc3BsaXR0ZXI6IFNwbGl0dGVyLCBvZmZzZXRYOiBudW1iZXIsIG9mZnNldFk6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLl9pc0NvbHVtbiA/IG9mZnNldFkgOiBvZmZzZXRYO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fc3BsaXR0ZXJNaW5Qb3NpdGlvbiA9PT0gbnVsbCB8fCB0aGlzLl9zcGxpdHRlck1heFBvc2l0aW9uID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdST0NPU0Q1OTIyNicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvZmZzZXQgPSBNYXRoLm1heChvZmZzZXQsIHRoaXMuX3NwbGl0dGVyTWluUG9zaXRpb24pO1xyXG4gICAgICAgIG9mZnNldCA9IE1hdGgubWluKG9mZnNldCwgdGhpcy5fc3BsaXR0ZXJNYXhQb3NpdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyUG9zaXRpb24gPSBvZmZzZXQ7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0UGl4ZWxzID0gbnVtYmVyVG9QaXhlbHMob2Zmc2V0KTtcclxuICAgICAgICBpZiAodGhpcy5faXNDb2x1bW4pIHtcclxuICAgICAgICAgICAgc3BsaXR0ZXIuZWxlbWVudC5zdHlsZS50b3AgPSBvZmZzZXRQaXhlbHM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3BsaXR0ZXIuZWxlbWVudC5zdHlsZS5sZWZ0ID0gb2Zmc2V0UGl4ZWxzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludm9rZWQgd2hlbiBhIHNwbGl0dGVyJ3MgRHJhZ0xpc3RlbmVyIGZpcmVzIGRyYWdTdG9wLiBSZXNldHMgdGhlIHNwbGl0dGVycyBET00gcG9zaXRpb24sXHJcbiAgICAgKiBhbmQgYXBwbGllcyB0aGUgbmV3IHNpemVzIHRvIHRoZSBlbGVtZW50cyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBzcGxpdHRlciBhbmQgdGhlaXIgY2hpbGRyZW5cclxuICAgICAqIG9uIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25TcGxpdHRlckRyYWdTdG9wKHNwbGl0dGVyOiBTcGxpdHRlcikge1xyXG4gICAgICAgIGlmICh0aGlzLl9zcGxpdHRlclBvc2l0aW9uID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdST0NPU0RTNjY5MzInKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0U3BsaXRJdGVtcyhzcGxpdHRlcik7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpemVCZWZvcmUgPSBwaXhlbHNUb051bWJlcihpdGVtcy5iZWZvcmUuZWxlbWVudC5zdHlsZVt0aGlzLl9kaW1lbnNpb25dKTtcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZUFmdGVyID0gcGl4ZWxzVG9OdW1iZXIoaXRlbXMuYWZ0ZXIuZWxlbWVudC5zdHlsZVt0aGlzLl9kaW1lbnNpb25dKTtcclxuICAgICAgICAgICAgY29uc3Qgc3BsaXR0ZXJQb3NpdGlvbkluUmFuZ2UgPSAodGhpcy5fc3BsaXR0ZXJQb3NpdGlvbiArIHNpemVCZWZvcmUpIC8gKHNpemVCZWZvcmUgKyBzaXplQWZ0ZXIpO1xyXG4gICAgICAgICAgICBjb25zdCB0b3RhbFJlbGF0aXZlU2l6ZSA9IGl0ZW1zLmJlZm9yZS5zaXplICsgaXRlbXMuYWZ0ZXIuc2l6ZTtcclxuXHJcbiAgICAgICAgICAgIGl0ZW1zLmJlZm9yZS5zaXplID0gc3BsaXR0ZXJQb3NpdGlvbkluUmFuZ2UgKiB0b3RhbFJlbGF0aXZlU2l6ZTtcclxuICAgICAgICAgICAgaXRlbXMuYWZ0ZXIuc2l6ZSA9ICgxIC0gc3BsaXR0ZXJQb3NpdGlvbkluUmFuZ2UpICogdG90YWxSZWxhdGl2ZVNpemU7XHJcblxyXG4gICAgICAgICAgICBzcGxpdHRlci5lbGVtZW50LnN0eWxlLnRvcCA9IG51bWJlclRvUGl4ZWxzKDApO1xyXG4gICAgICAgICAgICBzcGxpdHRlci5lbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscygwKTtcclxuXHJcbiAgICAgICAgICAgIGdsb2JhbFRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMudXBkYXRlU2l6ZShmYWxzZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSb3dPckNvbHVtbiB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEFic29sdXRlU2l6ZXMge1xyXG4gICAgICAgIGl0ZW1TaXplczogbnVtYmVyW10sXHJcbiAgICAgICAgYWRkaXRpb25hbFBpeGVsOiBudW1iZXIsXHJcbiAgICAgICAgdG90YWxTaXplOiBudW1iZXIsXHJcbiAgICAgICAgY3Jvc3NBeGlzU2l6ZTogbnVtYmVyXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnREaW1lbnNpb25TaXplKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBkaW1lbnNpb246IFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUpOiBudW1iZXIge1xyXG4gICAgICAgIGlmIChkaW1lbnNpb24gPT09ICd3aWR0aCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRXaWR0aChlbGVtZW50KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2V0RWxlbWVudEhlaWdodChlbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHNldEVsZW1lbnREaW1lbnNpb25TaXplKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBkaW1lbnNpb246IFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZGltZW5zaW9uID09PSAnd2lkdGgnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRFbGVtZW50V2lkdGgoZWxlbWVudCwgdmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRFbGVtZW50SGVpZ2h0KGVsZW1lbnQsIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50LCBpc0NvbHVtbjogYm9vbGVhbik6IEhUTUxEaXZFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSXRlbSk7XHJcbiAgICAgICAgaWYgKGlzQ29sdW1uKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNvbHVtbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuUm93KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50SXRlbUNvbmZpZywgSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9jb25maWcnO1xyXG5pbXBvcnQgeyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLCBSZXNvbHZlZEl0ZW1Db25maWcsIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IEhlYWRlciB9IGZyb20gJy4uL2NvbnRyb2xzL2hlYWRlcic7XHJcbmltcG9ydCB7IEFzc2VydEVycm9yLCBVbmV4cGVjdGVkTnVsbEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRHJhZ0xpc3RlbmVyIH0gZnJvbSAnLi4vdXRpbHMvZHJhZy1saXN0ZW5lcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBBcmVhTGlua2VkUmVjdCwgSXRlbVR5cGUsIEpzb25WYWx1ZSwgU2lkZSwgU2l6ZVVuaXRFbnVtLCBXaWR0aEFuZEhlaWdodCwgV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHtcclxuICAgIGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCxcclxuICAgIG51bWJlclRvUGl4ZWxzLFxyXG4gICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5XHJcbn0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBhcmVudGFibGVJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2NvbnRlbnQtaXRlbSc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgU3RhY2sgZXh0ZW5kcyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9oZWFkZXJDb25maWc6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2hlYWRlcjogSGVhZGVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hpbGRFbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21heGltaXNlZEVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9hY3RpdmVDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJvcFNlZ21lbnQ6IFN0YWNrLlNlZ21lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kcm9wSW5kZXg6IG51bWJlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbnRlbnRBcmVhRGltZW5zaW9uczogU3RhY2suQ29udGVudEFyZWFEaW1lbnNpb25zO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaGVhZGVyU2lkZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luaXRpYWxXYW50TWF4aW1pc2U6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pbml0aWFsQWN0aXZlSXRlbUluZGV4OiBudW1iZXI7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcmVzaXplTGlzdGVuZXIgPSAoKSA9PiB0aGlzLmhhbmRsZVJlc2l6ZSgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbWF4aW1pc2VkTGlzdGVuZXIgPSAoKSA9PiB0aGlzLmhhbmRsZU1heGltaXNlZCgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbWluaW1pc2VkTGlzdGVuZXIgPSAoKSA9PiB0aGlzLmhhbmRsZU1pbmltaXNlZCgpO1xyXG5cclxuICAgIGdldCBjaGlsZEVsZW1lbnRDb250YWluZXIoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyOyB9XHJcbiAgICBnZXQgaGVhZGVyKCk6IEhlYWRlciB7IHJldHVybiB0aGlzLl9oZWFkZXI7IH1cclxuICAgIGdldCBoZWFkZXJTaG93KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faGVhZGVyLnNob3c7IH1cclxuICAgIGdldCBoZWFkZXJTaWRlKCk6IFNpZGUgeyByZXR1cm4gdGhpcy5faGVhZGVyLnNpZGU7IH1cclxuICAgIGdldCBoZWFkZXJMZWZ0UmlnaHRTaWRlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2hlYWRlci5sZWZ0UmlnaHRTaWRlZDsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0IGNvbnRlbnRBcmVhRGltZW5zaW9ucygpOiBTdGFjay5Db250ZW50QXJlYURpbWVuc2lvbnMgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zOyB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXQgaW5pdGlhbFdhbnRNYXhpbWlzZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2luaXRpYWxXYW50TWF4aW1pc2U7IH1cclxuICAgIGdldCBpc01heGltaXNlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMgPT09IHRoaXMubGF5b3V0TWFuYWdlci5tYXhpbWlzZWRTdGFjazsgfVxyXG4gICAgZ2V0IHN0YWNrUGFyZW50KCk6IENvbnRlbnRJdGVtIHtcclxuICAgICAgICBpZiAoIXRoaXMucGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3RhY2sgc2hvdWxkIGFsd2F5cyBoYXZlIGEgcGFyZW50Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLCBjb25maWc6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLCBwYXJlbnQ6IENvbnRlbnRJdGVtKSB7XHJcbiAgICAgICAgc3VwZXIobGF5b3V0TWFuYWdlciwgY29uZmlnLCBwYXJlbnQsIFN0YWNrLmNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQpKTtcclxuXHJcbiAgICAgICAgdGhpcy5faGVhZGVyQ29uZmlnID0gY29uZmlnLmhlYWRlcjtcclxuICAgICAgICBjb25zdCBsYXlvdXRIZWFkZXJDb25maWcgPSBsYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5oZWFkZXI7XHJcbiAgICAgICAgY29uc3QgY29uZmlnQ29udGVudCA9IGNvbmZpZy5jb250ZW50O1xyXG4gICAgICAgIC8vIElmIHN0YWNrIGhhcyBvbmx5IG9uZSBjb21wb25lbnQsIHRoZW4gd2UgY2FuIGFsc28gY2hlY2sgdGhpcyBmb3IgaGVhZGVyIHNldHRpbmdzXHJcbiAgICAgICAgbGV0IGNvbXBvbmVudEhlYWRlckNvbmZpZzogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChjb25maWdDb250ZW50Lmxlbmd0aCAhPT0gMSkge1xyXG4gICAgICAgICAgICBjb21wb25lbnRIZWFkZXJDb25maWcgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmlyc3RDaGlsZEl0ZW1Db25maWcgPSBjb25maWdDb250ZW50WzBdO1xyXG4gICAgICAgICAgICBjb21wb25lbnRIZWFkZXJDb25maWcgPSAoZmlyc3RDaGlsZEl0ZW1Db25maWcgYXMgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcpLmhlYWRlcjsgLy8gd2lsbCBiZSB1bmRlZmluZWQgaWYgbm90IGNvbXBvbmVudCAoYW5kIHdvbnQgYmUgc3RhY2spXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pbml0aWFsV2FudE1heGltaXNlID0gY29uZmlnLm1heGltaXNlZDtcclxuICAgICAgICB0aGlzLl9pbml0aWFsQWN0aXZlSXRlbUluZGV4ID0gY29uZmlnLmFjdGl2ZUl0ZW1JbmRleCA/PyAwOyAvLyBtYWtlIHN1cmUgZGVmaW5lZFxyXG5cclxuICAgICAgICAvLyBjaGVjayBmb3IgZGVmaW5lZCB2YWx1ZSBmb3IgZWFjaCBpdGVtIGluIG9yZGVyIG9mIFN0YWNrICh0aGlzIEl0ZW0pLCBDb21wb25lbnQgKGZpcnN0IGNoaWxkKSwgTWFuYWdlci5cclxuICAgICAgICBjb25zdCBzaG93ID0gdGhpcy5faGVhZGVyQ29uZmlnPy5zaG93ID8/IGNvbXBvbmVudEhlYWRlckNvbmZpZz8uc2hvdyA/PyBsYXlvdXRIZWFkZXJDb25maWcuc2hvdztcclxuICAgICAgICBjb25zdCBwb3BvdXQgPSB0aGlzLl9oZWFkZXJDb25maWc/LnBvcG91dCA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/LnBvcG91dCA/PyBsYXlvdXRIZWFkZXJDb25maWcucG9wb3V0O1xyXG4gICAgICAgIGNvbnN0IG1heGltaXNlID0gdGhpcy5faGVhZGVyQ29uZmlnPy5tYXhpbWlzZSA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/Lm1heGltaXNlID8/IGxheW91dEhlYWRlckNvbmZpZy5tYXhpbWlzZTtcclxuICAgICAgICBjb25zdCBjbG9zZSA9IHRoaXMuX2hlYWRlckNvbmZpZz8uY2xvc2UgPz8gY29tcG9uZW50SGVhZGVyQ29uZmlnPy5jbG9zZSA/PyBsYXlvdXRIZWFkZXJDb25maWcuY2xvc2U7XHJcbiAgICAgICAgY29uc3QgbWluaW1pc2UgPSB0aGlzLl9oZWFkZXJDb25maWc/Lm1pbmltaXNlID8/IGNvbXBvbmVudEhlYWRlckNvbmZpZz8ubWluaW1pc2UgPz8gbGF5b3V0SGVhZGVyQ29uZmlnLm1pbmltaXNlO1xyXG4gICAgICAgIGNvbnN0IHRhYkRyb3Bkb3duID0gdGhpcy5faGVhZGVyQ29uZmlnPy50YWJEcm9wZG93biA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/LnRhYkRyb3Bkb3duID8/IGxheW91dEhlYWRlckNvbmZpZy50YWJEcm9wZG93bjtcclxuICAgICAgICB0aGlzLl9tYXhpbWlzZWRFbmFibGVkID0gbWF4aW1pc2UgIT09IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlclNldHRpbmdzOiBIZWFkZXIuU2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgIHNob3c6IHNob3cgIT09IGZhbHNlLFxyXG4gICAgICAgICAgICBzaWRlOiBzaG93ID09PSBmYWxzZSA/IFNpZGUudG9wIDogc2hvdyxcclxuICAgICAgICAgICAgcG9wb3V0RW5hYmxlZDogcG9wb3V0ICE9PSBmYWxzZSxcclxuICAgICAgICAgICAgcG9wb3V0TGFiZWw6IHBvcG91dCA9PT0gZmFsc2UgPyAnJyA6IHBvcG91dCxcclxuICAgICAgICAgICAgbWF4aW1pc2VFbmFibGVkOiB0aGlzLl9tYXhpbWlzZWRFbmFibGVkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZUxhYmVsOiBtYXhpbWlzZSA9PT0gZmFsc2UgPyAnJyA6IG1heGltaXNlLFxyXG4gICAgICAgICAgICBjbG9zZUVuYWJsZWQ6IGNsb3NlICE9PSBmYWxzZSxcclxuICAgICAgICAgICAgY2xvc2VMYWJlbDogY2xvc2UgPT09IGZhbHNlID8gJycgOiBjbG9zZSxcclxuICAgICAgICAgICAgbWluaW1pc2VFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICBtaW5pbWlzZUxhYmVsOiBtaW5pbWlzZSxcclxuICAgICAgICAgICAgdGFiRHJvcGRvd25FbmFibGVkOiB0YWJEcm9wZG93biAhPT0gZmFsc2UsXHJcbiAgICAgICAgICAgIHRhYkRyb3Bkb3duTGFiZWw6IHRhYkRyb3Bkb3duID09PSBmYWxzZSA/ICcnIDogdGFiRHJvcGRvd24sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5faGVhZGVyID0gbmV3IEhlYWRlcihsYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgICAgICB0aGlzLCBoZWFkZXJTZXR0aW5ncyxcclxuICAgICAgICAgICAgKCkgPT4gdGhpcy5nZXRBY3RpdmVDb21wb25lbnRJdGVtKCksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMucmVtb3ZlKCksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMuaGFuZGxlUG9wb3V0RXZlbnQoKSxcclxuICAgICAgICAgICAgKCkgPT4gdGhpcy50b2dnbGVNYXhpbWlzZSgpLFxyXG4gICAgICAgICAgICAoZXYpID0+IHRoaXMuaGFuZGxlSGVhZGVyQ2xpY2tFdmVudChldiksXHJcbiAgICAgICAgICAgIChldikgPT4gdGhpcy5oYW5kbGVIZWFkZXJUb3VjaFN0YXJ0RXZlbnQoZXYpLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVIZWFkZXJDb21wb25lbnRSZW1vdmVFdmVudChpdGVtKSxcclxuICAgICAgICAgICAgKGl0ZW0pID0+IHRoaXMuaGFuZGxlSGVhZGVyQ29tcG9uZW50Rm9jdXNFdmVudChpdGVtKSxcclxuICAgICAgICAgICAgKHgsIHksIGRyYWdMaXN0ZW5lciwgaXRlbSkgPT4gdGhpcy5oYW5kbGVIZWFkZXJDb21wb25lbnRTdGFydERyYWdFdmVudCh4LCB5LCBkcmFnTGlzdGVuZXIsIGl0ZW0pLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMuX2Ryb3Bab25lcyA9IHt9O1xyXG5cclxuICAgICAgICB0aGlzLmlzU3RhY2sgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5JdGVtcyk7XHJcblxyXG4gICAgICAgIHRoaXMub24oJ3Jlc2l6ZScsIHRoaXMuX3Jlc2l6ZUxpc3RlbmVyKTtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VkRW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm9uKCdtYXhpbWlzZWQnLCB0aGlzLl9tYXhpbWlzZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMub24oJ21pbmltaXNlZCcsIHRoaXMuX21pbmltaXNlZExpc3RlbmVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9oZWFkZXIuZWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dXBIZWFkZXJQb3NpdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIHVwZGF0ZVNpemUoZm9yY2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuYmVnaW5WaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGVudEl0ZW1zU2l6ZShmb3JjZSk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVuZFZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBpbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGlzZWQgPT09IHRydWUpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLmluaXQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1Db3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGNvbnRlbnRJdGVtQ291bnQgPiAwKSB7IC8vIGNvbnRlbnRJdGVtQ291bnQgd2lsbCBiZSAwIG9uIGRyYWcgZHJvcFxyXG4gICAgICAgICAgICBpZiAodGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleCA8IDAgfHwgdGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleCA+PSBjb250ZW50SXRlbUNvdW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFjdGl2ZUl0ZW1JbmRleCBvdXQgb2YgcmFuZ2U6ICR7dGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleH0gaWQ6ICR7dGhpcy5pZH1gKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29udGVudEl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRJdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YWNrIENvbnRlbnQgSXRlbSBpcyBub3Qgb2YgdHlwZSBDb21wb25lbnRJdGVtOiAke2l9IGlkOiAke3RoaXMuaWR9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVhZGVyLmNyZWF0ZVRhYihjb250ZW50SXRlbSwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uY29udGFpbmVyLnNldEJhc2VMb2dpY2FsWkluZGV4KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQ29tcG9uZW50SXRlbShjb250ZW50SXRlbXNbdGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleF0gYXMgQ29tcG9uZW50SXRlbSwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWRlci51cGRhdGVUYWJTaXplcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmluaXRDb250ZW50SXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoU3RhY2s6Y2xhc3MpLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW19ICovXHJcbiAgICBzZXRBY3RpdmVDb250ZW50SXRlbShpdGVtOiBDb250ZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghQ29udGVudEl0ZW0uaXNDb21wb25lbnRJdGVtKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3RhY2suc2V0QWN0aXZlQ29udGVudEl0ZW06IGl0ZW0gaXMgbm90IGEgQ29tcG9uZW50SXRlbScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQ29tcG9uZW50SXRlbShpdGVtLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSwgZm9jdXM6IGJvb2xlYW4sIHN1cHByZXNzRm9jdXNFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0gIT09IGNvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmluZGV4T2YoY29tcG9uZW50SXRlbSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudEl0ZW0gaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBzdGFjaycpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmJlZ2luU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0uaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtID0gY29tcG9uZW50SXRlbTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oZWFkZXIucHJvY2Vzc0FjdGl2ZUNvbXBvbmVudENoYW5nZWQoY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SXRlbS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbmRTaXplSW52YWxpZGF0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdhY3RpdmVDb250ZW50SXRlbUNoYW5nZWQnLCBjb21wb25lbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbWl0KCdhY3RpdmVDb250ZW50SXRlbUNoYW5nZWQnLCBjb21wb25lbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWQgfHwgZm9jdXMpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnNldEZvY3VzZWRDb21wb25lbnRJdGVtKGNvbXBvbmVudEl0ZW0sIHN1cHByZXNzRm9jdXNFdmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChTdGFjazpjbGFzcykuZ2V0QWN0aXZlQ29tcG9uZW50SXRlbX0gKi9cclxuICAgIGdldEFjdGl2ZUNvbnRlbnRJdGVtKCk6IENvbnRlbnRJdGVtIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpID8/IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmb2N1c0FjdGl2ZUNvbnRlbnRJdGVtKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0/LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgc2V0Rm9jdXNlZFZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLmFwcGx5Rm9jdXNlZFZhbHVlKHZhbHVlKTtcclxuICAgICAgICBzdXBlci5zZXRGb2N1c2VkVmFsdWUodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG5ld0NvbXBvbmVudChjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZywgaW5kZXg/OiBudW1iZXIpOiBDb21wb25lbnRJdGVtIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3SXRlbShpdGVtQ29uZmlnLCBpbmRleCkgYXMgQ29tcG9uZW50SXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRDb21wb25lbnQoY29tcG9uZW50VHlwZTogSnNvblZhbHVlLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGU/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkSXRlbShpdGVtQ29uZmlnLCBpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmV3SXRlbShpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnLCAgaW5kZXg/OiBudW1iZXIpOiBDb250ZW50SXRlbSB7XHJcbiAgICAgICAgaW5kZXggPSB0aGlzLmFkZEl0ZW0oaXRlbUNvbmZpZywgaW5kZXgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRJdGVtc1tpbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgYWRkSXRlbShpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnLCBpbmRleD86IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmNoZWNrTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpO1xyXG5cclxuICAgICAgICBjb25zdCByZXNvbHZlZEl0ZW1Db25maWcgPSBJdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZywgZmFsc2UpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShyZXNvbHZlZEl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgYWRkQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBpbmRleD86IG51bWJlciwgZm9jdXMgPSBmYWxzZSk6IG51bWJlciB7XHJcbiAgICAgICAgaWYoaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCl7XHJcbiAgICAgICAgICAgIGluZGV4IC09IDE7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignU0FDOTk3MjgnKTsgLy8gdW5kaXNwbGF5Q2hpbGQoKSByZW1vdmVkIHNvIHRoaXMgY29uZGl0aW9uIHNob3VsZCBubyBsb25nZXIgb2NjdXJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50SXRlbSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdTQUNDODg1MzInKTsgLy8gU3RhY2tzIGNhbiBvbmx5IGhhdmUgQ29tcG9uZW50IGNoaWxkcmVuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW5kZXggPSBzdXBlci5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5kZXgpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuYXBwZW5kQ2hpbGQoY29udGVudEl0ZW0uZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlci5jcmVhdGVUYWIoY29udGVudEl0ZW0sIGluZGV4KTtcclxuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVDb21wb25lbnRJdGVtKGNvbnRlbnRJdGVtLCBmb2N1cyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlci51cGRhdGVUYWJTaXplcygpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5jb250YWluZXIuc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSByZW1vdmVDaGlsZChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGtlZXBDaGlsZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEl0ZW0gPSBjb250ZW50SXRlbSBhcyBDb21wb25lbnRJdGVtO1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb250ZW50SXRlbXMuaW5kZXhPZihjb21wb25lbnRJdGVtKTtcclxuICAgICAgICBjb25zdCBzdGFja1dpbGxCZURlbGV0ZWQgPSB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPT09IDE7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtID09PSBjb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRJdGVtLmZvY3VzZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudEl0ZW0uYmx1cigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghc3RhY2tXaWxsQmVEZWxldGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlJ3JlIGFscmVhZHkgc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBjb250ZW50IGl0ZW0gbGVmdCAqYWZ0ZXIqXHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmluZyBjb250ZW50SXRlbSwgc28gd2UgY2FuIHNhZmVseSBhc3N1bWUgaW5kZXggMSBpcyBhIHZhbGlkIG9uZSBpZlxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGluZGV4IG9mIGNvbnRlbnRJdGVtIGlzIDAsIG90aGVyd2lzZSB3ZSBqdXN0IHVzZSB0aGUgcHJldmlvdXMgY29udGVudCBpdGVtLlxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3QWN0aXZlQ29tcG9uZW50SWR4ID0gaW5kZXggPT09IDAgPyAxIDogaW5kZXggLSAxO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVDb21wb25lbnRJdGVtKHRoaXMuY29udGVudEl0ZW1zW25ld0FjdGl2ZUNvbXBvbmVudElkeF0gYXMgQ29tcG9uZW50SXRlbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9oZWFkZXIucmVtb3ZlVGFiKGNvbXBvbmVudEl0ZW0pO1xyXG5cclxuICAgICAgICBzdXBlci5yZW1vdmVDaGlsZChjb21wb25lbnRJdGVtLCBrZWVwQ2hpbGQpO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWF4aW1pc2VzIHRoZSBJdGVtIG9yIG1pbmltaXNlcyBpdCBpZiBpdCBpcyBhbHJlYWR5IG1heGltaXNlZFxyXG4gICAgICovXHJcbiAgICB0b2dnbGVNYXhpbWlzZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc01heGltaXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1pbmltaXNlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXhpbWlzZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtYXhpbWlzZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNNYXhpbWlzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnNldE1heGltaXNlZFN0YWNrKHRoaXMpO1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSB0aGlzLmNvbnRlbnRJdGVtcztcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW1Db3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50SXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5lbnRlclN0YWNrTWF4aW1pc2VkKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignU01BWEk4Nzc3MycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG1pbmltaXNlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTWF4aW1pc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5zZXRNYXhpbWlzZWRTdGFjayh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSB0aGlzLmNvbnRlbnRJdGVtcztcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW1Db3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50SXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5leGl0U3RhY2tNYXhpbWlzZWQoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdTTUlOSTg3NzczJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbT8uZm9jdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtLmJsdXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMub2ZmKCdyZXNpemUnLCB0aGlzLl9yZXNpemVMaXN0ZW5lcik7XHJcbiAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZEVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vZmYoJ21heGltaXNlZCcsIHRoaXMuX21heGltaXNlZExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5vZmYoJ21pbmltaXNlZCcsIHRoaXMuX21pbmltaXNlZExpc3RlbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICB0b0NvbmZpZygpOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgbGV0IGFjdGl2ZUl0ZW1JbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgIGFjdGl2ZUl0ZW1JbmRleCA9IHRoaXMuY29udGVudEl0ZW1zLmluZGV4T2YodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVJdGVtSW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FjdGl2ZSBjb21wb25lbnQgaXRlbSBub3QgZm91bmQgaW4gc3RhY2snKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCAmJiBhY3RpdmVJdGVtSW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIG5vbi1lbXB0eSBzdGFjayB0byBoYXZlIGFuIGFjdGl2ZSBjb21wb25lbnQgaXRlbScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RhY2snLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogdGhpcy5jYWxjdWxhdGVDb25maWdDb250ZW50KCkgYXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10sXHJcbiAgICAgICAgICAgICAgICBzaXplOiB0aGlzLnNpemUsXHJcbiAgICAgICAgICAgICAgICBzaXplVW5pdDogdGhpcy5zaXplVW5pdCxcclxuICAgICAgICAgICAgICAgIG1pblNpemU6IHRoaXMubWluU2l6ZSxcclxuICAgICAgICAgICAgICAgIG1pblNpemVVbml0OiB0aGlzLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXHJcbiAgICAgICAgICAgICAgICBpc0Nsb3NhYmxlOiB0aGlzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgICAgICBtYXhpbWlzZWQ6IHRoaXMuaXNNYXhpbWlzZWQsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXI6IHRoaXMuY3JlYXRlSGVhZGVyQ29uZmlnKCksXHJcbiAgICAgICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXgsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPaywgdGhpcyBvbmUgaXMgZ29pbmcgdG8gYmUgdGhlIHRyaWNreSBvbmU6IFRoZSB1c2VyIGhhcyBkcm9wcGVkIGEge0BsaW5rIChDb250ZW50SXRlbTpjbGFzcyl9IG9udG8gdGhpcyBzdGFjay5cclxuICAgICAqXHJcbiAgICAgKiBJdCB3YXMgZHJvcHBlZCBvbiBlaXRoZXIgdGhlIHN0YWNrcyBoZWFkZXIgb3IgdGhlIHRvcCwgcmlnaHQsIGJvdHRvbSBvciBsZWZ0IGJpdCBvZiB0aGUgY29udGVudCBhcmVhXHJcbiAgICAgKiAod2hpY2ggb25lIG9mIHRob3NlIGlzIHN0b3JlZCBpbiB0aGlzLl9kcm9wU2VnbWVudCkuIE5vdywgaWYgdGhlIHVzZXIgaGFzIGRyb3BwZWQgb24gdGhlIGhlYWRlciB0aGUgY2FzZVxyXG4gICAgICogaXMgcmVsYXRpdmVseSBjbGVhcjogV2UgYWRkIHRoZSBpdGVtIHRvIHRoZSBleGlzdGluZyBzdGFjay4uLiBqb2IgZG9uZSAobWlnaHQgYmUgZ29vZCB0byBoYXZlXHJcbiAgICAgKiB0YWIgcmVvcmRlcmluZyBhdCBzb21lIHBvaW50LCBidXQgbGV0cyBub3Qgc3dlYXQgaXQgcmlnaHQgbm93KVxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBpdGVtIHdhcyBkcm9wcGVkIG9uIHRoZSBjb250ZW50IHBhcnQgdGhpbmdzIGFyZSBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkLiBJZiBpdCB3YXMgZHJvcHBlZCBvbiBlaXRoZXIgdGhlXHJcbiAgICAgKiB0b3Agb3IgYm90dG9tIHJlZ2lvbiB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBjb2x1bW4gYW5kIHBsYWNlIHRoZSBpdGVtcyBhY2NvcmRpbmdseS5cclxuICAgICAqIFVubGVzcywgb2YgY291cnNlIGlmIHRoZSBzdGFjayBpcyBhbHJlYWR5IHdpdGhpbiBhIGNvbHVtbi4uLiBpbiB3aGljaCBjYXNlIHdlIHdhbnRcclxuICAgICAqIHRvIGFkZCB0aGUgbmV3bHkgY3JlYXRlZCBpdGVtIHRvIHRoZSBleGlzdGluZyBjb2x1bW4uLi5cclxuICAgICAqIGVpdGhlciBwcmVwZW5kIG9yIGFwcGVuZCBpdCwgZGVwZW5kaW5nIG9uIHdldGhlciBpdHMgdG9wIG9yIGJvdHRvbS5cclxuICAgICAqXHJcbiAgICAgKiBTYW1lIHRoaW5nIGZvciByb3dzIGFuZCBsZWZ0IC8gcmlnaHQgZHJvcCBzZWdtZW50cy4uLiBzbyBpbiB0b3RhbCB0aGVyZSBhcmUgOSB0aGluZ3MgdGhhdCBjYW4gcG90ZW50aWFsbHkgaGFwcGVuXHJcbiAgICAgKiAobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSAqIGlzIGNoaWxkIG9mIHRoZSByaWdodCBwYXJlbnQgKHJvdywgY29sdW1uKSArIGhlYWRlciBkcm9wXHJcbiAgICAgKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG92ZXJyaWRlIG9uRHJvcChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGFyZWE6IENvbnRlbnRJdGVtLkFyZWEpOiB2b2lkIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIFRoZSBpdGVtIHdhcyBkcm9wcGVkIG9uIHRoZSBoZWFkZXIgYXJlYS4gSnVzdCBhZGQgaXQgYXMgYSBjaGlsZCBvZiB0aGlzIHN0YWNrIGFuZFxyXG4gICAgICAgICAqIGdldCB0aGUgaGVsbCBvdXQgb2YgdGhpcyBsb2dpY1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5IZWFkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNldEhlYWRlckRyb3Bab25lKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcm9wSW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignU09EREk2ODk5MCcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZChjb250ZW50SXRlbSwgdGhpcy5fZHJvcEluZGV4KTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBUaGUgc3RhY2sgaXMgZW1wdHkuIExldCdzIGp1c3QgYWRkIHRoZSBlbGVtZW50LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5Cb2R5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGQoY29udGVudEl0ZW0sIDAsIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIFRoZSBpdGVtIHdhcyBkcm9wcGVkIG9uIHRoZSB0b3AtLCBsZWZ0LSwgYm90dG9tLSBvciByaWdodC0gcGFydCBvZiB0aGUgY29udGVudC4gTGV0J3NcclxuICAgICAgICAgKiBhZ2dyZWdhdGUgc29tZSBjb25kaXRpb25zIHRvIG1ha2UgdGhlIGlmIHN0YXRlbWVudHMgbGF0ZXIgb24gbW9yZSByZWFkYWJsZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5Ub3AgfHwgdGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuQm90dG9tO1xyXG4gICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LkxlZnQgfHwgdGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuUmlnaHQ7XHJcbiAgICAgICAgY29uc3QgaW5zZXJ0QmVmb3JlID0gdGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuVG9wIHx8IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LkxlZnQ7XHJcbiAgICAgICAgY29uc3QgaGFzQ29ycmVjdFBhcmVudCA9IChpc1ZlcnRpY2FsICYmIHRoaXMuc3RhY2tQYXJlbnQuaXNDb2x1bW4pIHx8IChpc0hvcml6b250YWwgJiYgdGhpcy5zdGFja1BhcmVudC5pc1Jvdyk7XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogVGhlIGNvbnRlbnQgaXRlbSBjYW4gYmUgZWl0aGVyIGEgY29tcG9uZW50IG9yIGEgc3RhY2suIElmIGl0IGlzIGEgY29tcG9uZW50LCB3cmFwIGl0IGludG8gYSBzdGFja1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChjb250ZW50SXRlbS5pc0NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBpdGVtQ29uZmlnLmhlYWRlciA9IChjb250ZW50SXRlbSBhcyBDb21wb25lbnRJdGVtKS5oZWFkZXJDb25maWc7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShpdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgc3RhY2suYWRkQ2hpbGQoY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbSA9IHN0YWNrO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogSWYgdGhlIGNvbnRlbnRJdGVtIHRoYXQncyBiZWluZyBkcm9wcGVkIGlzIG5vdCBkcm9wcGVkIG9uIGEgU3RhY2sgKGNhc2VzIHdoaWNoIGp1c3QgcGFzc2VkIGFib3ZlIGFuZFxyXG4gICAgICAgICAqIHdoaWNoIHdvdWxkIHdyYXAgdGhlIGNvbnRlbnRJdGVtIGluIGEgU3RhY2spIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBjb250ZW50SXRlbSBpcyBhIFJvd09yQ29sdW1uLlxyXG4gICAgICAgICAqIElmIGl0IGlzLCB3ZSBuZWVkIHRvIHJlLXdyYXAgaXQgaW4gYSBTdGFjayBsaWtlIGl0IHdhcyB3aGVuIGl0IHdhcyBkcmFnZ2VkIGJ5IGl0cyBUYWIgKGl0IHdhcyBkcmFnZ2VkISkuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYoY29udGVudEl0ZW0udHlwZSA9PT0gSXRlbVR5cGUucm93IHx8IGNvbnRlbnRJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLmNvbHVtbil7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGl0ZW1Db25maWcuaGVhZGVyID0gdGhpcy5jcmVhdGVIZWFkZXJDb25maWcoKTtcclxuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQ29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgIHN0YWNrLmFkZENoaWxkKGNvbnRlbnRJdGVtKVxyXG4gICAgICAgICAgICBjb250ZW50SXRlbSA9IHN0YWNrXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIElmIHRoZSBpdGVtIGlzIGRyb3BwZWQgb24gdG9wIG9yIGJvdHRvbSBvZiBhIGNvbHVtbiBvciBsZWZ0IGFuZCByaWdodCBvZiBhIHJvdywgaXQncyBhbHJlYWR5XHJcbiAgICAgICAgICogbGF5ZCBvdXQgaW4gdGhlIGNvcnJlY3Qgd2F5LiBKdXN0IGFkZCBpdCBhcyBhIGNoaWxkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGhhc0NvcnJlY3RQYXJlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnN0YWNrUGFyZW50LmNvbnRlbnRJdGVtcy5pbmRleE9mKHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLnN0YWNrUGFyZW50LmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbnNlcnRCZWZvcmUgPyBpbmRleCA6IGluZGV4ICsgMSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2l6ZSAqPSAwLjU7XHJcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSB0aGlzLnNpemU7XHJcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gdGhpcy5zaXplVW5pdDtcclxuICAgICAgICAgICAgdGhpcy5zdGFja1BhcmVudC51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICogVGhpcyBoYW5kbGVzIGl0ZW1zIHRoYXQgYXJlIGRyb3BwZWQgb24gdG9wIG9yIGJvdHRvbSBvZiBhIHJvdyBvciBsZWZ0IC8gcmlnaHQgb2YgYSBjb2x1bW4uIFdlIG5lZWRcclxuICAgICAgICAgICAgICogdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50SXRlbSBmb3IgdGhlbSB0byBsaXZlIGluXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBpc1ZlcnRpY2FsID8gSXRlbVR5cGUuY29sdW1uIDogSXRlbVR5cGUucm93O1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gUmVzb2x2ZWRJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQodHlwZSkgYXMgUmVzb2x2ZWRJdGVtQ29uZmlnO1xyXG4gICAgICAgICAgICBjb25zdCByb3dPckNvbHVtbiA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVDb250ZW50SXRlbShpdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5zdGFja1BhcmVudC5yZXBsYWNlQ2hpbGQodGhpcywgcm93T3JDb2x1bW4pO1xyXG5cclxuICAgICAgICAgICAgcm93T3JDb2x1bW4uYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluc2VydEJlZm9yZSA/IDAgOiB1bmRlZmluZWQsIHRydWUpO1xyXG4gICAgICAgICAgICByb3dPckNvbHVtbi5hZGRDaGlsZCh0aGlzLCBpbnNlcnRCZWZvcmUgPyB1bmRlZmluZWQgOiAwLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IDUwO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gNTA7XHJcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgIHJvd09yQ29sdW1uLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHRoZSB1c2VyIGhvdmVycyBhYm92ZSB0aGUgaGVhZGVyIHBhcnQgb2YgdGhlIHN0YWNrLCBpbmRpY2F0ZSBkcm9wIHBvc2l0aW9ucyBmb3IgdGFicy5cclxuICAgICAqIG90aGVyd2lzZSBpbmRpY2F0ZSB3aGljaCBzZWdtZW50IG9mIHRoZSBib2R5IHRoZSBkcmFnZ2VkIGl0ZW0gd291bGQgYmUgZHJvcHBlZCBvblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB4IC0gQWJzb2x1dGUgU2NyZWVuIFhcclxuICAgICAqIEBwYXJhbSB5IC0gQWJzb2x1dGUgU2NyZWVuIFlcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSBoaWdobGlnaHREcm9wWm9uZSh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWdtZW50ID0ga2V5IGFzIFN0YWNrLlNlZ21lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnNbc2VnbWVudF0uaG92ZXJBcmVhO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZWEueDEgPCB4ICYmIGFyZWEueDIgPiB4ICYmIGFyZWEueTEgPCB5ICYmIGFyZWEueTIgPiB5KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJvcFNlZ21lbnQgPSBTdGFjay5TZWdtZW50LkhlYWRlcjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodEhlYWRlckRyb3Bab25lKHRoaXMuX2hlYWRlci5sZWZ0UmlnaHRTaWRlZCA/IHkgOiB4KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEhlYWRlckRyb3Bab25lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRCb2R5RHJvcFpvbmUoc2VnbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldEFyZWEoKTogQ29udGVudEl0ZW0uQXJlYSB8IG51bGwge1xyXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaGVhZGVyQXJlYSA9IHN1cGVyLmdldEVsZW1lbnRBcmVhKHRoaXMuX2hlYWRlci5lbGVtZW50KTtcclxuICAgICAgICBjb25zdCBjb250ZW50QXJlYSA9IHN1cGVyLmdldEVsZW1lbnRBcmVhKHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lcik7XHJcbiAgICAgICAgaWYgKGhlYWRlckFyZWEgPT09IG51bGwgfHwgY29udGVudEFyZWEgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1NHQUhDMTMwODYnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29udGVudFdpZHRoID0gY29udGVudEFyZWEueDIgLSBjb250ZW50QXJlYS54MTtcclxuICAgICAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gY29udGVudEFyZWEueTIgLSBjb250ZW50QXJlYS55MTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zID0ge1xyXG4gICAgICAgICAgICBoZWFkZXI6IHtcclxuICAgICAgICAgICAgICAgIGhvdmVyQXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBoZWFkZXJBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBoZWFkZXJBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBoZWFkZXJBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBoZWFkZXJBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0QXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBoZWFkZXJBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBoZWFkZXJBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBoZWFkZXJBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBoZWFkZXJBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIaWdobGlnaHQgdGhlIGVudGlyZSBib2R5IGlmIHRoZSBzdGFjayBpcyBlbXB0eVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPT09IDApIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucy5ib2R5ID0ge1xyXG4gICAgICAgICAgICAgICAgaG92ZXJBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDIsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0QXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRBcmVhKHRoaXMuZWxlbWVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zLmxlZnQgPSB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuMjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0QXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngxICsgY29udGVudFdpZHRoICogMC41LFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zLnRvcCA9IHtcclxuICAgICAgICAgICAgICAgIGhvdmVyQXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuMjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuNzUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkxICsgY29udGVudEhlaWdodCAqIDAuNVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTEgKyBjb250ZW50SGVpZ2h0ICogMC41XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnMucmlnaHQgPSB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjc1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDIsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0QXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuNSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zLmJvdHRvbSA9IHtcclxuICAgICAgICAgICAgICAgIGhvdmVyQXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuMjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxICsgY29udGVudEhlaWdodCAqIDAuNSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjc1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxICsgY29udGVudEhlaWdodCAqIDAuNSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDIsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RWxlbWVudEFyZWEodGhpcy5lbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9ncmFtbWF0aWNhbGx5IG9wZXJhdGUgd2l0aCBoZWFkZXIgcG9zaXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIC1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBwcmV2aW91cyBoZWFkZXIgcG9zaXRpb25cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwb3NpdGlvbkhlYWRlcihwb3NpdGlvbjogU2lkZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9oZWFkZXIuc2lkZSAhPT0gcG9zaXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5faGVhZGVyLnNldFNpZGUocG9zaXRpb24pO1xyXG4gICAgICAgICAgICB0aGlzLl9oZWFkZXJTaWRlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dXBIZWFkZXJQb3NpdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZU5vZGVTaXplKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQ6IFdpZHRoQW5kSGVpZ2h0ID0gZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0KHRoaXMuZWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5faGVhZGVyLnNob3cpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuX2hlYWRlci5sZWZ0UmlnaHRTaWRlZCA/IFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUud2lkdGggOiBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lLmhlaWdodDtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRbZGltZW5zaW9uXSAtPSB0aGlzLmxheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnMuaGVhZGVySGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5zdHlsZS53aWR0aCA9IG51bWJlclRvUGl4ZWxzKGNvbnRlbnQud2lkdGgpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gbnVtYmVyVG9QaXhlbHMoY29udGVudC5oZWlnaHQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50LnN0eWxlLndpZHRoID0gbnVtYmVyVG9QaXhlbHMoY29udGVudC53aWR0aCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKGNvbnRlbnQuaGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3Jlc2l6ZScpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhpZ2hsaWdodEhlYWRlckRyb3Bab25lKHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZpc2libGVUYWJzTGVuZ3RoID0gdGhpcy5faGVhZGVyLmxhc3RWaXNpYmxlVGFiSW5kZXggKyAxO1xyXG4gICAgICAgIGNvbnN0IHRhYnNDb250YWluZXJFbGVtZW50ID0gdGhpcy5faGVhZGVyLnRhYnNDb250YWluZXJFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHRhYnNDb250YWluZXJFbGVtZW50Q2hpbGROb2RlcyA9IHRhYnNDb250YWluZXJFbGVtZW50LmNoaWxkTm9kZXM7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBzaGFsbG93IGNvcHkgb2YgY2hpbGROb2RlcyBsaXN0LCBleGNsdWRpbmcgRHJvcFBsYWNlSG9sZGVyLCBhcyB3ZSB3aWxsIGJlIG1vZGlmeWluZyB0aGUgY2hpbGROb2RlcyBsaXN0XHJcbiAgICAgICAgY29uc3QgdmlzaWJsZVRhYkVsZW1lbnRzID0gbmV3IEFycmF5PEhUTUxFbGVtZW50Pih2aXNpYmxlVGFic0xlbmd0aCk7XHJcbiAgICAgICAgbGV0IHRhYkluZGV4ID0gMDtcclxuICAgICAgICBsZXQgdGFiQ291bnQgPSAwO1xyXG4gICAgICAgIHdoaWxlICh0YWJDb3VudCA8IHZpc2libGVUYWJzTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVUYWJFbGVtZW50ID0gdGFic0NvbnRhaW5lckVsZW1lbnRDaGlsZE5vZGVzW3RhYkluZGV4KytdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAodmlzaWJsZVRhYkVsZW1lbnQgIT09IHRoaXMubGF5b3V0TWFuYWdlci50YWJEcm9wUGxhY2Vob2xkZXIpIHtcclxuICAgICAgICAgICAgICAgIHZpc2libGVUYWJFbGVtZW50c1t0YWJDb3VudCsrXSA9IHZpc2libGVUYWJFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkcm9wVGFyZ2V0SW5kaWNhdG9yID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmRyb3BUYXJnZXRJbmRpY2F0b3I7XHJcbiAgICAgICAgaWYgKGRyb3BUYXJnZXRJbmRpY2F0b3IgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1NISERaRFRJOTcxMTAnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBhcmVhOiBBcmVhTGlua2VkUmVjdDtcclxuXHJcbiAgICAgICAgLy8gRW1wdHkgc3RhY2tcclxuICAgICAgICBpZiAodmlzaWJsZVRhYnNMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY29uc3QgaGVhZGVyUmVjdCA9IHRoaXMuX2hlYWRlci5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJUb3AgPSBoZWFkZXJSZWN0LnRvcCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJMZWZ0ID0gaGVhZGVyUmVjdC5sZWZ0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0O1xyXG5cclxuICAgICAgICAgICAgYXJlYSA9IHtcclxuICAgICAgICAgICAgICAgIHgxOiBoZWFkZXJMZWZ0LFxyXG4gICAgICAgICAgICAgICAgeDI6IGhlYWRlckxlZnQgKyAxMDAsXHJcbiAgICAgICAgICAgICAgICB5MTogaGVhZGVyVG9wICsgaGVhZGVyUmVjdC5oZWlnaHQgLSAyMCxcclxuICAgICAgICAgICAgICAgIHkyOiBoZWFkZXJUb3AgKyBoZWFkZXJSZWN0LmhlaWdodCxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2Ryb3BJbmRleCA9IDA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRhYkluZGV4ID0gMDtcclxuICAgICAgICAgICAgLy8gVGhpcyBpbmRpY2F0ZXMgd2hldGhlciBvdXIgY3Vyc29yIGlzIGV4YWN0bHkgb3ZlciBhIHRhYlxyXG4gICAgICAgICAgICBsZXQgaXNBYm92ZVRhYiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgdGFiVG9wOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCB0YWJMZWZ0OiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCB0YWJXaWR0aDogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgdGFiRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQgPSB2aXNpYmxlVGFiRWxlbWVudHNbdGFiSW5kZXhdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiUmVjdCA9IHRhYkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJSZWN0VG9wID0gdGFiUmVjdC50b3AgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYlJlY3RMZWZ0ID0gdGFiUmVjdC5sZWZ0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9oZWFkZXIubGVmdFJpZ2h0U2lkZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0YWJMZWZ0ID0gdGFiUmVjdFRvcDtcclxuICAgICAgICAgICAgICAgICAgICB0YWJUb3AgPSB0YWJSZWN0TGVmdDtcclxuICAgICAgICAgICAgICAgICAgICB0YWJXaWR0aCA9IHRhYlJlY3QuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0YWJMZWZ0ID0gdGFiUmVjdExlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiVG9wID0gdGFiUmVjdFRvcDtcclxuICAgICAgICAgICAgICAgICAgICB0YWJXaWR0aCA9IHRhYlJlY3Qud2lkdGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHggPj0gdGFiTGVmdCAmJiB4IDwgdGFiTGVmdCArIHRhYldpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNBYm92ZVRhYiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gd2hpbGUgKHRhYkluZGV4IDwgdmlzaWJsZVRhYnNMZW5ndGggJiYgIWlzQWJvdmVUYWIpO1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgd2UncmUgbm90IGFib3ZlIGFueSB0YWJzLCBvciB0byB0aGUgcmlnaHQgb2YgYW55IHRhYiwgd2UgYXJlIG91dCBvZiB0aGUgYXJlYSwgc28gZ2l2ZSB1cFxyXG4gICAgICAgICAgICBpZiAoaXNBYm92ZVRhYiA9PT0gZmFsc2UgJiYgeCA8IHRhYkxlZnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgaGFsZlggPSB0YWJMZWZ0ICsgdGFiV2lkdGggLyAyO1xyXG5cclxuICAgICAgICAgICAgaWYgKHggPCBoYWxmWCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJvcEluZGV4ID0gdGFiSW5kZXg7XHJcbiAgICAgICAgICAgICAgICB0YWJFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCB0aGlzLmxheW91dE1hbmFnZXIudGFiRHJvcFBsYWNlaG9sZGVyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BJbmRleCA9IE1hdGgubWluKHRhYkluZGV4ICsgMSwgdmlzaWJsZVRhYnNMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgdGFiRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGhpcy5sYXlvdXRNYW5hZ2VyLnRhYkRyb3BQbGFjZWhvbGRlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRhYkRyb3BQbGFjZWhvbGRlclJlY3QgPSB0aGlzLmxheW91dE1hbmFnZXIudGFiRHJvcFBsYWNlaG9sZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb25zdCB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0VG9wID0gdGFiRHJvcFBsYWNlaG9sZGVyUmVjdC50b3AgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgY29uc3QgdGFiRHJvcFBsYWNlaG9sZGVyUmVjdExlZnQgPSB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0LmxlZnQgKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYkRyb3BQbGFjZWhvbGRlclJlY3RXaWR0aCA9IHRhYkRyb3BQbGFjZWhvbGRlclJlY3Qud2lkdGg7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5faGVhZGVyLmxlZnRSaWdodFNpZGVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZUhvbGRlclRvcCA9IHRhYkRyb3BQbGFjZWhvbGRlclJlY3RUb3A7XHJcbiAgICAgICAgICAgICAgICBhcmVhID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiB0YWJUb3AsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IHRhYlRvcCArIHRhYkVsZW1lbnQuY2xpZW50SGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBwbGFjZUhvbGRlclRvcCxcclxuICAgICAgICAgICAgICAgICAgICB5MjogcGxhY2VIb2xkZXJUb3AgKyB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0V2lkdGgsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VIb2xkZXJMZWZ0ID0gdGFiRHJvcFBsYWNlaG9sZGVyUmVjdExlZnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgYXJlYSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogcGxhY2VIb2xkZXJMZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBwbGFjZUhvbGRlckxlZnQgKyB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0V2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IHRhYlRvcCxcclxuICAgICAgICAgICAgICAgICAgICB5MjogdGFiVG9wICsgdGFiRWxlbWVudC5jbGllbnRIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkcm9wVGFyZ2V0SW5kaWNhdG9yLmhpZ2hsaWdodEFyZWEoYXJlYSwgMCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVzZXRIZWFkZXJEcm9wWm9uZSgpIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIudGFiRHJvcFBsYWNlaG9sZGVyLnJlbW92ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgc2V0dXBIZWFkZXJQb3NpdGlvbigpIHtcclxuICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5faGVhZGVyLmVsZW1lbnQsIHRoaXMuX2hlYWRlci5zaG93KTtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkxlZnQsIERvbUNvbnN0YW50cy5DbGFzc05hbWUuUmlnaHQsIERvbUNvbnN0YW50cy5DbGFzc05hbWUuQm90dG9tKTtcclxuICAgICAgICBpZiAodGhpcy5faGVhZGVyLmxlZnRSaWdodFNpZGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsbV8nICsgdGhpcy5faGVhZGVyLnNpZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9pZiAoW1NpZGUucmlnaHQsIFNpZGUuYm90dG9tXS5pbmNsdWRlcyh0aGlzLl9oZWFkZXIuc2lkZSkpIHtcclxuICAgICAgICAvLyAgICAvLyBtb3ZlIHRoZSBoZWFkZXIgYmVoaW5kIHRoZSBjb250ZW50LlxyXG4gICAgICAgIC8vICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9oZWFkZXIuZWxlbWVudCk7XHJcbiAgICAgICAgLy99XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhpZ2hsaWdodEJvZHlEcm9wWm9uZShzZWdtZW50OiBTdGFjay5TZWdtZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1NIQkRaQzgyMjY1Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaGlnaGxpZ2h0QXJlYSA9IHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9uc1tzZWdtZW50XS5oaWdobGlnaHRBcmVhO1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wVGFyZ2V0SW5kaWNhdG9yID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmRyb3BUYXJnZXRJbmRpY2F0b3I7XHJcbiAgICAgICAgICAgIGlmIChkcm9wVGFyZ2V0SW5kaWNhdG9yID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignU0hCRFpEOTYxMTAnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRyb3BUYXJnZXRJbmRpY2F0b3IuaGlnaGxpZ2h0QXJlYShoaWdobGlnaHRBcmVhLCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BTZWdtZW50ID0gc2VnbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVJlc2l6ZSgpIHtcclxuICAgICAgICB0aGlzLl9oZWFkZXIudXBkYXRlVGFiU2l6ZXMoKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlTWF4aW1pc2VkKCkge1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci5wcm9jZXNzTWF4aW1pc2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVNaW5pbWlzZWQoKSB7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLnByb2Nlc3NNaW5pbWlzZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVBvcG91dEV2ZW50KCkge1xyXG4gICAgICAgIHRoaXMucG9wb3V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVIZWFkZXJDbGlja0V2ZW50KGV2OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgZXZlbnROYW1lID0gRXZlbnRFbWl0dGVyLmhlYWRlckNsaWNrRXZlbnROYW1lO1xyXG4gICAgICAgIGNvbnN0IGJ1YmJsaW5nRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyLkNsaWNrQnViYmxpbmdFdmVudChldmVudE5hbWUsIHRoaXMsIGV2KTtcclxuICAgICAgICB0aGlzLmVtaXQoZXZlbnROYW1lLCBidWJibGluZ0V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUhlYWRlclRvdWNoU3RhcnRFdmVudChldjogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IEV2ZW50RW1pdHRlci5oZWFkZXJUb3VjaFN0YXJ0RXZlbnROYW1lO1xyXG4gICAgICAgIGNvbnN0IGJ1YmJsaW5nRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyLlRvdWNoU3RhcnRCdWJibGluZ0V2ZW50KGV2ZW50TmFtZSwgdGhpcywgZXYpO1xyXG4gICAgICAgIHRoaXMuZW1pdChldmVudE5hbWUsIGJ1YmJsaW5nRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlSGVhZGVyQ29tcG9uZW50UmVtb3ZlRXZlbnQoaXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQoaXRlbSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlSGVhZGVyQ29tcG9uZW50Rm9jdXNFdmVudChpdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVDb21wb25lbnRJdGVtKGl0ZW0sIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlSGVhZGVyQ29tcG9uZW50U3RhcnREcmFnRXZlbnQoeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNNYXhpbWlzZWQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy50b2dnbGVNYXhpbWlzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuc3RhcnRDb21wb25lbnREcmFnKHgsIHksIGRyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbSwgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVIZWFkZXJDb25maWcoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9oZWFkZXJTaWRlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLmNyZWF0ZUNvcHkodGhpcy5faGVhZGVyQ29uZmlnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzaG93ID0gdGhpcy5faGVhZGVyLnNob3cgPyB0aGlzLl9oZWFkZXIuc2lkZSA6IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KHRoaXMuX2hlYWRlckNvbmZpZywgc2hvdyk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3csXHJcbiAgICAgICAgICAgICAgICAgICAgcG9wb3V0OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4aW1pc2U6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICBjbG9zZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbmltaXNlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFiRHJvcGRvd246IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBlbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFN0YWNrIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBjb25zdCBlbnVtIFNlZ21lbnQge1xyXG4gICAgICAgIEhlYWRlciA9ICdoZWFkZXInLFxyXG4gICAgICAgIEJvZHkgPSAnYm9keScsXHJcbiAgICAgICAgTGVmdCA9ICdsZWZ0JyxcclxuICAgICAgICBSaWdodCA9ICdyaWdodCcsXHJcbiAgICAgICAgVG9wID0gJ3RvcCcsXHJcbiAgICAgICAgQm90dG9tID0gJ2JvdHRvbScsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb250ZW50QXJlYURpbWVuc2lvbiB7XHJcbiAgICAgICAgaG92ZXJBcmVhOiBBcmVhTGlua2VkUmVjdDtcclxuICAgICAgICBoaWdobGlnaHRBcmVhOiBBcmVhTGlua2VkUmVjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBDb250ZW50QXJlYURpbWVuc2lvbnMgPSB7XHJcbiAgICAgICAgW3NlZ21lbnQ6IHN0cmluZ106IENvbnRlbnRBcmVhRGltZW5zaW9uO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxlbWVudChkb2N1bWVudDogRG9jdW1lbnQpOiBIVE1MRGl2RWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkl0ZW0pO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlN0YWNrKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnRJdGVtQ29uZmlnLCBJdGVtQ29uZmlnLCBMYXlvdXRDb25maWcsIFJvd09yQ29sdW1uSXRlbUNvbmZpZywgU3RhY2tJdGVtQ29uZmlnIH0gZnJvbSAnLi9jb25maWcvY29uZmlnJztcclxuaW1wb3J0IHtcclxuICAgIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkSXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkTGF5b3V0Q29uZmlnLFxyXG4gICAgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcsXHJcbiAgICBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZ1xyXG59IGZyb20gXCIuL2NvbmZpZy9yZXNvbHZlZC1jb25maWdcIjtcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnLi9jb250YWluZXIvY29tcG9uZW50LWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IEJyb3dzZXJQb3BvdXQgfSBmcm9tICcuL2NvbnRyb2xzL2Jyb3dzZXItcG9wb3V0JztcclxuaW1wb3J0IHsgRHJhZ0FjdGlvbiB9IGZyb20gJy4vY29udHJvbHMvZHJhZy1hY3Rpb24nO1xyXG5pbXBvcnQgeyBEcmFnU291cmNlIH0gZnJvbSAnLi9jb250cm9scy9kcmFnLXNvdXJjZSc7XHJcbmltcG9ydCB7IERyb3BUYXJnZXRJbmRpY2F0b3IgfSBmcm9tICcuL2NvbnRyb2xzL2Ryb3AtdGFyZ2V0LWluZGljYXRvcic7XHJcbmltcG9ydCB7IFRyYW5zaXRpb25JbmRpY2F0b3IgfSBmcm9tICcuL2NvbnRyb2xzL3RyYW5zaXRpb24taW5kaWNhdG9yJztcclxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMvZXh0ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZE51bGxFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yLCBVbnJlYWNoYWJsZUNhc2VFcnJvciB9IGZyb20gJy4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB9IGZyb20gJy4vaXRlbXMvY29tcG9uZW50LXBhcmVudGFibGUtaXRlbSc7XHJcbmltcG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi9pdGVtcy9jb250ZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBHcm91bmRJdGVtIH0gZnJvbSAnLi9pdGVtcy9ncm91bmQtaXRlbSc7XHJcbmltcG9ydCB7IFJvd09yQ29sdW1uIH0gZnJvbSAnLi9pdGVtcy9yb3ctb3ItY29sdW1uJztcclxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICcuL2l0ZW1zL3N0YWNrJztcclxuaW1wb3J0IHsgQ29uZmlnTWluaWZpZXIgfSBmcm9tICcuL3V0aWxzL2NvbmZpZy1taW5pZmllcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4vdXRpbHMvZHJhZy1saXN0ZW5lcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vdXRpbHMvZXZlbnQtZW1pdHRlcic7XHJcbmltcG9ydCB7IEV2ZW50SHViIH0gZnJvbSAnLi91dGlscy9ldmVudC1odWInO1xyXG5pbXBvcnQgeyBJMThuU3RyaW5nSWQsIEkxOG5TdHJpbmdzLCBpMThuU3RyaW5ncyB9IGZyb20gJy4vdXRpbHMvaTE4bi1zdHJpbmdzJztcclxuaW1wb3J0IHsgSXRlbVR5cGUsIEpzb25WYWx1ZSwgUmVjdCwgUmVzcG9uc2l2ZU1vZGUsIFdpZHRoQW5kSGVpZ2h0IH0gZnJvbSAnLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgICBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQsXHJcbiAgICBnZXRXaW5kb3dJbm5lclNjcmVlblBvc2l0aW9uLFxyXG4gICAgcmVtb3ZlRnJvbUFycmF5LFxyXG4gICAgc2V0RWxlbWVudEhlaWdodCxcclxuICAgIHNldEVsZW1lbnRXaWR0aFxyXG59IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcclxuICAgICAgICBfX2dsSW5zdGFuY2U6IExheW91dE1hbmFnZXI7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgbWFpbiBjbGFzcyB0aGF0IHdpbGwgYmUgZXhwb3NlZCBhcyBHb2xkZW5MYXlvdXQuXHJcbiAqL1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExheW91dE1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgLyoqIFdoZXRoZXIgdGhlIGxheW91dCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYmUgcmVzaXplZCB0byBjb250YWluZXIgd2hlbmV2ZXIgdGhlIGNvbnRhaW5lcidzIHNpemUgaXMgY2hhbmdlZFxyXG4gICAgICogRGVmYXVsdCBpcyB0cnVlIGlmIDxib2R5PiBpcyB0aGUgY29udGFpbmVyIG90aGVyd2lzZSBmYWxzZVxyXG4gICAgICogRGVmYXVsdCB3aWxsIGJlIGNoYW5nZWQgdG8gdHJ1ZSBmb3IgYW55IGNvbnRhaW5lciBpbiB0aGUgZnV0dXJlXHJcbiAgICAgKi9cclxuICAgIHJlc2l6ZVdpdGhDb250YWluZXJBdXRvbWF0aWNhbGx5ID0gZmFsc2U7XHJcbiAgICAvKiogVGhlIGRlYm91bmNlIGludGVydmFsIChpbiBtaWxsaXNlY29uZHMpIHVzZWQgd2hlbmV2ZXIgYSBsYXlvdXQgaXMgYXV0b21hdGljYWxseSByZXNpemVkLiAgMCBtZWFucyBuZXh0IHRpY2sgKi9cclxuICAgIHJlc2l6ZURlYm91bmNlSW50ZXJ2YWwgPSAxMDA7XHJcbiAgICAvKiogRXh0ZW5kIHRoZSBjdXJyZW50IGRlYm91bmNlIGRlbGF5IHRpbWUgcGVyaW9kIGlmIGl0IGlzIHRyaWdnZXJlZCBkdXJpbmcgdGhlIGRlbGF5LlxyXG4gICAgICogSWYgdGhpcyBpcyB0cnVlLCB0aGUgbGF5b3V0IHdpbGwgb25seSByZXNpemUgd2hlbiBpdHMgY29udGFpbmVyIGhhcyBzdG9wcGVkIGJlaW5nIHJlc2l6ZWQuXHJcbiAgICAgKiBJZiBpdCBpcyBmYWxzZSwgdGhlIGxheW91dCB3aWxsIHJlc2l6ZSBhdCBpbnRlcnZhbHMgd2hpbGUgaXRzIGNvbnRhaW5lciBpcyBiZWluZyByZXNpemVkLlxyXG4gICAgICovXHJcbiAgICByZXNpemVEZWJvdW5jZUV4dGVuZGVkV2hlblBvc3NpYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2lzSW5pdGlhbGlzZWQgPSBmYWxzZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2dyb3VuZEl0ZW06IEdyb3VuZEl0ZW0gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9vcGVuUG9wb3V0czogQnJvd3NlclBvcG91dFtdID0gW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kcm9wVGFyZ2V0SW5kaWNhdG9yOiBEcm9wVGFyZ2V0SW5kaWNhdG9yIHwgbnVsbCA9IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90cmFuc2l0aW9uSW5kaWNhdG9yOiBUcmFuc2l0aW9uSW5kaWNhdG9yIHwgbnVsbCA9IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9yZXNpemVUaW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXRlbUFyZWFzOiBDb250ZW50SXRlbS5BcmVhW10gPSBbXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX21heGltaXNlZFN0YWNrOiBTdGFjayB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX21heGltaXNlUGxhY2Vob2xkZXIgPSBMYXlvdXRNYW5hZ2VyLmNyZWF0ZU1heGltaXNlUGxhY2VFbGVtZW50KGRvY3VtZW50KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3RhYkRyb3BQbGFjZWhvbGRlciA9IExheW91dE1hbmFnZXIuY3JlYXRlVGFiRHJvcFBsYWNlaG9sZGVyRWxlbWVudChkb2N1bWVudCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kcmFnU291cmNlczogRHJhZ1NvdXJjZVtdID0gW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF91cGRhdGluZ0NvbHVtbnNSZXNwb25zaXZlID0gZmFsc2U7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9maXJzdExvYWQgPSB0cnVlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZXZlbnRIdWIgPSBuZXcgRXZlbnRIdWIodGhpcyk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF93aWR0aDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9oZWlnaHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZm9jdXNlZENvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF92aXJ0dWFsU2l6ZWRDb250YWluZXJzOiBDb21wb25lbnRDb250YWluZXJbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nQmVnaW5Db3VudCA9IDA7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zaXplSW52YWxpZGF0aW9uQmVnaW5Db3VudCA9IDA7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgX2NvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWc6IExheW91dENvbmZpZyB8IHVuZGVmaW5lZDsgLy8gcHJvdGVjdGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcGFyZW50OiBMYXlvdXRNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5oYW5kbGVDb250YWluZXJSZXNpemUoKSk7XHJcbiAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHRvIGJlIHJlbW92ZWQgaW4gdmVyc2lvbiAzICovXHJcbiAgICBwcml2YXRlIF93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5lciA9ICgpID0+IHRoaXMub25CZWZvcmVVbmxvYWQoKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgdG8gYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDMgKi9cclxuICAgIHByaXZhdGUgX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmluZyA9IGZhbHNlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbWF4aW1pc2VkU3RhY2tCZWZvcmVEZXN0cm95ZWRMaXN0ZW5lciA9IChldjogRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQpID0+IHRoaXMuY2xlYW51cEJlZm9yZU1heGltaXNlZFN0YWNrRGVzdHJveWVkKGV2KTtcclxuXHJcbiAgICByZWFkb25seSBpc1N1YldpbmRvdzogYm9vbGVhbjtcclxuICAgIGxheW91dENvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWc7XHJcblxyXG4gICAgYmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudDogTGF5b3V0TWFuYWdlci5CZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgYWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50OiBMYXlvdXRNYW5hZ2VyLkFmdGVyVmlydHVhbFJlY3RpbmdFdmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRoZSBhc3NvY2lhdGVkIHdpbmRvdyB0byB0aGUgZnJvbnQuXHJcbiAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhcyBubyBlZmZlY3QgKGNhbiBiZSBzZXQgYnkgRWxlY3Ryb24pLlxyXG4gICAgICogQHB1YmxpYyBcclxuICAgICAqL1xyXG4gICAgbW92ZVdpbmRvd1RvcDogKHRoaXM6IHZvaWQpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvY3VzIHRoZSBhc3NvY2lhdGVkIHdpbmRvdyB3aW5kb3cuXHJcbiAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGludm9rZXMgd2luZG93LmZvY3VzKCkgKGNhbiBiZSBzZXQgYnkgRWxlY3Ryb24pLlxyXG4gICAgICogQHB1YmxpYyBcclxuICAgICAqL1xyXG4gICAgZm9jdXNXaW5kb3c6ICh0aGlzOiB2b2lkKSA9PiB2b2lkID0gKCkgPT4gZ2xvYmFsVGhpcy5mb2N1cygpO1xyXG5cclxuICAgIGdldCBjb250YWluZXIoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fY29udGFpbmVyRWxlbWVudDsgfVxyXG4gICAgZ2V0IGlzSW5pdGlhbGlzZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc0luaXRpYWxpc2VkOyB9XHJcbiAgICBnZXQgaXNEcmFnZ2luZygpOiBib29sZWFuIHsgcmV0dXJuIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJhZ2dpbmcpOyB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXQgZ3JvdW5kSXRlbSgpOiBHcm91bmRJdGVtIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2dyb3VuZEl0ZW07IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykuZ3JvdW5kSXRlbX0gaW5zdGVhZCAqL1xyXG4gICAgZ2V0IHJvb3QoKTogR3JvdW5kSXRlbSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9ncm91bmRJdGVtOyB9XHJcbiAgICBnZXQgb3BlblBvcG91dHMoKTogQnJvd3NlclBvcG91dFtdIHsgcmV0dXJuIHRoaXMuX29wZW5Qb3BvdXRzOyB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXQgZHJvcFRhcmdldEluZGljYXRvcigpOiBEcm9wVGFyZ2V0SW5kaWNhdG9yIHwgbnVsbCB7IHJldHVybiB0aGlzLl9kcm9wVGFyZ2V0SW5kaWNhdG9yOyB9XHJcbiAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIFRvIGJlIHJlbW92ZWQgKi9cclxuICAgIGdldCB0cmFuc2l0aW9uSW5kaWNhdG9yKCk6IFRyYW5zaXRpb25JbmRpY2F0b3IgfCBudWxsIHsgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25JbmRpY2F0b3I7IH1cclxuICAgIGdldCB3aWR0aCgpOiBudW1iZXIgfCBudWxsIHsgcmV0dXJuIHRoaXMuX3dpZHRoOyB9XHJcbiAgICBnZXQgaGVpZ2h0KCk6IG51bWJlciB8IG51bGwgeyByZXR1cm4gdGhpcy5faGVpZ2h0OyB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUge0BsaW5rIChFdmVudEh1YjpjbGFzcyl9IGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxheW91dCBtYW5hZ2VyLlxyXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9wYWdhdGUgZXZlbnRzIGJldHdlZW4gdGhlIHdpbmRvd3NcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZ2V0IGV2ZW50SHViKCk6IEV2ZW50SHViIHsgcmV0dXJuIHRoaXMuX2V2ZW50SHViOyB9XHJcbiAgICBnZXQgcm9vdEl0ZW0oKTogQ29udGVudEl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWNjZXNzIHJvb3RJdGVtIGJlZm9yZSBpbml0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdW5kQ29udGVudEl0ZW1zID0gdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgICAgIGlmIChncm91bmRDb250ZW50SXRlbXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IGZvY3VzZWRDb21wb25lbnRJdGVtKCk6IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW07IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCB0YWJEcm9wUGxhY2Vob2xkZXIoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fdGFiRHJvcFBsYWNlaG9sZGVyOyB9XHJcbiAgICBnZXQgbWF4aW1pc2VkU3RhY2soKTogU3RhY2sgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fbWF4aW1pc2VkU3RhY2s7IH1cclxuXHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgaW5kaWNhdGVzIGRlcHJlY2F0ZWQgY29uc3RydWN0b3IgdXNlICovXHJcbiAgICBnZXQgZGVwcmVjYXRlZENvbnN0cnVjdG9yKCk6IGJvb2xlYW4geyByZXR1cm4gIXRoaXMuaXNTdWJXaW5kb3cgJiYgdGhpcy5fY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZyAhPT0gdW5kZWZpbmVkOyB9XHJcblxyXG4gICAgZ2V0IHBhcmVudCgpOiBMYXlvdXRNYW5hZ2VyIHwgbnVsbCB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH1cclxuICAgIHNldCBwYXJlbnQodmFsdWU6IExheW91dE1hbmFnZXIgfCBudWxsKSB7IHRoaXMuX3BhcmVudCA9IHZhbHVlOyB9XHJcblxyXG4gICAgZ2V0IGluc3RhbmNlcygpOiBMYXlvdXRNYW5hZ2VyW10ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogTGF5b3V0TWFuYWdlcltdID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnBhcmVudCA/PyB0aGlzO1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKHJvb3QpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBwb3BvdXQgb2Ygcm9vdC5vcGVuUG9wb3V0cykge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IHBvcG91dC5nZXRHbEluc3RhbmNlKCk7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEBwYXJhbSBjb250YWluZXIgLSBBIERvbSBIVE1MIGVsZW1lbnQuIERlZmF1bHRzIHRvIGJvZHlcclxuICAgICogQGludGVybmFsXHJcbiAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVyczogTGF5b3V0TWFuYWdlci5Db25zdHJ1Y3RvclBhcmFtZXRlcnMpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLmlzU3ViV2luZG93ID0gcGFyYW1ldGVycy5pc1N1YldpbmRvdztcclxuXHJcbiAgICAgICAgdGhpcy5fY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZyA9IHBhcmFtZXRlcnMuY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZztcclxuXHJcbiAgICAgICAgSTE4blN0cmluZ3MuY2hlY2tJbml0aWFsaXNlKCk7XHJcbiAgICAgICAgQ29uZmlnTWluaWZpZXIuY2hlY2tJbml0aWFsaXNlKCk7XHJcblxyXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLmNvbnRhaW5lckVsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJFbGVtZW50ID0gcGFyYW1ldGVycy5jb250YWluZXJFbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoZSBMYXlvdXRNYW5hZ2VyIGluc3RhbmNlIGl0c2VsZiBhcyB3ZWxsIGFzIGV2ZXJ5IENvbnRlbnRJdGVtXHJcbiAgICAgKiB3aXRoaW4gaXQuIEFmdGVyIHRoaXMgaXMgY2FsbGVkIG5vdGhpbmcgc2hvdWxkIGJlIGxlZnQgb2YgdGhlIExheW91dE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiBvbmx5IG5lZWRzIHRvIGJlIGNhbGxlZCBpZiBhbiBhcHBsaWNhdGlvbiB3aXNoZXMgdG8gZGVzdHJveSB0aGUgR29sZGVuIExheW91dCBvYmplY3Qgd2hpbGVcclxuICAgICAqIGEgcGFnZSByZW1haW5zIGxvYWRlZC4gV2hlbiBhIHBhZ2UgaXMgdW5sb2FkZWQsIGFsbCByZXNvdXJjZXMgY2xhaW1lZCBieSBHb2xkZW4gTGF5b3V0IHdpbGwgYXV0b21hdGljYWxseVxyXG4gICAgICogYmUgcmVsZWFzZWQuXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmluZykge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLmNsb3NlUG9wb3V0c09uVW5sb2FkID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQWxsT3BlblBvcG91dHMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ2xlYXJSZXNpemVUaW1lb3V0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl90YWJEcm9wUGxhY2Vob2xkZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcm9wVGFyZ2V0SW5kaWNhdG9yICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kcm9wVGFyZ2V0SW5kaWNhdG9yLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fdHJhbnNpdGlvbkluZGljYXRvciAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkluZGljYXRvci5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fZXZlbnRIdWIuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBkcmFnU291cmNlIG9mIHRoaXMuX2RyYWdTb3VyY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBkcmFnU291cmNlLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9kcmFnU291cmNlcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgR29sZGVuTGF5b3V0IGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFuZFxyXG4gICAgICogcmVwbGFjZXMgaXRzIGtleXMgYW5kIHZhbHVlcyByZWN1cnNpdmVseSB3aXRoXHJcbiAgICAgKiBvbmUgbGV0dGVyIGNvZGVzXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChSZXNvbHZlZExheW91dENvbmZpZzpuYW1lc3BhY2UpLm1pbmlmeUNvbmZpZ30gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBtaW5pZnlDb25maWcoY29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZyk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICByZXR1cm4gUmVzb2x2ZWRMYXlvdXRDb25maWcubWluaWZ5Q29uZmlnKGNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIGNvbmZpZ3VyYXRpb24gT2JqZWN0IHRoYXQgd2FzIHByZXZpb3VzbHkgbWluaWZpZWRcclxuICAgICAqIHVzaW5nIG1pbmlmeUNvbmZpZyBhbmQgcmV0dXJucyBpdHMgb3JpZ2luYWwgdmVyc2lvblxyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUmVzb2x2ZWRMYXlvdXRDb25maWc6bmFtZXNwYWNlKS51bm1pbmlmeUNvbmZpZ30gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICB1bm1pbmlmeUNvbmZpZyhjb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiBSZXNvbHZlZExheW91dENvbmZpZy51bm1pbmlmeUNvbmZpZyhjb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGFic3RyYWN0IGJpbmRDb21wb25lbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIGl0ZW1Db25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IENvbXBvbmVudENvbnRhaW5lci5CaW5kYWJsZUNvbXBvbmVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGFic3RyYWN0IHVuYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgdmlydHVhbDogYm9vbGVhbiwgY29tcG9uZW50OiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50IHwgdW5kZWZpbmVkKTogdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBmcm9tIEdvbGRlbkxheW91dCBjbGFzcy4gRmluaXNoZXMgb2YgaW5pdFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRDb250YWluZXIoKTtcclxuICAgICAgICB0aGlzLl9kcm9wVGFyZ2V0SW5kaWNhdG9yID0gbmV3IERyb3BUYXJnZXRJbmRpY2F0b3IoLyp0aGlzLmNvbnRhaW5lciovKTtcclxuICAgICAgICB0aGlzLl90cmFuc2l0aW9uSW5kaWNhdG9yID0gbmV3IFRyYW5zaXRpb25JbmRpY2F0b3IoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNpemVGcm9tQ29udGFpbmVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMubGF5b3V0Q29uZmlnID0gUmVzb2x2ZWRMYXlvdXRDb25maWcuY3JlYXRlRGVmYXVsdCgpOyAvLyB3aWxsIG92ZXJ3cml0dGVuIGJlIGxvYWRlZCB2aWEgbG9hZExheW91dFxyXG4gICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0gPSBuZXcgR3JvdW5kSXRlbSh0aGlzLCB0aGlzLmxheW91dENvbmZpZy5yb290LCB0aGlzLl9jb250YWluZXJFbGVtZW50KTtcclxuICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmluaXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGVja0xvYWRlZExheW91dE1heGltaXNlSXRlbSgpO1xyXG5cclxuICAgICAgICB0aGlzLl9yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuX2NvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuYWRqdXN0Q29sdW1uc1Jlc3BvbnNpdmUoKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2luaXRpYWxpc2VkJyk7XHJcblxyXG4gICAgICAgIGxldCBsYXlvdXQgPSB0aGlzLl9jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1N1YldpbmRvdyAmJiBsYXlvdXQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBXcmFwIGluIHN0YWNrIGZvciBtdWx0aXdpbmRvdyBkcmFnLWFuZC1kcm9wIHRvIHdvcmsgcHJvcGVybHlcclxuICAgICAgICAgICAgaWYgKGxheW91dC5yb290Py50eXBlID09IEl0ZW1UeXBlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgbGF5b3V0LnJvb3QgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuc3RhY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogWyBsYXlvdXQucm9vdCBdLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5sb2FkTGF5b3V0KGxheW91dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZHMgYSBuZXcgbGF5b3V0XHJcbiAgICAgKiBAcGFyYW0gbGF5b3V0Q29uZmlnIC0gTmV3IGxheW91dCB0byBiZSBsb2FkZWRcclxuICAgICAqL1xyXG4gICAgbG9hZExheW91dChsYXlvdXRDb25maWc6IExheW91dENvbmZpZyk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luaXRpYWxpc2VkKSB7XHJcbiAgICAgICAgICAgIC8vIEluIGNhc2UgYXBwbGljYXRpb24gbm90IGNvcnJlY3RseSB1c2luZyBsZWdhY3kgY29uc3RydWN0b3JcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHb2xkZW5MYXlvdXQ6IE5lZWQgdG8gY2FsbCBpbml0KCkgaWYgTGF5b3V0Q29uZmlnIHdpdGggZGVmaW5lZCByb290IHBhc3NlZCB0byBjb25zdHJ1Y3RvcicpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1MTDExMTE5Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb25maWcgPSBMYXlvdXRDb25maWcucmVzb2x2ZShsYXlvdXRDb25maWcpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTdWJXaW5kb3dzKCk7IC8vIHN0aWxsIG5lZWRzIHRvIGJlIHRlc3RlZFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbS5sb2FkUm9vdCh0aGlzLmxheW91dENvbmZpZy5yb290KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tMb2FkZWRMYXlvdXRNYXhpbWlzZUl0ZW0oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRqdXN0Q29sdW1uc1Jlc3BvbnNpdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBsYXlvdXQgY29uZmlndXJhdGlvbiBvYmplY3QgYmFzZWQgb24gdGhlIHRoZSBjdXJyZW50IHN0YXRlXHJcbiAgICAgKlxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICogQHJldHVybnMgR29sZGVuTGF5b3V0IGNvbmZpZ3VyYXRpb25cclxuICAgICAqL1xyXG4gICAgc2F2ZUxheW91dCgpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBjcmVhdGUgY29uZmlnLCBsYXlvdXQgbm90IHlldCBpbml0aWFsaXNlZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAvLyBpZiAocm9vdCAhPT0gdW5kZWZpbmVkICYmICEocm9vdCBpbnN0YW5jZW9mIENvbnRlbnRJdGVtKSkge1xyXG4gICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdSb290IG11c3QgYmUgYSBDb250ZW50SXRlbScpO1xyXG4gICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAqIENvbnRlbnRcclxuICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1UQzE4MjQ0Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncm91bmRDb250ZW50ID0gdGhpcy5fZ3JvdW5kSXRlbS5jYWxjdWxhdGVDb25maWdDb250ZW50KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHJvb3RJdGVtQ29uZmlnOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VuZENvbnRlbnQubGVuZ3RoICE9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdEl0ZW1Db25maWcgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvb3RJdGVtQ29uZmlnID0gZ3JvdW5kQ29udGVudFswXTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgICAgKiBSZXRyaWV2ZSBjb25maWcgZm9yIHN1YndpbmRvd3NcclxuICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29uY2lsZVBvcG91dFdpbmRvd3MoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5Qb3BvdXRzOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZ1tdID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX29wZW5Qb3BvdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3BlblBvcG91dHMucHVzaCh0aGlzLl9vcGVuUG9wb3V0c1tpXS50b0NvbmZpZygpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvb3Q6IHJvb3RJdGVtQ29uZmlnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9wZW5Qb3BvdXRzLFxyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiAgUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuY3JlYXRlQ29weSh0aGlzLmxheW91dENvbmZpZy5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uczogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5jcmVhdGVDb3B5KHRoaXMubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnMpLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmNyZWF0ZUNvcHkodGhpcy5sYXlvdXRDb25maWcuaGVhZGVyKSxcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbnkgZXhpc3RpbmcgbGF5b3V0LiBFZmZlY3RpdmVseSwgYW4gZW1wdHkgbGF5b3V0IHdpbGwgYmUgbG9hZGVkLlxyXG4gICAgICovXHJcblxyXG4gICAgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUNMMTExMjknKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmNsZWFyUm9vdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLnNhdmVMYXlvdXR9XHJcbiAgICAgKi9cclxuICAgIHRvQ29uZmlnKCk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zYXZlTGF5b3V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IENvbXBvbmVudEl0ZW0uICBXaWxsIHVzZSBkZWZhdWx0IGxvY2F0aW9uIHNlbGVjdG9ycyB0byBlbnN1cmUgYSBsb2NhdGlvbiBpcyBmb3VuZCBhbmRcclxuICAgICAqIGNvbXBvbmVudCBpcyBzdWNjZXNzZnVsbHkgYWRkZWRcclxuICAgICAqIEBwYXJhbSBjb21wb25lbnRUeXBlTmFtZSAtIE5hbWUgb2YgY29tcG9uZW50IHR5cGUgdG8gYmUgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSBzdGF0ZSAtIE9wdGlvbmFsIGluaXRpYWwgc3RhdGUgdG8gYmUgYXNzaWduZWQgdG8gY29tcG9uZW50XHJcbiAgICAgKiBAcmV0dXJucyBOZXcgQ29tcG9uZW50SXRlbSBjcmVhdGVkLlxyXG4gICAgICovXHJcbiAgICBuZXdDb21wb25lbnQoY29tcG9uZW50VHlwZTogSnNvblZhbHVlLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGU/OiBzdHJpbmcpOiBDb21wb25lbnRJdGVtIHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRJdGVtID0gdGhpcy5uZXdDb21wb25lbnRBdExvY2F0aW9uKGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFN0YXRlLCB0aXRsZSk7XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNTkM2NTU4OCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRJdGVtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBDb21wb25lbnRJdGVtIGF0IHRoZSBmaXJzdCB2YWxpZCBzZWxlY3RvciBsb2NhdGlvbi5cclxuICAgICAqIEBwYXJhbSBjb21wb25lbnRUeXBlTmFtZSAtIE5hbWUgb2YgY29tcG9uZW50IHR5cGUgdG8gYmUgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSBzdGF0ZSAtIE9wdGlvbmFsIGluaXRpYWwgc3RhdGUgdG8gYmUgYXNzaWduZWQgdG8gY29tcG9uZW50XHJcbiAgICAgKiBAcGFyYW0gbG9jYXRpb25TZWxlY3RvcnMgLSBBcnJheSBvZiBsb2NhdGlvbiBzZWxlY3RvcnMgdXNlZCB0byBmaW5kIGxvY2F0aW9uIGluIGxheW91dCB3aGVyZSBjb21wb25lbnRcclxuICAgICAqIHdpbGwgYmUgYWRkZWQuIEZpcnN0IGxvY2F0aW9uIGluIGFycmF5IHdoaWNoIGlzIHZhbGlkIHdpbGwgYmUgdXNlZC4gSWYgbG9jYXRpb25TZWxlY3RvcnMgaXMgdW5kZWZpbmVkLFxyXG4gICAgICoge0BsaW5rIChMYXlvdXRNYW5hZ2VyOm5hbWVzcGFjZSkuZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzfSB3aWxsIGJlIHVzZWRcclxuICAgICAqIEByZXR1cm5zIE5ldyBDb21wb25lbnRJdGVtIGNyZWF0ZWQgb3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkIGxvY2F0aW9uIHNlbGVjdG9yIHdhcyBpbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgbmV3Q29tcG9uZW50QXRMb2NhdGlvbihjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZyxcclxuICAgICAgICBsb2NhdGlvblNlbGVjdG9ycz86IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3RvcltdXHJcbiAgICApOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVke1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGNvbXBvbmVudCBiZWZvcmUgaW5pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hZGRDb21wb25lbnRBdExvY2F0aW9uKGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFN0YXRlLCB0aXRsZSwgbG9jYXRpb25TZWxlY3RvcnMpO1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRJdGVtID0gbG9jYXRpb24ucGFyZW50SXRlbS5jb250ZW50SXRlbXNbbG9jYXRpb24uaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFDb250ZW50SXRlbS5pc0NvbXBvbmVudEl0ZW0oY3JlYXRlZEl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTU5DOTkyODc3NTMzJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVkSXRlbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgQ29tcG9uZW50SXRlbS4gIFdpbGwgdXNlIGRlZmF1bHQgbG9jYXRpb24gc2VsZWN0b3JzIHRvIGVuc3VyZSBhIGxvY2F0aW9uIGlzIGZvdW5kIGFuZFxyXG4gICAgICogY29tcG9uZW50IGlzIHN1Y2Nlc3NmdWxseSBhZGRlZFxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUgLSBUeXBlIG9mIGNvbXBvbmVudCB0byBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHN0YXRlIC0gT3B0aW9uYWwgaW5pdGlhbCBzdGF0ZSB0byBiZSBhc3NpZ25lZCB0byBjb21wb25lbnRcclxuICAgICAqIEByZXR1cm5zIExvY2F0aW9uIG9mIG5ldyBDb21wb25lbnRJdGVtIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIGFkZENvbXBvbmVudChjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZyk6IExheW91dE1hbmFnZXIuTG9jYXRpb24ge1xyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hZGRDb21wb25lbnRBdExvY2F0aW9uKGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFN0YXRlLCB0aXRsZSk7XHJcbiAgICAgICAgaWYgKGxvY2F0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTUFDOTk5NDMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIENvbXBvbmVudEl0ZW0gYXQgdGhlIGZpcnN0IHZhbGlkIHNlbGVjdG9yIGxvY2F0aW9uLlxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUgLSBUeXBlIG9mIGNvbXBvbmVudCB0byBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHN0YXRlIC0gT3B0aW9uYWwgaW5pdGlhbCBzdGF0ZSB0byBiZSBhc3NpZ25lZCB0byBjb21wb25lbnRcclxuICAgICAqIEBwYXJhbSBsb2NhdGlvblNlbGVjdG9ycyAtIEFycmF5IG9mIGxvY2F0aW9uIHNlbGVjdG9ycyB1c2VkIHRvIGZpbmQgZGV0ZXJtaW5lIGxvY2F0aW9uIGluIGxheW91dCB3aGVyZSBjb21wb25lbnRcclxuICAgICAqIHdpbGwgYmUgYWRkZWQuIEZpcnN0IGxvY2F0aW9uIGluIGFycmF5IHdoaWNoIGlzIHZhbGlkIHdpbGwgYmUgdXNlZC4gSWYgdW5kZWZpbmVkLFxyXG4gICAgICoge0BsaW5rIChMYXlvdXRNYW5hZ2VyOm5hbWVzcGFjZSkuZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzfSB3aWxsIGJlIHVzZWQuXHJcbiAgICAgKiBAcmV0dXJucyBMb2NhdGlvbiBvZiBuZXcgQ29tcG9uZW50SXRlbSBjcmVhdGVkIG9yIHVuZGVmaW5lZCBpZiBubyB2YWxpZCBsb2NhdGlvbiBzZWxlY3RvciB3YXMgaW4gYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIGFkZENvbXBvbmVudEF0TG9jYXRpb24oY29tcG9uZW50VHlwZTogSnNvblZhbHVlLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICAgICAgbG9jYXRpb25TZWxlY3RvcnM/OiByZWFkb25seSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3JbXVxyXG4gICAgKTogTGF5b3V0TWFuYWdlci5Mb2NhdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnLCBsb2NhdGlvblNlbGVjdG9ycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IENvbnRlbnRJdGVtLiAgV2lsbCB1c2UgZGVmYXVsdCBsb2NhdGlvbiBzZWxlY3RvcnMgdG8gZW5zdXJlIGEgbG9jYXRpb24gaXMgZm91bmQgYW5kXHJcbiAgICAgKiBjb21wb25lbnQgaXMgc3VjY2Vzc2Z1bGx5IGFkZGVkXHJcbiAgICAgKiBAcGFyYW0gaXRlbUNvbmZpZyAtIFJlc29sdmVkSXRlbUNvbmZpZyBvZiBjaGlsZCB0byBiZSBhZGRlZC5cclxuICAgICAqIEByZXR1cm5zIE5ldyBDb250ZW50SXRlbSBjcmVhdGVkLlxyXG4gICAgKi9cclxuICAgIG5ld0l0ZW0oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZyk6IENvbnRlbnRJdGVtIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMubmV3SXRlbUF0TG9jYXRpb24oaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgaWYgKGNvbnRlbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTU5DNjU1ODgnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGVudEl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5ldyBjaGlsZCBDb250ZW50SXRlbSB1bmRlciB0aGUgcm9vdCBDb250ZW50SXRlbS4gIElmIGEgcm9vdCBkb2VzIG5vdCBleGlzdCwgdGhlbiBjcmVhdGUgcm9vdCBDb250ZW50SXRlbSBpbnN0ZWFkXHJcbiAgICAgKiBAcGFyYW0gaXRlbUNvbmZpZyAtIFJlc29sdmVkSXRlbUNvbmZpZyBvZiBjaGlsZCB0byBiZSBhZGRlZC5cclxuICAgICAqIEBwYXJhbSBsb2NhdGlvblNlbGVjdG9ycyAtIEFycmF5IG9mIGxvY2F0aW9uIHNlbGVjdG9ycyB1c2VkIHRvIGZpbmQgZGV0ZXJtaW5lIGxvY2F0aW9uIGluIGxheW91dCB3aGVyZSBDb250ZW50SXRlbVxyXG4gICAgICogd2lsbCBiZSBhZGRlZC4gRmlyc3QgbG9jYXRpb24gaW4gYXJyYXkgd2hpY2ggaXMgdmFsaWQgd2lsbCBiZSB1c2VkLiBJZiB1bmRlZmluZWQsXHJcbiAgICAgKiB7QGxpbmsgKExheW91dE1hbmFnZXI6bmFtZXNwYWNlKS5kZWZhdWx0TG9jYXRpb25TZWxlY3RvcnN9IHdpbGwgYmUgdXNlZC5cclxuICAgICAqIEByZXR1cm5zIE5ldyBDb250ZW50SXRlbSBjcmVhdGVkIG9yIHVuZGVmaW5lZCBpZiBubyB2YWxpZCBsb2NhdGlvbiBzZWxlY3RvciB3YXMgaW4gYXJyYXkuICovXHJcbiAgICBuZXdJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgICAgIGxvY2F0aW9uU2VsZWN0b3JzPzogcmVhZG9ubHkgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yW11cclxuICAgICk6IENvbnRlbnRJdGVtIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBjb21wb25lbnQgYmVmb3JlIGluaXQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuYWRkSXRlbUF0TG9jYXRpb24oaXRlbUNvbmZpZywgbG9jYXRpb25TZWxlY3RvcnMpO1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRJdGVtID0gbG9jYXRpb24ucGFyZW50SXRlbS5jb250ZW50SXRlbXNbbG9jYXRpb24uaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRJdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5ldyBDb250ZW50SXRlbS4gIFdpbGwgdXNlIGRlZmF1bHQgbG9jYXRpb24gc2VsZWN0b3JzIHRvIGVuc3VyZSBhIGxvY2F0aW9uIGlzIGZvdW5kIGFuZFxyXG4gICAgICogY29tcG9uZW50IGlzIHN1Y2Nlc3NmdWxseSBhZGRlZC5cclxuICAgICAqIEBwYXJhbSBpdGVtQ29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnIG9mIGNoaWxkIHRvIGJlIGFkZGVkLlxyXG4gICAgICogQHJldHVybnMgTG9jYXRpb24gb2YgbmV3IENvbnRlbnRJdGVtIGNyZWF0ZWQuICovXHJcbiAgICBhZGRJdGVtKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcpOiBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uIHtcclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuYWRkSXRlbUF0TG9jYXRpb24oaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgaWYgKGxvY2F0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTUFJOTk5NDMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIENvbnRlbnRJdGVtIGF0IHRoZSBmaXJzdCB2YWxpZCBzZWxlY3RvciBsb2NhdGlvbi5cclxuICAgICAqIEBwYXJhbSBpdGVtQ29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnIG9mIGNoaWxkIHRvIGJlIGFkZGVkLlxyXG4gICAgICogQHBhcmFtIGxvY2F0aW9uU2VsZWN0b3JzIC0gQXJyYXkgb2YgbG9jYXRpb24gc2VsZWN0b3JzIHVzZWQgdG8gZmluZCBkZXRlcm1pbmUgbG9jYXRpb24gaW4gbGF5b3V0IHdoZXJlIENvbnRlbnRJdGVtXHJcbiAgICAgKiB3aWxsIGJlIGFkZGVkLiBGaXJzdCBsb2NhdGlvbiBpbiBhcnJheSB3aGljaCBpcyB2YWxpZCB3aWxsIGJlIHVzZWQuIElmIHVuZGVmaW5lZCxcclxuICAgICAqIHtAbGluayAoTGF5b3V0TWFuYWdlcjpuYW1lc3BhY2UpLmRlZmF1bHRMb2NhdGlvblNlbGVjdG9yc30gd2lsbCBiZSB1c2VkLlxyXG4gICAgICogQHJldHVybnMgTG9jYXRpb24gb2YgbmV3IENvbnRlbnRJdGVtIGNyZWF0ZWQgb3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkIGxvY2F0aW9uIHNlbGVjdG9yIHdhcyBpbiBhcnJheS4gKi9cclxuICAgIGFkZEl0ZW1BdExvY2F0aW9uKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICAgICAgbG9jYXRpb25TZWxlY3RvcnM/OiByZWFkb25seSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3JbXVxyXG4gICAgKTogTGF5b3V0TWFuYWdlci5Mb2NhdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgY29tcG9uZW50IGJlZm9yZSBpbml0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGxvY2F0aW9uU2VsZWN0b3JzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHRMb2NhdGlvblNlbGVjdG9ycyBzaG91bGQgYWx3YXlzIGZpbmQgYSBsb2NhdGlvblxyXG4gICAgICAgICAgICAgICAgbG9jYXRpb25TZWxlY3RvcnMgPSBMYXlvdXRNYW5hZ2VyLmRlZmF1bHRMb2NhdGlvblNlbGVjdG9ycztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmZpbmRGaXJzdExvY2F0aW9uKGxvY2F0aW9uU2VsZWN0b3JzKTtcclxuICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50SXRlbSA9IGxvY2F0aW9uLnBhcmVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICBsZXQgYWRkSWR4OiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEl0ZW0udHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuZ3JvdW5kOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VuZEl0ZW0gPSBwYXJlbnRJdGVtIGFzIEdyb3VuZEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElkeCA9IGdyb3VuZEl0ZW0uYWRkSXRlbShpdGVtQ29uZmlnLCBsb2NhdGlvbi5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRJZHggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zWzBdOyAvLyB3YXMgYWRkZWQgdG8gcm9vdEl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZElkeCA9IDA7IC8vIHdhcyBhZGRlZCBhcyByb290SXRlbSAod2hpY2ggaXMgdGhlIGZpcnN0IGFuZCBvbmx5IENvbnRlbnRJdGVtIGluIEdyb3VuZEl0ZW0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd09yQ29sdW1uID0gcGFyZW50SXRlbSBhcyBSb3dPckNvbHVtbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWR4ID0gcm93T3JDb2x1bW4uYWRkSXRlbShpdGVtQ29uZmlnLCBsb2NhdGlvbi5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSXRlbUNvbmZpZy5pc0NvbXBvbmVudChpdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoaTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLkl0ZW1Db25maWdJc05vdFR5cGVDb21wb25lbnRdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gcGFyZW50SXRlbSBhcyBTdGFjaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZElkeCA9IHN0YWNrLmFkZEl0ZW0oaXRlbUNvbmZpZywgbG9jYXRpb24uaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTUFJQUxDODc0NDQ2MDInKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdMTUFJQUxVOTg4ODE3MzMnLCBwYXJlbnRJdGVtLnR5cGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChJdGVtQ29uZmlnLmlzQ29tcG9uZW50KGl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHN0YWNrIHdhcyBpbnNlcnRlZFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwYXJlbnRJdGVtLmNvbnRlbnRJdGVtc1thZGRJZHhdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChDb250ZW50SXRlbS5pc1N0YWNrKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEl0ZW0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJZHggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsb2NhdGlvbi5wYXJlbnRJdGVtID0gcGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLmluZGV4ID0gYWRkSWR4O1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogTG9hZHMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgUmVzb2x2ZWRJdGVtQ29uZmlnIGFzIHJvb3QuXHJcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgYSBDb21wb25lbnQgYWxsIGJ5IGl0c2VsZi4gIFRoZSBsYXlvdXQgY2Fubm90IGJlIGNoYW5nZWQgb3RoZXIgdGhhbiBoYXZpbmcgYW5vdGhlciBuZXcgbGF5b3V0IGxvYWRlZC5cclxuICAgICAqIE5vdGUgdGhhdCwgaWYgdGhpcyBsYXlvdXQgaXMgc2F2ZWQgYW5kIHJlbG9hZGVkLCBpdCB3aWxsIHJlbG9hZCB3aXRoIHRoZSBDb21wb25lbnQgYXMgYSBjaGlsZCBvZiBhIFN0YWNrLlxyXG4gICAgKi9cclxuICAgIGxvYWRDb21wb25lbnRBc1Jvb3QoaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGl0ZW0gYmVmb3JlIGluaXQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmxvYWRDb21wb25lbnRBc1Jvb3QoaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5zZXRTaXplfSAqL1xyXG4gICAgdXBkYXRlU2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIGxheW91dCBtYW5hZ2VycyBzaXplXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHdpZHRoIC0gV2lkdGggaW4gcGl4ZWxzXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gSGVpZ2h0IGluIHBpeGVsc1xyXG4gICAgICovXHJcbiAgICBzZXRTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpc2VkID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNVVMxODg4MScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbS5zZXRTaXplKHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZWRTdGFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0KHRoaXMuX2NvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLl9tYXhpbWlzZWRTdGFjay5lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLl9tYXhpbWlzZWRTdGFjay5lbGVtZW50LCBoZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21heGltaXNlZFN0YWNrLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYWRqdXN0Q29sdW1uc1Jlc3BvbnNpdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBiZWdpblNpemVJbnZhbGlkYXRpb24oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc2l6ZUludmFsaWRhdGlvbkJlZ2luQ291bnQrKztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBlbmRTaXplSW52YWxpZGF0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICgtLXRoaXMuX3NpemVJbnZhbGlkYXRpb25CZWdpbkNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZUZyb21Db250YWluZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgdXBkYXRlU2l6ZUZyb21Db250YWluZXIoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQodGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoZSBzaXplIG9mIHRoZSByb290IENvbnRlbnRJdGVtLiAgVGhpcyB3aWxsIHVwZGF0ZSB0aGUgc2l6ZSBvZiBhbGwgY29udGVudEl0ZW1zIGluIHRoZSB0cmVlXHJcbiAgICAgKiBAcGFyYW0gZm9yY2UgLSBJbiBzb21lIGNhc2VzIHRoZSBzaXplIGlzIG5vdCB1cGRhdGVkIGlmIGl0IGhhcyBub3QgY2hhbmdlZC4gSW4gdGhpcyBjYXNlLCBldmVudHNcclxuICAgICAqIChzdWNoIGFzIENvbXBvbmVudENvbnRhaW5lci52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQpIGFyZSBub3QgZmlyZWQuIFNldHRpbmcgZm9yY2UgdG8gdHJ1ZSwgZW5zdXJlcyB0aGUgc2l6ZSBpcyB1cGRhdGVkIHJlZ2FyZGxlc3MsIGFuZFxyXG4gICAgICogdGhlIHJlc3BlY3RpdmUgZXZlbnRzIGFyZSBmaXJlZC4gVGhpcyBpcyBzb21ldGltZXMgbmVjZXNzYXJ5IHdoZW4gYSBjb21wb25lbnQncyBzaXplIGhhcyBub3QgY2hhbmdlZCBidXQgaXQgaGFzIGJlY29tZSB2aXNpYmxlLCBhbmQgdGhlXHJcbiAgICAgKiByZWxldmFudCBldmVudHMgbmVlZCB0byBiZSBmaXJlZC5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlUm9vdFNpemUoZm9yY2UgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1VUlMyODg4MScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0udXBkYXRlU2l6ZShmb3JjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHVibGljICovXHJcbiAgICBjcmVhdGVBbmRJbml0Q29udGVudEl0ZW0oY29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcsIHBhcmVudDogQ29udGVudEl0ZW0pOiBDb250ZW50SXRlbSB7XHJcbiAgICAgICAgY29uc3QgbmV3SXRlbSA9IHRoaXMuY3JlYXRlQ29udGVudEl0ZW0oY29uZmlnLCBwYXJlbnQpO1xyXG4gICAgICAgIG5ld0l0ZW0uaW5pdCgpO1xyXG4gICAgICAgIHJldHVybiBuZXdJdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjdXJzaXZlbHkgY3JlYXRlcyBuZXcgaXRlbSB0cmVlIHN0cnVjdHVyZXMgYmFzZWQgb24gYSBwcm92aWRlZFxyXG4gICAgICogSXRlbUNvbmZpZ3VyYXRpb24gb2JqZWN0XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbmZpZyAtIFJlc29sdmVkSXRlbUNvbmZpZ1xyXG4gICAgICogQHBhcmFtIHBhcmVudCAtIFRoZSBpdGVtIHRoZSBuZXdseSBjcmVhdGVkIGl0ZW0gc2hvdWxkIGJlIGEgY2hpbGQgb2ZcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBjcmVhdGVDb250ZW50SXRlbShjb25maWc6IFJlc29sdmVkSXRlbUNvbmZpZywgcGFyZW50OiBDb250ZW50SXRlbSk6IENvbnRlbnRJdGVtIHtcclxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy50eXBlICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBcXCd0eXBlXFwnJywgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXZSBhZGQgYW4gYWRkaXRpb25hbCBzdGFjayBhcm91bmQgZXZlcnkgY29tcG9uZW50IHRoYXQncyBub3Qgd2l0aGluIGEgc3RhY2sgYW55d2F5cy5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjb21wb25lbnRcclxuICAgICAgICAgICAgUmVzb2x2ZWRJdGVtQ29uZmlnLmlzQ29tcG9uZW50SXRlbShjb25maWcpICYmXHJcblxyXG4gICAgICAgICAgICAvLyBhbmQgaXQncyBub3QgYWxyZWFkeSB3aXRoaW4gYSBzdGFja1xyXG4gICAgICAgICAgICAhKHBhcmVudCBpbnN0YW5jZW9mIFN0YWNrKSAmJlxyXG5cclxuICAgICAgICAgICAgLy8gYW5kIHdlIGhhdmUgYSBwYXJlbnRcclxuICAgICAgICAgICAgISFwYXJlbnQgJiZcclxuXHJcbiAgICAgICAgICAgIC8vIGFuZCBpdCdzIG5vdCB0aGUgdG9wbW9zdCBpdGVtIGluIGEgbmV3IHdpbmRvd1xyXG4gICAgICAgICAgICAhKHRoaXMuaXNTdWJXaW5kb3cgPT09IHRydWUgJiYgcGFyZW50IGluc3RhbmNlb2YgR3JvdW5kSXRlbSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhY2tDb25maWc6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuc3RhY2ssXHJcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbY29uZmlnXSxcclxuICAgICAgICAgICAgICAgIHNpemU6IGNvbmZpZy5zaXplLFxyXG4gICAgICAgICAgICAgICAgc2l6ZVVuaXQ6IGNvbmZpZy5zaXplVW5pdCxcclxuICAgICAgICAgICAgICAgIG1pblNpemU6IGNvbmZpZy5taW5TaXplLFxyXG4gICAgICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IGNvbmZpZy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgICAgIGlkOiBjb25maWcuaWQsXHJcbiAgICAgICAgICAgICAgICBtYXhpbWlzZWQ6IGNvbmZpZy5tYXhpbWlzZWQsXHJcbiAgICAgICAgICAgICAgICBpc0Nsb3NhYmxlOiBjb25maWcuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgICAgIGFjdGl2ZUl0ZW1JbmRleDogMCxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uZmlnID0gc3RhY2tDb25maWc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMuY3JlYXRlQ29udGVudEl0ZW1Gcm9tQ29uZmlnKGNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICByZXR1cm4gY29udGVudEl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgZmluZEZpcnN0Q29tcG9uZW50SXRlbUJ5SWQoaWQ6IHN0cmluZyk6IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1GRkNJQkk4MjQ0NicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZUJ5SWRSZWN1cnNpdmUoSXRlbVR5cGUuY29tcG9uZW50LCBpZCwgdGhpcy5fZ3JvdW5kSXRlbSkgYXMgQ29tcG9uZW50SXRlbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgcG9wb3V0IHdpbmRvdyB3aXRoIHRoZSBzcGVjaWZpZWQgY29udGVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGl0ZW1Db25maWdPckNvbnRlbnRJdGVtIC0gVGhlIGNvbnRlbnQgb2YgdGhlIHBvcG91dCB3aW5kb3cncyBsYXlvdXQgbWFuYWdlciBkZXJpdmVkIGZyb20gZWl0aGVyXHJcbiAgICAgKiBhIHtAbGluayAoQ29udGVudEl0ZW06Y2xhc3MpfSBvciB7QGxpbmsgKEl0ZW1Db25maWc6aW50ZXJmYWNlKX0gb3IgUmVzb2x2ZWRJdGVtQ29uZmlnIGNvbnRlbnQgKGFycmF5IG9mIHtAbGluayAoSXRlbUNvbmZpZzppbnRlcmZhY2UpfSlcclxuICAgICAqIEBwYXJhbSBwb3NpdGlvbkFuZFNpemUgLSBUaGUgd2lkdGgsIGhlaWdodCwgbGVmdCBhbmQgdG9wIG9mIFBvcG91dCB3aW5kb3dcclxuICAgICAqIEBwYXJhbSBwYXJlbnRJZCAtVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRoaXMgaXRlbSB3aWxsIGJlIGFwcGVuZGVkIHRvIHdoZW4gcG9wSW4gaXMgY2FsbGVkXHJcbiAgICAgKiBAcGFyYW0gaW5kZXhJblBhcmVudCAtIFRoZSBwb3NpdGlvbiBvZiB0aGlzIGl0ZW0gd2l0aGluIGl0cyBwYXJlbnQgZWxlbWVudFxyXG4gICAgICovXHJcblxyXG4gICAgY3JlYXRlUG9wb3V0KGl0ZW1Db25maWdPckNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSB8IFJlc29sdmVkUm9vdEl0ZW1Db25maWcsXHJcbiAgICAgICAgcG9zaXRpb25BbmRTaXplOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3csXHJcbiAgICAgICAgcGFyZW50SWQ6IHN0cmluZyB8IG51bGwsXHJcbiAgICAgICAgaW5kZXhJblBhcmVudDogbnVtYmVyIHwgbnVsbFxyXG4gICAgKTogQnJvd3NlclBvcG91dCB7XHJcbiAgICAgICAgaWYgKGl0ZW1Db25maWdPckNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29udGVudEl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUG9wb3V0RnJvbUNvbnRlbnRJdGVtKGl0ZW1Db25maWdPckNvbnRlbnRJdGVtLCBwb3NpdGlvbkFuZFNpemUsIHBhcmVudElkLCBpbmRleEluUGFyZW50KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQb3BvdXRGcm9tSXRlbUNvbmZpZyhpdGVtQ29uZmlnT3JDb250ZW50SXRlbSwgcG9zaXRpb25BbmRTaXplLCBwYXJlbnRJZCwgaW5kZXhJblBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNyZWF0ZVBvcG91dEZyb21Db250ZW50SXRlbShpdGVtOiBDb250ZW50SXRlbSxcclxuICAgICAgICB3aW5kb3c6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdyB8IHVuZGVmaW5lZCxcclxuICAgICAgICBwYXJlbnRJZDogc3RyaW5nIHwgbnVsbCxcclxuICAgICAgICBpbmRleEluUGFyZW50OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgKTogQnJvd3NlclBvcG91dCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhlIGl0ZW0gaXMgdGhlIG9ubHkgY29tcG9uZW50IHdpdGhpbiBhIHN0YWNrIG9yIGZvciBzb21lXHJcbiAgICAgICAgICogb3RoZXIgcmVhc29uIHRoZSBvbmx5IGNoaWxkIG9mIGl0cyBwYXJlbnQgdGhlIHBhcmVudCB3aWxsIGJlIGRlc3Ryb3llZFxyXG4gICAgICAgICAqIHdoZW4gdGhlIGNoaWxkIGlzIHJlbW92ZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBJbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgd2UgbW92ZSB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIHNvbWV0aGluZ1xyXG4gICAgICAgICAqIHRoYXQgd2lsbCByZW1haW4gYWZ0ZXIgdGhlIGl0ZW0gaXMgYmVpbmcgcG9wcGVkIG91dFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGFuY2hvciA9IGl0ZW0uZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCkgPz8gdGhpcy5ncm91bmRJdGVtPy5jb250ZW50SXRlbXNbMF1cclxuICAgICAgICBpZiAoYW5jaG9yID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1DUEZDSTAwODMzJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYW5jaG9yLnBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignTE1DUEZDSTAwODM0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGluZGV4SW5QYXJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaW5kZXhJblBhcmVudCA9IGFuY2hvci5wYXJlbnQuY29udGVudEl0ZW1zLmluZGV4T2YoYW5jaG9yKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHBhcmVudElkICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBhbmNob3IucGFyZW50LmFkZFBvcEluUGFyZW50SWQocGFyZW50SWQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAod2luZG93ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyU2NyZWVuID0gZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbihnbG9iYWxUaGlzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSAoaXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudEl0ZW0pID8gaXRlbS5nZXRPdXRlckJvdW5kaW5nQ2xpZW50UmVjdCgpIDogaXRlbS5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHdpbmRvdyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBpbm5lclNjcmVlbi5sZWZ0ICsgY2xpZW50UmVjdC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogaW5uZXJTY3JlZW4udG9wICsgY2xpZW50UmVjdC50b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNsaWVudFJlY3Qud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjbGllbnRSZWN0LmhlaWdodCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBpdGVtLnRvQ29uZmlnKCk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnBhcmVudD8uY29udGVudEl0ZW1zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIVJlc29sdmVkUm9vdEl0ZW1Db25maWcuaXNSb290SXRlbUNvbmZpZyhpdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Qb3BvdXRDYW5ub3RCZUNyZWF0ZWRXaXRoR3JvdW5kSXRlbUNvbmZpZ119YCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQb3BvdXRGcm9tSXRlbUNvbmZpZyhpdGVtQ29uZmlnLCB3aW5kb3csIHBhcmVudElkLCBpbmRleEluUGFyZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBiZWdpblZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoKyt0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmdCZWdpbkNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lcnMubGVuZ3RoID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYWRkVmlydHVhbFNpemVkQ29udGFpbmVyKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdmlydHVhbFNpemVkQ29udGFpbmVycy5wdXNoKGNvbnRhaW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZW5kVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICgtLXRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZ0JlZ2luQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJzLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5ub3RpZnlWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lcnMubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmaXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGZpcmVBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5hZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVQb3BvdXRGcm9tSXRlbUNvbmZpZyhyb290SXRlbUNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyxcclxuICAgICAgICB3aW5kb3c6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdyxcclxuICAgICAgICBwYXJlbnRJZDogc3RyaW5nIHwgbnVsbCxcclxuICAgICAgICBpbmRleEluUGFyZW50OiBudW1iZXIgfCBudWxsXHJcbiAgICApIHtcclxuICAgICAgICBjb25zdCBsYXlvdXRDb25maWcgPSB0aGlzLnRvQ29uZmlnKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBvcG91dExheW91dENvbmZpZzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IHJvb3RJdGVtQ29uZmlnLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogW10sXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBsYXlvdXRDb25maWcuc2V0dGluZ3MsXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IGxheW91dENvbmZpZy5kaW1lbnNpb25zLFxyXG4gICAgICAgICAgICBoZWFkZXI6IGxheW91dENvbmZpZy5oZWFkZXIsXHJcbiAgICAgICAgICAgIHdpbmRvdyxcclxuICAgICAgICAgICAgcGFyZW50SWQsXHJcbiAgICAgICAgICAgIGluZGV4SW5QYXJlbnQsXHJcbiAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUG9wb3V0RnJvbVBvcG91dExheW91dENvbmZpZyhwb3BvdXRMYXlvdXRDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNyZWF0ZVBvcG91dEZyb21Qb3BvdXRMYXlvdXRDb25maWcoY29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyk6IEJyb3dzZXJQb3BvdXQge1xyXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYWxyZWFkeSBhIHBvcG91dCwgbGV0IHRoZSBwYXJlbnQgbGF5b3V0IG1hbmFnZXIgaGFuZGxlIHRoZSBuZXcgb25lLlxyXG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudC5jcmVhdGVQb3BvdXRGcm9tUG9wb3V0TGF5b3V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb25maWdXaW5kb3cgPSBjb25maWcud2luZG93O1xyXG4gICAgICAgIGNvbnN0IGluaXRpYWxXaW5kb3c6IFJlY3QgPSB7XHJcbiAgICAgICAgICAgIGxlZnQ6IGNvbmZpZ1dpbmRvdy5sZWZ0ID8/IChnbG9iYWxUaGlzLnNjcmVlblggfHwgZ2xvYmFsVGhpcy5zY3JlZW5MZWZ0ICsgMjApLFxyXG4gICAgICAgICAgICB0b3A6IGNvbmZpZ1dpbmRvdy50b3AgPz8gKGdsb2JhbFRoaXMuc2NyZWVuWSB8fCBnbG9iYWxUaGlzLnNjcmVlblRvcCArIDIwKSxcclxuICAgICAgICAgICAgd2lkdGg6IGNvbmZpZ1dpbmRvdy53aWR0aCA/PyA1MDAsXHJcbiAgICAgICAgICAgIGhlaWdodDogY29uZmlnV2luZG93LmhlaWdodCA/PyAzMDksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYnJvd3NlclBvcG91dCA9IG5ldyBCcm93c2VyUG9wb3V0KGNvbmZpZywgaW5pdGlhbFdpbmRvdywgdGhpcyk7XHJcblxyXG4gICAgICAgIGJyb3dzZXJQb3BvdXQub24oJ2luaXRpYWxpc2VkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsbSA9IGJyb3dzZXJQb3BvdXQuZ2V0R2xJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIHBvcG91dCB3aGVuIHRoZSBsYXN0IGNvbXBvbmVudCBpdGVtIGlzIGRlc3Ryb3llZC5cclxuICAgICAgICAgICAgY29uc3QgZGVzdHJveUlmRW1wdHkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxtLmlzRHJhZ2dpbmcgJiYgbG0uZ3JvdW5kSXRlbT8uZ2V0QWxsQ29tcG9uZW50SXRlbXMoKT8ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlclBvcG91dC5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbG0ub24oJ2l0ZW1Ecm9wcGVkJywgZGVzdHJveUlmRW1wdHkpO1xyXG4gICAgICAgICAgICBsbS5vbignaXRlbURlc3Ryb3llZCcsIGRlc3Ryb3lJZkVtcHR5KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnd2luZG93T3BlbmVkJywgYnJvd3NlclBvcG91dCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGJyb3dzZXJQb3BvdXQub24oJ2Nsb3NlZCcsICgpID0+IHRoaXMucmVjb25jaWxlUG9wb3V0V2luZG93cygpKTtcclxuXHJcbiAgICAgICAgdGhpcy5fb3BlblBvcG91dHMucHVzaChicm93c2VyUG9wb3V0KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLmNsb3NlUG9wb3V0c09uVW5sb2FkICYmICF0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcpIHtcclxuICAgICAgICAgICAgZ2xvYmFsVGhpcy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJyb3dzZXJQb3BvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbG9zZXMgYWxsIE9wZW4gUG9wb3V0c1xyXG4gICAgICogQXBwbGljYXRpb25zIGNhbiBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gYSBwYWdlIGlzIHVubG9hZGVkIHRvIHJlbW92ZSBpdHMgb3BlbiBwb3BvdXRzXHJcbiAgICAgKi9cclxuXHJcbiAgICBjbG9zZUFsbE9wZW5Qb3BvdXRzKHByZXZlbnRQb3BJbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9vcGVuUG9wb3V0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9vcGVuUG9wb3V0c1tpXS5jbG9zZShwcmV2ZW50UG9wSW4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb3BlblBvcG91dHMubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmluZykge1xyXG4gICAgICAgICAgICBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0YWNoZXMgRHJhZ0xpc3RlbmVyIHRvIGFueSBnaXZlbiBET00gZWxlbWVudFxyXG4gICAgICogYW5kIHR1cm5zIGl0IGludG8gYSB3YXkgb2YgY3JlYXRpbmcgbmV3IENvbXBvbmVudEl0ZW1zXHJcbiAgICAgKiBieSAnZHJhZ2dpbmcnIHRoZSBET00gZWxlbWVudCBpbnRvIHRoZSBsYXlvdXRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBIVE1MIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBsaXN0ZW5lZCB0byBmb3IgY29tbWVuY2VtZW50IG9mIGRyYWcuXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZU9ySXRlbUNvbmZpZ0NhbGxiYWNrIC0gVHlwZSBvZiBjb21wb25lbnQgdG8gYmUgY3JlYXRlZCwgb3IgYSBjYWxsYmFjayB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIEl0ZW1Db25maWdcclxuICAgICAqIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50U3RhdGUgLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlIG9mIGNvbXBvbmVudC4gIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIGNvbXBvbmVudFR5cGVPckZ0biBpcyBhIGZ1bmN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIGFuIG9wYXF1ZSBvYmplY3QgdGhhdCBpZGVudGlmaWVzIHRoZSBET00gZWxlbWVudFxyXG5cdCAqICAgICAgICAgIGFuZCB0aGUgYXR0YWNoZWQgaXRlbUNvbmZpZy4gVGhpcyBjYW4gYmUgdXNlZCBpblxyXG5cdCAqICAgICAgICAgIHJlbW92ZURyYWdTb3VyY2UoKSBsYXRlciB0byBnZXQgcmlkIG9mIHRoZSBkcmFnIGxpc3RlbmVycy5cclxuICAgICAqL1xyXG4gICAgbmV3RHJhZ1NvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCwgaXRlbUNvbmZpZ0NhbGxiYWNrOiAoKSA9PiAoRHJhZ1NvdXJjZS5Db21wb25lbnRJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZykpOiBEcmFnU291cmNlO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVwbGFjZWQgaW4gdmVyc2lvbiAzIHdpdGggbmV3RHJhZ1NvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCwgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZykgKi9cclxuICAgIG5ld0RyYWdTb3VyY2UoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogSnNvblZhbHVlLCBpZD86IHN0cmluZyk6IERyYWdTb3VyY2U7XHJcbiAgICBuZXdEcmFnU291cmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIGNvbXBvbmVudFR5cGVPckl0ZW1Db25maWdDYWxsYmFjazogSnNvblZhbHVlIHwgKCgpID0+IChEcmFnU291cmNlLkNvbXBvbmVudEl0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnKSksXHJcbiAgICAgICAgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsXHJcbiAgICAgICAgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICAgICAgaWQ/OiBzdHJpbmcsXHJcbiAgICApOiBEcmFnU291cmNlIHtcclxuICAgICAgICBjb25zdCBkcmFnU291cmNlID0gbmV3IERyYWdTb3VyY2UodGhpcywgZWxlbWVudCwgW10sIGNvbXBvbmVudFR5cGVPckl0ZW1Db25maWdDYWxsYmFjaywgY29tcG9uZW50U3RhdGUsIHRpdGxlLCBpZCk7XHJcbiAgICAgICAgdGhpcy5fZHJhZ1NvdXJjZXMucHVzaChkcmFnU291cmNlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRyYWdTb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogUmVtb3ZlcyBhIERyYWdMaXN0ZW5lciBhZGRlZCBieSBjcmVhdGVEcmFnU291cmNlKCkgc28gdGhlIGNvcnJlc3BvbmRpbmdcclxuXHQgKiBET00gZWxlbWVudCBpcyBub3QgYSBkcmFnIHNvdXJjZSBhbnkgbW9yZS5cclxuXHQgKi9cclxuXHRyZW1vdmVEcmFnU291cmNlKGRyYWdTb3VyY2U6IERyYWdTb3VyY2UpOiB2b2lkIHtcclxuXHRcdHJlbW92ZUZyb21BcnJheShkcmFnU291cmNlLCB0aGlzLl9kcmFnU291cmNlcyApO1xyXG5cdFx0ZHJhZ1NvdXJjZS5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBzdGFydEV4dGVybmFsQ29tcG9uZW50RHJhZyhwYXJlbnQ6IERyYWdBY3Rpb24pIHtcclxuICAgICAgICBEcmFnQWN0aW9uLnNwYXduKHRoaXMsIHBhcmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc3RhcnRDb21wb25lbnREcmFnKHg6IG51bWJlciwgeTogbnVtYmVyLCBkcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSwgc3RhY2s6IFN0YWNrKTogdm9pZCB7XHJcbiAgICAgICAgLy8gQ2FuY2VsIHRoZSBkcmFnIG9mIHRoZSBsYXN0IHJlbWFpbmluZyBjb21wb25lbnQgaW1tZWRpYXRlbHkgaWY6XHJcbiAgICAgICAgLy8gICgxKSB0aGlzIGlzIHRoZSBtYWluIHdpbmRvdyAod2hpY2ggbXVzdCBub3QgYmUgZGVzdHJveWVkLCBwb3BvdXRzIGFyZSBjbG9zZWQgd2hlbiB0aGUgbGFzdCBjb21wb25lbnQgaXMgcmVtb3ZlZClcclxuICAgICAgICAvLyAgKDIpIG9yIGRyYWdnaW5nIGJldHdlZW4gd2luZG93cyBpcyBkaXNhYmxlZCAob25seSB0aGUgY3VycmVudCBsb2NhdGlvbiBpcyBhIHZhbGlkIGRyb3AgdGFyZ2V0KVxyXG4gICAgICAgIGlmICgodGhpcy5fcGFyZW50ID09PSBudWxsIHx8ICF0aGlzLmxheW91dENvbmZpZy5zZXR0aW5ncy5kcmFnQmV0d2VlbldpbmRvd3MpICYmIGNvbXBvbmVudEl0ZW0uZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgZHJhZ0xpc3RlbmVyLmNhbmNlbERyYWcoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYWN0aW9uID0gRHJhZ0FjdGlvbi5zdGFydCh0aGlzLCBkcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW0sIHN0YWNrLCB4LCB5KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLmRyYWdCZXR3ZWVuV2luZG93cykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBsbSBvZiB0aGlzLmluc3RhbmNlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxtICE9PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG0uc3RhcnRFeHRlcm5hbENvbXBvbmVudERyYWcoYWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBoaWRlRHJvcFRhcmdldEluZGljYXRvcigpIHtcclxuICAgICAgICB0aGlzLnRhYkRyb3BQbGFjZWhvbGRlci5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLmRyb3BUYXJnZXRJbmRpY2F0b3I/LmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2dyYW1tYXRpY2FsbHkgZm9jdXNlcyBhbiBpdGVtLiBUaGlzIGZvY3VzZXMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgaXRlbVxyXG4gICAgICogYW5kIHRoZSBpdGVtIGVtaXRzIGEgZm9jdXMgZXZlbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBjb21wb25lbnQgaXRlbSB0byBiZSBmb2N1c2VkXHJcbiAgICAgKiBAcGFyYW0gc3VwcHJlc3NFdmVudCAtIFdoZXRoZXIgdG8gZW1pdCBmb2N1cyBldmVudFxyXG4gICAgICovXHJcbiAgICBmb2N1c0NvbXBvbmVudChpdGVtOiBDb21wb25lbnRJdGVtLCBzdXBwcmVzc0V2ZW50ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpdGVtLmZvY3VzKHN1cHByZXNzRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZ3JhbW1hdGljYWxseSBibHVycyAoZGVmb2N1c2VzKSB0aGUgY3VycmVudGx5IGZvY3VzZWQgY29tcG9uZW50LlxyXG4gICAgICogSWYgYSBjb21wb25lbnQgaXRlbSBpcyBmb2N1c2VkLCB0aGVuIGl0IGlzIGJsdXJyZWQgYW5kIGFuZCB0aGUgaXRlbSBlbWl0cyBhIGJsdXIgZXZlbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBjb21wb25lbnQgaXRlbSB0byBiZSBibHVycmVkXHJcbiAgICAgKiBAcGFyYW0gc3VwcHJlc3NFdmVudCAtIFdoZXRoZXIgdG8gZW1pdCBibHVyIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIGNsZWFyQ29tcG9uZW50Rm9jdXMoc3VwcHJlc3NFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRGb2N1c2VkQ29tcG9uZW50SXRlbSh1bmRlZmluZWQsIHN1cHByZXNzRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZ3JhbW1hdGljYWxseSBmb2N1c2VzIGEgY29tcG9uZW50IGl0ZW0gb3IgcmVtb3ZlcyBmb2N1cyAoYmx1cnMpIGZyb20gYW4gZXhpc3RpbmcgZm9jdXNlZCBjb21wb25lbnQgaXRlbS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSAtIElmIGRlZmluZWQsIHNwZWNpZmllcyB0aGUgY29tcG9uZW50IGl0ZW0gdG8gYmUgZ2l2ZW4gZm9jdXMuICBJZiB1bmRlZmluZWQsIGNsZWFyIGNvbXBvbmVudCBmb2N1cy5cclxuICAgICAqIEBwYXJhbSBzdXBwcmVzc0V2ZW50cyAtIFdoZXRoZXIgdG8gZW1pdCBmb2N1cyBhbmQgYmx1ciBldmVudHNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBzZXRGb2N1c2VkQ29tcG9uZW50SXRlbShpdGVtOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkLCBzdXBwcmVzc0V2ZW50cyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGl0ZW0gIT09IHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgbmV3Rm9jdXNlZFBhcmVudEl0ZW06IENvbXBvbmVudFBhcmVudGFibGVJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdGb2N1c2VkUGFyZW50SXRlbSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbmV3Rm9jdXNlZFBhcmVudEl0ZW0gPSBpdGVtLnBhcmVudEl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRGb2N1c2VkSXRlbSA9IHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBvbGRGb2N1c2VkSXRlbS5zZXRCbHVycmVkKHN1cHByZXNzRXZlbnRzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZEZvY3VzZWRQYXJlbnRJdGVtID0gb2xkRm9jdXNlZEl0ZW0ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdGb2N1c2VkUGFyZW50SXRlbSA9PT0gb2xkRm9jdXNlZFBhcmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdGb2N1c2VkUGFyZW50SXRlbSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2xkRm9jdXNlZFBhcmVudEl0ZW0uc2V0Rm9jdXNlZFZhbHVlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRGb2N1c2VkKHN1cHByZXNzRXZlbnRzKTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdGb2N1c2VkUGFyZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Rm9jdXNlZFBhcmVudEl0ZW0uc2V0Rm9jdXNlZFZhbHVlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlQ29udGVudEl0ZW1Gcm9tQ29uZmlnKGNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnLCBwYXJlbnQ6IENvbnRlbnRJdGVtKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6IHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1DQ0lGQzY4ODcxJyk7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OiByZXR1cm4gbmV3IFJvd09yQ29sdW1uKGZhbHNlLCB0aGlzLCBjb25maWcgYXMgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsIHBhcmVudCk7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOiByZXR1cm4gbmV3IFJvd09yQ29sdW1uKHRydWUsIHRoaXMsIGNvbmZpZyBhcyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazogcmV0dXJuIG5ldyBTdGFjayh0aGlzLCBjb25maWcgYXMgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcsIHBhcmVudCk7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRJdGVtKHRoaXMsIGNvbmZpZyBhcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsIHBhcmVudCBhcyBTdGFjayk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0NDQzkxMzU2NCcsIGNvbmZpZy50eXBlLCAnSW52YWxpZCBDb25maWcgSXRlbSB0eXBlIHNwZWNpZmllZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gc3RhY2sgY29tcG9uZW50LlxyXG4gICAgICogU3RhY2sgd2lsbCBsb29rIGFmdGVyIGRvY2tpbmcgcHJvY2Vzc2luZyBhc3NvY2lhdGVkIHdpdGggbWF4aW1pc2UvbWluaW1pc2VcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICoqL1xyXG4gICAgc2V0TWF4aW1pc2VkU3RhY2soc3RhY2s6IFN0YWNrIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHN0YWNrID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZFN0YWNrICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc01pbmltaXNlTWF4aW1pc2VkU3RhY2soKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChzdGFjayAhPT0gdGhpcy5fbWF4aW1pc2VkU3RhY2spIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZWRTdGFjayAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc01heGltaXNlU3RhY2soc3RhY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VkU3RhY2sgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZWRTdGFjay5taW5pbWlzZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBzaG93QWxsQWN0aXZlQ29udGVudEl0ZW1zKCkgd2FzIGNhbGxlZCBmcm9tIENvbnRlbnRJdGVtLnNob3coKS4gIE5vdCBzdXJlIHdoYXQgaXRzIHB1cnBvc2Ugd2FzIHNvIGhhdmUgY29tbWVudGVkIG91dFxyXG4gICAgLy8gRXZlcnl0aGluZyBzZWVtcyB0byB3b3JrIG9rIHdpdGhvdXQgdGhpcy4gIEhhdmUgbGVmdCBjb21tZW50ZWQgY29kZSBqdXN0IGluIGNhc2UgdGhlcmUgd2FzIGEgcmVhc29uIGZvciBpdCBiZWNvbWVzXHJcbiAgICAvLyBhcHBhcmVudFxyXG5cclxuICAgIC8vIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIC8vIHNob3dBbGxBY3RpdmVDb250ZW50SXRlbXMoKTogdm9pZCB7XHJcbiAgICAvLyAgICAgY29uc3QgYWxsU3RhY2tzID0gdGhpcy5nZXRBbGxTdGFja3MoKTtcclxuXHJcbiAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxTdGFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgY29uc3Qgc3RhY2sgPSBhbGxTdGFja3NbaV07XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGFjdGl2ZUNvbnRlbnRJdGVtID0gc3RhY2suZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKGFjdGl2ZUNvbnRlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgIC8vICAgICAgICAgICAgIGlmICghKGFjdGl2ZUNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50SXRlbSkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNU0FBQ0lTMjIyOTgnKTtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYWN0aXZlQ29udGVudEl0ZW0uY29udGFpbmVyLnNob3coKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBoaWRlQWxsQWN0aXZlQ29udGVudEl0ZW1zKCkgd2FzIGNhbGxlZCBmcm9tIENvbnRlbnRJdGVtLmhpZGUoKS4gIE5vdCBzdXJlIHdoYXQgaXRzIHB1cnBvc2Ugd2FzIHNvIGhhdmUgY29tbWVudGVkIG91dFxyXG4gICAgLy8gRXZlcnl0aGluZyBzZWVtcyB0byB3b3JrIG9rIHdpdGhvdXQgdGhpcy4gIEhhdmUgbGVmdCBjb21tZW50ZWQgY29kZSBqdXN0IGluIGNhc2UgdGhlcmUgd2FzIGEgcmVhc29uIGZvciBpdCBiZWNvbWVzXHJcbiAgICAvLyBhcHBhcmVudFxyXG5cclxuICAgIC8vIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIC8vIGhpZGVBbGxBY3RpdmVDb250ZW50SXRlbXMoKTogdm9pZCB7XHJcbiAgICAvLyAgICAgY29uc3QgYWxsU3RhY2tzID0gdGhpcy5nZXRBbGxTdGFja3MoKTtcclxuXHJcbiAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxTdGFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgY29uc3Qgc3RhY2sgPSBhbGxTdGFja3NbaV07XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGFjdGl2ZUNvbnRlbnRJdGVtID0gc3RhY2suZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKGFjdGl2ZUNvbnRlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgIC8vICAgICAgICAgICAgIGlmICghKGFjdGl2ZUNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50SXRlbSkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNU0FBQ0lIMjIyOTgnKTtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYWN0aXZlQ29udGVudEl0ZW0uY29udGFpbmVyLmhpZGUoKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGNsZWFudXBCZWZvcmVNYXhpbWlzZWRTdGFja0Rlc3Ryb3llZChldmVudDogRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQpIHtcclxuXHRcdGlmICh0aGlzLl9tYXhpbWlzZWRTdGFjayAhPT0gbnVsbCAmJiB0aGlzLl9tYXhpbWlzZWRTdGFjayA9PT0gZXZlbnQudGFyZ2V0KSB7XHJcblx0XHRcdHRoaXMuX21heGltaXNlZFN0YWNrLm9mZignYmVmb3JlSXRlbURlc3Ryb3llZCcsIHRoaXMuX21heGltaXNlZFN0YWNrQmVmb3JlRGVzdHJveWVkTGlzdGVuZXIpO1xyXG5cdFx0XHR0aGlzLl9tYXhpbWlzZWRTdGFjayA9IHVuZGVmaW5lZDtcclxuXHRcdH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IGFyb3VuZCBzYW5kYm94ZWQgaWZyYW1lIHJlc3RyaWN0aW9ucy5cclxuICAgICAqIElmICdhbGxvdy10b3AtbmF2aWdhdGlvbicgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgaWZyYW1lJ3MgJ3NhbmRib3gnIGF0dHJpYnV0ZVxyXG4gICAgICogKGFzIGlzIHRoZSBjYXNlIHdpdGggY29kZXBlbnMpIHRoZSBwYXJlbnQgd2luZG93IGlzIGZvcmJpZGRlbiBmcm9tIGNhbGxpbmcgY2VydGFpblxyXG4gICAgICogbWV0aG9kcyBvbiB0aGUgY2hpbGQsIHN1Y2ggYXMgd2luZG93LmNsb3NlKCkgb3Igc2V0dGluZyBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgcHJldmVudGVkIEdvbGRlbkxheW91dCBwb3BvdXRzIGZyb20gcG9wcGluZyBpbiBpbiBjb2RlcGVucy4gVGhlIGZpeCBpcyB0byBjYWxsXHJcbiAgICAgKiBfJGNsb3NlV2luZG93IG9uIHRoZSBjaGlsZCB3aW5kb3cncyBnbCBpbnN0YW5jZSB3aGljaCAoYWZ0ZXIgYSB0aW1lb3V0IHRvIGRpc2Nvbm5lY3RcclxuICAgICAqIHRoZSBpbnZva2luZyBtZXRob2QgZnJvbSB0aGUgY2xvc2UgY2FsbCkgY2xvc2VzIGl0c2VsZi5cclxuICAgICAqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgY2xvc2VXaW5kb3coKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KCgpID0+IGdsb2JhbFRoaXMuY2xvc2UoKSwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0QXJlYSh4OiBudW1iZXIsIHk6IG51bWJlcik6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsIHtcclxuICAgICAgICBsZXQgbWF0Y2hpbmdBcmVhOiBDb250ZW50SXRlbS5BcmVhIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHNtYWxsZXN0U3VyZmFjZSA9IEluZmluaXR5O1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2l0ZW1BcmVhcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5faXRlbUFyZWFzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgeCA+PSBhcmVhLngxICYmXHJcbiAgICAgICAgICAgICAgICB4IDwgYXJlYS54MiAmJiAvLyB4MiBpcyBub3QgaW5jbHVkZWQgaW4gYXJlYVxyXG4gICAgICAgICAgICAgICAgeSA+PSBhcmVhLnkxICYmXHJcbiAgICAgICAgICAgICAgICB5IDwgYXJlYS55MiAmJiAvLyB5MiBpcyBub3QgaW5jbHVkZWQgaW4gYXJlYVxyXG4gICAgICAgICAgICAgICAgc21hbGxlc3RTdXJmYWNlID4gYXJlYS5zdXJmYWNlXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgc21hbGxlc3RTdXJmYWNlID0gYXJlYS5zdXJmYWNlO1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hpbmdBcmVhID0gYXJlYTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1hdGNoaW5nQXJlYTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjYWxjdWxhdGVJdGVtQXJlYXMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxsQ29udGVudEl0ZW1zID0gdGhpcy5nZXRBbGxDb250ZW50SXRlbXMoKTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGUgbGFzdCBpdGVtIGlzIGRyYWdnZWQgb3V0LCBoaWdobGlnaHQgdGhlIGVudGlyZSBjb250YWluZXIgc2l6ZSB0b1xyXG4gICAgICAgICAqIGFsbG93IHRvIHJlLWRyb3AgaXQuIHRoaXMuZ3JvdW5kLmNvbnRlbnRpSXRlbXMubGVuZ3RoID09PSAwIGF0IHRoaXMgcG9pbnRcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIERvbid0IGluY2x1ZGUgZ3JvdW5kIGludG8gdGhlIHBvc3NpYmxlIGRyb3AgYXJlYXMgdGhvdWdoIG90aGVyd2lzZSBzaW5jZSBpdFxyXG4gICAgICAgICAqIHdpbGwgdXNlZCBmb3IgZXZlcnkgZ2FwIGluIHRoZSBsYXlvdXQsIGUuZy4gc3BsaXR0ZXJzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgZ3JvdW5kSXRlbSA9IHRoaXMuX2dyb3VuZEl0ZW07XHJcbiAgICAgICAgaWYgKGdyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUNJQVI0NDM2NScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChhbGxDb250ZW50SXRlbXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBObyByb290IENvbnRlbnRJdGVtIChqdXN0IEdyb3VuZCBDb250ZW50SXRlbSlcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VuZEFyZWEgPSBncm91bmRJdGVtLmdldEVsZW1lbnRBcmVhKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdW5kQXJlYSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdMTUNJQVJBNDQzNjUnKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMgPSBbZ3JvdW5kQXJlYV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF0uaXNTdGFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHJvb3QgaXMgU3RhY2ssIHRoZW4gc3BsaXQgc3RhY2sgYW5kIHNpZGVzIG9mIExheW91dCBhcmUgc2FtZSwgc28gc2tpcCBzaWRlc1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1BcmVhcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzaWRlcyBvZiBsYXlvdXRcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMgPSBncm91bmRJdGVtLmNyZWF0ZVNpZGVBcmVhcygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsQ29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBhbGxDb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzU3RhY2soc3RhY2spKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZWEgPSBzdGFjay5nZXRBcmVhKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJlYSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMucHVzaChhcmVhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrQ29udGVudEFyZWFEaW1lbnNpb25zID0gc3RhY2suY29udGVudEFyZWFEaW1lbnNpb25zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrQ29udGVudEFyZWFEaW1lbnNpb25zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUNJQVNDNDU1OTknKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaGxpZ2h0QXJlYSA9IHN0YWNrQ29udGVudEFyZWFEaW1lbnNpb25zLmhlYWRlci5oaWdobGlnaHRBcmVhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VyZmFjZSA9IChoaWdobGlnaHRBcmVhLngyIC0gaGlnaGxpZ2h0QXJlYS54MSkgKiAoaGlnaGxpZ2h0QXJlYS55MiAtIGhpZ2hsaWdodEFyZWEueTEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXI6IENvbnRlbnRJdGVtLkFyZWEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxOiBoaWdobGlnaHRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MjogaGlnaGxpZ2h0QXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTE6IGhpZ2hsaWdodEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyOiBoaWdobGlnaHRBcmVhLnkyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbTogc3RhY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMucHVzaChoZWFkZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGFzIHBhcnQgb2YgbG9hZGluZyBhIG5ldyBsYXlvdXQgKGluY2x1ZGluZyBpbml0aWFsIGluaXQoKSkuXHJcbiAgICAgKiBDaGVja3MgdG8gc2VlIGxheW91dCBoYXMgYSBtYXhpbWlzZWQgaXRlbS4gSWYgc28sIGl0IG1heGltaXNlcyB0aGF0IGl0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjaGVja0xvYWRlZExheW91dE1heGltaXNlSXRlbSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQ0xMTUk0MzQzMicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ01heGltaXNlZEl0ZW1zID0gdGhpcy5fZ3JvdW5kSXRlbS5nZXRDb25maWdNYXhpbWlzZWRJdGVtcygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbmZpZ01heGltaXNlZEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxldCBpdGVtID0gY29uZmlnTWF4aW1pc2VkSXRlbXNbMF07XHJcbiAgICAgICAgICAgICAgICBpZiAoQ29udGVudEl0ZW0uaXNDb21wb25lbnRJdGVtKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBpdGVtLnBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2sgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0xNWExMTUk2OTk5OScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBzdGFjaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIUNvbnRlbnRJdGVtLmlzU3RhY2soaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQ0xMTUkxOTk5MycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLm1heGltaXNlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBwcm9jZXNzTWF4aW1pc2VTdGFjayhzdGFjazogU3RhY2spOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9tYXhpbWlzZWRTdGFjayA9IHN0YWNrO1xyXG4gICAgICAgIHN0YWNrLm9uKCdiZWZvcmVJdGVtRGVzdHJveWVkJywgdGhpcy5fbWF4aW1pc2VkU3RhY2tCZWZvcmVEZXN0cm95ZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgc3RhY2suZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuTWF4aW1pc2VkKTtcclxuICAgICAgICBzdGFjay5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCB0aGlzLl9tYXhpbWlzZVBsYWNlaG9sZGVyKTtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNTVhJMTk5OTMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmVsZW1lbnQucHJlcGVuZChzdGFjay5lbGVtZW50KTtcclxuICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQodGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aChzdGFjay5lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQoc3RhY2suZWxlbWVudCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgc3RhY2sudXBkYXRlU2l6ZSh0cnVlKTtcclxuICAgICAgICAgICAgc3RhY2suZm9jdXNBY3RpdmVDb250ZW50SXRlbSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZWRTdGFjay5lbWl0KCdtYXhpbWlzZWQnKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBwcm9jZXNzTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VkU3RhY2sgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNTU1TNzQ0MjInKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMuX21heGltaXNlZFN0YWNrO1xyXG4gICAgICAgICAgICBpZiAoc3RhY2sucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignTE1NSTEzNjY4Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5NYXhpbWlzZWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VQbGFjZWhvbGRlci5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgc3RhY2suZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhpbWlzZVBsYWNlaG9sZGVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSb290U2l6ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21heGltaXNlZFN0YWNrID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgc3RhY2sub2ZmKCdiZWZvcmVJdGVtRGVzdHJveWVkJywgdGhpcy5fbWF4aW1pc2VkU3RhY2tCZWZvcmVEZXN0cm95ZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5lbWl0KCdtaW5pbWlzZWQnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoZSBhcnJheSBvZiBvcGVuIHBvcG91dCB3aW5kb3dzIGFuZCByZW1vdmVzIHRoZSBvbmVzXHJcbiAgICAgKiB0aGF0IGFyZSBlZmZlY3RpdmVseSBjbG9zZWQuIFRoaXMgaXMgbmVjZXNzYXJ5IGR1ZSB0byB0aGUgbGFjayBvZiByZWxpYWJseVxyXG4gICAgICogbGlzdGVuaW5nIGZvciB3aW5kb3cuY2xvc2UgLyB1bmxvYWQgZXZlbnRzIGluIGEgY3Jvc3MgYnJvd3NlciBjb21wYXRpYmxlIGZhc2hpb24uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWNvbmNpbGVQb3BvdXRXaW5kb3dzKCkge1xyXG4gICAgICAgIGNvbnN0IG9wZW5Qb3BvdXRzOiBCcm93c2VyUG9wb3V0W10gPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9vcGVuUG9wb3V0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fb3BlblBvcG91dHNbaV0uZ2V0V2luZG93KCkuY2xvc2VkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgb3BlblBvcG91dHMucHVzaCh0aGlzLl9vcGVuUG9wb3V0c1tpXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3dpbmRvd0Nsb3NlZCcsIHRoaXMuX29wZW5Qb3BvdXRzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29wZW5Qb3BvdXRzLmxlbmd0aCAhPT0gb3BlblBvcG91dHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29wZW5Qb3BvdXRzID0gb3BlblBvcG91dHM7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBmbGF0dGVuZWQgYXJyYXkgb2YgYWxsIGNvbnRlbnQgaXRlbXMsXHJcbiAgICAgKiByZWdhcmRsZXMgb2YgbGV2ZWwgb3IgdHlwZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0QWxsQ29udGVudEl0ZW1zKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1HQUNJMTMxMzAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdW5kSXRlbS5nZXRBbGxDb250ZW50SXRlbXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIFN1YndpbmRvd3MgKGlmIHRoZXJlIGFyZSBhbnkpLiBUaHJvd3MgYW4gZXJyb3JcclxuICAgICAqIGlmIHBvcG91dHMgYXJlIGJsb2NrZWQuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdWJXaW5kb3dzKCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sYXlvdXRDb25maWcub3BlblBvcG91dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcG9wb3V0Q29uZmlnID0gdGhpcy5sYXlvdXRDb25maWcub3BlblBvcG91dHNbaV07XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUG9wb3V0RnJvbVBvcG91dExheW91dENvbmZpZyhwb3BvdXRDb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlYm91bmNlcyByZXNpemUgZXZlbnRzXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb250YWluZXJSZXNpemUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVzaXplV2l0aENvbnRhaW5lckF1dG9tYXRpY2FsbHkpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVzaXplV2l0aERlYm91bmNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVib3VuY2VzIHJlc2l6ZSBldmVudHNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHByb2Nlc3NSZXNpemVXaXRoRGVib3VuY2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVzaXplRGVib3VuY2VFeHRlbmRlZFdoZW5Qb3NzaWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ2xlYXJSZXNpemVUaW1lb3V0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVzaXplVGltZW91dElkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVzaXplVGltZW91dElkID0gc2V0VGltZW91dChcclxuICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXNpemVUaW1lb3V0SWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpblNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZFNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZURlYm91bmNlSW50ZXJ2YWwsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tDbGVhclJlc2l6ZVRpbWVvdXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3Jlc2l6ZVRpbWVvdXRJZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZXNpemVUaW1lb3V0SWQpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNpemVUaW1lb3V0SWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyB3aGF0IGVsZW1lbnQgdGhlIGxheW91dCB3aWxsIGJlIGNyZWF0ZWQgaW5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldENvbnRhaW5lcigpIHtcclxuICAgICAgICBjb25zdCBib2R5RWxlbWVudCA9IGRvY3VtZW50LmJvZHk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuX2NvbnRhaW5lckVsZW1lbnQgPz8gYm9keUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjb250YWluZXJFbGVtZW50ID09PSBib2R5RWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVdpdGhDb250YWluZXJBdXRvbWF0aWNhbGx5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcclxuICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50LnN0eWxlLm1hcmdpbiA9ICcwJztcclxuICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50LnN0eWxlLnBhZGRpbmcgPSAnMCc7XHJcbiAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xyXG4gICAgICAgICAgICBib2R5RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XHJcbiAgICAgICAgICAgIGJvZHlFbGVtZW50LnN0eWxlLm1hcmdpbiA9ICcwJztcclxuICAgICAgICAgICAgYm9keUVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcwJztcclxuICAgICAgICAgICAgYm9keUVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXJFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIHdpbmRvdyBpcyBjbG9zZWQgb3IgdGhlIHVzZXIgbmF2aWdhdGVzIGF3YXlcclxuICAgICAqIGZyb20gdGhlIHBhZ2VcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICogQGRlcHJlY2F0ZWQgdG8gYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkJlZm9yZVVubG9hZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkanVzdHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIGJlIGxvd2VyIHRvIGZpdCB0aGUgc2NyZWVuIGFuZCBzdGlsbCBtYWludGFpbiBtaW5JdGVtV2lkdGguXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhZGp1c3RDb2x1bW5zUmVzcG9uc2l2ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQUNSMjA4ODMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9maXJzdExvYWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWluIHdpZHRoIHNldCwgb3Igbm90IGNvbnRlbnQgaXRlbXMsIGRvIG5vdGhpbmcuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVzZVJlc3BvbnNpdmVMYXlvdXQoKSAmJlxyXG4gICAgICAgICAgICAgICAgIXRoaXMuX3VwZGF0aW5nQ29sdW1uc1Jlc3BvbnNpdmUgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zWzBdLmlzUm93KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dpZHRoID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1BQ1I3NzQxMicpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBjb2x1bW4sIGRvIG5vdGhpbmcuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW1uQ291bnQgPSB0aGlzLl9ncm91bmRJdGVtLmNvbnRlbnRJdGVtc1swXS5jb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5Db3VudCA8PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGV5IGFsbCBzdGlsbCBmaXQsIGRvIG5vdGhpbmcuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbkl0ZW1XaWR0aCA9IHRoaXMubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1XaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90YWxNaW5XaWR0aCA9IGNvbHVtbkNvdW50ICogbWluSXRlbVdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxNaW5XaWR0aCA8PSB0aGlzLl93aWR0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCB1cGRhdGVzIHdoaWxlIGl0IGlzIGFscmVhZHkgaGFwcGVuaW5nLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdDb2x1bW5zUmVzcG9uc2l2ZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCBob3cgbWFueSBjb2x1bW5zIHRvIHN0YWNrLCBhbmQgcHV0IHRoZW0gYWxsIGluIHRoZSBmaXJzdCBzdGFjayBjb250YWluZXIuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5hbENvbHVtbkNvdW50ID0gTWF0aC5tYXgoTWF0aC5mbG9vcih0aGlzLl93aWR0aCAvIG1pbkl0ZW1XaWR0aCksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2tDb2x1bW5Db3VudCA9IGNvbHVtbkNvdW50IC0gZmluYWxDb2x1bW5Db3VudDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb290Q29udGVudEl0ZW0gPSB0aGlzLl9ncm91bmRJdGVtLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbFN0YWNrcyA9IHRoaXMuZ2V0QWxsU3RhY2tzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsU3RhY2tzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1BQ1JTNzc0MTMnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFN0YWNrQ29udGFpbmVyID0gYWxsU3RhY2tzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2tDb2x1bW5Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YWNrIGZyb20gcmlnaHQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHJvb3RDb250ZW50SXRlbS5jb250ZW50SXRlbXNbcm9vdENvbnRlbnRJdGVtLmNvbnRlbnRJdGVtcy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZENvbnRlbnRJdGVtc1RvQ29udGFpbmVyKGZpcnN0U3RhY2tDb250YWluZXIsIGNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ0NvbHVtbnNSZXNwb25zaXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHJlc3BvbnNpdmUgbGF5b3V0IHNob3VsZCBiZSB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgcmVzcG9uc2l2ZSBsYXlvdXQgc2hvdWxkIGJlIHVzZWQ7IG90aGVyd2lzZSBmYWxzZS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVzZVJlc3BvbnNpdmVMYXlvdXQoKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmxheW91dENvbmZpZy5zZXR0aW5ncztcclxuICAgICAgICBjb25zdCBhbHdheXNSZXNwb25zaXZlTW9kZSA9IHNldHRpbmdzLnJlc3BvbnNpdmVNb2RlID09PSBSZXNwb25zaXZlTW9kZS5hbHdheXM7XHJcbiAgICAgICAgY29uc3Qgb25Mb2FkUmVzcG9uc2l2ZU1vZGVBbmRGaXJzdCA9IHNldHRpbmdzLnJlc3BvbnNpdmVNb2RlID09PSBSZXNwb25zaXZlTW9kZS5vbmxvYWQgJiYgdGhpcy5fZmlyc3RMb2FkO1xyXG4gICAgICAgIHJldHVybiBhbHdheXNSZXNwb25zaXZlTW9kZSB8fCBvbkxvYWRSZXNwb25zaXZlTW9kZUFuZEZpcnN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbGwgY2hpbGRyZW4gb2YgYSBub2RlIHRvIGFub3RoZXIgY29udGFpbmVyIHJlY3Vyc2l2ZWx5LlxyXG4gICAgICogQHBhcmFtIGNvbnRhaW5lciAtIENvbnRhaW5lciB0byBhZGQgY2hpbGQgY29udGVudCBpdGVtcyB0by5cclxuICAgICAqIEBwYXJhbSBub2RlIC0gTm9kZSB0byBzZWFyY2ggZm9yIGNvbnRlbnQgaXRlbXMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhZGRDaGlsZENvbnRlbnRJdGVtc1RvQ29udGFpbmVyKGNvbnRhaW5lcjogQ29udGVudEl0ZW0sIG5vZGU6IENvbnRlbnRJdGVtKSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gbm9kZS5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBTdGFjaykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQoaXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkQ2hpbGQoaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50SXRlbXNUb0NvbnRhaW5lcihjb250YWluZXIsIGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgYWxsIHRoZSBzdGFja3MuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgZm91bmQgc3RhY2sgY29udGFpbmVycy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEFsbFN0YWNrcygpIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNRkFTQzUyNzc4Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhY2tzOiBTdGFja1tdID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuZmluZEFsbFN0YWNrc1JlY3Vyc2l2ZShzdGFja3MsIHRoaXMuX2dyb3VuZEl0ZW0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN0YWNrcztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBmaW5kRmlyc3RDb250ZW50SXRlbVR5cGUodHlwZTogSXRlbVR5cGUpOiBDb250ZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUZGQ0lUODI0NDYnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGVSZWN1cnNpdmUodHlwZSwgdGhpcy5fZ3JvdW5kSXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlUmVjdXJzaXZlKHR5cGU6IEl0ZW1UeXBlLCBub2RlOiBDb250ZW50SXRlbSk6IENvbnRlbnRJdGVtIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSBub2RlLmNvbnRlbnRJdGVtcztcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbUNvdW50ID0gY29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICBpZiAoY29udGVudEl0ZW1Db3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50SXRlbS50eXBlID09PSB0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZENvbnRlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGVSZWN1cnNpdmUodHlwZSwgY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kQ29udGVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZENvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZUJ5SWRSZWN1cnNpdmUodHlwZTogSXRlbVR5cGUsIGlkOiBzdHJpbmcsIG5vZGU6IENvbnRlbnRJdGVtKTogQ29udGVudEl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IG5vZGUuY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtQ291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChjb250ZW50SXRlbUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50SXRlbUNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJdGVtLnR5cGUgPT09IHR5cGUgJiYgY29udGVudEl0ZW0uaWQgPT09IGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZENvbnRlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGVCeUlkUmVjdXJzaXZlKHR5cGUsIGlkLCBjb250ZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZm91bmRDb250ZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kQ29udGVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgYWxsIHRoZSBzdGFjayBjb250YWluZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzdGFja3MgLSBTZXQgb2YgY29udGFpbmVycyB0byBwb3B1bGF0ZS5cclxuICAgICAqIEBwYXJhbSBub2RlIC0gQ3VycmVudCBub2RlIHRvIHByb2Nlc3MuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmaW5kQWxsU3RhY2tzUmVjdXJzaXZlKHN0YWNrczogU3RhY2tbXSwgbm9kZTogQ29udGVudEl0ZW0pIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSBub2RlLmNvbnRlbnRJdGVtcztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFN0YWNrKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFja3MucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghaXRlbS5pc0NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZEFsbFN0YWNrc1JlY3Vyc2l2ZShzdGFja3MsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZmluZEZpcnN0TG9jYXRpb24oc2VsZWN0b3JzOiByZWFkb25seSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3JbXSk6IExheW91dE1hbmFnZXIuTG9jYXRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gc2VsZWN0b3JzLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3RvcnNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5maW5kTG9jYXRpb24oc2VsZWN0b3IpO1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBmaW5kTG9jYXRpb24oc2VsZWN0b3I6IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvcik6IExheW91dE1hbmFnZXIuTG9jYXRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdG9ySW5kZXggPSBzZWxlY3Rvci5pbmRleDtcclxuICAgICAgICBzd2l0Y2ggKHNlbGVjdG9yLnR5cGVJZCkge1xyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRm9jdXNlZEl0ZW06IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb250ZW50SXRlbXMgPSBwYXJlbnRJdGVtLmNvbnRlbnRJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb250ZW50SXRlbUNvdW50ID0gcGFyZW50Q29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JJbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhcmVudEl0ZW0sIGluZGV4OiBwYXJlbnRDb250ZW50SXRlbUNvdW50IH07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNlZEluZGV4ID0gcGFyZW50Q29udGVudEl0ZW1zLmluZGV4T2YodGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGZvY3VzZWRJbmRleCArIHNlbGVjdG9ySW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBwYXJlbnRDb250ZW50SXRlbUNvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50SXRlbSwgaW5kZXggfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRm9jdXNlZFN0YWNrOiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtLnBhcmVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RTdGFjazoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKEl0ZW1UeXBlLnN0YWNrKTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW0sIHNlbGVjdG9ySW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFJvd09yQ29sdW1uOiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKEl0ZW1UeXBlLnJvdyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKEl0ZW1UeXBlLmNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW0sIHNlbGVjdG9ySW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFJvdzoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKEl0ZW1UeXBlLnJvdyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RDb2x1bW46IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZShJdGVtVHlwZS5jb2x1bW4pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyeUNyZWF0ZUxvY2F0aW9uRnJvbVBhcmVudEl0ZW0ocGFyZW50SXRlbSwgc2VsZWN0b3JJbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkVtcHR5OiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1GTFJJRjE4MjQ0Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3RJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JJbmRleCA9PT0gdW5kZWZpbmVkIHx8IHNlbGVjdG9ySW5kZXggPT09IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBwYXJlbnRJdGVtOiB0aGlzLl9ncm91bmRJdGVtLCBpbmRleDogMCB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLlJvb3Q6IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUZMRjE4MjQ0Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VuZENvbnRlbnRJdGVtcyA9IHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91bmRDb250ZW50SXRlbXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvckluZGV4ID09PSB1bmRlZmluZWQgfHwgc2VsZWN0b3JJbmRleCA9PT0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhcmVudEl0ZW06IHRoaXMuX2dyb3VuZEl0ZW0sIGluZGV4OiAwIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSBncm91bmRDb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyeUNyZWF0ZUxvY2F0aW9uRnJvbVBhcmVudEl0ZW0ocGFyZW50SXRlbSwgc2VsZWN0b3JJbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgdHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtOiBDb250ZW50SXRlbSxcclxuICAgICAgICBzZWxlY3RvckluZGV4OiBudW1iZXIgfCB1bmRlZmluZWRcclxuICAgICk6IExheW91dE1hbmFnZXIuTG9jYXRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudENvbnRlbnRJdGVtcyA9IHBhcmVudEl0ZW0uY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudENvbnRlbnRJdGVtQ291bnQgPSBwYXJlbnRDb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChzZWxlY3RvckluZGV4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50SXRlbSwgaW5kZXg6IHBhcmVudENvbnRlbnRJdGVtQ291bnQgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0b3JJbmRleCA8IDAgfHwgc2VsZWN0b3JJbmRleCA+IHBhcmVudENvbnRlbnRJdGVtQ291bnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwYXJlbnRJdGVtLCBpbmRleDogc2VsZWN0b3JJbmRleCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIExheW91dE1hbmFnZXIge1xyXG4gICAgZXhwb3J0IHR5cGUgQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudCA9ICh0aGlzOiB2b2lkLCBjb3VudDogbnVtYmVyKSA9PiB2b2lkO1xyXG4gICAgZXhwb3J0IHR5cGUgQWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50ID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb25zdHJ1Y3RvclBhcmFtZXRlcnMge1xyXG4gICAgICAgIGNvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWc6IExheW91dENvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICBpc1N1YldpbmRvdzogYm9vbGVhbjtcclxuICAgICAgICBjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlTWF4aW1pc2VQbGFjZUVsZW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5NYXhpbWlzZVBsYWNlKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFiRHJvcFBsYWNlaG9sZGVyRWxlbWVudChkb2N1bWVudDogRG9jdW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyb3BUYWJQbGFjZWhvbGRlcik7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpZXMgYSBsb2NhdGlvbiBvZiBhIENvbnRlbnRJdGVtIHdpdGhvdXQgcmVmZXJlbmNpbmcgdGhlIGNvbnRlbnQgaXRlbS5cclxuICAgICAqIFVzZWQgdG8gc3BlY2lmeSB3aGVyZSBhIG5ldyBpdGVtIGlzIHRvIGJlIGFkZGVkXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb24ge1xyXG4gICAgICAgIHBhcmVudEl0ZW06IENvbnRlbnRJdGVtO1xyXG4gICAgICAgIGluZGV4OiBudW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHNlbGVjdG9yIHVzZWQgdG8gc3BlY2lmeSBhIHVuaXF1ZSBsb2NhdGlvbiBpbiB0aGUgbGF5b3V0XHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb25TZWxlY3RvciB7XHJcbiAgICAgICAgLyoqIFNwZWNpZmllcyBzZWxlY3RvciBhbGdvcml0aG0gKi9cclxuICAgICAgICB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkO1xyXG4gICAgICAgIC8qKiBVc2VkIGJ5IGFsZ29yaXRobSB0byBkZXRlcm1pbmUgaW5kZXggaW4gZm91bmQgQ29udGVudEl0ZW0gKi9cclxuICAgICAgICBpbmRleD86IG51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHB1YmxpYyAqL1xyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBMb2NhdGlvblNlbGVjdG9yIHtcclxuICAgICAgICBleHBvcnQgY29uc3QgZW51bSBUeXBlSWQge1xyXG4gICAgICAgICAgICAvKiogU3RhY2sgd2l0aCBmb2N1c2VkIEl0ZW0uIEluZGV4IHNwZWNpZmllcyBvZmZzZXQgZnJvbSBpbmRleCBvZiBmb2N1c2VkIGl0ZW0gKGVnIDEgaXMgdGhlIHBvc2l0aW9uIGFmdGVyIGZvY3VzZWQgaXRlbSkgKi9cclxuICAgICAgICAgICAgRm9jdXNlZEl0ZW0sXHJcbiAgICAgICAgICAgIC8qKiBTdGFjayB3aXRoIGZvY3VzZWQgSXRlbS4gSW5kZXggc3BlY2ZpZXMgQ29udGVudEl0ZW1zIGluZGV4ICovXHJcbiAgICAgICAgICAgIEZvY3VzZWRTdGFjayxcclxuICAgICAgICAgICAgLyoqIEZpcnN0IHN0YWNrIGZvdW5kIGluIGxheW91dCAqL1xyXG4gICAgICAgICAgICBGaXJzdFN0YWNrLFxyXG4gICAgICAgICAgICAvKiogRmlyc3QgUm93IG9yIENvbHVtbiBmb3VuZCBpbiBsYXlvdXQgKHJvd3MgYXJlIHNlYXJjaGVkIGZpcnN0KSAqL1xyXG4gICAgICAgICAgICBGaXJzdFJvd09yQ29sdW1uLFxyXG4gICAgICAgICAgICAvKiogRmlyc3QgUm93IGluIGxheW91dCAqL1xyXG4gICAgICAgICAgICBGaXJzdFJvdyxcclxuICAgICAgICAgICAgLyoqIEZpcnN0IENvbHVtbiBpbiBsYXlvdXQgKi9cclxuICAgICAgICAgICAgRmlyc3RDb2x1bW4sXHJcbiAgICAgICAgICAgIC8qKiBGaW5kcyBhIGxvY2F0aW9uIGlmIGxheW91dCBpcyBlbXB0eS4gVGhlIGZvdW5kIGxvY2F0aW9uIHdpbGwgYmUgdGhlIHJvb3QgQ29udGVudEl0ZW0uICovXHJcbiAgICAgICAgICAgIEVtcHR5LFxyXG4gICAgICAgICAgICAvKiogRmluZHMgcm9vdCBpZiBsYXlvdXQgaXMgZW1wdHksIG90aGVyd2lzZSBhIGNoaWxkIHVuZGVyIHJvb3QgKi9cclxuICAgICAgICAgICAgUm9vdCxcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZhdWx0IExvY2F0aW9uU2VsZWN0b3JzIGFycmF5IHVzZWQgaWYgbm9uZSBpcyBzcGVjaWZpZWQuICBXaWxsIGFsd2F5cyBmaW5kIGEgbG9jYXRpb24uXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0TG9jYXRpb25TZWxlY3RvcnM6IHJlYWRvbmx5IExvY2F0aW9uU2VsZWN0b3JbXSA9IFtcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRm9jdXNlZFN0YWNrLCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZpcnN0U3RhY2ssIGluZGV4OiB1bmRlZmluZWQgfSxcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RSb3dPckNvbHVtbiwgaW5kZXg6IHVuZGVmaW5lZCB9LFxyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5Sb290LCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICBdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9jYXRpb25TZWxlY3RvcnMgdG8gdHJ5IHRvIGdldCBsb2NhdGlvbiBuZXh0IHRvIGV4aXN0aW5nIGZvY3VzZWQgaXRlbVxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBleHBvcnQgY29uc3QgYWZ0ZXJGb2N1c2VkSXRlbUlmUG9zc2libGVMb2NhdGlvblNlbGVjdG9yczogcmVhZG9ubHkgTG9jYXRpb25TZWxlY3RvcltdID0gW1xyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5Gb2N1c2VkSXRlbSwgaW5kZXg6IDEgfSxcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RTdGFjaywgaW5kZXg6IHVuZGVmaW5lZCB9LFxyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFJvd09yQ29sdW1uLCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLlJvb3QsIGluZGV4OiB1bmRlZmluZWQgfSxcclxuICAgIF07XHJcbn1cclxuIiwiLyoqXHJcbiAqIE1pbmlmaWVzIGFuZCB1bm1pbmlmaWVzIGNvbmZpZ3MgYnkgcmVwbGFjaW5nIGZyZXF1ZW50IGtleXNcclxuICogYW5kIHZhbHVlcyB3aXRoIG9uZSBsZXR0ZXIgc3Vic3RpdHV0ZXMuIENvbmZpZyBvcHRpb25zIG11c3RcclxuICogcmV0YWluIGFycmF5IHBvc2l0aW9uL2luZGV4LCBhZGQgbmV3IG9wdGlvbnMgYXQgdGhlIGVuZC5cclxuICogQGludGVybmFsXHJcbiovXHJcblxyXG5leHBvcnQgbmFtZXNwYWNlIENvbmZpZ01pbmlmaWVyIHtcclxuXHJcbiAgICBleHBvcnQgdHlwZSBZWSA9ICdpZCcgfCAndGl0bGUnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGVudW0gWFgge1xyXG4gICAgICAgIGlkID0gJ2lkJ1xyXG4gICAgfVxyXG4gICAgY29uc3Qga2V5czogcmVhZG9ubHkgc3RyaW5nW10gPSBbXHJcbiAgICAgICAgJ3NldHRpbmdzJyxcclxuICAgICAgICAnaGFzSGVhZGVycycsXHJcbiAgICAgICAgJ2RyYWdCZXR3ZWVuV2luZG93cycsXHJcbiAgICAgICAgJ2RyYWdUb05ld1dpbmRvdycsXHJcbiAgICAgICAgJ3NlbGVjdGlvbkVuYWJsZWQnLFxyXG4gICAgICAgICdkaW1lbnNpb25zJyxcclxuICAgICAgICAnYm9yZGVyV2lkdGgnLFxyXG4gICAgICAgICdtaW5JdGVtSGVpZ2h0JyxcclxuICAgICAgICAnbWluSXRlbVdpZHRoJyxcclxuICAgICAgICAnaGVhZGVySGVpZ2h0JyxcclxuICAgICAgICAnZHJhZ1Byb3h5V2lkdGgnLFxyXG4gICAgICAgICdkcmFnUHJveHlIZWlnaHQnLFxyXG4gICAgICAgICdsYWJlbHMnLFxyXG4gICAgICAgICdjbG9zZScsXHJcbiAgICAgICAgJ21heGltaXNlJyxcclxuICAgICAgICAnbWluaW1pc2UnLFxyXG4gICAgICAgICdwb3BvdXQnLFxyXG4gICAgICAgICdjb250ZW50JyxcclxuICAgICAgICAnY29tcG9uZW50VHlwZScsXHJcbiAgICAgICAgJ2NvbXBvbmVudFN0YXRlJyxcclxuICAgICAgICAnaWQnLFxyXG4gICAgICAgICd3aWR0aCcsXHJcbiAgICAgICAgJ3R5cGUnLFxyXG4gICAgICAgICdoZWlnaHQnLFxyXG4gICAgICAgICdpc0Nsb3NhYmxlJyxcclxuICAgICAgICAndGl0bGUnLFxyXG4gICAgICAgICdwb3BvdXRXaG9sZVN0YWNrJyxcclxuICAgICAgICAnb3BlblBvcG91dHMnLFxyXG4gICAgICAgICdwYXJlbnRJZCcsXHJcbiAgICAgICAgJ2FjdGl2ZUl0ZW1JbmRleCcsXHJcbiAgICAgICAgJ3Jlb3JkZXJFbmFibGVkJyxcclxuICAgICAgICAnYm9yZGVyR3JhYldpZHRoJyxcclxuXHJcblxyXG5cclxuICAgICAgICAvL01heGltdW0gMzYgZW50cmllcywgZG8gbm90IGNyb3NzIHRoaXMgbGluZSFcclxuICAgIF07XHJcblxyXG4gICAgY29uc3QgdmFsdWVzOiByZWFkb25seSAoYm9vbGVhbiB8IHN0cmluZylbXSA9IFtcclxuICAgICAgICB0cnVlLFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgICdyb3cnLFxyXG4gICAgICAgICdjb2x1bW4nLFxyXG4gICAgICAgICdzdGFjaycsXHJcbiAgICAgICAgJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgJ2Nsb3NlJyxcclxuICAgICAgICAnbWF4aW1pc2UnLFxyXG4gICAgICAgICdtaW5pbWlzZScsXHJcbiAgICAgICAgJ29wZW4gaW4gbmV3IHdpbmRvdydcclxuICAgIF07XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSW5pdGlhbGlzZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPiAzNikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBtYW55IGtleXMgaW4gY29uZmlnIG1pbmlmaWVyIG1hcCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlT2JqZWN0KGZyb206IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBtaW5pZnk6IGJvb2xlYW4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XHJcbiAgICAgICAgY29uc3QgdG86IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xyXG4gICAgICAgICAgICBpZiAoZnJvbS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IC8vIEluIGNhc2Ugc29tZXRoaW5nIGhhcyBleHRlbmRlZCBPYmplY3QgcHJvdG90eXBlc1xyXG4gICAgICAgICAgICAgICAgbGV0IHRyYW5zbGF0ZWRLZXk6IHN0cmluZztcclxuICAgICAgICAgICAgICAgIGlmIChtaW5pZnkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVkS2V5ID0gbWluaWZ5S2V5KGtleSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRLZXkgPSB1bm1pbmlmeUtleShrZXkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21WYWx1ZSA9IGZyb21ba2V5XTtcclxuICAgICAgICAgICAgICAgIHRvW3RyYW5zbGF0ZWRLZXldID0gdHJhbnNsYXRlVmFsdWUoZnJvbVZhbHVlLCBtaW5pZnkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdG87XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlQXJyYXkoZnJvbTogdW5rbm93bltdLCBtaW5pZnk6IGJvb2xlYW4pIHtcclxuICAgICAgICBjb25zdCBsZW5ndGggPSBmcm9tLmxlbmd0aDtcclxuICAgICAgICBjb25zdCB0byA9IG5ldyBBcnJheTx1bmtub3duPihsZW5ndGgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgLy8gSW4gb3JpZ2luYWwgY29kZSwgYXJyYXkgaW5kaWNlcyB3ZXJlIG51bWJlcnMgYW5kIG5vdCB0cmFuc2xhdGVkXHJcbiAgICAgICAgICAgIGNvbnN0IGZyb21WYWx1ZSA9IGZyb21baV07XHJcbiAgICAgICAgICAgIHRvW2ldID0gdHJhbnNsYXRlVmFsdWUoZnJvbVZhbHVlLCBtaW5pZnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdG87XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlVmFsdWUoZnJvbTogdW5rbm93biwgbWluaWZ5OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICBpZiAoZnJvbSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmcm9tKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVBcnJheShmcm9tLCBtaW5pZnkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlT2JqZWN0KGZyb20gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1pbmlmeSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAobWluaWZ5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWluaWZ5VmFsdWUoZnJvbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5taW5pZnlWYWx1ZShmcm9tKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtaW5pZnlLZXkodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIGEgdmFsdWUgYWN0dWFsbHkgaXMgYSBzaW5nbGUgY2hhcmFjdGVyLCBwcmVmaXggaXRcclxuICAgICAgICAgKiB3aXRoIF9fXyB0byBhdm9pZCBtaXN0YWtpbmcgaXQgZm9yIGEgbWluaWZpY2F0aW9uIGNvZGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdfX18nICsgdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleE9mS2V5KHZhbHVlKTtcclxuICAgIFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIG5vdCBmb3VuZCBpbiB0aGUgZGljdGlvbmFyeSwgcmV0dXJuIGl0IHVubW9kaWZpZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIFxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogdmFsdWUgZm91bmQgaW4gZGljdGlvbmFyeSwgcmV0dXJuIGl0cyBiYXNlMzYgY291bnRlcnBhcnRcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdW5taW5pZnlLZXkoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIuIEFzc3VtZSB0aGF0IGl0J3MgYSB0cmFuc2xhdGlvblxyXG4gICAgICAgICAqIGFuZCByZXR1cm4gdGhlIG9yaWdpbmFsIHZhbHVlIGZyb20gdGhlIGRpY3Rpb25hcnlcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4ga2V5c1twYXJzZUludChrZXksIDM2KV07XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogdmFsdWUgb3JpZ2luYWxseSB3YXMgYSBzaW5nbGUgY2hhcmFjdGVyIGFuZCB3YXMgcHJlZml4ZWQgd2l0aCBfX19cclxuICAgICAgICAgKiB0byBhdm9pZCBtaXN0YWtpbmcgaXQgZm9yIGEgdHJhbnNsYXRpb24uIFJlbW92ZSB0aGUgcHJlZml4XHJcbiAgICAgICAgICogYW5kIHJldHVybiB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGtleS5zdWJzdHIoMCwgMykgPT09ICdfX18nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBrZXlbM107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIHdhcyBub3QgbWluaWZpZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1pbmlmeVZhbHVlKHZhbHVlOiB1bmtub3duKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgYSB2YWx1ZSBhY3R1YWxseSBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIsIHByZWZpeCBpdFxyXG4gICAgICAgICAqIHdpdGggX19fIHRvIGF2b2lkIG1pc3Rha2luZyBpdCBmb3IgYSBtaW5pZmljYXRpb24gY29kZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ19fXycgKyB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBjb25zdCBpbmRleCA9IGluZGV4T2ZWYWx1ZSh2YWx1ZSk7XHJcbiAgICBcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSBub3QgZm91bmQgaW4gdGhlIGRpY3Rpb25hcnksIHJldHVybiBpdCB1bm1vZGlmaWVkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICBcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIHZhbHVlIGZvdW5kIGluIGRpY3Rpb25hcnksIHJldHVybiBpdHMgYmFzZTM2IGNvdW50ZXJwYXJ0XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVubWluaWZ5VmFsdWUodmFsdWU6IHVua25vd24pIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIuIEFzc3VtZSB0aGF0IGl0J3MgYSB0cmFuc2xhdGlvblxyXG4gICAgICAgICAqIGFuZCByZXR1cm4gdGhlIG9yaWdpbmFsIHZhbHVlIGZyb20gdGhlIGRpY3Rpb25hcnlcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1twYXJzZUludCh2YWx1ZSwgMzYpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIG9yaWdpbmFsbHkgd2FzIGEgc2luZ2xlIGNoYXJhY3RlciBhbmQgd2FzIHByZWZpeGVkIHdpdGggX19fXHJcbiAgICAgICAgICogdG8gYXZvaWQgbWlzdGFraW5nIGl0IGZvciBhIHRyYW5zbGF0aW9uLiBSZW1vdmUgdGhlIHByZWZpeFxyXG4gICAgICAgICAqIGFuZCByZXR1cm4gdGhlIG9yaWdpbmFsIGNoYXJhY3RlclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN1YnN0cigwLCAzKSA9PT0gJ19fXycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlWzNdO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSB3YXMgbm90IG1pbmlmaWVkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGluZGV4T2ZLZXkoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGtleXNbaV0gPT09IGtleSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGluZGV4T2ZWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi9ldmVudC1lbWl0dGVyJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIERyYWdMaXN0ZW5lciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBwcml2YXRlIF90aW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcclxuICAgIHByaXZhdGUgX2FsbG93YWJsZVRhcmdldHM6IEhUTUxFbGVtZW50W107XHJcbiAgICBwcml2YXRlIF9vRG9jdW1lbnQ6IERvY3VtZW50O1xyXG4gICAgcHJpdmF0ZSBfZUJvZHk6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfbkRlbGF5OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9uRGlzdGFuY2U6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX29yaWdpbmFsRXZlbnQ6IEV2ZW50RW1pdHRlci5EcmFnRXZlbnQ7XHJcbiAgICBwcml2YXRlIF9kcmFnZ2luZzogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgX3BvaW50ZXJUcmFja2luZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgX3BvaW50ZXJEb3duRXZlbnRMaXN0ZW5lciA9IChldjogUG9pbnRlckV2ZW50KSA9PiB0aGlzLm9uUG9pbnRlckRvd24oZXYpO1xyXG4gICAgcHJpdmF0ZSBfcG9pbnRlck1vdmVFdmVudExpc3RlbmVyID0gKGV2OiBQb2ludGVyRXZlbnQpID0+IHRoaXMub25Qb2ludGVyTW92ZShldik7XHJcbiAgICBwcml2YXRlIF9wb2ludGVyVXBFdmVudExpc3RlbmVyID0gKGV2OiBQb2ludGVyRXZlbnQpID0+IHRoaXMub25Qb2ludGVyVXAoZXYpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VFbGVtZW50OiBIVE1MRWxlbWVudCwgZXh0cmFBbGxvd2FibGVDaGlsZFRhcmdldHM6IEhUTUxFbGVtZW50W10pIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl90aW1lb3V0ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICB0aGlzLl9hbGxvd2FibGVUYXJnZXRzID0gW19lRWxlbWVudCwgLi4uZXh0cmFBbGxvd2FibGVDaGlsZFRhcmdldHNdO1xyXG4gICAgICAgIHRoaXMuX29Eb2N1bWVudCA9IGRvY3VtZW50O1xyXG4gICAgICAgIHRoaXMuX2VCb2R5ID0gZG9jdW1lbnQuYm9keTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRlbGF5IGFmdGVyIHdoaWNoIHRvIHN0YXJ0IHRoZSBkcmFnIGluIG1pbGxpc2Vjb25kc1xyXG4gICAgICAgICAqIERvIE5PVCBtYWtlIHRvbyBzaG9ydCAocHJldmlvdXMgdmFsdWUgb2YgMjAwIHdhcyBub3QgbG9uZyBlbm91Z2ggZm9yIG15IHRvdWNocGFkKVxyXG4gICAgICAgICAqIFNob3VsZCBnZW5lcmFsbHkgcmVseSBvbiB0aGUgbW91c2UgbW92ZSB0byBzdGFydCBkcmFnLiAgTm90IHRoaXMgZGVsYXkuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fbkRlbGF5ID0gMTgwMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRpc3RhbmNlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZCB0byBxdWFsaWZ5IGFzIGEgZHJhZ1xyXG4gICAgICAgICAqIFByZXZpb3VzIGNvbW1lbnQ6IHdvcmtzIGJldHRlciB3aXRoIGRlbGF5IG9ubHlcclxuICAgICAgICAgKiA/Pz9cclxuICAgICAgICAgKiBQcm9iYWJseSBzb21laG93IG5lZWRzIHR1bmluZyBmb3IgZGlmZmVyZW50IGRldmljZXNcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9uRGlzdGFuY2UgPSAxMDtcclxuXHJcbiAgICAgICAgdGhpcy5fb3JpZ2luYWxFdmVudCA9IHsgcGFnZVg6IDAsIHBhZ2VZOiAwLCBzY3JlZW5YOiAwLCBzY3JlZW5ZOiAwfTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhZ2dpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9wb2ludGVyRG93bkV2ZW50TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZW1vdmVQb2ludGVyVHJhY2tpbmdFdmVudExpc3RlbmVycygpO1xyXG5cclxuICAgICAgICB0aGlzLl9lRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMuX3BvaW50ZXJEb3duRXZlbnRMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgY2FuY2VsRHJhZygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByb2Nlc3NEcmFnU3RvcCh1bmRlZmluZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Qb2ludGVyRG93bihvRXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9hbGxvd2FibGVUYXJnZXRzLmluY2x1ZGVzKG9FdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpICYmIG9FdmVudC5pc1ByaW1hcnkpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUG9pbnRlckRvd24ob0V2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzUG9pbnRlckRvd24oZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgICAgIHRoaXMuX29yaWdpbmFsRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICAgICAgdGhpcy5fb0RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5fcG9pbnRlck1vdmVFdmVudExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9vRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5fcG9pbnRlclVwRXZlbnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMuX2VCb2R5LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Qb2ludGVyVHJhY2tpbmcpO1xyXG4gICAgICAgIHRoaXMuX3BvaW50ZXJUcmFja2luZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREcmFnKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICwgdGhpcy5fbkRlbGF5KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uUG9pbnRlck1vdmUob0V2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5fcG9pbnRlclRyYWNraW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RyYWdNb3ZlKG9FdmVudCk7XHJcbiAgICAgICAgICAgIG9FdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NEcmFnTW92ZShldmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy5fb3JpZ2luYWxFdmVudC5wYWdlWDtcclxuICAgICAgICBjb25zdCBvZmZzZXRZID0gZXZlbnQucGFnZVkgLSB0aGlzLl9vcmlnaW5hbEV2ZW50LnBhZ2VZO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZHJhZ2dpbmcgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIE1hdGguYWJzKG9mZnNldFgpID4gdGhpcy5fbkRpc3RhbmNlIHx8XHJcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhvZmZzZXRZKSA+IHRoaXMuX25EaXN0YW5jZVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREcmFnKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnZ2luZykge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RyYWcnLCBvZmZzZXRYLCBvZmZzZXRZLCBldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Qb2ludGVyVXAob0V2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgICAgICB0aGlzLnByb2Nlc3NEcmFnU3RvcChvRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc0RyYWdTdG9wKGRyYWdFdmVudD86IFBvaW50ZXJFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl90aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lb3V0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGVja1JlbW92ZVBvaW50ZXJUcmFja2luZ0V2ZW50TGlzdGVuZXJzKCk7XHJcbiAgICBcclxuICAgICAgICBpZiAodGhpcy5fZHJhZ2dpbmcgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZUJvZHkuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyYWdnaW5nKTtcclxuICAgICAgICAgICAgdGhpcy5fZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyYWdnaW5nKTtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ2dpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdkcmFnU3RvcCcsIGRyYWdFdmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tSZW1vdmVQb2ludGVyVHJhY2tpbmdFdmVudExpc3RlbmVycygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fcG9pbnRlclRyYWNraW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29Eb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIHRoaXMuX3BvaW50ZXJNb3ZlRXZlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuX29Eb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLl9wb2ludGVyVXBFdmVudExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fZUJvZHkuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLlBvaW50ZXJUcmFja2luZyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJUcmFja2luZyA9IGZhbHNlO1xyXG4gICAgICAgIH0gICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGFydERyYWcoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RyYWdnaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9lQm9keS5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJhZ2dpbmcpO1xyXG4gICAgICAgIHRoaXMuX2VFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnZ2luZyk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkcmFnU3RhcnQnLCB0aGlzLl9vcmlnaW5hbEV2ZW50LnBhZ2VYLCB0aGlzLl9vcmlnaW5hbEV2ZW50LnBhZ2VZKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2RyYWcnLCAwLCAwLCB0aGlzLl9vcmlnaW5hbEV2ZW50KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJyb3dzZXJQb3BvdXQgfSBmcm9tICcuLi9jb250cm9scy9icm93c2VyLXBvcG91dCc7XHJcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4uL2NvbnRyb2xzL3RhYic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcblxyXG4vKipcclxuICogQSBnZW5lcmljIGFuZCB2ZXJ5IGZhc3QgRXZlbnRFbWl0dGVyIGltcGxlbWVudGF0aW9uLiBPbiB0b3Agb2YgZW1pdHRpbmcgdGhlIGFjdHVhbCBldmVudCBpdCBlbWl0cyBhblxyXG4gKiB7QGxpbmsgKEV2ZW50RW1pdHRlcjpuYW1lc3BhY2UpLkFMTF9FVkVOVH0gZXZlbnQgZm9yIGV2ZXJ5IGV2ZW50IHRyaWdnZXJlZC4gVGhpcyBhbGxvd3MgdG8gaG9vayBpbnRvIGl0IGFuZCBwcm94eSBldmVudHMgZm9yd2FyZHNcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9hbGxFdmVudFN1YnNjcmlwdGlvbnM6IEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2tbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudEVtaXR0ZXIuVW5rbm93bkNhbGxiYWNrW10+KCk7XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgdHJ5QnViYmxlRXZlbnQobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IENvbnRlbnRJdGVtXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0IGFuIGV2ZW50IGFuZCBub3RpZnkgbGlzdGVuZXJzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgLi4uYXJnczogRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwW0tdKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHN1YmNyaXB0aW9ucyA9IHRoaXMuX3N1YnNjcmlwdGlvbnNNYXAuZ2V0KGV2ZW50TmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChzdWJjcmlwdGlvbnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzdWJjcmlwdGlvbnMgPSBzdWJjcmlwdGlvbnMuc2xpY2UoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJjcmlwdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHN1YmNyaXB0aW9uc1tpXTtcclxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiguLi5hcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbWl0QWxsRXZlbnQoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgICAgICB0aGlzLnRyeUJ1YmJsZUV2ZW50KGV2ZW50TmFtZSwgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZW1pdFVua25vd24oZXZlbnROYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IEV2ZW50RW1pdHRlci5Vbmtub3duUGFyYW1zKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHN1YnMgPSB0aGlzLl9zdWJzY3JpcHRpb25zTWFwLmdldChldmVudE5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoc3VicyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHN1YnMgPSBzdWJzLnNsaWNlKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3Vicy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgc3Vic1tpXSguLi5hcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbWl0QWxsRXZlbnQoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgICAgICB0aGlzLnRyeUJ1YmJsZUV2ZW50KGV2ZW50TmFtZSwgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyogQGludGVybmFsICoqL1xyXG4gICAgZW1pdEJhc2VCdWJibGluZ0V2ZW50PEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50KGV2ZW50TmFtZSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5lbWl0VW5rbm93bihldmVudE5hbWUsIGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBlbWl0VW5rbm93bkJ1YmJsaW5nRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudChldmVudE5hbWUsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZW1pdFVua25vd24oZXZlbnROYW1lLCBldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZm9yIGFuIGV2ZW50LlxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjYWxsYmFjayBtZXRob2QgKG9wdGlvbmFsKVxyXG4gICAgICovXHJcbiAgICByZW1vdmVFdmVudExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5DYWxsYmFjazxLPik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHVua25vd25DYWxsYmFjayA9IGNhbGxiYWNrIGFzIEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVVbmtub3duRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHVua25vd25DYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgb2ZmPEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5DYWxsYmFjazxLPik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsaWFzIGZvciBvZmZcclxuICAgICAqL1xyXG4gICAgdW5iaW5kID0gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWxpYXMgZm9yIGVtaXRcclxuICAgICAqL1xyXG4gICAgdHJpZ2dlciA9IHRoaXMuZW1pdDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIExpc3RlbiBmb3IgZXZlbnRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBsaXN0ZW4gdG9cclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IG9jY3Vyc1xyXG4gICAgICovXHJcbiAgICBhZGRFdmVudExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5DYWxsYmFjazxLPik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHVua25vd25DYWxsYmFjayA9IGNhbGxiYWNrIGFzIEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5hZGRVbmtub3duRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHVua25vd25DYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgb248SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLkNhbGxiYWNrPEs+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgYWRkVW5rbm93bkV2ZW50TGlzdGVuZXIoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBFdmVudEVtaXR0ZXIuVW5rbm93bkNhbGxiYWNrKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gRXZlbnRFbWl0dGVyLkFMTF9FVkVOVCkge1xyXG4gICAgICAgICAgICB0aGlzLl9hbGxFdmVudFN1YnNjcmlwdGlvbnMucHVzaChjYWxsYmFjayk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHN1YnNjcmlwdGlvbnMgPSB0aGlzLl9zdWJzY3JpcHRpb25zTWFwLmdldChldmVudE5hbWUpO1xyXG4gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goY2FsbGJhY2spO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucyA9IFtjYWxsYmFja107XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zTWFwLnNldChldmVudE5hbWUsIHN1YnNjcmlwdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVtb3ZlVW5rbm93bkV2ZW50TGlzdGVuZXIoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBFdmVudEVtaXR0ZXIuVW5rbm93bkNhbGxiYWNrKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gRXZlbnRFbWl0dGVyLkFMTF9FVkVOVCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVN1YnNjcmlwdGlvbihldmVudE5hbWUsIHRoaXMuX2FsbEV2ZW50U3Vic2NyaXB0aW9ucywgY2FsbGJhY2spO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSB0aGlzLl9zdWJzY3JpcHRpb25zTWFwLmdldChldmVudE5hbWUpO1xyXG4gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHN1YnNjcmlidGlvbnMgdG8gdW5zdWJzY3JpYmUgZm9yIGV2ZW50ICcgKyBldmVudE5hbWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVTdWJzY3JpcHRpb24oZXZlbnROYW1lLCBzdWJzY3JpcHRpb25zLCBjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZW1vdmVTdWJzY3JpcHRpb24oZXZlbnROYW1lOiBzdHJpbmcsIHN1YnNjcmlwdGlvbnM6IEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2tbXSwgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBpZHggPSBzdWJzY3JpcHRpb25zLmluZGV4T2YoY2FsbGJhY2spO1xyXG4gICAgICAgIGlmIChpZHggPCAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm90aGluZyB0byB1bmJpbmQgZm9yICcgKyBldmVudE5hbWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW1pdEFsbEV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duW10pIHtcclxuICAgICAgICBjb25zdCBhbGxFdmVudFN1YnNjcmlwdGlvbnNDb3VudCA9IHRoaXMuX2FsbEV2ZW50U3Vic2NyaXB0aW9ucy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGFsbEV2ZW50U3Vic2NyaXB0aW9uc0NvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCB1bmtub3duQXJncyA9IGFyZ3Muc2xpY2UoKSBhcyBFdmVudEVtaXR0ZXIuVW5rbm93blBhcmFtcztcclxuICAgICAgICAgICAgdW5rbm93bkFyZ3MudW5zaGlmdChldmVudE5hbWUpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYWxsRXZlbnRTdWJjcmlwdGlvbnMgPSB0aGlzLl9hbGxFdmVudFN1YnNjcmlwdGlvbnMuc2xpY2UoKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsRXZlbnRTdWJzY3JpcHRpb25zQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgYWxsRXZlbnRTdWJjcmlwdGlvbnNbaV0oLi4udW5rbm93bkFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0aGF0J3MgdHJpZ2dlcmVkIGZvciBldmVyeSBldmVudFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgY29uc3QgQUxMX0VWRU5UID0gJ19fYWxsJztcclxuXHJcbiAgICBleHBvcnQgY29uc3QgaGVhZGVyQ2xpY2tFdmVudE5hbWUgPSAnc3RhY2tIZWFkZXJDbGljayc7XHJcbiAgICBleHBvcnQgY29uc3QgaGVhZGVyVG91Y2hTdGFydEV2ZW50TmFtZSA9ICdzdGFja0hlYWRlclRvdWNoU3RhcnQnO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIFVua25vd25DYWxsYmFjayA9ICh0aGlzOiB2b2lkLCAuLi5hcmdzOiBVbmtub3duUGFyYW1zKSA9PiB2b2lkO1xyXG4gICAgZXhwb3J0IHR5cGUgQ2FsbGJhY2s8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4gPSAodGhpczogdm9pZCwgLi4uYXJnczogRXZlbnRQYXJhbXNNYXBbS10pID0+IHZvaWQ7XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBFdmVudFBhcmFtc01hcCB7XHJcbiAgICAgICAgXCJfX2FsbFwiOiBVbmtub3duUGFyYW1zO1xyXG4gICAgICAgIFwiYWN0aXZlQ29udGVudEl0ZW1DaGFuZ2VkXCI6IENvbXBvbmVudEl0ZW1QYXJhbTtcclxuICAgICAgICBcImNsb3NlXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwiY2xvc2VkXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwiZGVzdHJveVwiOiBOb1BhcmFtcztcclxuICAgICAgICBcImRyYWdcIjogRHJhZ1BhcmFtcztcclxuICAgICAgICBcImRyYWdTdGFydFwiOiBEcmFnU3RhcnRQYXJhbXM7XHJcbiAgICAgICAgXCJkcmFnU3RvcFwiOiBEcmFnU3RvcFBhcmFtcztcclxuICAgICAgICBcImhpZGVcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJpbml0aWFsaXNlZFwiOiBOb1BhcmFtcztcclxuICAgICAgICBcIml0ZW1Ecm9wcGVkXCI6IENvbXBvbmVudEl0ZW1QYXJhbTtcclxuICAgICAgICBcIm1heGltaXNlZFwiOiBOb1BhcmFtcztcclxuICAgICAgICBcIm1pbmltaXNlZFwiOiBOb1BhcmFtcztcclxuICAgICAgICBcIm9wZW5cIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJwb3BJblwiOiBOb1BhcmFtcztcclxuICAgICAgICBcInJlc2l6ZVwiOiBOb1BhcmFtcztcclxuICAgICAgICBcInNob3dcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIC0gdXNlIHNob3cgaW5zdGVhZCAqL1xyXG4gICAgICAgIFwic2hvd25cIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJzdGF0ZUNoYW5nZWRcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJ0YWJcIjogVGFiUGFyYW07XHJcbiAgICAgICAgXCJ0YWJDcmVhdGVkXCI6IFRhYlBhcmFtO1xyXG4gICAgICAgIFwidGl0bGVDaGFuZ2VkXCI6IFN0cmluZ1BhcmFtO1xyXG4gICAgICAgIFwid2luZG93Q2xvc2VkXCI6IFBvcG91dFBhcmFtO1xyXG4gICAgICAgIFwid2luZG93T3BlbmVkXCI6IFBvcG91dFBhcmFtO1xyXG4gICAgICAgIFwiYmVmb3JlQ29tcG9uZW50UmVsZWFzZVwiOiBCZWZvcmVDb21wb25lbnRSZWxlYXNlUGFyYW1zO1xyXG4gICAgICAgIFwiYmVmb3JlSXRlbURlc3Ryb3llZFwiOiBCdWJibGluZ0V2ZW50UGFyYW07XHJcbiAgICAgICAgXCJpdGVtQ3JlYXRlZFwiOiBCdWJibGluZ0V2ZW50UGFyYW07XHJcbiAgICAgICAgXCJpdGVtRGVzdHJveWVkXCI6IEJ1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcImZvY3VzXCI6IEJ1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcImJsdXJcIjogQnViYmxpbmdFdmVudFBhcmFtO1xyXG4gICAgICAgIFwic3RhY2tIZWFkZXJDbGlja1wiOiBDbGlja0J1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcInN0YWNrSGVhZGVyVG91Y2hTdGFydFwiOiBUb3VjaFN0YXJ0QnViYmxpbmdFdmVudFBhcmFtO1xyXG4gICAgICAgIFwidXNlckJyb2FkY2FzdFwiOiBVbmtub3duUGFyYW1zO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCB0eXBlIFVua25vd25QYXJhbXMgPSB1bmtub3duW107XHJcbiAgICBleHBvcnQgdHlwZSBOb1BhcmFtcyA9IFtdO1xyXG4gICAgZXhwb3J0IHR5cGUgVW5rbm93blBhcmFtID0gW3Vua25vd25dO1xyXG4gICAgZXhwb3J0IHR5cGUgUG9wb3V0UGFyYW0gPSBbQnJvd3NlclBvcG91dF07XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRJdGVtUGFyYW0gPSBbQ29tcG9uZW50SXRlbV07XHJcbiAgICBleHBvcnQgdHlwZSBUYWJQYXJhbSA9IFtUYWJdO1xyXG4gICAgZXhwb3J0IHR5cGUgQnViYmxpbmdFdmVudFBhcmFtID0gW0V2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50XVxyXG4gICAgZXhwb3J0IHR5cGUgU3RyaW5nUGFyYW0gPSBbc3RyaW5nXTtcclxuICAgIGV4cG9ydCB0eXBlIERyYWdTdGFydFBhcmFtcyA9IFtvcmlnaW5hbFg6IG51bWJlciwgb3JpZ2luYWxZOiBudW1iZXJdO1xyXG4gICAgZXhwb3J0IHR5cGUgRHJhZ1N0b3BQYXJhbXMgPSBbZXZlbnQ6IFBvaW50ZXJFdmVudCB8IHVuZGVmaW5lZF07XHJcbiAgICBleHBvcnQgdHlwZSBEcmFnUGFyYW1zID0gW29mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyLCBldmVudDogRXZlbnRFbWl0dGVyLkRyYWdFdmVudF07XHJcbiAgICBleHBvcnQgdHlwZSBCZWZvcmVDb21wb25lbnRSZWxlYXNlUGFyYW1zID0gW2NvbXBvbmVudDogdW5rbm93bl07XHJcbiAgICBleHBvcnQgdHlwZSBDbGlja0J1YmJsaW5nRXZlbnRQYXJhbSA9IFtDbGlja0J1YmJsaW5nRXZlbnRdO1xyXG4gICAgZXhwb3J0IHR5cGUgVG91Y2hTdGFydEJ1YmJsaW5nRXZlbnRQYXJhbSA9IFtUb3VjaFN0YXJ0QnViYmxpbmdFdmVudF07XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBEcmFnRXZlbnQge1xyXG4gICAgICAgIHJlYWRvbmx5IHBhZ2VYOiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgcGFnZVk6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBzY3JlZW5YOiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgc2NyZWVuWTogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBCdWJibGluZ0V2ZW50IHtcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgZ2V0IG5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX25hbWU7IH1cclxuICAgICAgICBnZXQgdGFyZ2V0KCk6IEV2ZW50RW1pdHRlciB7IHJldHVybiB0aGlzLl90YXJnZXQ7IH1cclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoRXZlbnRFbWl0dGVyOm5hbWVzcGFjZSkuKEJ1YmJsaW5nRXZlbnQ6Y2xhc3MpLnRhcmdldH0gaW5zdGVhZCAqL1xyXG4gICAgICAgIGdldCBvcmlnaW4oKTogRXZlbnRFbWl0dGVyIHsgcmV0dXJuIHRoaXMuX3RhcmdldDsgfVxyXG4gICAgICAgIGdldCBpc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzUHJvcGFnYXRpb25TdG9wcGVkOyB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9uYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfdGFyZ2V0OiBFdmVudEVtaXR0ZXIpIHtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbigpOiB2b2lkIHtcclxuICAgICAgICAgICAgdGhpcy5faXNQcm9wYWdhdGlvblN0b3BwZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgQ2xpY2tCdWJibGluZ0V2ZW50IGV4dGVuZHMgQnViYmxpbmdFdmVudCB7XHJcbiAgICAgICAgZ2V0IG1vdXNlRXZlbnQoKTogTW91c2VFdmVudCB7IHJldHVybiB0aGlzLl9tb3VzZUV2ZW50OyB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHRhcmdldDogRXZlbnRFbWl0dGVyLFxyXG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX21vdXNlRXZlbnQ6IE1vdXNlRXZlbnRcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgc3VwZXIobmFtZSwgdGFyZ2V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFRvdWNoU3RhcnRCdWJibGluZ0V2ZW50IGV4dGVuZHMgQnViYmxpbmdFdmVudCB7XHJcbiAgICAgICAgZ2V0IHRvdWNoRXZlbnQoKTogVG91Y2hFdmVudCB7IHJldHVybiB0aGlzLl90b3VjaEV2ZW50OyB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHRhcmdldDogRXZlbnRFbWl0dGVyLFxyXG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3RvdWNoRXZlbnQ6IFRvdWNoRXZlbnRcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgc3VwZXIobmFtZSwgdGFyZ2V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgVW5leHBlY3RlZE51bGxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vZXZlbnQtZW1pdHRlcic7XHJcblxyXG4vLyBBZGQgb3VyIENoaWxkRXZlbnQgdG8gV2luZG93RXZlbnRNYXAgZm9yIHR5cGUgc2FmZXR5XHJcbi8qKiBAcHVibGljICovXHJcbmRlY2xhcmUgZ2xvYmFsIHtcclxuICAgIGludGVyZmFjZSBXaW5kb3dFdmVudE1hcCB7XHJcbiAgICAgICAgW0V2ZW50SHViLkNoaWxkRXZlbnROYW1lXTogQ3VzdG9tRXZlbnQ8RXZlbnRIdWIuQ2hpbGRFdmVudERldGFpbD47XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBbiBFdmVudEVtaXR0ZXIgc2luZ2xldG9uIHRoYXQgcHJvcGFnYXRlcyBldmVudHNcclxuICogYWNyb3NzIG11bHRpcGxlIHdpbmRvd3MuIFRoaXMgaXMgYSBsaXR0bGUgYml0IHRyaWNraWVyIHNpbmNlXHJcbiAqIHdpbmRvd3MgYXJlIGFsbG93ZWQgdG8gb3BlbiBjaGlsZFdpbmRvd3MgaW4gdGhlaXIgb3duIHJpZ2h0LlxyXG4gKlxyXG4gKiBUaGlzIG1lYW5zIHRoYXQgd2UgZGVhbCB3aXRoIGEgdHJlZSBvZiB3aW5kb3dzLiBUaGVyZWZvcmUsIHdlIGRvIHRoZSBldmVudCBwcm9wYWdhdGlvbiBpbiB0d28gcGhhc2VzOlxyXG4gKlxyXG4gKiAtIFByb3BhZ2F0ZSBldmVudHMgZnJvbSB0aGlzIGxheW91dCB0byB0aGUgcGFyZW50IGxheW91dFxyXG4gKiAgIC0gUmVwZWF0IHVudGlsIHRoZSBldmVudCBhcnJpdmVkIGF0IHRoZSByb290IGxheW91dFxyXG4gKiAtIFByb3BhZ2F0ZSBldmVudHMgdG8gdGhpcyBsYXlvdXQgYW5kIHRvIGFsbCBjaGlsZHJlblxyXG4gKiAgIC0gUmVwZWF0IHVudGlsIGFsbCBsYXlvdXRzIGdvdCB0aGUgZXZlbnRcclxuICpcclxuICogKipXQVJOSU5HKio6IE9ubHkgdXNlckJyb2FkY2FzdCBldmVudHMgYXJlIHByb3BhZ2F0ZWQgYmV0d2VlbiB3aW5kb3dzLlxyXG4gKiBUaGlzIG1lYW5zIHRoZSB5b3UgaGF2ZSB0byB0YWtlIGNhcmUgb2YgcHJvcGFnYXRpbmcgc3RhdGUgY2hhbmdlcyBiZXR3ZWVuIHdpbmRvd3MgeW91cnNlbGYuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBFdmVudEh1YiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY2hpbGRFdmVudExpc3RlbmVyID0gKGNoaWxkRXZlbnQ6IEN1c3RvbUV2ZW50PEV2ZW50SHViLkNoaWxkRXZlbnREZXRhaWw+KSA9PiB0aGlzLm9uRXZlbnRGcm9tQ2hpbGQoY2hpbGRFdmVudCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEV2ZW50SHViIGluc3RhbmNlXHJcbiAgICAgKiBAcGFyYW0gX2xheW91dE1hbmFnZXIgLSB0aGUgbGF5b3V0IG1hbmFnZXIgdG8gc3luY2hyb25pemUgYmV0d2VlbiB0aGUgd2luZG93c1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9sYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFdmVudEh1Yi5DaGlsZEV2ZW50TmFtZSwgdGhpcy5fY2hpbGRFdmVudExpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0IGFuIGV2ZW50IGFuZCBub3RpZnkgbGlzdGVuZXJzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lclxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgLi4uYXJnczogRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwW0tdKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gJ3VzZXJCcm9hZGNhc3QnKSB7XHJcbiAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgcmVkaXJlY3QgdGhlIHVzZXIgYnJvYWRjYXN0IHRvIG91ciBvdmVycmlkZGVuIG1ldGhvZC5cclxuICAgICAgICAgICAgdGhpcy5lbWl0VXNlckJyb2FkY2FzdCguLi5hcmdzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzdXBlci5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnJvYWRjYXN0cyBhIG1lc3NhZ2UgdG8gYWxsIG90aGVyIGN1cnJlbnRseSBvcGVuZWQgd2luZG93cy5cclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZW1pdFVzZXJCcm9hZGNhc3QoLi4uYXJnczogRXZlbnRFbWl0dGVyLlVua25vd25QYXJhbXMpOiB2b2lkIHtcclxuICAgICAgICAvLyBTdGVwIDE6IEJ1YmJsZSB1cCB0aGUgZXZlbnRcclxuICAgICAgICB0aGlzLmhhbmRsZVVzZXJCcm9hZGNhc3RFdmVudCgndXNlckJyb2FkY2FzdCcsIGFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhlIEV2ZW50SHViXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoRXZlbnRIdWIuQ2hpbGRFdmVudE5hbWUsIHRoaXMuX2NoaWxkRXZlbnRMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBwcm9jZXNzb3IgdG8gcHJvY2VzcyBsb2NhbCBldmVudHMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVVc2VyQnJvYWRjYXN0RXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9sYXlvdXRNYW5hZ2VyLmlzU3ViV2luZG93KSB7XHJcbiAgICAgICAgICAgIC8vIFdlIGFyZSBhIHN1YiB3aW5kb3cgYW5kIHJlY2VpdmVkIGFuIGV2ZW50IGZyb20gb25lIG9mIG91ciBjaGlsZHJlbi5cclxuICAgICAgICAgICAgLy8gU28gcHJvcGFnYXRlIGl0IHRvIHRoZSBSb290LlxyXG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVRvUGFyZW50KGV2ZW50TmFtZSwgYXJncyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gV2UgYXJlIHRoZSByb290IHdpbmRvdywgcHJvcGFnYXRlIGl0IHRvIHRoZSBzdWJ0cmVlIGJlbG93IHVzLlxyXG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVRvVGhpc0FuZFN1YnRyZWUoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayBmb3IgY2hpbGQgZXZlbnRzIHJhaXNlZCBvbiB0aGUgd2luZG93XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkV2ZW50RnJvbUNoaWxkKGV2ZW50OiBDdXN0b21FdmVudDxFdmVudEh1Yi5DaGlsZEV2ZW50RGV0YWlsPikge1xyXG4gICAgICAgIGNvbnN0IGRldGFpbCA9IGV2ZW50LmRldGFpbDtcclxuICAgICAgICB0aGlzLmhhbmRsZVVzZXJCcm9hZGNhc3RFdmVudChkZXRhaWwuZXZlbnROYW1lLCBkZXRhaWwuYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9wYWdhdGVzIHRoZSBldmVudCB0byB0aGUgcGFyZW50IGJ5IGVtaXR0aW5nXHJcbiAgICAgKiBpdCBvbiB0aGUgcGFyZW50J3MgRE9NIHdpbmRvd1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcHJvcGFnYXRlVG9QYXJlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSkge1xyXG4gICAgICAgIGNvbnN0IGRldGFpbDogRXZlbnRIdWIuQ2hpbGRFdmVudERldGFpbCA9IHtcclxuICAgICAgICAgICAgbGF5b3V0TWFuYWdlcjogdGhpcy5fbGF5b3V0TWFuYWdlcixcclxuICAgICAgICAgICAgZXZlbnROYW1lLFxyXG4gICAgICAgICAgICBhcmdzOiBhcmdzLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnRJbml0OiBFdmVudEh1Yi5DaGlsZEV2ZW50SW5pdCA9IHtcclxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcclxuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgZGV0YWlsLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PEV2ZW50SHViLkNoaWxkRXZlbnREZXRhaWw+KEV2ZW50SHViLkNoaWxkRXZlbnROYW1lLCBldmVudEluaXQpO1xyXG4gICAgICAgIGNvbnN0IG9wZW5lciA9IGdsb2JhbFRoaXMub3BlbmVyO1xyXG4gICAgICAgIGlmIChvcGVuZXIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0VIUFRQMTU3NzgnKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb3BlbmVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvcGFnYXRlIGV2ZW50cyB0byB0aGUgd2hvbGUgc3VidHJlZSB1bmRlciB0aGlzIGV2ZW50IGh1Yi5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHByb3BhZ2F0ZVRvVGhpc0FuZFN1YnRyZWUoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSkge1xyXG4gICAgICAgIHRoaXMuZW1pdFVua25vd24oZXZlbnROYW1lLCAuLi5hcmdzKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xheW91dE1hbmFnZXIub3BlblBvcG91dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRHbCA9IHRoaXMuX2xheW91dE1hbmFnZXIub3BlblBvcG91dHNbaV0uZ2V0R2xJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNoaWxkR2wpIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkR2wuZXZlbnRIdWIucHJvcGFnYXRlVG9UaGlzQW5kU3VidHJlZShldmVudE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEV2ZW50SHViIHtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgY29uc3QgQ2hpbGRFdmVudE5hbWUgPSAnZ2xfY2hpbGRfZXZlbnQnO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIENoaWxkRXZlbnREZXRhaWwgPSB7XHJcbiAgICAgICAgbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcjtcclxuICAgICAgICBldmVudE5hbWU6IHN0cmluZztcclxuICAgICAgICBhcmdzOiB1bmtub3duW107XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIENoaWxkRXZlbnRJbml0ID0gQ3VzdG9tRXZlbnRJbml0PENoaWxkRXZlbnREZXRhaWw+O1xyXG59XHJcbiIsImltcG9ydCB7IEFzc2VydEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjb25zdCBlbnVtIEkxOG5TdHJpbmdJZCB7XHJcbiAgICBQb3BvdXRDYW5ub3RCZUNyZWF0ZWRXaXRoR3JvdW5kSXRlbUNvbmZpZyxcclxuICAgIFBsZWFzZVJlZ2lzdGVyQUNvbnN0cnVjdG9yRnVuY3Rpb24sXHJcbiAgICBDb21wb25lbnRUeXBlTm90UmVnaXN0ZXJlZEFuZEJpbmRDb21wb25lbnRFdmVudEhhbmRsZXJOb3RBc3NpZ25lZCxcclxuICAgIENvbXBvbmVudElzQWxyZWFkeVJlZ2lzdGVyZWQsXHJcbiAgICBDb21wb25lbnRJc05vdFZpcnR1YWJsZSxcclxuICAgIFZpcnR1YWxDb21wb25lbnREb2VzTm90SGF2ZVJvb3RIdG1sRWxlbWVudCxcclxuICAgIEl0ZW1Db25maWdJc05vdFR5cGVDb21wb25lbnQsXHJcbiAgICBJbnZhbGlkTnVtYmVyUGFydEluU2l6ZVN0cmluZyxcclxuICAgIFVua25vd25Vbml0SW5TaXplU3RyaW5nLFxyXG4gICAgVW5zdXBwb3J0ZWRVbml0SW5TaXplU3RyaW5nLFxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEkxOG5TdHJpbmdzIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGxldCBpbml0aWFsaXNlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGludGVyZmFjZSBJbmZvIHtcclxuICAgICAgICByZWFkb25seSBpZDogSTE4blN0cmluZ0lkO1xyXG4gICAgICAgIHJlYWRvbmx5IGRlZmF1bHQ6IHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICB0eXBlIEluZm9zT2JqZWN0ID0geyBbaWQgaW4ga2V5b2YgdHlwZW9mIEkxOG5TdHJpbmdJZF06IEluZm8gfTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdCBpbmZvc09iamVjdDogSW5mb3NPYmplY3QgPSB7XHJcbiAgICAgICAgUG9wb3V0Q2Fubm90QmVDcmVhdGVkV2l0aEdyb3VuZEl0ZW1Db25maWc6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5Qb3BvdXRDYW5ub3RCZUNyZWF0ZWRXaXRoR3JvdW5kSXRlbUNvbmZpZyxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ1BvcG91dCBjYW5ub3QgYmUgY3JlYXRlZCB3aXRoIGdyb3VuZCBJdGVtQ29uZmlnJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgUGxlYXNlUmVnaXN0ZXJBQ29uc3RydWN0b3JGdW5jdGlvbjoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLlBsZWFzZVJlZ2lzdGVyQUNvbnN0cnVjdG9yRnVuY3Rpb24sXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdQbGVhc2UgcmVnaXN0ZXIgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbidcclxuICAgICAgICB9LFxyXG4gICAgICAgIENvbXBvbmVudFR5cGVOb3RSZWdpc3RlcmVkQW5kQmluZENvbXBvbmVudEV2ZW50SGFuZGxlck5vdEFzc2lnbmVkOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuQ29tcG9uZW50VHlwZU5vdFJlZ2lzdGVyZWRBbmRCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyTm90QXNzaWduZWQsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdDb21wb25lbnQgdHlwZSBub3QgcmVnaXN0ZXJlZCBhbmQgQmluZENvbXBvbmVudEV2ZW50IGhhbmRsZXIgbm90IGFzc2lnbmVkJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIENvbXBvbmVudElzQWxyZWFkeVJlZ2lzdGVyZWQ6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5Db21wb25lbnRJc0FscmVhZHlSZWdpc3RlcmVkLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnQ29tcG9uZW50IGlzIGFscmVhZHkgcmVnaXN0ZXJlZCcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBDb21wb25lbnRJc05vdFZpcnR1YWJsZToge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLkNvbXBvbmVudElzTm90VmlydHVhYmxlLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnQ29tcG9uZW50IGlzIG5vdCB2aXJ0dWFibGUuIFJlcXVpcmVzIHJvb3RIdG1sRWxlbWVudCBmaWVsZC9nZXR0ZXInLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgVmlydHVhbENvbXBvbmVudERvZXNOb3RIYXZlUm9vdEh0bWxFbGVtZW50OiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuVmlydHVhbENvbXBvbmVudERvZXNOb3RIYXZlUm9vdEh0bWxFbGVtZW50LFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnVmlydHVhbCBjb21wb25lbnQgZG9lcyBub3QgaGF2ZSBnZXR0ZXIgXCJyb290SHRtbEVsZW1lbnRcIicsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBJdGVtQ29uZmlnSXNOb3RUeXBlQ29tcG9uZW50OiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuSXRlbUNvbmZpZ0lzTm90VHlwZUNvbXBvbmVudCxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ0l0ZW1Db25maWcgaXMgbm90IG9mIHR5cGUgY29tcG9uZW50JyxcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBJbnZhbGlkTnVtYmVyUGFydEluU2l6ZVN0cmluZzoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLkludmFsaWROdW1iZXJQYXJ0SW5TaXplU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnSW52YWxpZCBudW1iZXIgcGFydCBpbiBzaXplIHN0cmluZycsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBVbmtub3duVW5pdEluU2l6ZVN0cmluZzoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLlVua25vd25Vbml0SW5TaXplU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnVW5rbm93biB1bml0IGluIHNpemUgc3RyaW5nJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIFVuc3VwcG9ydGVkVW5pdEluU2l6ZVN0cmluZzoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLlVuc3VwcG9ydGVkVW5pdEluU2l6ZVN0cmluZyxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ1Vuc3VwcG9ydGVkIHVuaXQgaW4gc2l6ZSBzdHJpbmcnLFxyXG4gICAgICAgIH0sXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNvbnN0IGlkQ291bnQgPSBPYmplY3Qua2V5cyhpbmZvc09iamVjdCkubGVuZ3RoO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3QgaW5mb3MgPSBPYmplY3QudmFsdWVzKGluZm9zT2JqZWN0KTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY2hlY2tJbml0aWFsaXNlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghaW5pdGlhbGlzZWQpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZENvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBpbmZvc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmZvLmlkICE9PSBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdJTlNJMDAxMTAnLCBgJHtpfTogJHtpbmZvLmlkfWApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpMThuU3RyaW5nc1tpXSA9IGluZm8uZGVmYXVsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpbml0aWFsaXNlZCA9IHRydWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjb25zdCBpMThuU3RyaW5ncyA9IG5ldyBBcnJheTxzdHJpbmc+KEkxOG5TdHJpbmdzLmlkQ291bnQpO1xyXG4iLCIvKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFN0eWxlQ29uc3RhbnRzIHtcclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0Q29tcG9uZW50QmFzZVpJbmRleCA9ICdhdXRvJztcclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0Q29tcG9uZW50RHJhZ1pJbmRleCA9ICczMic7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdENvbXBvbmVudFN0YWNrTWF4aW1pc2VkWkluZGV4ID0gJzQxJztcclxufVxyXG4iLCJpbXBvcnQgeyBVbnJlYWNoYWJsZUNhc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IFN0eWxlQ29uc3RhbnRzIH0gZnJvbSAnLi9zdHlsZS1jb25zdGFudHMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgdHlwZSBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lID0gJ3dpZHRoJyB8ICdoZWlnaHQnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUge1xyXG4gICAgZXhwb3J0IGNvbnN0IHdpZHRoID0gJ3dpZHRoJztcclxuICAgIGV4cG9ydCBjb25zdCBoZWlnaHQgPSAnaGVpZ2h0JztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFdpZHRoQW5kSGVpZ2h0IHtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIExlZnRBbmRUb3Age1xyXG4gICAgbGVmdDogbnVtYmVyO1xyXG4gICAgdG9wOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCB0eXBlIFNpZGUgPSAndG9wJyB8ICdsZWZ0JyB8ICdyaWdodCcgfCAnYm90dG9tJztcclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBTaWRlIHtcclxuICAgIGV4cG9ydCBjb25zdCB0b3AgPSAndG9wJztcclxuICAgIGV4cG9ydCBjb25zdCBsZWZ0ID0gJ2xlZnQnO1xyXG4gICAgZXhwb3J0IGNvbnN0IHJpZ2h0ID0gJ3JpZ2h0JztcclxuICAgIGV4cG9ydCBjb25zdCBib3R0b20gPSAnYm90dG9tJztcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IHR5cGUgTG9naWNhbFpJbmRleCA9ICdiYXNlJyB8ICdkcmFnJyB8ICdzdGFja01heGltaXNlZCc7XHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgTG9naWNhbFpJbmRleCB7XHJcbiAgICBleHBvcnQgY29uc3QgYmFzZSA9ICdiYXNlJztcclxuICAgIGV4cG9ydCBjb25zdCBkcmFnID0gJ2RyYWcnO1xyXG4gICAgZXhwb3J0IGNvbnN0IHN0YWNrTWF4aW1pc2VkID0gJ3N0YWNrTWF4aW1pc2VkJztcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNvbnN0IExvZ2ljYWxaSW5kZXhUb0RlZmF1bHRNYXAgPSB7XHJcbiAgICBiYXNlOiBTdHlsZUNvbnN0YW50cy5kZWZhdWx0Q29tcG9uZW50QmFzZVpJbmRleCxcclxuICAgIGRyYWc6IFN0eWxlQ29uc3RhbnRzLmRlZmF1bHRDb21wb25lbnREcmFnWkluZGV4LFxyXG4gICAgc3RhY2tNYXhpbWlzZWQ6IFN0eWxlQ29uc3RhbnRzLmRlZmF1bHRDb21wb25lbnRTdGFja01heGltaXNlZFpJbmRleCxcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Qge1xyXG4gICAgbGVmdDogbnVtYmVyLFxyXG4gICAgdG9wOiBudW1iZXIsXHJcbiAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgaGVpZ2h0OiBudW1iZXIsXHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBBcmVhTGlua2VkUmVjdCB7XHJcbiAgICB4MTogbnVtYmVyLCAvLyBsZWZ0XHJcbiAgICB4MjogbnVtYmVyLCAvLyBuZXh0TGVmdFxyXG4gICAgeTE6IG51bWJlciwgLy8gdG9wXHJcbiAgICB5MjogbnVtYmVyLCAvLyBuZXh0VG9wXHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXHJcbmV4cG9ydCB0eXBlIEpzb25WYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgSnNvbiB8IG9iamVjdCB8IEpzb25WYWx1ZUFycmF5O1xyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEpzb24ge1xyXG4gICAgW25hbWU6IHN0cmluZ106IEpzb25WYWx1ZTtcclxufVxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgdHlwZSBKc29uVmFsdWVBcnJheSA9IEFycmF5PEpzb25WYWx1ZT5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBKc29uVmFsdWUge1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzSnNvbih2YWx1ZTogSnNvblZhbHVlKTogdmFsdWUgaXMgSnNvbiB7XHJcbiAgICAgICAgcmV0dXJuIGlzSnNvbk9iamVjdCh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0pzb25PYmplY3QodmFsdWU6IEpzb25WYWx1ZSk6IHZhbHVlIGlzIEpzb24gfCBvYmplY3Qge1xyXG4gICAgICAgIHJldHVybiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JztcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IHR5cGUgSXRlbVR5cGUgPSAnZ3JvdW5kJyB8ICdyb3cnIHwgJ2NvbHVtbicgfCAnc3RhY2snIHwgJ2NvbXBvbmVudCc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEl0ZW1UeXBlIHtcclxuICAgIGV4cG9ydCBjb25zdCBncm91bmQgPSAnZ3JvdW5kJztcclxuICAgIGV4cG9ydCBjb25zdCByb3cgPSAncm93JztcclxuICAgIGV4cG9ydCBjb25zdCBjb2x1bW4gPSAnY29sdW1uJztcclxuICAgIGV4cG9ydCBjb25zdCBzdGFjayA9ICdzdGFjayc7XHJcbiAgICBleHBvcnQgY29uc3QgY29tcG9uZW50ID0gJ2NvbXBvbmVudCc7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCB0eXBlIFJlc3BvbnNpdmVNb2RlID0gJ25vbmUnIHwgJ2Fsd2F5cycgfCAnb25sb2FkJztcclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNwb25zaXZlTW9kZSB7XHJcbiAgICBleHBvcnQgY29uc3Qgbm9uZSA9ICdub25lJztcclxuICAgIGV4cG9ydCBjb25zdCBhbHdheXMgPSAnYWx3YXlzJztcclxuICAgIGV4cG9ydCBjb25zdCBvbmxvYWQgPSAnb25sb2FkJztcclxufVxyXG5cclxuLyoqXHJcbiAqIExlbmd0aCB1bml0cyB3aGljaCBjYW4gc3BlY2lmeSB0aGUgc2l6ZSBvZiBhIENvbXBvbmVudCBJdGVtXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCB0eXBlIFNpemVVbml0ID0gJ3B4JyB8ICclJyB8ICdmcicgfCAnZW0nO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGVudW0gU2l6ZVVuaXRFbnVtIHtcclxuICAgIFBpeGVsID0gJ3B4JyxcclxuICAgIFBlcmNlbnQgPSAnJScsXHJcbiAgICBGcmFjdGlvbmFsID0gJ2ZyJyxcclxuICAgIEVtID0gJ2VtJyxcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBTaXplVW5pdEVudW0ge1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHRyeVBhcnNlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLlBpeGVsOiByZXR1cm4gU2l6ZVVuaXRFbnVtLlBpeGVsO1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5QZXJjZW50OiByZXR1cm4gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLkZyYWN0aW9uYWw6IHJldHVybiBTaXplVW5pdEVudW0uRnJhY3Rpb25hbDtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uRW06IHJldHVybiBTaXplVW5pdEVudW0uRW07XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmb3JtYXQodmFsdWU6IFNpemVVbml0RW51bSkge1xyXG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uUGl4ZWw6IHJldHVybiBTaXplVW5pdEVudW0uUGl4ZWw7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLlBlcmNlbnQ6IHJldHVybiBTaXplVW5pdEVudW0uUGVyY2VudDtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uRnJhY3Rpb25hbDogcmV0dXJuIFNpemVVbml0RW51bS5GcmFjdGlvbmFsO1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5FbTogcmV0dXJuIFNpemVVbml0RW51bS5FbTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignU1VFRjQ0OTk4JywgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBMZWZ0QW5kVG9wLCBXaWR0aEFuZEhlaWdodCB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyVG9QaXhlbHModmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoMTApICsgJ3B4JztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGl4ZWxzVG9OdW1iZXIodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBudW1iZXJTdHIgPSB2YWx1ZS5yZXBsYWNlKFwicHhcIiwgXCJcIik7XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdChudW1iZXJTdHIpO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRTdHJpbmdBdEZpcnN0Tm9uTnVtZXJpY0NoYXJSZXN1bHQge1xyXG4gICAgbnVtZXJpY1BhcnQ6IHN0cmluZztcclxuICAgIGZpcnN0Tm9uTnVtZXJpY0NoYXJQYXJ0OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3RyaW5nQXRGaXJzdE5vbk51bWVyaWNDaGFyKHZhbHVlOiBzdHJpbmcpOiBTcGxpdFN0cmluZ0F0Rmlyc3ROb25OdW1lcmljQ2hhclJlc3VsdCB7XHJcbiAgICB2YWx1ZSA9IHZhbHVlLnRyaW1TdGFydCgpO1xyXG5cclxuICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcclxuICAgIGlmIChsZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4geyBudW1lcmljUGFydDogJycsIGZpcnN0Tm9uTnVtZXJpY0NoYXJQYXJ0OiAnJyB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBmaXJzdE5vbkRpZ2l0UGFydEluZGV4ID0gbGVuZ3RoO1xyXG4gICAgICAgIGxldCBnb3REZWNpbWFsUG9pbnQgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSB2YWx1ZVtpXTtcclxuICAgICAgICAgICAgaWYgKCFpc0RpZ2l0KGNoYXIpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hhciAhPT0gJy4nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3ROb25EaWdpdFBhcnRJbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChnb3REZWNpbWFsUG9pbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3ROb25EaWdpdFBhcnRJbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdERlY2ltYWxQb2ludCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRpZ2l0c1BhcnQgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgZmlyc3ROb25EaWdpdFBhcnRJbmRleCk7XHJcbiAgICAgICAgY29uc3QgZmlyc3ROb25EaWdpdFBhcnQgPSB2YWx1ZS5zdWJzdHJpbmcoZmlyc3ROb25EaWdpdFBhcnRJbmRleCkudHJpbSgpO1xyXG5cclxuICAgICAgICByZXR1cm4geyBudW1lcmljUGFydDogZGlnaXRzUGFydCwgZmlyc3ROb25OdW1lcmljQ2hhclBhcnQ6IGZpcnN0Tm9uRGlnaXRQYXJ0IH07XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlnaXQoY2hhcjogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gY2hhciA+PSAnMCcgJiYgY2hhciA8PSAnOSc7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRXaWR0aDtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0RWxlbWVudFdpZHRoKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCB3aWR0aEFzUGl4ZWxzID0gbnVtYmVyVG9QaXhlbHMod2lkdGgpO1xyXG4gICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoQXNQaXhlbHM7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRIZWlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRFbGVtZW50SGVpZ2h0KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3QgaGVpZ2h0QXNQaXhlbHMgPSBudW1iZXJUb1BpeGVscyhoZWlnaHQpO1xyXG4gICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoZWlnaHRBc1BpeGVscztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogV2lkdGhBbmRIZWlnaHQge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB3aWR0aDogZWxlbWVudC5vZmZzZXRXaWR0aCxcclxuICAgICAgICBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0LFxyXG4gICAgfTtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2luZG93VG9wTGVmdEJvcmRlcih3aW5kb3c6IFdpbmRvdyB8IHR5cGVvZiBnbG9iYWxUaGlzKTogV2lkdGhBbmRIZWlnaHQge1xyXG4gICAgbGV0IGlubmVyU2NyZWVuWDogbnVtYmVyIHwgdW5kZWZpbmVkID0gKDxhbnk+d2luZG93KS5tb3pJbm5lclNjcmVlblg7XHJcbiAgICBsZXQgaW5uZXJTY3JlZW5ZOiBudW1iZXIgfCB1bmRlZmluZWQgPSAoPGFueT53aW5kb3cpLm1veklubmVyU2NyZWVuWTtcclxuICAgIGxldCBib3JkZXJYOiBudW1iZXIsIGJvcmRlclk6IG51bWJlcjtcclxuXHJcbiAgICBpZiAoaW5uZXJTY3JlZW5YID09PSB1bmRlZmluZWQgfHwgaW5uZXJTY3JlZW5ZID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBib3JkZXJYID0gKHdpbmRvdy5vdXRlcldpZHRoIC0gd2luZG93LmlubmVyV2lkdGgpIC8gMjsgICAgICAgIC8vIEFzc3VtZSBsZWZ0IC8gcmlnaHQgYm9yZGVyIGlzIHRoZSBzYW1lXHJcbiAgICAgICAgYm9yZGVyWSA9IHdpbmRvdy5vdXRlckhlaWdodCAtIHdpbmRvdy5pbm5lckhlaWdodCAtIGJvcmRlclg7ICAvLyBBc3N1bWUgYm90dG9tIGJvcmRlciBpcyB0aGUgc2FtZSBhcyBsZWZ0IC8gcmlnaHRcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYm9yZGVyWCA9IGlubmVyU2NyZWVuWCAtIHdpbmRvdy5zY3JlZW5YO1xyXG4gICAgICAgIGJvcmRlclkgPSBpbm5lclNjcmVlblkgLSB3aW5kb3cuc2NyZWVuWTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB3aWR0aDogYm9yZGVyWCwgaGVpZ2h0OiBib3JkZXJZIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbih3aW5kb3c6IFdpbmRvdyB8IHR5cGVvZiBnbG9iYWxUaGlzKTogTGVmdEFuZFRvcCB7XHJcbiAgICBsZXQgaW5uZXJTY3JlZW5YOiBudW1iZXIgfCB1bmRlZmluZWQgPSAoPGFueT53aW5kb3cpLm1veklubmVyU2NyZWVuWDtcclxuICAgIGxldCBpbm5lclNjcmVlblk6IG51bWJlciB8IHVuZGVmaW5lZCA9ICg8YW55PndpbmRvdykubW96SW5uZXJTY3JlZW5ZO1xyXG5cclxuICAgIGlmIChpbm5lclNjcmVlblggPT09IHVuZGVmaW5lZCB8fCBpbm5lclNjcmVlblkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IGJvcmRlciA9IGdldFdpbmRvd1RvcExlZnRCb3JkZXIod2luZG93KTtcclxuICAgICAgICBpbm5lclNjcmVlblggPSB3aW5kb3cuc2NyZWVuWCArIGJvcmRlci53aWR0aDtcclxuICAgICAgICBpbm5lclNjcmVlblkgPSB3aW5kb3cuc2NyZWVuWSArIGJvcmRlci5oZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgbGVmdDogaW5uZXJTY3JlZW5YLCB0b3A6IGlubmVyU2NyZWVuWSB9O1xyXG59XHJcblxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodmlzaWJsZSkge1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUVsZW1lbnRQb3NpdGlvbkFic29sdXRlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBhYnNvbHV0ZVBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgIGlmIChlbGVtZW50LnN0eWxlLnBvc2l0aW9uICE9PSBhYnNvbHV0ZVBvc2l0aW9uKSB7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IGFic29sdXRlUG9zaXRpb247XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXBsYWNlbWVudCBmb3IgSlF1ZXJ5ICQuZXh0ZW5kKHRhcmdldCwgb2JqKVxyXG4gKiBAaW50ZXJuYWxcclxuKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gb2JqW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhcmdldDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcGxhY2VtZW50IGZvciBKUXVlcnkgJC5leHRlbmQodHJ1ZSwgdGFyZ2V0LCBvYmopXHJcbiAqIEBpbnRlcm5hbFxyXG4qL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVlcEV4dGVuZCh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xyXG4gICAgaWYgKG9iaiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nVGFyZ2V0ID0gdGFyZ2V0W2tleV07XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IGRlZXBFeHRlbmRWYWx1ZShleGlzdGluZ1RhcmdldCwgdmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFeHRlbmRWYWx1ZShleGlzdGluZ1RhcmdldDogdW5rbm93biwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRBcnJheSA9IG5ldyBBcnJheTx1bmtub3duPihsZW5ndGgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdmFsdWVbaV07XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRBcnJheVtpXSA9IGRlZXBFeHRlbmRWYWx1ZSh7fSwgZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldEFycmF5O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZU9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFyZ2V0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVlcEV4dGVuZCh7fSwgdmFsdWVPYmopOyAvLyBvdmVyd3JpdGVcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleGlzdGluZ1RhcmdldCAhPT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVlcEV4dGVuZCh7fSwgdmFsdWVPYmopOyAvLyBvdmVyd3JpdGVcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZ1RhcmdldCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWVwRXh0ZW5kKHt9LCB2YWx1ZU9iaik7IC8vIG92ZXJ3cml0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFyZ2V0ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZXBFeHRlbmQoe30sIHZhbHVlT2JqKTsgLy8gb3ZlcndyaXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nVGFyZ2V0T2JqID0gZXhpc3RpbmdUYXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZXBFeHRlbmQoZXhpc3RpbmdUYXJnZXRPYmosIHZhbHVlT2JqKTsgLy8gbWVyZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRnJvbUFycmF5PFQ+KGl0ZW06IFQsIGFycmF5OiBUW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IGluZGV4ID0gYXJyYXkuaW5kZXhPZihpdGVtKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IHJlbW92ZSBpdGVtIGZyb20gYXJyYXkuIEl0ZW0gaXMgbm90IGluIHRoZSBhcnJheScpO1xyXG4gICAgfVxyXG5cclxuICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXF1ZUlkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDAwMDAwMDAwKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAucmVwbGFjZSgnLicsICcnKTtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKGU6IHVua25vd24pOiBzdHJpbmcge1xyXG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgIHJldHVybiBlLm1lc3NhZ2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICdVbmtub3duIEVycm9yJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgTGF5b3V0Q29uZmlnIH0gZnJvbSAnLi9jb25maWcvY29uZmlnJztcclxuaW1wb3J0IHsgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLCBSZXNvbHZlZExheW91dENvbmZpZywgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb250YWluZXIgfSBmcm9tICcuL2NvbnRhaW5lci9jb21wb25lbnQtY29udGFpbmVyJztcclxuaW1wb3J0IHsgQmluZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvZXh0ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgSTE4blN0cmluZ0lkLCBpMThuU3RyaW5ncyB9IGZyb20gJy4vdXRpbHMvaTE4bi1zdHJpbmdzJztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBWaXJ0dWFsTGF5b3V0IGV4dGVuZHMgTGF5b3V0TWFuYWdlciB7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmJpbmRDb21wb25lbnRFdmVudH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLnVuYmluZENvbXBvbmVudEV2ZW50fSB3aXRoIHZpcnR1YWwgY29tcG9uZW50c1xyXG4gICAgICovXHJcbiAgICBnZXRDb21wb25lbnRFdmVudDogVmlydHVhbExheW91dC5HZXRDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmJpbmRDb21wb25lbnRFdmVudH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLnVuYmluZENvbXBvbmVudEV2ZW50fSB3aXRoIHZpcnR1YWwgY29tcG9uZW50c1xyXG4gICAgICovXHJcbiAgICByZWxlYXNlQ29tcG9uZW50RXZlbnQ6IFZpcnR1YWxMYXlvdXQuUmVsZWFzZUNvbXBvbmVudEV2ZW50SGFuZGxlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBiaW5kQ29tcG9uZW50RXZlbnQ6IFZpcnR1YWxMYXlvdXQuQmluZENvbXBvbmVudEV2ZW50SGFuZGxlciB8IHVuZGVmaW5lZDtcclxuICAgIHVuYmluZENvbXBvbmVudEV2ZW50OiBWaXJ0dWFsTGF5b3V0LlVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHVzZSB3aGlsZSBjb25zdHJ1Y3RvciBpcyBub3QgZGV0ZXJtaW5hdGUgKi9cclxuICAgIHByaXZhdGUgX2JpbmRDb21wb25lbnRFdmVudEhhbmxkZXJQYXNzZWRJbkNvbnN0cnVjdG9yID0gZmFsc2U7IC8vIHJlbW92ZSB3aGVuIGNvbnN0cnVjdG9yIGlzIGRldGVybWluYXRlXHJcbiAgICAvKiogQGludGVybmFsICBAZGVwcmVjYXRlZCB1c2Ugd2hpbGUgY29uc3RydWN0b3IgaXMgbm90IGRldGVybWluYXRlICovXHJcbiAgICBwcml2YXRlIF9jcmVhdGlvblRpbWVvdXRQYXNzZWQgPSBmYWxzZTsgLy8gcmVtb3ZlIHdoZW4gY29uc3RydWN0b3IgaXMgZGV0ZXJtaW5hdGVcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBjb250YWluZXIgLSBBIERvbSBIVE1MIGVsZW1lbnQuIERlZmF1bHRzIHRvIGJvZHlcclxuICAgICAqIEBwYXJhbSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIC0gRXZlbnQgaGFuZGxlciB0byBiaW5kIGNvbXBvbmVudHNcclxuICAgICAqIEBwYXJhbSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIC0gRXZlbnQgaGFuZGxlciB0byB1bmJpbmQgY29tcG9uZW50c1xyXG4gICAgICogSWYgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciBpcyBkZWZpbmVkLCB0aGVuIGNvbnN0cnVjdG9yIHdpbGwgYmUgZGV0ZXJtaW5hdGUuIEl0IHdpbGwgYWx3YXlzIGNhbGwgdGhlIGluaXQoKVxyXG4gICAgICogZnVuY3Rpb24gYW5kIHRoZSBpbml0KCkgZnVuY3Rpb24gd2lsbCBhbHdheXMgY29tcGxldGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciB3aWxsIGJlIGNhbGxlZFxyXG4gICAgICogaWYgY29uc3RydWN0b3IgaXMgZm9yIGEgcG9wb3V0IHdpbmRvdy4gTWFrZSBzdXJlIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgaXMgcmVhZHkgZm9yIGV2ZW50cy5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgY29udGFpbmVyPzogSFRNTEVsZW1lbnQsXHJcbiAgICAgICAgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IFZpcnR1YWxMYXlvdXQuQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcixcclxuICAgICAgICB1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI/OiBWaXJ0dWFsTGF5b3V0LlVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcixcclxuICAgICk7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgc3BlY2lmeSBsYXlvdXRDb25maWcgaW4ge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5sb2FkTGF5b3V0fSAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMYXlvdXRDb25maWcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI6IExheW91dENvbmZpZyB8IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcjogSFRNTEVsZW1lbnQgfCBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgdW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyOiBWaXJ0dWFsTGF5b3V0LlVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciB8IHVuZGVmaW5lZCxcclxuICAgICAgICBza2lwSW5pdDogdHJ1ZSxcclxuICAgICk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWdPck9wdGlvbmFsQ29udGFpbmVyOiBMYXlvdXRDb25maWcgfCBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI/OiBIVE1MRWxlbWVudCB8IFZpcnR1YWxMYXlvdXQuQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcixcclxuICAgICAgICB1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI/OiBWaXJ0dWFsTGF5b3V0LlVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcixcclxuICAgICAgICBza2lwSW5pdD86IHRydWUsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihWaXJ0dWFsTGF5b3V0LmNyZWF0ZUxheW91dE1hbmFnZXJDb25zdHJ1Y3RvclBhcmFtZXRlcnMoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lciwgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyKSk7XHJcblxyXG4gICAgICAgIGlmIChjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kQ29tcG9uZW50RXZlbnQgPSBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3RvciA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bmJpbmRDb21wb25lbnRFdmVudCA9IHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1N1YldpbmRvdykge1xyXG4gICAgICAgICAgICAgICAgLy8gZG9jdW1lbnQuYm9keS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgICAgICAgICAgICAvLyBTZXQgdXAgbGF5b3V0Q29uZmlnIHNpbmNlIGNvbnN0cnVjdG9yIGlzIG5vdCBkZXRlcm1pbmF0ZSBhbmQgbWF5IGV4aXQgZWFybHkuIE90aGVyIGZ1bmN0aW9ucyBtYXkgbmVlZFxyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5sYXlvdXRDb25maWcuIHRoaXMubGF5b3V0Q29uZmlnIGlzIGFnYWluIGNhbGN1bGF0ZWQgaW4gdGhlIHNhbWUgd2F5IHdoZW4gaW5pdCgpIGNvbXBsZXRlcy5cclxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIHdoZW4gY29uc3RydWN0b3IgaXMgZGV0ZXJtaW5hdGUuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignVkxDOTg4MjMnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRMYXlvdXRDb25maWcgPSBMYXlvdXRDb25maWcucmVzb2x2ZSh0aGlzLl9jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgcm9vdCBmcm9tIGxheW91dENvbmZpZ1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXNvbHZlZExheW91dENvbmZpZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNraXBJbml0ICE9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5kZXByZWNhdGVkQ29uc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5iaW5kQ29tcG9uZW50RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy51bmJpbmRDb21wb25lbnRFdmVudCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgdGhlIGFjdHVhbCBsYXlvdXQuIE11c3QgYmUgY2FsbGVkIGFmdGVyIGFsbCBpbml0aWFsIGNvbXBvbmVudHNcclxuICAgICAqIGFyZSByZWdpc3RlcmVkLiBSZWN1cnNlcyB0aHJvdWdoIHRoZSBjb25maWd1cmF0aW9uIGFuZCBzZXRzIHVwXHJcbiAgICAgKiB0aGUgaXRlbSB0cmVlLlxyXG4gICAgICpcclxuICAgICAqIElmIGNhbGxlZCBiZWZvcmUgdGhlIGRvY3VtZW50IGlzIHJlYWR5IGl0IGFkZHMgaXRzZWxmIGFzIGEgbGlzdGVuZXJcclxuICAgICAqIHRvIHRoZSBkb2N1bWVudC5yZWFkeSBldmVudFxyXG4gICAgICogQGRlcHJlY2F0ZWQgTGF5b3V0Q29uZmlnIHNob3VsZCBub3QgYmUgbG9hZGVkIGluIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcyl9IGNvbnN0cnVjdG9yLCBidXQgcmF0aGVyIGluIGFcclxuICAgICAqIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykubG9hZExheW91dH0gY2FsbC4gIElmIExheW91dENvbmZpZyBpcyBub3Qgc3BlY2lmaWVkIGluIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcyl9IGNvbnN0cnVjdG9yLFxyXG4gICAgICogdGhlbiBpbml0KCkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNhbGxlZCBpbnRlcm5hbGx5IGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBleHRlcm5hbGx5LlxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSBpbml0KCk6IHZvaWQge1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGUgZG9jdW1lbnQgaXNuJ3QgcmVhZHkgeWV0LCB3YWl0IGZvciBpdC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoIXRoaXMuX2JpbmRDb21wb25lbnRFdmVudEhhbmxkZXJQYXNzZWRJbkNvbnN0cnVjdG9yICYmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycgfHwgZG9jdW1lbnQuYm9keSA9PT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHRoaXMuaW5pdCgpLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRoaXMgaXMgYSBzdWJ3aW5kb3csIHdhaXQgYSBmZXcgbWlsbGlzZWNvbmRzIGZvciB0aGUgb3JpZ2luYWxcclxuICAgICAgICAgKiBwYWdlJ3MganMgY2FsbHMgdG8gYmUgZXhlY3V0ZWQsIHRoZW4gcmVwbGFjZSB0aGUgYm9kaWVzIGNvbnRlbnRcclxuICAgICAgICAgKiB3aXRoIEdvbGRlbkxheW91dFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICghdGhpcy5fYmluZENvbXBvbmVudEV2ZW50SGFubGRlclBhc3NlZEluQ29uc3RydWN0b3IgJiYgdGhpcy5pc1N1YldpbmRvdyA9PT0gdHJ1ZSAmJiAhdGhpcy5fY3JlYXRpb25UaW1lb3V0UGFzc2VkKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbml0KCksIDcpO1xyXG4gICAgICAgICAgICB0aGlzLl9jcmVhdGlvblRpbWVvdXRQYXNzZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1N1YldpbmRvdyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2JpbmRDb21wb25lbnRFdmVudEhhbmxkZXJQYXNzZWRJbkNvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFySHRtbEFuZEFkanVzdFN0eWxlc0ZvclN1YldpbmRvdygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBFeHBvc2UgdGhpcyBpbnN0YW5jZSBvbiB0aGUgd2luZG93IG9iamVjdCB0byBhbGxvdyB0aGUgb3BlbmluZyB3aW5kb3cgdG8gaW50ZXJhY3Qgd2l0aCBpdFxyXG4gICAgICAgICAgICB3aW5kb3cuX19nbEluc3RhbmNlID0gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLmluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyBleGlzdGluZyBIVE1MIGFuZCBhZGp1c3RzIHN0eWxlIHRvIG1ha2Ugd2luZG93IHN1aXRhYmxlIHRvIGJlIGEgcG9wb3V0IHN1YiB3aW5kb3dcclxuICAgICAqIEN1cmVudGx5IGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIHdoZW4gd2luZG93IGlzIGEgc3ViV2luZG93IGFuZCBiaW5kQ29tcG9uZW50RXZlbnQgaXMgbm90IHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3JcclxuICAgICAqIElmIGJpbmRDb21wb25lbnRFdmVudCBpcyBub3QgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvciwgdGhlIGFwcGxpY2F0aW9uIG11c3QgZWl0aGVyIGNhbGwgdGhpcyBmdW5jdGlvbiBleHBsaWNpdGx5IG9yXHJcbiAgICAgKiAocHJlZmVyYWJseSkgbWFrZSB0aGUgd2luZG93IHN1aXRhYmxlIGFzIGEgc3Vid2luZG93LlxyXG4gICAgICogSW4gdGhlIGZ1dHVyZSwgaXQgaXMgcGxhbm5lZCB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgTk9UIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGluIGFueSBjaXJjdW1zdGFuY2VzLiAgQXBwbGljYXRpb25zIHdpbGxcclxuICAgICAqIG5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSB3aW5kb3cgaXMgYSBHb2xkZW4gTGF5b3V0IHBvcG91dCB3aW5kb3cgYW5kIGVpdGhlciBjYWxsIHRoaXMgZnVuY3Rpb24gZXhwbGljaXRseSBvclxyXG4gICAgICogaGlkZSBIVE1MIG5vdCByZWxldmFudCB0byB0aGUgcG9wb3V0LlxyXG4gICAgICogU2VlIGFwaXRlc3QgZm9yIGFuIGV4YW1wbGUgb2YgaG93IEhUTUwgaXMgaGlkZGVuIHdoZW4gcG9wb3V0IHdpbmRvd3MgYXJlIGRpc3BsYXllZFxyXG4gICAgICovXHJcbiAgICBjbGVhckh0bWxBbmRBZGp1c3RTdHlsZXNGb3JTdWJXaW5kb3coKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaGVhZEVsZW1lbnQgPSBkb2N1bWVudC5oZWFkO1xyXG5cclxuICAgICAgICBjb25zdCBhcHBlbmROb2RlTGlzdHMgPSBuZXcgQXJyYXk8Tm9kZUxpc3RPZjxFbGVtZW50Pj4oNCk7XHJcbiAgICAgICAgYXBwZW5kTm9kZUxpc3RzWzBdID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keSBsaW5rJyk7XHJcbiAgICAgICAgYXBwZW5kTm9kZUxpc3RzWzFdID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keSBzdHlsZScpO1xyXG4gICAgICAgIGFwcGVuZE5vZGVMaXN0c1syXSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RlbXBsYXRlJyk7XHJcbiAgICAgICAgYXBwZW5kTm9kZUxpc3RzWzNdID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmdsX2tlZXAnKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgbGlzdElkeCA9IDA7IGxpc3RJZHggPCBhcHBlbmROb2RlTGlzdHMubGVuZ3RoOyBsaXN0SWR4KyspIHtcclxuICAgICAgICAgICAgY29uc3QgYXBwZW5kTm9kZUxpc3QgPSBhcHBlbmROb2RlTGlzdHNbbGlzdElkeF07XHJcbiAgICAgICAgICAgIGZvciAobGV0IG5vZGVJZHggPSAwOyBub2RlSWR4IDwgYXBwZW5kTm9kZUxpc3QubGVuZ3RoOyBub2RlSWR4KyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBhcHBlbmROb2RlTGlzdFtub2RlSWR4XTtcclxuICAgICAgICAgICAgICAgIGhlYWRFbGVtZW50LmFwcGVuZENoaWxkKG5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBib2R5RWxlbWVudCA9IGRvY3VtZW50LmJvZHk7XHJcbiAgICAgICAgYm9keUVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgICAgYm9keUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcclxuICAgICAgICB0aGlzLmNoZWNrQWRkRGVmYXVsdFBvcGluQnV0dG9uKCk7XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgKiBUaGlzIHNlZW1zIGEgYml0IHBvaW50bGVzcywgYnV0IGFjdHVhbGx5IGNhdXNlcyBhIHJlZmxvdy9yZS1ldmFsdWF0aW9uIGdldHRpbmcgYXJvdW5kXHJcbiAgICAgICAgKiBzbGlja2dyaWQncyBcIkNhbm5vdCBmaW5kIHN0eWxlc2hlZXQuXCIgYnVnIGluIGNocm9tZVxyXG4gICAgICAgICovXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgICAgIGNvbnN0IHggPSBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogV2lsbCBhZGQgYnV0dG9uIGlmIG5vdCBwb3Bpbk9uQ2xvc2Ugc3BlY2lmaWVkIGluIHNldHRpbmdzXHJcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFkZGVkIG90aGVyd2lzZSBmYWxzZVxyXG4gICAgICovXHJcbiAgICBjaGVja0FkZERlZmF1bHRQb3BpbkJ1dHRvbigpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5sYXlvdXRDb25maWcuc2V0dGluZ3MucG9wSW5PbkNsb3NlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBwb3BJbkJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgICAgcG9wSW5CdXR0b25FbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Qb3Bpbik7XHJcbiAgICAgICAgICAgIHBvcEluQnV0dG9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5sYXlvdXRDb25maWcuaGVhZGVyLnBvcGluKTtcclxuICAgICAgICAgICAgY29uc3QgaWNvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgICAgaWNvbkVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkljb24pO1xyXG4gICAgICAgICAgICBjb25zdCBiZ0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgICAgYmdFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5CZyk7XHJcbiAgICAgICAgICAgIHBvcEluQnV0dG9uRWxlbWVudC5hcHBlbmRDaGlsZChpY29uRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHBvcEluQnV0dG9uRWxlbWVudC5hcHBlbmRDaGlsZChiZ0VsZW1lbnQpO1xyXG4gICAgICAgICAgICBwb3BJbkJ1dHRvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmVtaXQoJ3BvcEluJykpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBvcEluQnV0dG9uRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBiaW5kQ29tcG9uZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBpdGVtQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiBDb21wb25lbnRDb250YWluZXIuQmluZGFibGVDb21wb25lbnQge1xyXG4gICAgICAgIGlmICh0aGlzLmJpbmRDb21wb25lbnRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJpbmRhYmxlQ29tcG9uZW50ID0gdGhpcy5iaW5kQ29tcG9uZW50RXZlbnQoY29udGFpbmVyLCBpdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgcmV0dXJuIGJpbmRhYmxlQ29tcG9uZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldENvbXBvbmVudEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlydHVhbDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLmdldENvbXBvbmVudEV2ZW50KGNvbnRhaW5lciwgaXRlbUNvbmZpZyksXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBjb21wb25lbnQgcmVnaXN0ZXJlZCBmb3IgdGhpcyB0eXBlLCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIGdldENvbXBvbmVudEV2ZW50IGRlZmluZWQuXHJcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRoZSB1c2VyIHBvcHMgb3V0IGEgZGlhbG9nIGFuZCB0aGUgY29tcG9uZW50IHR5cGVzIGFyZSBub3QgcmVnaXN0ZXJlZCB1cGZyb250LlxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGkxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Db21wb25lbnRUeXBlTm90UmVnaXN0ZXJlZEFuZEJpbmRDb21wb25lbnRFdmVudEhhbmRsZXJOb3RBc3NpZ25lZF07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYCR7dGV4dH06ICR7SlNPTi5zdHJpbmdpZnkoaXRlbUNvbmZpZyl9YFxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcihtZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSB1bmJpbmRDb21wb25lbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHZpcnR1YWw6IGJvb2xlYW4sIGNvbXBvbmVudDogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnVuYmluZENvbXBvbmVudEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy51bmJpbmRDb21wb25lbnRFdmVudChjb250YWluZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdmlydHVhbCAmJiB0aGlzLnJlbGVhc2VDb21wb25lbnRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdWQ1VDUkNVMzMzOTk4Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVsZWFzZUNvbXBvbmVudEV2ZW50KGNvbnRhaW5lciwgY29tcG9uZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBWaXJ0dWFsTGF5b3V0IHtcclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHZpcnR1YWwgY29tcG9uZW50cyB3aXRoIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykuYmluZENvbXBvbmVudEV2ZW50fSBhbmRcclxuICAgICAqIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykudW5iaW5kQ29tcG9uZW50RXZlbnR9IGV2ZW50cy5cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHR5cGUgR2V0Q29tcG9uZW50RXZlbnRIYW5kbGVyID1cclxuICAgICAgICAodGhpczogdm9pZCwgY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIGl0ZW1Db25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZykgPT4gQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudDtcclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHZpcnR1YWwgY29tcG9uZW50cyB3aXRoIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykuYmluZENvbXBvbmVudEV2ZW50fSBhbmRcclxuICAgICAqIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykudW5iaW5kQ29tcG9uZW50RXZlbnR9IGV2ZW50cy5cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHR5cGUgUmVsZWFzZUNvbXBvbmVudEV2ZW50SGFuZGxlciA9XHJcbiAgICAgICAgKHRoaXM6IHZvaWQsIGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBjb21wb25lbnQ6IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQpID0+IHZvaWQ7XHJcblxyXG4gICAgZXhwb3J0IHR5cGUgQmluZENvbXBvbmVudEV2ZW50SGFuZGxlciA9XHJcbiAgICAgICAgKHRoaXM6IHZvaWQsIGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBpdGVtQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpID0+IENvbXBvbmVudENvbnRhaW5lci5CaW5kYWJsZUNvbXBvbmVudDtcclxuICAgIGV4cG9ydCB0eXBlIFVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciA9XHJcbiAgICAgICAgKHRoaXM6IHZvaWQsIGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyKSA9PiB2b2lkO1xyXG5cclxuICAgIGV4cG9ydCB0eXBlIEJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuXHJcbiAgICAvKiogQGludGVybmFsXHJcbiAgICAgKiBWZXJpYWJsZSB0byBob2xkIHRoZSBzdGF0ZSB3aGV0aGVyIHdlIGFscmVhZHkgY2hlY2tlZCBpZiB3ZSBhcmUgcnVubmluZyBpbiBhIHN1YiB3aW5kb3cuXHJcbiAgICAgKiBGaXhlcyBwb3BvdXQgYW5kIGNyZWF0aW9uIG9mIG5lc3RlZCBnb2xkZW4tbGF5b3V0cy5cclxuICAgICAqL1xyXG4gICAgbGV0IHN1YldpbmRvd0NoZWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5b3V0TWFuYWdlckNvbnN0cnVjdG9yUGFyYW1ldGVycyhjb25maWdPck9wdGlvbmFsQ29udGFpbmVyOiBMYXlvdXRDb25maWcgfCBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI/OiBIVE1MRWxlbWVudCB8ICBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIpOlxyXG4gICAgICAgIExheW91dE1hbmFnZXIuQ29uc3RydWN0b3JQYXJhbWV0ZXJzXHJcbiAgICB7XHJcbiAgICAgICAgY29uc3Qgd2luZG93Q29uZmlnS2V5ID0gc3ViV2luZG93Q2hlY2tlZCA/IG51bGwgOiBuZXcgVVJMKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoJ2dsLXdpbmRvdycpO1xyXG4gICAgICAgIHN1YldpbmRvd0NoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IGlzU3ViV2luZG93ID0gd2luZG93Q29uZmlnS2V5ICE9PSBudWxsO1xyXG5cclxuICAgICAgICBsZXQgY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgbGV0IGNvbmZpZzogTGF5b3V0Q29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmICh3aW5kb3dDb25maWdLZXkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3Qgd2luZG93Q29uZmlnU3RyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0od2luZG93Q29uZmlnS2V5KTtcclxuICAgICAgICAgICAgaWYgKHdpbmRvd0NvbmZpZ1N0ciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOdWxsIGdsLXdpbmRvdyBDb25maWcnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh3aW5kb3dDb25maWdLZXkpO1xyXG4gICAgICAgICAgICBjb25zdCBtaW5pZmllZFdpbmRvd0NvbmZpZyA9IEpTT04ucGFyc2Uod2luZG93Q29uZmlnU3RyKSBhcyBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZztcclxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRDb25maWcgPSBSZXNvbHZlZExheW91dENvbmZpZy51bm1pbmlmeUNvbmZpZyhtaW5pZmllZFdpbmRvd0NvbmZpZyk7XHJcbiAgICAgICAgICAgIGNvbmZpZyA9IExheW91dENvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWcpXHJcblxyXG4gICAgICAgICAgICBpZiAoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJFbGVtZW50ID0gY29uZmlnT3JPcHRpb25hbENvbnRhaW5lcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChjb25maWdPck9wdGlvbmFsQ29udGFpbmVyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb25maWdPck9wdGlvbmFsQ29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25maWcgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudCA9IGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gY29uZmlnT3JPcHRpb25hbENvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lckVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZzogY29uZmlnLFxyXG4gICAgICAgICAgICBpc1N1YldpbmRvdyxcclxuICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiZXhwb3J0ICogZnJvbSAnLi90cy9jb25maWcvY29uZmlnJztcclxuZXhwb3J0ICogZnJvbSAnLi90cy9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuZXhwb3J0IHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnLi90cy9jb250YWluZXIvY29tcG9uZW50LWNvbnRhaW5lcic7XHJcbmV4cG9ydCB7IEJyb3dzZXJQb3BvdXQgfSBmcm9tICcuL3RzL2NvbnRyb2xzL2Jyb3dzZXItcG9wb3V0JztcclxuZXhwb3J0IHsgRHJhZ1NvdXJjZSB9IGZyb20gJy4vdHMvY29udHJvbHMvZHJhZy1zb3VyY2UnO1xyXG5leHBvcnQgeyBIZWFkZXIgfSBmcm9tICcuL3RzL2NvbnRyb2xzL2hlYWRlcic7XHJcbmV4cG9ydCB7IFRhYiB9IGZyb20gJy4vdHMvY29udHJvbHMvdGFiJztcclxuZXhwb3J0ICogZnJvbSAnLi90cy9lcnJvcnMvZXh0ZXJuYWwtZXJyb3InO1xyXG5leHBvcnQgeyBHb2xkZW5MYXlvdXQgfSBmcm9tICcuL3RzL2dvbGRlbi1sYXlvdXQnO1xyXG5leHBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi90cy9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmV4cG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi90cy9pdGVtcy9jb250ZW50LWl0ZW0nO1xyXG5leHBvcnQgeyBSb3dPckNvbHVtbiB9IGZyb20gJy4vdHMvaXRlbXMvcm93LW9yLWNvbHVtbic7XHJcbmV4cG9ydCB7IFN0YWNrIH0gZnJvbSAnLi90cy9pdGVtcy9zdGFjayc7XHJcbmV4cG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuL3RzL2xheW91dC1tYW5hZ2VyJztcclxuZXhwb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi90cy91dGlscy9ldmVudC1lbWl0dGVyJztcclxuZXhwb3J0IHsgRXZlbnRIdWIgfSBmcm9tICcuL3RzL3V0aWxzL2V2ZW50LWh1Yic7XHJcbmV4cG9ydCAqIGZyb20gJy4vdHMvdXRpbHMvaTE4bi1zdHJpbmdzJztcclxuZXhwb3J0IHsgU3R5bGVDb25zdGFudHMgfSBmcm9tICcuL3RzL3V0aWxzL3N0eWxlLWNvbnN0YW50cyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdHMvdXRpbHMvdHlwZXMnO1xyXG5leHBvcnQgeyBWaXJ0dWFsTGF5b3V0IH0gZnJvbSAnLi90cy92aXJ0dWFsLWxheW91dCc7XHJcblxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTm1DO0FBQ1M7QUFDNEI7QUFDWDtBQUNOO0FBQ1Q7QUFDTjtBQUNHO0FBQ087QUFDUTtBQUNKO0FBQ0M7QUFDZDtBQUNXO0FBQ0k7QUFDUjtBQUNSO0FBQ29CO0FBQzNCO0FBQ21CIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29uZmlnL2NvbmZpZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29uZmlnL3Jlc29sdmVkLWNvbmZpZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udGFpbmVyL2NvbXBvbmVudC1jb250YWluZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL2Jyb3dzZXItcG9wb3V0LnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9kcmFnLWFjdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvZHJhZy1wcm94eS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvZHJhZy1zb3VyY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL2Ryb3AtdGFyZ2V0LWluZGljYXRvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvaGVhZGVyLWJ1dHRvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvaGVhZGVyLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9zcGxpdHRlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvdGFiLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy90YWJzLWNvbnRhaW5lci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvdHJhbnNpdGlvbi1pbmRpY2F0b3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2Vycm9ycy9leHRlcm5hbC1lcnJvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvZXJyb3JzL2ludGVybmFsLWVycm9yLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9nb2xkZW4tbGF5b3V0LnRzIiwid2VicGFjazovLy8uL3NyYy90cy9pdGVtcy9jb21wb25lbnQtaXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvaXRlbXMvY29tcG9uZW50LXBhcmVudGFibGUtaXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvaXRlbXMvY29udGVudC1pdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9pdGVtcy9ncm91bmQtaXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvaXRlbXMvcm93LW9yLWNvbHVtbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvaXRlbXMvc3RhY2sudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2xheW91dC1tYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy9jb25maWctbWluaWZpZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL2RyYWctbGlzdGVuZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL2V2ZW50LWVtaXR0ZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL2V2ZW50LWh1Yi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdXRpbHMvaTE4bi1zdHJpbmdzLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy9zdHlsZS1jb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL3R5cGVzLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy91dGlscy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdmlydHVhbC1sYXlvdXQudHMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImdvbGRlbkxheW91dFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJnb2xkZW5MYXlvdXRcIl0gPSBmYWN0b3J5KCk7XG59KShnbG9iYWxUaGlzLCAoKSA9PiB7XG5yZXR1cm4gIiwiaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciwgVW5yZWFjaGFibGVDYXNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBJMThuU3RyaW5nSWQsIGkxOG5TdHJpbmdzIH0gZnJvbSAnLi4vdXRpbHMvaTE4bi1zdHJpbmdzJztcclxuaW1wb3J0IHsgSXRlbVR5cGUsIEpzb25WYWx1ZSwgUmVzcG9uc2l2ZU1vZGUsIFNpZGUsIFNpemVVbml0RW51bSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZGVlcEV4dGVuZFZhbHVlLCBzcGxpdFN0cmluZ0F0Rmlyc3ROb25OdW1lcmljQ2hhciB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICAgIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRMYXlvdXRDb25maWcsXHJcbiAgICBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyxcclxuICAgIFJlc29sdmVkUm9vdEl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnXHJcbn0gZnJvbSBcIi4vcmVzb2x2ZWQtY29uZmlnXCI7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Db25maWcge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgaXRlbS4gUG9zc2libGUgdmFsdWVzIGFyZSAncm93JywgJ2NvbHVtbicsICdzdGFjaycsICdjb21wb25lbnQnLlxyXG4gICAgICovXHJcbiAgICB0eXBlOiBJdGVtVHlwZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGNvbmZpZ3VyYXRpb25zIGZvciBpdGVtcyB0aGF0IHdpbGwgYmUgY3JlYXRlZCBhcyBjaGlsZHJlbiBvZiB0aGlzIGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIGNvbnRlbnQ/OiBJdGVtQ29uZmlnW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgd2lkdGggb2YgdGhpcyBpdGVtLCByZWxhdGl2ZSB0byB0aGUgb3RoZXIgY2hpbGRyZW4gb2YgaXRzIHBhcmVudCBpbiBwZXJjZW50XHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChJdGVtQ29uZmlnOmludGVyZmFjZSkuc2l6ZX0gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICB3aWR0aD86IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtaW5pbXVtIHdpZHRoIG9mIHRoaXMgaXRlbSBpbiBwaXhlbHNcclxuICAgICAqIENBVVRJT04gLSBOb3QgdGVzdGVkIC0gZG8gbm90IHVzZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoSXRlbUNvbmZpZzppbnRlcmZhY2UpLm1pblNpemV9IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgbWluV2lkdGg/OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoaXMgaXRlbSwgcmVsYXRpdmUgdG8gdGhlIG90aGVyIGNoaWxkcmVuIG9mIGl0cyBwYXJlbnQgaW4gcGVyY2VudFxyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoSXRlbUNvbmZpZzppbnRlcmZhY2UpLnNpemV9IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgaGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1pbmltdW0gaGVpZ2h0IG9mIHRoaXMgaXRlbSBpbiBwaXhlbHNcclxuICAgICAqIENBVVRJT04gLSBOb3QgdGVzdGVkIC0gZG8gbm90IHVzZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoSXRlbUNvbmZpZzppbnRlcmZhY2UpLm1pblNpemV9IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgbWluSGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNpemUgb2YgdGhpcyBpdGVtLlxyXG4gICAgICogRm9yIHJvd3MsIGl0IHNwZWNpZmllcyBoZWlnaHQuIEZvciBjb2x1bW5zLCBpdCBzcGVjaWZpZXMgd2lkdGguXHJcbiAgICAgKiBIYXMgZm9ybWF0IFxcPG51bWJlclxcPlxcPHtAbGluayBTaXplVW5pdH1cXD4uIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHVuaXRzIGBmcmAgYW5kIGAlYC5cclxuICAgICAqXHJcbiAgICAgKiBTcGFjZSBpcyBmaXJzdCBwcm9wb3J0aW9uYWxseSBhbGxvY2F0ZWQgdG8gaXRlbXMgd2l0aCBzaXplVW5pdCBgJWAuXHJcbiAgICAgKiBJZiB0aGVyZSBpcyBhbnkgc3BhY2UgbGVmdCBvdmVyIChsZXNzIHRoYW4gMTAwJSBhbGxvY2F0ZWQpLCB0aGVuIHRoZVxyXG4gICAgICogcmVtYWluZGVyIGlzIGFsbG9jYXRlZCB0byB0aGUgaXRlbXMgd2l0aCB1bml0IGBmcmAgYWNjb3JkaW5nIHRvIHRoZSBmcmFjdGlvbmFsIHNpemUuXHJcbiAgICAgKiBJZiBtb3JlIHRoYW4gMTAwJSBpcyBhbGxvY2F0ZWQsIHRoZW4gYW4gZXh0cmEgNTAlIGlzIGFsbG9jYXRlZCB0byBpdGVtcyB3aXRoIHVuaXQgYGZyYCBhbmRcclxuICAgICAqIGlzIGFsbG9jYXRlZCB0byBlYWNoIGl0ZW0gYWNjb3JkaW5nIHRvIGl0cyBmcmFjdGlvbmFsIHNpemUuIEFsbCBpdGVtIHNpemVzIGFyZSB0aGVuIGFkanVzdGVkXHJcbiAgICAgKiB0byBicmluZyB0aGUgdG90YWwgYmFjayB0byAxMDAlXHJcbiAgICAgKi9cclxuICAgIHNpemU/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGlzIGl0ZW0uXHJcbiAgICAgKiBGb3Igcm93cywgaXQgc3BlY2lmaWVzIGhlaWdodC4gRm9yIGNvbHVtbnMsIGl0IHNwZWNpZmllcyB3aWR0aC5cclxuICAgICAqIEhhcyBmb3JtYXQgPG51bWJlcj48c2l6ZVVuaXQ+LiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyB1bml0cyBgcHhgXHJcbiAgICAgKi9cclxuICAgIG1pblNpemU/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgQ29udGVudEl0ZW0uXHJcbiAgICAgKiBEbyBOT1QgYXNzaWduIGFuIGFycmF5LiAgVGhpcyBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IHB1cnBvc2VzLiAgSWYgYW4gYXJyYXkgaXMgYXNzaWduZWQsIHRoZSBmaXJzdCBlbGVtZW50XHJcbiAgICAgKiB3aWxsIGJlY29tZSB0aGUgaWQuXHJcbiAgICAgKi9cclxuICAgIGlkPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgaXRlbSBpcyBjbG9zYWJsZS4gSWYgZmFsc2UsIHRoZSB4IG9uIHRoZSBpdGVtcyB0YWIgd2lsbCBiZSBoaWRkZW4gYW5kIGNvbnRhaW5lci5jbG9zZSgpXHJcbiAgICAgKiB3aWxsIHJldHVybiBmYWxzZVxyXG4gICAgICogRGVmYXVsdDogdHJ1ZVxyXG4gICAgICovXHJcbiAgICBpc0Nsb3NhYmxlPzogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0aXRsZSBvZiB0aGUgaXRlbSBhcyBkaXNwbGF5ZWQgb24gaXRzIHRhYiBhbmQgb24gcG9wb3V0IHdpbmRvd3NcclxuICAgICAqIERlZmF1bHQ6IGNvbXBvbmVudFR5cGUudG9TdHJpbmcoKSBvciAnJ1xyXG4gICAgICogQGRlcHJlY2F0ZWQgb25seSBDb21wb25lbnQgaGFzIGEgdGl0bGVcclxuICAgICAqL1xyXG4gICAgdGl0bGU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSXRlbUNvbmZpZyB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgY29uc3QgZW51bSBTaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZSB7XHJcbiAgICAgICAgTm9uZSxcclxuICAgICAgICBTaXplLFxyXG4gICAgICAgIFdpZHRoT3JIZWlnaHQsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaXRlbUNvbmZpZzogSXRlbUNvbmZpZywgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdDogYm9vbGVhbik6IFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgc3dpdGNoIChpdGVtQ29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKCdJdGVtQ29uZmlnIGNhbm5vdCBzcGVjaWZ5IHR5cGUgZ3JvdW5kJywgSlNPTi5zdHJpbmdpZnkoaXRlbUNvbmZpZykpO1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUm93T3JDb2x1bW5JdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZyBhcyBSb3dPckNvbHVtbkl0ZW1Db25maWcsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQpO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgICAgIHJldHVybiBTdGFja0l0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnIGFzIFN0YWNrSXRlbUNvbmZpZywgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnRJdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZyBhcyBDb21wb25lbnRJdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KTtcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ1VDVUlDUjU1NDk5JywgaXRlbUNvbmZpZy50eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb250ZW50KGNvbnRlbnQ6IEl0ZW1Db25maWdbXSB8IHVuZGVmaW5lZCk6IFJlc29sdmVkSXRlbUNvbmZpZ1tdIHtcclxuICAgICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IGNvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UmVzb2x2ZWRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gSXRlbUNvbmZpZy5yZXNvbHZlKGNvbnRlbnRbaV0sIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUlkKGlkOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpZC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWRbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTaXplKFxyXG4gICAgICAgIHNpemU6IHN0cmluZyB8IHVuZGVmaW5lZCxcclxuICAgICAgICB3aWR0aDogbnVtYmVyIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQ6IGJvb2xlYW4pOlxyXG4gICAgU2l6ZVdpdGhVbml0IHtcclxuICAgICAgICAvLyBSZW1vdmUgc3VwcG9ydCBmb3Igcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCBpbiBhIG1ham9yIHZlcnNpb24gcmVsZWFzZVxyXG5cclxuICAgICAgICBpZiAoc2l6ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVNpemUoc2l6ZSwgW1NpemVVbml0RW51bS5QZXJjZW50LCBTaXplVW5pdEVudW0uRnJhY3Rpb25hbF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh3aWR0aCAhPT0gdW5kZWZpbmVkIHx8IGhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAod2lkdGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IHdpZHRoLCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBlcmNlbnQgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IGhlaWdodCwgc2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QZXJjZW50IH07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignQ1JTMzMzOTAnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IDUwLCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBlcmNlbnQgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemUsIHNpemVVbml0OiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZVVuaXQgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1pblNpemUobWluU2l6ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtaW5XaWR0aDogbnVtYmVyIHwgdW5kZWZpbmVkLCBtaW5IZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IFVuZGVmaW5hYmxlU2l6ZVdpdGhVbml0IHtcclxuICAgICAgICBpZiAobWluU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVNpemUobWluU2l6ZSwgW1NpemVVbml0RW51bS5QaXhlbF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbldpZHRoRGVmaW5lZCA9IG1pbldpZHRoICE9PSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbkhlaWdodERlZmluZWQgPSBtaW5IZWlnaHQgIT09IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaWYgKG1pbldpZHRoRGVmaW5lZCB8fCBtaW5IZWlnaHREZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWluV2lkdGhEZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogbWluV2lkdGgsIHNpemVVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogbWluSGVpZ2h0LCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBpeGVsIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZSwgc2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplVW5pdCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVTaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZShjb25maWc6IEl0ZW1Db25maWcpOiBTaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZSB7XHJcbiAgICAgICAgaWYgKGNvbmZpZy5zaXplICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlLlNpemU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNvbmZpZy53aWR0aCAhPT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5oZWlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlLldpZHRoT3JIZWlnaHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUuTm9uZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNHcm91bmQoY29uZmlnOiBJdGVtQ29uZmlnKTogY29uZmlnIGlzIEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBjb25maWcudHlwZSA9PT0gSXRlbVR5cGUuZ3JvdW5kO1xyXG4gICAgfVxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUm93KGNvbmZpZzogSXRlbUNvbmZpZyk6IGNvbmZpZyBpcyBJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gY29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLnJvdztcclxuICAgIH1cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NvbHVtbihjb25maWc6IEl0ZW1Db25maWcpOiBjb25maWcgaXMgSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5jb2x1bW47XHJcbiAgICB9XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNTdGFjayhjb25maWc6IEl0ZW1Db25maWcpOiBjb25maWcgaXMgSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5zdGFjaztcclxuICAgIH1cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudChjb25maWc6IEl0ZW1Db25maWcpOiBjb25maWcgaXMgQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5jb21wb25lbnQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIFN0YWNrIG9yIENvbXBvbmVudFxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRlcmVkSXRlbUNvbmZpZyBleHRlbmRzIEl0ZW1Db25maWcge1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKEhlYWRlcmVkSXRlbUNvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5zaG93fSBpbnN0ZWFkICovXHJcbiAgICBoYXNIZWFkZXJzPzogYm9vbGVhbjtcclxuICAgIGhlYWRlcj86IEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXI7XHJcbiAgICBtYXhpbWlzZWQ/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICBjb25zdCBsZWdhY3lNYXhpbWlzZWRJZCA9ICdfX2dsTWF4aW1pc2VkJztcclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEhlYWRlciB7XHJcbiAgICAgICAgc2hvdz86IGZhbHNlIHwgU2lkZTtcclxuICAgICAgICBwb3BvdXQ/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICBkb2NrPzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgbWF4aW1pc2U/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICBjbG9zZT86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIG1pbmltaXNlPzogc3RyaW5nO1xyXG4gICAgICAgIHRhYkRyb3Bkb3duPzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBIZWFkZXIge1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGhlYWRlcjogSGVhZGVyIHwgdW5kZWZpbmVkLCBoYXNIZWFkZXJzOiBib29sZWFuIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICAgICAgaWYgKGhlYWRlciA9PT0gdW5kZWZpbmVkICYmIGhhc0hlYWRlcnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3c6IGhlYWRlcj8uc2hvdyA/PyAoaGFzSGVhZGVycyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogaGFzSGVhZGVycyA/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5zaG93IDogZmFsc2UpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcG91dDogaGVhZGVyPy5wb3BvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4aW1pc2U6IGhlYWRlcj8ubWF4aW1pc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2U6IGhlYWRlcj8uY2xvc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgbWluaW1pc2U6IGhlYWRlcj8ubWluaW1pc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFiRHJvcGRvd246IGhlYWRlcj8udGFiRHJvcGRvd24sXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSWRBbmRNYXhpbWlzZWQoY29uZmlnOiBIZWFkZXJlZEl0ZW1Db25maWcpOiB7IGlkOiBzdHJpbmcsIG1heGltaXNlZDogYm9vbGVhbn0ge1xyXG4gICAgICAgIGxldCBpZDogc3RyaW5nO1xyXG4gICAgICAgIC8vIFRvIHN1cHBvcnQgbGVnYWN5IGNvbmZpZ3Mgd2l0aCBJZCBzYXZlZCBhcyBhbiBhcnJheSBvZiBzdHJpbmcsIGFzc2lnbiBjb25maWcuaWQgdG8gYSB0eXBlIHdoaWNoIGluY2x1ZGVzIHN0cmluZyBhcnJheVxyXG4gICAgICAgIGxldCBsZWdhY3lJZDogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQgPSBjb25maWcuaWQ7XHJcbiAgICAgICAgbGV0IGxlZ2FjeU1heGltaXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChsZWdhY3lJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlkID0gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxlZ2FjeUlkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gbGVnYWN5SWQuZmluZEluZGV4KChpZCkgPT4gaWQgPT09IGxlZ2FjeU1heGltaXNlZElkKVxyXG4gICAgICAgICAgICAgICAgaWYgKGlkeCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWdhY3lNYXhpbWlzZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeUlkID0gbGVnYWN5SWQuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAobGVnYWN5SWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkID0gbGVnYWN5SWRbMF07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkID0gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWQgPSBsZWdhY3lJZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1heGltaXNlZDogYm9vbGVhbjtcclxuICAgICAgICBpZiAoY29uZmlnLm1heGltaXNlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG1heGltaXNlZCA9IGNvbmZpZy5tYXhpbWlzZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWF4aW1pc2VkID0gbGVnYWN5TWF4aW1pc2VkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgaWQsIG1heGltaXNlZCB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tJdGVtQ29uZmlnIGV4dGVuZHMgSGVhZGVyZWRJdGVtQ29uZmlnIHtcclxuICAgIHR5cGU6ICdzdGFjayc7XHJcbiAgICBjb250ZW50OiBDb21wb25lbnRJdGVtQ29uZmlnW107XHJcbiAgICAvKiogVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIGNvbnRlbnQgd2hpY2ggaXMgdG8gYmUgYWN0aXZlKi9cclxuICAgIGFjdGl2ZUl0ZW1JbmRleD86IG51bWJlcjtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBTdGFja0l0ZW1Db25maWcge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaXRlbUNvbmZpZzogU3RhY2tJdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0OiBib29sZWFuKTogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHsgaWQsIG1heGltaXNlZCB9ID0gSGVhZGVyZWRJdGVtQ29uZmlnLnJlc29sdmVJZEFuZE1heGltaXNlZChpdGVtQ29uZmlnKTtcclxuICAgICAgICBjb25zdCB7IHNpemUsIHNpemVVbml0IH0gPSBJdGVtQ29uZmlnLnJlc29sdmVTaXplKGl0ZW1Db25maWcuc2l6ZSwgaXRlbUNvbmZpZy53aWR0aCwgaXRlbUNvbmZpZy5oZWlnaHQsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQpO1xyXG4gICAgICAgIGNvbnN0IHsgc2l6ZTogbWluU2l6ZSwgc2l6ZVVuaXQ6IG1pblNpemVVbml0IH0gPSBJdGVtQ29uZmlnLnJlc29sdmVNaW5TaXplKGl0ZW1Db25maWcubWluU2l6ZSwgaXRlbUNvbmZpZy5taW5XaWR0aCwgaXRlbUNvbmZpZy5taW5IZWlnaHQpO1xyXG5cclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgY29udGVudDogcmVzb2x2ZUNvbnRlbnQoaXRlbUNvbmZpZy5jb250ZW50KSxcclxuICAgICAgICAgICAgc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBpdGVtQ29uZmlnLmlzQ2xvc2FibGUgPz8gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIGFjdGl2ZUl0ZW1JbmRleDogaXRlbUNvbmZpZy5hY3RpdmVJdGVtSW5kZXggPz8gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuZGVmYXVsdEFjdGl2ZUl0ZW1JbmRleCxcclxuICAgICAgICAgICAgaGVhZGVyOiBIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLnJlc29sdmUoaXRlbUNvbmZpZy5oZWFkZXIsIGl0ZW1Db25maWcuaGFzSGVhZGVycyksXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWc6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnKTogU3RhY2tJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFN0YWNrSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuc3RhY2ssXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGZyb21SZXNvbHZlZENvbnRlbnQocmVzb2x2ZWRDb25maWcuY29udGVudCksXHJcbiAgICAgICAgICAgIHNpemU6IGZvcm1hdFNpemUocmVzb2x2ZWRDb25maWcuc2l6ZSwgcmVzb2x2ZWRDb25maWcuc2l6ZVVuaXQpLFxyXG4gICAgICAgICAgICBtaW5TaXplOiBmb3JtYXRVbmRlZmluYWJsZVNpemUocmVzb2x2ZWRDb25maWcubWluU2l6ZSwgcmVzb2x2ZWRDb25maWcubWluU2l6ZVVuaXQpLFxyXG4gICAgICAgICAgICBpZDogcmVzb2x2ZWRDb25maWcuaWQsXHJcbiAgICAgICAgICAgIG1heGltaXNlZDogcmVzb2x2ZWRDb25maWcubWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiByZXNvbHZlZENvbmZpZy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXg6IHJlc29sdmVkQ29uZmlnLmFjdGl2ZUl0ZW1JbmRleCxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShyZXNvbHZlZENvbmZpZy5oZWFkZXIpLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZnVuY3Rpb24gcmVzb2x2ZUNvbnRlbnQoY29udGVudDogQ29tcG9uZW50SXRlbUNvbmZpZ1tdIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gY29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEl0ZW1Db25maWcgPSBjb250ZW50W2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IEl0ZW1Db25maWcucmVzb2x2ZShjaGlsZEl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghUmVzb2x2ZWRJdGVtQ29uZmlnLmlzQ29tcG9uZW50SXRlbShpdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignVUNVU0lDUkM5MTExNCcsIEpTT04uc3RyaW5naWZ5KGl0ZW1Db25maWcpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gaXRlbUNvbmZpZztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmdW5jdGlvbiBmcm9tUmVzb2x2ZWRDb250ZW50KHJlc29sdmVkQ29udGVudDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10pOiBDb21wb25lbnRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVzb2x2ZWRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8Q29tcG9uZW50SXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbnRlbnRDb25maWcgPSByZXNvbHZlZENvbnRlbnRbaV07XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IENvbXBvbmVudEl0ZW1Db25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29udGVudENvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50SXRlbUNvbmZpZyBleHRlbmRzIEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICB0eXBlOiAnY29tcG9uZW50JztcclxuICAgIHJlYWRvbmx5IGNvbnRlbnQ/OiBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0aXRsZSBvZiB0aGUgaXRlbSBhcyBkaXNwbGF5ZWQgb24gaXRzIHRhYiBhbmQgb24gcG9wb3V0IHdpbmRvd3NcclxuICAgICAqIERlZmF1bHQ6IGNvbXBvbmVudFR5cGUudG9TdHJpbmcoKSBvciAnJ1xyXG4gICAgICovXHJcbiAgICB0aXRsZT86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBjb21wb25lbnQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChDb21wb25lbnRJdGVtQ29uZmlnOmludGVyZmFjZSkuY29tcG9uZW50VHlwZX0gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBjb21wb25lbnROYW1lPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudC5cclxuICAgICAqIGBjb21wb25lbnRUeXBlYCBtdXN0IGJlIG9mIHR5cGUgYHN0cmluZ2AgaWYgaXQgaXMgcmVnaXN0ZXJlZCB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczpcclxuICAgICAqICoge0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyQ29tcG9uZW50fSAoZGVwcmVjYXRlZClcclxuICAgICAqICoge0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyQ29tcG9uZW50Q29uc3RydWN0b3J9XHJcbiAgICAgKiAqIHtAbGluayAoR29sZGVuTGF5b3V0OmNsYXNzKS5yZWdpc3RlckNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbn1cclxuICAgICAqL1xyXG4gICAgY29tcG9uZW50VHlwZTogSnNvblZhbHVlO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc3RhdGUgaW5mb3JtYXRpb24gd2l0aCB3aGljaCBhIGNvbXBvbmVudCB3aWxsIGJlIGluaXRpYWxpc2VkIHdpdGguXHJcbiAgICAgKiBXaWxsIGJlIHBhc3NlZCB0byB0aGUgY29tcG9uZW50IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGFuZCB3aWxsIGJlIHRoZSB2YWx1ZSByZXR1cm5lZCBieVxyXG4gICAgICogY29udGFpbmVyLmluaXRpYWxTdGF0ZS5cclxuICAgICAqL1xyXG4gICAgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgKi9cclxuICAgIHJlb3JkZXJFbmFibGVkPzogYm9vbGVhbjsgIC8vIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBMYXlvdXRDb25maWcucmVvcmRlckVuYWJsZWQuXHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0OiBib29sZWFuKTogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICBsZXQgY29tcG9uZW50VHlwZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkID0gaXRlbUNvbmZpZy5jb21wb25lbnRUeXBlO1xyXG4gICAgICAgIGlmIChjb21wb25lbnRUeXBlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSA9IGl0ZW1Db25maWcuY29tcG9uZW50TmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBvbmVudEl0ZW1Db25maWcuY29tcG9uZW50VHlwZSBpcyB1bmRlZmluZWQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB7IGlkLCBtYXhpbWlzZWQgfSA9IEhlYWRlcmVkSXRlbUNvbmZpZy5yZXNvbHZlSWRBbmRNYXhpbWlzZWQoaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgIGxldCB0aXRsZTogc3RyaW5nO1xyXG4gICAgICAgICAgICBpZiAoaXRlbUNvbmZpZy50aXRsZSA9PT0gdW5kZWZpbmVkIHx8IGl0ZW1Db25maWcudGl0bGUgPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICB0aXRsZSA9IENvbXBvbmVudEl0ZW1Db25maWcuY29tcG9uZW50VHlwZVRvVGl0bGUoY29tcG9uZW50VHlwZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aXRsZSA9IGl0ZW1Db25maWcudGl0bGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgeyBzaXplLCBzaXplVW5pdCB9ID0gSXRlbUNvbmZpZy5yZXNvbHZlU2l6ZShpdGVtQ29uZmlnLnNpemUsIGl0ZW1Db25maWcud2lkdGgsIGl0ZW1Db25maWcuaGVpZ2h0LCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KTtcclxuICAgICAgICAgICAgY29uc3QgeyBzaXplOiBtaW5TaXplLCBzaXplVW5pdDogbWluU2l6ZVVuaXQgfSA9IEl0ZW1Db25maWcucmVzb2x2ZU1pblNpemUoaXRlbUNvbmZpZy5taW5TaXplLCBpdGVtQ29uZmlnLm1pbldpZHRoLCBpdGVtQ29uZmlnLm1pbkhlaWdodCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogaXRlbUNvbmZpZy50eXBlLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgICAgICAgICBzaXplLFxyXG4gICAgICAgICAgICAgICAgc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplLFxyXG4gICAgICAgICAgICAgICAgbWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgICAgIG1heGltaXNlZCxcclxuICAgICAgICAgICAgICAgIGlzQ2xvc2FibGU6IGl0ZW1Db25maWcuaXNDbG9zYWJsZSA/PyBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiBpdGVtQ29uZmlnLnJlb3JkZXJFbmFibGVkID8/IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5kZWZhdWx0UmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5yZXNvbHZlKGl0ZW1Db25maWcuaGVhZGVyLCBpdGVtQ29uZmlnLmhhc0hlYWRlcnMpLFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiBpdGVtQ29uZmlnLmNvbXBvbmVudFN0YXRlID8/IHt9LFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiBDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLmNvbXBvbmVudCxcclxuICAgICAgICAgICAgc2l6ZTogZm9ybWF0U2l6ZShyZXNvbHZlZENvbmZpZy5zaXplLCByZXNvbHZlZENvbmZpZy5zaXplVW5pdCksXHJcbiAgICAgICAgICAgIG1pblNpemU6IGZvcm1hdFVuZGVmaW5hYmxlU2l6ZShyZXNvbHZlZENvbmZpZy5taW5TaXplLCByZXNvbHZlZENvbmZpZy5taW5TaXplVW5pdCksXHJcbiAgICAgICAgICAgIGlkOiByZXNvbHZlZENvbmZpZy5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiByZXNvbHZlZENvbmZpZy5tYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IHJlc29sdmVkQ29uZmlnLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiByZXNvbHZlZENvbmZpZy5yZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgdGl0bGU6IHJlc29sdmVkQ29uZmlnLnRpdGxlLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KHJlc29sdmVkQ29uZmlnLmhlYWRlciksXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGU6IHJlc29sdmVkQ29uZmlnLmNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiBkZWVwRXh0ZW5kVmFsdWUodW5kZWZpbmVkLCByZXNvbHZlZENvbmZpZy5jb21wb25lbnRTdGF0ZSkgYXMgSnNvblZhbHVlLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY29tcG9uZW50VHlwZVRvVGl0bGUoY29tcG9uZW50VHlwZTogSnNvblZhbHVlKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRUeXBlVHlwZSA9IHR5cGVvZiBjb21wb25lbnRUeXBlO1xyXG4gICAgICAgIHN3aXRjaCAoY29tcG9uZW50VHlwZVR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzogcmV0dXJuIGNvbXBvbmVudFR5cGUgYXMgc3RyaW5nO1xyXG4gICAgICAgICAgICBjYXNlICdudW1iZXInOiByZXR1cm4gKGNvbXBvbmVudFR5cGUgYXMgbnVtYmVyKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzogcmV0dXJuIChjb21wb25lbnRUeXBlIGFzIGJvb2xlYW4pLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIFJvd09yQ29sdW1uXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUm93T3JDb2x1bW5JdGVtQ29uZmlnIGV4dGVuZHMgSXRlbUNvbmZpZyB7XHJcbiAgICB0eXBlOiAncm93JyB8ICdjb2x1bW4nO1xyXG4gICAgY29udGVudDogKFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcpW107XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUm93T3JDb2x1bW5JdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCB0eXBlIENoaWxkSXRlbUNvbmZpZyA9IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWc7XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ2hpbGRJdGVtQ29uZmlnKGl0ZW1Db25maWc6IEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIENoaWxkSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgc3dpdGNoIChpdGVtQ29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignVVJPQ09TUENJQ0lDMTM2ODcnLCBpdGVtQ29uZmlnLnR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShpdGVtQ29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQ6IGJvb2xlYW4pOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgeyBzaXplLCBzaXplVW5pdCB9ID0gSXRlbUNvbmZpZy5yZXNvbHZlU2l6ZShpdGVtQ29uZmlnLnNpemUsIGl0ZW1Db25maWcud2lkdGgsIGl0ZW1Db25maWcuaGVpZ2h0LCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KTtcclxuICAgICAgICBjb25zdCB7IHNpemU6IG1pblNpemUsIHNpemVVbml0OiBtaW5TaXplVW5pdCB9ID0gSXRlbUNvbmZpZy5yZXNvbHZlTWluU2l6ZShpdGVtQ29uZmlnLm1pblNpemUsIGl0ZW1Db25maWcubWluV2lkdGgsIGl0ZW1Db25maWcubWluSGVpZ2h0KTtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBpdGVtQ29uZmlnLnR5cGUsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IFJvd09yQ29sdW1uSXRlbUNvbmZpZy5yZXNvbHZlQ29udGVudChpdGVtQ29uZmlnLmNvbnRlbnQpLFxyXG4gICAgICAgICAgICBzaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBJdGVtQ29uZmlnLnJlc29sdmVJZChpdGVtQ29uZmlnLmlkKSxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogaXRlbUNvbmZpZy5pc0Nsb3NhYmxlID8/IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWc6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnKTogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogcmVzb2x2ZWRDb25maWcudHlwZSxcclxuICAgICAgICAgICAgY29udGVudDogZnJvbVJlc29sdmVkQ29udGVudChyZXNvbHZlZENvbmZpZy5jb250ZW50KSxcclxuICAgICAgICAgICAgc2l6ZTogZm9ybWF0U2l6ZShyZXNvbHZlZENvbmZpZy5zaXplLCByZXNvbHZlZENvbmZpZy5zaXplVW5pdCksXHJcbiAgICAgICAgICAgIG1pblNpemU6IGZvcm1hdFVuZGVmaW5hYmxlU2l6ZShyZXNvbHZlZENvbmZpZy5taW5TaXplLCByZXNvbHZlZENvbmZpZy5taW5TaXplVW5pdCksXHJcbiAgICAgICAgICAgIGlkOiByZXNvbHZlZENvbmZpZy5pZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogcmVzb2x2ZWRDb25maWcuaXNDbG9zYWJsZSxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb250ZW50KGNvbnRlbnQ6IENoaWxkSXRlbUNvbmZpZ1tdIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gY29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkSXRlbUNvbmZpZ3MgPSBuZXcgQXJyYXk8Um93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgICAgICBsZXQgd2lkdGhPckhlaWdodFNwZWNpZmllZEF0TGVhc3RPbmNlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBzaXplU3BlY2lmaWVkQXRMZWFzdE9uY2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEl0ZW1Db25maWcgPSBjb250ZW50W2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFSb3dPckNvbHVtbkl0ZW1Db25maWcuaXNDaGlsZEl0ZW1Db25maWcoY2hpbGRJdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoJ0l0ZW1Db25maWcgaXMgbm90IFJvdywgQ29sdW1uIG9yIFN0YWNrJywgY2hpbGRJdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaXplU3BlY2lmaWVkQXRMZWFzdE9uY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUgPSBJdGVtQ29uZmlnLmNhbGN1bGF0ZVNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlKGNoaWxkSXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbUNvbmZpZy5TaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZS5Ob25lOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtQ29uZmlnLlNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlLldpZHRoT3JIZWlnaHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhPckhlaWdodFNwZWNpZmllZEF0TGVhc3RPbmNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbUNvbmZpZy5TaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZS5TaXplOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVTcGVjaWZpZWRBdExlYXN0T25jZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignUk9DSUNSQzg3NTU2Jywgc2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkSXRlbUNvbmZpZ3NbaV0gPSBjaGlsZEl0ZW1Db25maWc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBsZWdhY3lTaXplRGVmYXVsdDogYm9vbGVhbjtcclxuICAgICAgICAgICAgaWYgKHNpemVTcGVjaWZpZWRBdExlYXN0T25jZSkge1xyXG4gICAgICAgICAgICAgICAgbGVnYWN5U2l6ZURlZmF1bHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh3aWR0aE9ySGVpZ2h0U3BlY2lmaWVkQXRMZWFzdE9uY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWdhY3lTaXplRGVmYXVsdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVNpemVEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEl0ZW1Db25maWcgPSBjaGlsZEl0ZW1Db25maWdzW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRDaGlsZEl0ZW1Db25maWcgPSBJdGVtQ29uZmlnLnJlc29sdmUoY2hpbGRJdGVtQ29uZmlnLCBsZWdhY3lTaXplRGVmYXVsdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIVJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLmlzQ2hpbGRJdGVtQ29uZmlnKHJlc29sdmVkQ2hpbGRJdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignVVJPQ09TUElDOTk1MTInLCBKU09OLnN0cmluZ2lmeShyZXNvbHZlZENoaWxkSXRlbUNvbmZpZykpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSByZXNvbHZlZENoaWxkSXRlbUNvbmZpZztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmdW5jdGlvbiBmcm9tUmVzb2x2ZWRDb250ZW50KHJlc29sdmVkQ29udGVudDogcmVhZG9ubHkgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnW10pOiBSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVzb2x2ZWRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8Um93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbnRlbnRDb25maWcgPSByZXNvbHZlZENvbnRlbnRbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSByZXNvbHZlZENvbnRlbnRDb25maWcudHlwZTtcclxuICAgICAgICAgICAgbGV0IGNvbnRlbnRDb25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWc7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Q29uZmlnID0gUm93T3JDb2x1bW5JdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZENvbnRlbnRDb25maWcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Q29uZmlnID0gU3RhY2tJdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZENvbnRlbnRDb25maWcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudENvbmZpZyA9IENvbXBvbmVudEl0ZW1Db25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29udGVudENvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignUk9DSUNGUkM0NDc5NycsIHR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IGNvbnRlbnRDb25maWc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCB0eXBlIFJvb3RJdGVtQ29uZmlnID0gUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUm9vdEl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUm9vdEl0ZW1Db25maWcoaXRlbUNvbmZpZzogSXRlbUNvbmZpZyk6IGl0ZW1Db25maWcgaXMgUm9vdEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAoaXRlbUNvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ1VSSUNJUjIzNjg3JywgaXRlbUNvbmZpZy50eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaXRlbUNvbmZpZzogUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQpOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAoaXRlbUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKCFSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLmlzUm9vdEl0ZW1Db25maWcocmVzdWx0KSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcignSXRlbUNvbmZpZyBpcyBub3QgUm93LCBDb2x1bW4gb3IgU3RhY2snLCBKU09OLnN0cmluZ2lmeShpdGVtQ29uZmlnKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWRPclVuZGVmaW5lZChyZXNvbHZlZEl0ZW1Db25maWc6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQpOiBSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHJlc29sdmVkSXRlbUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHJlc29sdmVkSXRlbUNvbmZpZy50eXBlO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJvd09yQ29sdW1uSXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRJdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0YWNrSXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRJdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnRJdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZEl0ZW1Db25maWcpO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ1JJQ0ZST1U4OTkyMScsIHR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIExheW91dENvbmZpZyB7XHJcbiAgICByb290OiBSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChMYXlvdXRDb25maWc6aW50ZXJmYWNlKS5yb290fSAqL1xyXG4gICAgY29udGVudD86IChSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnKVtdO1xyXG4gICAgb3BlblBvcG91dHM/OiBQb3BvdXRMYXlvdXRDb25maWdbXTtcclxuICAgIGRpbWVuc2lvbnM/OiBMYXlvdXRDb25maWcuRGltZW5zaW9ucztcclxuICAgIHNldHRpbmdzPzogTGF5b3V0Q29uZmlnLlNldHRpbmdzO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzppbnRlcmZhY2UpLmhlYWRlcn0gaW5zdGVhZCAqL1xyXG4gICAgbGFiZWxzPzogTGF5b3V0Q29uZmlnLkxhYmVscztcclxuICAgIGhlYWRlcj86IExheW91dENvbmZpZy5IZWFkZXI7XHJcbn1cclxuXHJcbi8qKiBVc2UgdG8gc3BlY2lmeSBMYXlvdXRDb25maWcgd2l0aCBkZWZhdWx0cyBvciBkZXNlcmlhbGlzZSBhIExheW91dENvbmZpZy5cclxuICogRGVzZXJpYWxpc2F0aW9uIHdpbGwgaGFuZGxlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxyXG4gKiBOb3RlIHRoYXQgTGF5b3V0Q29uZmlnIHNob3VsZCBiZSB1c2VkIGZvciBzZXJpYWxpc2F0aW9uIChub3QgTGF5b3V0Q29uZmlnKVxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIExheW91dENvbmZpZyB7XHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2UgJHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnNob3d9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBoYXNIZWFkZXJzPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdHJ1ZSwgdGhlIHVzZXIgY2FuIGRyYWcgY29tcG9uZW50cyBmcm9tIG9uZSB3aW5kb3cgdG8gYW5vdGhlci5cclxuICAgICAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZHJhZ0JldHdlZW5XaW5kb3dzPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdHJ1ZSwgdGhlIHVzZXIgY2FuIGRyYWcgYW5kIGRyb3AgY29tcG9uZW50cyBvdXRzaWRlIHRoZWlyIGNvbnRhaW5pbmcgd2luZG93LCBjcmVhdGluZyBhIG5ldyBwb3BvdXQgd2luZG93LlxyXG4gICAgICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAgICAgKi9cclxuICAgICAgICBkcmFnVG9OZXdXaW5kb3c/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0cnVlLCB0aGUgdXNlciBjYW4gcmUtYXJyYW5nZSB0aGUgbGF5b3V0IGJ5IGRyYWdnaW5nIGl0ZW1zIGJ5IHRoZWlyIHRhYnMgdG8gdGhlIGRlc2lyZWQgbG9jYXRpb24uXHJcbiAgICAgICAgICogQ2FuIGJlIG92ZXJyaWRkZW4gYnkgSXRlbUNvbmZpZy5yZW9yZGVyRW5hYmxlZCBmb3Igc3BlY2lmaWMgSXRlbUNvbmZpZ3NcclxuICAgICAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmVvcmRlckVuYWJsZWQ/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZWNpZGVzIHdoYXQgd2lsbCBiZSBvcGVuZWQgaW4gYSBuZXcgd2luZG93IGlmIHRoZSB1c2VyIGNsaWNrcyB0aGUgcG9wb3V0IGljb24uIElmIHRydWUgdGhlIGVudGlyZSBzdGFjayB3aWxsXHJcbiAgICAgICAgICogYmUgdHJhbnNmZXJyZWQgdG8gdGhlIG5ldyB3aW5kb3csIGlmIGZhbHNlIG9ubHkgdGhlIGFjdGl2ZSBjb21wb25lbnQgd2lsbCBiZSBvcGVuZWQuXHJcbiAgICAgICAgICogRGVmYXVsdDogZmFsc2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBwb3BvdXRXaG9sZVN0YWNrPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIGFuIGVycm9yIGlzIHRocm93biB3aGVuIGEgcG9wb3V0IGlzIGJsb2NrZWQgYnkgdGhlIGJyb3dzZXIgKGUuZy4gYnkgb3BlbmluZyBpdCBwcm9ncmFtbWF0aWNhbGx5KS5cclxuICAgICAgICAgKiBJZiBmYWxzZSwgdGhlIHBvcG91dCBjYWxsIHdpbGwgZmFpbCBzaWxlbnRseS5cclxuICAgICAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIGFsbCBwb3BvdXRzIHNob3VsZCBiZSBjbG9zZWQgd2hlbiB0aGUgcGFnZSB0aGF0IGNyZWF0ZWQgdGhlbSBpcyBjbG9zZWQuIFBvcG91dHMgZG9uJ3QgaGF2ZSBhXHJcbiAgICAgICAgICogc3Ryb25nIGRlcGVuZGVuY3kgb24gdGhlaXIgcGFyZW50IGFuZCBjYW4gZXhpc3Qgb24gdGhlaXIgb3duLCBidXQgY2FuIGJlIHF1aXRlIGFubm95aW5nIHRvIGNsb3NlIGJ5IGhhbmQuIEluXHJcbiAgICAgICAgICogYWRkaXRpb24sIGFueSBjaGFuZ2VzIG1hZGUgdG8gcG9wb3V0cyB3b24ndCBiZSBzdG9yZWQgYWZ0ZXIgdGhlIHBhcmVudCBpcyBjbG9zZWQuXHJcbiAgICAgICAgICogRGVmYXVsdDogdHJ1ZVxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xvc2VQb3BvdXRzT25VbmxvYWQ/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIHBvcG91dCBpY29uIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlci1iYXIuXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnBvcG91dH0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3dQb3BvdXRJY29uPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIHRoZSBtYXhpbWlzZSBpY29uIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlci1iYXIuXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLm1heGltaXNlfSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd01heGltaXNlSWNvbj86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyBpZiB0aGUgY2xvc2UgaWNvbiBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBoZWFkZXItYmFyLlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5jbG9zZX0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3dDbG9zZUljb24/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgUmVzcG9uc2l2ZSBNb2RlIChtb3JlIGluZm8gbmVlZGVkKS5cclxuICAgICAgICAgKiBEZWZhdWx0OiBub25lXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmVzcG9uc2l2ZU1vZGU/OiBSZXNwb25zaXZlTW9kZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIE1heGltdW0gcGl4ZWwgb3ZlcmxhcCBwZXIgdGFiLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0YWJPdmVybGFwQWxsb3dhbmNlPzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAgICAgKi9cclxuICAgICAgICByZW9yZGVyT25UYWJNZW51Q2xpY2s/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZWZhdWx0OiAxMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRhYkNvbnRyb2xPZmZzZXQ/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBvcCBpbiBlbGVtZW50cyB3aGVuIGNsb3NpbmcgYSBwb3BvdXQgd2luZG93LlxyXG4gICAgICAgICAqIERlZmF1bHQ6IGZhbHNlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcG9wSW5PbkNsb3NlPzogYm9vbGVhbjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIFNldHRpbmdzIHtcclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShzZXR0aW5nczogU2V0dGluZ3MgfCB1bmRlZmluZWQpOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncyB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgICAgICBkcmFnQmV0d2VlbldpbmRvd3M6IHNldHRpbmdzPy5kcmFnQmV0d2VlbldpbmRvd3MgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMuZHJhZ0JldHdlZW5XaW5kb3dzLFxyXG4gICAgICAgICAgICAgICAgZHJhZ1RvTmV3V2luZG93OiBzZXR0aW5ncz8uZHJhZ1RvTmV3V2luZG93ID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLmRyYWdUb05ld1dpbmRvdyxcclxuICAgICAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiBzZXR0aW5ncz8ucmVvcmRlckVuYWJsZWQgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMucmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgICAgICBwb3BvdXRXaG9sZVN0YWNrOiBzZXR0aW5ncz8ucG9wb3V0V2hvbGVTdGFjayA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5wb3BvdXRXaG9sZVN0YWNrLFxyXG4gICAgICAgICAgICAgICAgYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yOiBzZXR0aW5ncz8uYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLmJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcixcclxuICAgICAgICAgICAgICAgIGNsb3NlUG9wb3V0c09uVW5sb2FkOiBzZXR0aW5ncz8uY2xvc2VQb3BvdXRzT25VbmxvYWQgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMuY2xvc2VQb3BvdXRzT25VbmxvYWQsXHJcbiAgICAgICAgICAgICAgICByZXNwb25zaXZlTW9kZTogc2V0dGluZ3M/LnJlc3BvbnNpdmVNb2RlID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLnJlc3BvbnNpdmVNb2RlLFxyXG4gICAgICAgICAgICAgICAgdGFiT3ZlcmxhcEFsbG93YW5jZTogc2V0dGluZ3M/LnRhYk92ZXJsYXBBbGxvd2FuY2UgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMudGFiT3ZlcmxhcEFsbG93YW5jZSxcclxuICAgICAgICAgICAgICAgIHJlb3JkZXJPblRhYk1lbnVDbGljazogc2V0dGluZ3M/LnJlb3JkZXJPblRhYk1lbnVDbGljayA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5yZW9yZGVyT25UYWJNZW51Q2xpY2ssXHJcbiAgICAgICAgICAgICAgICB0YWJDb250cm9sT2Zmc2V0OiBzZXR0aW5ncz8udGFiQ29udHJvbE9mZnNldCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy50YWJDb250cm9sT2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgcG9wSW5PbkNsb3NlOiBzZXR0aW5ncz8ucG9wSW5PbkNsb3NlID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLnBvcEluT25DbG9zZSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIERpbWVuc2lvbnMge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgYm9yZGVycyBiZXR3ZWVuIHRoZSBsYXlvdXQgaXRlbXMgaW4gcGl4ZWwuIFBsZWFzZSBub3RlOiBUaGUgYWN0dWFsIGRyYWdnYWJsZSBhcmVhIGlzIHdpZGVyXHJcbiAgICAgICAgICogdGhhbiB0aGUgdmlzaWJsZSBvbmUsIG1ha2luZyBpdCBzYWZlIHRvIHNldCB0aGlzIHRvIHNtYWxsIHZhbHVlcyB3aXRob3V0IGFmZmVjdGluZyB1c2FiaWxpdHkuXHJcbiAgICAgICAgICogRGVmYXVsdDogNVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGJvcmRlcldpZHRoPzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZWZhdWx0OiAxNVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGJvcmRlckdyYWJXaWR0aD86IG51bWJlcixcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1pbmltdW0gaGVpZ2h0IGFuIGl0ZW0gY2FuIGJlIHJlc2l6ZWQgdG8gKGluIHBpeGVsKS5cclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oRGltZW5zaW9uczppbnRlcmZhY2UpLmRlZmF1bHRNaW5JdGVtSGVpZ2h0fSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbWluSXRlbUhlaWdodD86IG51bWJlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1pbmltdW0gaGVpZ2h0IGFuIGl0ZW0gY2FuIGJlIHJlc2l6ZWQgdG8uXHJcbiAgICAgICAgICogRGVmYXVsdDogMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0Pzogc3RyaW5nO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWluaW11bSB3aWR0aCBhbiBpdGVtIGNhbiBiZSByZXNpemVkIHRvIChpbiBwaXhlbCkuXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKERpbWVuc2lvbnM6aW50ZXJmYWNlKS5kZWZhdWx0TWluSXRlbVdpZHRofSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbWluSXRlbVdpZHRoPzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWluaW11bSB3aWR0aCBhbiBpdGVtIGNhbiBiZSByZXNpemVkIHRvLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDEwcHhcclxuICAgICAgICAgKi9cclxuICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoPzogc3RyaW5nO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBoZWFkZXIgZWxlbWVudHMgaW4gcGl4ZWwuIFRoaXMgY2FuIGJlIGNoYW5nZWQsIGJ1dCB5b3VyIHRoZW1lJ3MgaGVhZGVyIGNzcyBuZWVkcyB0byBiZVxyXG4gICAgICAgICAqIGFkanVzdGVkIGFjY29yZGluZ2x5LlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDIwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaGVhZGVySGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGVsZW1lbnQgdGhhdCBhcHBlYXJzIHdoZW4gYW4gaXRlbSBpcyBkcmFnZ2VkIChpbiBwaXhlbCkuXHJcbiAgICAgICAgICogRGVmYXVsdDogMzAwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZHJhZ1Byb3h5V2lkdGg/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGVsZW1lbnQgdGhhdCBhcHBlYXJzIHdoZW4gYW4gaXRlbSBpcyBkcmFnZ2VkIChpbiBwaXhlbCkuXHJcbiAgICAgICAgICogRGVmYXVsdDogMjAwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0PzogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgRGltZW5zaW9ucyB7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGRpbWVuc2lvbnM6IERpbWVuc2lvbnMgfCB1bmRlZmluZWQpOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zIHtcclxuICAgICAgICAgICAgY29uc3QgeyBzaXplOiBkZWZhdWx0TWluSXRlbUhlaWdodCwgc2l6ZVVuaXQ6IGRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdCB9ID0gRGltZW5zaW9ucy5yZXNvbHZlRGVmYXVsdE1pbkl0ZW1IZWlnaHQoZGltZW5zaW9ucyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgc2l6ZTogZGVmYXVsdE1pbkl0ZW1XaWR0aCwgc2l6ZVVuaXQ6IGRlZmF1bHRNaW5JdGVtV2lkdGhVbml0IH0gPSBEaW1lbnNpb25zLnJlc29sdmVEZWZhdWx0TWluSXRlbVdpZHRoKGRpbWVuc2lvbnMpO1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogZGltZW5zaW9ucz8uYm9yZGVyV2lkdGggPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5ib3JkZXJXaWR0aCxcclxuICAgICAgICAgICAgICAgIGJvcmRlckdyYWJXaWR0aDogZGltZW5zaW9ucz8uYm9yZGVyR3JhYldpZHRoID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuYm9yZGVyR3JhYldpZHRoLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbUhlaWdodFVuaXQsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJIZWlnaHQ6IGRpbWVuc2lvbnM/LmhlYWRlckhlaWdodCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmhlYWRlckhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRyYWdQcm94eVdpZHRoOiBkaW1lbnNpb25zPy5kcmFnUHJveHlXaWR0aCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmRyYWdQcm94eVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0OiBkaW1lbnNpb25zPy5kcmFnUHJveHlIZWlnaHQgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5kcmFnUHJveHlIZWlnaHQsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKHJlc29sdmVkRGltZW5zaW9uczogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucyk6IERpbWVuc2lvbnMge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IERpbWVuc2lvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogcmVzb2x2ZWREaW1lbnNpb25zLmJvcmRlcldpZHRoLFxyXG4gICAgICAgICAgICAgICAgYm9yZGVyR3JhYldpZHRoOiByZXNvbHZlZERpbWVuc2lvbnMuYm9yZGVyR3JhYldpZHRoLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHQ6IGZvcm1hdFNpemUocmVzb2x2ZWREaW1lbnNpb25zLmRlZmF1bHRNaW5JdGVtSGVpZ2h0LCByZXNvbHZlZERpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0KSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGg6IGZvcm1hdFNpemUocmVzb2x2ZWREaW1lbnNpb25zLmRlZmF1bHRNaW5JdGVtV2lkdGgsIHJlc29sdmVkRGltZW5zaW9ucy5kZWZhdWx0TWluSXRlbVdpZHRoVW5pdCksXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJIZWlnaHQ6IHJlc29sdmVkRGltZW5zaW9ucy5oZWFkZXJIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBkcmFnUHJveHlXaWR0aDogcmVzb2x2ZWREaW1lbnNpb25zLmRyYWdQcm94eVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0OiByZXNvbHZlZERpbWVuc2lvbnMuZHJhZ1Byb3h5SGVpZ2h0LFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRNaW5JdGVtSGVpZ2h0KGRpbWVuc2lvbnM6IERpbWVuc2lvbnMgfCB1bmRlZmluZWQpOiBTaXplV2l0aFVuaXQge1xyXG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSBkaW1lbnNpb25zPy5kZWZhdWx0TWluSXRlbUhlaWdodDtcclxuICAgICAgICAgICAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmRlZmF1bHRNaW5JdGVtSGVpZ2h0LCBzaXplVW5pdDogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5kZWZhdWx0TWluSXRlbUhlaWdodFVuaXQgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVNpemUoaGVpZ2h0LCBbU2l6ZVVuaXRFbnVtLlBpeGVsXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRNaW5JdGVtV2lkdGgoZGltZW5zaW9uczogRGltZW5zaW9ucyB8IHVuZGVmaW5lZCk6IFNpemVXaXRoVW5pdCB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gZGltZW5zaW9ucz8uZGVmYXVsdE1pbkl0ZW1XaWR0aDtcclxuICAgICAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuZGVmYXVsdE1pbkl0ZW1XaWR0aCwgc2l6ZVVuaXQ6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVNpemUod2lkdGgsIFtTaXplVW5pdEVudW0uUGl4ZWxdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIExhYmVscyB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLmNsb3NlfSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xvc2U/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5tYXhpbWlzZX0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG1heGltaXNlPzogc3RyaW5nO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkubWluaW1pc2V9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBtaW5pbWlzZT86IHN0cmluZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnBvcGlufSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcG9waW4/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5wb3BvdXR9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBwb3BvdXQ/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS50YWJEcm9wZG93bn0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRhYkRyb3Bkb3duPzogc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgd2hldGhlciBoZWFkZXIgc2hvdWxkIGJlIGRpc3BsYXllZCwgYW5kIGlmIHNvLCBvbiB3aGljaCBzaWRlLlxyXG4gICAgICAgICAqIElmIGZhbHNlLCB0aGUgbGF5b3V0IHdpbGwgYmUgZGlzcGxheWVkIHdpdGggc3BsaXR0ZXJzIG9ubHkuXHJcbiAgICAgICAgICogRGVmYXVsdDogJ3RvcCdcclxuICAgICAgICAgKi9cclxuICAgICAgICBzaG93PzogZmFsc2UgfCBTaWRlO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0b29sdGlwIHRleHQgdGhhdCBhcHBlYXJzIHdoZW4gaG92ZXJpbmcgb3ZlciB0aGUgcG9wb3V0IGljb24gb3IgZmFsc2UgaWYgcG9wb3V0IGJ1dHRvbiBub3QgZGlzcGxheWVkLlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdvcGVuIGluIG5ldyB3aW5kb3cnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcG9wb3V0PzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvb2x0aXAgdGV4dCB0aGF0IGFwcGVhcnMgd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBwb3BpbiBpY29uLlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdwb3AgaW4nXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcG9waW4/OiBzdHJpbmc7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvb2x0aXAgdGV4dCB0aGF0IGFwcGVhcnMgd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBtYXhpbWlzZSBpY29uIG9yIGZhbHNlIGlmIG1heGltaXNlZCBidXR0b24gbm90IGRpc3BsYXllZC5cclxuICAgICAgICAgKiBEZWZhdWx0OiAnbWF4aW1pc2UnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbWF4aW1pc2U/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdG9vbHRpcCB0ZXh0IHRoYXQgYXBwZWFycyB3aGVuIGhvdmVyaW5nIG92ZXIgdGhlIGNsb3NlIGljb24uXHJcbiAgICAgICAgICogRGVmYXVsdDogJ2Nsb3NlJ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsb3NlPzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvb2x0aXAgdGV4dCB0aGF0IGFwcGVhcnMgd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBtaW5pbWlzZSBpY29uLlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdtaW5pbWlzZSdcclxuICAgICAgICAgKi9cclxuICAgICAgICBtaW5pbWlzZT86IHN0cmluZztcclxuICAgICAgICAvKipcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdhZGRpdGlvbmFsIHRhYnMnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGFiRHJvcGRvd24/OiBmYWxzZSB8IHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIEhlYWRlciB7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGhlYWRlcjogSGVhZGVyIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogTGF5b3V0Q29uZmlnLlNldHRpbmdzIHwgdW5kZWZpbmVkLCBsYWJlbHM6IExheW91dENvbmZpZy5MYWJlbHMgfCB1bmRlZmluZWRcclxuICAgICAgICApOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIge1xyXG4gICAgICAgICAgICBsZXQgc2hvdzogZmFsc2UgfCBTaWRlO1xyXG4gICAgICAgICAgICBpZiAoaGVhZGVyPy5zaG93ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHNob3cgPSBoZWFkZXIuc2hvdztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncyAhPT0gdW5kZWZpbmVkICYmIHNldHRpbmdzLmhhc0hlYWRlcnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3cgPSBzZXR0aW5ncy5oYXNIZWFkZXJzID8gUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnNob3cgOiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdyA9IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5zaG93O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyID0ge1xyXG4gICAgICAgICAgICAgICAgc2hvdyxcclxuICAgICAgICAgICAgICAgIHBvcG91dDogaGVhZGVyPy5wb3BvdXQgPz8gbGFiZWxzPy5wb3BvdXQgPz9cclxuICAgICAgICAgICAgICAgICAgICAoc2V0dGluZ3M/LnNob3dQb3BvdXRJY29uID09PSBmYWxzZSA/IGZhbHNlIDogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnBvcG91dCksXHJcbiAgICAgICAgICAgICAgICBwb3BpbjogaGVhZGVyPy5wb3BpbiA/PyBsYWJlbHM/LnBvcGluID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5wb3BpbixcclxuICAgICAgICAgICAgICAgIG1heGltaXNlOiBoZWFkZXI/Lm1heGltaXNlID8/IGxhYmVscz8ubWF4aW1pc2UgPz9cclxuICAgICAgICAgICAgICAgICAgICAoc2V0dGluZ3M/LnNob3dNYXhpbWlzZUljb24gPT09IGZhbHNlID8gZmFsc2UgOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMubWF4aW1pc2UpLFxyXG4gICAgICAgICAgICAgICAgY2xvc2U6IGhlYWRlcj8uY2xvc2UgPz8gbGFiZWxzPy5jbG9zZSA/P1xyXG4gICAgICAgICAgICAgICAgICAgIChzZXR0aW5ncz8uc2hvd0Nsb3NlSWNvbiA9PT0gZmFsc2UgPyBmYWxzZSA6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5jbG9zZSksXHJcbiAgICAgICAgICAgICAgICBtaW5pbWlzZTogaGVhZGVyPy5taW5pbWlzZSA/PyBsYWJlbHM/Lm1pbmltaXNlID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5taW5pbWlzZSxcclxuICAgICAgICAgICAgICAgIHRhYkRyb3Bkb3duOiBoZWFkZXI/LnRhYkRyb3Bkb3duID8/IGxhYmVscz8udGFiRHJvcGRvd24gPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnRhYkRyb3Bkb3duLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1BvcG91dChjb25maWc6IExheW91dENvbmZpZyk6IGNvbmZpZyBpcyBQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiAncGFyZW50SWQnIGluIGNvbmZpZyB8fCAnaW5kZXhJblBhcmVudCcgaW4gY29uZmlnIHx8ICd3aW5kb3cnIGluIGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShsYXlvdXRDb25maWc6IExheW91dENvbmZpZyk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBpZiAoaXNQb3BvdXQobGF5b3V0Q29uZmlnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUG9wb3V0TGF5b3V0Q29uZmlnLnJlc29sdmUobGF5b3V0Q29uZmlnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcm9vdDogUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGlmIChsYXlvdXRDb25maWcucm9vdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByb290ID0gbGF5b3V0Q29uZmlnLnJvb3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobGF5b3V0Q29uZmlnLmNvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBsYXlvdXRDb25maWcuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IGxheW91dENvbmZpZy5jb250ZW50WzBdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByb290ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJvb3Q6IFJvb3RJdGVtQ29uZmlnLnJlc29sdmUocm9vdCksXHJcbiAgICAgICAgICAgICAgICBvcGVuUG9wb3V0czogTGF5b3V0Q29uZmlnLnJlc29sdmVPcGVuUG9wb3V0cyhsYXlvdXRDb25maWcub3BlblBvcG91dHMpLFxyXG4gICAgICAgICAgICAgICAgZGltZW5zaW9uczogTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMucmVzb2x2ZShsYXlvdXRDb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nczogTGF5b3V0Q29uZmlnLlNldHRpbmdzLnJlc29sdmUobGF5b3V0Q29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogTGF5b3V0Q29uZmlnLkhlYWRlci5yZXNvbHZlKGxheW91dENvbmZpZy5oZWFkZXIsIGxheW91dENvbmZpZy5zZXR0aW5ncywgbGF5b3V0Q29uZmlnLmxhYmVscyksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZChjb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnKTogTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgcm9vdDogUm9vdEl0ZW1Db25maWcuZnJvbVJlc29sdmVkT3JVbmRlZmluZWQoY29uZmlnLnJvb3QpLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogUG9wb3V0TGF5b3V0Q29uZmlnLmZyb21SZXNvbHZlZEFycmF5KGNvbmZpZy5vcGVuUG9wb3V0cyksXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5jcmVhdGVDb3B5KGNvbmZpZy5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IExheW91dENvbmZpZy5EaW1lbnNpb25zLmZyb21SZXNvbHZlZChjb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmNyZWF0ZUNvcHkoY29uZmlnLmhlYWRlciksXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1Jlc29sdmVkKGNvbmZpZ09yUmVzb2x2ZWRDb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHwgTGF5b3V0Q29uZmlnKTogY29uZmlnT3JSZXNvbHZlZENvbmZpZyBpcyBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gY29uZmlnT3JSZXNvbHZlZENvbmZpZyBhcyBSZXNvbHZlZExheW91dENvbmZpZztcclxuICAgICAgICByZXR1cm4gY29uZmlnLnJlc29sdmVkICE9PSB1bmRlZmluZWQgJiYgKGNvbmZpZy5yZXNvbHZlZCA9PT0gdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPcGVuUG9wb3V0cyhwb3BvdXRDb25maWdzOiBQb3BvdXRMYXlvdXRDb25maWdbXSB8IHVuZGVmaW5lZCk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW10ge1xyXG4gICAgICAgIGlmIChwb3BvdXRDb25maWdzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gcG9wb3V0Q29uZmlncy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZFBvcG91dExheW91dENvbmZpZz4oY291bnQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IFBvcG91dExheW91dENvbmZpZy5yZXNvbHZlKHBvcG91dENvbmZpZ3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBvcG91dExheW91dENvbmZpZyBleHRlbmRzIExheW91dENvbmZpZyB7XHJcbiAgICAvKiogVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRoZSBpdGVtIHdpbGwgYmUgYXBwZW5kZWQgdG8gb24gcG9wSW5cclxuICAgICogSWYgbnVsbCwgYXBwZW5kIHRvIHRvcG1vc3QgbGF5b3V0IGVsZW1lbnRcclxuICAgICovXHJcbiAgICBwYXJlbnRJZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBUaGUgcG9zaXRpb24gb2YgdGhpcyBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50XHJcbiAgICAqIElmIG51bGwsIHBvc2l0aW9uIGlzIGxhc3RcclxuICAgICovXHJcbiAgICBpbmRleEluUGFyZW50OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzppbnRlcmZhY2UpLndpbmRvd30gKi9cclxuICAgIGRpbWVuc2lvbnM6IFBvcG91dExheW91dENvbmZpZy5EaW1lbnNpb25zIHwgdW5kZWZpbmVkOyAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuICAgIHdpbmRvdzogUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdyB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgLy8gUHJldmlvdXMgdmVyc2lvbnMga2VwdCB3aW5kb3cgaW5mb3JtYXRpb24gaW4gRGltZW5zaW9ucyBrZXkuICBPbmx5IHVzZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChQb3BvdXRMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oV2luZG93OmludGVyZmFjZSl9ICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIERpbWVuc2lvbnMgZXh0ZW5kcyBMYXlvdXRDb25maWcuRGltZW5zaW9ucyB7XHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzpuYW1lc3BhY2UpLihXaW5kb3c6aW50ZXJmYWNlKS53aWR0aH0gKi9cclxuICAgICAgICB3aWR0aD86IG51bWJlciB8IG51bGwsXHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzpuYW1lc3BhY2UpLihXaW5kb3c6aW50ZXJmYWNlKS5oZWlnaHR9ICovXHJcbiAgICAgICAgaGVpZ2h0PzogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUG9wb3V0TGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKFdpbmRvdzppbnRlcmZhY2UpLmxlZnR9ICovXHJcbiAgICAgICAgbGVmdD86IG51bWJlciB8IG51bGwsXHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzpuYW1lc3BhY2UpLihXaW5kb3c6aW50ZXJmYWNlKS50b3B9ICovXHJcbiAgICAgICAgdG9wPzogbnVtYmVyIHwgbnVsbCxcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICAgICAgd2lkdGg/OiBudW1iZXIsXHJcbiAgICAgICAgaGVpZ2h0PzogbnVtYmVyLFxyXG4gICAgICAgIGxlZnQ/OiBudW1iZXIsXHJcbiAgICAgICAgdG9wPzogbnVtYmVyLFxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgV2luZG93IHtcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUod2luZG93OiBXaW5kb3cgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMgfCB1bmRlZmluZWQpOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3dcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQ6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdztcclxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdHMgPSBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cuZGVmYXVsdHM7XHJcbiAgICAgICAgICAgIGlmICh3aW5kb3cgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aW5kb3cud2lkdGggPz8gZGVmYXVsdHMud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaGVpZ2h0ID8/IGRlZmF1bHRzLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiB3aW5kb3cubGVmdCA/PyBkZWZhdWx0cy5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogd2luZG93LnRvcCA/PyBkZWZhdWx0cy50b3AsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGRpbWVuc2lvbnM/LndpZHRoID8/IGRlZmF1bHRzLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogZGltZW5zaW9ucz8uaGVpZ2h0ID8/IGRlZmF1bHRzLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBkaW1lbnNpb25zPy5sZWZ0ID8/IGRlZmF1bHRzLmxlZnQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBkaW1lbnNpb25zPy50b3AgPz8gZGVmYXVsdHMudG9wLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZChyZXNvbHZlZFdpbmRvdzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93KTogV2luZG93IHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBXaW5kb3cgPSB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDogcmVzb2x2ZWRXaW5kb3cud2lkdGggPT09IG51bGwgPyB1bmRlZmluZWQgOiByZXNvbHZlZFdpbmRvdy53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogcmVzb2x2ZWRXaW5kb3cuaGVpZ2h0ID09PSBudWxsID8gdW5kZWZpbmVkIDogcmVzb2x2ZWRXaW5kb3cuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgbGVmdDogcmVzb2x2ZWRXaW5kb3cubGVmdCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJlc29sdmVkV2luZG93LmxlZnQsXHJcbiAgICAgICAgICAgICAgICB0b3A6IHJlc29sdmVkV2luZG93LnRvcCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJlc29sdmVkV2luZG93LnRvcCxcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUocG9wb3V0Q29uZmlnOiBQb3BvdXRMYXlvdXRDb25maWcpOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAgICAgbGV0IHJvb3Q6IFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChwb3BvdXRDb25maWcucm9vdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJvb3QgPSBwb3BvdXRDb25maWcucm9vdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocG9wb3V0Q29uZmlnLmNvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBwb3BvdXRDb25maWcuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICByb290ID0gcG9wb3V0Q29uZmlnLmNvbnRlbnRbMF07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByb290ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb25maWc6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICByb290OiBSb290SXRlbUNvbmZpZy5yZXNvbHZlKHJvb3QpLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogTGF5b3V0Q29uZmlnLnJlc29sdmVPcGVuUG9wb3V0cyhwb3BvdXRDb25maWcub3BlblBvcG91dHMpLFxyXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBMYXlvdXRDb25maWcuRGltZW5zaW9ucy5yZXNvbHZlKHBvcG91dENvbmZpZy5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IExheW91dENvbmZpZy5TZXR0aW5ncy5yZXNvbHZlKHBvcG91dENvbmZpZy5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgIGhlYWRlcjogTGF5b3V0Q29uZmlnLkhlYWRlci5yZXNvbHZlKHBvcG91dENvbmZpZy5oZWFkZXIsIHBvcG91dENvbmZpZy5zZXR0aW5ncywgcG9wb3V0Q29uZmlnLmxhYmVscyksXHJcbiAgICAgICAgICAgIHBhcmVudElkOiBwb3BvdXRDb25maWcucGFyZW50SWQgPz8gbnVsbCxcclxuICAgICAgICAgICAgaW5kZXhJblBhcmVudDogcG9wb3V0Q29uZmlnLmluZGV4SW5QYXJlbnQgPz8gbnVsbCxcclxuICAgICAgICAgICAgd2luZG93OiBQb3BvdXRMYXlvdXRDb25maWcuV2luZG93LnJlc29sdmUocG9wb3V0Q29uZmlnLndpbmRvdywgcG9wb3V0Q29uZmlnLmRpbWVuc2lvbnMpLFxyXG4gICAgICAgICAgICByZXNvbHZlZDogdHJ1ZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyk6IFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBQb3BvdXRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IFJvb3RJdGVtQ29uZmlnLmZyb21SZXNvbHZlZE9yVW5kZWZpbmVkKHJlc29sdmVkQ29uZmlnLnJvb3QpLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogZnJvbVJlc29sdmVkQXJyYXkocmVzb2x2ZWRDb25maWcub3BlblBvcG91dHMpLFxyXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBMYXlvdXRDb25maWcuRGltZW5zaW9ucy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5jcmVhdGVDb3B5KHJlc29sdmVkQ29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShyZXNvbHZlZENvbmZpZy5oZWFkZXIpLFxyXG4gICAgICAgICAgICBwYXJlbnRJZDogcmVzb2x2ZWRDb25maWcucGFyZW50SWQsXHJcbiAgICAgICAgICAgIGluZGV4SW5QYXJlbnQ6IHJlc29sdmVkQ29uZmlnLmluZGV4SW5QYXJlbnQsXHJcbiAgICAgICAgICAgIHdpbmRvdzogUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWcud2luZG93KSxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZEFycmF5KHJlc29sdmVkQXJyYXk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW10pOiBQb3BvdXRMYXlvdXRDb25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRPcGVuUG9wb3V0Q291bnQgPSByZXNvbHZlZEFycmF5Lmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UG9wb3V0TGF5b3V0Q29uZmlnPihyZXNvbHZlZE9wZW5Qb3BvdXRDb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvbHZlZE9wZW5Qb3BvdXRDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkT3BlblBvcG91dCA9IHJlc29sdmVkQXJyYXlbaV07XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IFBvcG91dExheW91dENvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRPcGVuUG9wb3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBTaXplV2l0aFVuaXQge1xyXG4gICAgc2l6ZTogbnVtYmVyO1xyXG4gICAgc2l6ZVVuaXQ6IFNpemVVbml0RW51bTtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFVuZGVmaW5hYmxlU2l6ZVdpdGhVbml0IHtcclxuICAgIHNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICAgIHNpemVVbml0OiBTaXplVW5pdEVudW07XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2l6ZShzaXplU3RyaW5nOiBzdHJpbmcsIGFsbG93YWJsZVNpemVVbml0czogcmVhZG9ubHkgU2l6ZVVuaXRFbnVtW10pOiBTaXplV2l0aFVuaXQge1xyXG4gICAgY29uc3QgeyBudW1lcmljUGFydDogZGlnaXRzUGFydCwgZmlyc3ROb25OdW1lcmljQ2hhclBhcnQ6IGZpcnN0Tm9uRGlnaXRQYXJ0IH0gPSBzcGxpdFN0cmluZ0F0Rmlyc3ROb25OdW1lcmljQ2hhcihzaXplU3RyaW5nKTtcclxuICAgIGNvbnN0IHNpemUgPSBOdW1iZXIucGFyc2VJbnQoZGlnaXRzUGFydCwgMTApO1xyXG4gICAgaWYgKGlzTmFOKHNpemUpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuSW52YWxpZE51bWJlclBhcnRJblNpemVTdHJpbmddfTogJHtzaXplU3RyaW5nfWApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBzaXplVW5pdCA9IFNpemVVbml0RW51bS50cnlQYXJzZShmaXJzdE5vbkRpZ2l0UGFydCk7XHJcbiAgICAgICAgaWYgKHNpemVVbml0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuVW5rbm93blVuaXRJblNpemVTdHJpbmddfTogJHtzaXplU3RyaW5nfWApXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFhbGxvd2FibGVTaXplVW5pdHMuaW5jbHVkZXMoc2l6ZVVuaXQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5VbnN1cHBvcnRlZFVuaXRJblNpemVTdHJpbmddfTogJHtzaXplU3RyaW5nfWApXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplLCBzaXplVW5pdCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTaXplKHNpemU6IG51bWJlciwgc2l6ZVVuaXQ6IFNpemVVbml0RW51bSkge1xyXG4gICAgcmV0dXJuIHNpemUudG9TdHJpbmcoMTApICsgU2l6ZVVuaXRFbnVtLmZvcm1hdChzaXplVW5pdCk7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFVuZGVmaW5hYmxlU2l6ZShzaXplOiBudW1iZXJ8IHVuZGVmaW5lZCwgc2l6ZVVuaXQ6IFNpemVVbml0RW51bSkge1xyXG4gICAgaWYgKHNpemUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBzaXplLnRvU3RyaW5nKDEwKSArIFNpemVVbml0RW51bS5mb3JtYXQoc2l6ZVVuaXQpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyBAZGVwcmVjYXRlZCAtIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzppbnRlcmZhY2UpfSAqL1xyXG5leHBvcnQgdHlwZSBDb25maWcgPSBMYXlvdXRDb25maWc7XHJcbiIsImltcG9ydCB7IEFzc2VydEVycm9yLCBVbnJlYWNoYWJsZUNhc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbmZpZ01pbmlmaWVyIH0gZnJvbSAnLi4vdXRpbHMvY29uZmlnLW1pbmlmaWVyJztcclxuaW1wb3J0IHsgSXRlbVR5cGUsIEpzb25WYWx1ZSwgUmVzcG9uc2l2ZU1vZGUsIFNpZGUsIFNpemVVbml0RW51bSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZGVlcEV4dGVuZFZhbHVlIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgLy8gc2VlIEl0ZW1Db25maWcgZm9yIGNvbW1lbnRzXHJcbiAgICByZWFkb25seSB0eXBlOiBJdGVtVHlwZTtcclxuICAgIHJlYWRvbmx5IGNvbnRlbnQ6IHJlYWRvbmx5IFJlc29sdmVkSXRlbUNvbmZpZ1tdO1xyXG4gICAgcmVhZG9ubHkgc2l6ZTogbnVtYmVyO1xyXG4gICAgcmVhZG9ubHkgc2l6ZVVuaXQ6IFNpemVVbml0RW51bTtcclxuICAgIHJlYWRvbmx5IG1pblNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICAgIHJlYWRvbmx5IG1pblNpemVVbml0OiBTaXplVW5pdEVudW07XHJcbiAgICAvLyBpZCBubyBsb25nZXIgc3BlY2lmaWVzIHdoZXRoZXIgYW4gSXRlbSBpcyBtYXhpbWlzZWQuICBUaGlzIGlzIG5vdyBkb25lIGJ5IEhlYWRlckl0ZW1Db25maWcubWF4aW1pc2VkXHJcbiAgICByZWFkb25seSBpZDogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgaXNDbG9zYWJsZTogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBSZXNvbHZlZEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgdHlwZTogSXRlbVR5cGUuZ3JvdW5kLCAvLyBub3QgcmVhbGx5IGRlZmF1bHQgYnV0IG5lZWQgc29tZXRoaW5nXHJcbiAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgc2l6ZTogMSxcclxuICAgICAgICBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLkZyYWN0aW9uYWwsXHJcbiAgICAgICAgbWluU2l6ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgIG1pblNpemVVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwsXHJcbiAgICAgICAgaWQ6ICcnLFxyXG4gICAgICAgIGlzQ2xvc2FibGU6IHRydWUsXHJcbiAgICB9IGFzIGNvbnN0O1xyXG5cclxuICAgIC8qKiBDcmVhdGVzIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgUmVzb2x2ZWRJdGVtQ29uZmlnIHVzaW5nIGFuIGFsdGVybmF0aXZlIGNvbnRlbnQgaWYgc3BlY2lmaWVkICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogUmVzb2x2ZWRJdGVtQ29uZmlnLCBjb250ZW50PzogUmVzb2x2ZWRJdGVtQ29uZmlnW10pOiBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAob3JpZ2luYWwudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWwgYXMgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCBhcyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWdbXSk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWwgYXMgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcsIGNvbnRlbnQgYXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10pO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWwgYXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTtcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0NJQ0M5MTM1NCcsIG9yaWdpbmFsLnR5cGUsICdJbnZhbGlkIENvbmZpZyBJdGVtIHR5cGUgc3BlY2lmaWVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0KHR5cGU6IEl0ZW1UeXBlKTogUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0NJQ0NEUjkxNTYyJyk7IC8vIEdldCBkZWZhdWx0IHJvb3QgZnJvbSBMYXlvdXRDb25maWdcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQodHlwZSk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdDSUNDREQ5MTU2MycsIHR5cGUsICdJbnZhbGlkIENvbmZpZyBJdGVtIHR5cGUgc3BlY2lmaWVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudEl0ZW0oaXRlbUNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBpdGVtQ29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLmNvbXBvbmVudDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNTdGFja0l0ZW0oaXRlbUNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1Db25maWcudHlwZSA9PT0gSXRlbVR5cGUuc3RhY2s7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzR3JvdW5kSXRlbShpdGVtQ29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIFJlc29sdmVkR3JvdW5kSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1Db25maWcudHlwZSA9PT0gSXRlbVR5cGUuZ3JvdW5kO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBTdGFjayBvciBDb21wb25lbnRcclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZyBleHRlbmRzIFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZDsgLy8gdW5kZWZpbmVkIG1lYW5zIGdldCBoZWFkZXIgc2V0dGluZ3MgZnJvbSBMYXlvdXRDb25maWdcclxuICAgIHJlYWRvbmx5IG1heGltaXNlZDogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdE1heGltaXNlZCA9IGZhbHNlO1xyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyIHtcclxuICAgICAgICAvLyB1bmRlZmluZWQgbWVhbnMgZ2V0IHByb3BlcnR5IHZhbHVlIGZyb20gTGF5b3V0Q29uZmlnXHJcbiAgICAgICAgcmVhZG9ubHkgc2hvdzogZmFsc2UgfCBTaWRlIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHJlYWRvbmx5IHBvcG91dDogZmFsc2UgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmVhZG9ubHkgbWF4aW1pc2U6IGZhbHNlIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHJlYWRvbmx5IGNsb3NlOiBmYWxzZSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICByZWFkb25seSBtaW5pbWlzZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHJlYWRvbmx5IHRhYkRyb3Bkb3duOiBmYWxzZSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIEhlYWRlciB7XHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IEhlYWRlciB8IHVuZGVmaW5lZCwgc2hvdz86IGZhbHNlIHwgU2lkZSk6IEhlYWRlciB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93OiBzaG93ID8/IG9yaWdpbmFsLnNob3csXHJcbiAgICAgICAgICAgICAgICAgICAgcG9wb3V0OiBvcmlnaW5hbC5wb3BvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2U6IG9yaWdpbmFsLmNsb3NlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heGltaXNlOiBvcmlnaW5hbC5tYXhpbWlzZSxcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbWlzZTogb3JpZ2luYWwubWluaW1pc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFiRHJvcGRvd246IG9yaWdpbmFsLnRhYkRyb3Bkb3duLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcge1xyXG4gICAgcmVhZG9ubHkgdHlwZTogJ3N0YWNrJztcclxuICAgIHJlYWRvbmx5IGNvbnRlbnQ6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdO1xyXG4gICAgLyoqIFRoZSBpbmRleCBvZiB0aGUgYWN0aXZlIGl0ZW0gaW4gdGhlIFN0YWNrLiAgT25seSB1bmRlZmluZWQgaWYgdGhlIFN0YWNrIGlzIGVtcHR5LiAqL1xyXG4gICAgcmVhZG9ubHkgYWN0aXZlSXRlbUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRBY3RpdmVJdGVtSW5kZXggPSAwO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZywgY29udGVudD86IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdKTogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IG9yaWdpbmFsLnR5cGUsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQgIT09IHVuZGVmaW5lZCA/IGNvcHlDb250ZW50KGNvbnRlbnQpIDogY29weUNvbnRlbnQob3JpZ2luYWwuY29udGVudCksXHJcbiAgICAgICAgICAgIHNpemU6IG9yaWdpbmFsLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiBvcmlnaW5hbC5zaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZTogb3JpZ2luYWwubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IG9yaWdpbmFsLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogb3JpZ2luYWwuaWQsXHJcbiAgICAgICAgICAgIG1heGltaXNlZDogb3JpZ2luYWwubWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBvcmlnaW5hbC5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXg6IG9yaWdpbmFsLmFjdGl2ZUl0ZW1JbmRleCxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShvcmlnaW5hbC5oZWFkZXIpLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb3B5Q29udGVudChvcmlnaW5hbDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10pOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBvcmlnaW5hbC5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBSZXNvbHZlZEl0ZW1Db25maWcuY3JlYXRlQ29weShvcmlnaW5hbFtpXSkgYXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0KCk6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgICAgIHNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5kZWZhdWx0TWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4OiBkZWZhdWx0QWN0aXZlSXRlbUluZGV4LFxyXG4gICAgICAgICAgICBoZWFkZXI6IHVuZGVmaW5lZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgZXh0ZW5kcyBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICAvLyBzZWUgQ29tcG9uZW50SXRlbUNvbmZpZyBmb3IgY29tbWVudHNcclxuICAgIHJlYWRvbmx5IHR5cGU6ICdjb21wb25lbnQnO1xyXG4gICAgcmVhZG9ubHkgY29udGVudDogW107XHJcbiAgICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgcmVvcmRlckVuYWJsZWQ6IGJvb2xlYW47IC8vIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBMYXlvdXRDb25maWcucmVvcmRlckVuYWJsZWQuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgYXMgc3BlY2lmaWVkIGluIGxheW91dC5yZWdpc3RlckNvbXBvbmVudC4gTWFuZGF0b3J5IGlmIHR5cGUgaXMgJ2NvbXBvbmVudCcuXHJcbiAgICAgKi9cclxuICAgIHJlYWRvbmx5IGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZTtcclxuICAgIHJlYWRvbmx5IGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdFJlb3JkZXJFbmFibGVkID0gdHJ1ZTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNvbXBvbmVudFR5cGVOYW1lKGl0ZW1Db25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50VHlwZSA9IGl0ZW1Db25maWcuY29tcG9uZW50VHlwZTtcclxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudFR5cGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUeXBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBvcmlnaW5hbC50eXBlLFxyXG4gICAgICAgICAgICBjb250ZW50OiBbXSxcclxuICAgICAgICAgICAgc2l6ZTogb3JpZ2luYWwuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IG9yaWdpbmFsLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBvcmlnaW5hbC5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogb3JpZ2luYWwubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBvcmlnaW5hbC5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiBvcmlnaW5hbC5tYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IG9yaWdpbmFsLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiBvcmlnaW5hbC5yZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgdGl0bGU6IG9yaWdpbmFsLnRpdGxlLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KG9yaWdpbmFsLmhlYWRlciksXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGU6IG9yaWdpbmFsLmNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiBkZWVwRXh0ZW5kVmFsdWUodW5kZWZpbmVkLCBvcmlnaW5hbC5jb21wb25lbnRTdGF0ZSkgYXMgSnNvblZhbHVlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSA9ICcnLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGUgPSAnJyk6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLmNvbXBvbmVudCxcclxuICAgICAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgICAgIHNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5kZWZhdWx0TWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5kZWZhdWx0UmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgICBoZWFkZXI6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNvcHlDb21wb25lbnRUeXBlKGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSB7XHJcbiAgICAgICAgcmV0dXJuIGRlZXBFeHRlbmRWYWx1ZSh7fSwgY29tcG9uZW50VHlwZSkgYXMgSnNvblZhbHVlXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBCYXNlIGZvciBSb290IG9yIFJvd09yQ29sdW1uIEl0ZW1Db25maWdzXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgZXh0ZW5kcyBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgcmVhZG9ubHkgdHlwZTogJ3JvdycgfCAnY29sdW1uJztcclxuICAgIC8qKiBOb3RlIHRoYXQgUm93T3JDb2x1bW4gUmVzb2x2ZWRJdGVtQ29uZmlnIGNvbnRlbnRzLCBjYW4gY29udGFpbiBDb21wb25lbnRJdGVtIGl0ZW1Db25maWdzLiAgSG93ZXZlclxyXG4gICAgICogd2hlbiBDb250ZW50SXRlbXMgYXJlIGNyZWF0ZWQsIHRoZXNlIENvbXBvbmVudEl0ZW0gaXRlbUNvbmZpZ3Mgd2lsbCBjcmVhdGUgYSBTdGFjayB3aXRoIGEgY2hpbGQgQ29tcG9uZW50SXRlbS5cclxuICAgICAqL1xyXG4gICAgcmVhZG9ubHkgY29udGVudDogcmVhZG9ubHkgKFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgfCBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpW107XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IHR5cGUgQ2hpbGRJdGVtQ29uZmlnID0gUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB8IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZztcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNDaGlsZEl0ZW1Db25maWcoaXRlbUNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBDaGlsZEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAoaXRlbUNvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0NST0NPU1BDSUNJQzEzNjg3JywgaXRlbUNvbmZpZy50eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLCBjb250ZW50PzogQ2hpbGRJdGVtQ29uZmlnW10pOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogb3JpZ2luYWwudHlwZSxcclxuICAgICAgICAgICAgY29udGVudDogY29udGVudCAhPT0gdW5kZWZpbmVkID8gY29weUNvbnRlbnQoY29udGVudCkgOiBjb3B5Q29udGVudChvcmlnaW5hbC5jb250ZW50KSxcclxuICAgICAgICAgICAgc2l6ZTogb3JpZ2luYWwuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IG9yaWdpbmFsLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBvcmlnaW5hbC5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogb3JpZ2luYWwubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBvcmlnaW5hbC5pZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogb3JpZ2luYWwuaXNDbG9zYWJsZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY29weUNvbnRlbnQob3JpZ2luYWw6IHJlYWRvbmx5IENoaWxkSXRlbUNvbmZpZ1tdKTogQ2hpbGRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gb3JpZ2luYWwubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxDaGlsZEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gUmVzb2x2ZWRJdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWxbaV0pIGFzIENoaWxkSXRlbUNvbmZpZztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdCh0eXBlOiAncm93JyB8ICdjb2x1bW4nKTogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtdLFxyXG4gICAgICAgICAgICBzaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogUm9vdEl0ZW1Db25maWcgaXMgdGhlIHRvcG1vc3QgUmVzb2x2ZWRJdGVtQ29uZmlnIHNwZWNpZmllZCBieSB0aGUgdXNlci5cclxuICogTm90ZSB0aGF0IGl0IGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIGNvbnRlbnRJdGVtLiAgSXQgc3BlY2lmaWVzIHRoZSBvbmUgYW5kIG9ubHkgY2hpbGQgb2YgdGhlIEdyb3VuZCBDb250ZW50SXRlbVxyXG4gKiBOb3RlIHRoYXQgUm9vdEl0ZW1Db25maWcgY2FuIGJlIGFuIENvbXBvbmVudEl0ZW0gaXRlbUNvbmZpZy4gIEhvd2V2ZXIgd2hlbiB0aGUgR3JvdW5kIENvbnRlbnRJdGVtJ3MgY2hpbGQgaXMgY3JlYXRlZFxyXG4gKiBhIENvbXBvbmVudEl0ZW0gaXRlbUNvbmZpZyB3aWxsIGNyZWF0ZSBhIFN0YWNrIHdpdGggYSBjaGlsZCBDb21wb25lbnRJdGVtLlxyXG4gKiBAcHVibGljXHJcbiovXHJcbmV4cG9ydCB0eXBlIFJlc29sdmVkUm9vdEl0ZW1Db25maWcgPSBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIHwgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KGNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyk6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBSZXNvbHZlZEl0ZW1Db25maWcuY3JlYXRlQ29weShjb25maWcpIGFzIFJlc29sdmVkUm9vdEl0ZW1Db25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUm9vdEl0ZW1Db25maWcoaXRlbUNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHtcclxuICAgICAgICBzd2l0Y2ggKGl0ZW1Db25maWcudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuZ3JvdW5kOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdDUk9DT1NQQ0lDSUMxMzY4NycsIGl0ZW1Db25maWcudHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRHcm91bmRJdGVtQ29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgIHJlYWRvbmx5IHR5cGU6ICdncm91bmQnO1xyXG4gICAgcmVhZG9ubHkgc2l6ZTogMTAwLFxyXG4gICAgcmVhZG9ubHkgc2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QZXJjZW50LFxyXG4gICAgcmVhZG9ubHkgbWluU2l6ZTogMCxcclxuICAgIHJlYWRvbmx5IG1pblNpemVVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwsXHJcbiAgICByZWFkb25seSBpZDogJycsXHJcbiAgICByZWFkb25seSBpc0Nsb3NhYmxlOiBmYWxzZSxcclxuICAgIHJlYWRvbmx5IHRpdGxlOiAnJyxcclxuICAgIHJlYWRvbmx5IHJlb3JkZXJFbmFibGVkOiBmYWxzZSxcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkR3JvdW5kSXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlKHJvb3RJdGVtQ29uZmlnOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkKTpSZXNvbHZlZEdyb3VuZEl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSByb290SXRlbUNvbmZpZyA9PT0gdW5kZWZpbmVkID8gW10gOiBbcm9vdEl0ZW1Db25maWddO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLmdyb3VuZCxcclxuICAgICAgICAgICAgY29udGVudCxcclxuICAgICAgICAgICAgc2l6ZTogMTAwLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBlcmNlbnQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IDAsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwsXHJcbiAgICAgICAgICAgIGlkOiAnJyxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIHRpdGxlOiAnJyxcclxuICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICByZWFkb25seSByb290OiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgcmVhZG9ubHkgb3BlblBvcG91dHM6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW107XHJcbiAgICByZWFkb25seSBkaW1lbnNpb25zOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zO1xyXG4gICAgcmVhZG9ubHkgc2V0dGluZ3M6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzO1xyXG4gICAgcmVhZG9ubHkgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXI7XHJcbiAgICByZWFkb25seSByZXNvbHZlZDogdHJ1ZSxcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuICAgICAgICAvLyBzZWUgQ29uZmlnLlNldHRpbmdzIGZvciBjb21tZW50c1xyXG4gICAgICAgIHJlYWRvbmx5IGRyYWdCZXR3ZWVuV2luZG93czogYm9vbGVhbjtcclxuICAgICAgICByZWFkb25seSBkcmFnVG9OZXdXaW5kb3c6IGJvb2xlYW47XHJcbiAgICAgICAgcmVhZG9ubHkgcmVvcmRlckVuYWJsZWQ6IGJvb2xlYW47IC8vIGFsc28gaW4gUmVzb2x2ZWRJdGVtQ29uZmlnIHdoaWNoIHRha2VzIHByZWNlZGVuY2VcclxuICAgICAgICByZWFkb25seSBwb3BvdXRXaG9sZVN0YWNrOiBib29sZWFuO1xyXG4gICAgICAgIHJlYWRvbmx5IGJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcjogYm9vbGVhbjtcclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIHZlcnNpb24gMy4gKi9cclxuICAgICAgICByZWFkb25seSBjbG9zZVBvcG91dHNPblVubG9hZDogYm9vbGVhbjtcclxuICAgICAgICByZWFkb25seSByZXNwb25zaXZlTW9kZTogUmVzcG9uc2l2ZU1vZGU7XHJcbiAgICAgICAgcmVhZG9ubHkgdGFiT3ZlcmxhcEFsbG93YW5jZTogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IHJlb3JkZXJPblRhYk1lbnVDbGljazogYm9vbGVhbjtcclxuICAgICAgICByZWFkb25seSB0YWJDb250cm9sT2Zmc2V0OiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgcG9wSW5PbkNsb3NlOiBib29sZWFuO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgU2V0dGluZ3Mge1xyXG4gICAgICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0czogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgIGRyYWdCZXR3ZWVuV2luZG93czogdHJ1ZSxcclxuICAgICAgICAgICAgZHJhZ1RvTmV3V2luZG93OiB0cnVlLFxyXG4gICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgcG9wb3V0V2hvbGVTdGFjazogZmFsc2UsXHJcbiAgICAgICAgICAgIGJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcjogdHJ1ZSxcclxuICAgICAgICAgICAgY2xvc2VQb3BvdXRzT25VbmxvYWQ6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc3BvbnNpdmVNb2RlOiBSZXNwb25zaXZlTW9kZS5ub25lLCAvLyB3YXMgb25sb2FkXHJcbiAgICAgICAgICAgIHRhYk92ZXJsYXBBbGxvd2FuY2U6IDAsXHJcbiAgICAgICAgICAgIHJlb3JkZXJPblRhYk1lbnVDbGljazogdHJ1ZSxcclxuICAgICAgICAgICAgdGFiQ29udHJvbE9mZnNldDogMTAsXHJcbiAgICAgICAgICAgIHBvcEluT25DbG9zZTogZmFsc2UsXHJcbiAgICAgICAgfSBhcyBjb25zdDtcclxuXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFNldHRpbmdzKTogU2V0dGluZ3Mge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZHJhZ0JldHdlZW5XaW5kb3dzOiBvcmlnaW5hbC5kcmFnQmV0d2VlbldpbmRvd3MsXHJcbiAgICAgICAgICAgICAgICBkcmFnVG9OZXdXaW5kb3c6IG9yaWdpbmFsLmRyYWdUb05ld1dpbmRvdyxcclxuICAgICAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiBvcmlnaW5hbC5yZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgICAgIHBvcG91dFdob2xlU3RhY2s6IG9yaWdpbmFsLnBvcG91dFdob2xlU3RhY2ssXHJcbiAgICAgICAgICAgICAgICBibG9ja2VkUG9wb3V0c1Rocm93RXJyb3I6IG9yaWdpbmFsLmJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcixcclxuICAgICAgICAgICAgICAgIGNsb3NlUG9wb3V0c09uVW5sb2FkOiBvcmlnaW5hbC5jbG9zZVBvcG91dHNPblVubG9hZCxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNpdmVNb2RlOiBvcmlnaW5hbC5yZXNwb25zaXZlTW9kZSxcclxuICAgICAgICAgICAgICAgIHRhYk92ZXJsYXBBbGxvd2FuY2U6IG9yaWdpbmFsLnRhYk92ZXJsYXBBbGxvd2FuY2UsXHJcbiAgICAgICAgICAgICAgICByZW9yZGVyT25UYWJNZW51Q2xpY2s6IG9yaWdpbmFsLnJlb3JkZXJPblRhYk1lbnVDbGljayxcclxuICAgICAgICAgICAgICAgIHRhYkNvbnRyb2xPZmZzZXQ6IG9yaWdpbmFsLnRhYkNvbnRyb2xPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICBwb3BJbk9uQ2xvc2U6IG9yaWdpbmFsLnBvcEluT25DbG9zZSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIERpbWVuc2lvbnMge1xyXG4gICAgICAgIC8vIHNlZSBMYXlvdXRDb25maWcuRGltZW5zaW9ucyBmb3IgY29tbWVudHNcclxuICAgICAgICByZWFkb25seSBib3JkZXJXaWR0aDogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IGJvcmRlckdyYWJXaWR0aDogbnVtYmVyLFxyXG4gICAgICAgIHJlYWRvbmx5IGRlZmF1bHRNaW5JdGVtSGVpZ2h0OiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0OiBTaXplVW5pdEVudW07XHJcbiAgICAgICAgcmVhZG9ubHkgZGVmYXVsdE1pbkl0ZW1XaWR0aDogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IGRlZmF1bHRNaW5JdGVtV2lkdGhVbml0OiBTaXplVW5pdEVudW07XHJcbiAgICAgICAgcmVhZG9ubHkgaGVhZGVySGVpZ2h0OiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgZHJhZ1Byb3h5V2lkdGg6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBkcmFnUHJveHlIZWlnaHQ6IG51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIERpbWVuc2lvbnMge1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBEaW1lbnNpb25zKTogRGltZW5zaW9ucyB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogb3JpZ2luYWwuYm9yZGVyV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBib3JkZXJHcmFiV2lkdGg6IG9yaWdpbmFsLmJvcmRlckdyYWJXaWR0aCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0OiBvcmlnaW5hbC5kZWZhdWx0TWluSXRlbUhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdDogb3JpZ2luYWwuZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0LFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aDogb3JpZ2luYWwuZGVmYXVsdE1pbkl0ZW1XaWR0aCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGhVbml0OiBvcmlnaW5hbC5kZWZhdWx0TWluSXRlbVdpZHRoVW5pdCxcclxuICAgICAgICAgICAgICAgIGhlYWRlckhlaWdodDogb3JpZ2luYWwuaGVhZGVySGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5V2lkdGg6IG9yaWdpbmFsLmRyYWdQcm94eVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0OiBvcmlnaW5hbC5kcmFnUHJveHlIZWlnaHQsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0czogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucyA9IHtcclxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDUsXHJcbiAgICAgICAgICAgIGJvcmRlckdyYWJXaWR0aDogNSxcclxuICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdDogU2l6ZVVuaXRFbnVtLlBpeGVsLFxyXG4gICAgICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoOiAxMCxcclxuICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQ6IFNpemVVbml0RW51bS5QaXhlbCxcclxuICAgICAgICAgICAgaGVhZGVySGVpZ2h0OiAyMCxcclxuICAgICAgICAgICAgZHJhZ1Byb3h5V2lkdGg6IDMwMCxcclxuICAgICAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0OiAyMDBcclxuICAgICAgICB9IGFzIGNvbnN0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyIHtcclxuICAgICAgICByZWFkb25seSBzaG93OiBmYWxzZSB8IFNpZGU7XHJcbiAgICAgICAgcmVhZG9ubHkgcG9wb3V0OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICByZWFkb25seSBwb3Bpbjogc3RyaW5nO1xyXG4gICAgICAgIHJlYWRvbmx5IG1heGltaXNlOiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICByZWFkb25seSBtaW5pbWlzZTogc3RyaW5nO1xyXG4gICAgICAgIHJlYWRvbmx5IGNsb3NlOiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICByZWFkb25seSB0YWJEcm9wZG93bjogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBIZWFkZXIge1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBIZWFkZXIpOiBIZWFkZXIge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgc2hvdzogb3JpZ2luYWwuc2hvdyxcclxuICAgICAgICAgICAgICAgIHBvcG91dDogb3JpZ2luYWwucG9wb3V0LFxyXG4gICAgICAgICAgICAgICAgcG9waW46IG9yaWdpbmFsLnBvcGluLFxyXG4gICAgICAgICAgICAgICAgY2xvc2U6IG9yaWdpbmFsLmNsb3NlLFxyXG4gICAgICAgICAgICAgICAgbWF4aW1pc2U6IG9yaWdpbmFsLm1heGltaXNlLFxyXG4gICAgICAgICAgICAgICAgbWluaW1pc2U6IG9yaWdpbmFsLm1pbmltaXNlLFxyXG4gICAgICAgICAgICAgICAgdGFiRHJvcGRvd246IG9yaWdpbmFsLnRhYkRyb3Bkb3duLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBleHBvcnQgY29uc3QgZGVmYXVsdHM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlciA9IHtcclxuICAgICAgICAgICAgc2hvdzogU2lkZS50b3AsXHJcbiAgICAgICAgICAgIHBvcG91dDogJ29wZW4gaW4gbmV3IHdpbmRvdycsXHJcbiAgICAgICAgICAgIHBvcGluOiAnZG9jaycsXHJcbiAgICAgICAgICAgIG1heGltaXNlOiAnbWF4aW1pc2UnLFxyXG4gICAgICAgICAgICBtaW5pbWlzZTogJ21pbmltaXNlJyxcclxuICAgICAgICAgICAgY2xvc2U6ICdjbG9zZScsXHJcbiAgICAgICAgICAgIHRhYkRyb3Bkb3duOiAnYWRkaXRpb25hbCB0YWJzJ1xyXG4gICAgICAgIH0gYXMgY29uc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUG9wb3V0KGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBjb25maWcgaXMgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiAncGFyZW50SWQnIGluIGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdCgpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgcm9vdDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogW10sXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMsXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cyxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMsXHJcbiAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgaWYgKGlzUG9wb3V0KGNvbmZpZykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLmNyZWF0ZUNvcHkoY29uZmlnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkTGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgcm9vdDogY29uZmlnLnJvb3QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcuY3JlYXRlQ29weShjb25maWcucm9vdCksXHJcbiAgICAgICAgICAgICAgICBvcGVuUG9wb3V0czogUmVzb2x2ZWRMYXlvdXRDb25maWcuY29weU9wZW5Qb3BvdXRzKGNvbmZpZy5vcGVuUG9wb3V0cyksXHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nczogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuY3JlYXRlQ29weShjb25maWcuc2V0dGluZ3MpLFxyXG4gICAgICAgICAgICAgICAgZGltZW5zaW9uczogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5jcmVhdGVDb3B5KGNvbmZpZy5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmNyZWF0ZUNvcHkoY29uZmlnLmhlYWRlciksXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlZDogY29uZmlnLnJlc29sdmVkLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb3B5T3BlblBvcG91dHMob3JpZ2luYWw6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW10pOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZ1tdIHtcclxuICAgICAgICBjb25zdCBjb3VudCA9IG9yaWdpbmFsLmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWc+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuY3JlYXRlQ29weShvcmlnaW5hbFtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIEdvbGRlbkxheW91dCBjb25maWd1cmF0aW9uIG9iamVjdCBhbmRcclxuICAgICAqIHJlcGxhY2VzIGl0cyBrZXlzIGFuZCB2YWx1ZXMgcmVjdXJzaXZlbHkgd2l0aFxyXG4gICAgICogb25lIGxldHRlciBjb3VudGVycGFydHNcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIG1pbmlmeUNvbmZpZyhsYXlvdXRDb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiBDb25maWdNaW5pZmllci50cmFuc2xhdGVPYmplY3QobGF5b3V0Q29uZmlnLCB0cnVlKSBhcyBSZXNvbHZlZExheW91dENvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgY29uZmlndXJhdGlvbiBPYmplY3QgdGhhdCB3YXMgcHJldmlvdXNseSBtaW5pZmllZFxyXG4gICAgICogdXNpbmcgbWluaWZ5Q29uZmlnIGFuZCByZXR1cm5zIGl0cyBvcmlnaW5hbCB2ZXJzaW9uXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiB1bm1pbmlmeUNvbmZpZyhtaW5pZmllZENvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIENvbmZpZ01pbmlmaWVyLnRyYW5zbGF0ZU9iamVjdChtaW5pZmllZENvbmZpZywgZmFsc2UpIGFzIFJlc29sdmVkTGF5b3V0Q29uZmlnO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgcmVhZG9ubHkgcGFyZW50SWQ6IHN0cmluZyB8IG51bGw7XHJcbiAgICByZWFkb25seSBpbmRleEluUGFyZW50OiBudW1iZXIgfCBudWxsO1xyXG4gICAgcmVhZG9ubHkgd2luZG93OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3c7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBXaW5kb3cge1xyXG4gICAgICAgIHJlYWRvbmx5IHdpZHRoOiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgICByZWFkb25seSBsZWZ0OiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIHJlYWRvbmx5IHRvcDogbnVtYmVyIHwgbnVsbCxcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIFdpbmRvdyB7XHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFdpbmRvdyk6IFdpbmRvdyB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDogb3JpZ2luYWwud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IG9yaWdpbmFsLmhlaWdodCxcclxuICAgICAgICAgICAgICAgIGxlZnQ6IG9yaWdpbmFsLmxlZnQsXHJcbiAgICAgICAgICAgICAgICB0b3A6IG9yaWdpbmFsLnRvcCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cgPSB7XHJcbiAgICAgICAgICAgIHdpZHRoOiBudWxsLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IG51bGwsXHJcbiAgICAgICAgICAgIGxlZnQ6IG51bGwsXHJcbiAgICAgICAgICAgIHRvcDogbnVsbCxcclxuICAgICAgICB9IGFzIGNvbnN0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICByb290OiBvcmlnaW5hbC5yb290ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWwucm9vdCksXHJcbiAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBSZXNvbHZlZExheW91dENvbmZpZy5jb3B5T3BlblBvcG91dHMob3JpZ2luYWwub3BlblBvcG91dHMpLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuY3JlYXRlQ29weShvcmlnaW5hbC5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuY3JlYXRlQ29weShvcmlnaW5hbC5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShvcmlnaW5hbC5oZWFkZXIpLFxyXG4gICAgICAgICAgICBwYXJlbnRJZDogb3JpZ2luYWwucGFyZW50SWQsXHJcbiAgICAgICAgICAgIGluZGV4SW5QYXJlbnQ6IG9yaWdpbmFsLmluZGV4SW5QYXJlbnQsXHJcbiAgICAgICAgICAgIHdpbmRvdzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93LmNyZWF0ZUNvcHkob3JpZ2luYWwud2luZG93KSxcclxuICAgICAgICAgICAgcmVzb2x2ZWQ6IG9yaWdpbmFsLnJlc29sdmVkLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcsIEl0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnJztcclxuaW1wb3J0IHsgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4uL2NvbnRyb2xzL3RhYic7XHJcbmltcG9ydCB7IEFzc2VydEVycm9yLCBVbmV4cGVjdGVkTnVsbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb250ZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgSnNvblZhbHVlLCBMb2dpY2FsWkluZGV4LCBMb2dpY2FsWkluZGV4VG9EZWZhdWx0TWFwIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBkZWVwRXh0ZW5kLCBzZXRFbGVtZW50SGVpZ2h0LCBzZXRFbGVtZW50V2lkdGggfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50Q29udGFpbmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbXBvbmVudFR5cGU6IEpzb25WYWx1ZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2JvdW5kQ29tcG9uZW50OiBDb21wb25lbnRDb250YWluZXIuQmluZGFibGVDb21wb25lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF93aWR0aDogbnVtYmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0Nsb3NhYmxlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaW5pdGlhbFN0YXRlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zdGF0ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdmlzaWJsZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnM7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90YWI6IFRhYjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3N0YWNrTWF4aW1pc2VkID0gZmFsc2U7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9sb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4O1xyXG5cclxuICAgIHN0YXRlUmVxdWVzdEV2ZW50OiBDb21wb25lbnRDb250YWluZXIuU3RhdGVSZXF1ZXN0RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkO1xyXG4gICAgdmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50OiBDb21wb25lbnRDb250YWluZXIuVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgdmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50OiBDb21wb25lbnRDb250YWluZXIuVmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgdmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5WaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBnZXQgd2lkdGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3dpZHRoOyB9XHJcbiAgICBnZXQgaGVpZ2h0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9oZWlnaHQ7IH1cclxuICAgIGdldCBwYXJlbnQoKTogQ29tcG9uZW50SXRlbSB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoQ29tcG9uZW50Q29udGFpbmVyOmNsYXNzKS5jb21wb25lbnRUeXBlfSAqL1xyXG4gICAgZ2V0IGNvbXBvbmVudE5hbWUoKTogSnNvblZhbHVlIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudFR5cGU7IH1cclxuICAgIGdldCBjb21wb25lbnRUeXBlKCk6IEpzb25WYWx1ZSB7IHJldHVybiB0aGlzLl9jb21wb25lbnRUeXBlOyB9XHJcbiAgICBnZXQgdmlydHVhbCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWw7IH1cclxuICAgIGdldCBjb21wb25lbnQoKTogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB7IHJldHVybiB0aGlzLl9ib3VuZENvbXBvbmVudC5jb21wb25lbnQ7IH1cclxuICAgIGdldCB0YWIoKTogVGFiIHsgcmV0dXJuIHRoaXMuX3RhYjsgfVxyXG4gICAgZ2V0IHRpdGxlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9wYXJlbnQudGl0bGU7IH1cclxuICAgIGdldCBsYXlvdXRNYW5hZ2VyKCk6IExheW91dE1hbmFnZXIgeyByZXR1cm4gdGhpcy5fbGF5b3V0TWFuYWdlcjsgfVxyXG4gICAgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4geyByZXR1cm4gIXRoaXMuX3Zpc2libGU7IH1cclxuICAgIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fdmlzaWJsZTsgfVxyXG4gICAgZ2V0IHN0YXRlKCk6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9zdGF0ZTsgfVxyXG4gICAgLyoqIFJldHVybiB0aGUgaW5pdGlhbCBjb21wb25lbnQgc3RhdGUgKi9cclxuICAgIGdldCBpbml0aWFsU3RhdGUoKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2luaXRpYWxTdGF0ZTsgfVxyXG4gICAgLyoqIFRoZSBpbm5lciBET00gZWxlbWVudCB3aGVyZSB0aGUgY29udGFpbmVyJ3MgY29udGVudCBpcyBpbnRlbmRlZCB0byBsaXZlIGluICovXHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9wYXJlbnQ6IENvbXBvbmVudEl0ZW0sXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF91cGRhdGVJdGVtQ29uZmlnRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5VcGRhdGVJdGVtQ29uZmlnRXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9zaG93RXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5TaG93RXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9oaWRlRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5IaWRlRXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9mb2N1c0V2ZW50OiBDb21wb25lbnRDb250YWluZXIuRm9jdXNFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2JsdXJFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLkJsdXJFdmVudEhhbmRsZXIsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl93aWR0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gMDtcclxuICAgICAgICB0aGlzLl92aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VHlwZSA9IF9jb25maWcuY29tcG9uZW50VHlwZTtcclxuICAgICAgICB0aGlzLl9pc0Nsb3NhYmxlID0gX2NvbmZpZy5pc0Nsb3NhYmxlO1xyXG4gICAgICAgIHRoaXMuX2luaXRpYWxTdGF0ZSA9IF9jb25maWcuY29tcG9uZW50U3RhdGU7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUgPSB0aGlzLl9pbml0aWFsU3RhdGU7XHJcblxyXG4gICAgICAgIHRoaXMuX2JvdW5kQ29tcG9uZW50ID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmJpbmRDb21wb25lbnQodGhpcywgX2NvbmZpZyk7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudFBvc2l0aW9uUHJvcGVydHlGcm9tQm91bmRDb21wb25lbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVsZWFzZUNvbXBvbmVudCgpO1xyXG4gICAgICAgIHRoaXMuc3RhdGVSZXF1ZXN0RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkZXN0cm95Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKENvbXBvbmVudENvbnRhaW5lcjpjbGFzcykuZWxlbWVudCB9ICovXHJcbiAgICBnZXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhpZGVzIHRoZSBjb250YWluZXIncyBjb21wb25lbnQgaXRlbSAoYW5kIGhlbmNlLCB0aGUgY29udGFpbmVyKSBpZiBub3QgYWxyZWFkeSBoaWRkZW4uXHJcbiAgICAgKiBFbWl0cyBoaWRlIGV2ZW50IHByaW9yIHRvIGhpZGluZyB0aGUgY29udGFpbmVyLlxyXG4gICAgICovXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2hpZGVFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvd3MgdGhlIGNvbnRhaW5lcidzIGNvbXBvbmVudCBpdGVtIChhbmQgaGVuY2UsIHRoZSBjb250YWluZXIpIGlmIG5vdCB2aXNpYmxlLlxyXG4gICAgICogRW1pdHMgc2hvdyBldmVudCBwcmlvciB0byBoaWRpbmcgdGhlIGNvbnRhaW5lci5cclxuICAgICAqL1xyXG4gICAgc2hvdygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zaG93RXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvY3VzIHRoaXMgY29tcG9uZW50IGluIExheW91dC5cclxuICAgICAqL1xyXG4gICAgZm9jdXMoc3VwcHJlc3NFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZm9jdXNFdmVudChzdXBwcmVzc0V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSBmb2N1cyBmcm9tIHRoaXMgY29tcG9uZW50IGluIExheW91dC5cclxuICAgICAqL1xyXG4gICAgYmx1cihzdXBwcmVzc0V2ZW50ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9ibHVyRXZlbnQoc3VwcHJlc3NFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHNpemUgZnJvbSB3aXRoaW4gdGhlIGNvbnRhaW5lci4gVHJhdmVyc2VzIHVwXHJcbiAgICAgKiB0aGUgaXRlbSB0cmVlIHVudGlsIGl0IGZpbmRzIGEgcm93IG9yIGNvbHVtbiBlbGVtZW50XHJcbiAgICAgKiBhbmQgcmVzaXplcyBpdHMgaXRlbXMgYWNjb3JkaW5nbHkuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhpcyBjb250YWluZXIgaXNuJ3QgYSBkZXNjZW5kYW50IG9mIGEgcm93IG9yIGNvbHVtblxyXG4gICAgICogaXQgcmV0dXJucyBmYWxzZVxyXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIG5ldyB3aWR0aCBpbiBwaXhlbFxyXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBuZXcgaGVpZ2h0IGluIHBpeGVsXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgcmVzaXplU3VjY2VzZnVsXHJcbiAgICAgKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgYW5jZXN0b3JJdGVtOiBDb250ZW50SXRlbSB8IG51bGwgPSB0aGlzLl9wYXJlbnQ7XHJcbiAgICAgICAgaWYgKGFuY2VzdG9ySXRlbS5pc0NvbHVtbiB8fCBhbmNlc3Rvckl0ZW0uaXNSb3cgfHwgYW5jZXN0b3JJdGVtLnBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0lDU1NQUkMnLCAnQ29tcG9uZW50Q29udGFpbmVyIGNhbm5vdCBoYXZlIFJvd0NvbHVtbiBQYXJlbnQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgYW5jZXN0b3JDaGlsZEl0ZW06IENvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICBhbmNlc3RvckNoaWxkSXRlbSA9IGFuY2VzdG9ySXRlbTtcclxuICAgICAgICAgICAgICAgIGFuY2VzdG9ySXRlbSA9IGFuY2VzdG9ySXRlbS5wYXJlbnQ7XHJcbiAgICAgICAgICAgIH0gd2hpbGUgKGFuY2VzdG9ySXRlbSAhPT0gbnVsbCAmJiAhYW5jZXN0b3JJdGVtLmlzQ29sdW1uICYmICFhbmNlc3Rvckl0ZW0uaXNSb3cpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFuY2VzdG9ySXRlbSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gbm8gUm93IG9yIENvbHVtbiBmb3VuZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gYW5jZXN0b3JJdGVtIGlzIFJvdyBvciBDb2x1bW5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGFuY2VzdG9ySXRlbS5pc0NvbHVtbiA/ICdoZWlnaHQnIDogJ3dpZHRoJztcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTaXplID0gdGhpc1tkaXJlY3Rpb25dO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTaXplID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0lDU1NDUzExMTk0Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NpemUgPSBkaXJlY3Rpb24gPT09ICdoZWlnaHQnID8gaGVpZ2h0IDogd2lkdGg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsUGl4ZWwgPSBjdXJyZW50U2l6ZSAqICgxIC8gKGFuY2VzdG9yQ2hpbGRJdGVtLnNpemUgLyAxMDApKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKG5ld1NpemUgLyB0b3RhbFBpeGVsKSAqIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YSA9IChhbmNlc3RvckNoaWxkSXRlbS5zaXplIC0gcGVyY2VudGFnZSkgLyAoYW5jZXN0b3JJdGVtLmNvbnRlbnRJdGVtcy5sZW5ndGggLSAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbmNlc3Rvckl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9ySXRlbUNvbnRlbnRJdGVtID0gYW5jZXN0b3JJdGVtLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9ySXRlbUNvbnRlbnRJdGVtID09PSBhbmNlc3RvckNoaWxkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JJdGVtQ29udGVudEl0ZW0uc2l6ZSA9IHBlcmNlbnRhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3Rvckl0ZW1Db250ZW50SXRlbS5zaXplICs9IGRlbHRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBhbmNlc3Rvckl0ZW0udXBkYXRlU2l6ZShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xvc2VzIHRoZSBjb250YWluZXIgaWYgaXQgaXMgY2xvc2FibGUuIENhbiBiZSBjYWxsZWQgYnlcclxuICAgICAqIGJvdGggdGhlIGNvbXBvbmVudCB3aXRoaW4gYXQgYXMgd2VsbCBhcyB0aGUgY29udGVudEl0ZW0gY29udGFpbmluZ1xyXG4gICAgICogaXQuIEVtaXRzIGEgY2xvc2UgZXZlbnQgYmVmb3JlIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGNsb3NlZC5cclxuICAgICAqL1xyXG4gICAgY2xvc2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzQ2xvc2FibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdjbG9zZScpO1xyXG4gICAgICAgICAgICB0aGlzLl9wYXJlbnQuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJlcGxhY2VzIGNvbXBvbmVudCB3aXRob3V0IGFmZmVjdGluZyBsYXlvdXQgKi9cclxuICAgIHJlcGxhY2VDb21wb25lbnQoaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVsZWFzZUNvbXBvbmVudCgpO1xyXG5cclxuICAgICAgICBpZiAoIUl0ZW1Db25maWcuaXNDb21wb25lbnQoaXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXBsYWNlQ29tcG9uZW50IG5vdCBwYXNzZWQgYSBjb21wb25lbnQgSXRlbUNvbmZpZycpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gQ29tcG9uZW50SXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbFN0YXRlID0gY29uZmlnLmNvbXBvbmVudFN0YXRlO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IHRoaXMuX2luaXRpYWxTdGF0ZTtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50VHlwZSA9IGNvbmZpZy5jb21wb25lbnRUeXBlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlSXRlbUNvbmZpZ0V2ZW50KGNvbmZpZyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9ib3VuZENvbXBvbmVudCA9IHRoaXMubGF5b3V0TWFuYWdlci5iaW5kQ29tcG9uZW50KHRoaXMsIGNvbmZpZyk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudFBvc2l0aW9uUHJvcGVydHlGcm9tQm91bmRDb21wb25lbnQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9ib3VuZENvbXBvbmVudC52aXJ0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50KHRoaXMsIHRoaXMuX3Zpc2libGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmZpcmVCZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50KDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KHRoaXMsIHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuZmlyZUFmdGVyVmlydHVhbFJlY3RpbmdFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBpbml0aWFsIGNvbXBvbmVudCBzdGF0ZSBvciB0aGUgbGF0ZXN0IHBhc3NlZCBpbiBzZXRTdGF0ZSgpXHJcbiAgICAgKiBAcmV0dXJucyBzdGF0ZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoQ29tcG9uZW50Q29udGFpbmVyOmNsYXNzKS5pbml0aWFsU3RhdGV9XHJcbiAgICAgKi9cclxuICAgIGdldFN0YXRlKCk6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWVyZ2VzIHRoZSBwcm92aWRlZCBzdGF0ZSBpbnRvIHRoZSBjdXJyZW50IG9uZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoQ29tcG9uZW50Q29udGFpbmVyOmNsYXNzKS5zdGF0ZVJlcXVlc3RFdmVudH1cclxuICAgICAqL1xyXG4gICAgZXh0ZW5kU3RhdGUoc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZXh0ZW5kZWRTdGF0ZSA9IGRlZXBFeHRlbmQodGhpcy5fc3RhdGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHN0YXRlKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKGV4dGVuZGVkU3RhdGUgYXMgSnNvblZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbXBvbmVudCBzdGF0ZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoQ29tcG9uZW50Q29udGFpbmVyOmNsYXNzKS5zdGF0ZVJlcXVlc3RFdmVudH1cclxuICAgICAqL1xyXG4gICAgc2V0U3RhdGUoc3RhdGU6IEpzb25WYWx1ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQncyB0aGUgY29tcG9uZW50cyB0aXRsZVxyXG4gICAgICovXHJcbiAgICBzZXRUaXRsZSh0aXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LnNldFRpdGxlKHRpdGxlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzZXRUYWIodGFiOiBUYWIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90YWIgPSB0YWI7XHJcbiAgICAgICAgdGhpcy5lbWl0KCd0YWInLCB0YWIpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0VmlzaWJpbGl0eSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ib3VuZENvbXBvbmVudC52aXJ0dWFsKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudCh0aGlzLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3Zpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Zpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2hlaWdodCA9PT0gMCAmJiB0aGlzLl93aWR0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTaXplVG9Ob2RlU2l6ZSh0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRTaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyAmJiAodGhpcy5faGVpZ2h0ICE9PSAwIHx8IHRoaXMuX3dpZHRoICE9PSAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNpemVUb05vZGVTaXplKHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNob3coKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl92aXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRIaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRMb2dpY2FsWkluZGV4KExvZ2ljYWxaSW5kZXguYmFzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TG9naWNhbFpJbmRleChsb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGxvZ2ljYWxaSW5kZXggIT09IHRoaXMuX2xvZ2ljYWxaSW5kZXgpIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9naWNhbFpJbmRleCA9IGxvZ2ljYWxaSW5kZXg7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeVZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY29udGFpbmVyJ3Mgc2l6ZSwgYnV0IGNvbnNpZGVyZWQgdGVtcG9yYXJ5IChmb3IgZHJhZ2dpbmcpXHJcbiAgICAgKiBzbyBkb24ndCBlbWl0IGFueSBldmVudHMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZW50ZXJEcmFnTW9kZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLl9lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLl9lbGVtZW50LCBoZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLnNldExvZ2ljYWxaSW5kZXgoTG9naWNhbFpJbmRleC5kcmFnKTtcclxuXHJcbiAgICAgICAgdGhpcy5kcmFnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhpdERyYWdNb2RlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBlbnRlclN0YWNrTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3N0YWNrTWF4aW1pc2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldExvZ2ljYWxaSW5kZXgoTG9naWNhbFpJbmRleC5zdGFja01heGltaXNlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhpdFN0YWNrTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTtcclxuICAgICAgICB0aGlzLl9zdGFja01heGltaXNlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGRyYWcoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWwpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuZmlyZUJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQoMSk7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KHRoaXMsIHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmZpcmVBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbnRhaW5lcidzIHNpemUuIENhbGxlZCBieSB0aGUgY29udGFpbmVyJ3MgY29tcG9uZW50IGl0ZW0uXHJcbiAgICAgKiBUbyBpbnN0ZWFkIHNldCB0aGUgc2l6ZSBwcm9ncmFtbWF0aWNhbGx5IGZyb20gd2l0aGluIHRoZSBjb21wb25lbnQgaXRzZWxmLFxyXG4gICAgICogdXNlIHRoZSBwdWJsaWMgc2V0U2l6ZSBtZXRob2RcclxuICAgICAqIEBwYXJhbSB3aWR0aCAtIGluIHB4XHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gaW4gcHhcclxuICAgICAqIEBwYXJhbSBmb3JjZSAtIHNldCBldmVuIGlmIG5vIGNoYW5nZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHNldFNpemVUb05vZGVTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh3aWR0aCAhPT0gdGhpcy5fd2lkdGggfHwgaGVpZ2h0ICE9PSB0aGlzLl9oZWlnaHQgfHwgZm9yY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5fZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuX2VsZW1lbnQsIGhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fYm91bmRDb21wb25lbnQudmlydHVhbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRWaXJ0dWFsU2l6ZWRDb250YWluZXJUb0xheW91dE1hbmFnZXIoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgncmVzaXplJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrU2hvd25Gcm9tWmVyb0RpbWVuc2lvbnMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBub3RpZnlWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KHRoaXMsIHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3Jlc2l6ZScpO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrU2hvd25Gcm9tWmVyb0RpbWVuc2lvbnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBub3RpZnlWaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBsb2dpY2FsWkluZGV4ID0gdGhpcy5fbG9naWNhbFpJbmRleDtcclxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFpJbmRleCA9IExvZ2ljYWxaSW5kZXhUb0RlZmF1bHRNYXBbbG9naWNhbFpJbmRleF07XHJcbiAgICAgICAgICAgIHRoaXMudmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQodGhpcywgbG9naWNhbFpJbmRleCwgZGVmYXVsdFpJbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlRWxlbWVudFBvc2l0aW9uUHJvcGVydHlGcm9tQm91bmRDb21wb25lbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWwpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdzdGF0aWMnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnJzsgLy8gc2V0IGl0IGJhY2sgdG8gYXR0cmlidXRlIHZhbHVlXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgYWRkVmlydHVhbFNpemVkQ29udGFpbmVyVG9MYXlvdXRNYW5hZ2VyKCkge1xyXG4gICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuYmVnaW5WaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmFkZFZpcnR1YWxTaXplZENvbnRhaW5lcih0aGlzKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmVuZFZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGNoZWNrU2hvd25Gcm9tWmVyb0RpbWVuc2lvbnMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgJiYgKHRoaXMuX2hlaWdodCAhPT0gMCB8fCB0aGlzLl93aWR0aCAhPT0gMCkpIHtcclxuICAgICAgICAgICAgdGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRTaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW1pdFNob3coKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzaG93bicpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnc2hvdycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW1pdEhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdoaWRlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWxlYXNlQ29tcG9uZW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zdGFja01heGltaXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmV4aXRTdGFja01heGltaXNlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXQoJ2JlZm9yZUNvbXBvbmVudFJlbGVhc2UnLCB0aGlzLl9ib3VuZENvbXBvbmVudC5jb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci51bmJpbmRDb21wb25lbnQodGhpcywgdGhpcy5fYm91bmRDb21wb25lbnQudmlydHVhbCwgdGhpcy5fYm91bmRDb21wb25lbnQuY29tcG9uZW50KTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBDb21wb25lbnRDb250YWluZXJ9ICovXHJcbmV4cG9ydCB0eXBlIEl0ZW1Db250YWluZXIgPSBDb21wb25lbnRDb250YWluZXI7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIENvbXBvbmVudENvbnRhaW5lciB7XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnQgPSB1bmtub3duO1xyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQmluZGFibGVDb21wb25lbnQge1xyXG4gICAgICAgIGNvbXBvbmVudDogQ29tcG9uZW50O1xyXG4gICAgICAgIHZpcnR1YWw6IGJvb2xlYW47XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IHR5cGUgU3RhdGVSZXF1ZXN0RXZlbnRIYW5kbGVyID0gKHRoaXM6IHZvaWQpID0+IEpzb25WYWx1ZSB8IHVuZGVmaW5lZDtcclxuICAgIGV4cG9ydCB0eXBlIFZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCA9ICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBWaXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQgPSAodGhpczogdm9pZCwgY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHZpc2libGU6IGJvb2xlYW4pID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBWaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudCA9XHJcbiAgICAgICAgKHRoaXM6IHZvaWQsIGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBsb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4LCBkZWZhdWx0WkluZGV4OiBzdHJpbmcpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBTaG93RXZlbnRIYW5kbGVyID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBIaWRlRXZlbnRIYW5kbGVyID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBGb2N1c0V2ZW50SGFuZGxlciA9ICh0aGlzOiB2b2lkLCBzdXBwcmVzc0V2ZW50OiBib29sZWFuKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQmx1ckV2ZW50SGFuZGxlciA9ICh0aGlzOiB2b2lkLCBzdXBwcmVzc0V2ZW50OiBib29sZWFuKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgVXBkYXRlSXRlbUNvbmZpZ0V2ZW50SGFuZGxlciA9IChpdGVtQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpID0+IHZvaWQ7XHJcbn1cclxuIiwiaW1wb3J0IHsgUmVzb2x2ZWRMYXlvdXRDb25maWcsIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLCBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBQb3BvdXRCbG9ja2VkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvZXh0ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBVbmV4cGVjdGVkTnVsbEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbnRlbnQtaXRlbSc7XHJcbmltcG9ydCB7IFJvd09yQ29sdW1uIH0gZnJvbSAnLi4vaXRlbXMvcm93LW9yLWNvbHVtbic7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBSZWN0LCBJdGVtVHlwZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZGVlcEV4dGVuZCwgZ2V0RXJyb3JNZXNzYWdlLCBnZXRVbmlxdWVJZCwgZ2V0V2luZG93VG9wTGVmdEJvcmRlciB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKlxyXG4gKiBQb3BzIGEgY29udGVudCBpdGVtIG91dCBpbnRvIGEgbmV3IGJyb3dzZXIgd2luZG93LlxyXG4gKiBUaGlzIGlzIGFjaGlldmVkIGJ5XHJcbiAqXHJcbiAqICAgIC0gQ3JlYXRpbmcgYSBuZXcgY29uZmlndXJhdGlvbiB3aXRoIHRoZSBjb250ZW50IGl0ZW0gYXMgcm9vdCBlbGVtZW50XHJcbiAqICAgIC0gU2VyaWFsaXppbmcgYW5kIG1pbmlmeWluZyB0aGUgY29uZmlndXJhdGlvblxyXG4gKiAgICAtIE9wZW5pbmcgdGhlIGN1cnJlbnQgd2luZG93J3MgVVJMIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gYXMgYSBHRVQgcGFyYW1ldGVyXHJcbiAqICAgIC0gR29sZGVuTGF5b3V0IHdoZW4gb3BlbmVkIGluIHRoZSBuZXcgd2luZG93IHdpbGwgbG9vayBmb3IgdGhlIEdFVCBwYXJhbWV0ZXJcclxuICogICAgICBhbmQgdXNlIGl0IGluc3RlYWQgb2YgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb25cclxuICogQHB1YmxpY1xyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBCcm93c2VyUG9wb3V0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3BvcG91dFdpbmRvdzogV2luZG93IHwgbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2lzSW5pdGlhbGlzZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jaGVja1JlYWR5SW50ZXJ2YWw6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcHJldmVudFBvcEluT25DbG9zZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBfY29uZmlnIC0gR29sZGVuTGF5b3V0IGl0ZW0gY29uZmlnXHJcbiAgICAgKiBAcGFyYW0gX2luaXRpYWxXaW5kb3dTaXplIC0gQSBtYXAgd2l0aCB3aWR0aCwgaGVpZ2h0LCB0b3AgYW5kIGxlZnRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfaW5pdGlhbFdpbmRvd1NpemU6IFJlY3QsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpc2VkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9wcmV2ZW50UG9wSW5PbkNsb3NlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVXaW5kb3coKTtcclxuICAgIH1cclxuXHJcbiAgICB0b0NvbmZpZygpOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBjcmVhdGUgY29uZmlnLCBsYXlvdXQgbm90IHlldCBpbml0aWFsaXNlZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ2xJbnN0YW5jZSA9IHRoaXMuZ2V0R2xJbnN0YW5jZSgpO1xyXG4gICAgICAgIGNvbnN0IGdsSW5zdGFuY2VDb25maWcgPSBnbEluc3RhbmNlLnNhdmVMYXlvdXQoKTtcclxuXHJcbiAgICAgICAgbGV0IGxlZnQ6IG51bWJlciB8IG51bGw7XHJcbiAgICAgICAgbGV0IHRvcDogbnVtYmVyIHwgbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxlZnQgPSBudWxsO1xyXG4gICAgICAgICAgICB0b3AgPSBudWxsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxlZnQgPSB0aGlzLl9wb3BvdXRXaW5kb3cuc2NyZWVuWCA/PyB0aGlzLl9wb3BvdXRXaW5kb3cuc2NyZWVuTGVmdDtcclxuICAgICAgICAgICAgdG9wID0gdGhpcy5fcG9wb3V0V2luZG93LnNjcmVlblkgPz8gdGhpcy5fcG9wb3V0V2luZG93LnNjcmVlblRvcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHdpbmRvdzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93ID0ge1xyXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5nZXRHbEluc3RhbmNlKCkud2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5nZXRHbEluc3RhbmNlKCkuaGVpZ2h0LFxyXG4gICAgICAgICAgICBsZWZ0LFxyXG4gICAgICAgICAgICB0b3AsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgY29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgcm9vdDogZ2xJbnN0YW5jZUNvbmZpZy5yb290LFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogZ2xJbnN0YW5jZUNvbmZpZy5vcGVuUG9wb3V0cyxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IGdsSW5zdGFuY2VDb25maWcuc2V0dGluZ3MsXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IGdsSW5zdGFuY2VDb25maWcuZGltZW5zaW9ucyxcclxuICAgICAgICAgICAgaGVhZGVyOiBnbEluc3RhbmNlQ29uZmlnLmhlYWRlcixcclxuICAgICAgICAgICAgd2luZG93LFxyXG4gICAgICAgICAgICBwYXJlbnRJZDogdGhpcy5fY29uZmlnLnBhcmVudElkLFxyXG4gICAgICAgICAgICBpbmRleEluUGFyZW50OiB0aGlzLl9jb25maWcuaW5kZXhJblBhcmVudCxcclxuICAgICAgICAgICAgcmVzb2x2ZWQ6IHRydWUsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBnZXRHbEluc3RhbmNlKCk6IExheW91dE1hbmFnZXIge1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3BvdXRXaW5kb3cgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0JQR0dJMjQ2OTMnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcG91dFdpbmRvdy5fX2dsSW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hdGl2ZSBCcm93c2VyV2luZG93IGJhY2tpbmcgdGhpcyBwb3BvdXQuXHJcbiAgICAgKiBNaWdodCB0aHJvdyBhbiBVbmV4cGVjdGVkTnVsbEVycm9yIGV4Y2VwdGlvbiB3aGVuIHRoZSB3aW5kb3cgaXMgbm90IGluaXRpYWxpemVkIHlldC5cclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZ2V0V2luZG93KCk6IFdpbmRvdyB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQlBHVzA4NzIxNScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wb3V0V2luZG93O1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlKHByZXZlbnRQb3BJbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHByZXZlbnRQb3BJbikge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2ZW50UG9wSW5PbkNsb3NlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdldEdsSW5zdGFuY2UoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldEdsSW5zdGFuY2UoKS5jbG9zZVdpbmRvdygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFdpbmRvdygpLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBwb3BwZWQgb3V0IGl0ZW0gdG8gaXRzIG9yaWdpbmFsIHBvc2l0aW9uLiBJZiB0aGUgb3JpZ2luYWxcclxuICAgICAqIHBhcmVudCBpc24ndCBhdmFpbGFibGUgYW55bW9yZSBpdCBmYWxscyBiYWNrIHRvIHRoZSBsYXlvdXQncyB0b3Btb3N0IGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcG9wSW4oKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHBhcmVudEl0ZW06IENvbnRlbnRJdGVtO1xyXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuX2NvbmZpZy5pbmRleEluUGFyZW50O1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbmZpZy5wYXJlbnRJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICogVGhlIGRlZXBFeHRlbmQgY2FsbCBzZWVtcyBhIGJpdCBwb2ludGxlc3MsIGJ1dCBpdCdzIGNydWNpYWwgdG9cclxuICAgICAgICAqIGNvcHkgdGhlIGNvbmZpZyByZXR1cm5lZCBieSB0aGlzLmdldEdsSW5zdGFuY2UoKS50b0NvbmZpZygpXHJcbiAgICAgICAgKiBvbnRvIGEgbmV3IG9iamVjdC4gSW50ZXJuZXQgRXhwbG9yZXIga2VlcHMgdGhlIHJlZmVyZW5jZXNcclxuICAgICAgICAqIHRvIG9iamVjdHMgb24gdGhlIGNoaWxkIHdpbmRvdywgcmVzdWx0aW5nIGluIHRoZSBmb2xsb3dpbmcgZXJyb3JcclxuICAgICAgICAqIG9uY2UgdGhlIGNoaWxkIHdpbmRvdyBpcyBjbG9zZWQ6XHJcbiAgICAgICAgKlxyXG4gICAgICAgICogVGhlIGNhbGxlZSAoc2VydmVyIFtub3Qgc2VydmVyIGFwcGxpY2F0aW9uXSkgaXMgbm90IGF2YWlsYWJsZSBhbmQgZGlzYXBwZWFyZWRcclxuICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGdsSW5zdGFuY2VMYXlvdXRDb25maWcgPSB0aGlzLmdldEdsSW5zdGFuY2UoKS5zYXZlTGF5b3V0KCk7XHJcbiAgICAgICAgY29uc3QgY29waWVkR2xJbnN0YW5jZUxheW91dENvbmZpZyA9IGRlZXBFeHRlbmQoe30sIGdsSW5zdGFuY2VMYXlvdXRDb25maWcpIGFzIFJlc29sdmVkTGF5b3V0Q29uZmlnO1xyXG4gICAgICAgIGxldCBjb3BpZWRSb290ID0gY29waWVkR2xJbnN0YW5jZUxheW91dENvbmZpZy5yb290O1xyXG4gICAgICAgIGlmIChjb3BpZWRSb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBncm91bmRJdGVtID0gdGhpcy5fbGF5b3V0TWFuYWdlci5ncm91bmRJdGVtO1xyXG4gICAgICAgIGlmIChncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignQlBQSUczNDk3MicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYXJlbnRJdGVtID0gZ3JvdW5kSXRlbS5nZXRJdGVtc0J5UG9wSW5QYXJlbnRJZCh0aGlzLl9jb25maWcucGFyZW50SWQpWzBdO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICogRmFsbGJhY2sgaWYgcGFyZW50SXRlbSBpcyBub3QgYXZhaWxhYmxlLiBFaXRoZXIgYWRkIGl0IHRvIHRoZSB0b3Btb3N0XHJcbiAgICAgICAgKiBpdGVtIG9yIG1ha2UgaXQgdGhlIHRvcG1vc3QgaXRlbSBpZiB0aGUgbGF5b3V0IGlzIGVtcHR5XHJcbiAgICAgICAgKi9cclxuICAgICAgICBpZiAoIXBhcmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgaWYgKGdyb3VuZEl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudEl0ZW0gPSBncm91bmRJdGVtLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudEl0ZW0gPSBncm91bmRJdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluZGV4ID0gcGFyZW50SXRlbS5jb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhcmVudEl0ZW0uaXNTdGFjaykgeyAgIFxyXG4gICAgICAgICAgICAvLyBTdGFja3MgY2FuIG9ubHkgaG9sZCBjb21wb25lbnQgaXRlbXMgLT4gdHJ5IHRvIGZpbmQgb25lIGJ5IHVucmF2ZWxpbmcgY29udGFpbmVycyB3aXRoIGEgc2luZ2xlIGNoaWxkXHJcbiAgICAgICAgICAgIHdoaWxlIChjb3BpZWRSb290LnR5cGUgIT09IEl0ZW1UeXBlLmNvbXBvbmVudCAmJiBjb3BpZWRSb290LmNvbnRlbnQubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBjb3BpZWRSb290ID0gY29waWVkUm9vdC5jb250ZW50WzBdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBGYWlsZWQgdG8gZmluZCBhIGNvbXBvbmVudCBpdGVtLCB3cmFwIHRoZSBwYXJlbnQgaXRlbSBhbmQgZG9ja2VkIGl0ZW0gaW4gYSByb3cgYXMgc2libGluZ3NcclxuICAgICAgICAgICAgaWYgKGNvcGllZFJvb3QudHlwZSAhPT0gSXRlbVR5cGUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50SXRlbS5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQlBQSUczNDk3MycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IG5ldyBSb3dPckNvbHVtbihmYWxzZSwgdGhpcy5fbGF5b3V0TWFuYWdlciwgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgncm93JyksIHBhcmVudEl0ZW0ucGFyZW50KTtcclxuICAgICAgICAgICAgICAgIHBhcmVudEl0ZW0ucGFyZW50LnJlcGxhY2VDaGlsZChwYXJlbnRJdGVtLCByb3csIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHJvdy5hZGRDaGlsZChwYXJlbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudEl0ZW0gPSByb3c7XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld0NvbnRlbnRJdGVtID0gdGhpcy5fbGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0oY29waWVkUm9vdCwgcGFyZW50SXRlbSk7XHJcblxyXG4gICAgICAgIHBhcmVudEl0ZW0uYWRkQ2hpbGQobmV3Q29udGVudEl0ZW0sIGluZGV4KTtcclxuICAgICAgICBpZiAodGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MucG9wSW5PbkNsb3NlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29uQ2xvc2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgVVJMIGFuZCB3aW5kb3cgcGFyYW1ldGVyXHJcbiAgICAgKiBhbmQgb3BlbnMgYSBuZXcgd2luZG93XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVXaW5kb3coKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVVcmwoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQm9ndXMgdGl0bGUgdG8gcHJldmVudCByZS11c2FnZSBvZiBleGlzdGluZyB3aW5kb3cgd2l0aCB0aGVcclxuICAgICAgICAgKiBzYW1lIHRpdGxlLiBUaGUgYWN0dWFsIHRpdGxlIHdpbGwgYmUgc2V0IGJ5IHRoZSBuZXcgd2luZG93J3NcclxuICAgICAgICAgKiBHb2xkZW5MYXlvdXQgaW5zdGFuY2UgaWYgaXQgZGV0ZWN0cyB0aGF0IGl0IGlzIGluIHN1YldpbmRvd01vZGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKS50b1N0cmluZygzNik7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBvcHRpb25zIGFzIHVzZWQgaW4gdGhlIHdpbmRvdy5vcGVuIHN0cmluZ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5zZXJpYWxpemVXaW5kb3dGZWF0dXJlcyh7XHJcbiAgICAgICAgICAgIGxlZnQ6IHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLmxlZnQsXHJcbiAgICAgICAgICAgIHRvcDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUudG9wLFxyXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUud2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUuaGVpZ2h0LFxyXG4gICAgICAgICAgICBpbm5lcldpZHRoOiB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS53aWR0aCxcclxuICAgICAgICAgICAgaW5uZXJIZWlnaHQ6IHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLmhlaWdodCxcclxuICAgICAgICAgICAgbWVudWJhcjogJ25vJyxcclxuICAgICAgICAgICAgdG9vbGJhcjogJ25vJyxcclxuICAgICAgICAgICAgbG9jYXRpb246ICdubycsXHJcbiAgICAgICAgICAgIHBlcnNvbmFsYmFyOiAnbm8nLFxyXG4gICAgICAgICAgICByZXNpemFibGU6ICd5ZXMnLFxyXG4gICAgICAgICAgICBzY3JvbGxiYXJzOiAnbm8nLFxyXG4gICAgICAgICAgICBzdGF0dXM6ICdubydcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93ID0gZ2xvYmFsVGhpcy5vcGVuKHVybCwgdGFyZ2V0LCBmZWF0dXJlcyk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fcG9wb3V0V2luZG93KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy5ibG9ja2VkUG9wb3V0c1Rocm93RXJyb3IgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFBvcG91dEJsb2NrZWRFcnJvcignUG9wb3V0IGJsb2NrZWQnKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHsgICAgXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25BbmRSZXNpemVXaW5kb3coKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9wb3BvdXRXaW5kb3cpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcEluT25DbG9zZSAmJiAhdGhpcy5fcHJldmVudFBvcEluT25DbG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcEluKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUG9sbGluZyB0aGUgY2hpbGR3aW5kb3cgdG8gZmluZCBvdXQgaWYgR29sZGVuTGF5b3V0IGhhcyBiZWVuIGluaXRpYWxpc2VkXHJcbiAgICAgICAgICogZG9lc24ndCBzZWVtIG9wdGltYWwsIGJ1dCB0aGUgYWx0ZXJuYXRpdmVzIC0gYWRkaW5nIGEgY2FsbGJhY2sgdG8gdGhlIHBhcmVudFxyXG4gICAgICAgICAqIHdpbmRvdyBvciByYWlzaW5nIGFuIGV2ZW50IG9uIHRoZSB3aW5kb3cgb2JqZWN0IC0gYm90aCB3b3VsZCBpbnRyb2R1Y2Uga25vd2xlZGdlXHJcbiAgICAgICAgICogYWJvdXQgdGhlIHBhcmVudCB0byB0aGUgY2hpbGQgd2luZG93IHdoaWNoIHdlJ2QgcmF0aGVyIGF2b2lkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY2hlY2tSZWFkeUludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5jaGVja1JlYWR5KCksIDEwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGNoZWNrUmVhZHkoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQlBDUjAxODQ0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdy5fX2dsSW5zdGFuY2UgJiYgdGhpcy5fcG9wb3V0V2luZG93Ll9fZ2xJbnN0YW5jZS5pc0luaXRpYWxpc2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cuX19nbEluc3RhbmNlLnBhcmVudCA9IHRoaXMuX2xheW91dE1hbmFnZXI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uSW5pdGlhbGlzZWQoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja1JlYWR5SW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fY2hlY2tSZWFkeUludGVydmFsKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1JlYWR5SW50ZXJ2YWwgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwb3NpdGlvbkFuZFJlc2l6ZVdpbmRvdygpIHtcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdCUFBBUlcxJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJbml0aWFsIHdpbmRvdyBzaXplIHBhcmFtZXRlcnMgZGVzY3JpYmUgY2xpZW50IChpLmUuIGlubmVyKSBwb3NpdGlvbiBhbmQgc2l6ZVxyXG4gICAgICAgIC8vIFNpbmNlIHRoZSBib3JkZXIgb2YgdGhlIHBvcG91dCBtYXkgaGF2ZSBkaWZmZXJlbnQgYm9yZGVycyB0aGFuIHRoZSBtYWluIHdpbmRvdywgd2UgaGF2ZVxyXG4gICAgICAgIC8vIHRvIGFkanVzdCB0aGUgcG9zaXRpb24gYW5kIHNpemUgb25jZSB0aGUgd2luZG93IGhhcyBiZWVuIGNyZWF0ZWQuXHJcbiAgICAgICAgLy8gT25seSBkbyB0aGlzIGlmIHRoZSB3aW5kb3cgcGFyYW1ldGVycyBhcmUgcGxhdXNpYmxlIChlLmcuIG9uIExpbnV4IGlubmVyIGRpbWVuc2lvbiBpcyB6ZXJvIHNvbWV0aW1lcylcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93LmlubmVyV2lkdGggPiAwICYmIHRoaXMuX3BvcG91dFdpbmRvdy5pbm5lckhlaWdodCA+IDAgJiZcclxuICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93Lm91dGVyV2lkdGggPiAwICYmIHRoaXMuX3BvcG91dFdpbmRvdy5vdXRlckhlaWdodCA+IDAgJiZcclxuICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93LmlubmVyV2lkdGggPD0gdGhpcy5fcG9wb3V0V2luZG93Lm91dGVyV2lkdGggJiZcclxuICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93LmlubmVySGVpZ2h0IDw9IHRoaXMuX3BvcG91dFdpbmRvdy5vdXRlckhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlciA9IGdldFdpbmRvd1RvcExlZnRCb3JkZXIodGhpcy5fcG9wb3V0V2luZG93KTtcclxuICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93Lm1vdmVUbyhcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLmxlZnQgLSBib3JkZXIud2lkdGgsXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS50b3AgLSBib3JkZXIuaGVpZ2h0LFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cucmVzaXplVG8oXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS53aWR0aCArICh0aGlzLl9wb3BvdXRXaW5kb3cub3V0ZXJXaWR0aCAtIHRoaXMuX3BvcG91dFdpbmRvdy5pbm5lcldpZHRoKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLmhlaWdodCArICh0aGlzLl9wb3BvdXRXaW5kb3cub3V0ZXJIZWlnaHQgLSB0aGlzLl9wb3BvdXRXaW5kb3cuaW5uZXJIZWlnaHQpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGlzZXMgYSBtYXAgb2Yga2V5OnZhbHVlcyB0byBhIHdpbmRvdyBvcHRpb25zIHN0cmluZ1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB3aW5kb3dPcHRpb25zIC1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBzZXJpYWxpc2VkIHdpbmRvdyBvcHRpb25zXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXJpYWxpemVXaW5kb3dGZWF0dXJlcyh3aW5kb3dPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB3aW5kb3dPcHRpb25zU3RyaW5nOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB3aW5kb3dPcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHdpbmRvd09wdGlvbnNTdHJpbmcucHVzaChrZXkgKyAnPScgKyB3aW5kb3dPcHRpb25zW2tleV0udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gd2luZG93T3B0aW9uc1N0cmluZy5qb2luKCcsJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBVUkwgZm9yIHRoZSBuZXcgd2luZG93LCBpbmNsdWRpbmcgdGhlXHJcbiAgICAgKiBjb25maWcgR0VUIHBhcmFtZXRlclxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFVSTFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlVXJsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUtleSA9ICdnbC13aW5kb3ctY29uZmlnLScgKyBnZXRVbmlxdWVJZCgpO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IFJlc29sdmVkTGF5b3V0Q29uZmlnLm1pbmlmeUNvbmZpZyh0aGlzLl9jb25maWcpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShzdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3Igd2hpbGUgd3JpdGluZyB0byBsb2NhbFN0b3JhZ2UgJyArIGdldEVycm9yTWVzc2FnZShlKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKCcvZ2wtcG9wb3V0JywgbG9jYXRpb24ub3JpZ2luKTtcclxuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnZ2wtd2luZG93Jywgc3RvcmFnZUtleSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRoZW1lID0gdGhpcy5fbGF5b3V0TWFuYWdlci5jb250YWluZXIuZGF0YXNldC50aGVtZTtcclxuICAgICAgICBpZiAodGhlbWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnZ2wtdGhlbWUnLCB0aGVtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB3aGVuIHRoZSBuZXcgd2luZG93IGlzIG9wZW5lZCBhbmQgdGhlIEdvbGRlbkxheW91dCBpbnN0YW5jZVxyXG4gICAgICogd2l0aGluIGl0IGlzIGluaXRpYWxpc2VkXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkluaXRpYWxpc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZ2V0R2xJbnN0YW5jZSgpLm9uKCdwb3BJbicsICgpID0+IHRoaXMucG9wSW4oKSk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdpbml0aWFsaXNlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCA1MG1zIGFmdGVyIHRoZSB3aW5kb3cgdW5sb2FkIGV2ZW50XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfb25DbG9zZSgpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZW1pdCgnY2xvc2VkJyksIDUwKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBEcmFnUHJveHkgfSBmcm9tICcuL2RyYWctcHJveHknO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBVbmV4cGVjdGVkTnVsbEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb250ZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBEcmFnTGlzdGVuZXIgfSBmcm9tICcuLi91dGlscy9kcmFnLWxpc3RlbmVyJztcclxuaW1wb3J0IHsgZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbiB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuY2xhc3MgRHJhZ1RhcmdldCB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9vd25lcjogRHJhZ0FjdGlvbixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9hcmVhOiBDb250ZW50SXRlbS5BcmVhLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3BhZ2VYOiBudW1iZXIsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfcGFnZVk6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChfb3duZXIubGF5b3V0TWFuYWdlciAhPT0gX2FyZWEuY29udGVudEl0ZW0ubGF5b3V0TWFuYWdlcikge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTGF5b3V0TWFuYWdlciBvZiBBcmVhIGFuZCBEcmFnUHJveHkgbXVzdCBtYXRjaCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3duZXIoKTogRHJhZ0FjdGlvbiB7IHJldHVybiB0aGlzLl9vd25lcjsgfVxyXG4gICAgZ2V0IGFyZWEoKTogQ29udGVudEl0ZW0uQXJlYSB7IHJldHVybiB0aGlzLl9hcmVhOyB9XHJcblxyXG4gICAgZHJvcChpdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5fYXJlYS5jb250ZW50SXRlbS5vbkRyb3AoaXRlbSwgdGhpcy5fYXJlYSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlnaGxpZ2h0RHJvcFpvbmUoKSB7XHJcbiAgICAgICAgdGhpcy5hcmVhLmNvbnRlbnRJdGVtLmhpZ2hsaWdodERyb3Bab25lKHRoaXMuX3BhZ2VYLCB0aGlzLl9wYWdlWSwgdGhpcy5fYXJlYSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIERyYWdBY3Rpb24gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgcHJpdmF0ZSBfZHJhZ1Byb3h5OiBEcmFnUHJveHkgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX2N1cnJlbnRUYXJnZXQ6IERyYWdUYXJnZXQgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX2RyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIF9ib3VuZGluZ1JlY3Q6IERPTVJlY3Q7XHJcbiAgICBwcml2YXRlIF9hY3Rpb25zOiBEcmFnQWN0aW9uW10gPSBbXTtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kcmFnRXZlbnRIYW5kbGVyID0gKF9vZmZzZXRYOiBudW1iZXIsIF9vZmZzZXRZOiBudW1iZXIsIGV2ZW50OiBFdmVudEVtaXR0ZXIuRHJhZ0V2ZW50KSA9PiB0aGlzLm9uRHJhZyhldmVudCk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kcmFnU3RvcEV2ZW50SGFuZGxlciA9ICgpID0+IHRoaXMub25EcmFnU3RvcCgpO1xyXG5cclxuICAgIGdldCBsYXlvdXRNYW5hZ2VyKCk6IExheW91dE1hbmFnZXIgeyByZXR1cm4gdGhpcy5fbGF5b3V0TWFuYWdlcjsgfVxyXG4gICAgZ2V0IHBhcmVudCgpOiBEcmFnQWN0aW9uIHwgbnVsbCB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH1cclxuICAgIGdldCBwcm94eSgpOiBEcmFnUHJveHkgfCBudWxsIHsgcmV0dXJuIHRoaXMuX2RyYWdQcm94eTsgfVxyXG4gICAgcHJpdmF0ZSBnZXQgcGFyZW50T3JTZWxmKCk6IERyYWdBY3Rpb24geyByZXR1cm4gdGhpcy5fcGFyZW50ID8/IHRoaXM7IH1cclxuICAgIGdldCBjdXJyZW50VGFyZ2V0KCk6IERyYWdUYXJnZXQgfCBudWxsIHsgcmV0dXJuIHRoaXMucGFyZW50T3JTZWxmLl9jdXJyZW50VGFyZ2V0OyB9XHJcbiAgICBwcml2YXRlIHNldCBjdXJyZW50VGFyZ2V0KHZhbHVlIDogRHJhZ1RhcmdldCB8IG51bGwpIHsgdGhpcy5wYXJlbnRPclNlbGYuX2N1cnJlbnRUYXJnZXQgPSB2YWx1ZTsgfVxyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9hbGxvd1BvcG91dDogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3BhcmVudDogRHJhZ0FjdGlvbiB8IG51bGwgPSBudWxsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX2JvdW5kaW5nUmVjdCA9IHRoaXMuY29tcHV0ZUJvdW5kaW5nUmVjdCgpO1xyXG4gICAgICAgIHRoaXMucGFyZW50T3JTZWxmLl9hY3Rpb25zLnB1c2godGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb21wdXRlQm91bmRpbmdSZWN0KCk6IERPTVJlY3Qge1xyXG4gICAgICAgIGlmICh0aGlzLl9sYXlvdXRNYW5hZ2VyLmdyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEQUNCUjExMTIwJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuX2xheW91dE1hbmFnZXIuZ3JvdW5kSXRlbS5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gRE9NUmVjdC5mcm9tUmVjdCh7XHJcbiAgICAgICAgICAgICAgICB4OiBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgKyByZWN0LmxlZnQsXHJcbiAgICAgICAgICAgICAgICB5OiBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCArIHJlY3QudG9wLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNjcmVlblRvUGFnZShzY3JlZW5YOiBudW1iZXIsIHNjcmVlblk6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IGlubmVyU2NyZWVuID0gZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbihnbG9iYWxUaGlzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgeDogZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0ICsgc2NyZWVuWCAtIGlubmVyU2NyZWVuLmxlZnQsXHJcbiAgICAgICAgICAgIHk6IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wICsgc2NyZWVuWSAtIGlubmVyU2NyZWVuLnRvcFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc1Byb3h5VmlzaWJsZShwcm94eTogRHJhZ1Byb3h5LCBwYWdlWCA6IG51bWJlciwgcGFnZVk6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHBhZ2VYID49IHRoaXMuX2JvdW5kaW5nUmVjdC5sZWZ0IC0gcHJveHkub3V0ZXJXaWR0aCAmJlxyXG4gICAgICAgICAgICBwYWdlWCA8IHRoaXMuX2JvdW5kaW5nUmVjdC5yaWdodCAmJlxyXG4gICAgICAgICAgICBwYWdlWSA+PSB0aGlzLl9ib3VuZGluZ1JlY3QudG9wIC0gcHJveHkub3V0ZXJIZWlnaHQgJiZcclxuICAgICAgICAgICAgcGFnZVkgPCB0aGlzLl9ib3VuZGluZ1JlY3QuYm90dG9tXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZVByb3h5KGl0ZW06IENvbXBvbmVudEl0ZW0sIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fZHJhZ1Byb3h5ID0gbmV3IERyYWdQcm94eSh0aGlzLCBpdGVtLCB4LCB5KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRyYWdMb2NhbChwYWdlWDogbnVtYmVyLCBwYWdlWTogbnVtYmVyKTogRHJhZ1RhcmdldCB8IG51bGwge1xyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnUHJveHkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJlYSA9IHRoaXMuX2RyYWdQcm94eS5kcmFnKHBhZ2VYLCBwYWdlWSk7XHJcbiAgICAgICAgICAgIHJldHVybiAoYXJlYSAhPT0gbnVsbCkgPyBuZXcgRHJhZ1RhcmdldCh0aGlzLCBhcmVhLCBwYWdlWCwgcGFnZVkpIDogbnVsbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkcmFnR2xvYmFsKHNjcmVlblg6IG51bWJlciwgc2NyZWVuWTogbnVtYmVyKTogRHJhZ1RhcmdldCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuX3BhcmVudD8uX2RyYWdQcm94eTtcclxuICAgICAgICBpZiAoIXNvdXJjZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignREFERzEnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHsgeDogcGFnZVgsIHk6IHBhZ2VZIH0gPSB0aGlzLnNjcmVlblRvUGFnZShzY3JlZW5YLCBzY3JlZW5ZKTtcclxuICAgICAgICBjb25zdCB2aXNpYmxlID0gZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScgJiYgdGhpcy5pc1Byb3h5VmlzaWJsZShzb3VyY2UsIHBhZ2VYLCBwYWdlWSk7XHJcblxyXG4gICAgICAgIGlmICh2aXNpYmxlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcmFnUHJveHkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMubGF5b3V0TWFuYWdlci5ncm91bmRJdGVtO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEQURHMicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSBzb3VyY2UuY29tcG9uZW50SXRlbS50b0NvbmZpZygpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ0l0ZW0gPSBuZXcgQ29tcG9uZW50SXRlbSh0aGlzLmxheW91dE1hbmFnZXIsIGNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUHJveHkoZHJhZ0l0ZW0sIHBhZ2VYLCBwYWdlWSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBQcm94eSBpcyBubyBsb25nZXIgdmlzaWJsZSBhbmQgbm90IGN1cnJlbnRseSB0aGUgZHJhZyB0YXJnZXQgLT4gZGVzdHJveVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZHJhZ1Byb3h5ICE9PSBudWxsICYmIHRoaXMuY3VycmVudFRhcmdldD8ub3duZXIgIT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25EcmFnU3RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5kcmFnTG9jYWwocGFnZVgsIHBhZ2VZKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRHJhZ1N0b3AoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5fYWN0aW9ucykge1xyXG4gICAgICAgICAgICBhY3Rpb24ubGF5b3V0TWFuYWdlci5oaWRlRHJvcFRhcmdldEluZGljYXRvcigpO1xyXG4gICAgICAgICAgICBhY3Rpb24uX2RyYWdQcm94eT8uZHJvcCgpO1xyXG4gICAgICAgICAgICBhY3Rpb24uX2RyYWdQcm94eSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXI/Lm9mZignZHJhZycsIHRoaXMuX2RyYWdFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lcj8ub2ZmKCdkcmFnU3RvcCcsIHRoaXMuX2RyYWdTdG9wRXZlbnRIYW5kbGVyKTtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYXJnZXQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25EcmFnKGV2ZW50OiBFdmVudEVtaXR0ZXIuRHJhZ0V2ZW50KSB7XHJcbiAgICAgICAgbGV0IHRhcmdldDogRHJhZ1RhcmdldCB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgICBcclxuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGRyYWcgdGFyZ2V0IGJ5IGludm9raW5nIGFsbCBhY3Rpb25zLlxyXG4gICAgICAgIC8vIEZvciBzZWNvbmRhcnkgYWN0aW9ucyB0aGUgc2NyZWVuIHBvc2l0aW9uIG9mIHRoZSBldmVudCBoYXZlIHRvIGJlIHRyYW5zbGF0ZWQuXHJcbiAgICAgICAgLy8gVGhlIGZpcnN0IHZhbGlkIHRhcmdldCBpcyBzZWxlY3RlZCwgc3RpbGwgd2Ugd2FudCB0byBpbnZva2UgYWxsIGFjdGlvbnMgZHVlIHRvIHRoZSBjdWxsaW5nIGxvZ2ljIGluIGRyYWdHbG9iYWwuXHJcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5fYWN0aW9ucykge1xyXG4gICAgICAgICAgICBsZXQgdDogRHJhZ1RhcmdldCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFjdGlvbiAhPT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgdCA9IGFjdGlvbi5kcmFnR2xvYmFsKGV2ZW50LnNjcmVlblgsIGV2ZW50LnNjcmVlblkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RyYWdQcm94eSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdCA9IHRoaXMuZHJhZ0xvY2FsKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IG51bGwgfHwgKHQgIT09IG51bGwgJiYgdGFyZ2V0Lm93bmVyLmxheW91dE1hbmFnZXIucGFyZW50ID09PSBudWxsKSkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gbnVsbCB8fCB0aGlzLl9hbGxvd1BvcG91dCkge1xyXG4gICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBkcm9wIGFyZWEgYnV0IGl0IGlzIGluIGEgZGlmZmVyZW50IHdpbmRvdywgaGlkZSB0aGUgaW5kaWNhdG9yLlxyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VGFyZ2V0ICE9PSBudWxsICYmIHRoaXMuY3VycmVudFRhcmdldC5vd25lciAhPT0gdGFyZ2V0Py5vd25lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0Lm93bmVyLmxheW91dE1hbmFnZXIuaGlkZURyb3BUYXJnZXRJbmRpY2F0b3IoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRhcmdldCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gTW92ZSB0aGUgb3duZXIgb2YgdGhlIHRhcmdldCB0byB0aGUgZnJvbnQsIHNvIGl0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBmb3IgZnV0dXJlIGRyYWcgZXZlbnRzLlxyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9hY3Rpb25zLmluZGV4T2YodGFyZ2V0Lm93bmVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGlvbnMudW5zaGlmdCh0YXJnZXQub3duZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRhcmdldC5oaWdobGlnaHREcm9wWm9uZSgpO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Lm93bmVyLmxheW91dE1hbmFnZXIubW92ZVdpbmRvd1RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFNwYXduIGEgc2Vjb25kYXJ5IGRyYWcgYWN0aW9uLCB0aGUgcHJveHkgZWxlbWVudCBpcyBvbmx5IGNyZWF0ZWQgd2hlbiB0aGUgcG9pbnRlciBlbnRlcnMgaXRzIHdpbmRvdy5cclxuICAgIHN0YXRpYyBzcGF3bihsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLCBwYXJlbnQ6IERyYWdBY3Rpb24pOiBEcmFnQWN0aW9uIHtcclxuICAgICAgICBpZiAocGFyZW50Ll9wYXJlbnQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWNvbmRhcnkgRHJhZ0FjdGlvbiBjYW5ub3Qgc3Bhd24gYW5vdGhlciBEcmFnQWN0aW9uLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBEcmFnQWN0aW9uKGxheW91dE1hbmFnZXIsIGZhbHNlLCBwYXJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN0YXJ0IGEgZHJhZyBhY3Rpb24sIGltbWVkaWF0ZWx5IHNob3dpbmcgYSBwcm94eSBlbGVtZW50LlxyXG4gICAgc3RhdGljIHN0YXJ0KGxheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsIGxpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGl0ZW06IENvbXBvbmVudEl0ZW0sIHg6IG51bWJlciwgeTogbnVtYmVyLCBhbGxvd1BvcG91dDogYm9vbGVhbik6IERyYWdBY3Rpb24geyAgICAgICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IG5ldyBEcmFnQWN0aW9uKGxheW91dE1hbmFnZXIsIGFsbG93UG9wb3V0KTtcclxuICAgICAgICBhY3Rpb24uY3JlYXRlUHJveHkoaXRlbSwgeCwgeSk7XHJcbiAgICAgICAgYWN0aW9uLl9kcmFnTGlzdGVuZXIgPSBsaXN0ZW5lcjtcclxuICAgICAgICBsaXN0ZW5lci5vbignZHJhZycsIGFjdGlvbi5fZHJhZ0V2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgbGlzdGVuZXIub24oJ2RyYWdTdG9wJywgYWN0aW9uLl9kcmFnU3RvcEV2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgcmV0dXJuIGFjdGlvbjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IFVuZXhwZWN0ZWROdWxsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbnRlbnQtaXRlbSc7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgU2lkZSwgV2lkdGhBbmRIZWlnaHQgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgICBnZXRVbmlxdWVJZCxcclxuICAgIGdldFdpbmRvd0lubmVyU2NyZWVuUG9zaXRpb24sXHJcbiAgICBudW1iZXJUb1BpeGVsc1xyXG59IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgRHJhZ0FjdGlvbiB9IGZyb20gJy4vZHJhZy1hY3Rpb24nO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgY3JlYXRlcyBhIHRlbXBvcmFyeSBjb250YWluZXJcclxuICogZm9yIHRoZSBjb21wb25lbnQgd2hpbHN0IGl0IGlzIGJlaW5nIGRyYWdnZWRcclxuICogYW5kIGhhbmRsZXMgZHJhZyBldmVudHNcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRHJhZ1Byb3h5IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIHByaXZhdGUgX291dGVyV2lkdGg6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX291dGVySGVpZ2h0OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9zaWRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfcHJveHlDb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX2NvbXBvbmVudEl0ZW1Gb2N1c2VkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3JpZ2luYWxTaXplOiBXaWR0aEFuZEhlaWdodDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RvY2tQb2ludDogQ29udGVudEl0ZW0uRG9ja1BvaW50IHwgbnVsbDtcclxuXHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcbiAgICBnZXQgb3V0ZXJXaWR0aCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fb3V0ZXJXaWR0aDsgfVxyXG4gICAgZ2V0IG91dGVySGVpZ2h0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9vdXRlckhlaWdodDsgfVxyXG4gICAgZ2V0IGNvbXBvbmVudEl0ZW0oKTogQ29tcG9uZW50SXRlbSB7IHJldHVybiB0aGlzLl9jb21wb25lbnRJdGVtOyB9XHJcbiAgICBnZXQgbGF5b3V0TWFuYWdlcigpOiBMYXlvdXRNYW5hZ2VyIHsgcmV0dXJuIHRoaXMuX2FjdGlvbi5sYXlvdXRNYW5hZ2VyOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0geCAtIFRoZSBpbml0aWFsIHggcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB5IC0gVGhlIGluaXRpYWwgeSBwb3NpdGlvblxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2FjdGlvbjogRHJhZ0FjdGlvbixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9jb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtLFxyXG4gICAgICAgIHg6IG51bWJlciwgeTogbnVtYmVyXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl9vcmlnaW5hbFNpemUgPSB0aGlzLl9jb21wb25lbnRJdGVtLmdldE91dGVyQm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVEcmFnUHJveHlFbGVtZW50cyh4LCB5KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW0ucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBfY29udGVudEl0ZW0gd2lsbCBoYXZlIGR1bW15IEdyb3VuZEl0ZW0gYXMgcGFyZW50IGlmIGluaXRpYXRlZCBieSBhIGV4dGVybmFsIGRyYWcgc291cmNlXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdEUEMxMDA5NycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbUZvY3VzZWQgPSB0aGlzLl9jb21wb25lbnRJdGVtLmZvY3VzZWQ7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW1Gb2N1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uYmx1cigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZG9ja1BvaW50ID0gdGhpcy5fY29tcG9uZW50SXRlbS5maW5kRG9ja1BvaW50KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jb21wb25lbnRJdGVtLnBhcmVudC5jb250ZW50SXRlbXMuaW5jbHVkZXModGhpcy5fY29tcG9uZW50SXRlbSkpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5fY29tcG9uZW50SXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmNhbGN1bGF0ZUl0ZW1BcmVhcygpO1xyXG4gICAgICAgIHRoaXMuc2V0RHJvcFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDcmVhdGUgU3RhY2stbGlrZSBzdHJ1Y3R1cmUgdG8gY29udGFpbiB0aGUgZHJhZ2dlZCBjb21wb25lbnQgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlRHJhZ1Byb3h5RWxlbWVudHMoaW5pdGlhbFg6IG51bWJlciwgaW5pdGlhbFk6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnUHJveHkpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBoZWFkZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5IZWFkZXIpO1xyXG4gICAgICAgIGNvbnN0IHRhYnNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGFic0VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlRhYnMpO1xyXG4gICAgICAgIGNvbnN0IHRhYkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0YWJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWIpO1xyXG4gICAgICAgIGNvbnN0IHRpdGxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgICB0aXRsZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlRpdGxlKTtcclxuICAgICAgICB0YWJFbGVtZW50LmFwcGVuZENoaWxkKHRpdGxlRWxlbWVudCk7XHJcbiAgICAgICAgdGFic0VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgaGVhZGVyRWxlbWVudC5hcHBlbmRDaGlsZCh0YWJzRWxlbWVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQ29udGVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGVyRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9wcm94eUNvbnRhaW5lckVsZW1lbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBzaWRlID0gdGhpcy5fY29tcG9uZW50SXRlbS5oZWFkZXJDb25maWc/LnNob3c7XHJcbiAgICAgICAgaWYgKHNpZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2lkZWQgPSBbU2lkZS5yaWdodCwgU2lkZS5sZWZ0XS5pbmNsdWRlcyhzaWRlKTtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsbV8nICsgc2lkZSk7XHJcbiAgICAgICAgICAgIGlmIChbU2lkZS5yaWdodCwgU2lkZS5ib3R0b21dLmluZGV4T2Yoc2lkZSkgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcHJveHlDb250YWluZXJFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBoZWFkZXJFbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscyhpbml0aWFsWCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS50b3AgPSBudW1iZXJUb1BpeGVscyhpbml0aWFsWSk7XHJcbiAgICAgICAgdGFiRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5fY29tcG9uZW50SXRlbS50aXRsZSk7XHJcbiAgICAgICAgdGl0bGVFbGVtZW50Lmluc2VydEFkamFjZW50VGV4dCgnYWZ0ZXJiZWdpbicsIHRoaXMuX2NvbXBvbmVudEl0ZW0udGl0bGUpO1xyXG4gICAgICAgIHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jb21wb25lbnRJdGVtLmVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgb24gZXZlcnkgbW91c2VNb3ZlIGV2ZW50IGR1cmluZyBhIGRyYWcuIERldGVybWluZXMgaWYgdGhlIGRyYWcgaXNcclxuICAgICAqIHN0aWxsIHdpdGhpbiB0aGUgdmFsaWQgZHJhZyBhcmVhIGFuZCBjYWxscyB0aGUgbGF5b3V0TWFuYWdlciB0byBoaWdobGlnaHQgdGhlXHJcbiAgICAgKiBjdXJyZW50IGRyb3AgYXJlYVxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBkcmFnKHg6IG51bWJlciwgeTogbnVtYmVyKTogQ29udGVudEl0ZW0uQXJlYSB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLnNldERyb3BQb3NpdGlvbih4LCB5KTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLmRyYWcoKTtcclxuICAgICAgICByZXR1cm4gYXJlYTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHRhcmdldCBwb3NpdGlvblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB4IC0gVGhlIHggcG9zaXRpb24gaW4gcHhcclxuICAgICAqIEBwYXJhbSB5IC0gVGhlIHkgcG9zaXRpb24gaW4gcHhcclxuICAgICAqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXREcm9wUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBDb250ZW50SXRlbS5BcmVhIHwgbnVsbCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5sZWZ0ID0gbnVtYmVyVG9QaXhlbHMoeCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS50b3AgPSBudW1iZXJUb1BpeGVscyh5KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRNYW5hZ2VyLmdldEFyZWEoeCwgeSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB3aGVuIHRoZSBkcmFnIGhhcyBmaW5pc2hlZC4gRGV0ZXJtaW5lcyB0aGUgZHJvcCBhcmVhXHJcbiAgICAgKiBhbmQgYWRkcyB0aGUgY2hpbGQgdG8gaXRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBkcm9wKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uZXhpdERyYWdNb2RlKCk7XHJcblxyXG4gICAgICAgIGxldCBhcmVhOiBDb250ZW50SXRlbS5BcmVhIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGRyb3BwZWRDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuX2FjdGlvbi5jdXJyZW50VGFyZ2V0O1xyXG4gICAgICAgIGlmICh0YXJnZXQ/Lm93bmVyID09PSB0aGlzLl9hY3Rpb24pIHtcclxuICAgICAgICAgICAgYXJlYSA9IHRhcmdldC5hcmVhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAqIFZhbGlkIGRyb3AgYXJlYSBmb3VuZFxyXG4gICAgICAgICovXHJcbiAgICAgICAgaWYgKGFyZWEgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZHJvcHBlZENvbXBvbmVudEl0ZW0gPSB0aGlzLl9jb21wb25lbnRJdGVtO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdQYXJlbnRDb250ZW50SXRlbSA9IGFyZWEuY29udGVudEl0ZW07XHJcbiAgICAgICAgICAgIG5ld1BhcmVudENvbnRlbnRJdGVtLm9uRHJvcChkcm9wcGVkQ29tcG9uZW50SXRlbSwgYXJlYSk7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5mb2N1c1dpbmRvdygpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBObyB2YWxpZCBkcm9wIGFyZWEgZm91bmQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZHJhZy5cclxuICAgICAgICAgKiBDcmVhdGUgYSBwb3BvdXQuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgPT09IG51bGwgJiYgdGhpcy5fYWN0aW9uLnBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBpbm5lclNjcmVlbiA9IGdldFdpbmRvd0lubmVyU2NyZWVuUG9zaXRpb24oZ2xvYmFsVGhpcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB3aW5kb3cgOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cgPSB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBpbm5lclNjcmVlbi5sZWZ0ICsgdGhpcy5lbGVtZW50Lm9mZnNldExlZnQsXHJcbiAgICAgICAgICAgICAgICB0b3A6IGlubmVyU2NyZWVuLnRvcCArIHRoaXMuZWxlbWVudC5vZmZzZXRUb3AsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5fb3JpZ2luYWxTaXplLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9vcmlnaW5hbFNpemUuaGVpZ2h0XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVQb3BvdXRGcm9tQ29udGVudEl0ZW0odGhpcy5fY29tcG9uZW50SXRlbSwgd2luZG93LCBnZXRVbmlxdWVJZCgpLCB0aGlzLl9kb2NrUG9pbnQpO1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRyYWcgZGlkbid0IHVsdGltYXRlbHkgZW5kIHVwIHdpdGggYWRkaW5nIHRoZSBjb250ZW50IGl0ZW0gdG9cclxuICAgICAgICAgKiBhbnkgY29udGFpbmVyLiBJbiBvcmRlciB0byBlbnN1cmUgY2xlYW4gdXAgaGFwcGVucywgZGVzdHJveSB0aGVcclxuICAgICAgICAgKiBjb250ZW50IGl0ZW0uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5kZXN0cm95KCk7IC8vIGNvbnRlbnRJdGVtIGNoaWxkcmVuIGFyZSBub3cgZGVzdHJveWVkIGFzIHdlbGxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbWl0KCdpdGVtRHJvcHBlZCcsIHRoaXMuX2NvbXBvbmVudEl0ZW0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50SXRlbUZvY3VzZWQpIHtcclxuICAgICAgICAgICAgZHJvcHBlZENvbXBvbmVudEl0ZW0/LmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgRHJhZyBQcm94eSdzIGRpbWVuc2lvbnNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldERpbWVuc2lvbnMoKSB7XHJcbiAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IHRoaXMubGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucztcclxuICAgICAgICBpZiAoZGltZW5zaW9ucyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRHJhZ1Byb3h5LnNldERpbWVuc2lvbnM6IGRpbWVuc2lvbnMgdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgd2lkdGggPSBkaW1lbnNpb25zLmRyYWdQcm94eVdpZHRoO1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSBkaW1lbnNpb25zLmRyYWdQcm94eUhlaWdodDtcclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCB8fCBoZWlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyYWdQcm94eS5zZXREaW1lbnNpb25zOiB3aWR0aCBhbmQvb3IgaGVpZ2h0IHVuZGVmaW5lZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb3V0ZXJXaWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX291dGVySGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckhlaWdodCA9IHRoaXMubGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuaGVhZGVyLnNob3cgPT09IGZhbHNlID8gMCA6IGRpbWVuc2lvbnMuaGVhZGVySGVpZ2h0O1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyh3aWR0aCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBudW1iZXJUb1BpeGVscyhoZWlnaHQpXHJcbiAgICAgICAgd2lkdGggLT0gKHRoaXMuX3NpZGVkID8gaGVhZGVySGVpZ2h0IDogMCk7XHJcbiAgICAgICAgaGVpZ2h0IC09ICghdGhpcy5fc2lkZWQgPyBoZWFkZXJIZWlnaHQgOiAwKTtcclxuICAgICAgICB0aGlzLl9wcm94eUNvbnRhaW5lckVsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyh3aWR0aCk7XHJcbiAgICAgICAgdGhpcy5fcHJveHlDb250YWluZXJFbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKGhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5lbnRlckRyYWdNb2RlKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uc2hvdygpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcgYXMgQ29uZmlnQ29tcG9uZW50SXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9jb25maWcnOyAvLyByZW1vdmUgYWxpYXMgaW4gdmVyc2lvbiAzXHJcbmltcG9ydCB7IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWdcIjtcclxuaW1wb3J0IHsgVW5leHBlY3RlZE51bGxFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgR3JvdW5kSXRlbSB9IGZyb20gJy4uL2l0ZW1zL2dyb3VuZC1pdGVtJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRHJhZ0xpc3RlbmVyIH0gZnJvbSAnLi4vdXRpbHMvZHJhZy1saXN0ZW5lcic7XHJcbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgRHJhZ0FjdGlvbiB9IGZyb20gJy4vZHJhZy1hY3Rpb24nO1xyXG5cclxuLyoqXHJcbiAqIEFsbG93cyBmb3IgYW55IERPTSBpdGVtIHRvIGNyZWF0ZSBhIGNvbXBvbmVudCBvbiBkcmFnXHJcbiAqIHN0YXJ0IHRvIGJlIGRyYWdnZWQgaW50byB0aGUgTGF5b3V0XHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBEcmFnU291cmNlIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2RyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyIHwgbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2R1bW15R3JvdW5kQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2R1bW15R3JvdW5kQ29udGVudEl0ZW06IEdyb3VuZEl0ZW07XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9leHRyYUFsbG93YWJsZUNoaWxkVGFyZ2V0czogSFRNTEVsZW1lbnRbXSxcclxuICAgICAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHJlcGxhY2Ugd2l0aCBjb21wb25lbnRJdGVtQ29uZmlnT3JGdG4gaW4gdmVyc2lvbiAzICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50VHlwZU9yRnRuOiBKc29uVmFsdWUgfCAoKCkgPT4gKERyYWdTb3VyY2UuQ29tcG9uZW50SXRlbUNvbmZpZyB8IENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWcpKSxcclxuICAgICAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHJlbW92ZSBpbiB2ZXJzaW9uIDMgKi9cclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRTdGF0ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgcmVtb3ZlIGluIHZlcnNpb24gMyAqL1xyXG4gICAgICAgIHByaXZhdGUgX3RpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCByZW1vdmUgaW4gdmVyc2lvbiAzICovXHJcbiAgICAgICAgcHJpdmF0ZSBfaWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5fZHVtbXlHcm91bmRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHJcbiAgICAgICAgY29uc3QgZHVtbXlSb290SXRlbUNvbmZpZyA9IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoJ3JvdycpO1xyXG4gICAgICAgIHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0gPSBuZXcgR3JvdW5kSXRlbSh0aGlzLl9sYXlvdXRNYW5hZ2VyLCBkdW1teVJvb3RJdGVtQ29uZmlnLCB0aGlzLl9kdW1teUdyb3VuZENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgIHRoaXMuY3JlYXRlRHJhZ0xpc3RlbmVyKCk7XHJcbiAgICB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc3Bvc2VzIG9mIHRoZSBkcmFnIGxpc3RlbmVycyBzbyB0aGUgZHJhZyBzb3VyY2UgaXMgbm90IHVzYWJsZSBhbnkgbW9yZS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG5cdCAqL1xyXG5cdGRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGluaXRpYWxseSBhbmQgYWZ0ZXIgZXZlcnkgZHJhZ1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlRHJhZ0xpc3RlbmVyKCkge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lciA9IG5ldyBEcmFnTGlzdGVuZXIodGhpcy5fZWxlbWVudCwgdGhpcy5fZXh0cmFBbGxvd2FibGVDaGlsZFRhcmdldHMpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5vbignZHJhZ1N0YXJ0JywgKHgsIHkpID0+IHRoaXMub25EcmFnU3RhcnQoeCwgeSkpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5vbignZHJhZ1N0b3AnLCAoKSA9PiB0aGlzLm9uRHJhZ1N0b3AoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayBmb3IgdGhlIERyYWdMaXN0ZW5lcidzIGRyYWdTdGFydCBldmVudFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB4IC0gVGhlIHggcG9zaXRpb24gb2YgdGhlIG1vdXNlIG9uIGRyYWdTdGFydFxyXG4gICAgICogQHBhcmFtIHkgLSBUaGUgeCBwb3NpdGlvbiBvZiB0aGUgbW91c2Ugb24gZHJhZ1N0YXJ0XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkRyYWdTdGFydCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSAnY29tcG9uZW50JztcclxuICAgICAgICBsZXQgZHJhZ1NvdXJjZUl0ZW1Db25maWc6IENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWc7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fY29tcG9uZW50VHlwZU9yRnRuID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgZnRuRHJhZ1NvdXJjZUl0ZW1Db25maWcgPSB0aGlzLl9jb21wb25lbnRUeXBlT3JGdG4oKSBhcyAoRHJhZ1NvdXJjZS5Db21wb25lbnRJdGVtQ29uZmlnIHwgQ29uZmlnQ29tcG9uZW50SXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb21wb25lbnRUeXBlIHByb3BlcnR5IGV4aXN0cywgdGhlbiBpdCBpcyBhbHJlYWR5IGEgQ29tcG9uZW50SXRlbUNvbmZpZyBzbyBub3RoaW5nIHRvIGRvXHJcbiAgICAgICAgICAgIGlmIChEcmFnU291cmNlLmlzRHJhZ1NvdXJjZUNvbXBvbmVudEl0ZW1Db25maWcoZnRuRHJhZ1NvdXJjZUl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICBkcmFnU291cmNlSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiBmdG5EcmFnU291cmNlSXRlbUNvbmZpZy5zdGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUeXBlOiBmdG5EcmFnU291cmNlSXRlbUNvbmZpZy50eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBmdG5EcmFnU291cmNlSXRlbUNvbmZpZy50aXRsZSA/PyB0aGlzLl90aXRsZSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkcmFnU291cmNlSXRlbUNvbmZpZyA9IGZ0bkRyYWdTb3VyY2VJdGVtQ29uZmlnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZHJhZ1NvdXJjZUl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlLFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50U3RhdGU6IHRoaXMuX2NvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50VHlwZTogdGhpcy5fY29tcG9uZW50VHlwZU9yRnRuLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuX3RpdGxlLFxyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuX2lkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgZHVtbXkgQ29udGVudEl0ZW0gb25seSBmb3IgZHJhZyBwdXJwb3Nlc1xyXG4gICAgICAgIC8vIEFsbCBDb250ZW50SXRlbXMgKGV4Y2VwdCBmb3IgR3JvdW5kSXRlbSkgbmVlZCBhIHBhcmVudC4gIFdoZW4gZHJhZ2dpbmcsIHRoZSBwYXJlbnQgaXMgbm90IHVzZWQuXHJcbiAgICAgICAgLy8gSW5zdGVhZCBvZiBhbGxvd2luZyBudWxsIHBhcmVudHMgKGFzIEphdmFzY3JpcHQgdmVyc2lvbiBkaWQpLCB1c2UgYSB0ZW1wb3JhcnkgZHVtbXkgR3JvdW5kSXRlbSBwYXJlbnQgYW5kIGFkZCBDb250ZW50SXRlbSB0byB0aGF0XHJcbiAgICAgICAgLy8gSWYgdGhpcyBkb2VzIG5vdCB3b3JrLCBuZWVkIHRvIGNyZWF0ZSBhbHRlcm5hdGl2ZSBHcm91bmRJdGVtIGNsYXNzXHJcblxyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkSXRlbUNvbmZpZyA9IENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWcucmVzb2x2ZShkcmFnU291cmNlSXRlbUNvbmZpZywgZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBjb21wb25lbnRJdGVtID0gbmV3IENvbXBvbmVudEl0ZW0odGhpcy5fbGF5b3V0TWFuYWdlciwgcmVzb2x2ZWRJdGVtQ29uZmlnLCB0aGlzLl9kdW1teUdyb3VuZENvbnRlbnRJdGVtKVxyXG4gICAgICAgIHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0uY29udGVudEl0ZW1zLnB1c2goY29tcG9uZW50SXRlbSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnTGlzdGVuZXIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0RTT0RTRDY2NzQ2Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gRHJhZ0FjdGlvbi5zdGFydCh0aGlzLl9sYXlvdXRNYW5hZ2VyLCB0aGlzLl9kcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW0sIHgsIHksIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zaXRpb25JbmRpY2F0b3IgPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLnRyYW5zaXRpb25JbmRpY2F0b3I7XHJcbiAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uSW5kaWNhdG9yID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignRFNPRFNUNjY3NDYnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3h5RWxlbWVudCA9IGFjdGlvbi5wcm94eT8uZWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGlmIChwcm94eUVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0RTT0RTVDY2NzQ3Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbkluZGljYXRvci50cmFuc2l0aW9uRWxlbWVudHModGhpcy5fZWxlbWVudCwgcHJveHlFbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIG9uRHJhZ1N0b3AoKSB7XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIC8vICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEU09EU0RSVTA4MTE2Jyk7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5fZHVtbXlHcm91bmRDb250ZW50SXRlbS5fJGRlc3Ryb3lcclxuICAgICAgICAvLyAgICAgdGhpcy5fZHVtbXlHcm91bmRDb250ZW50SXRlbSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgdGhpcy5jcmVhdGVEcmFnTGlzdGVuZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuXHQgKiBDYWxsZWQgYWZ0ZXIgZXZlcnkgZHJhZyBhbmQgd2hlbiB0aGUgZHJhZyBzb3VyY2UgaXMgYmVpbmcgZGlzcG9zZWQgb2YuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuXHQgKi9cclxuXHRwcml2YXRlIHJlbW92ZURyYWdMaXN0ZW5lcigpIHtcclxuXHRcdGlmICh0aGlzLl9kcmFnTGlzdGVuZXIgIT09IG51bGwgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lciA9IG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIERyYWdTb3VyY2Uge1xyXG4gICAgLyoqIEBkZXByZWNhdGVkICB1c2UgQ29uZmlnIHtAbGluayAoQ29tcG9uZW50SXRlbUNvbmZpZzppbnRlcmZhY2UpfSAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICB0eXBlOiBKc29uVmFsdWUsXHJcbiAgICAgICAgc3RhdGU/OiBKc29uVmFsdWUsXHJcbiAgICAgICAgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkIHJlbW92ZSBpbiB2ZXJzaW9uIDMgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0RyYWdTb3VyY2VDb21wb25lbnRJdGVtQ29uZmlnKFxyXG4gICAgICAgIGNvbmZpZzogRHJhZ1NvdXJjZS5Db21wb25lbnRJdGVtQ29uZmlnIHwgQ29uZmlnQ29tcG9uZW50SXRlbUNvbmZpZ1xyXG4gICAgKTogY29uZmlnIGlzIERyYWdTb3VyY2UuQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuICEoXCJjb21wb25lbnRUeXBlXCIgaW4gY29uZmlnKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQXJlYUxpbmtlZFJlY3QgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7IG51bWJlclRvUGl4ZWxzIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgRHJvcFRhcmdldEluZGljYXRvciB7XHJcbiAgICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICAvLyBNYXliZSB1c2UgY29udGFpbmVyIGluc3RlYWQgb2YgRG9jdW1lbnQgQm9keT9cclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJvcFRhcmdldEluZGljYXRvcik7XHJcbiAgICAgICAgY29uc3QgaW5uZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgaW5uZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Jbm5lcik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZChpbm5lckVsZW1lbnQpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWdobGlnaHRBcmVhKGFyZWE6IEFyZWFMaW5rZWRSZWN0LCBtYXJnaW46IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUubGVmdCA9IG51bWJlclRvUGl4ZWxzKGFyZWEueDEgKyBtYXJnaW4pO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHMoYXJlYS55MSArIG1hcmdpbik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS53aWR0aCA9IG51bWJlclRvUGl4ZWxzKGFyZWEueDIgLSBhcmVhLngxIC0gbWFyZ2luIC0gMSk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBudW1iZXJUb1BpeGVscyhhcmVhLnkyIC0gYXJlYS55MSAtIG1hcmdpbiAtIDEpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEhlYWRlciB9IGZyb20gJy4vaGVhZGVyJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIEhlYWRlckJ1dHRvbiB7XHJcbiAgICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX2NsaWNrRXZlbnRMaXN0ZW5lciA9IChldjogTW91c2VFdmVudCkgPT4gdGhpcy5vbkNsaWNrKGV2KTtcclxuICAgIHByaXZhdGUgX3RvdWNoU3RhcnRFdmVudExpc3RlbmVyID0gKGV2OiBUb3VjaEV2ZW50KSA9PiB0aGlzLm9uVG91Y2hTdGFydChldik7XHJcblxyXG4gICAgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZWxlbWVudDsgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2hlYWRlcjogSGVhZGVyLCBsYWJlbDogc3RyaW5nLCBjc3NDbGFzczogc3RyaW5nLCBwcml2YXRlIF9wdXNoRXZlbnQ6IEhlYWRlckJ1dHRvbi5QdXNoRXZlbnQpIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnRpdGxlID0gbGFiZWw7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLm9uKCdkZXN0cm95JywgKCkgPT4gdGhpcy5kZXN0cm95KCkpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9jbGlja0V2ZW50TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90b3VjaFN0YXJ0RXZlbnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci5jb250cm9sc0NvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fY2xpY2tFdmVudExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90b3VjaFN0YXJ0RXZlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLl9lbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQ2xpY2soZXY6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICB0aGlzLl9wdXNoRXZlbnQoZXYpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Ub3VjaFN0YXJ0KGV2OiBUb3VjaEV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fcHVzaEV2ZW50KGV2KTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEhlYWRlckJ1dHRvbiB7XHJcbiAgICBleHBvcnQgdHlwZSBQdXNoRXZlbnQgPSAodGhpczogdm9pZCwgZXY6IEV2ZW50KSA9PiB2b2lkO1xyXG59XHJcbiIsImltcG9ydCB7IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi4vaXRlbXMvc3RhY2snO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRHJhZ0xpc3RlbmVyIH0gZnJvbSAnLi4vdXRpbHMvZHJhZy1saXN0ZW5lcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBTaWRlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBudW1iZXJUb1BpeGVscywgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5IH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgeyBIZWFkZXJCdXR0b24gfSBmcm9tICcuL2hlYWRlci1idXR0b24nO1xyXG5pbXBvcnQgeyBUYWIgfSBmcm9tICcuL3RhYic7XHJcbmltcG9ydCB7IFRhYnNDb250YWluZXIgfSBmcm9tICcuL3RhYnMtY29udGFpbmVyJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBoZWFkZXIgYWJvdmUgYSBTdGFjayBDb250ZW50SXRlbS5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEhlYWRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJzQ29udGFpbmVyOiBUYWJzQ29udGFpbmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Nob3c6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9wb3BvdXRMYWJlbDogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWF4aW1pc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWluaW1pc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiRHJvcGRvd25FbmFibGVkOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiRHJvcGRvd25MYWJlbDogc3RyaW5nO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkNvbnRyb2xPZmZzZXQ6IG51bWJlcjtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jbGlja0xpc3RlbmVyID0gKGV2OiBNb3VzZUV2ZW50KSA9PiB0aGlzLm9uQ2xpY2soZXYpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdG91Y2hTdGFydExpc3RlbmVyID0gKGV2OiBUb3VjaEV2ZW50KSA9PiB0aGlzLm9uVG91Y2hTdGFydChldik7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudE1vdXNlVXBMaXN0ZW5lcjogKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sYXlvdXRTdGF0ZUxpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkxheW91dENoYW5nZWQoKTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zaWRlOiBTaWRlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbGVmdFJpZ2h0U2lkZWQ6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZUJ1dHRvbjogSGVhZGVyQnV0dG9uO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcG9wb3V0QnV0dG9uOiBIZWFkZXJCdXR0b247XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJEcm9wZG93bkJ1dHRvbjogSGVhZGVyQnV0dG9uO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWF4aW1pc2VCdXR0b246IEhlYWRlckJ1dHRvbjtcclxuICAgIC8vIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIC8vIHByaXZhdGUgX2FjdGl2ZUNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0gfCBudWxsID0gbnVsbDsgLy8gb25seSB1c2VkIHRvIGlkZW50aWZ5IGFjdGl2ZSB0YWJcclxuXHJcbiAgICBnZXQgc2hvdygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3Nob3c7IH1cclxuICAgIGdldCBzaWRlKCk6IFNpZGUgeyByZXR1cm4gdGhpcy5fc2lkZTsgfVxyXG4gICAgZ2V0IGxlZnRSaWdodFNpZGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fbGVmdFJpZ2h0U2lkZWQ7IH1cclxuXHJcbiAgICBnZXQgbGF5b3V0TWFuYWdlcigpOiBMYXlvdXRNYW5hZ2VyIHsgcmV0dXJuIHRoaXMuX2xheW91dE1hbmFnZXI7IH1cclxuICAgIGdldCBwYXJlbnQoKTogU3RhY2sgeyByZXR1cm4gdGhpcy5fcGFyZW50OyB9XHJcbiAgICBnZXQgdGFicygpOiBUYWJbXSB7IHJldHVybiB0aGlzLl90YWJzQ29udGFpbmVyLnRhYnM7IH1cclxuICAgIGdldCBsYXN0VmlzaWJsZVRhYkluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl90YWJzQ29udGFpbmVyLmxhc3RWaXNpYmxlVGFiSW5kZXg7IH1cclxuXHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcbiAgICBnZXQgdGFic0NvbnRhaW5lckVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fdGFic0NvbnRhaW5lci5lbGVtZW50OyB9XHJcbiAgICBnZXQgY29udHJvbHNDb250YWluZXJFbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2NvbnRyb2xzQ29udGFpbmVyRWxlbWVudDsgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9sYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9wYXJlbnQ6IFN0YWNrLFxyXG4gICAgICAgIHNldHRpbmdzOiBIZWFkZXIuU2V0dGluZ3MsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2dldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudDogSGVhZGVyLkdldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudCxcclxuICAgICAgICBjbG9zZUV2ZW50OiBIZWFkZXIuQ2xvc2VFdmVudCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfcG9wb3V0RXZlbnQ6IEhlYWRlci5Qb3BvdXRFdmVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfbWF4aW1pc2VUb2dnbGVFdmVudDogSGVhZGVyLk1heGltaXNlVG9nZ2xlRXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2NsaWNrRXZlbnQ6IEhlYWRlci5DbGlja0V2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF90b3VjaFN0YXJ0RXZlbnQ6IEhlYWRlci5Ub3VjaFN0YXJ0RXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudFJlbW92ZUV2ZW50OiBIZWFkZXIuQ29tcG9uZW50UmVtb3ZlRXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudEZvY3VzRXZlbnQ6IEhlYWRlci5Db21wb25lbnRGb2N1c0V2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnREcmFnU3RhcnRFdmVudDogSGVhZGVyLkNvbXBvbmVudERyYWdTdGFydEV2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lciA9IG5ldyBUYWJzQ29udGFpbmVyKHRoaXMuX2xheW91dE1hbmFnZXIsXHJcbiAgICAgICAgICAgIChpdGVtKSA9PiB0aGlzLmhhbmRsZVRhYkluaXRpYXRlZENvbXBvbmVudFJlbW92ZUV2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJJbml0aWF0ZWRDb21wb25lbnRGb2N1c0V2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoeCwgeSwgZHJhZ0xpc3RlbmVyLCBpdGVtKSA9PiB0aGlzLmhhbmRsZVRhYkluaXRpYXRlZERyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgaXRlbSksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMucHJvY2Vzc1RhYkRyb3Bkb3duQWN0aXZlQ2hhbmdlZCgpLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nob3cgPSBzZXR0aW5ncy5zaG93O1xyXG4gICAgICAgIHRoaXMuX3BvcG91dExhYmVsID0gc2V0dGluZ3MucG9wb3V0TGFiZWw7XHJcbiAgICAgICAgdGhpcy5fbWF4aW1pc2VMYWJlbCA9IHNldHRpbmdzLm1heGltaXNlTGFiZWw7XHJcbiAgICAgICAgdGhpcy5fbWluaW1pc2VMYWJlbCA9IHNldHRpbmdzLm1pbmltaXNlTGFiZWw7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VMYWJlbCA9IHNldHRpbmdzLmNsb3NlTGFiZWw7XHJcbiAgICAgICAgdGhpcy5fdGFiRHJvcGRvd25FbmFibGVkID0gc2V0dGluZ3MudGFiRHJvcGRvd25FbmFibGVkO1xyXG4gICAgICAgIHRoaXMuX3RhYkRyb3Bkb3duTGFiZWwgPSBzZXR0aW5ncy50YWJEcm9wZG93bkxhYmVsO1xyXG4gICAgICAgIHRoaXMuc2V0U2lkZShzZXR0aW5ncy5zaWRlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5IZWFkZXIpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRyb2xzQ29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcclxuICAgICAgICB0aGlzLl9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNvbnRyb2xzKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RhYnNDb250YWluZXIuZWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdGFic0NvbnRhaW5lci5kcm9wZG93bkVsZW1lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fY2xpY2tMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX3RvdWNoU3RhcnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9kb2N1bWVudE1vdXNlVXBMaXN0ZW5lciA9ICgpID0+IHRoaXMuX3RhYnNDb250YWluZXIuaGlkZUFkZGl0aW9uYWxUYWJzRHJvcGRvd24oKVxyXG4gICAgICAgIGdsb2JhbFRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2RvY3VtZW50TW91c2VVcExpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RhYkNvbnRyb2xPZmZzZXQgPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy50YWJDb250cm9sT2Zmc2V0O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fdGFiRHJvcGRvd25FbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYkRyb3Bkb3duQnV0dG9uID0gbmV3IEhlYWRlckJ1dHRvbih0aGlzLCB0aGlzLl90YWJEcm9wZG93bkxhYmVsLCBEb21Db25zdGFudHMuQ2xhc3NOYW1lLlRhYkRyb3Bkb3duLFxyXG4gICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fdGFic0NvbnRhaW5lci5zaG93QWRkaXRpb25hbFRhYnNEcm9wZG93bigpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wb3BvdXRCdXR0b24gPSBuZXcgSGVhZGVyQnV0dG9uKHRoaXMsIHRoaXMuX3BvcG91dExhYmVsLCBEb21Db25zdGFudHMuQ2xhc3NOYW1lLlBvcG91dCwgKCkgPT4gdGhpcy5oYW5kbGVCdXR0b25Qb3BvdXRFdmVudCgpKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTWF4aW1pc2UgY29udHJvbCAtIHNldCB0aGUgY29tcG9uZW50IHRvIHRoZSBmdWxsIHNpemUgb2YgdGhlIGxheW91dFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX21heGltaXNlQnV0dG9uID0gbmV3IEhlYWRlckJ1dHRvbih0aGlzLCB0aGlzLl9tYXhpbWlzZUxhYmVsLCBEb21Db25zdGFudHMuQ2xhc3NOYW1lLk1heGltaXNlLFxyXG4gICAgICAgICAgICAoZXYpID0+IHRoaXMuaGFuZGxlQnV0dG9uTWF4aW1pc2VUb2dnbGVFdmVudChldilcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDbG9zZSBidXR0b25cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbiA9IG5ldyBIZWFkZXJCdXR0b24odGhpcywgdGhpcy5fY2xvc2VMYWJlbCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5DbG9zZSwgKCkgPT4gY2xvc2VFdmVudCgpKTtcclxuXHJcbiAgICAgICAgdGhpcy5wcm9jZXNzVGFiRHJvcGRvd25BY3RpdmVDaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKCdzdGF0ZUNoYW5nZWQnLCB0aGlzLl9sYXlvdXRTdGF0ZUxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoZSBlbnRpcmUgaGVhZGVyXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3knKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcG9wb3V0RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fbWF4aW1pc2VUb2dnbGVFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9jbGlja0V2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX3RvdWNoU3RhcnRFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRSZW1vdmVFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRGb2N1c0V2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudERyYWdTdGFydEV2ZW50ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICB0aGlzLl90YWJzQ29udGFpbmVyLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgZ2xvYmFsVGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fZG9jdW1lbnRNb3VzZVVwTGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5yZW1vdmVFdmVudExpc3RlbmVyKCdzdGF0ZUNoYW5nZWQnLCB0aGlzLl9sYXlvdXRTdGF0ZUxpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyB0YWIgYW5kIGFzc29jaWF0ZXMgaXQgd2l0aCBhIGNvbnRlbnRJdGVtXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgcG9zaXRpb24gb2YgdGhlIHRhYlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVRhYihjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci5jcmVhdGVUYWIoY29tcG9uZW50SXRlbSwgaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgYSB0YWIgYmFzZWQgb24gdGhlIGNvbnRlbnRJdGVtIGl0cyBhc3NvY2lhdGVkIHdpdGggYW5kIHJlbW92ZXMgaXQuXHJcbiAgICAgKiBDYW5ub3QgcmVtb3ZlIHRhYiBpZiBpdCBoYXMgdGhlIGFjdGl2ZSBDb21wb25lbnRJdGVtXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlVGFiKGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90YWJzQ29udGFpbmVyLnJlbW92ZVRhYihjb21wb25lbnRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm9jZXNzQWN0aXZlQ29tcG9uZW50Q2hhbmdlZChuZXdBY3RpdmVDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci5wcm9jZXNzQWN0aXZlQ29tcG9uZW50Q2hhbmdlZChuZXdBY3RpdmVDb21wb25lbnRJdGVtKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVRhYlNpemVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0U2lkZSh2YWx1ZTogU2lkZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3NpZGUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLl9sZWZ0UmlnaHRTaWRlZCA9IFtTaWRlLnJpZ2h0LCBTaWRlLmxlZnRdLmluY2x1ZGVzKHRoaXMuX3NpZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaGVhZGVyIGJ1dHRvbnMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVCdXR0b25zKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNvbXBvbmVudEl0ZW0gPSB0aGlzLl9nZXRBY3RpdmVDb21wb25lbnRJdGVtRXZlbnQoKTtcclxuICAgICAgICBjb25zdCBpc0xhc3QgPSB0aGlzLl9wYXJlbnQuZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCkgPT09IG51bGw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ2xvc2UgYnV0dG9uIGlzIG9ubHkgdmlzaWJsZSBpZiBhbGwgaXRlbXMgb2YgdGhlIHN0YWNrIGFyZSBjbG9zYWJsZVxyXG4gICAgICAgIC8vIGFuZCB0aGUgYWN0aXZlIGNvbXBvbmVudCBoYXMgaXRzIGNsb3NlIGJ1dHRvbiBzZXQgdG8gdmlzaWJsZS4gTm90ZSB0aGF0XHJcbiAgICAgICAgLy8gaGlkaW5nIHRoZSBjbG9zZSBidXR0b24gaW4gYSBoZWFkZXIgb2YgYW4gaXRlbSBpcyBub3QgZXF1aXZhbGVudCB0byBtYWtpbmdcclxuICAgICAgICAvLyB0aGF0IGl0ZW0gdW5jbG9zYWJsZS5cclxuICAgICAgICBjb25zdCBhbGxDbG9zYWJsZSA9IHRoaXMudGFicy5ldmVyeSh0YWIgPT4gdGFiLmNvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSk7XHJcbiAgICAgICAgY29uc3QgY2xvc2UgPSBhY3RpdmVDb21wb25lbnRJdGVtPy5oZWFkZXJDb25maWc/LmNsb3NlICE9PSBmYWxzZTtcclxuICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fY2xvc2VCdXR0b24uZWxlbWVudCwgYWxsQ2xvc2FibGUgJiYgY2xvc2UpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFBvcG91dCBidXR0b24gaXMgdmlzaWJsZSBpZiB0aGUgYWN0aXZlIGNvbXBvbmVudCBpcyBjbG9zYWJsZSBhbmQgaGFzIGl0cyBwb3BvdXQgYnV0dG9uIGVuYWJsZWQuXHJcbiAgICAgICAgLy8gSWYgcG9wb3V0V2hvbGVTdGFjayA9IHRydWUsIHRoZSBidXR0b24gaXMgb25seSB2aXNpYmxlIGlmIGV2ZXJ5IGl0ZW0gaXMgY2xvc2FibGUuXHJcbiAgICAgICAgLy8gQWxzbyB3ZSB3YW50IHRvIHByZXZlbnQgcG9wcGluZyBvdXQgaWYgdGhhdCB3b3VsZCBsZWF2ZSB1cyB3aXRoIGFuIGVtcHR5IGxheW91dC5cclxuICAgICAgICBsZXQgcG9wb3V0ID0gYWN0aXZlQ29tcG9uZW50SXRlbT8uaGVhZGVyQ29uZmlnPy5wb3BvdXQgIT09IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy5wb3BvdXRXaG9sZVN0YWNrKSB7XHJcbiAgICAgICAgICAgIHBvcG91dCAmJj0gIWlzTGFzdCAmJiBhbGxDbG9zYWJsZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjbG9zYWJsZSA9IGFjdGl2ZUNvbXBvbmVudEl0ZW0/LmlzQ2xvc2FibGUgIT09IGZhbHNlO1xyXG4gICAgICAgICAgICBwb3BvdXQgJiY9ICEoaXNMYXN0ICYmIHRoaXMudGFicy5sZW5ndGggPT09IDEpICYmIGNsb3NhYmxlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fcG9wb3V0QnV0dG9uLmVsZW1lbnQsIHBvcG91dCk7XHJcblxyXG4gICAgICAgIC8vIE1heGltaXplIGJ1dHRvbiBpcyB2aXNpYmxlIGlmIHRoZSBhY3RpdmUgY29tcG9uZW50IGhhcyBpdHMgbWF4aW1pemUgYnV0dG9uIGVuYWJsZWQgb3IgdGhlIHN0YWNrIGlzIGFscmVhZHkgbWF4aW1pemVkLlxyXG4gICAgICAgIC8vIEFsc28gaGlkZSBpdCBpZiBzdGFjayBpcyB0aGUgbGFzdCBpdGVtIGluIHRoZSBsYXlvdXQuXHJcbiAgICAgICAgY29uc3QgbWF4aW1pemUgPSAoYWN0aXZlQ29tcG9uZW50SXRlbT8uaGVhZGVyQ29uZmlnPy5tYXhpbWlzZSAhPT0gZmFsc2UgfHwgdGhpcy5fcGFyZW50LmlzTWF4aW1pc2VkKSAmJiAhaXNMYXN0O1xyXG4gICAgICAgIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSh0aGlzLl9tYXhpbWlzZUJ1dHRvbi5lbGVtZW50LCBtYXhpbWl6ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYXBwbHlGb2N1c2VkVmFsdWUodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRm9jdXNlZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRm9jdXNlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb2Nlc3NNYXhpbWlzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX21heGltaXNlQnV0dG9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignSFBNQVgxNjk5NycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21heGltaXNlQnV0dG9uLmVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMuX21pbmltaXNlTGFiZWwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm9jZXNzTWluaW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hQTUlOMTY5OTcnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZUJ1dHRvbi5lbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aGlzLl9tYXhpbWlzZUxhYmVsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQdXNoZXMgdGhlIHRhYnMgdG8gdGhlIHRhYiBkcm9wZG93biBpZiB0aGUgYXZhaWxhYmxlIHNwYWNlIGlzIG5vdCBzdWZmaWNpZW50XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgdXBkYXRlVGFiU2l6ZXMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RhYnNDb250YWluZXIudGFiQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlckhlaWdodCA9IHRoaXMuX3Nob3cgPyB0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5kaW1lbnNpb25zLmhlYWRlckhlaWdodCA6IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fbGVmdFJpZ2h0U2lkZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLndpZHRoID0gbnVtYmVyVG9QaXhlbHMoaGVhZGVySGVpZ2h0KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcclxuICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gbnVtYmVyVG9QaXhlbHMoaGVhZGVySGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgYXZhaWxhYmxlV2lkdGg6IG51bWJlcjtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xlZnRSaWdodFNpZGVkKSB7XHJcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IHRoaXMuX2VsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gdGhpcy5fY29udHJvbHNDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMuX3RhYkNvbnRyb2xPZmZzZXQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IHRoaXMuX2VsZW1lbnQub2Zmc2V0V2lkdGggLSB0aGlzLl9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQub2Zmc2V0V2lkdGggLSB0aGlzLl90YWJDb250cm9sT2Zmc2V0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl90YWJzQ29udGFpbmVyLnVwZGF0ZVRhYlNpemVzKGF2YWlsYWJsZVdpZHRoLCB0aGlzLl9nZXRBY3RpdmVDb21wb25lbnRJdGVtRXZlbnQoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlVGFiSW5pdGlhdGVkQ29tcG9uZW50UmVtb3ZlRXZlbnQoY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jb21wb25lbnRSZW1vdmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hIVENFMjIyOTQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRSZW1vdmVFdmVudChjb21wb25lbnRJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVUYWJJbml0aWF0ZWRDb21wb25lbnRGb2N1c0V2ZW50KGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50Rm9jdXNFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hIVEFFMjIyOTQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRGb2N1c0V2ZW50KGNvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYkluaXRpYXRlZERyYWdTdGFydEV2ZW50KHg6IG51bWJlciwgeTogbnVtYmVyLCBkcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jb21wb25lbnREcmFnU3RhcnRFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hIVERTRTIyMjk0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQoeCwgeSwgZHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBwcm9jZXNzVGFiRHJvcGRvd25BY3RpdmVDaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl90YWJEcm9wZG93bkJ1dHRvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSh0aGlzLl90YWJEcm9wZG93bkJ1dHRvbi5lbGVtZW50LCB0aGlzLl90YWJzQ29udGFpbmVyLmRyb3Bkb3duQWN0aXZlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVCdXR0b25Qb3BvdXRFdmVudCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MucG9wb3V0V2hvbGVTdGFjaykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcG9wb3V0RXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignSEhCUE9FMTc4MzQnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BvcG91dEV2ZW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVDb21wb25lbnRJdGVtID0gdGhpcy5fZ2V0QWN0aXZlQ29tcG9uZW50SXRlbUV2ZW50KCk7XHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmVDb21wb25lbnRJdGVtLnBvcG91dCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGVsc2U6IGlmIHRoZSBzdGFjayBpcyBlbXB0eSB0aGVyZSB3b24ndCBiZSBhbiBhY3RpdmUgaXRlbSAoYW5kIG5vdGhpbmcgdG8gcG9wb3V0KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGhhbmRsZUJ1dHRvbk1heGltaXNlVG9nZ2xlRXZlbnQoZXY6IEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX21heGltaXNlVG9nZ2xlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISEJNVEUxNjgzNCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21heGltaXNlVG9nZ2xlRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGhlYWRlcidzIGJhY2tncm91bmQgaXMgY2xpY2tlZCAobm90IGl0J3MgdGFicyBvciBjb250cm9scylcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpY2soZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgaGVhZGVyJ3MgYmFja2dyb3VuZCBpcyB0b3VjaGVkIChub3QgaXQncyB0YWJzIG9yIGNvbnRyb2xzKVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25Ub3VjaFN0YXJ0KGV2ZW50OiBUb3VjaEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeVRvdWNoU3RhcnQoZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIG9uTGF5b3V0Q2hhbmdlZCgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUJ1dHRvbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIG5vdGlmeUNsaWNrKGV2OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NsaWNrRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdITkhDNDY4MzQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jbGlja0V2ZW50KGV2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBub3RpZnlUb3VjaFN0YXJ0KGV2OiBUb3VjaEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RvdWNoU3RhcnRFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hOSFRTNDY4MzQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl90b3VjaFN0YXJ0RXZlbnQoZXYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBIZWFkZXIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgR2V0QWN0aXZlQ29tcG9uZW50SXRlbUV2ZW50ID0gKHRoaXM6IHZvaWQpID0+IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBDbG9zZUV2ZW50ID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBQb3BvdXRFdmVudCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgTWF4aW1pc2VUb2dnbGVFdmVudCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2xpY2tFdmVudCA9ICh0aGlzOiB2b2lkLCBldjogTW91c2VFdmVudCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIFRvdWNoU3RhcnRFdmVudCA9ICh0aGlzOiB2b2lkLCBldjogVG91Y2hFdmVudCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudFJlbW92ZUV2ZW50ID0gKHRoaXM6IHZvaWQsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRGb2N1c0V2ZW50ID0gKHRoaXM6IHZvaWQsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnREcmFnU3RhcnRFdmVudCA9ICh0aGlzOiB2b2lkLCB4OiBudW1iZXIsIHk6IG51bWJlciwgZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBTdGF0ZUNoYW5nZWRFdmVudCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3Mge1xyXG4gICAgICAgIHNob3c6IGJvb2xlYW47XHJcbiAgICAgICAgc2lkZTogU2lkZTtcclxuICAgICAgICBwb3BvdXRFbmFibGVkOiBib29sZWFuO1xyXG4gICAgICAgIHBvcG91dExhYmVsOiBzdHJpbmc7XHJcbiAgICAgICAgbWF4aW1pc2VFbmFibGVkOiBib29sZWFuO1xyXG4gICAgICAgIG1heGltaXNlTGFiZWw6IHN0cmluZztcclxuICAgICAgICBtaW5pbWlzZUVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICAgICAgbWluaW1pc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgICAgIGNsb3NlRW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICBjbG9zZUxhYmVsOiBzdHJpbmc7XHJcbiAgICAgICAgdGFiRHJvcGRvd25FbmFibGVkOiBib29sZWFuO1xyXG4gICAgICAgIHRhYkRyb3Bkb3duTGFiZWw6IHN0cmluZztcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRHJhZ0xpc3RlbmVyIH0gZnJvbSAnLi4vdXRpbHMvZHJhZy1saXN0ZW5lcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBudW1iZXJUb1BpeGVscyB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFNwbGl0dGVyIHtcclxuICAgIHByaXZhdGUgX2dyYWJTaXplO1xyXG4gICAgcHJpdmF0ZSBfZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXI7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTERpdkVsZW1lbnQ7XHJcblxyXG4gICAgZ2V0IGVsZW1lbnQoKTogSFRNTERpdkVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZWxlbWVudDsgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2lzVmVydGljYWw6IGJvb2xlYW4sIHByaXZhdGUgX3NpemU6IG51bWJlciwgZ3JhYlNpemU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2dyYWJTaXplID0gZ3JhYlNpemUgPCB0aGlzLl9zaXplID8gdGhpcy5fc2l6ZSA6IGdyYWJTaXplO1xyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuU3BsaXR0ZXIpO1xyXG4gICAgICAgIGNvbnN0IGRyYWdIYW5kbGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgZHJhZ0hhbmRsZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyYWdIYW5kbGUpO1xyXG5cclxuICAgICAgICBjb25zdCBoYW5kbGVFeGNlc3NTaXplID0gdGhpcy5fZ3JhYlNpemUgLSB0aGlzLl9zaXplO1xyXG4gICAgICAgIGNvbnN0IGhhbmRsZUV4Y2Vzc1BvcyA9IGhhbmRsZUV4Y2Vzc1NpemUgLyAyO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5faXNWZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICBkcmFnSGFuZGxlRWxlbWVudC5zdHlsZS50b3AgPSBudW1iZXJUb1BpeGVscygtaGFuZGxlRXhjZXNzUG9zKTtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gbnVtYmVyVG9QaXhlbHModGhpcy5fc2l6ZSArIGhhbmRsZUV4Y2Vzc1NpemUpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5WZXJ0aWNhbCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gbnVtYmVyVG9QaXhlbHModGhpcy5fc2l6ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZUVsZW1lbnQuc3R5bGUubGVmdCA9IG51bWJlclRvUGl4ZWxzKC1oYW5kbGVFeGNlc3NQb3MpO1xyXG4gICAgICAgICAgICBkcmFnSGFuZGxlRWxlbWVudC5zdHlsZS53aWR0aCA9IG51bWJlclRvUGl4ZWxzKHRoaXMuX3NpemUgKyBoYW5kbGVFeGNlc3NTaXplKTtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSG9yaXpvbnRhbCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyh0aGlzLl9zaXplKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQoZHJhZ0hhbmRsZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBuZXcgRHJhZ0xpc3RlbmVyKHRoaXMuX2VsZW1lbnQsIFtkcmFnSGFuZGxlRWxlbWVudF0pO1xyXG4gICAgfVxyXG5cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbjxLIGV4dGVuZHMga2V5b2YgRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwPihldmVudE5hbWU6IEssIGNhbGxiYWNrOiBFdmVudEVtaXR0ZXIuQ2FsbGJhY2s8Sz4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIub248Sz4oZXZlbnROYW1lLCBjYWxsYmFjayk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCB0YWIgd2l0aGluIGEgU3RhY2sncyBoZWFkZXJcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRhYiB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50OiBIVE1MRGl2RWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RpdGxlRWxlbWVudDogSFRNTFNwYW5FbGVtZW50O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2VFbGVtZW50OiBIVE1MRGl2RWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2lzQWN0aXZlID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiQ2xpY2tMaXN0ZW5lciA9IChldjogTW91c2VFdmVudCkgPT4gdGhpcy5vblRhYkNsaWNrRG93bihldik7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJUb3VjaFN0YXJ0TGlzdGVuZXIgPSAoZXY6IFRvdWNoRXZlbnQpID0+IHRoaXMub25UYWJUb3VjaFN0YXJ0KGV2KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Nsb3NlQ2xpY2tMaXN0ZW5lciA9ICgpID0+IHRoaXMub25DbG9zZUNsaWNrKCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZVRvdWNoU3RhcnRMaXN0ZW5lciA9ICgpID0+IHRoaXMub25DbG9zZVRvdWNoU3RhcnQoKTtcclxuICAgIC8vIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIC8vIHByaXZhdGUgcmVhZG9ubHkgX2Nsb3NlTW91c2VEb3duTGlzdGVuZXIgPSAoKSA9PiB0aGlzLm9uQ2xvc2VNb3VzZWRvd24oKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RyYWdTdGFydExpc3RlbmVyID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB0aGlzLm9uRHJhZ1N0YXJ0KHgsIHkpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGVudEl0ZW1EZXN0cm95TGlzdGVuZXIgPSAoKSA9PiB0aGlzLm9uQ29udGVudEl0ZW1EZXN0cm95KCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJUaXRsZUNoYW5nZWRMaXN0ZW5lciA9ICh0aXRsZTogc3RyaW5nKSA9PiB0aGlzLnNldFRpdGxlKHRpdGxlKVxyXG5cclxuICAgIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzQWN0aXZlOyB9XHJcbiAgICAvLyBnZXQgaGVhZGVyKCk6IEhlYWRlciB7IHJldHVybiB0aGlzLl9oZWFkZXI7IH1cclxuICAgIGdldCBjb21wb25lbnRJdGVtKCk6IENvbXBvbmVudEl0ZW0geyByZXR1cm4gdGhpcy5fY29tcG9uZW50SXRlbTsgfVxyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFRhYjpjbGFzcykuY29tcG9uZW50SXRlbX0gKi9cclxuICAgIGdldCBjb250ZW50SXRlbSgpOiBDb21wb25lbnRJdGVtIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudEl0ZW07IH1cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuICAgIGdldCB0aXRsZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fdGl0bGVFbGVtZW50OyB9XHJcbiAgICBnZXQgY2xvc2VFbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2Nsb3NlRWxlbWVudDsgfVxyXG4gICAgZ2V0IHJlb3JkZXJFbmFibGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fZHJhZ0xpc3RlbmVyICE9PSB1bmRlZmluZWQ7IH1cclxuICAgIHNldCByZW9yZGVyRW5hYmxlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5yZW9yZGVyRW5hYmxlZCkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlUmVvcmRlcigpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlUmVvcmRlcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9sYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jbG9zZUV2ZW50OiBUYWIuQ2xvc2VFdmVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfZm9jdXNFdmVudDogVGFiLkZvY3VzRXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2RyYWdTdGFydEV2ZW50OiBUYWIuRHJhZ1N0YXJ0RXZlbnQgfCB1bmRlZmluZWRcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWIpO1xyXG4gICAgICAgIHRoaXMuX3RpdGxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgXHJcbiAgICAgICAgdGhpcy5fdGl0bGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UaXRsZSk7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IFxyXG4gICAgICAgIHRoaXMuX2Nsb3NlRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQ2xvc2VUYWIpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdGl0bGVFbGVtZW50KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2Nsb3NlRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGlmIChfY29tcG9uZW50SXRlbS5pc0Nsb3NhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQ2xvc2FibGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRUaXRsZShfY29tcG9uZW50SXRlbS50aXRsZSk7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5vbigndGl0bGVDaGFuZ2VkJywgdGhpcy5fdGFiVGl0bGVDaGFuZ2VkTGlzdGVuZXIpO1xyXG5cclxuICAgICAgICBjb25zdCByZW9yZGVyRW5hYmxlZCA9IF9jb21wb25lbnRJdGVtLnJlb3JkZXJFbmFibGVkID8/IHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnJlb3JkZXJFbmFibGVkO1xyXG5cclxuICAgICAgICBpZiAocmVvcmRlckVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5lbmFibGVSZW9yZGVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fdGFiQ2xpY2tMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX3RhYlRvdWNoU3RhcnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50SXRlbS5pc0Nsb3NhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2Nsb3NlQ2xpY2tMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX2Nsb3NlVG91Y2hTdGFydExpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuX2Nsb3NlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9jbG9zZU1vdXNlRG93bkxpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLnNldFRhYih0aGlzKTtcclxuICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmVtaXQoJ3RhYkNyZWF0ZWQnLCB0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHRhYidzIHRpdGxlIHRvIHRoZSBwcm92aWRlZCBzdHJpbmcgYW5kIHNldHNcclxuICAgICAqIGl0cyB0aXRsZSBhdHRyaWJ1dGUgdG8gYSBwdXJlIHRleHQgcmVwcmVzZW50YXRpb24gKHdpdGhvdXRcclxuICAgICAqIGh0bWwgdGFncykgb2YgdGhlIHNhbWUgc3RyaW5nLlxyXG4gICAgICovXHJcbiAgICBzZXRUaXRsZSh0aXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGl0bGVFbGVtZW50LmlubmVyVGV4dCA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQudGl0bGUgPSB0aXRsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhpcyB0YWIncyBhY3RpdmUgc3RhdGUuIFRvIHByb2dyYW1tYXRpY2FsbHlcclxuICAgICAqIHN3aXRjaCB0YWJzLCB1c2UgU3RhY2suc2V0QWN0aXZlQ29tcG9uZW50SXRlbSggaXRlbSApIGluc3RlYWQuXHJcbiAgICAgKi9cclxuICAgIHNldEFjdGl2ZShpc0FjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmIChpc0FjdGl2ZSA9PT0gdGhpcy5faXNBY3RpdmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9pc0FjdGl2ZSA9IGlzQWN0aXZlO1xyXG5cclxuICAgICAgICBpZiAoaXNBY3RpdmUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQWN0aXZlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5BY3RpdmUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoZSB0YWJcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlRXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fZm9jdXNFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9kcmFnU3RhcnRFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fdGFiQ2xpY2tMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fdGFiVG91Y2hTdGFydExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fY2xvc2VDbGlja0xpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9jbG9zZVRvdWNoU3RhcnRMaXN0ZW5lcik7XHJcbiAgICAgICAgLy8gdGhpcy5fY2xvc2VFbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9jbG9zZU1vdXNlRG93bkxpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLm9mZigndGl0bGVDaGFuZ2VkJywgdGhpcy5fdGFiVGl0bGVDaGFuZ2VkTGlzdGVuZXIpO1xyXG4gICAgICAgIGlmICh0aGlzLnJlb3JkZXJFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVJlb3JkZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzZXRCbHVycmVkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgICAgIHRoaXMuX3RpdGxlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRm9jdXNlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0Rm9jdXNlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Gb2N1c2VkKTtcclxuICAgICAgICB0aGlzLl90aXRsZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgZm9yIHRoZSBEcmFnTGlzdGVuZXJcclxuICAgICAqIEBwYXJhbSB4IC0gVGhlIHRhYnMgYWJzb2x1dGUgeCBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHkgLSBUaGUgdGFicyBhYnNvbHV0ZSB5IHBvc2l0aW9uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkRyYWdTdGFydCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnTGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdUT0RTRExVMTAwOTMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZHJhZ1N0YXJ0RXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignVE9EUzIzMzA5Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kcmFnU3RhcnRFdmVudCh4LCB5LCB0aGlzLl9kcmFnTGlzdGVuZXIsIHRoaXMuY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgb25Db250ZW50SXRlbURlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lciA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB3aGVuIHRoZSB0YWIgaXMgY2xpY2tlZFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25UYWJDbGlja0Rvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gdGhpcy5fZWxlbWVudCB8fCB0YXJnZXQgPT09IHRoaXMuX3RpdGxlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBsZWZ0IG1vdXNlIGJ1dHRvblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Rm9jdXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBtaWRkbGUgbW91c2UgYnV0dG9uXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYnV0dG9uID09PSAxICYmIHRoaXMuX2NvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNsb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBvblRhYlRvdWNoU3RhcnQoZXZlbnQ6IFRvdWNoRXZlbnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Rm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB3aGVuIHRoZSB0YWIncyBjbG9zZSBidXR0b24gaXMgY2xpY2tlZFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25DbG9zZUNsaWNrKCkge1xyXG4gICAgICAgIHRoaXMubm90aWZ5Q2xvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIG9uQ2xvc2VUb3VjaFN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMubm90aWZ5Q2xvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIHRvIGNhcHR1cmUgdGFiIGNsb3NlIGJ1dHRvbiBtb3VzZWRvd25cclxuICAgICAqIHRvIHByZXZlbnQgdGFiIGZyb20gYWN0aXZhdGluZy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICAvLyBwcml2YXRlIG9uQ2xvc2VNb3VzZWRvd24oKTogdm9pZCB7XHJcbiAgICAvLyAgICAgLy8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBub3RpZnlDbG9zZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fY2xvc2VFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1ROQzE1MDA3Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xvc2VFdmVudCh0aGlzLl9jb21wb25lbnRJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBub3RpZnlGb2N1cygpIHtcclxuICAgICAgICBpZiAodGhpcy5fZm9jdXNFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1ROQTE1MDA3Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZm9jdXNFdmVudCh0aGlzLl9jb21wb25lbnRJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBlbmFibGVSZW9yZGVyKCkge1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lciA9IG5ldyBEcmFnTGlzdGVuZXIodGhpcy5fZWxlbWVudCwgW3RoaXMuX3RpdGxlRWxlbWVudF0pO1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5vbignZHJhZ1N0YXJ0JywgdGhpcy5fZHJhZ1N0YXJ0TGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0ub24oJ2Rlc3Ryb3knLCB0aGlzLl9jb250ZW50SXRlbURlc3Ryb3lMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBkaXNhYmxlUmVvcmRlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5fZHJhZ0xpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignVERSODc3NDUnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLm9mZignZGVzdHJveScsIHRoaXMuX2NvbnRlbnRJdGVtRGVzdHJveUxpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyLm9mZignZHJhZ1N0YXJ0JywgdGhpcy5fZHJhZ1N0YXJ0TGlzdGVuZXIpO1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFRhYiB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBDbG9zZUV2ZW50ID0gKGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBGb2N1c0V2ZW50ID0gKGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBEcmFnU3RhcnRFdmVudCA9ICh4OiBudW1iZXIsIHk6IG51bWJlciwgZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pID0+IHZvaWQ7XHJcbn1cclxuIiwiaW1wb3J0IHsgQXNzZXJ0RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRHJhZ0xpc3RlbmVyIH0gZnJvbSAnLi4vdXRpbHMvZHJhZy1saXN0ZW5lcic7XHJcbmltcG9ydCB7IG51bWJlclRvUGl4ZWxzLCBwaXhlbHNUb051bWJlciB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgVGFiIH0gZnJvbSAnLi90YWInO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgVGFic0NvbnRhaW5lciB7XHJcbiAgICAvLyBUaGVyZSBpcyBvbmUgdGFiIHBlciBDb21wb25lbnRJdGVtIGluIHN0YWNrLiAgSG93ZXZlciB0aGV5IG1heSBub3QgYmUgb3JkZXJlZCB0aGUgc2FtZVxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiczogVGFiW10gPSBbXTtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kcm9wZG93bkVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF9sYXN0VmlzaWJsZVRhYkluZGV4ID0gLTE7XHJcbiAgICBwcml2YXRlIF9kcm9wZG93bkFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgIGdldCB0YWJzKCk6IFRhYltdIHsgcmV0dXJuIHRoaXMuX3RhYnM7IH1cclxuICAgIGdldCB0YWJDb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fdGFicy5sZW5ndGg7IH1cclxuICAgIGdldCBsYXN0VmlzaWJsZVRhYkluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9sYXN0VmlzaWJsZVRhYkluZGV4OyB9XHJcblxyXG4gICAgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZWxlbWVudDsgfVxyXG4gICAgZ2V0IGRyb3Bkb3duRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9kcm9wZG93bkVsZW1lbnQ7IH1cclxuICAgIGdldCBkcm9wZG93bkFjdGl2ZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2Ryb3Bkb3duQWN0aXZlOyB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRSZW1vdmVFdmVudDogVGFic0NvbnRhaW5lci5Db21wb25lbnRJdGVtUmVtb3ZlRXZlbnQsXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50Rm9jdXNFdmVudDogVGFic0NvbnRhaW5lci5Db21wb25lbnRJdGVtRm9jdXNFdmVudCxcclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnREcmFnU3RhcnRFdmVudDogVGFic0NvbnRhaW5lci5Db21wb25lbnRJdGVtRHJhZ1N0YXJ0RXZlbnQsXHJcbiAgICAgICAgcHJpdmF0ZSBfZHJvcGRvd25BY3RpdmVDaGFuZ2VkRXZlbnQ6IFRhYnNDb250YWluZXIuRHJvcGRvd25BY3RpdmVDaGFuZ2VkRXZlbnQsXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlRhYnMpO1xyXG5cclxuICAgICAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XHJcbiAgICAgICAgdGhpcy5fZHJvcGRvd25FbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWJEcm9wZG93bkxpc3QpO1xyXG4gICAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfVxyXG5cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90YWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYnNbaV0uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGFiIGFuZCBhc3NvY2lhdGVzIGl0IHdpdGggYSBjb250ZW50SXRlbVxyXG4gICAgICogQHBhcmFtIGluZGV4IC0gVGhlIHBvc2l0aW9uIG9mIHRoZSB0YWJcclxuICAgICAqL1xyXG4gICAgY3JlYXRlVGFiKGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICAvL0lmIHRoZXJlJ3MgYWxyZWFkeSBhIHRhYiByZWxhdGluZyB0byB0aGVcclxuICAgICAgICAvL2NvbnRlbnQgaXRlbSwgZG9uJ3QgZG8gYW55dGhpbmdcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3RhYnNbaV0uY29tcG9uZW50SXRlbSA9PT0gY29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0YWIgPSBuZXcgVGFiKHRoaXMuX2xheW91dE1hbmFnZXIsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudEl0ZW0sXHJcbiAgICAgICAgICAgIChpdGVtKSA9PiB0aGlzLmhhbmRsZVRhYkNsb3NlRXZlbnQoaXRlbSksXHJcbiAgICAgICAgICAgIChpdGVtKSA9PiB0aGlzLmhhbmRsZVRhYkZvY3VzRXZlbnQoaXRlbSksXHJcbiAgICAgICAgICAgICh4LCB5LCBkcmFnTGlzdGVuZXIsIGl0ZW0pID0+IHRoaXMuaGFuZGxlVGFiRHJhZ1N0YXJ0RXZlbnQoeCwgeSwgZHJhZ0xpc3RlbmVyLCBpdGVtKSk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5fdGFicy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl90YWJzLnNwbGljZShpbmRleCwgMCwgdGFiKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5fZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50Lmluc2VydEJlZm9yZSh0YWIuZWxlbWVudCwgdGhpcy5fZWxlbWVudC5jaGlsZE5vZGVzW2luZGV4XSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0YWIuZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZVRhYihjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgLy8gY29tcG9uZW50SXRlbSBjYW5ub3QgYmUgQWN0aXZlQ29tcG9uZW50SXRlbVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdGFicy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fdGFic1tpXS5jb21wb25lbnRJdGVtID09PSBjb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWIgPSB0aGlzLl90YWJzW2ldO1xyXG4gICAgICAgICAgICAgICAgdGFiLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RhYnMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbnRlbnRJdGVtIGlzIG5vdCBjb250cm9sbGVkIGJ5IHRoaXMgaGVhZGVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc0FjdGl2ZUNvbXBvbmVudENoYW5nZWQobmV3QWN0aXZlQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBhY3RpdmVJbmRleCA9IC0xO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdGFicy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpc0FjdGl2ZSA9IHRoaXMuX3RhYnNbaV0uY29tcG9uZW50SXRlbSA9PT0gbmV3QWN0aXZlQ29tcG9uZW50SXRlbTtcclxuICAgICAgICAgICAgdGhpcy5fdGFic1tpXS5zZXRBY3RpdmUoaXNBY3RpdmUpO1xyXG4gICAgICAgICAgICBpZiAoaXNBY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGFjdGl2ZUluZGV4ID0gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFjdGl2ZUluZGV4IDwgMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0hTQUNJNTY2MzInKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MucmVvcmRlck9uVGFiTWVudUNsaWNrKSB7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIElmIHRoZSB0YWIgc2VsZWN0ZWQgd2FzIGluIHRoZSBkcm9wZG93biwgbW92ZSBldmVyeXRoaW5nIGRvd24gb25lIHRvIG1ha2Ugd2F5IGZvciB0aGlzIG9uZSB0byBiZSB0aGUgZmlyc3QuXHJcbiAgICAgICAgICAgICAgICAgKiBUaGlzIHdpbGwgbWFrZSBzdXJlIHRoZSBtb3N0IHVzZWQgdGFicyBzdGF5IHZpc2libGUuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9sYXN0VmlzaWJsZVRhYkluZGV4ICE9PSAtMSAmJiBhY3RpdmVJbmRleCA+IHRoaXMuX2xhc3RWaXNpYmxlVGFiSW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVUYWIgPSB0aGlzLl90YWJzW2FjdGl2ZUluZGV4XTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gYWN0aXZlSW5kZXg7IGogPiAwOyBqLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFic1tqXSA9IHRoaXMuX3RhYnNbaiAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YWJzWzBdID0gYWN0aXZlVGFiO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVUYWJTaXplcyB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgYWZ0ZXIgdGhpcyBhbmQgaXQgd2lsbCByZXBvc2l0aW9uIHRhYiBlbGVtZW50c1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHVzaGVzIHRoZSB0YWJzIHRvIHRoZSB0YWIgZHJvcGRvd24gaWYgdGhlIGF2YWlsYWJsZSBzcGFjZSBpcyBub3Qgc3VmZmljaWVudFxyXG4gICAgICovXHJcbiAgICB1cGRhdGVUYWJTaXplcyhhdmFpbGFibGVXaWR0aDogbnVtYmVyLCBhY3RpdmVDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGRyb3BEb3duQWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMudHJ5VXBkYXRlVGFiU2l6ZXMoZHJvcERvd25BY3RpdmUsIGF2YWlsYWJsZVdpZHRoLCBhY3RpdmVDb21wb25lbnRJdGVtKTtcclxuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgZHJvcERvd25BY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgYWx3YXlzIHN1Y2NlZWRcclxuICAgICAgICAgICAgdGhpcy50cnlVcGRhdGVUYWJTaXplcyhkcm9wRG93bkFjdGl2ZSwgYXZhaWxhYmxlV2lkdGgsIGFjdGl2ZUNvbXBvbmVudEl0ZW0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZHJvcERvd25BY3RpdmUgIT09IHRoaXMuX2Ryb3Bkb3duQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Ryb3Bkb3duQWN0aXZlID0gZHJvcERvd25BY3RpdmU7XHJcbiAgICAgICAgICAgIHRoaXMuX2Ryb3Bkb3duQWN0aXZlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRyeVVwZGF0ZVRhYlNpemVzKGRyb3Bkb3duQWN0aXZlOiBib29sZWFuLCBhdmFpbGFibGVXaWR0aDogbnVtYmVyLCBhY3RpdmVDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RhYnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlQ29tcG9uZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vbi1lbXB0eSB0YWJzIG11c3QgaGF2ZSBhY3RpdmUgY29tcG9uZW50IGl0ZW0nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGN1bXVsYXRpdmVUYWJXaWR0aCA9IDA7XHJcbiAgICAgICAgICAgIGxldCB0YWJPdmVybGFwQWxsb3dhbmNlRXhjZWVkZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgY29uc3QgdGFiT3ZlcmxhcEFsbG93YW5jZSA9IHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnRhYk92ZXJsYXBBbGxvd2FuY2U7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gdGhpcy5fdGFicy5pbmRleE9mKGFjdGl2ZUNvbXBvbmVudEl0ZW0udGFiKTtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlVGFiID0gdGhpcy5fdGFic1thY3RpdmVJbmRleF07XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RWaXNpYmxlVGFiSW5kZXggPSAtMTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdGFicy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiRWxlbWVudCA9IHRoaXMuX3RhYnNbaV0uZWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgICAgICAvL1B1dCB0aGUgdGFiIGluIHRoZSB0YWJDb250YWluZXIgc28gaXRzIHRydWUgd2lkdGggY2FuIGJlIGNoZWNrZWRcclxuICAgICAgICAgICAgICAgIGlmICh0YWJFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRhYkVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiTWFyZ2luUmlnaHRQaXhlbHMgPSBnZXRDb21wdXRlZFN0eWxlKGFjdGl2ZVRhYi5lbGVtZW50KS5tYXJnaW5SaWdodDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYk1hcmdpblJpZ2h0ID0gcGl4ZWxzVG9OdW1iZXIodGFiTWFyZ2luUmlnaHRQaXhlbHMpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiV2lkdGggPSB0YWJFbGVtZW50Lm9mZnNldFdpZHRoICsgdGFiTWFyZ2luUmlnaHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgY3VtdWxhdGl2ZVRhYldpZHRoICs9IHRhYldpZHRoO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vSW5jbHVkZSB0aGUgYWN0aXZlIHRhYidzIHdpZHRoIGlmIGl0IGlzbid0IGFscmVhZHlcclxuICAgICAgICAgICAgICAgIC8vVGhpcyBpcyB0byBlbnN1cmUgdGhlcmUgaXMgcm9vbSB0byBzaG93IHRoZSBhY3RpdmUgdGFiXHJcbiAgICAgICAgICAgICAgICBsZXQgdmlzaWJsZVRhYldpZHRoID0gMDtcclxuICAgICAgICAgICAgICAgIGlmIChhY3RpdmVJbmRleCA8PSBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZVRhYldpZHRoID0gY3VtdWxhdGl2ZVRhYldpZHRoO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVUYWJNYXJnaW5SaWdodFBpeGVscyA9IGdldENvbXB1dGVkU3R5bGUoYWN0aXZlVGFiLmVsZW1lbnQpLm1hcmdpblJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVRhYk1hcmdpblJpZ2h0ID0gcGl4ZWxzVG9OdW1iZXIoYWN0aXZlVGFiTWFyZ2luUmlnaHRQaXhlbHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGVUYWJXaWR0aCA9IGN1bXVsYXRpdmVUYWJXaWR0aCArIGFjdGl2ZVRhYi5lbGVtZW50Lm9mZnNldFdpZHRoICsgYWN0aXZlVGFiTWFyZ2luUmlnaHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHRhYnMgd29uJ3QgZml0LCBjaGVjayB0aGUgb3ZlcmxhcCBhbGxvd2FuY2UuXHJcbiAgICAgICAgICAgICAgICBpZiAodmlzaWJsZVRhYldpZHRoID4gYXZhaWxhYmxlV2lkdGgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9PbmNlIGFsbG93YW5jZSBpcyBleGNlZWRlZCwgYWxsIHJlbWFpbmluZyB0YWJzIGdvIHRvIG1lbnUuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJPdmVybGFwQWxsb3dhbmNlRXhjZWVkZWQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vTm8gb3ZlcmxhcCBmb3IgZmlyc3QgdGFiIG9yIGFjdGl2ZSB0YWJcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9PdmVybGFwIHNwcmVhZHMgYW1vbmcgbm9uLWFjdGl2ZSwgbm9uLWZpcnN0IHRhYnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG92ZXJsYXA6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUluZGV4ID4gMCAmJiBhY3RpdmVJbmRleCA8PSBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGFwID0gKHZpc2libGVUYWJXaWR0aCAtIGF2YWlsYWJsZVdpZHRoKSAvIChpIC0gMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGFwID0gKHZpc2libGVUYWJXaWR0aCAtIGF2YWlsYWJsZVdpZHRoKSAvIGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgb3ZlcmxhcCBhZ2FpbnN0IGFsbG93YW5jZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJsYXAgPCB0YWJPdmVybGFwQWxsb3dhbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBpOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXJnaW5MZWZ0ID0gKGogIT09IGFjdGl2ZUluZGV4ICYmIGogIT09IDApID8gJy0nICsgbnVtYmVyVG9QaXhlbHMob3ZlcmxhcCkgOiAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90YWJzW2pdLmVsZW1lbnQuc3R5bGUuekluZGV4ID0gbnVtYmVyVG9QaXhlbHMoaSAtIGopO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhYnNbal0uZWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gbWFyZ2luTGVmdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RWaXNpYmxlVGFiSW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYkVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJPdmVybGFwQWxsb3dhbmNlRXhjZWVkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gYWN0aXZlSW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9BY3RpdmUgdGFiIHNob3VsZCBzaG93IGV2ZW4gaWYgYWxsb3dhbmNlIGV4Y2VlZGVkLiAoV2UgbGVmdCByb29tLilcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiRWxlbWVudC5zdHlsZS56SW5kZXggPSAnYXV0byc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFiRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRhYkVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFiT3ZlcmxhcEFsbG93YW5jZUV4Y2VlZGVkICYmIGkgIT09IGFjdGl2ZUluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wZG93bkFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UYWIgbWVudSBhbHJlYWR5IHNob3duLCBzbyB3ZSBqdXN0IGFkZCB0byBpdC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQuc3R5bGUuekluZGV4ID0gJ2F1dG8nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiRWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gJyc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYkVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gdGhpcy5fZHJvcGRvd25FbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJvcGRvd25FbGVtZW50LmFwcGVuZENoaWxkKHRhYkVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9XZSBub3cga25vdyB0aGUgdGFiIG1lbnUgbXVzdCBiZSBzaG93biwgc28gd2UgaGF2ZSB0byByZWNhbGN1bGF0ZSBldmVyeXRoaW5nLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdFZpc2libGVUYWJJbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiRWxlbWVudC5zdHlsZS56SW5kZXggPSAnYXV0byc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiRWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhYkVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRhYkVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93cyBkcm9wIGRvd24gZm9yIGFkZGl0aW9uYWwgdGFicyB3aGVuIHRoZXJlIGFyZSB0b28gbWFueSB0byBkaXNwbGF5LlxyXG4gICAgICovXHJcbiAgICBzaG93QWRkaXRpb25hbFRhYnNEcm9wZG93bigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGlkZXMgZHJvcCBkb3duIGZvciBhZGRpdGlvbmFsIHRhYnMgd2hlbiB0aGVyZSBhcmUgdG9vIG1hbnkgdG8gZGlzcGxheS5cclxuICAgICAqL1xyXG4gICAgaGlkZUFkZGl0aW9uYWxUYWJzRHJvcGRvd24oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZHJvcGRvd25FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVUYWJDbG9zZUV2ZW50KGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRSZW1vdmVFdmVudChjb21wb25lbnRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYkZvY3VzRXZlbnQoY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEZvY3VzRXZlbnQoY29tcG9uZW50SXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVUYWJEcmFnU3RhcnRFdmVudCh4OiBudW1iZXIsIHk6IG51bWJlciwgZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnREcmFnU3RhcnRFdmVudCh4LCB5LCBkcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW0pO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFRhYnNDb250YWluZXIge1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50SXRlbVJlbW92ZUV2ZW50ID0gKHRoaXM6IHZvaWQsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRJdGVtRm9jdXNFdmVudCA9ICh0aGlzOiB2b2lkLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50SXRlbURyYWdTdGFydEV2ZW50ID0gKHRoaXM6IHZvaWQsIHg6IG51bWJlciwgeTogbnVtYmVyLCBkcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkgPT4gdm9pZDtcclxuICAgIGV4cG9ydCB0eXBlIERyb3Bkb3duQWN0aXZlQ2hhbmdlZEV2ZW50ID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcbn1cclxuIiwiaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IFJlY3QgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcblxyXG4vKiogQGludGVybmFsIEBkZXByZWNhdGVkIFRvIGJlIHJlbW92ZWQgKi9cclxuZXhwb3J0IGNsYXNzIFRyYW5zaXRpb25JbmRpY2F0b3Ige1xyXG4gICAgcHJpdmF0ZSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF90b0VsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgIHByaXZhdGUgX2Zyb21EaW1lbnNpb25zOiBudWxsO1xyXG4gICAgcHJpdmF0ZSBfdG90YWxBbmltYXRpb25EdXJhdGlvbjogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfYW5pbWF0aW9uU3RhcnRUaW1lOiBudW1iZXIgfCBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UcmFuc2l0aW9uSW5kaWNhdG9yKTtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLl90b0VsZW1lbnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2Zyb21EaW1lbnNpb25zID0gbnVsbDtcclxuICAgICAgICB0aGlzLl90b3RhbEFuaW1hdGlvbkR1cmF0aW9uID0gMjAwO1xyXG4gICAgICAgIHRoaXMuX2FuaW1hdGlvblN0YXJ0VGltZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIHRyYW5zaXRpb25FbGVtZW50cyhmcm9tRWxlbWVudDogSFRNTEVsZW1lbnQsIHRvRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUT0RPIC0gVGhpcyBpcyBub3QgcXVpdGUgYXMgY29vbCBhcyBleHBlY3RlZC4gUmV2aWV3LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyB0aGlzLl90b0VsZW1lbnQgPSB0b0VsZW1lbnQ7XHJcbiAgICAgICAgLy8gdGhpcy5fYW5pbWF0aW9uU3RhcnRUaW1lID0gbm93KCk7XHJcbiAgICAgICAgLy8gdGhpcy5fZnJvbURpbWVuc2lvbnMgPSB0aGlzLl9tZWFzdXJlKGZyb21FbGVtZW50KTtcclxuICAgICAgICAvLyB0aGlzLl9mcm9tRGltZW5zaW9ucy5vcGFjaXR5ID0gMC44O1xyXG4gICAgICAgIC8vIHRoaXMuX2VsZW1lbnQuc2hvdygpLmNzcyh0aGlzLl9mcm9tRGltZW5zaW9ucyk7XHJcbiAgICAgICAgLy8gYW5pbUZyYW1lKGZuQmluZCh0aGlzLl9uZXh0QW5pbWF0aW9uRnJhbWUsIHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG5leHRBbmltYXRpb25GcmFtZSgpOiB2b2lkIHtcclxuICAgICAgICAvLyBpZiAodGhpcy5fdG9FbGVtZW50ID09PSBudWxsIHx8IHRoaXMuX2Zyb21EaW1lbnNpb25zID09PSBudWxsIHx8IHRoaXMuX2FuaW1hdGlvblN0YXJ0VGltZSA9PT0gbnVsbCkge1xyXG4gICAgICAgIC8vICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignVElOQUZURDk3MTE1Jyk7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgY29uc3QgdG9EaW1lbnNpb25zID0gdGhpcy5tZWFzdXJlKHRoaXMuX3RvRWxlbWVudCk7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGFuaW1hdGlvblByb2dyZXNzID0gKG5vdygpIC0gdGhpcy5fYW5pbWF0aW9uU3RhcnRUaW1lKSAvIHRoaXMuX3RvdGFsQW5pbWF0aW9uRHVyYXRpb247XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGN1cnJlbnRGcmFtZVN0eWxlcyA9IHt9O1xyXG4gICAgICAgIC8vICAgICBjb25zdCBjc3NQcm9wZXJ0eTtcclxuXHJcbiAgICAgICAgLy8gICAgIGlmIChhbmltYXRpb25Qcm9ncmVzcyA+PSAxKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgIHRvRGltZW5zaW9ucy5vcGFjaXR5ID0gMDtcclxuXHJcbiAgICAgICAgLy8gICAgIGZvciAoY29uc3QgY3NzUHJvcGVydHkgaW4gdGhpcy5fZnJvbURpbWVuc2lvbnMpIHtcclxuICAgICAgICAvLyAgICAgICAgIGN1cnJlbnRGcmFtZVN0eWxlc1tjc3NQcm9wZXJ0eV0gPSB0aGlzLl9mcm9tRGltZW5zaW9uc1tjc3NQcm9wZXJ0eV0gK1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICh0b0RpbWVuc2lvbnNbY3NzUHJvcGVydHldIC0gdGhpcy5fZnJvbURpbWVuc2lvbnNbY3NzUHJvcGVydHldKSAqXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgYW5pbWF0aW9uUHJvZ3Jlc3M7XHJcbiAgICAgICAgLy8gICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgIHRoaXMuX2VsZW1lbnQuY3NzKGN1cnJlbnRGcmFtZVN0eWxlcyk7XHJcbiAgICAgICAgLy8gICAgIGFuaW1GcmFtZShmbkJpbmQodGhpcy5fbmV4dEFuaW1hdGlvbkZyYW1lLCB0aGlzKSk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWVhc3VyZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IFJlY3Qge1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQsXHJcbiAgICAgICAgICAgIHRvcDogcmVjdC50b3AsXHJcbiAgICAgICAgICAgIHdpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0LFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuIiwiLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEV4dGVybmFsRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihtZXNzYWdlKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIENvbmZpZ3VyYXRpb25FcnJvciBleHRlbmRzIEV4dGVybmFsRXJyb3Ige1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBwdWJsaWMgcmVhZG9ubHkgbm9kZT86IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCdDb25maWd1cmF0aW9uJywgbWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBQb3BvdXRCbG9ja2VkRXJyb3IgZXh0ZW5kcyBFeHRlcm5hbEVycm9yIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCdQb3BvdXRCbG9ja2VkJywgbWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBBcGlFcnJvciBleHRlbmRzIEV4dGVybmFsRXJyb3Ige1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ0FQSScsIG1lc3NhZ2UpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgQmluZEVycm9yIGV4dGVuZHMgRXh0ZXJuYWxFcnJvciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignQmluZCcsIG1lc3NhZ2UpO1xyXG4gICAgfVxyXG59XHJcbiIsIi8qKiBAaW50ZXJuYWwgKi9cclxuYWJzdHJhY3QgY2xhc3MgSW50ZXJuYWxFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgY29kZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoYCR7dHlwZX06ICR7Y29kZX0ke21lc3NhZ2UgPT09IHVuZGVmaW5lZCA/ICcnIDogJzogJyArIG1lc3NhZ2V9YClcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgQXNzZXJ0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKGNvZGU6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCdBc3NlcnQnLCBjb2RlLCBtZXNzYWdlKVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBVbnJlYWNoYWJsZUNhc2VFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoY29kZTogc3RyaW5nLCB2YXJpYWJsZVZhbHVlOiBuZXZlciwgbWVzc2FnZT86IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCdVbnJlYWNoYWJsZUNhc2UnLCBjb2RlLCBgJHt2YXJpYWJsZVZhbHVlfSR7bWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiAnOiAnICsgbWVzc2FnZX1gKVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBVbmV4cGVjdGVkTnVsbEVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb2RlOiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignVW5leHBlY3RlZE51bGwnLCBjb2RlLCBtZXNzYWdlKVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKGNvZGU6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCdVbmV4cGVjdGVkVW5kZWZpbmVkJywgY29kZSwgbWVzc2FnZSlcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBMYXlvdXRDb25maWcgfSBmcm9tICcuL2NvbmZpZy9jb25maWcnO1xyXG5pbXBvcnQgeyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb250YWluZXIgfSBmcm9tICcuL2NvbnRhaW5lci9jb21wb25lbnQtY29udGFpbmVyJztcclxuaW1wb3J0IHsgQXBpRXJyb3IsIEJpbmRFcnJvciB9IGZyb20gJy4vZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgSTE4blN0cmluZ0lkLCBpMThuU3RyaW5ncyB9IGZyb20gJy4vdXRpbHMvaTE4bi1zdHJpbmdzJztcclxuaW1wb3J0IHsgSnNvblZhbHVlLCBMb2dpY2FsWkluZGV4IH0gZnJvbSAnLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7IGRlZXBFeHRlbmRWYWx1ZSwgZW5zdXJlRWxlbWVudFBvc2l0aW9uQWJzb2x1dGUsIG51bWJlclRvUGl4ZWxzLCBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHksIHNldEVsZW1lbnRIZWlnaHQsIHNldEVsZW1lbnRXaWR0aCB9IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgeyBWaXJ0dWFsTGF5b3V0IH0gZnJvbSAnLi92aXJ0dWFsLWxheW91dCc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgR29sZGVuTGF5b3V0IGV4dGVuZHMgVmlydHVhbExheW91dCB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb21wb25lbnRUeXBlc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBHb2xkZW5MYXlvdXQuQ29tcG9uZW50SW5zdGFudGlhdG9yPigpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZ2V0Q29tcG9uZW50Q29uc3RydWN0b3JGdG46IEdvbGRlbkxheW91dC5HZXRDb21wb25lbnRDb25zdHJ1Y3RvckNhbGxiYWNrO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3JlZ2lzdGVyZWRDb21wb25lbnRNYXAgPSBuZXcgTWFwPENvbXBvbmVudENvbnRhaW5lciwgQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudD4oKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3ZpcnR1YWJsZUNvbXBvbmVudE1hcCA9IG5ldyBNYXA8Q29tcG9uZW50Q29udGFpbmVyLCBHb2xkZW5MYXlvdXQuVmlydHVhYmxlQ29tcG9uZW50PigpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZ29sZGVuTGF5b3V0Qm91bmRpbmdDbGllbnRSZWN0OiBET01SZWN0O1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbnRhaW5lclZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudExpc3RlbmVyID1cclxuICAgICAgICAoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSA9PiB0aGlzLmhhbmRsZUNvbnRhaW5lclZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudChjb250YWluZXIsIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyVmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50TGlzdGVuZXIgPVxyXG4gICAgICAgIChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgdmlzaWJsZTogYm9vbGVhbikgPT4gdGhpcy5oYW5kbGVDb250YWluZXJWaXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQoY29udGFpbmVyLCB2aXNpYmxlKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbnRhaW5lclZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50TGlzdGVuZXIgPVxyXG4gICAgICAgIChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgbG9naWNhbFpJbmRleDogTG9naWNhbFpJbmRleCwgZGVmYXVsdFpJbmRleDogc3RyaW5nKSA9PlxyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNvbnRhaW5lclZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50KGNvbnRhaW5lciwgbG9naWNhbFpJbmRleCwgZGVmYXVsdFpJbmRleCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gY29udGFpbmVyIC0gQSBEb20gSFRNTCBlbGVtZW50LiBEZWZhdWx0cyB0byBib2R5XHJcbiAgICAgKiBAcGFyYW0gYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gYmluZCBjb21wb25lbnRzXHJcbiAgICAgKiBAcGFyYW0gYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gdW5iaW5kIGNvbXBvbmVudHNcclxuICAgICAqIElmIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgaXMgZGVmaW5lZCwgdGhlbiBjb25zdHJ1Y3RvciB3aWxsIGJlIGRldGVybWluYXRlLiBJdCB3aWxsIGFsd2F5cyBjYWxsIHRoZSBpbml0KClcclxuICAgICAqIGZ1bmN0aW9uIGFuZCB0aGUgaW5pdCgpIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGNvbXBsZXRlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgd2lsbCBiZSBjYWxsZWRcclxuICAgICAqIGlmIGNvbnN0cnVjdG9yIGlzIGZvciBhIHBvcG91dCB3aW5kb3cuIE1ha2Ugc3VyZSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIGlzIHJlYWR5IGZvciBldmVudHMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI/OiBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgdW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICApO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHNwZWNpZnkgbGF5b3V0Q29uZmlnIGluIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykubG9hZExheW91dH0gKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTGF5b3V0Q29uZmlnLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWdPck9wdGlvbmFsQ29udGFpbmVyOiBMYXlvdXRDb25maWcgfCBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI/OiBIVE1MRWxlbWVudCB8IFZpcnR1YWxMYXlvdXQuQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcixcclxuICAgICAgICB1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI/OiBWaXJ0dWFsTGF5b3V0LlVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcixcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXIsIGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlciwgdW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLCB0cnVlKTtcclxuICAgICAgICAvLyB3ZSB0b2xkIFZpcnR1YWxMYXlvdXQgdG8gbm90IGNhbGwgaW5pdCgpIChza2lwSW5pdCBzZXQgdG8gdHJ1ZSkgc28gdGhhdCBHb2xkZW4gTGF5b3V0IGNhbiBpbml0aWFsaXNlIGl0cyBwcm9wZXJ0aWVzIGJlZm9yZSBpbml0IGlzIGNhbGxlZFxyXG4gICAgICAgIGlmICghdGhpcy5kZXByZWNhdGVkQ29uc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgYSBuZXcgY29tcG9uZW50IHR5cGUgd2l0aCB0aGUgbGF5b3V0IG1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgU2VlIHtAbGluayBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MDkyMjUzMS9ob3ctdG8tY2hlY2staWYtYS1qYXZhc2NyaXB0LWZ1bmN0aW9uLWlzLWEtY29uc3RydWN0b3J9XHJcbiAgICAgKiBpbnN0ZWFkIHVzZSB7QGxpbmsgKEdvbGRlbkxheW91dDpjbGFzcykucmVnaXN0ZXJDb21wb25lbnRDb25zdHJ1Y3Rvcn1cclxuICAgICAqIG9yIHtAbGluayAoR29sZGVuTGF5b3V0OmNsYXNzKS5yZWdpc3RlckNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbn1cclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJDb21wb25lbnQobmFtZTogc3RyaW5nLFxyXG4gICAgICAgIGNvbXBvbmVudENvbnN0cnVjdG9yT3JGYWN0b3J5RnRuOiBHb2xkZW5MYXlvdXQuQ29tcG9uZW50Q29uc3RydWN0b3IgfCBHb2xkZW5MYXlvdXQuQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uLFxyXG4gICAgICAgIHZpcnR1YWwgPSBmYWxzZVxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnRDb25zdHJ1Y3Rvck9yRmFjdG9yeUZ0biAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBpRXJyb3IoJ3JlZ2lzdGVyQ29tcG9uZW50KCkgY29tcG9uZW50Q29uc3RydWN0b3JPckZhY3RvcnlGdG4gcGFyYW1ldGVyIGlzIG5vdCBhIGZ1bmN0aW9uJylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50Q29uc3RydWN0b3JPckZhY3RvcnlGdG4uaGFzT3duUHJvcGVydHkoJ3Byb3RvdHlwZScpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDb25zdHJ1Y3RvciA9IGNvbXBvbmVudENvbnN0cnVjdG9yT3JGYWN0b3J5RnRuIGFzIEdvbGRlbkxheW91dC5Db21wb25lbnRDb25zdHJ1Y3RvcjtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJDb21wb25lbnRDb25zdHJ1Y3RvcihuYW1lLCBjb21wb25lbnRDb25zdHJ1Y3RvciwgdmlydHVhbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5RnRuID0gY29tcG9uZW50Q29uc3RydWN0b3JPckZhY3RvcnlGdG4gYXMgR29sZGVuTGF5b3V0LkNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbjtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJDb21wb25lbnRGYWN0b3J5RnVuY3Rpb24obmFtZSwgY29tcG9uZW50RmFjdG9yeUZ0biwgdmlydHVhbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciBhIG5ldyBjb21wb25lbnQgdHlwZSB3aXRoIHRoZSBsYXlvdXQgbWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJDb21wb25lbnRDb25zdHJ1Y3Rvcih0eXBlTmFtZTogc3RyaW5nLCBjb21wb25lbnRDb25zdHJ1Y3RvcjogR29sZGVuTGF5b3V0LkNvbXBvbmVudENvbnN0cnVjdG9yLCB2aXJ0dWFsID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudENvbnN0cnVjdG9yICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuUGxlYXNlUmVnaXN0ZXJBQ29uc3RydWN0b3JGdW5jdGlvbl0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDb21wb25lbnRUeXBlID0gdGhpcy5fY29tcG9uZW50VHlwZXNNYXAuZ2V0KHR5cGVOYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKGV4aXN0aW5nQ29tcG9uZW50VHlwZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IoYCR7aTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLkNvbXBvbmVudElzQWxyZWFkeVJlZ2lzdGVyZWRdfTogJHt0eXBlTmFtZX1gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudFR5cGVzTWFwLnNldCh0eXBlTmFtZSwge1xyXG4gICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IGNvbXBvbmVudENvbnN0cnVjdG9yLFxyXG4gICAgICAgICAgICAgICAgZmFjdG9yeUZ1bmN0aW9uOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB2aXJ0dWFsLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgbmV3IGNvbXBvbmVudCB3aXRoIHRoZSBsYXlvdXQgbWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJDb21wb25lbnRGYWN0b3J5RnVuY3Rpb24odHlwZU5hbWU6IHN0cmluZywgY29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uOiBHb2xkZW5MYXlvdXQuQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uLCB2aXJ0dWFsID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKCdQbGVhc2UgcmVnaXN0ZXIgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDb21wb25lbnRUeXBlID0gdGhpcy5fY29tcG9uZW50VHlwZXNNYXAuZ2V0KHR5cGVOYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKGV4aXN0aW5nQ29tcG9uZW50VHlwZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IoYCR7aTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLkNvbXBvbmVudElzQWxyZWFkeVJlZ2lzdGVyZWRdfTogJHt0eXBlTmFtZX1gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudFR5cGVzTWFwLnNldCh0eXBlTmFtZSwge1xyXG4gICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIGZhY3RvcnlGdW5jdGlvbjogY29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uLFxyXG4gICAgICAgICAgICAgICAgdmlydHVhbCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciBhIGNvbXBvbmVudCBmdW5jdGlvbiB3aXRoIHRoZSBsYXlvdXQgbWFuYWdlci4gVGhpcyBmdW5jdGlvbiBzaG91bGRcclxuICAgICAqIHJldHVybiBhIGNvbnN0cnVjdG9yIGZvciBhIGNvbXBvbmVudCBiYXNlZCBvbiBhIGNvbmZpZy5cclxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaWYgYSBjb21wb25lbnQgdHlwZSB3aXRoIHRoZSByZXF1aXJlZCBuYW1lIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQuXHJcbiAgICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFwcGxpY2F0aW9ucyB1c2UgdGhlIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykuZ2V0Q29tcG9uZW50RXZlbnR9IGFuZFxyXG4gICAgICoge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5yZWxlYXNlQ29tcG9uZW50RXZlbnR9IGluc3RlYWQgb2YgcmVnaXN0ZXJpbmcgYSBjb25zdHJ1Y3RvciBjYWxsYmFja1xyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoR29sZGVuTGF5b3V0OmNsYXNzKS5yZWdpc3RlckdldENvbXBvbmVudENvbnN0cnVjdG9yQ2FsbGJhY2t9XHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyQ29tcG9uZW50RnVuY3Rpb24oY2FsbGJhY2s6IEdvbGRlbkxheW91dC5HZXRDb21wb25lbnRDb25zdHJ1Y3RvckNhbGxiYWNrKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZWdpc3RlckdldENvbXBvbmVudENvbnN0cnVjdG9yQ2FsbGJhY2soY2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayBjbG9zdXJlIHdpdGggdGhlIGxheW91dCBtYW5hZ2VyIHdoaWNoIHN1cHBsaWVzIGEgQ29tcG9uZW50IENvbnN0cnVjdG9yLlxyXG4gICAgICogVGhpcyBjYWxsYmFjayBzaG91bGQgcmV0dXJuIGEgY29uc3RydWN0b3IgZm9yIGEgY29tcG9uZW50IGJhc2VkIG9uIGEgY29uZmlnLlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBpZiBhIGNvbXBvbmVudCB0eXBlIHdpdGggdGhlIHJlcXVpcmVkIG5hbWUgaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC5cclxuICAgICAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYXBwbGljYXRpb25zIHVzZSB0aGUge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5nZXRDb21wb25lbnRFdmVudH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLnJlbGVhc2VDb21wb25lbnRFdmVudH0gaW5zdGVhZCBvZiByZWdpc3RlcmluZyBhIGNvbnN0cnVjdG9yIGNhbGxiYWNrXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFjayhjYWxsYmFjazogR29sZGVuTGF5b3V0LkdldENvbXBvbmVudENvbnN0cnVjdG9yQ2FsbGJhY2spOiB2b2lkIHtcclxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9nZXRDb21wb25lbnRDb25zdHJ1Y3RvckZ0biAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignTXVsdGlwbGUgY29tcG9uZW50IGZ1bmN0aW9ucyBhcmUgYmVpbmcgcmVnaXN0ZXJlZC4gIE9ubHkgdGhlIGZpbmFsIHJlZ2lzdGVyZWQgZnVuY3Rpb24gd2lsbCBiZSB1c2VkLicpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9nZXRDb21wb25lbnRDb25zdHJ1Y3RvckZ0biA9IGNhbGxiYWNrO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFJlZ2lzdGVyZWRDb21wb25lbnRUeXBlTmFtZXMoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIGNvbnN0IHR5cGVOYW1lc0l0ZXJhYmxlSXRlcmF0b3IgPSB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5rZXlzKCk7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odHlwZU5hbWVzSXRlcmFibGVJdGVyYXRvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIGNvbXBvbmVudCBpbnN0YW50aWF0b3IuICBBdHRlbXB0cyB0byB1dGlsaXplIHJlZ2lzdGVyZWRcclxuICAgICAqIGNvbXBvbmVudCB0eXBlIGJ5IGZpcnN0LCB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjYWxsYmFjayBmdW5jdGlvbiAoaWYgcmVnaXN0ZXJlZCkuXHJcbiAgICAgKiBJZiBuZWl0aGVyIGdldHMgYW4gaW5zdGFudGlhdG9yLCB0aGVuIHJldHVybnMgYHVuZGVmaW5lZGAuXHJcbiAgICAgKiBOb3RlIHRoYXQgYHVuZGVmaW5lZGAgd2lsbCByZXR1cm4gaWYgY29uZmlnLmNvbXBvbmVudFR5cGUgaXMgbm90IGEgc3RyaW5nXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbmZpZyAtIFRoZSBpdGVtIGNvbmZpZ1xyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBnZXRDb21wb25lbnRJbnN0YW50aWF0b3IoY29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiBHb2xkZW5MYXlvdXQuQ29tcG9uZW50SW5zdGFudGlhdG9yIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBsZXQgaW5zdGFudGlhdG9yOiBHb2xkZW5MYXlvdXQuQ29tcG9uZW50SW5zdGFudGlhdG9yIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBjb25zdCB0eXBlTmFtZSA9IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5yZXNvbHZlQ29tcG9uZW50VHlwZU5hbWUoY29uZmlnKVxyXG4gICAgICAgIGlmICh0eXBlTmFtZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGluc3RhbnRpYXRvciA9IHRoaXMuX2NvbXBvbmVudFR5cGVzTWFwLmdldCh0eXBlTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpbnN0YW50aWF0b3IgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ2V0Q29tcG9uZW50Q29uc3RydWN0b3JGdG4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaW5zdGFudGlhdG9yID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiB0aGlzLl9nZXRDb21wb25lbnRDb25zdHJ1Y3RvckZ0bihjb25maWcpLFxyXG4gICAgICAgICAgICAgICAgICAgIGZhY3RvcnlGdW5jdGlvbjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHZpcnR1YWw6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW5zdGFudGlhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIGJpbmRDb21wb25lbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIGl0ZW1Db25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IENvbXBvbmVudENvbnRhaW5lci5CaW5kYWJsZUNvbXBvbmVudCB7XHJcbiAgICAgICAgbGV0IGluc3RhbnRpYXRvcjogR29sZGVuTGF5b3V0LkNvbXBvbmVudEluc3RhbnRpYXRvciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgY29uc3QgdHlwZU5hbWUgPSBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcucmVzb2x2ZUNvbXBvbmVudFR5cGVOYW1lKGl0ZW1Db25maWcpO1xyXG4gICAgICAgIGlmICh0eXBlTmFtZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGluc3RhbnRpYXRvciA9IHRoaXMuX2NvbXBvbmVudFR5cGVzTWFwLmdldCh0eXBlTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpbnN0YW50aWF0b3IgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ2V0Q29tcG9uZW50Q29uc3RydWN0b3JGdG4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaW5zdGFudGlhdG9yID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiB0aGlzLl9nZXRDb21wb25lbnRDb25zdHJ1Y3RvckZ0bihpdGVtQ29uZmlnKSxcclxuICAgICAgICAgICAgICAgICAgICBmYWN0b3J5RnVuY3Rpb246IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdDogQ29tcG9uZW50Q29udGFpbmVyLkJpbmRhYmxlQ29tcG9uZW50O1xyXG4gICAgICAgIGlmIChpbnN0YW50aWF0b3IgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCB2aXJ0dWFsID0gaW5zdGFudGlhdG9yLnZpcnR1YWw7XHJcbiAgICAgICAgICAgIC8vIGhhbmRsZSBjYXNlIHdoZXJlIGNvbXBvbmVudCBpcyBvYnRhaW5lZCBieSBuYW1lIG9yIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjYWxsYmFja1xyXG4gICAgICAgICAgICBsZXQgY29tcG9uZW50U3RhdGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaWYgKGl0ZW1Db25maWcuY29tcG9uZW50U3RhdGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50U3RhdGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBtYWtlIGNvcHlcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlID0gZGVlcEV4dGVuZFZhbHVlKHt9LCBpdGVtQ29uZmlnLmNvbXBvbmVudFN0YXRlKSBhcyBKc29uVmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBjb21wb25lbnQ6IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudENvbnN0cnVjdG9yID0gaW5zdGFudGlhdG9yLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50Q29uc3RydWN0b3IgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gbmV3IGNvbXBvbmVudENvbnN0cnVjdG9yKGNvbnRhaW5lciwgY29tcG9uZW50U3RhdGUsIHZpcnR1YWwpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmFjdG9yeUZ1bmN0aW9uID0gaW5zdGFudGlhdG9yLmZhY3RvcnlGdW5jdGlvbjtcclxuICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5RnVuY3Rpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGZhY3RvcnlGdW5jdGlvbihjb250YWluZXIsIGNvbXBvbmVudFN0YXRlLCB2aXJ0dWFsKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTUJDRkZVMTAwMDgnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHZpcnR1YWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0dMQkNWQ1U5ODg3NzQnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlydHVhYmxlQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIEdvbGRlbkxheW91dC5WaXJ0dWFibGVDb21wb25lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Um9vdEVsZW1lbnQgPSB2aXJ0dWFibGVDb21wb25lbnQucm9vdEh0bWxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRSb290RWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IoYCR7aTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLlZpcnR1YWxDb21wb25lbnREb2VzTm90SGF2ZVJvb3RIdG1sRWxlbWVudF19OiAke3R5cGVOYW1lfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUVsZW1lbnRQb3NpdGlvbkFic29sdXRlKGNvbXBvbmVudFJvb3RFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoY29tcG9uZW50Um9vdEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92aXJ0dWFibGVDb21wb25lbnRNYXAuc2V0KGNvbnRhaW5lciwgdmlydHVhYmxlQ29tcG9uZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCA9IHRoaXMuX2NvbnRhaW5lclZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudExpc3RlbmVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIudmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50ID0gdGhpcy5fY29udGFpbmVyVmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50TGlzdGVuZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci52aXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudCA9IHRoaXMuX2NvbnRhaW5lclZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50TGlzdGVuZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQ29tcG9uZW50TWFwLnNldChjb250YWluZXIsIGNvbXBvbmVudCk7XHJcblxyXG4gICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICB2aXJ0dWFsOiBpbnN0YW50aWF0b3IudmlydHVhbCxcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudCxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVXNlIGdldENvbXBvbmVudEV2ZW50XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHN1cGVyLmJpbmRDb21wb25lbnQoY29udGFpbmVyLCBpdGVtQ29uZmlnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgdW5iaW5kQ29tcG9uZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB2aXJ0dWFsOiBib29sZWFuLCBjb21wb25lbnQ6IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCByZWdpc3RlcmVkQ29tcG9uZW50ID0gdGhpcy5fcmVnaXN0ZXJlZENvbXBvbmVudE1hcC5nZXQoY29udGFpbmVyKTtcclxuICAgICAgICBpZiAocmVnaXN0ZXJlZENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHN1cGVyLnVuYmluZENvbXBvbmVudChjb250YWluZXIsIHZpcnR1YWwsIGNvbXBvbmVudCk7IC8vIHdhcyBub3QgY3JlYXRlZCBmcm9tIHJlZ2lzdHJhdGlvbiBzbyB1c2UgdmlydHVhbCB1bmJpbmQgZXZlbnRzXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdmlydHVhYmxlQ29tcG9uZW50ID0gdGhpcy5fdmlydHVhYmxlQ29tcG9uZW50TWFwLmdldChjb250YWluZXIpO1xyXG4gICAgICAgICAgICBpZiAodmlydHVhYmxlQ29tcG9uZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFJvb3RFbGVtZW50ID0gdmlydHVhYmxlQ29tcG9uZW50LnJvb3RIdG1sRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRSb290RWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdHTFVDNzc3NDMnLCBjb250YWluZXIudGl0bGUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDaGlsZChjb21wb25lbnRSb290RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlydHVhYmxlQ29tcG9uZW50TWFwLmRlbGV0ZShjb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIGZpcmVCZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50KGNvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9nb2xkZW5MYXlvdXRCb3VuZGluZ0NsaWVudFJlY3QgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBzdXBlci5maXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQ29udGFpbmVyVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZpcnR1YWJsZUNvbXBvbmVudCA9IHRoaXMuX3ZpcnR1YWJsZUNvbXBvbmVudE1hcC5nZXQoY29udGFpbmVyKTtcclxuICAgICAgICBpZiAodmlydHVhYmxlQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignR0xIQ1NDRTU1OTMzJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSB2aXJ0dWFibGVDb21wb25lbnQucm9vdEh0bWxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAocm9vdEVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcihpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuQ29tcG9uZW50SXNOb3RWaXJ0dWFibGVdICsgJyAnICsgY29udGFpbmVyLnRpdGxlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckJvdW5kaW5nQ2xpZW50UmVjdCA9IGNvbnRhaW5lci5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IGNvbnRhaW5lckJvdW5kaW5nQ2xpZW50UmVjdC5sZWZ0IC0gdGhpcy5fZ29sZGVuTGF5b3V0Qm91bmRpbmdDbGllbnRSZWN0LmxlZnQ7XHJcbiAgICAgICAgICAgICAgICByb290RWxlbWVudC5zdHlsZS5sZWZ0ID0gbnVtYmVyVG9QaXhlbHMobGVmdCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0b3AgPSBjb250YWluZXJCb3VuZGluZ0NsaWVudFJlY3QudG9wIC0gdGhpcy5fZ29sZGVuTGF5b3V0Qm91bmRpbmdDbGllbnRSZWN0LnRvcDtcclxuICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLnRvcCA9IG51bWJlclRvUGl4ZWxzKHRvcCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgocm9vdEVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQocm9vdEVsZW1lbnQsIGhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb250YWluZXJWaXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB2aXJ0dWFibGVDb21wb25lbnQgPSB0aGlzLl92aXJ0dWFibGVDb21wb25lbnRNYXAuZ2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgaWYgKHZpcnR1YWJsZUNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0dMSENWVkNSRTU1OTM0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSB2aXJ0dWFibGVDb21wb25lbnQucm9vdEh0bWxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAocm9vdEVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcihpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuQ29tcG9uZW50SXNOb3RWaXJ0dWFibGVdICsgJyAnICsgY29udGFpbmVyLnRpdGxlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eShyb290RWxlbWVudCwgdmlzaWJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb250YWluZXJWaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgbG9naWNhbFpJbmRleDogTG9naWNhbFpJbmRleCwgZGVmYXVsdFpJbmRleDogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgdmlydHVhYmxlQ29tcG9uZW50ID0gdGhpcy5fdmlydHVhYmxlQ29tcG9uZW50TWFwLmdldChjb250YWluZXIpO1xyXG4gICAgICAgIGlmICh2aXJ0dWFibGVDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdHTEhDVlpJQ1JFNTU5MzUnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByb290RWxlbWVudCA9IHZpcnR1YWJsZUNvbXBvbmVudC5yb290SHRtbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChyb290RWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKGkxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Db21wb25lbnRJc05vdFZpcnR1YWJsZV0gKyAnICcgKyBjb250YWluZXIudGl0bGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUuekluZGV4ID0gZGVmYXVsdFpJbmRleDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBHb2xkZW5MYXlvdXQge1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBWaXJ0dWFibGVDb21wb25lbnQge1xyXG4gICAgICAgIHJvb3RIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50Q29uc3RydWN0b3IgPSBuZXcoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHN0YXRlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQsIHZpcnR1YWw6IGJvb2xlYW4pID0+IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQ7XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRGYWN0b3J5RnVuY3Rpb24gPSAoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHN0YXRlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQsIHZpcnR1YWw6IGJvb2xlYW4pID0+IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQgfCB1bmRlZmluZWQ7XHJcbiAgICBleHBvcnQgdHlwZSBHZXRDb21wb25lbnRDb25zdHJ1Y3RvckNhbGxiYWNrID0gKHRoaXM6IHZvaWQsIGNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKSA9PiBDb21wb25lbnRDb25zdHJ1Y3RvcjtcclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudEluc3RhbnRpYXRvciB7XHJcbiAgICAgICAgY29uc3RydWN0b3I6IENvbXBvbmVudENvbnN0cnVjdG9yIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGZhY3RvcnlGdW5jdGlvbjogQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHZpcnR1YWw6IGJvb2xlYW47XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLCBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZywgUmVzb2x2ZWRMYXlvdXRDb25maWcgfSBmcm9tICcuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnLi4vY29udGFpbmVyL2NvbXBvbmVudC1jb250YWluZXInO1xyXG5pbXBvcnQgeyBUYWIgfSBmcm9tICcuLi9jb250cm9scy90YWInO1xyXG5pbXBvcnQgeyBVbmV4cGVjdGVkTnVsbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEl0ZW1UeXBlLCBKc29uVmFsdWUgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCwgc2V0RWxlbWVudEhlaWdodCwgc2V0RWxlbWVudFdpZHRoIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB9IGZyb20gJy4vY29tcG9uZW50LXBhcmVudGFibGUtaXRlbSc7XHJcbmltcG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi9jb250ZW50LWl0ZW0nO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEl0ZW0gZXh0ZW5kcyBDb250ZW50SXRlbSB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9yZW9yZGVyRW5hYmxlZDogYm9vbGVhbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2hlYWRlckNvbmZpZzogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdGl0bGU6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luaXRpYWxXYW50TWF4aW1pc2U6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3RhYjogVGFiO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZm9jdXNlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoQ29tcG9uZW50SXRlbTpjbGFzcykuY29tcG9uZW50VHlwZX0gKi9cclxuICAgIGdldCBjb21wb25lbnROYW1lKCk6IEpzb25WYWx1ZSB7IHJldHVybiB0aGlzLl9jb250YWluZXIuY29tcG9uZW50VHlwZTsgfVxyXG4gICAgZ2V0IGNvbXBvbmVudFR5cGUoKTogSnNvblZhbHVlIHsgcmV0dXJuIHRoaXMuX2NvbnRhaW5lci5jb21wb25lbnRUeXBlOyB9XHJcbiAgICBnZXQgcmVvcmRlckVuYWJsZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9yZW9yZGVyRW5hYmxlZDsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0IGluaXRpYWxXYW50TWF4aW1pc2UoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pbml0aWFsV2FudE1heGltaXNlOyB9XHJcbiAgICBnZXQgY29tcG9uZW50KCk6IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fY29udGFpbmVyLmNvbXBvbmVudDsgfVxyXG4gICAgZ2V0IGNvbnRhaW5lcigpOiBDb21wb25lbnRDb250YWluZXIgeyByZXR1cm4gdGhpcy5fY29udGFpbmVyOyB9XHJcbiAgICBnZXQgcGFyZW50SXRlbSgpOiBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB7IHJldHVybiB0aGlzLl9wYXJlbnRJdGVtOyB9XHJcblxyXG4gICAgZ2V0IGhlYWRlckNvbmZpZygpOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5faGVhZGVyQ29uZmlnOyB9XHJcbiAgICBnZXQgdGl0bGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX3RpdGxlOyB9XHJcbiAgICBnZXQgdGFiKCk6IFRhYiB7IHJldHVybiB0aGlzLl90YWI7IH1cclxuICAgIGdldCBmb2N1c2VkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fZm9jdXNlZDsgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGxheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICAgICAgY29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX3BhcmVudEl0ZW06IENvbXBvbmVudFBhcmVudGFibGVJdGVtXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihsYXlvdXRNYW5hZ2VyLCBjb25maWcsIF9wYXJlbnRJdGVtLCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNDb21wb25lbnQgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9yZW9yZGVyRW5hYmxlZCA9IGNvbmZpZy5yZW9yZGVyRW5hYmxlZDtcclxuXHJcbiAgICAgICAgdGhpcy5hcHBseVVwZGF0YWJsZUNvbmZpZyhjb25maWcpO1xyXG5cclxuICAgICAgICB0aGlzLl9pbml0aWFsV2FudE1heGltaXNlID0gY29uZmlnLm1heGltaXNlZDtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGNvbnRhaW5lckVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNvbnRlbnQpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChjb250YWluZXJFbGVtZW50KTtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBuZXcgQ29tcG9uZW50Q29udGFpbmVyKGNvbmZpZywgdGhpcywgbGF5b3V0TWFuYWdlciwgY29udGFpbmVyRWxlbWVudCxcclxuICAgICAgICAgICAgKGl0ZW1Db25maWcpID0+IHRoaXMuaGFuZGxlVXBkYXRlSXRlbUNvbmZpZ0V2ZW50KGl0ZW1Db25maWcpLFxyXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnNob3coKSxcclxuICAgICAgICAgICAgKCkgPT4gdGhpcy5oaWRlKCksXHJcbiAgICAgICAgICAgIChzdXBwcmVzc0V2ZW50KSA9PiB0aGlzLmZvY3VzKHN1cHByZXNzRXZlbnQpLFxyXG4gICAgICAgICAgICAoc3VwcHJlc3NFdmVudCkgPT4gdGhpcy5ibHVyKHN1cHByZXNzRXZlbnQpLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuZGVzdHJveSgpXHJcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5VXBkYXRhYmxlQ29uZmlnKGNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRUaXRsZShjb25maWcudGl0bGUpO1xyXG4gICAgICAgIHRoaXMuX2hlYWRlckNvbmZpZyA9IGNvbmZpZy5oZWFkZXI7XHJcbiAgICB9XHJcblxyXG4gICAgdG9Db25maWcoKTogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCBzdGF0ZVJlcXVlc3RFdmVudCA9IHRoaXMuX2NvbnRhaW5lci5zdGF0ZVJlcXVlc3RFdmVudDtcclxuICAgICAgICBjb25zdCBzdGF0ZSA9IHN0YXRlUmVxdWVzdEV2ZW50ID09PSB1bmRlZmluZWQgPyB0aGlzLl9jb250YWluZXIuc3RhdGUgOiBzdGF0ZVJlcXVlc3RFdmVudCgpO1xyXG5cclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgICBjb250ZW50OiBbXSxcclxuICAgICAgICAgICAgc2l6ZTogdGhpcy5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogdGhpcy5zaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZTogdGhpcy5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogdGhpcy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXHJcbiAgICAgICAgICAgIG1heGltaXNlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IHRoaXMuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IHRoaXMuX3Jlb3JkZXJFbmFibGVkLFxyXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5fdGl0bGUsXHJcbiAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLmNyZWF0ZUNvcHkodGhpcy5faGVhZGVyQ29uZmlnKSxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZTogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLmNvcHlDb21wb25lbnRUeXBlKHRoaXMuY29tcG9uZW50VHlwZSksXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiBzdGF0ZSxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdDSUM2ODg4MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnJlbW92ZUNoaWxkKHRoaXMsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXNlZCBieSBEcmFnIFByb3h5XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBlbnRlckRyYWdNb2RlKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5lbGVtZW50LCBoZWlnaHQpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5lbnRlckRyYWdNb2RlKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4aXREcmFnTW9kZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuZXhpdERyYWdNb2RlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZW50ZXJTdGFja01heGltaXNlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuZW50ZXJTdGFja01heGltaXNlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4aXRTdGFja01heGltaXNlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuZXhpdFN0YWNrTWF4aW1pc2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXNlZCBieSBEcmFnIFByb3h5XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBkcmFnKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5kcmFnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0T3V0ZXJCb3VuZGluZ0NsaWVudFJlY3QoKTogRE9NUmVjdCB7IFxyXG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgY29uc3Qgc2hvdyA9IHRoaXMuaGVhZGVyQ29uZmlnPy5zaG93O1xyXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuaGVhZGVySGVpZ2h0O1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkZXJXaWR0aCA9IChzaG93ID09PSAnbGVmdCcgfHwgc2hvdyA9PT0gJ3JpZ2h0JykgPyBoZWlnaHQgOiAwO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckhlaWdodCA9IChzaG93ID09PSAndG9wJyB8fCBzaG93ID09PSAnYm90dG9tJyB8fCBzaG93ID09PSB1bmRlZmluZWQpID8gaGVpZ2h0IDogMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIERPTVJlY3QuZnJvbVJlY3Qoe1xyXG4gICAgICAgICAgICB4OiByZWN0LmxlZnQgLSBoZWFkZXJXaWR0aCxcclxuICAgICAgICAgICAgeTogcmVjdC50b3AgLSBoZWFkZXJIZWlnaHQsXHJcbiAgICAgICAgICAgIHdpZHRoOiByZWN0LndpZHRoICsgaGVhZGVyV2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHQgKyBoZWFkZXJIZWlnaHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgdXBkYXRlU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlTm9kZVNpemUoZm9yY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZShmYWxzZSk7XHJcblxyXG4gICAgICAgIHN1cGVyLmluaXQoKTtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuZW1pdCgnb3BlbicpO1xyXG4gICAgICAgIHRoaXMuaW5pdENvbnRlbnRJdGVtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoaXMgY29tcG9uZW50J3MgdGl0bGVcclxuICAgICAqXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKiBAcGFyYW0gdGl0bGUgLVxyXG4gICAgICovXHJcblxyXG4gICAgc2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RpdGxlID0gdGl0bGU7XHJcbiAgICAgICAgdGhpcy5lbWl0KCd0aXRsZUNoYW5nZWQnLCB0aXRsZSk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUYWIodGFiOiBUYWIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90YWIgPSB0YWI7XHJcbiAgICAgICAgdGhpcy5lbWl0KCd0YWInLCB0YWIpXHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnNldFRhYih0YWIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIGhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5zZXRWaXNpYmlsaXR5KGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBzaG93KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLnNob3coKTtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuc2V0VmlzaWJpbGl0eSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvY3VzZXMgdGhlIGl0ZW0gaWYgaXQgaXMgbm90IGFscmVhZHkgZm9jdXNlZFxyXG4gICAgICovXHJcbiAgICBmb2N1cyhzdXBwcmVzc0V2ZW50ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBhcmVudEl0ZW0uc2V0QWN0aXZlQ29tcG9uZW50SXRlbSh0aGlzLCB0cnVlLCBzdXBwcmVzc0V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzZXRGb2N1c2VkKHN1cHByZXNzRXZlbnQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9mb2N1c2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnRhYi5zZXRGb2N1c2VkKCk7XHJcbiAgICAgICAgaWYgKCFzdXBwcmVzc0V2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdmb2N1cycpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJsdXJzIChkZWZvY3VzZXMpIHRoZSBpdGVtIGlmIGl0IGlzIGZvY3VzZWRcclxuICAgICAqL1xyXG4gICAgYmx1cihzdXBwcmVzc0V2ZW50ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fZm9jdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuc2V0Rm9jdXNlZENvbXBvbmVudEl0ZW0odW5kZWZpbmVkLCBzdXBwcmVzc0V2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0Qmx1cnJlZChzdXBwcmVzc0V2ZW50OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudGFiLnNldEJsdXJyZWQoKTtcclxuICAgICAgICBpZiAoIXN1cHByZXNzRXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ2JsdXInKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHNldFBhcmVudChwYXJlbnQ6IENvbnRlbnRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50SXRlbSA9IHBhcmVudCBhcyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbTtcclxuICAgICAgICBzdXBlci5zZXRQYXJlbnQocGFyZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVVwZGF0ZUl0ZW1Db25maWdFdmVudChpdGVtQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpIHtcclxuICAgICAgICB0aGlzLmFwcGx5VXBkYXRhYmxlQ29uZmlnKGl0ZW1Db25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlTm9kZVNpemUoZm9yY2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgIT09ICdub25lJykge1xyXG4gICAgICAgICAgICAvLyBEbyBub3QgdXBkYXRlIHNpemUgb2YgaGlkZGVuIGNvbXBvbmVudHMgdG8gcHJldmVudCB1bndhbnRlZCByZWZsb3dzXHJcblxyXG4gICAgICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCh0aGlzLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc2V0U2l6ZVRvTm9kZVNpemUod2lkdGgsIGhlaWdodCwgZm9yY2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoQ29tcG9uZW50SXRlbTpjbGFzcyl9ICovXHJcbmV4cG9ydCB0eXBlIENvbXBvbmVudCA9IENvbXBvbmVudEl0ZW07XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIENvbXBvbmVudEl0ZW0ge1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50ID0gQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudDtcclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi9jb250ZW50LWl0ZW0nO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbXBvbmVudFBhcmVudGFibGVJdGVtIGV4dGVuZHMgQ29udGVudEl0ZW0ge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZm9jdXNlZCA9IGZhbHNlO1xyXG5cclxuICAgIGdldCBmb2N1c2VkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fZm9jdXNlZDsgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldEZvY3VzZWRWYWx1ZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2ZvY3VzZWQgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhYnN0cmFjdCBzZXRBY3RpdmVDb21wb25lbnRJdGVtKGl0ZW06IENvbXBvbmVudEl0ZW0sIGZvY3VzOiBib29sZWFuLCBzdXBwcmVzc0ZvY3VzRXZlbnQ6IGJvb2xlYW4pOiB2b2lkO1xyXG59XHJcbiIsImltcG9ydCB7IFJlc29sdmVkSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnXHJcbmltcG9ydCB7IEJyb3dzZXJQb3BvdXQgfSBmcm9tICcuLi9jb250cm9scy9icm93c2VyLXBvcG91dCdcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWROdWxsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InXHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcidcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQtZW1pdHRlcidcclxuaW1wb3J0IHsgQXJlYUxpbmtlZFJlY3QsIEl0ZW1UeXBlLCBTaXplVW5pdEVudW0gfSBmcm9tICcuLi91dGlscy90eXBlcydcclxuaW1wb3J0IHsgZ2V0VW5pcXVlSWQsIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJ1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtaXRlbSdcclxuaW1wb3J0IHsgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1wYXJlbnRhYmxlLWl0ZW0nXHJcbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi9zdGFjaydcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGlzIHRoZSBiYXNlY2xhc3MgdGhhdCBhbGwgY29udGVudCBpdGVtcyBpbmhlcml0IGZyb20uXHJcbiAqIE1vc3QgbWV0aG9kcyBwcm92aWRlIGEgc3Vic2V0IG9mIHdoYXQgdGhlIHN1Yi1jbGFzc2VzIGRvLlxyXG4gKlxyXG4gKiBJdCBhbHNvIHByb3ZpZGVzIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyBmb3IgdHJlZSB0cmF2ZXJzYWxcclxuICogQHB1YmxpY1xyXG4gKi9cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb250ZW50SXRlbSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90eXBlOiBJdGVtVHlwZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2lkOiBzdHJpbmc7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9wb3BJblBhcmVudElkczogc3RyaW5nW10gPSBbXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbnRlbnRJdGVtczogQ29udGVudEl0ZW1bXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2lzQ2xvc2FibGU7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9wZW5kaW5nRXZlbnRQcm9wYWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdGhyb3R0bGVkRXZlbnRzOiBzdHJpbmdbXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2lzSW5pdGlhbGlzZWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2l6ZTogbnVtYmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2l6ZVVuaXQ6IFNpemVVbml0RW51bTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG1pblNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG1pblNpemVVbml0OiBTaXplVW5pdEVudW07XHJcblxyXG4gICAgaXNHcm91bmQ6IGJvb2xlYW5cclxuICAgIGlzUm93OiBib29sZWFuXHJcbiAgICBpc0NvbHVtbjogYm9vbGVhblxyXG4gICAgaXNTdGFjazogYm9vbGVhblxyXG4gICAgaXNDb21wb25lbnQ6IGJvb2xlYW5cclxuXHJcbiAgICBnZXQgdHlwZSgpOiBJdGVtVHlwZSB7IHJldHVybiB0aGlzLl90eXBlOyB9XHJcbiAgICBnZXQgaWQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2lkOyB9XHJcbiAgICBzZXQgaWQodmFsdWU6IHN0cmluZykgeyB0aGlzLl9pZCA9IHZhbHVlOyB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXQgcG9wSW5QYXJlbnRJZHMoKTogc3RyaW5nW10geyByZXR1cm4gdGhpcy5fcG9wSW5QYXJlbnRJZHM7IH1cclxuICAgIGdldCBwYXJlbnQoKTogQ29udGVudEl0ZW0gfCBudWxsIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfVxyXG4gICAgZ2V0IGNvbnRlbnRJdGVtcygpOiBDb250ZW50SXRlbVtdIHsgcmV0dXJuIHRoaXMuX2NvbnRlbnRJdGVtczsgfVxyXG4gICAgZ2V0IGlzQ2xvc2FibGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc0Nsb3NhYmxlOyB9XHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcbiAgICBnZXQgaXNJbml0aWFsaXNlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzSW5pdGlhbGlzZWQ7IH1cclxuXHJcbiAgICBzdGF0aWMgaXNTdGFjayhpdGVtOiBDb250ZW50SXRlbSk6IGl0ZW0gaXMgU3RhY2sge1xyXG4gICAgICAgIHJldHVybiBpdGVtLmlzU3RhY2s7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ29tcG9uZW50SXRlbShpdGVtOiBDb250ZW50SXRlbSk6IGl0ZW0gaXMgQ29tcG9uZW50SXRlbSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0uaXNDb21wb25lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0oaXRlbTogQ29udGVudEl0ZW0pOiBpdGVtIGlzIENvbXBvbmVudFBhcmVudGFibGVJdGVtIHtcclxuICAgICAgICByZXR1cm4gaXRlbS5pc1N0YWNrIHx8IGl0ZW0uaXNHcm91bmQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGxheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICAgICAgY29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX3BhcmVudDogQ29udGVudEl0ZW0gfCBudWxsLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50OiBIVE1MRWxlbWVudFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdHlwZSA9IGNvbmZpZy50eXBlO1xyXG4gICAgICAgIHRoaXMuX2lkID0gY29uZmlnLmlkO1xyXG5cclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpc2VkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0dyb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNSb3cgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29sdW1uID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1N0YWNrID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0NvbXBvbmVudCA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLnNpemUgPSBjb25maWcuc2l6ZTtcclxuICAgICAgICB0aGlzLnNpemVVbml0ID0gY29uZmlnLnNpemVVbml0O1xyXG4gICAgICAgIHRoaXMubWluU2l6ZSA9IGNvbmZpZy5taW5TaXplO1xyXG4gICAgICAgIHRoaXMubWluU2l6ZVVuaXQgPSBjb25maWcubWluU2l6ZVVuaXQ7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzQ2xvc2FibGUgPSBjb25maWcuaXNDbG9zYWJsZTtcclxuXHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ0V2ZW50UHJvcGFnYXRpb25zID0ge307XHJcbiAgICAgICAgdGhpcy5fdGhyb3R0bGVkRXZlbnRzID0gWydzdGF0ZUNoYW5nZWQnXTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zID0gdGhpcy5jcmVhdGVDb250ZW50SXRlbXMoY29uZmlnLmNvbnRlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcnMgdGhlIHNpemUgb2YgdGhlIGNvbXBvbmVudCBhbmQgaXRzIGNoaWxkcmVuLCBjYWxsZWQgcmVjdXJzaXZlbHlcclxuICAgICAqIEBwYXJhbSBmb3JjZSAtIEluIHNvbWUgY2FzZXMgdGhlIHNpemUgaXMgbm90IHVwZGF0ZWQgaWYgaXQgaGFzIG5vdCBjaGFuZ2VkLiBJbiB0aGlzIGNhc2UsIGV2ZW50c1xyXG4gICAgICogKHN1Y2ggYXMgQ29tcG9uZW50Q29udGFpbmVyLnZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCkgYXJlIG5vdCBmaXJlZC4gU2V0dGluZyBmb3JjZSB0byB0cnVlLCBlbnN1cmVzIHRoZSBzaXplIGlzIHVwZGF0ZWQgcmVnYXJkbGVzcywgYW5kXHJcbiAgICAgKiB0aGUgcmVzcGVjdGl2ZSBldmVudHMgYXJlIGZpcmVkLiBUaGlzIGlzIHNvbWV0aW1lcyBuZWNlc3Nhcnkgd2hlbiBhIGNvbXBvbmVudCdzIHNpemUgaGFzIG5vdCBjaGFuZ2VkIGJ1dCBpdCBoYXMgYmVjb21lIHZpc2libGUsIGFuZCB0aGVcclxuICAgICAqIHJlbGV2YW50IGV2ZW50cyBuZWVkIHRvIGJlIGZpcmVkLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGFic3RyYWN0IHVwZGF0ZVNpemUoZm9yY2U6IGJvb2xlYW4pOiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGNoaWxkIG5vZGUgKGFuZCBpdHMgY2hpbGRyZW4pIGZyb20gdGhlIHRyZWVcclxuICAgICAqIEBwYXJhbSBjb250ZW50SXRlbSAtIFRoZSBjaGlsZCBpdGVtIHRvIHJlbW92ZVxyXG4gICAgICogQHBhcmFtIGtlZXBDaGlsZCAtIFdoZXRoZXIgdG8gZGVzdHJveSB0aGUgcmVtb3ZlZCBpdGVtXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUNoaWxkKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwga2VlcENoaWxkID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gdGhhdCdzIHRvIGJlIHJlbW92ZWQgd2l0aGluIGFsbCBjb250ZW50IGl0ZW1zIHRoaXMgbm9kZSBjb250YWluc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fY29udGVudEl0ZW1zLmluZGV4T2YoY29udGVudEl0ZW0pO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIE1ha2Ugc3VyZSB0aGUgY29udGVudCBpdGVtIHRvIGJlIHJlbW92ZWQgaXMgYWN0dWFsbHkgYSBjaGlsZCBvZiB0aGlzIGl0ZW1cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCByZW1vdmUgY2hpbGQgaXRlbS4gVW5rbm93biBjb250ZW50IGl0ZW0nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG5cdFx0ICogQ2FsbCBkZXN0cm95IG9uIHRoZSBjb250ZW50IGl0ZW0uXHJcblx0XHQgKiBBbGwgY2hpbGRyZW4gYXJlIGRlc3Ryb3llZCBhcyB3ZWxsXHJcblx0XHQgKi9cclxuICAgICAgICBpZiAoIWtlZXBDaGlsZCkge1xyXG5cdFx0XHR0aGlzLl9jb250ZW50SXRlbXNbaW5kZXhdLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJlbW92ZSB0aGUgY29udGVudCBpdGVtIGZyb20gdGhpcyBub2RlcyBhcnJheSBvZiBjaGlsZHJlblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIG5vZGUgc3RpbGwgY29udGFpbnMgb3RoZXIgY29udGVudCBpdGVtcywgYWRqdXN0IHRoZWlyIHNpemVcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogSWYgdGhpcyB3YXMgdGhlIGxhc3QgY29udGVudCBpdGVtLCByZW1vdmUgdGhpcyBub2RlIGFzIHdlbGxcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIC8vIGlmICghdGhpcy5pc0dyb3VuZCAmJiB0aGlzLl9pc0Nsb3NhYmxlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0dyb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3BhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdDSVVDMDA4NzQnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB1cCB0aGUgdHJlZSBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXdseSBhZGRlZCBjaGlsZFxyXG4gICAgICogVGhlIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgYWN0dWFsIERPTSBtYW5pcHVsYXRpb25zIGxpZXNcclxuICAgICAqIHdpdGggdGhlIGNvbmNyZXRlIGl0ZW1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29udGVudEl0ZW0gLVxyXG4gICAgICogQHBhcmFtIGluZGV4IC0gSWYgb21pdHRlZCBpdGVtIHdpbGwgYmUgYXBwZW5kZWRcclxuICAgICAqIEBwYXJhbSBzdXNwZW5kUmVzaXplIC0gVXNlZCBieSBkZXNjZW5kZW50IGltcGxlbWVudGF0aW9uc1xyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBhZGRDaGlsZChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGluZGV4PzogbnVtYmVyIHwgbnVsbCwgc3VzcGVuZFJlc2l6ZT86IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgICAgIGluZGV4ID8/PSB0aGlzLl9jb250ZW50SXRlbXMubGVuZ3RoO1xyXG5cclxuICAgICAgICB0aGlzLl9jb250ZW50SXRlbXMuc3BsaWNlKGluZGV4LCAwLCBjb250ZW50SXRlbSk7XHJcbiAgICAgICAgY29udGVudEl0ZW0uc2V0UGFyZW50KHRoaXMpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXNlZCA9PT0gdHJ1ZSAmJiBjb250ZW50SXRlbS5faXNJbml0aWFsaXNlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgY29udGVudEl0ZW0uaW5pdCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZXMgb2xkQ2hpbGQgd2l0aCBuZXdDaGlsZFxyXG4gICAgICogQHBhcmFtIG9sZENoaWxkIC1cclxuICAgICAqIEBwYXJhbSBuZXdDaGlsZCAtXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcmVwbGFjZUNoaWxkKG9sZENoaWxkOiBDb250ZW50SXRlbSwgbmV3Q2hpbGQ6IENvbnRlbnRJdGVtLCBkZXN0cm95T2xkQ2hpbGQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIC8vIERvIG5vdCB0cnkgdG8gcmVwbGFjZSBDb21wb25lbnRJdGVtIC0gd2lsbCBub3Qgd29ya1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fY29udGVudEl0ZW1zLmluZGV4T2Yob2xkQ2hpbGQpO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBvbGRDaGlsZC5fZWxlbWVudC5wYXJlbnROb2RlO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignQ0lSQ0kyMzIzMicsICdDYW5cXCd0IHJlcGxhY2UgY2hpbGQuIG9sZENoaWxkIGlzIG5vdCBjaGlsZCBvZiB0aGlzJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGFyZW50Tm9kZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQ0lSQ1AyMzIzMicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld0NoaWxkLl9lbGVtZW50LCBvbGRDaGlsZC5fZWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAqIE9wdGlvbmFsbHkgZGVzdHJveSB0aGUgb2xkIGNvbnRlbnQgaXRlbVxyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAoZGVzdHJveU9sZENoaWxkID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBvbGRDaGlsZC5fcGFyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIG9sZENoaWxkLmRlc3Ryb3koKTsgLy8gd2lsbCBub3cgYWxzbyBkZXN0cm95IGFsbCBjaGlsZHJlbiBvZiBvbGRDaGlsZFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAqIFdpcmUgdGhlIG5ldyBjb250ZW50SXRlbSBpbnRvIHRoZSB0cmVlXHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtc1tpbmRleF0gPSBuZXdDaGlsZDtcclxuICAgICAgICAgICAgbmV3Q2hpbGQuc2V0UGFyZW50KHRoaXMpO1xyXG4gICAgICAgICAgICAvLyBuZXdDaGlsZCBpbmhlcml0cyB0aGUgc2l6ZXMgZnJvbSB0aGUgb2xkIGNoaWxkOlxyXG4gICAgICAgICAgICBuZXdDaGlsZC5zaXplID0gb2xkQ2hpbGQuc2l6ZTtcclxuICAgICAgICAgICAgbmV3Q2hpbGQuc2l6ZVVuaXQgPSBvbGRDaGlsZC5zaXplVW5pdDtcclxuICAgICAgICAgICAgbmV3Q2hpbGQubWluU2l6ZSA9IG9sZENoaWxkLm1pblNpemU7XHJcbiAgICAgICAgICAgIG5ld0NoaWxkLm1pblNpemVVbml0ID0gb2xkQ2hpbGQubWluU2l6ZVVuaXQ7XHJcblxyXG4gICAgICAgICAgICAvL1RPRE8gVGhpcyBkb2Vzbid0IHVwZGF0ZSB0aGUgY29uZmlnLi4uIHJlZmFjdG9yIHRvIGxlYXZlIGl0ZW0gbm9kZXMgdW50b3VjaGVkIGFmdGVyIGNyZWF0aW9uXHJcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5fcGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQ0lSQ05DNDU2OTknKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdDaGlsZC5fcGFyZW50Ll9pc0luaXRpYWxpc2VkID09PSB0cnVlICYmIG5ld0NoaWxkLl9pc0luaXRpYWxpc2VkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLmluaXQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVuaWVuY2UgbWV0aG9kLlxyXG4gICAgICogU2hvcnRoYW5kIGZvciB0aGlzLnBhcmVudC5yZW1vdmVDaGlsZCggdGhpcyApXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fcGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdDSVIxMTExMCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBjb21wb25lbnQgZnJvbSB0aGUgbGF5b3V0IGFuZCBjcmVhdGVzIGEgbmV3XHJcbiAgICAgKiBicm93c2VyIHdpbmRvdyB3aXRoIHRoZSBjb21wb25lbnQgYW5kIGl0cyBjaGlsZHJlbiBpbnNpZGVcclxuICAgICAqL1xyXG4gICAgcG9wb3V0KCk6IEJyb3dzZXJQb3BvdXQge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudElkID0gZ2V0VW5pcXVlSWQoKTtcclxuICAgICAgICBjb25zdCBicm93c2VyUG9wb3V0ID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZVBvcG91dEZyb21Db250ZW50SXRlbSh0aGlzLCB1bmRlZmluZWQsIHBhcmVudElkLCB1bmRlZmluZWQpO1xyXG4gICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICByZXR1cm4gYnJvd3NlclBvcG91dDtcclxuICAgIH1cclxuXHJcbiAgICBhYnN0cmFjdCB0b0NvbmZpZygpOiBSZXNvbHZlZEl0ZW1Db25maWc7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY2FsY3VsYXRlQ29uZmlnQ29udGVudCgpOiBSZXNvbHZlZEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5fY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gY29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UmVzb2x2ZWRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IGl0ZW0udG9Db25maWcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBoaWdobGlnaHREcm9wWm9uZSh4OiBudW1iZXIsIHk6IG51bWJlciwgYXJlYTogQXJlYUxpbmtlZFJlY3QpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBkcm9wVGFyZ2V0SW5kaWNhdG9yID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmRyb3BUYXJnZXRJbmRpY2F0b3I7XHJcbiAgICAgICAgaWYgKGRyb3BUYXJnZXRJbmRpY2F0b3IgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0FDSUhEWjU1OTMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkcm9wVGFyZ2V0SW5kaWNhdG9yLmhpZ2hsaWdodEFyZWEoYXJlYSwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG9uRHJvcChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGFyZWE6IENvbnRlbnRJdGVtLkFyZWEpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFkZENoaWxkKGNvbnRlbnRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5iZWdpblNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyBOb3Qgc3VyZSB3aHkgc2hvd0FsbEFjdGl2ZUNvbnRlbnRJdGVtcygpIHdhcyBjYWxsZWQuIEdvbGRlbkxheW91dCBzZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCBpdC4gIExlZnQgY29tbWVudGVkIGNvZGVcclxuICAgICAgICAgICAgLy8gaW4gc291cmNlIGluIGNhc2UgYSByZWFzb24gZm9yIGl0IGJlY29tZXMgYXBwYXJlbnQuXHJcbiAgICAgICAgICAgIC8vIHRoaXMubGF5b3V0TWFuYWdlci5zaG93QWxsQWN0aXZlQ29udGVudEl0ZW1zKCk7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSh0aGlzLl9lbGVtZW50LCB0cnVlKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5sYXlvdXRNYW5hZ2VyLnVwZGF0ZVNpemVGcm9tQ29udGFpbmVyKCk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2NvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zW2ldLnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbmRTaXplSW52YWxpZGF0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhpcyBpdGVtIGFuZHMgaXRzIGNoaWxkcmVuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2NvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50SXRlbXNbaV0uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jb250ZW50SXRlbXMgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ2JlZm9yZUl0ZW1EZXN0cm95ZWQnKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdpdGVtRGVzdHJveWVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBhcmVhIHRoZSBjb21wb25lbnQgY3VycmVudGx5IG9jY3VwaWVzXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZ2V0RWxlbWVudEFyZWEoZWxlbWVudD86IEhUTUxFbGVtZW50KTogQ29udGVudEl0ZW0uQXJlYSB7XHJcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQgPz8gdGhpcy5fZWxlbWVudDtcclxuXHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgY29uc3QgdG9wID0gcmVjdC50b3AgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtcclxuICAgICAgICBjb25zdCBsZWZ0ID0gcmVjdC5sZWZ0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0O1xyXG5cclxuICAgICAgICBjb25zdCB3aWR0aCA9IHJlY3Qud2lkdGg7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHgxOiBsZWZ0LFxyXG4gICAgICAgICAgICB5MTogdG9wLFxyXG4gICAgICAgICAgICB4MjogbGVmdCArIHdpZHRoLFxyXG4gICAgICAgICAgICB5MjogdG9wICsgaGVpZ2h0LFxyXG4gICAgICAgICAgICBzdXJmYWNlOiB3aWR0aCAqIGhlaWdodCxcclxuICAgICAgICAgICAgY29udGVudEl0ZW06IHRoaXNcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGZpbmRBbmNlc3RvcldpdGhTaWJsaW5ncygpOiBDb250ZW50SXRlbSB8IG51bGwge1xyXG4gICAgICAgIGxldCBjdXJyOiBDb250ZW50SXRlbSB8IG51bGwgPSB0aGlzO1xyXG5cclxuICAgICAgICB3aGlsZSAoY3VyciAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoY3Vyci5wYXJlbnQgIT09IG51bGwgJiYgY3Vyci5wYXJlbnQuY29udGVudEl0ZW1zLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnIgPSBjdXJyLnBhcmVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIEZpbmRzIGFuIGFuY2VzdG9yIHRoYXQgd2lsbCBleGlzdCBldmVuIGFmdGVyIHRoZSBpdGVtIGlzIHJlbW92ZWQgYW5kIHJldHVybnMgaXQgYXMgZG9jayBwb2ludC5cclxuICAgICAqIFxyXG4gICAgICogQGludGVybmFsICovXHJcbiAgICBmaW5kRG9ja1BvaW50KCk6IENvbnRlbnRJdGVtLkRvY2tQb2ludCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGFuY2hvciA9IHRoaXMuZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCk7XHJcblxyXG4gICAgICAgIGlmIChhbmNob3IgIT09IG51bGwgJiYgYW5jaG9yLnBhcmVudCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGFuY2hvci5wYXJlbnQuX2NvbnRlbnRJdGVtcy5pbmRleE9mKGFuY2hvcik7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHBhcmVudDogYW5jaG9yLnBhcmVudCwgaW5kZXggfTtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxheW91dE1hbmFnZXIuZ3JvdW5kSXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4geyBwYXJlbnQ6IHRoaXMubGF5b3V0TWFuYWdlci5ncm91bmRJdGVtLCBpbmRleDogbnVsbCB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdHJlZSBvZiBjb250ZW50IGl0ZW1zIGlzIGNyZWF0ZWQgaW4gdHdvIHN0ZXBzOiBGaXJzdCBhbGwgY29udGVudCBpdGVtcyBhcmUgaW5zdGFudGlhdGVkLFxyXG4gICAgICogdGhlbiBpbml0IGlzIGNhbGxlZCByZWN1cnNpdmVseSBmcm9tIHRvcCB0byBib3R0ZW0uIFRoaXMgaXMgdGhlIGJhc2ljIGluaXQgZnVuY3Rpb24sXHJcbiAgICAgKiBpdCBjYW4gYmUgdXNlZCwgZXh0ZW5kZWQgb3Igb3ZlcndyaXR0ZW4gYnkgdGhlIGNvbnRlbnQgaXRlbXNcclxuICAgICAqXHJcbiAgICAgKiBJdHMgYmVoYXZpb3VyIGRlcGVuZHMgb24gdGhlIGNvbnRlbnQgaXRlbVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ2l0ZW1DcmVhdGVkJyk7XHJcbiAgICAgICAgdGhpcy5lbWl0VW5rbm93bkJ1YmJsaW5nRXZlbnQodGhpcy50eXBlICsgJ0NyZWF0ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgc2V0UGFyZW50KHBhcmVudDogQ29udGVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYWRkUG9wSW5QYXJlbnRJZChpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnBvcEluUGFyZW50SWRzLmluY2x1ZGVzKGlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLnBvcEluUGFyZW50SWRzLnB1c2goaWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgaW5pdENvbnRlbnRJdGVtcygpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2NvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50SXRlbXNbaV0uaW5pdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuYmVnaW5TaXplSW52YWxpZGF0aW9uKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KHRoaXMuX2VsZW1lbnQsIGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5sYXlvdXRNYW5hZ2VyLnVwZGF0ZVNpemVGcm9tQ29udGFpbmVyKCk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVuZFNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUNvbnRlbnRJdGVtc1NpemUoZm9yY2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2NvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50SXRlbXNbaV0udXBkYXRlU2l6ZShmb3JjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogY3JlYXRlcyBhbGwgY29udGVudCBpdGVtcyBmb3IgdGhpcyBub2RlIGF0IGluaXRpYWxpc2F0aW9uIHRpbWVcclxuICAgICAqIFBMRUFTRSBOT1RFLCBwbGVhc2Ugc2VlIGFkZENoaWxkIGZvciBhZGRpbmcgY29udGVudEl0ZW1zIGF0IHJ1bnRpbWVcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUNvbnRlbnRJdGVtcyhjb250ZW50OiByZWFkb25seSBSZXNvbHZlZEl0ZW1Db25maWdbXSkge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gY29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PENvbnRlbnRJdGVtPihjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVDb250ZW50SXRlbShjb250ZW50W2ldLCB0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBmb3IgZXZlcnkgZXZlbnQgb24gdGhlIGl0ZW0gdHJlZS4gRGVjaWRlcyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIGJ1YmJsaW5nXHJcbiAgICAgKiBldmVudCBhbmQgcHJvcGFnYXRlcyBpdCB0byBpdHMgcGFyZW50XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcclxuICAgICAqIEBwYXJhbSBldmVudCAtXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwcm9wYWdhdGVFdmVudChuYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSkge1xyXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGFyZ3NbMF07XHJcbiAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50ICYmXHJcbiAgICAgICAgICAgICAgICBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9PT0gZmFsc2UgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IHRydWUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEluIHNvbWUgY2FzZXMgKGUuZy4gaWYgYW4gZWxlbWVudCBpcyBjcmVhdGVkIGZyb20gYSBEcmFnU291cmNlKSBpdFxyXG4gICAgICAgICAgICAgICAgICogZG9lc24ndCBoYXZlIGEgcGFyZW50IGFuZCBpcyBub3QgYSBjaGlsZCBvZiBHcm91bmRJdGVtLiBJZiB0aGF0J3MgdGhlIGNhc2VcclxuICAgICAgICAgICAgICAgICAqIHByb3BhZ2F0ZSB0aGUgYnViYmxpbmcgZXZlbnQgZnJvbSB0aGUgdG9wIGxldmVsIG9mIHRoZSBzdWJzdHJlZSBkaXJlY3RseVxyXG4gICAgICAgICAgICAgICAgICogdG8gdGhlIGxheW91dE1hbmFnZXJcclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNHcm91bmQgPT09IGZhbHNlICYmIHRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5lbWl0VW5rbm93bihuYW1lLCBldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVFdmVudFByb3BhZ2F0aW9uVG9MYXlvdXRNYW5hZ2VyKG5hbWUsIGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSB0cnlCdWJibGVFdmVudChuYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGFyZ3NbMF07XHJcbiAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50ICYmXHJcbiAgICAgICAgICAgICAgICBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9PT0gZmFsc2UgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IHRydWVcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEluIHNvbWUgY2FzZXMgKGUuZy4gaWYgYW4gZWxlbWVudCBpcyBjcmVhdGVkIGZyb20gYSBEcmFnU291cmNlKSBpdFxyXG4gICAgICAgICAgICAgICAgICogZG9lc24ndCBoYXZlIGEgcGFyZW50IGFuZCBpcyBub3QgYSBjaGlsZCBvZiBHcm91bmRJdGVtLiBJZiB0aGF0J3MgdGhlIGNhc2VcclxuICAgICAgICAgICAgICAgICAqIHByb3BhZ2F0ZSB0aGUgYnViYmxpbmcgZXZlbnQgZnJvbSB0aGUgdG9wIGxldmVsIG9mIHRoZSBzdWJzdHJlZSBkaXJlY3RseVxyXG4gICAgICAgICAgICAgICAgICogdG8gdGhlIGxheW91dE1hbmFnZXJcclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNHcm91bmQgPT09IGZhbHNlICYmIHRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5lbWl0VW5rbm93bihuYW1lLCBldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVFdmVudFByb3BhZ2F0aW9uVG9MYXlvdXRNYW5hZ2VyKG5hbWUsIGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsbCByYXcgZXZlbnRzIGJ1YmJsZSB1cCB0byB0aGUgR3JvdW5kIGVsZW1lbnQuIFNvbWUgZXZlbnRzIHRoYXRcclxuICAgICAqIGFyZSBwcm9wYWdhdGVkIHRvIC0gYW5kIGVtaXR0ZWQgYnkgLSB0aGUgbGF5b3V0TWFuYWdlciBob3dldmVyIGFyZVxyXG4gICAgICogb25seSBzdHJpbmctYmFzZWQsIGJhdGNoZWQgYW5kIHNhbml0aXplZCB0byBtYWtlIHRoZW0gbW9yZSB1c2FibGVcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2NoZWR1bGVFdmVudFByb3BhZ2F0aW9uVG9MYXlvdXRNYW5hZ2VyKG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3Rocm90dGxlZEV2ZW50cy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW1pdFVua25vd24obmFtZSwgZXZlbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9wZW5kaW5nRXZlbnRQcm9wYWdhdGlvbnNbbmFtZV0gIT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdFdmVudFByb3BhZ2F0aW9uc1tuYW1lXSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnByb3BhZ2F0ZUV2ZW50VG9MYXlvdXRNYW5hZ2VyKG5hbWUsIGV2ZW50KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgZm9yIGV2ZW50cyBzY2hlZHVsZWQgYnkgX3NjaGVkdWxlRXZlbnRQcm9wYWdhdGlvblRvTGF5b3V0TWFuYWdlclxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwcm9wYWdhdGVFdmVudFRvTGF5b3V0TWFuYWdlcihuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudCkge1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdFdmVudFByb3BhZ2F0aW9uc1tuYW1lXSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbWl0VW5rbm93bihuYW1lLCBldmVudCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgQ29udGVudEl0ZW0ge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBBcmVhIGV4dGVuZHMgQXJlYUxpbmtlZFJlY3Qge1xyXG4gICAgICAgIHN1cmZhY2U6IG51bWJlcjtcclxuICAgICAgICBjb250ZW50SXRlbTogQ29udGVudEl0ZW07XHJcbiAgICB9XHJcbiAgICAvKiogQHB1YmxpYyAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBEb2NrUG9pbnQge1xyXG4gICAgICAgIHBhcmVudDogQ29udGVudEl0ZW07XHJcbiAgICAgICAgaW5kZXg6IG51bWJlciB8IG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKENvbnRlbnRJdGVtOmNsYXNzKX0gKi9cclxuZXhwb3J0IHR5cGUgQWJzdHJhY3RDb250ZW50SXRlbSA9IENvbnRlbnRJdGVtO1xyXG4iLCJpbXBvcnQgeyBDb21wb25lbnRJdGVtQ29uZmlnLCBJdGVtQ29uZmlnLCBSb3dPckNvbHVtbkl0ZW1Db25maWcsIFN0YWNrSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9jb25maWcnO1xyXG5pbXBvcnQgeyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsIFJlc29sdmVkR3JvdW5kSXRlbUNvbmZpZywgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcsIFJlc29sdmVkSXRlbUNvbmZpZywgUmVzb2x2ZWRSb290SXRlbUNvbmZpZywgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWROdWxsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQXJlYUxpbmtlZFJlY3QsIEl0ZW1UeXBlLCBTaXplVW5pdEVudW0gfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCwgc2V0RWxlbWVudEhlaWdodCwgc2V0RWxlbWVudFdpZHRoIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBhcmVudGFibGVJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2NvbnRlbnQtaXRlbSc7XHJcbmltcG9ydCB7IFJvd09yQ29sdW1uIH0gZnJvbSAnLi9yb3ctb3ItY29sdW1uJztcclxuXHJcbi8qKlxyXG4gKiBHcm91bmRJdGVtIGlzIHRoZSBDb250ZW50SXRlbSB3aG9zZSBvbmUgY2hpbGQgaXMgdGhlIHJvb3QgQ29udGVudEl0ZW0gKFJvb3QgaXMgcGxhbnRlZCBpbiBHcm91bmQpLlxyXG4gKiAoUHJldmlvdXNseSBpdCB3YXMgY2FsbGVkIHJvb3QgaG93ZXZlciB0aGlzIHdhcyBpbmNvcnJlY3QgYXMgaXRzIGNoaWxkIGlzIHRoZSByb290IGl0ZW0pXHJcbiAqIFRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlIG9mIEdyb3VuZEl0ZW0gYW5kIGl0IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB0aGUgTGF5b3V0IE1hbmFnZXJcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgR3JvdW5kSXRlbSBleHRlbmRzIENvbXBvbmVudFBhcmVudGFibGVJdGVtIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoaWxkRWxlbWVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLCByb290SXRlbUNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCwgY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuXHJcbiAgICAgICAgc3VwZXIobGF5b3V0TWFuYWdlciwgUmVzb2x2ZWRHcm91bmRJdGVtQ29uZmlnLmNyZWF0ZShyb290SXRlbUNvbmZpZyksIG51bGwsIEdyb3VuZEl0ZW0uY3JlYXRlRWxlbWVudChkb2N1bWVudCkpO1xyXG5cclxuICAgICAgICB0aGlzLmlzR3JvdW5kID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIgPSB0aGlzLmVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lckVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vIGluc2VydCBiZWZvcmUgYW55IHByZS1leGlzdGluZyBjb250ZW50IGVsZW1lbnRzXHJcbiAgICAgICAgbGV0IGJlZm9yZTogQ2hpbGROb2RlIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJldjogQ2hpbGROb2RlIHwgbnVsbCA9XHJcbiAgICAgICAgICAgICAgICBiZWZvcmUgPyBiZWZvcmUucHJldmlvdXNTaWJsaW5nIDogdGhpcy5fY29udGFpbmVyRWxlbWVudC5sYXN0Q2hpbGQ7XHJcbiAgICAgICAgICAgIGlmIChwcmV2IGluc3RhbmNlb2YgRWxlbWVudFxyXG4gICAgICAgICAgICAgICAgJiYgcHJldi5jbGFzc0xpc3QuY29udGFpbnMoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Db250ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgYmVmb3JlID0gcHJldjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgYmVmb3JlKTtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBpbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGlzZWQgPT09IHRydWUpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLmluaXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0Q29udGVudEl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIG5ldyBMYXlvdXRcclxuICAgICAqIEludGVybmFsIG9ubHkuICBUbyBsb2FkIGEgbmV3IGxheW91dCB3aXRoIEFQSSwgdXNlIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykubG9hZExheW91dH1cclxuICAgICAqL1xyXG4gICAgbG9hZFJvb3Qocm9vdEl0ZW1Db25maWc6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICAvLyBSZW1vdmUgZXhpc3Rpbmcgcm9vdCBpZiBpdCBleGlzdHNcclxuICAgICAgICB0aGlzLmNsZWFyUm9vdCgpO1xyXG5cclxuICAgICAgICBpZiAocm9vdEl0ZW1Db25maWcgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCByb290Q29udGVudEl0ZW0gPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQW5kSW5pdENvbnRlbnRJdGVtKHJvb3RJdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZChyb290Q29udGVudEl0ZW0sIDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbGVhclJvb3QoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHJvb3QgaWYgaXQgZXhpc3RzXHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgc3dpdGNoIChjb250ZW50SXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMDoge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgMToge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdSb290Q29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgICAgICBleGlzdGluZ1Jvb3RDb250ZW50SXRlbS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0dJTFIwNzcyMScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIENvbnRlbnRJdGVtIGNoaWxkIHRvIHJvb3QgQ29udGVudEl0ZW0uXHJcbiAgICAgKiBJbnRlcm5hbCBvbmx5LiAgVG8gbG9hZCBhIGFkZCB3aXRoIEFQSSwgdXNlIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykuYWRkSXRlbX1cclxuICAgICAqIEByZXR1cm5zIC0xIGlmIGFkZGVkIGFzIHJvb3Qgb3RoZXJ3aXNlIGluZGV4IGluIHJvb3QgQ29udGVudEl0ZW0ncyBjb250ZW50XHJcbiAgICAgKi9cclxuICAgIGFkZEl0ZW0oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgICAgICBpbmRleD86IG51bWJlclxyXG4gICAgKTogbnVtYmVyIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuY2hlY2tNaW5pbWlzZU1heGltaXNlZFN0YWNrKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkSXRlbUNvbmZpZyA9IEl0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnLCBmYWxzZSk7XHJcbiAgICAgICAgbGV0IHBhcmVudDogQ29udGVudEl0ZW07XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcGFyZW50ID0gdGhpcy5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXHJcbiAgICAgICAgICAgIHBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYXJlbnQuaXNDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGl0ZW0gYXMgY2hpbGQgdG8gQ29tcG9uZW50SXRlbScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShyZXNvbHZlZEl0ZW1Db25maWcsIHBhcmVudCk7XHJcbiAgICAgICAgICAgIGluZGV4ID0gcGFyZW50LmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbmRleCk7XHJcbiAgICAgICAgICAgIHJldHVybiAocGFyZW50ID09PSB0aGlzKSA/IC0xIDogaW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxvYWRDb21wb25lbnRBc1Jvb3QoaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyk6IHZvaWQge1xyXG4gICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyByb290IGlmIGl0IGV4aXN0c1xyXG4gICAgICAgIHRoaXMuY2xlYXJSb290KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkSXRlbUNvbmZpZyA9IEl0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnLCBmYWxzZSkgYXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnO1xyXG5cclxuICAgICAgICBpZiAocmVzb2x2ZWRJdGVtQ29uZmlnLm1heGltaXNlZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgQ29tcG9uZW50IGNhbm5vdCBiZSBtYXhpbWlzZWQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByb290Q29udGVudEl0ZW0gPSBuZXcgQ29tcG9uZW50SXRlbSh0aGlzLmxheW91dE1hbmFnZXIsIHJlc29sdmVkSXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgIHJvb3RDb250ZW50SXRlbS5pbml0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGQocm9vdENvbnRlbnRJdGVtLCAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgUm9vdCBDb250ZW50SXRlbS5cclxuICAgICAqIEludGVybmFsIG9ubHkuICBUbyByZXBsYWNlIFJvb3QgQ29udGVudEl0ZW0gd2l0aCBBUEksIHVzZSB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLmxvYWRMYXlvdXR9XHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIGFkZENoaWxkKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwgaW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR3JvdW5kIG5vZGUgY2FuIG9ubHkgaGF2ZSBhIHNpbmdsZSBjaGlsZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnRlbnRJdGVtID0gdGhpcy5sYXlvdXRNYW5hZ2VyLl8kbm9ybWFsaXplQ29udGVudEl0ZW0oY29udGVudEl0ZW0sIHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuYXBwZW5kQ2hpbGQoY29udGVudEl0ZW0uZWxlbWVudCk7XHJcbiAgICAgICAgICAgIGluZGV4ID0gc3VwZXIuYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluZGV4KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgY2FsY3VsYXRlQ29uZmlnQ29udGVudCgpOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IHRoaXMuY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gY29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UmVzb2x2ZWRSb290SXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gaXRlbS50b0NvbmZpZygpO1xyXG4gICAgICAgICAgICBpZiAoUmVzb2x2ZWRSb290SXRlbUNvbmZpZy5pc1Jvb3RJdGVtQ29uZmlnKGl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBpdGVtQ29uZmlnO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdSQ0NDNjY4MzInKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCB8fCBoZWlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpOyAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB2MS54IEFQSVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmVsZW1lbnQsIGhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICAvLyBHcm91bmRJdGVtIGNhbiBiZSBlbXB0eVxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuY29udGVudEl0ZW1zWzBdLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5jb250ZW50SXRlbXNbMF0uZWxlbWVudCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb250ZW50SXRlbXNTaXplKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgUm9vdCBDb250ZW50SXRlbS5cclxuICAgICAqIEludGVybmFsIG9ubHkuICBUbyByZXBsYWNlIFJvb3QgQ29udGVudEl0ZW0gd2l0aCBBUEksIHVzZSB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLnVwZGF0ZVJvb3RTaXplfVxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSB1cGRhdGVTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmJlZ2luVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRJdGVtc1NpemUoZm9yY2UpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbmRWaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlU2lkZUFyZWFzKCk6IEdyb3VuZEl0ZW0uQXJlYVtdIHtcclxuICAgICAgICBjb25zdCBhcmVhU2l6ZSA9IDUwO1xyXG5cclxuICAgICAgICBjb25zdCBvcHBvc2l0ZVNpZGVzID0gR3JvdW5kSXRlbS5BcmVhLm9wcG9zaXRlU2lkZXM7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PEdyb3VuZEl0ZW0uQXJlYT4oT2JqZWN0LmtleXMob3Bwb3NpdGVTaWRlcykubGVuZ3RoKTtcclxuICAgICAgICBsZXQgaWR4ID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb3Bwb3NpdGVTaWRlcykge1xyXG4gICAgICAgICAgICBjb25zdCBzaWRlID0ga2V5IGFzIGtleW9mIEdyb3VuZEl0ZW0uQXJlYS5TaWRlcztcclxuICAgICAgICAgICAgY29uc3QgYXJlYSA9IHRoaXMuZ2V0RWxlbWVudEFyZWEoKSBhcyBHcm91bmRJdGVtLkFyZWE7XHJcbiAgICAgICAgICAgIGlmIChhcmVhID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignUkNTQTc3NTUzJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhcmVhLnNpZGUgPSBzaWRlO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wcG9zaXRlU2lkZXNbc2lkZV1bMV0gPT09ICcyJyApXHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYVtzaWRlXSA9IGFyZWFbb3Bwb3NpdGVTaWRlc1tzaWRlXV0gLSBhcmVhU2l6ZTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBhcmVhW3NpZGVdID0gYXJlYVtvcHBvc2l0ZVNpZGVzW3NpZGVdXSArIGFyZWFTaXplO1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zdXJmYWNlID0gKGFyZWEueDIgLSBhcmVhLngxKSAqIChhcmVhLnkyIC0gYXJlYS55MSk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaWR4KytdID0gYXJlYTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBoaWdobGlnaHREcm9wWm9uZSh4OiBudW1iZXIsIHk6IG51bWJlciwgYXJlYTogQXJlYUxpbmtlZFJlY3QpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIudGFiRHJvcFBsYWNlaG9sZGVyLnJlbW92ZSgpO1xyXG4gICAgICAgIHN1cGVyLmhpZ2hsaWdodERyb3Bab25lKHgsIHksIGFyZWEpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIG9uRHJvcChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGFyZWE6IEdyb3VuZEl0ZW0uQXJlYSk6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAoY29udGVudEl0ZW0uaXNDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoKTtcclxuICAgICAgICAgICAgLy8gc2luY2UgUmVzb2x2ZWRJdGVtQ29uZmlnLmNvbnRlbnRJdGVtcyBub3Qgc2V0IHVwLCB3ZSBuZWVkIHRvIGFkZCBoZWFkZXIgZnJvbSBDb21wb25lbnRcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gY29udGVudEl0ZW0gYXMgQ29tcG9uZW50SXRlbTtcclxuICAgICAgICAgICAgaXRlbUNvbmZpZy5oZWFkZXIgPSBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShjb21wb25lbnQuaGVhZGVyQ29uZmlnKTtcclxuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQW5kSW5pdENvbnRlbnRJdGVtKGl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgICAgICBzdGFjay5hZGRDaGlsZChjb250ZW50SXRlbSk7XHJcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtID0gc3RhY2s7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGQoY29udGVudEl0ZW0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAqIElmIHRoZSBjb250ZW50SXRlbSB0aGF0J3MgYmVpbmcgZHJvcHBlZCBpcyBub3QgZHJvcHBlZCBvbiBhIFN0YWNrIChjYXNlcyB3aGljaCBqdXN0IHBhc3NlZCBhYm92ZSBhbmRcclxuICAgICAgICAgICAgICogd2hpY2ggd291bGQgd3JhcCB0aGUgY29udGVudEl0ZW0gaW4gYSBTdGFjaykgd2UgbmVlZCB0byBjaGVjayB3aGV0aGVyIGNvbnRlbnRJdGVtIGlzIGEgUm93T3JDb2x1bW4uXHJcbiAgICAgICAgICAgICAqIElmIGl0IGlzLCB3ZSBuZWVkIHRvIHJlLXdyYXAgaXQgaW4gYSBTdGFjayBsaWtlIGl0IHdhcyB3aGVuIGl0IHdhcyBkcmFnZ2VkIGJ5IGl0cyBUYWIgKGl0IHdhcyBkcmFnZ2VkISkuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZihjb250ZW50SXRlbS50eXBlID09PSBJdGVtVHlwZS5yb3cgfHwgY29udGVudEl0ZW0udHlwZSA9PT0gSXRlbVR5cGUuY29sdW1uKXtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVDb250ZW50SXRlbShpdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIHN0YWNrLmFkZENoaWxkKGNvbnRlbnRJdGVtKVxyXG4gICAgICAgICAgICAgICAgY29udGVudEl0ZW0gPSBzdGFja1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gYXJlYS5zaWRlWzBdID09ICd4JyA/IEl0ZW1UeXBlLnJvdyA6IEl0ZW1UeXBlLmNvbHVtbjtcclxuICAgICAgICAgICAgY29uc3QgaW5zZXJ0QmVmb3JlID0gYXJlYS5zaWRlWzFdID09ICcyJztcclxuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgIGlmICghKGNvbHVtbiBpbnN0YW5jZW9mIFJvd09yQ29sdW1uKSB8fCBjb2x1bW4udHlwZSAhPT0gdHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IFJlc29sdmVkSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KHR5cGUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93T3JDb2x1bW4gPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQ29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VDaGlsZChjb2x1bW4sIHJvd09yQ29sdW1uKTtcclxuICAgICAgICAgICAgICAgIHJvd09yQ29sdW1uLmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbnNlcnRCZWZvcmUgPyAwIDogdW5kZWZpbmVkLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHJvd09yQ29sdW1uLmFkZENoaWxkKGNvbHVtbiwgaW5zZXJ0QmVmb3JlID8gdW5kZWZpbmVkIDogMCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW4uc2l6ZSA9IDUwO1xyXG4gICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IDUwO1xyXG4gICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZVVuaXQgPSBTaXplVW5pdEVudW0uUGVyY2VudDtcclxuICAgICAgICAgICAgICAgIHJvd09yQ29sdW1uLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2libGluZyA9IGNvbHVtbi5jb250ZW50SXRlbXNbaW5zZXJ0QmVmb3JlID8gMCA6IGNvbHVtbi5jb250ZW50SXRlbXMubGVuZ3RoIC0gMV1cclxuICAgICAgICAgICAgICAgIGNvbHVtbi5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5zZXJ0QmVmb3JlID8gMCA6IHVuZGVmaW5lZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBzaWJsaW5nLnNpemUgKj0gMC41O1xyXG4gICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IHNpYmxpbmcuc2l6ZTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW4udXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTm8gQ29udGVudEl0ZW0gY2FuIGRvY2sgd2l0aCBncm91bmRJdGVtLiAgSG93ZXZlciBTdGFjayBjYW4gaGF2ZSBhIEdyb3VuZEl0ZW0gcGFyZW50IGFuZCBTdGFjayByZXF1aXJlcyB0aGF0XHJcbiAgICAvLyBpdHMgcGFyZW50IGltcGxlbWVudCBkb2NrKCkgZnVuY3Rpb24uICBBY2NvcmRpbmdseSB0aGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGJ1dCB0aHJvd3MgYW4gZXhjZXB0aW9uIGFzIGl0IHNob3VsZFxyXG4gICAgLy8gbmV2ZXIgYmUgY2FsbGVkXHJcbiAgICBkb2NrKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignR0lEODc3MzEnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBObyBDb250ZW50SXRlbSBjYW4gZG9jayB3aXRoIGdyb3VuZEl0ZW0uICBIb3dldmVyIFN0YWNrIGNhbiBoYXZlIGEgR3JvdW5kSXRlbSBwYXJlbnQgYW5kIFN0YWNrIHJlcXVpcmVzIHRoYXRcclxuICAgIC8vIGl0cyBwYXJlbnQgaW1wbGVtZW50IHZhbGlkYXRlRG9ja2luZygpIGZ1bmN0aW9uLiAgQWNjb3JkaW5nbHkgdGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBidXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBhcyBpdCBzaG91bGRcclxuICAgIC8vIG5ldmVyIGJlIGNhbGxlZFxyXG4gICAgdmFsaWRhdGVEb2NraW5nKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignR0lWRDg3NzMyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWxsQ29udGVudEl0ZW1zKCk6IENvbnRlbnRJdGVtW10ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQ29udGVudEl0ZW1bXSA9IFt0aGlzXTtcclxuICAgICAgICB0aGlzLmRlZXBHZXRBbGxDb250ZW50SXRlbXModGhpcy5jb250ZW50SXRlbXMsIHJlc3VsdCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGxDb21wb25lbnRJdGVtcygpOiBDb21wb25lbnRJdGVtW10ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQ29udGVudEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIHRoaXMuZGVlcEZpbHRlckNvbnRlbnRJdGVtcyh0aGlzLmNvbnRlbnRJdGVtcywgcmVzdWx0LCAoaXRlbSkgPT4gaXRlbS5pc0NvbXBvbmVudCk7XHJcbiAgICAgICAgcmV0dXJuIDxDb21wb25lbnRJdGVtW10+cmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldENvbmZpZ01heGltaXNlZEl0ZW1zKCk6IENvbnRlbnRJdGVtW10ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQ29udGVudEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIHRoaXMuZGVlcEZpbHRlckNvbnRlbnRJdGVtcyh0aGlzLmNvbnRlbnRJdGVtcywgcmVzdWx0LCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoQ29udGVudEl0ZW0uaXNTdGFjayhpdGVtKSAmJiBpdGVtLmluaXRpYWxXYW50TWF4aW1pc2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzQ29tcG9uZW50SXRlbShpdGVtKSAmJiBpdGVtLmluaXRpYWxXYW50TWF4aW1pc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SXRlbXNCeVBvcEluUGFyZW50SWQocG9wSW5QYXJlbnRJZDogc3RyaW5nKTogQ29udGVudEl0ZW1bXSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBDb250ZW50SXRlbVtdID0gW107XHJcbiAgICAgICAgdGhpcy5kZWVwRmlsdGVyQ29udGVudEl0ZW1zKHRoaXMuY29udGVudEl0ZW1zLCByZXN1bHQsIChpdGVtKSA9PiBpdGVtLnBvcEluUGFyZW50SWRzLmluY2x1ZGVzKHBvcEluUGFyZW50SWQpKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHRvQ29uZmlnKCk6IFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2VuZXJhdGUgR3JvdW5kSXRlbSBjb25maWcnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBzZXRBY3RpdmVDb21wb25lbnRJdGVtKGl0ZW06IENvbXBvbmVudEl0ZW0sIGZvY3VzOiBib29sZWFuLCBzdXBwcmVzc0ZvY3VzRXZlbnQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICAvLyBvbmx5IGFwcGxpY2FibGUgaWYgQ29tcG9uZW50SXRlbSBpcyByb290IGFuZCB0aGVuIGl0IGFsd2F5cyBoYXMgZm9jdXNcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZU5vZGVTaXplKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0KHRoaXMuX2NvbnRhaW5lckVsZW1lbnQpO1xyXG5cclxuICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmVsZW1lbnQsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogR3JvdW5kSXRlbSBjYW4gYmUgZW1wdHlcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5jb250ZW50SXRlbXNbMF0uZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuY29udGVudEl0ZW1zWzBdLmVsZW1lbnQsIGhlaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVlcEdldEFsbENvbnRlbnRJdGVtcyhjb250ZW50OiByZWFkb25seSBDb250ZW50SXRlbVtdLCByZXN1bHQ6IENvbnRlbnRJdGVtW10pOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50W2ldO1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaChjb250ZW50SXRlbSk7XHJcbiAgICAgICAgICAgIHRoaXMuZGVlcEdldEFsbENvbnRlbnRJdGVtcyhjb250ZW50SXRlbS5jb250ZW50SXRlbXMsIHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVlcEZpbHRlckNvbnRlbnRJdGVtcyhjb250ZW50OiByZWFkb25seSBDb250ZW50SXRlbVtdLCByZXN1bHQ6IENvbnRlbnRJdGVtW10sXHJcbiAgICAgICAgY2hlY2tBY2NlcHRGdG46ICgodGhpczogdm9pZCwgaXRlbTogQ29udGVudEl0ZW0pID0+IGJvb2xlYW4pXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50W2ldO1xyXG4gICAgICAgICAgICBpZiAoY2hlY2tBY2NlcHRGdG4oY29udGVudEl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjb250ZW50SXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kZWVwRmlsdGVyQ29udGVudEl0ZW1zKGNvbnRlbnRJdGVtLmNvbnRlbnRJdGVtcywgcmVzdWx0LCBjaGVja0FjY2VwdEZ0bik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEdyb3VuZEl0ZW0ge1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBBcmVhIGV4dGVuZHMgQ29udGVudEl0ZW0uQXJlYSB7XHJcbiAgICAgICAgc2lkZToga2V5b2YgdHlwZW9mIEFyZWEuU2lkZTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIEFyZWEge1xyXG4gICAgICAgIGV4cG9ydCBjb25zdCBlbnVtIFNpZGUge1xyXG4gICAgICAgICAgICB5MixcclxuICAgICAgICAgICAgeDIsXHJcbiAgICAgICAgICAgIHkxLFxyXG4gICAgICAgICAgICB4MSxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGV4cG9ydCB0eXBlIFNpZGVzID0geyBbc2lkZSBpbiBrZXlvZiB0eXBlb2YgU2lkZV06IGtleW9mIHR5cGVvZiBTaWRlOyB9XHJcblxyXG4gICAgICAgIGV4cG9ydCBjb25zdCBvcHBvc2l0ZVNpZGVzOiBTaWRlcyA9IHtcclxuICAgICAgICAgICAgeTI6ICd5MScsXHJcbiAgICAgICAgICAgIHgyOiAneDEnLFxyXG4gICAgICAgICAgICB5MTogJ3kyJyxcclxuICAgICAgICAgICAgeDE6ICd4MicsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxlbWVudChkb2N1bWVudDogRG9jdW1lbnQpOiBIVE1MRGl2RWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkdvbGRlbkxheW91dCk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSXRlbSk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuUm9vdCk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50SXRlbUNvbmZpZywgSXRlbUNvbmZpZywgUm93T3JDb2x1bW5JdGVtQ29uZmlnLCBTdGFja0l0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnJ1xyXG5pbXBvcnQgeyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZywgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJ1xyXG5pbXBvcnQgeyBTcGxpdHRlciB9IGZyb20gJy4uL2NvbnRyb2xzL3NwbGl0dGVyJ1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZE51bGxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcidcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJ1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJ1xyXG5pbXBvcnQgeyBJdGVtVHlwZSwgSnNvblZhbHVlLCBTaXplVW5pdEVudW0sIFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUgfSBmcm9tICcuLi91dGlscy90eXBlcydcclxuaW1wb3J0IHtcclxuICAgIGdldEVsZW1lbnRIZWlnaHQsXHJcbiAgICBnZXRFbGVtZW50V2lkdGgsXHJcbiAgICBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQsXHJcbiAgICBudW1iZXJUb1BpeGVscyxcclxuICAgIHBpeGVsc1RvTnVtYmVyLFxyXG4gICAgc2V0RWxlbWVudEhlaWdodCxcclxuICAgIHNldEVsZW1lbnRXaWR0aFxyXG59IGZyb20gXCIuLi91dGlscy91dGlsc1wiXHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1pdGVtJ1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vY29udGVudC1pdGVtJ1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIFJvd09yQ29sdW1uIGV4dGVuZHMgQ29udGVudEl0ZW0ge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hpbGRFbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZ1R5cGU6ICdyb3cnIHwgJ2NvbHVtbic7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pc0NvbHVtbjogYm9vbGVhbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NwbGl0dGVyU2l6ZTogbnVtYmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3BsaXR0ZXJHcmFiU2l6ZTogbnVtYmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGltZW5zaW9uOiBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3BsaXR0ZXI6IFNwbGl0dGVyW10gPSBbXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3NwbGl0dGVyUG9zaXRpb246IG51bWJlciB8IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zcGxpdHRlck1pblBvc2l0aW9uOiBudW1iZXIgfCBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc3BsaXR0ZXJNYXhQb3NpdGlvbjogbnVtYmVyIHwgbnVsbDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3Rvcihpc0NvbHVtbjogYm9vbGVhbiwgbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlciwgY29uZmlnOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfcm93T3JDb2x1bW5QYXJlbnQ6IENvbnRlbnRJdGVtXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihsYXlvdXRNYW5hZ2VyLCBjb25maWcsIF9yb3dPckNvbHVtblBhcmVudCwgUm93T3JDb2x1bW4uY3JlYXRlRWxlbWVudChkb2N1bWVudCwgaXNDb2x1bW4pKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc1JvdyA9ICFpc0NvbHVtbjtcclxuICAgICAgICB0aGlzLmlzQ29sdW1uID0gaXNDb2x1bW47XHJcblxyXG4gICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lciA9IHRoaXMuZWxlbWVudDtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlclNpemUgPSBsYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5kaW1lbnNpb25zLmJvcmRlcldpZHRoO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyR3JhYlNpemUgPSBsYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5kaW1lbnNpb25zLmJvcmRlckdyYWJXaWR0aDtcclxuICAgICAgICB0aGlzLl9pc0NvbHVtbiA9IGlzQ29sdW1uO1xyXG4gICAgICAgIHRoaXMuX2RpbWVuc2lvbiA9IGlzQ29sdW1uID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyUG9zaXRpb24gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyTWluUG9zaXRpb24gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyTWF4UG9zaXRpb24gPSBudWxsO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGNvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZ1R5cGUgPSBjb25maWcudHlwZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdST0NDQ1QwMDkyNScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZXdDb21wb25lbnQoY29tcG9uZW50VHlwZTogSnNvblZhbHVlLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGU/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogQ29tcG9uZW50SXRlbSB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5ld0l0ZW0oaXRlbUNvbmZpZywgaW5kZXgpIGFzIENvbXBvbmVudEl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ29tcG9uZW50KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nLCBpbmRleD86IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW0oaXRlbUNvbmZpZywgaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5ld0l0ZW0oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZywgIGluZGV4PzogbnVtYmVyKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIGluZGV4ID0gdGhpcy5hZGRJdGVtKGl0ZW1Db25maWcsIGluZGV4KTtcclxuICAgICAgICBjb25zdCBjcmVhdGVkSXRlbSA9IHRoaXMuY29udGVudEl0ZW1zW2luZGV4XTtcclxuXHJcbiAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzU3RhY2soY3JlYXRlZEl0ZW0pICYmIChJdGVtQ29uZmlnLmlzQ29tcG9uZW50KGl0ZW1Db25maWcpKSkge1xyXG4gICAgICAgICAgICAvLyBjcmVhdGVkSXRlbSBpcyBhIFN0YWNrIHdoaWNoIHdhcyBjcmVhdGVkIHRvIGhvbGQgd2FudGVkIGNvbXBvbmVudC4gIFJldHVybiBjb21wb25lbnRcclxuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRJdGVtLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlZEl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFkZEl0ZW0oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgICAgICBpbmRleD86IG51bWJlclxyXG4gICAgKTogbnVtYmVyIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuY2hlY2tNaW5pbWlzZU1heGltaXNlZFN0YWNrKCk7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRJdGVtQ29uZmlnID0gSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0ocmVzb2x2ZWRJdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5kZXgsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIG5ldyBjb250ZW50SXRlbSB0byB0aGUgUm93IG9yIENvbHVtblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb250ZW50SXRlbSAtXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgcG9zaXRpb24gb2YgdGhlIG5ldyBpdGVtIHdpdGhpbiB0aGUgUm93IG9yIENvbHVtbi5cclxuICAgICAqICAgICAgICAgICAgICAgIElmIG5vIGluZGV4IGlzIHByb3ZpZGVkIHRoZSBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZFxyXG4gICAgICogQHBhcmFtIHN1c3BlbmRSZXNpemUgLSBJZiB0cnVlIHRoZSBpdGVtcyB3b24ndCBiZSByZXNpemVkLiBUaGlzIHdpbGwgbGVhdmUgdGhlIGl0ZW0gaW5cclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgYW4gaW5jb25zaXN0ZW50IHN0YXRlIGFuZCBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgaWYgbXVsdGlwbGVcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gbmVlZCB0byBiZSBhZGRlZCBpbiBvbmUgZ28gYW5kIHJlc2l6ZSBpcyBjYWxsZWQgYWZ0ZXJ3YXJkc1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIGFkZENoaWxkKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwgaW5kZXg/OiBudW1iZXIsIHN1c3BlbmRSZXNpemU/OiBib29sZWFuKTogbnVtYmVyIHtcclxuXHJcbiAgICAgICAgLy8gY29udGVudEl0ZW0gPSB0aGlzLmxheW91dE1hbmFnZXIuXyRub3JtYWxpemVDb250ZW50SXRlbShjb250ZW50SXRlbSwgdGhpcyk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgc3BsaXR0ZXJFbGVtZW50ID0gdGhpcy5jcmVhdGVTcGxpdHRlcihNYXRoLm1heCgwLCBpbmRleCAtIDEpKS5lbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50SXRlbXNbaW5kZXggLSAxXS5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBzcGxpdHRlckVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgc3BsaXR0ZXJFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBjb250ZW50SXRlbS5lbGVtZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEl0ZW1zWzBdLmVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIHNwbGl0dGVyRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBzcGxpdHRlckVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIGNvbnRlbnRJdGVtLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKGNvbnRlbnRJdGVtLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIuYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluZGV4KTtcclxuXHJcbiAgICAgICAgY29uc3QgbmV3SXRlbVNpemUgPSAoMSAvIHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCkgKiAxMDA7XHJcblxyXG4gICAgICAgIGlmIChzdXNwZW5kUmVzaXplID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleGVkQ29udGVudEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ZWRDb250ZW50SXRlbSA9PT0gY29udGVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSBuZXdJdGVtU2l6ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1TaXplID0gaW5kZXhlZENvbnRlbnRJdGVtLnNpemUgKj0gKDEwMCAtIG5ld0l0ZW1TaXplKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgIGluZGV4ZWRDb250ZW50SXRlbS5zaXplID0gaXRlbVNpemU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG5cclxuICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgY2hpbGQgb2YgdGhpcyBlbGVtZW50XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbnRlbnRJdGVtIC1cclxuICAgICAqIEBwYXJhbSBrZWVwQ2hpbGQgLSBJZiB0cnVlIHRoZSBjaGlsZCB3aWxsIGJlIHJlbW92ZWQsIGJ1dCBub3QgZGVzdHJveWVkXHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSByZW1vdmVDaGlsZChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGtlZXBDaGlsZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb250ZW50SXRlbXMuaW5kZXhPZihjb250ZW50SXRlbSk7XHJcbiAgICAgICAgY29uc3Qgc3BsaXR0ZXJJbmRleCA9IE1hdGgubWF4KGluZGV4IC0gMSwgMCk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IHJlbW92ZSBjaGlsZC4gQ29udGVudEl0ZW0gaXMgbm90IGNoaWxkIG9mIHRoaXMgUm93IG9yIENvbHVtbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVtb3ZlIHRoZSBzcGxpdHRlciBiZWZvcmUgdGhlIGl0ZW0gb3IgYWZ0ZXIgaWYgdGhlIGl0ZW0gaGFwcGVuc1xyXG4gICAgICAgICAqIHRvIGJlIHRoZSBmaXJzdCBpbiB0aGUgcm93L2NvbHVtblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLl9zcGxpdHRlcltzcGxpdHRlckluZGV4XSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zcGxpdHRlcltzcGxpdHRlckluZGV4XS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NwbGl0dGVyLnNwbGljZShzcGxpdHRlckluZGV4LCAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLnJlbW92ZUNoaWxkKGNvbnRlbnRJdGVtLCBrZWVwQ2hpbGQpO1xyXG5cclxuICAgICAgICAvLyBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID09PSAxICYmIHRoaXMuaXNDbG9zYWJsZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIC8vICAgICBjb25zdCBjaGlsZEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAvLyAgICAgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID0gMDtcclxuICAgICAgICAvLyAgICAgdGhpcy5fcm93T3JDb2x1bW5QYXJlbnQucmVwbGFjZUNoaWxkKHRoaXMsIGNoaWxkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlcyBhIGNoaWxkIG9mIHRoaXMgUm93IG9yIENvbHVtbiB3aXRoIGFub3RoZXIgY29udGVudEl0ZW1cclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgcmVwbGFjZUNoaWxkKG9sZENoaWxkOiBDb250ZW50SXRlbSwgbmV3Q2hpbGQ6IENvbnRlbnRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IG9sZENoaWxkLnNpemU7XHJcbiAgICAgICAgc3VwZXIucmVwbGFjZUNoaWxkKG9sZENoaWxkLCBuZXdDaGlsZCk7XHJcbiAgICAgICAgbmV3Q2hpbGQuc2l6ZSA9IHNpemU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBpdGVtIG9yIG9uZSBvZiBpdHMgcGFyZW50cyBjaGFuZ2VcclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgdXBkYXRlU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5iZWdpblZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTm9kZVNpemUoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb250ZW50SXRlbXNTaXplKGZvcmNlKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW5kVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCByZWN1cnNpdmVseSBieSB0aGUgbGF5b3V0IG1hbmFnZXIuIENvbnRlbnRJdGVtLmluaXQgYXBwZW5kc1xyXG4gICAgICogdGhlIGNvbnRlbnRJdGVtJ3MgRE9NIGVsZW1lbnRzIHRvIHRoZSBjb250YWluZXIsIFJvd09yQ29sdW1uIGluaXQgYWRkcyBzcGxpdHRlcnNcclxuICAgICAqIGluIGJldHdlZW4gdGhlbVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXNlZCA9PT0gdHJ1ZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCB0aGlzLmNyZWF0ZVNwbGl0dGVyKGkpLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbml0Q29udGVudEl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9Db25maWcoKTogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSBhcyAncm93JyB8ICdjb2x1bW4nLFxyXG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLmNhbGN1bGF0ZUNvbmZpZ0NvbnRlbnQoKSBhcyAoUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZylbXSxcclxuICAgICAgICAgICAgc2l6ZTogdGhpcy5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogdGhpcy5zaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZTogdGhpcy5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogdGhpcy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IHRoaXMuaXNDbG9zYWJsZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2V0UGFyZW50KHBhcmVudDogQ29udGVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9yb3dPckNvbHVtblBhcmVudCA9IHBhcmVudDtcclxuICAgICAgICBzdXBlci5zZXRQYXJlbnQocGFyZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZU5vZGVTaXplKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmVsYXRpdmVTaXplcygpO1xyXG4gICAgICAgICAgICB0aGlzLnNldEFic29sdXRlU2l6ZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgncmVzaXplJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUdXJucyB0aGUgcmVsYXRpdmUgc2l6ZXMgY2FsY3VsYXRlZCBieSBjYWxjdWxhdGVSZWxhdGl2ZVNpemVzIGludG9cclxuICAgICAqIGFic29sdXRlIHBpeGVsIHZhbHVlcyBhbmQgYXBwbGllcyB0aGVtIHRvIHRoZSBjaGlsZHJlbidzIERPTSBlbGVtZW50c1xyXG4gICAgICpcclxuICAgICAqIEFzc2lnbnMgYWRkaXRpb25hbCBwaXhlbHMgdG8gY291bnRlcmFjdCBNYXRoLmZsb29yXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXRBYnNvbHV0ZVNpemVzKCkge1xyXG4gICAgICAgIGNvbnN0IGFic29sdXRlU2l6ZXMgPSB0aGlzLmNhbGN1bGF0ZUFic29sdXRlU2l6ZXMoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoYWJzb2x1dGVTaXplcy5hZGRpdGlvbmFsUGl4ZWwgLSBpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgYWJzb2x1dGVTaXplcy5pdGVtU2l6ZXNbaV0rKztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzQ29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCwgYWJzb2x1dGVTaXplcy5jcm9zc0F4aXNTaXplKTtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCwgYWJzb2x1dGVTaXplcy5pdGVtU2l6ZXNbaV0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQsIGFic29sdXRlU2l6ZXMuaXRlbVNpemVzW2ldKTtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCwgYWJzb2x1dGVTaXplcy5jcm9zc0F4aXNTaXplKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGFic29sdXRlIHNpemVzIG9mIGFsbCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBJdGVtLlxyXG4gICAgICogQHJldHVybnMgU2V0IHdpdGggYWJzb2x1dGUgc2l6ZXMgYW5kIGFkZGl0aW9uYWwgcGl4ZWxzLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlQWJzb2x1dGVTaXplcygpOiBSb3dPckNvbHVtbi5BYnNvbHV0ZVNpemVzIHtcclxuICAgICAgICBjb25zdCB0b3RhbFNwbGl0dGVyU2l6ZSA9ICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggLSAxKSAqIHRoaXMuX3NwbGl0dGVyU2l6ZTtcclxuICAgICAgICBjb25zdCB7IHdpZHRoOiBlbGVtZW50V2lkdGgsIGhlaWdodDogZWxlbWVudEhlaWdodCB9ID0gZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0KHRoaXMuZWxlbWVudCk7XHJcblxyXG4gICAgICAgIGxldCB0b3RhbFNpemU6IG51bWJlcjtcclxuICAgICAgICBsZXQgY3Jvc3NBeGlzU2l6ZTogbnVtYmVyO1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0NvbHVtbikge1xyXG4gICAgICAgICAgICB0b3RhbFNpemUgPSBlbGVtZW50SGVpZ2h0IC0gdG90YWxTcGxpdHRlclNpemU7XHJcbiAgICAgICAgICAgIGNyb3NzQXhpc1NpemUgPSBlbGVtZW50V2lkdGg7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdG90YWxTaXplID0gZWxlbWVudFdpZHRoIC0gdG90YWxTcGxpdHRlclNpemU7XHJcbiAgICAgICAgICAgIGNyb3NzQXhpc1NpemUgPSBlbGVtZW50SGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRvdGFsQXNzaWduZWQgPSAwO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1TaXplczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMuY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBsZXQgaXRlbVNpemU6IG51bWJlcjtcclxuICAgICAgICAgICAgaWYgKGNvbnRlbnRJdGVtLnNpemVVbml0ID09PSBTaXplVW5pdEVudW0uUGVyY2VudCkge1xyXG4gICAgICAgICAgICAgICAgaXRlbVNpemUgPSBNYXRoLmZsb29yKHRvdGFsU2l6ZSAqIChjb250ZW50SXRlbS5zaXplIC8gMTAwKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1JPQ0NBUzY2OTInKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdG90YWxBc3NpZ25lZCArPSBpdGVtU2l6ZTtcclxuICAgICAgICAgICAgaXRlbVNpemVzLnB1c2goaXRlbVNpemUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFBpeGVsID0gTWF0aC5mbG9vcih0b3RhbFNpemUgLSB0b3RhbEFzc2lnbmVkKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaXRlbVNpemVzLFxyXG4gICAgICAgICAgICBhZGRpdGlvbmFsUGl4ZWwsXHJcbiAgICAgICAgICAgIHRvdGFsU2l6ZSxcclxuICAgICAgICAgICAgY3Jvc3NBeGlzU2l6ZSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgcmVsYXRpdmUgc2l6ZXMgb2YgYWxsIGNoaWxkcmVuIG9mIHRoaXMgSXRlbS4gVGhlIGxvZ2ljXHJcbiAgICAgKiBpcyBhcyBmb2xsb3dzOlxyXG4gICAgICpcclxuICAgICAqIC0gQWRkIHVwIHRoZSB0b3RhbCBzaXplIG9mIGFsbCBpdGVtcyB0aGF0IGhhdmUgYSBjb25maWd1cmVkIHNpemVcclxuICAgICAqXHJcbiAgICAgKiAtIElmIHRoZSB0b3RhbCA9PSAxMDAgKGNoZWNrIGZvciBmbG9hdGluZyBwb2ludCBlcnJvcnMpXHJcbiAgICAgKiAgICAgICAgRXhjZWxsZW50LCBqb2IgZG9uZVxyXG4gICAgICpcclxuICAgICAqIC0gSWYgdGhlIHRvdGFsIGlzIFxcPiAxMDAsXHJcbiAgICAgKiAgICAgICAgc2V0IHRoZSBzaXplIG9mIGl0ZW1zIHdpdGhvdXQgc2V0IGRpbWVuc2lvbnMgdG8gMS8zIGFuZCBhZGQgdGhpcyB0byB0aGUgdG90YWxcclxuICAgICAqICAgICAgICBzZXQgdGhlIHNpemUgb2ZmIGFsbCBpdGVtcyBzbyB0aGF0IHRoZSB0b3RhbCBpcyBodW5kcmVkIHJlbGF0aXZlIHRvIHRoZWlyIG9yaWdpbmFsIHNpemVcclxuICAgICAqXHJcbiAgICAgKiAtIElmIHRoZSB0b3RhbCBpcyBcXDwgMTAwXHJcbiAgICAgKiAgICAgICAgSWYgdGhlcmUgYXJlIGl0ZW1zIHdpdGhvdXQgc2V0IGRpbWVuc2lvbnMsIGRpc3RyaWJ1dGUgdGhlIHJlbWFpbmRlciB0byAxMDAgZXZlbmx5IGJldHdlZW4gdGhlbVxyXG4gICAgICogICAgICAgIElmIHRoZXJlIGFyZSBubyBpdGVtcyB3aXRob3V0IHNldCBkaW1lbnNpb25zLCBpbmNyZWFzZSBhbGwgaXRlbXMgc2l6ZXMgcmVsYXRpdmUgdG9cclxuICAgICAqICAgICAgICB0aGVpciBvcmlnaW5hbCBzaXplIHNvIHRoYXQgdGhleSBhZGQgdXAgdG8gMTAwXHJcbiAgICAgKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlUmVsYXRpdmVTaXplcygpIHtcclxuXHJcbiAgICAgICAgbGV0IHRvdGFsID0gMDtcclxuICAgICAgICBjb25zdCBpdGVtc1dpdGhGcmFjdGlvbmFsU2l6ZTogQ29udGVudEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIGxldCB0b3RhbEZyYWN0aW9uYWxTaXplID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMuY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBzaXplVW5pdCA9IGNvbnRlbnRJdGVtLnNpemVVbml0O1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHNpemVVbml0KSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5QZXJjZW50OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY29udGVudEl0ZW0uc2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLkZyYWN0aW9uYWw6IHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtc1dpdGhGcmFjdGlvbmFsU2l6ZS5wdXNoKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbEZyYWN0aW9uYWxTaXplICs9IGNvbnRlbnRJdGVtLnNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignUk9DQ1JTNDkxMTAnLCBKU09OLnN0cmluZ2lmeShjb250ZW50SXRlbSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBFdmVyeXRoaW5nIGFkZHMgdXAgdG8gaHVuZHJlZCwgYWxsIGdvb2QgOi0pXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKE1hdGgucm91bmQodG90YWwpID09PSAxMDApIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNwZWN0TWluSXRlbVNpemUoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgcmVtYWluaW5nIHNpemUgdG8gdGhlIGl0ZW1zIHdpdGggYSBmcmFjdGlvbmFsIHNpemVcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKHRvdGFsKSA8IDEwMCAmJiBpdGVtc1dpdGhGcmFjdGlvbmFsU2l6ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmcmFjdGlvbmFsQWxsb2NhdGVkU2l6ZSA9IDEwMCAtIHRvdGFsO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtc1dpdGhGcmFjdGlvbmFsU2l6ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gaXRlbXNXaXRoRnJhY3Rpb25hbFNpemVbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IGZyYWN0aW9uYWxBbGxvY2F0ZWRTaXplICogKGNvbnRlbnRJdGVtLnNpemUgLyB0b3RhbEZyYWN0aW9uYWxTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplVW5pdCA9IFNpemVVbml0RW51bS5QZXJjZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNwZWN0TWluSXRlbVNpemUoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIElmIHRoZSB0b3RhbCBpcyA+IDEwMCwgYnV0IHRoZXJlIGFyZSBhbHNvIGl0ZW1zIHdpdGggYSBmcmFjdGlvbmFsIHNpemUsIGFzc2lnbiBhbm90aGVyIDUwJVxyXG4gICAgICAgICAgICAgICAgICogdG8gdGhlIGZyYWN0aW9uYWwgaXRlbXNcclxuICAgICAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAgICAgKiBUaGlzIHdpbGwgYmUgcmVzZXQgaW4gdGhlIG5leHQgc3RlcFxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5yb3VuZCh0b3RhbCkgPiAxMDAgJiYgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBpdGVtc1dpdGhGcmFjdGlvbmFsU2l6ZVtpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IDUwICogKGNvbnRlbnRJdGVtLnNpemUgLyB0b3RhbEZyYWN0aW9uYWxTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZVVuaXQgPSBTaXplVW5pdEVudW0uUGVyY2VudDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gNTA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBTZXQgZXZlcnkgaXRlbXMgc2l6ZSByZWxhdGl2ZSB0byAxMDAgcmVsYXRpdmUgdG8gaXRzIHNpemUgdG8gdG90YWxcclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5jb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IChjb250ZW50SXRlbS5zaXplIC8gdG90YWwpICogMTAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVzcGVjdE1pbkl0ZW1TaXplKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGp1c3RzIHRoZSBjb2x1bW4gd2lkdGhzIHRvIHJlc3BlY3QgdGhlIGRpbWVuc2lvbnMgbWluSXRlbVdpZHRoIGlmIHNldC5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlc3BlY3RNaW5JdGVtU2l6ZSgpIHtcclxuICAgICAgICBpbnRlcmZhY2UgRW50cnkge1xyXG4gICAgICAgICAgICBzaXplOiBudW1iZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBtaW5JdGVtU2l6ZSA9IHRoaXMuY2FsY3VsYXRlQ29udGVudEl0ZW1NaW5TaXplKHRoaXMpO1xyXG5cclxuICAgICAgICBpZiAobWluSXRlbVNpemUgPD0gMCB8fCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPD0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRvdGFsT3Zlck1pbiA9IDA7XHJcbiAgICAgICAgICAgIGxldCB0b3RhbFVuZGVyTWluID0gMDtcclxuICAgICAgICAgICAgY29uc3QgZW50cmllc092ZXJNaW46IEVudHJ5W10gPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgYWxsRW50cmllczogRW50cnlbXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGVTaXplcyA9IHRoaXMuY2FsY3VsYXRlQWJzb2x1dGVTaXplcygpO1xyXG5cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEZpZ3VyZSBvdXQgaG93IG11Y2ggd2UgYXJlIHVuZGVyIHRoZSBtaW4gaXRlbSBzaXplIHRvdGFsIGFuZCBob3cgbXVjaCByb29tIHdlIGhhdmUgdG8gdXNlLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhYnNvbHV0ZVNpemVzLml0ZW1TaXplcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbVNpemUgPSBhYnNvbHV0ZVNpemVzLml0ZW1TaXplc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZW50cnk6IEVudHJ5O1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1TaXplIDwgbWluSXRlbVNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbFVuZGVyTWluICs9IG1pbkl0ZW1TaXplIC0gaXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgZW50cnkgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IG1pbkl0ZW1TaXplXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsT3Zlck1pbiArPSBpdGVtU2l6ZSAtIG1pbkl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGVudHJ5ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBpdGVtU2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgZW50cmllc092ZXJNaW4ucHVzaChlbnRyeSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgYWxsRW50cmllcy5wdXNoKGVudHJ5KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIElmIHRoZXJlIGlzIG5vdGhpbmcgdW5kZXIgbWluLCBvciB0aGVyZSBpcyBub3QgZW5vdWdoIG92ZXIgdG8gbWFrZSB1cCB0aGUgZGlmZmVyZW5jZSwgZG8gbm90aGluZy5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmICh0b3RhbFVuZGVyTWluID09PSAwIHx8IHRvdGFsVW5kZXJNaW4gPiB0b3RhbE92ZXJNaW4pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogRXZlbmx5IHJlZHVjZSBhbGwgY29sdW1ucyB0aGF0IGFyZSBvdmVyIHRoZSBtaW4gaXRlbSB3aWR0aCB0byBtYWtlIHVwIHRoZSBkaWZmZXJlbmNlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWR1Y2VQZXJjZW50ID0gdG90YWxVbmRlck1pbiAvIHRvdGFsT3Zlck1pbjtcclxuICAgICAgICAgICAgICAgIGxldCByZW1haW5pbmdTaXplID0gdG90YWxVbmRlck1pbjtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllc092ZXJNaW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNPdmVyTWluW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZHVjZWRTaXplID0gTWF0aC5yb3VuZCgoZW50cnkuc2l6ZSAtIG1pbkl0ZW1TaXplKSAqIHJlZHVjZVBlcmNlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ1NpemUgLT0gcmVkdWNlZFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgZW50cnkuc2l6ZSAtPSByZWR1Y2VkU2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFRha2UgYW55dGhpbmcgcmVtYWluaW5nIGZyb20gdGhlIGxhc3QgaXRlbS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ1NpemUgIT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhbGxFbnRyaWVzW2FsbEVudHJpZXMubGVuZ3RoIC0gMV0uc2l6ZSAtPSByZW1haW5pbmdTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogU2V0IGV2ZXJ5IGl0ZW1zIHNpemUgcmVsYXRpdmUgdG8gMTAwIHJlbGF0aXZlIHRvIGl0cyBzaXplIHRvIHRvdGFsXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMuY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSAoYWxsRW50cmllc1tpXS5zaXplIC8gYWJzb2x1dGVTaXplcy50b3RhbFNpemUpICogMTAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFNwbGl0dGVyLCBiaW5kcyBldmVudHMgdG8gaXQgYW5kIGFkZHNcclxuICAgICAqIGl0IHRvIHRoZSBhcnJheSBvZiBzcGxpdHRlcnMgYXQgdGhlIHBvc2l0aW9uIHNwZWNpZmllZCBhcyB0aGUgaW5kZXggYXJndW1lbnRcclxuICAgICAqXHJcbiAgICAgKiBXaGF0IGl0IGRvZXNuJ3QgZG8gdGhvdWdoIGlzIGFwcGVuZCB0aGUgc3BsaXR0ZXIgdG8gdGhlIERPTVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgc3BsaXR0ZXJcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlU3BsaXR0ZXIoaW5kZXg6IG51bWJlcik6IFNwbGl0dGVyIHtcclxuICAgICAgICBjb25zdCBzcGxpdHRlciA9IG5ldyBTcGxpdHRlcih0aGlzLl9pc0NvbHVtbiwgdGhpcy5fc3BsaXR0ZXJTaXplLCB0aGlzLl9zcGxpdHRlckdyYWJTaXplKTtcclxuICAgICAgICBzcGxpdHRlci5vbignZHJhZycsIChvZmZzZXRYLCBvZmZzZXRZKSA9PiB0aGlzLm9uU3BsaXR0ZXJEcmFnKHNwbGl0dGVyLCBvZmZzZXRYLCBvZmZzZXRZKSk7XHJcbiAgICAgICAgc3BsaXR0ZXIub24oJ2RyYWdTdG9wJywgKCkgPT4gdGhpcy5vblNwbGl0dGVyRHJhZ1N0b3Aoc3BsaXR0ZXIpKTtcclxuICAgICAgICBzcGxpdHRlci5vbignZHJhZ1N0YXJ0JywgKCkgPT4gdGhpcy5vblNwbGl0dGVyRHJhZ1N0YXJ0KHNwbGl0dGVyKSk7XHJcbiAgICAgICAgdGhpcy5fc3BsaXR0ZXIuc3BsaWNlKGluZGV4LCAwLCBzcGxpdHRlcik7XHJcbiAgICAgICAgcmV0dXJuIHNwbGl0dGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9jYXRlcyB0aGUgaW5zdGFuY2Ugb2YgU3BsaXR0ZXIgaW4gdGhlIGFycmF5IG9mXHJcbiAgICAgKiByZWdpc3RlcmVkIHNwbGl0dGVycyBhbmQgcmV0dXJucyBhIG1hcCBjb250YWluaW5nIHRoZSBjb250ZW50SXRlbVxyXG4gICAgICogYmVmb3JlIGFuZCBhZnRlciB0aGUgc3BsaXR0ZXJzLCBib3RoIG9mIHdoaWNoIGFyZSBhZmZlY3RlZCBpZiB0aGVcclxuICAgICAqIHNwbGl0dGVyIGlzIG1vdmVkXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgQSBtYXAgb2YgY29udGVudEl0ZW1zIHRoYXQgdGhlIHNwbGl0dGVyIGFmZmVjdHNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFNwbGl0SXRlbXMoc3BsaXR0ZXI6IFNwbGl0dGVyKSB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9zcGxpdHRlci5pbmRleE9mKHNwbGl0dGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmVmb3JlOiB0aGlzLmNvbnRlbnRJdGVtc1tpbmRleF0sXHJcbiAgICAgICAgICAgIGFmdGVyOiB0aGlzLmNvbnRlbnRJdGVtc1tpbmRleCArIDFdXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUNvbnRlbnRJdGVtTWluU2l6ZShjb250ZW50SXRlbTogQ29udGVudEl0ZW0pIHtcclxuICAgICAgICBjb25zdCBtaW5TaXplID0gY29udGVudEl0ZW0ubWluU2l6ZTtcclxuICAgICAgICBpZiAobWluU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250ZW50SXRlbS5taW5TaXplVW5pdCA9PT0gU2l6ZVVuaXRFbnVtLlBpeGVsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWluU2l6ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignUk9DR01EOTg4MzEnLCBKU09OLnN0cmluZ2lmeShjb250ZW50SXRlbSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IHRoaXMubGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucztcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzQ29sdW1uID8gZGltZW5zaW9ucy5kZWZhdWx0TWluSXRlbUhlaWdodCA6IGRpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1XaWR0aDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIGRpbWVuc2lvbnMgZm9yIHRoZSBnaXZlbiBpdGVtIGNvbmZpZ3VyYXRpb24gYXJyYXlcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUNvbnRlbnRJdGVtc1RvdGFsTWluU2l6ZShjb250ZW50SXRlbXM6IHJlYWRvbmx5IENvbnRlbnRJdGVtW10pIHtcclxuICAgICAgICBsZXQgdG90YWxNaW5TaXplID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjb250ZW50SXRlbSBvZiBjb250ZW50SXRlbXMpIHtcclxuICAgICAgICAgICAgdG90YWxNaW5TaXplICs9IHRoaXMuY2FsY3VsYXRlQ29udGVudEl0ZW1NaW5TaXplKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0b3RhbE1pblNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIHdoZW4gYSBzcGxpdHRlcidzIGRyYWdMaXN0ZW5lciBmaXJlcyBkcmFnU3RhcnQuIENhbGN1bGF0ZXMgdGhlIHNwbGl0dGVyc1xyXG4gICAgICogbW92ZW1lbnQgYXJlYSBvbmNlIChzbyB0aGF0IGl0IGRvZXNuJ3QgbmVlZCBjYWxjdWxhdGluZyBvbiBldmVyeSBtb3VzZW1vdmUgZXZlbnQpXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvblNwbGl0dGVyRHJhZ1N0YXJ0KHNwbGl0dGVyOiBTcGxpdHRlcikge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRTcGxpdEl0ZW1zKHNwbGl0dGVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgYmVmb3JlV2lkdGggPSBwaXhlbHNUb051bWJlcihpdGVtcy5iZWZvcmUuZWxlbWVudC5zdHlsZVt0aGlzLl9kaW1lbnNpb25dKTtcclxuICAgICAgICBjb25zdCBhZnRlclNpemUgPSBwaXhlbHNUb051bWJlcihpdGVtcy5hZnRlci5lbGVtZW50LnN0eWxlW3RoaXMuX2RpbWVuc2lvbl0pO1xyXG4gICAgICAgIGNvbnN0IGJlZm9yZU1pblNpemUgPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRJdGVtc1RvdGFsTWluU2l6ZShpdGVtcy5iZWZvcmUuY29udGVudEl0ZW1zKTtcclxuICAgICAgICBjb25zdCBhZnRlck1pblNpemUgPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRJdGVtc1RvdGFsTWluU2l6ZShpdGVtcy5hZnRlci5jb250ZW50SXRlbXMpO1xyXG5cclxuICAgICAgICB0aGlzLl9zcGxpdHRlclBvc2l0aW9uID0gMDtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlck1pblBvc2l0aW9uID0gLTEgKiAoYmVmb3JlV2lkdGggLSBiZWZvcmVNaW5TaXplKTtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlck1heFBvc2l0aW9uID0gYWZ0ZXJTaXplIC0gYWZ0ZXJNaW5TaXplO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCB3aGVuIGEgc3BsaXR0ZXIncyBEcmFnTGlzdGVuZXIgZmlyZXMgZHJhZy4gVXBkYXRlcyB0aGUgc3BsaXR0ZXIncyBET00gcG9zaXRpb24sXHJcbiAgICAgKiBidXQgbm90IHRoZSBzaXplcyBvZiB0aGUgZWxlbWVudHMgdGhlIHNwbGl0dGVyIGNvbnRyb2xzIGluIG9yZGVyIHRvIG1pbmltaXplIHJlc2l6ZSBldmVudHNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc3BsaXR0ZXIgLVxyXG4gICAgICogQHBhcmFtIG9mZnNldFggLSBSZWxhdGl2ZSBwaXhlbCB2YWx1ZXMgdG8gdGhlIHNwbGl0dGVyJ3Mgb3JpZ2luYWwgcG9zaXRpb24uIENhbiBiZSBuZWdhdGl2ZVxyXG4gICAgICogQHBhcmFtIG9mZnNldFkgLSBSZWxhdGl2ZSBwaXhlbCB2YWx1ZXMgdG8gdGhlIHNwbGl0dGVyJ3Mgb3JpZ2luYWwgcG9zaXRpb24uIENhbiBiZSBuZWdhdGl2ZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25TcGxpdHRlckRyYWcoc3BsaXR0ZXI6IFNwbGl0dGVyLCBvZmZzZXRYOiBudW1iZXIsIG9mZnNldFk6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLl9pc0NvbHVtbiA/IG9mZnNldFkgOiBvZmZzZXRYO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fc3BsaXR0ZXJNaW5Qb3NpdGlvbiA9PT0gbnVsbCB8fCB0aGlzLl9zcGxpdHRlck1heFBvc2l0aW9uID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdST0NPU0Q1OTIyNicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvZmZzZXQgPSBNYXRoLm1heChvZmZzZXQsIHRoaXMuX3NwbGl0dGVyTWluUG9zaXRpb24pO1xyXG4gICAgICAgIG9mZnNldCA9IE1hdGgubWluKG9mZnNldCwgdGhpcy5fc3BsaXR0ZXJNYXhQb3NpdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyUG9zaXRpb24gPSBvZmZzZXQ7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0UGl4ZWxzID0gbnVtYmVyVG9QaXhlbHMob2Zmc2V0KTtcclxuICAgICAgICBpZiAodGhpcy5faXNDb2x1bW4pIHtcclxuICAgICAgICAgICAgc3BsaXR0ZXIuZWxlbWVudC5zdHlsZS50b3AgPSBvZmZzZXRQaXhlbHM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3BsaXR0ZXIuZWxlbWVudC5zdHlsZS5sZWZ0ID0gb2Zmc2V0UGl4ZWxzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludm9rZWQgd2hlbiBhIHNwbGl0dGVyJ3MgRHJhZ0xpc3RlbmVyIGZpcmVzIGRyYWdTdG9wLiBSZXNldHMgdGhlIHNwbGl0dGVycyBET00gcG9zaXRpb24sXHJcbiAgICAgKiBhbmQgYXBwbGllcyB0aGUgbmV3IHNpemVzIHRvIHRoZSBlbGVtZW50cyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBzcGxpdHRlciBhbmQgdGhlaXIgY2hpbGRyZW5cclxuICAgICAqIG9uIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25TcGxpdHRlckRyYWdTdG9wKHNwbGl0dGVyOiBTcGxpdHRlcikge1xyXG4gICAgICAgIGlmICh0aGlzLl9zcGxpdHRlclBvc2l0aW9uID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdST0NPU0RTNjY5MzInKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0U3BsaXRJdGVtcyhzcGxpdHRlcik7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpemVCZWZvcmUgPSBwaXhlbHNUb051bWJlcihpdGVtcy5iZWZvcmUuZWxlbWVudC5zdHlsZVt0aGlzLl9kaW1lbnNpb25dKTtcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZUFmdGVyID0gcGl4ZWxzVG9OdW1iZXIoaXRlbXMuYWZ0ZXIuZWxlbWVudC5zdHlsZVt0aGlzLl9kaW1lbnNpb25dKTtcclxuICAgICAgICAgICAgY29uc3Qgc3BsaXR0ZXJQb3NpdGlvbkluUmFuZ2UgPSAodGhpcy5fc3BsaXR0ZXJQb3NpdGlvbiArIHNpemVCZWZvcmUpIC8gKHNpemVCZWZvcmUgKyBzaXplQWZ0ZXIpO1xyXG4gICAgICAgICAgICBjb25zdCB0b3RhbFJlbGF0aXZlU2l6ZSA9IGl0ZW1zLmJlZm9yZS5zaXplICsgaXRlbXMuYWZ0ZXIuc2l6ZTtcclxuXHJcbiAgICAgICAgICAgIGl0ZW1zLmJlZm9yZS5zaXplID0gc3BsaXR0ZXJQb3NpdGlvbkluUmFuZ2UgKiB0b3RhbFJlbGF0aXZlU2l6ZTtcclxuICAgICAgICAgICAgaXRlbXMuYWZ0ZXIuc2l6ZSA9ICgxIC0gc3BsaXR0ZXJQb3NpdGlvbkluUmFuZ2UpICogdG90YWxSZWxhdGl2ZVNpemU7XHJcblxyXG4gICAgICAgICAgICBzcGxpdHRlci5lbGVtZW50LnN0eWxlLnRvcCA9IG51bWJlclRvUGl4ZWxzKDApO1xyXG4gICAgICAgICAgICBzcGxpdHRlci5lbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscygwKTtcclxuXHJcbiAgICAgICAgICAgIGdsb2JhbFRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMudXBkYXRlU2l6ZShmYWxzZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSb3dPckNvbHVtbiB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEFic29sdXRlU2l6ZXMge1xyXG4gICAgICAgIGl0ZW1TaXplczogbnVtYmVyW10sXHJcbiAgICAgICAgYWRkaXRpb25hbFBpeGVsOiBudW1iZXIsXHJcbiAgICAgICAgdG90YWxTaXplOiBudW1iZXIsXHJcbiAgICAgICAgY3Jvc3NBeGlzU2l6ZTogbnVtYmVyXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnREaW1lbnNpb25TaXplKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBkaW1lbnNpb246IFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUpOiBudW1iZXIge1xyXG4gICAgICAgIGlmIChkaW1lbnNpb24gPT09ICd3aWR0aCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRXaWR0aChlbGVtZW50KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2V0RWxlbWVudEhlaWdodChlbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHNldEVsZW1lbnREaW1lbnNpb25TaXplKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBkaW1lbnNpb246IFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZGltZW5zaW9uID09PSAnd2lkdGgnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRFbGVtZW50V2lkdGgoZWxlbWVudCwgdmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRFbGVtZW50SGVpZ2h0KGVsZW1lbnQsIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50LCBpc0NvbHVtbjogYm9vbGVhbik6IEhUTUxEaXZFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSXRlbSk7XHJcbiAgICAgICAgaWYgKGlzQ29sdW1uKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNvbHVtbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuUm93KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50SXRlbUNvbmZpZywgSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9jb25maWcnO1xyXG5pbXBvcnQgeyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLCBSZXNvbHZlZEl0ZW1Db25maWcsIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IEhlYWRlciB9IGZyb20gJy4uL2NvbnRyb2xzL2hlYWRlcic7XHJcbmltcG9ydCB7IEFzc2VydEVycm9yLCBVbmV4cGVjdGVkTnVsbEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRHJhZ0xpc3RlbmVyIH0gZnJvbSAnLi4vdXRpbHMvZHJhZy1saXN0ZW5lcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBBcmVhTGlua2VkUmVjdCwgSXRlbVR5cGUsIEpzb25WYWx1ZSwgU2lkZSwgU2l6ZVVuaXRFbnVtLCBXaWR0aEFuZEhlaWdodCwgV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHtcclxuICAgIGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCxcclxuICAgIG51bWJlclRvUGl4ZWxzLFxyXG4gICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5XHJcbn0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBhcmVudGFibGVJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2NvbnRlbnQtaXRlbSc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgU3RhY2sgZXh0ZW5kcyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9oZWFkZXJDb25maWc6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2hlYWRlcjogSGVhZGVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hpbGRFbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21heGltaXNlZEVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9hY3RpdmVDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJvcFNlZ21lbnQ6IFN0YWNrLlNlZ21lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kcm9wSW5kZXg6IG51bWJlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbnRlbnRBcmVhRGltZW5zaW9uczogU3RhY2suQ29udGVudEFyZWFEaW1lbnNpb25zO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaGVhZGVyU2lkZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luaXRpYWxXYW50TWF4aW1pc2U6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pbml0aWFsQWN0aXZlSXRlbUluZGV4OiBudW1iZXI7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcmVzaXplTGlzdGVuZXIgPSAoKSA9PiB0aGlzLmhhbmRsZVJlc2l6ZSgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbWF4aW1pc2VkTGlzdGVuZXIgPSAoKSA9PiB0aGlzLmhhbmRsZU1heGltaXNlZCgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbWluaW1pc2VkTGlzdGVuZXIgPSAoKSA9PiB0aGlzLmhhbmRsZU1pbmltaXNlZCgpO1xyXG5cclxuICAgIGdldCBjaGlsZEVsZW1lbnRDb250YWluZXIoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyOyB9XHJcbiAgICBnZXQgaGVhZGVyKCk6IEhlYWRlciB7IHJldHVybiB0aGlzLl9oZWFkZXI7IH1cclxuICAgIGdldCBoZWFkZXJTaG93KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faGVhZGVyLnNob3c7IH1cclxuICAgIGdldCBoZWFkZXJTaWRlKCk6IFNpZGUgeyByZXR1cm4gdGhpcy5faGVhZGVyLnNpZGU7IH1cclxuICAgIGdldCBoZWFkZXJMZWZ0UmlnaHRTaWRlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2hlYWRlci5sZWZ0UmlnaHRTaWRlZDsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0IGNvbnRlbnRBcmVhRGltZW5zaW9ucygpOiBTdGFjay5Db250ZW50QXJlYURpbWVuc2lvbnMgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zOyB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXQgaW5pdGlhbFdhbnRNYXhpbWlzZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2luaXRpYWxXYW50TWF4aW1pc2U7IH1cclxuICAgIGdldCBpc01heGltaXNlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMgPT09IHRoaXMubGF5b3V0TWFuYWdlci5tYXhpbWlzZWRTdGFjazsgfVxyXG4gICAgZ2V0IHN0YWNrUGFyZW50KCk6IENvbnRlbnRJdGVtIHtcclxuICAgICAgICBpZiAoIXRoaXMucGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3RhY2sgc2hvdWxkIGFsd2F5cyBoYXZlIGEgcGFyZW50Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLCBjb25maWc6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLCBwYXJlbnQ6IENvbnRlbnRJdGVtKSB7XHJcbiAgICAgICAgc3VwZXIobGF5b3V0TWFuYWdlciwgY29uZmlnLCBwYXJlbnQsIFN0YWNrLmNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQpKTtcclxuXHJcbiAgICAgICAgdGhpcy5faGVhZGVyQ29uZmlnID0gY29uZmlnLmhlYWRlcjtcclxuICAgICAgICBjb25zdCBsYXlvdXRIZWFkZXJDb25maWcgPSBsYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5oZWFkZXI7XHJcbiAgICAgICAgY29uc3QgY29uZmlnQ29udGVudCA9IGNvbmZpZy5jb250ZW50O1xyXG4gICAgICAgIC8vIElmIHN0YWNrIGhhcyBvbmx5IG9uZSBjb21wb25lbnQsIHRoZW4gd2UgY2FuIGFsc28gY2hlY2sgdGhpcyBmb3IgaGVhZGVyIHNldHRpbmdzXHJcbiAgICAgICAgbGV0IGNvbXBvbmVudEhlYWRlckNvbmZpZzogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChjb25maWdDb250ZW50Lmxlbmd0aCAhPT0gMSkge1xyXG4gICAgICAgICAgICBjb21wb25lbnRIZWFkZXJDb25maWcgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmlyc3RDaGlsZEl0ZW1Db25maWcgPSBjb25maWdDb250ZW50WzBdO1xyXG4gICAgICAgICAgICBjb21wb25lbnRIZWFkZXJDb25maWcgPSAoZmlyc3RDaGlsZEl0ZW1Db25maWcgYXMgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcpLmhlYWRlcjsgLy8gd2lsbCBiZSB1bmRlZmluZWQgaWYgbm90IGNvbXBvbmVudCAoYW5kIHdvbnQgYmUgc3RhY2spXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pbml0aWFsV2FudE1heGltaXNlID0gY29uZmlnLm1heGltaXNlZDtcclxuICAgICAgICB0aGlzLl9pbml0aWFsQWN0aXZlSXRlbUluZGV4ID0gY29uZmlnLmFjdGl2ZUl0ZW1JbmRleCA/PyAwOyAvLyBtYWtlIHN1cmUgZGVmaW5lZFxyXG5cclxuICAgICAgICAvLyBjaGVjayBmb3IgZGVmaW5lZCB2YWx1ZSBmb3IgZWFjaCBpdGVtIGluIG9yZGVyIG9mIFN0YWNrICh0aGlzIEl0ZW0pLCBDb21wb25lbnQgKGZpcnN0IGNoaWxkKSwgTWFuYWdlci5cclxuICAgICAgICBjb25zdCBzaG93ID0gdGhpcy5faGVhZGVyQ29uZmlnPy5zaG93ID8/IGNvbXBvbmVudEhlYWRlckNvbmZpZz8uc2hvdyA/PyBsYXlvdXRIZWFkZXJDb25maWcuc2hvdztcclxuICAgICAgICBjb25zdCBwb3BvdXQgPSB0aGlzLl9oZWFkZXJDb25maWc/LnBvcG91dCA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/LnBvcG91dCA/PyBsYXlvdXRIZWFkZXJDb25maWcucG9wb3V0O1xyXG4gICAgICAgIGNvbnN0IG1heGltaXNlID0gdGhpcy5faGVhZGVyQ29uZmlnPy5tYXhpbWlzZSA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/Lm1heGltaXNlID8/IGxheW91dEhlYWRlckNvbmZpZy5tYXhpbWlzZTtcclxuICAgICAgICBjb25zdCBjbG9zZSA9IHRoaXMuX2hlYWRlckNvbmZpZz8uY2xvc2UgPz8gY29tcG9uZW50SGVhZGVyQ29uZmlnPy5jbG9zZSA/PyBsYXlvdXRIZWFkZXJDb25maWcuY2xvc2U7XHJcbiAgICAgICAgY29uc3QgbWluaW1pc2UgPSB0aGlzLl9oZWFkZXJDb25maWc/Lm1pbmltaXNlID8/IGNvbXBvbmVudEhlYWRlckNvbmZpZz8ubWluaW1pc2UgPz8gbGF5b3V0SGVhZGVyQ29uZmlnLm1pbmltaXNlO1xyXG4gICAgICAgIGNvbnN0IHRhYkRyb3Bkb3duID0gdGhpcy5faGVhZGVyQ29uZmlnPy50YWJEcm9wZG93biA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/LnRhYkRyb3Bkb3duID8/IGxheW91dEhlYWRlckNvbmZpZy50YWJEcm9wZG93bjtcclxuICAgICAgICB0aGlzLl9tYXhpbWlzZWRFbmFibGVkID0gbWF4aW1pc2UgIT09IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlclNldHRpbmdzOiBIZWFkZXIuU2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgIHNob3c6IHNob3cgIT09IGZhbHNlLFxyXG4gICAgICAgICAgICBzaWRlOiBzaG93ID09PSBmYWxzZSA/IFNpZGUudG9wIDogc2hvdyxcclxuICAgICAgICAgICAgcG9wb3V0RW5hYmxlZDogcG9wb3V0ICE9PSBmYWxzZSxcclxuICAgICAgICAgICAgcG9wb3V0TGFiZWw6IHBvcG91dCA9PT0gZmFsc2UgPyAnJyA6IHBvcG91dCxcclxuICAgICAgICAgICAgbWF4aW1pc2VFbmFibGVkOiB0aGlzLl9tYXhpbWlzZWRFbmFibGVkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZUxhYmVsOiBtYXhpbWlzZSA9PT0gZmFsc2UgPyAnJyA6IG1heGltaXNlLFxyXG4gICAgICAgICAgICBjbG9zZUVuYWJsZWQ6IGNsb3NlICE9PSBmYWxzZSxcclxuICAgICAgICAgICAgY2xvc2VMYWJlbDogY2xvc2UgPT09IGZhbHNlID8gJycgOiBjbG9zZSxcclxuICAgICAgICAgICAgbWluaW1pc2VFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICBtaW5pbWlzZUxhYmVsOiBtaW5pbWlzZSxcclxuICAgICAgICAgICAgdGFiRHJvcGRvd25FbmFibGVkOiB0YWJEcm9wZG93biAhPT0gZmFsc2UsXHJcbiAgICAgICAgICAgIHRhYkRyb3Bkb3duTGFiZWw6IHRhYkRyb3Bkb3duID09PSBmYWxzZSA/ICcnIDogdGFiRHJvcGRvd24sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5faGVhZGVyID0gbmV3IEhlYWRlcihsYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgICAgICB0aGlzLCBoZWFkZXJTZXR0aW5ncyxcclxuICAgICAgICAgICAgKCkgPT4gdGhpcy5nZXRBY3RpdmVDb21wb25lbnRJdGVtKCksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMucmVtb3ZlKCksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMuaGFuZGxlUG9wb3V0RXZlbnQoKSxcclxuICAgICAgICAgICAgKCkgPT4gdGhpcy50b2dnbGVNYXhpbWlzZSgpLFxyXG4gICAgICAgICAgICAoZXYpID0+IHRoaXMuaGFuZGxlSGVhZGVyQ2xpY2tFdmVudChldiksXHJcbiAgICAgICAgICAgIChldikgPT4gdGhpcy5oYW5kbGVIZWFkZXJUb3VjaFN0YXJ0RXZlbnQoZXYpLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVIZWFkZXJDb21wb25lbnRSZW1vdmVFdmVudChpdGVtKSxcclxuICAgICAgICAgICAgKGl0ZW0pID0+IHRoaXMuaGFuZGxlSGVhZGVyQ29tcG9uZW50Rm9jdXNFdmVudChpdGVtKSxcclxuICAgICAgICAgICAgKHgsIHksIGRyYWdMaXN0ZW5lciwgaXRlbSkgPT4gdGhpcy5oYW5kbGVIZWFkZXJDb21wb25lbnRTdGFydERyYWdFdmVudCh4LCB5LCBkcmFnTGlzdGVuZXIsIGl0ZW0pLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMuX2Ryb3Bab25lcyA9IHt9O1xyXG5cclxuICAgICAgICB0aGlzLmlzU3RhY2sgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5JdGVtcyk7XHJcblxyXG4gICAgICAgIHRoaXMub24oJ3Jlc2l6ZScsIHRoaXMuX3Jlc2l6ZUxpc3RlbmVyKTtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VkRW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm9uKCdtYXhpbWlzZWQnLCB0aGlzLl9tYXhpbWlzZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMub24oJ21pbmltaXNlZCcsIHRoaXMuX21pbmltaXNlZExpc3RlbmVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9oZWFkZXIuZWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dXBIZWFkZXJQb3NpdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIHVwZGF0ZVNpemUoZm9yY2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuYmVnaW5WaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGVudEl0ZW1zU2l6ZShmb3JjZSk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVuZFZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBpbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGlzZWQgPT09IHRydWUpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLmluaXQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1Db3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGNvbnRlbnRJdGVtQ291bnQgPiAwKSB7IC8vIGNvbnRlbnRJdGVtQ291bnQgd2lsbCBiZSAwIG9uIGRyYWcgZHJvcFxyXG4gICAgICAgICAgICBpZiAodGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleCA8IDAgfHwgdGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleCA+PSBjb250ZW50SXRlbUNvdW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFjdGl2ZUl0ZW1JbmRleCBvdXQgb2YgcmFuZ2U6ICR7dGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleH0gaWQ6ICR7dGhpcy5pZH1gKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29udGVudEl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRJdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YWNrIENvbnRlbnQgSXRlbSBpcyBub3Qgb2YgdHlwZSBDb21wb25lbnRJdGVtOiAke2l9IGlkOiAke3RoaXMuaWR9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVhZGVyLmNyZWF0ZVRhYihjb250ZW50SXRlbSwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uY29udGFpbmVyLnNldEJhc2VMb2dpY2FsWkluZGV4KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQ29tcG9uZW50SXRlbShjb250ZW50SXRlbXNbdGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleF0gYXMgQ29tcG9uZW50SXRlbSwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWRlci51cGRhdGVUYWJTaXplcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmluaXRDb250ZW50SXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoU3RhY2s6Y2xhc3MpLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW19ICovXHJcbiAgICBzZXRBY3RpdmVDb250ZW50SXRlbShpdGVtOiBDb250ZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghQ29udGVudEl0ZW0uaXNDb21wb25lbnRJdGVtKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3RhY2suc2V0QWN0aXZlQ29udGVudEl0ZW06IGl0ZW0gaXMgbm90IGEgQ29tcG9uZW50SXRlbScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQ29tcG9uZW50SXRlbShpdGVtLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSwgZm9jdXM6IGJvb2xlYW4sIHN1cHByZXNzRm9jdXNFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0gIT09IGNvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmluZGV4T2YoY29tcG9uZW50SXRlbSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudEl0ZW0gaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBzdGFjaycpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmJlZ2luU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0uaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtID0gY29tcG9uZW50SXRlbTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oZWFkZXIucHJvY2Vzc0FjdGl2ZUNvbXBvbmVudENoYW5nZWQoY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SXRlbS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbmRTaXplSW52YWxpZGF0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdhY3RpdmVDb250ZW50SXRlbUNoYW5nZWQnLCBjb21wb25lbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbWl0KCdhY3RpdmVDb250ZW50SXRlbUNoYW5nZWQnLCBjb21wb25lbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWQgfHwgZm9jdXMpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnNldEZvY3VzZWRDb21wb25lbnRJdGVtKGNvbXBvbmVudEl0ZW0sIHN1cHByZXNzRm9jdXNFdmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChTdGFjazpjbGFzcykuZ2V0QWN0aXZlQ29tcG9uZW50SXRlbX0gKi9cclxuICAgIGdldEFjdGl2ZUNvbnRlbnRJdGVtKCk6IENvbnRlbnRJdGVtIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpID8/IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmb2N1c0FjdGl2ZUNvbnRlbnRJdGVtKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0/LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgc2V0Rm9jdXNlZFZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLmFwcGx5Rm9jdXNlZFZhbHVlKHZhbHVlKTtcclxuICAgICAgICBzdXBlci5zZXRGb2N1c2VkVmFsdWUodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG5ld0NvbXBvbmVudChjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZywgaW5kZXg/OiBudW1iZXIpOiBDb21wb25lbnRJdGVtIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3SXRlbShpdGVtQ29uZmlnLCBpbmRleCkgYXMgQ29tcG9uZW50SXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRDb21wb25lbnQoY29tcG9uZW50VHlwZTogSnNvblZhbHVlLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGU/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkSXRlbShpdGVtQ29uZmlnLCBpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmV3SXRlbShpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnLCAgaW5kZXg/OiBudW1iZXIpOiBDb250ZW50SXRlbSB7XHJcbiAgICAgICAgaW5kZXggPSB0aGlzLmFkZEl0ZW0oaXRlbUNvbmZpZywgaW5kZXgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRJdGVtc1tpbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgYWRkSXRlbShpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnLCBpbmRleD86IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmNoZWNrTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpO1xyXG5cclxuICAgICAgICBjb25zdCByZXNvbHZlZEl0ZW1Db25maWcgPSBJdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZywgZmFsc2UpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShyZXNvbHZlZEl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgYWRkQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBpbmRleD86IG51bWJlciwgZm9jdXMgPSBmYWxzZSk6IG51bWJlciB7XHJcbiAgICAgICAgaWYoaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCl7XHJcbiAgICAgICAgICAgIGluZGV4IC09IDE7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignU0FDOTk3MjgnKTsgLy8gdW5kaXNwbGF5Q2hpbGQoKSByZW1vdmVkIHNvIHRoaXMgY29uZGl0aW9uIHNob3VsZCBubyBsb25nZXIgb2NjdXJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50SXRlbSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdTQUNDODg1MzInKTsgLy8gU3RhY2tzIGNhbiBvbmx5IGhhdmUgQ29tcG9uZW50IGNoaWxkcmVuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW5kZXggPSBzdXBlci5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5kZXgpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuYXBwZW5kQ2hpbGQoY29udGVudEl0ZW0uZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlci5jcmVhdGVUYWIoY29udGVudEl0ZW0sIGluZGV4KTtcclxuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVDb21wb25lbnRJdGVtKGNvbnRlbnRJdGVtLCBmb2N1cyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlci51cGRhdGVUYWJTaXplcygpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5jb250YWluZXIuc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSByZW1vdmVDaGlsZChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGtlZXBDaGlsZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEl0ZW0gPSBjb250ZW50SXRlbSBhcyBDb21wb25lbnRJdGVtO1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb250ZW50SXRlbXMuaW5kZXhPZihjb21wb25lbnRJdGVtKTtcclxuICAgICAgICBjb25zdCBzdGFja1dpbGxCZURlbGV0ZWQgPSB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPT09IDE7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtID09PSBjb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRJdGVtLmZvY3VzZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudEl0ZW0uYmx1cigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghc3RhY2tXaWxsQmVEZWxldGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlJ3JlIGFscmVhZHkgc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBjb250ZW50IGl0ZW0gbGVmdCAqYWZ0ZXIqXHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmluZyBjb250ZW50SXRlbSwgc28gd2UgY2FuIHNhZmVseSBhc3N1bWUgaW5kZXggMSBpcyBhIHZhbGlkIG9uZSBpZlxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGluZGV4IG9mIGNvbnRlbnRJdGVtIGlzIDAsIG90aGVyd2lzZSB3ZSBqdXN0IHVzZSB0aGUgcHJldmlvdXMgY29udGVudCBpdGVtLlxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3QWN0aXZlQ29tcG9uZW50SWR4ID0gaW5kZXggPT09IDAgPyAxIDogaW5kZXggLSAxO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVDb21wb25lbnRJdGVtKHRoaXMuY29udGVudEl0ZW1zW25ld0FjdGl2ZUNvbXBvbmVudElkeF0gYXMgQ29tcG9uZW50SXRlbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9oZWFkZXIucmVtb3ZlVGFiKGNvbXBvbmVudEl0ZW0pO1xyXG5cclxuICAgICAgICBzdXBlci5yZW1vdmVDaGlsZChjb21wb25lbnRJdGVtLCBrZWVwQ2hpbGQpO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWF4aW1pc2VzIHRoZSBJdGVtIG9yIG1pbmltaXNlcyBpdCBpZiBpdCBpcyBhbHJlYWR5IG1heGltaXNlZFxyXG4gICAgICovXHJcbiAgICB0b2dnbGVNYXhpbWlzZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc01heGltaXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1pbmltaXNlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXhpbWlzZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtYXhpbWlzZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNNYXhpbWlzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnNldE1heGltaXNlZFN0YWNrKHRoaXMpO1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSB0aGlzLmNvbnRlbnRJdGVtcztcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW1Db3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50SXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5lbnRlclN0YWNrTWF4aW1pc2VkKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignU01BWEk4Nzc3MycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG1pbmltaXNlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTWF4aW1pc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5zZXRNYXhpbWlzZWRTdGFjayh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSB0aGlzLmNvbnRlbnRJdGVtcztcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW1Db3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50SXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5leGl0U3RhY2tNYXhpbWlzZWQoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdTTUlOSTg3NzczJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbT8uZm9jdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtLmJsdXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMub2ZmKCdyZXNpemUnLCB0aGlzLl9yZXNpemVMaXN0ZW5lcik7XHJcbiAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZEVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vZmYoJ21heGltaXNlZCcsIHRoaXMuX21heGltaXNlZExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5vZmYoJ21pbmltaXNlZCcsIHRoaXMuX21pbmltaXNlZExpc3RlbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICB0b0NvbmZpZygpOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgbGV0IGFjdGl2ZUl0ZW1JbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgIGFjdGl2ZUl0ZW1JbmRleCA9IHRoaXMuY29udGVudEl0ZW1zLmluZGV4T2YodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVJdGVtSW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FjdGl2ZSBjb21wb25lbnQgaXRlbSBub3QgZm91bmQgaW4gc3RhY2snKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCAmJiBhY3RpdmVJdGVtSW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIG5vbi1lbXB0eSBzdGFjayB0byBoYXZlIGFuIGFjdGl2ZSBjb21wb25lbnQgaXRlbScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RhY2snLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogdGhpcy5jYWxjdWxhdGVDb25maWdDb250ZW50KCkgYXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10sXHJcbiAgICAgICAgICAgICAgICBzaXplOiB0aGlzLnNpemUsXHJcbiAgICAgICAgICAgICAgICBzaXplVW5pdDogdGhpcy5zaXplVW5pdCxcclxuICAgICAgICAgICAgICAgIG1pblNpemU6IHRoaXMubWluU2l6ZSxcclxuICAgICAgICAgICAgICAgIG1pblNpemVVbml0OiB0aGlzLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXHJcbiAgICAgICAgICAgICAgICBpc0Nsb3NhYmxlOiB0aGlzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgICAgICBtYXhpbWlzZWQ6IHRoaXMuaXNNYXhpbWlzZWQsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXI6IHRoaXMuY3JlYXRlSGVhZGVyQ29uZmlnKCksXHJcbiAgICAgICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXgsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPaywgdGhpcyBvbmUgaXMgZ29pbmcgdG8gYmUgdGhlIHRyaWNreSBvbmU6IFRoZSB1c2VyIGhhcyBkcm9wcGVkIGEge0BsaW5rIChDb250ZW50SXRlbTpjbGFzcyl9IG9udG8gdGhpcyBzdGFjay5cclxuICAgICAqXHJcbiAgICAgKiBJdCB3YXMgZHJvcHBlZCBvbiBlaXRoZXIgdGhlIHN0YWNrcyBoZWFkZXIgb3IgdGhlIHRvcCwgcmlnaHQsIGJvdHRvbSBvciBsZWZ0IGJpdCBvZiB0aGUgY29udGVudCBhcmVhXHJcbiAgICAgKiAod2hpY2ggb25lIG9mIHRob3NlIGlzIHN0b3JlZCBpbiB0aGlzLl9kcm9wU2VnbWVudCkuIE5vdywgaWYgdGhlIHVzZXIgaGFzIGRyb3BwZWQgb24gdGhlIGhlYWRlciB0aGUgY2FzZVxyXG4gICAgICogaXMgcmVsYXRpdmVseSBjbGVhcjogV2UgYWRkIHRoZSBpdGVtIHRvIHRoZSBleGlzdGluZyBzdGFjay4uLiBqb2IgZG9uZSAobWlnaHQgYmUgZ29vZCB0byBoYXZlXHJcbiAgICAgKiB0YWIgcmVvcmRlcmluZyBhdCBzb21lIHBvaW50LCBidXQgbGV0cyBub3Qgc3dlYXQgaXQgcmlnaHQgbm93KVxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBpdGVtIHdhcyBkcm9wcGVkIG9uIHRoZSBjb250ZW50IHBhcnQgdGhpbmdzIGFyZSBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkLiBJZiBpdCB3YXMgZHJvcHBlZCBvbiBlaXRoZXIgdGhlXHJcbiAgICAgKiB0b3Agb3IgYm90dG9tIHJlZ2lvbiB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBjb2x1bW4gYW5kIHBsYWNlIHRoZSBpdGVtcyBhY2NvcmRpbmdseS5cclxuICAgICAqIFVubGVzcywgb2YgY291cnNlIGlmIHRoZSBzdGFjayBpcyBhbHJlYWR5IHdpdGhpbiBhIGNvbHVtbi4uLiBpbiB3aGljaCBjYXNlIHdlIHdhbnRcclxuICAgICAqIHRvIGFkZCB0aGUgbmV3bHkgY3JlYXRlZCBpdGVtIHRvIHRoZSBleGlzdGluZyBjb2x1bW4uLi5cclxuICAgICAqIGVpdGhlciBwcmVwZW5kIG9yIGFwcGVuZCBpdCwgZGVwZW5kaW5nIG9uIHdldGhlciBpdHMgdG9wIG9yIGJvdHRvbS5cclxuICAgICAqXHJcbiAgICAgKiBTYW1lIHRoaW5nIGZvciByb3dzIGFuZCBsZWZ0IC8gcmlnaHQgZHJvcCBzZWdtZW50cy4uLiBzbyBpbiB0b3RhbCB0aGVyZSBhcmUgOSB0aGluZ3MgdGhhdCBjYW4gcG90ZW50aWFsbHkgaGFwcGVuXHJcbiAgICAgKiAobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSAqIGlzIGNoaWxkIG9mIHRoZSByaWdodCBwYXJlbnQgKHJvdywgY29sdW1uKSArIGhlYWRlciBkcm9wXHJcbiAgICAgKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG92ZXJyaWRlIG9uRHJvcChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGFyZWE6IENvbnRlbnRJdGVtLkFyZWEpOiB2b2lkIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIFRoZSBpdGVtIHdhcyBkcm9wcGVkIG9uIHRoZSBoZWFkZXIgYXJlYS4gSnVzdCBhZGQgaXQgYXMgYSBjaGlsZCBvZiB0aGlzIHN0YWNrIGFuZFxyXG4gICAgICAgICAqIGdldCB0aGUgaGVsbCBvdXQgb2YgdGhpcyBsb2dpY1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5IZWFkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNldEhlYWRlckRyb3Bab25lKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcm9wSW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignU09EREk2ODk5MCcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZChjb250ZW50SXRlbSwgdGhpcy5fZHJvcEluZGV4KTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBUaGUgc3RhY2sgaXMgZW1wdHkuIExldCdzIGp1c3QgYWRkIHRoZSBlbGVtZW50LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5Cb2R5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGQoY29udGVudEl0ZW0sIDAsIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIFRoZSBpdGVtIHdhcyBkcm9wcGVkIG9uIHRoZSB0b3AtLCBsZWZ0LSwgYm90dG9tLSBvciByaWdodC0gcGFydCBvZiB0aGUgY29udGVudC4gTGV0J3NcclxuICAgICAgICAgKiBhZ2dyZWdhdGUgc29tZSBjb25kaXRpb25zIHRvIG1ha2UgdGhlIGlmIHN0YXRlbWVudHMgbGF0ZXIgb24gbW9yZSByZWFkYWJsZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5Ub3AgfHwgdGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuQm90dG9tO1xyXG4gICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LkxlZnQgfHwgdGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuUmlnaHQ7XHJcbiAgICAgICAgY29uc3QgaW5zZXJ0QmVmb3JlID0gdGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuVG9wIHx8IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LkxlZnQ7XHJcbiAgICAgICAgY29uc3QgaGFzQ29ycmVjdFBhcmVudCA9IChpc1ZlcnRpY2FsICYmIHRoaXMuc3RhY2tQYXJlbnQuaXNDb2x1bW4pIHx8IChpc0hvcml6b250YWwgJiYgdGhpcy5zdGFja1BhcmVudC5pc1Jvdyk7XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogVGhlIGNvbnRlbnQgaXRlbSBjYW4gYmUgZWl0aGVyIGEgY29tcG9uZW50IG9yIGEgc3RhY2suIElmIGl0IGlzIGEgY29tcG9uZW50LCB3cmFwIGl0IGludG8gYSBzdGFja1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChjb250ZW50SXRlbS5pc0NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBpdGVtQ29uZmlnLmhlYWRlciA9IChjb250ZW50SXRlbSBhcyBDb21wb25lbnRJdGVtKS5oZWFkZXJDb25maWc7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShpdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgc3RhY2suYWRkQ2hpbGQoY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbSA9IHN0YWNrO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogSWYgdGhlIGNvbnRlbnRJdGVtIHRoYXQncyBiZWluZyBkcm9wcGVkIGlzIG5vdCBkcm9wcGVkIG9uIGEgU3RhY2sgKGNhc2VzIHdoaWNoIGp1c3QgcGFzc2VkIGFib3ZlIGFuZFxyXG4gICAgICAgICAqIHdoaWNoIHdvdWxkIHdyYXAgdGhlIGNvbnRlbnRJdGVtIGluIGEgU3RhY2spIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBjb250ZW50SXRlbSBpcyBhIFJvd09yQ29sdW1uLlxyXG4gICAgICAgICAqIElmIGl0IGlzLCB3ZSBuZWVkIHRvIHJlLXdyYXAgaXQgaW4gYSBTdGFjayBsaWtlIGl0IHdhcyB3aGVuIGl0IHdhcyBkcmFnZ2VkIGJ5IGl0cyBUYWIgKGl0IHdhcyBkcmFnZ2VkISkuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYoY29udGVudEl0ZW0udHlwZSA9PT0gSXRlbVR5cGUucm93IHx8IGNvbnRlbnRJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLmNvbHVtbil7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGl0ZW1Db25maWcuaGVhZGVyID0gdGhpcy5jcmVhdGVIZWFkZXJDb25maWcoKTtcclxuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQ29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgIHN0YWNrLmFkZENoaWxkKGNvbnRlbnRJdGVtKVxyXG4gICAgICAgICAgICBjb250ZW50SXRlbSA9IHN0YWNrXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIElmIHRoZSBpdGVtIGlzIGRyb3BwZWQgb24gdG9wIG9yIGJvdHRvbSBvZiBhIGNvbHVtbiBvciBsZWZ0IGFuZCByaWdodCBvZiBhIHJvdywgaXQncyBhbHJlYWR5XHJcbiAgICAgICAgICogbGF5ZCBvdXQgaW4gdGhlIGNvcnJlY3Qgd2F5LiBKdXN0IGFkZCBpdCBhcyBhIGNoaWxkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGhhc0NvcnJlY3RQYXJlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnN0YWNrUGFyZW50LmNvbnRlbnRJdGVtcy5pbmRleE9mKHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLnN0YWNrUGFyZW50LmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbnNlcnRCZWZvcmUgPyBpbmRleCA6IGluZGV4ICsgMSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2l6ZSAqPSAwLjU7XHJcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSB0aGlzLnNpemU7XHJcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gdGhpcy5zaXplVW5pdDtcclxuICAgICAgICAgICAgdGhpcy5zdGFja1BhcmVudC51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICogVGhpcyBoYW5kbGVzIGl0ZW1zIHRoYXQgYXJlIGRyb3BwZWQgb24gdG9wIG9yIGJvdHRvbSBvZiBhIHJvdyBvciBsZWZ0IC8gcmlnaHQgb2YgYSBjb2x1bW4uIFdlIG5lZWRcclxuICAgICAgICAgICAgICogdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50SXRlbSBmb3IgdGhlbSB0byBsaXZlIGluXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBpc1ZlcnRpY2FsID8gSXRlbVR5cGUuY29sdW1uIDogSXRlbVR5cGUucm93O1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gUmVzb2x2ZWRJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQodHlwZSkgYXMgUmVzb2x2ZWRJdGVtQ29uZmlnO1xyXG4gICAgICAgICAgICBjb25zdCByb3dPckNvbHVtbiA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVDb250ZW50SXRlbShpdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5zdGFja1BhcmVudC5yZXBsYWNlQ2hpbGQodGhpcywgcm93T3JDb2x1bW4pO1xyXG5cclxuICAgICAgICAgICAgcm93T3JDb2x1bW4uYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluc2VydEJlZm9yZSA/IDAgOiB1bmRlZmluZWQsIHRydWUpO1xyXG4gICAgICAgICAgICByb3dPckNvbHVtbi5hZGRDaGlsZCh0aGlzLCBpbnNlcnRCZWZvcmUgPyB1bmRlZmluZWQgOiAwLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IDUwO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gNTA7XHJcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgIHJvd09yQ29sdW1uLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHRoZSB1c2VyIGhvdmVycyBhYm92ZSB0aGUgaGVhZGVyIHBhcnQgb2YgdGhlIHN0YWNrLCBpbmRpY2F0ZSBkcm9wIHBvc2l0aW9ucyBmb3IgdGFicy5cclxuICAgICAqIG90aGVyd2lzZSBpbmRpY2F0ZSB3aGljaCBzZWdtZW50IG9mIHRoZSBib2R5IHRoZSBkcmFnZ2VkIGl0ZW0gd291bGQgYmUgZHJvcHBlZCBvblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB4IC0gQWJzb2x1dGUgU2NyZWVuIFhcclxuICAgICAqIEBwYXJhbSB5IC0gQWJzb2x1dGUgU2NyZWVuIFlcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSBoaWdobGlnaHREcm9wWm9uZSh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWdtZW50ID0ga2V5IGFzIFN0YWNrLlNlZ21lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnNbc2VnbWVudF0uaG92ZXJBcmVhO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZWEueDEgPCB4ICYmIGFyZWEueDIgPiB4ICYmIGFyZWEueTEgPCB5ICYmIGFyZWEueTIgPiB5KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJvcFNlZ21lbnQgPSBTdGFjay5TZWdtZW50LkhlYWRlcjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodEhlYWRlckRyb3Bab25lKHRoaXMuX2hlYWRlci5sZWZ0UmlnaHRTaWRlZCA/IHkgOiB4KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEhlYWRlckRyb3Bab25lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRCb2R5RHJvcFpvbmUoc2VnbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldEFyZWEoKTogQ29udGVudEl0ZW0uQXJlYSB8IG51bGwge1xyXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaGVhZGVyQXJlYSA9IHN1cGVyLmdldEVsZW1lbnRBcmVhKHRoaXMuX2hlYWRlci5lbGVtZW50KTtcclxuICAgICAgICBjb25zdCBjb250ZW50QXJlYSA9IHN1cGVyLmdldEVsZW1lbnRBcmVhKHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lcik7XHJcbiAgICAgICAgaWYgKGhlYWRlckFyZWEgPT09IG51bGwgfHwgY29udGVudEFyZWEgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1NHQUhDMTMwODYnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29udGVudFdpZHRoID0gY29udGVudEFyZWEueDIgLSBjb250ZW50QXJlYS54MTtcclxuICAgICAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gY29udGVudEFyZWEueTIgLSBjb250ZW50QXJlYS55MTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zID0ge1xyXG4gICAgICAgICAgICBoZWFkZXI6IHtcclxuICAgICAgICAgICAgICAgIGhvdmVyQXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBoZWFkZXJBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBoZWFkZXJBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBoZWFkZXJBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBoZWFkZXJBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0QXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBoZWFkZXJBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBoZWFkZXJBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBoZWFkZXJBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBoZWFkZXJBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIaWdobGlnaHQgdGhlIGVudGlyZSBib2R5IGlmIHRoZSBzdGFjayBpcyBlbXB0eVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPT09IDApIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucy5ib2R5ID0ge1xyXG4gICAgICAgICAgICAgICAgaG92ZXJBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDIsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0QXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRBcmVhKHRoaXMuZWxlbWVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zLmxlZnQgPSB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuMjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0QXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngxICsgY29udGVudFdpZHRoICogMC41LFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zLnRvcCA9IHtcclxuICAgICAgICAgICAgICAgIGhvdmVyQXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuMjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuNzUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkxICsgY29udGVudEhlaWdodCAqIDAuNVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTEgKyBjb250ZW50SGVpZ2h0ICogMC41XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnMucmlnaHQgPSB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjc1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDIsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0QXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuNSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zLmJvdHRvbSA9IHtcclxuICAgICAgICAgICAgICAgIGhvdmVyQXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuMjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxICsgY29udGVudEhlaWdodCAqIDAuNSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjc1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxICsgY29udGVudEhlaWdodCAqIDAuNSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDIsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RWxlbWVudEFyZWEodGhpcy5lbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9ncmFtbWF0aWNhbGx5IG9wZXJhdGUgd2l0aCBoZWFkZXIgcG9zaXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIC1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBwcmV2aW91cyBoZWFkZXIgcG9zaXRpb25cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwb3NpdGlvbkhlYWRlcihwb3NpdGlvbjogU2lkZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9oZWFkZXIuc2lkZSAhPT0gcG9zaXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5faGVhZGVyLnNldFNpZGUocG9zaXRpb24pO1xyXG4gICAgICAgICAgICB0aGlzLl9oZWFkZXJTaWRlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dXBIZWFkZXJQb3NpdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZU5vZGVTaXplKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQ6IFdpZHRoQW5kSGVpZ2h0ID0gZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0KHRoaXMuZWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5faGVhZGVyLnNob3cpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuX2hlYWRlci5sZWZ0UmlnaHRTaWRlZCA/IFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUud2lkdGggOiBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lLmhlaWdodDtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRbZGltZW5zaW9uXSAtPSB0aGlzLmxheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnMuaGVhZGVySGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5zdHlsZS53aWR0aCA9IG51bWJlclRvUGl4ZWxzKGNvbnRlbnQud2lkdGgpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gbnVtYmVyVG9QaXhlbHMoY29udGVudC5oZWlnaHQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50LnN0eWxlLndpZHRoID0gbnVtYmVyVG9QaXhlbHMoY29udGVudC53aWR0aCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKGNvbnRlbnQuaGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3Jlc2l6ZScpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhpZ2hsaWdodEhlYWRlckRyb3Bab25lKHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZpc2libGVUYWJzTGVuZ3RoID0gdGhpcy5faGVhZGVyLmxhc3RWaXNpYmxlVGFiSW5kZXggKyAxO1xyXG4gICAgICAgIGNvbnN0IHRhYnNDb250YWluZXJFbGVtZW50ID0gdGhpcy5faGVhZGVyLnRhYnNDb250YWluZXJFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHRhYnNDb250YWluZXJFbGVtZW50Q2hpbGROb2RlcyA9IHRhYnNDb250YWluZXJFbGVtZW50LmNoaWxkTm9kZXM7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBzaGFsbG93IGNvcHkgb2YgY2hpbGROb2RlcyBsaXN0LCBleGNsdWRpbmcgRHJvcFBsYWNlSG9sZGVyLCBhcyB3ZSB3aWxsIGJlIG1vZGlmeWluZyB0aGUgY2hpbGROb2RlcyBsaXN0XHJcbiAgICAgICAgY29uc3QgdmlzaWJsZVRhYkVsZW1lbnRzID0gbmV3IEFycmF5PEhUTUxFbGVtZW50Pih2aXNpYmxlVGFic0xlbmd0aCk7XHJcbiAgICAgICAgbGV0IHRhYkluZGV4ID0gMDtcclxuICAgICAgICBsZXQgdGFiQ291bnQgPSAwO1xyXG4gICAgICAgIHdoaWxlICh0YWJDb3VudCA8IHZpc2libGVUYWJzTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVUYWJFbGVtZW50ID0gdGFic0NvbnRhaW5lckVsZW1lbnRDaGlsZE5vZGVzW3RhYkluZGV4KytdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAodmlzaWJsZVRhYkVsZW1lbnQgIT09IHRoaXMubGF5b3V0TWFuYWdlci50YWJEcm9wUGxhY2Vob2xkZXIpIHtcclxuICAgICAgICAgICAgICAgIHZpc2libGVUYWJFbGVtZW50c1t0YWJDb3VudCsrXSA9IHZpc2libGVUYWJFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkcm9wVGFyZ2V0SW5kaWNhdG9yID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmRyb3BUYXJnZXRJbmRpY2F0b3I7XHJcbiAgICAgICAgaWYgKGRyb3BUYXJnZXRJbmRpY2F0b3IgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1NISERaRFRJOTcxMTAnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBhcmVhOiBBcmVhTGlua2VkUmVjdDtcclxuXHJcbiAgICAgICAgLy8gRW1wdHkgc3RhY2tcclxuICAgICAgICBpZiAodmlzaWJsZVRhYnNMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY29uc3QgaGVhZGVyUmVjdCA9IHRoaXMuX2hlYWRlci5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJUb3AgPSBoZWFkZXJSZWN0LnRvcCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJMZWZ0ID0gaGVhZGVyUmVjdC5sZWZ0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0O1xyXG5cclxuICAgICAgICAgICAgYXJlYSA9IHtcclxuICAgICAgICAgICAgICAgIHgxOiBoZWFkZXJMZWZ0LFxyXG4gICAgICAgICAgICAgICAgeDI6IGhlYWRlckxlZnQgKyAxMDAsXHJcbiAgICAgICAgICAgICAgICB5MTogaGVhZGVyVG9wICsgaGVhZGVyUmVjdC5oZWlnaHQgLSAyMCxcclxuICAgICAgICAgICAgICAgIHkyOiBoZWFkZXJUb3AgKyBoZWFkZXJSZWN0LmhlaWdodCxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2Ryb3BJbmRleCA9IDA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRhYkluZGV4ID0gMDtcclxuICAgICAgICAgICAgLy8gVGhpcyBpbmRpY2F0ZXMgd2hldGhlciBvdXIgY3Vyc29yIGlzIGV4YWN0bHkgb3ZlciBhIHRhYlxyXG4gICAgICAgICAgICBsZXQgaXNBYm92ZVRhYiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgdGFiVG9wOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCB0YWJMZWZ0OiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCB0YWJXaWR0aDogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgdGFiRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQgPSB2aXNpYmxlVGFiRWxlbWVudHNbdGFiSW5kZXhdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiUmVjdCA9IHRhYkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJSZWN0VG9wID0gdGFiUmVjdC50b3AgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYlJlY3RMZWZ0ID0gdGFiUmVjdC5sZWZ0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9oZWFkZXIubGVmdFJpZ2h0U2lkZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0YWJMZWZ0ID0gdGFiUmVjdFRvcDtcclxuICAgICAgICAgICAgICAgICAgICB0YWJUb3AgPSB0YWJSZWN0TGVmdDtcclxuICAgICAgICAgICAgICAgICAgICB0YWJXaWR0aCA9IHRhYlJlY3QuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0YWJMZWZ0ID0gdGFiUmVjdExlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiVG9wID0gdGFiUmVjdFRvcDtcclxuICAgICAgICAgICAgICAgICAgICB0YWJXaWR0aCA9IHRhYlJlY3Qud2lkdGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHggPj0gdGFiTGVmdCAmJiB4IDwgdGFiTGVmdCArIHRhYldpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNBYm92ZVRhYiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gd2hpbGUgKHRhYkluZGV4IDwgdmlzaWJsZVRhYnNMZW5ndGggJiYgIWlzQWJvdmVUYWIpO1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgd2UncmUgbm90IGFib3ZlIGFueSB0YWJzLCBvciB0byB0aGUgcmlnaHQgb2YgYW55IHRhYiwgd2UgYXJlIG91dCBvZiB0aGUgYXJlYSwgc28gZ2l2ZSB1cFxyXG4gICAgICAgICAgICBpZiAoaXNBYm92ZVRhYiA9PT0gZmFsc2UgJiYgeCA8IHRhYkxlZnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgaGFsZlggPSB0YWJMZWZ0ICsgdGFiV2lkdGggLyAyO1xyXG5cclxuICAgICAgICAgICAgaWYgKHggPCBoYWxmWCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJvcEluZGV4ID0gdGFiSW5kZXg7XHJcbiAgICAgICAgICAgICAgICB0YWJFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCB0aGlzLmxheW91dE1hbmFnZXIudGFiRHJvcFBsYWNlaG9sZGVyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BJbmRleCA9IE1hdGgubWluKHRhYkluZGV4ICsgMSwgdmlzaWJsZVRhYnNMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgdGFiRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGhpcy5sYXlvdXRNYW5hZ2VyLnRhYkRyb3BQbGFjZWhvbGRlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRhYkRyb3BQbGFjZWhvbGRlclJlY3QgPSB0aGlzLmxheW91dE1hbmFnZXIudGFiRHJvcFBsYWNlaG9sZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb25zdCB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0VG9wID0gdGFiRHJvcFBsYWNlaG9sZGVyUmVjdC50b3AgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgY29uc3QgdGFiRHJvcFBsYWNlaG9sZGVyUmVjdExlZnQgPSB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0LmxlZnQgKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5faGVhZGVyLmxlZnRSaWdodFNpZGVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZUhvbGRlclRvcCA9IHRhYkRyb3BQbGFjZWhvbGRlclJlY3RUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0V2lkdGggPSB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0LmhlaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICBhcmVhID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiB0YWJUb3AsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IHRhYlRvcCArIHRhYkVsZW1lbnQuY2xpZW50SGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBwbGFjZUhvbGRlclRvcCxcclxuICAgICAgICAgICAgICAgICAgICB5MjogcGxhY2VIb2xkZXJUb3AgKyB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0V2lkdGgsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VIb2xkZXJMZWZ0ID0gdGFiRHJvcFBsYWNlaG9sZGVyUmVjdExlZnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0V2lkdGggPSB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0LndpZHRoO1xyXG5cclxuICAgICAgICAgICAgICAgIGFyZWEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IHBsYWNlSG9sZGVyTGVmdCxcclxuICAgICAgICAgICAgICAgICAgICB4MjogcGxhY2VIb2xkZXJMZWZ0ICsgdGFiRHJvcFBsYWNlaG9sZGVyUmVjdFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiB0YWJUb3AsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IHRhYlRvcCArIHRhYkVsZW1lbnQuY2xpZW50SGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZHJvcFRhcmdldEluZGljYXRvci5oaWdobGlnaHRBcmVhKGFyZWEsIDApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlc2V0SGVhZGVyRHJvcFpvbmUoKSB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnRhYkRyb3BQbGFjZWhvbGRlci5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHNldHVwSGVhZGVyUG9zaXRpb24oKSB7XHJcbiAgICAgICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KHRoaXMuX2hlYWRlci5lbGVtZW50LCB0aGlzLl9oZWFkZXIuc2hvdyk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5MZWZ0LCBEb21Db25zdGFudHMuQ2xhc3NOYW1lLlJpZ2h0LCBEb21Db25zdGFudHMuQ2xhc3NOYW1lLkJvdHRvbSk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2hlYWRlci5zaWRlICE9PSBTaWRlLnRvcCkge1xyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbG1fJyArIHRoaXMuX2hlYWRlci5zaWRlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vaWYgKFtTaWRlLnJpZ2h0LCBTaWRlLmJvdHRvbV0uaW5jbHVkZXModGhpcy5faGVhZGVyLnNpZGUpKSB7XHJcbiAgICAgICAgLy8gICAgLy8gbW92ZSB0aGUgaGVhZGVyIGJlaGluZCB0aGUgY29udGVudC5cclxuICAgICAgICAvLyAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5faGVhZGVyLmVsZW1lbnQpO1xyXG4gICAgICAgIC8vfVxyXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoaWdobGlnaHRCb2R5RHJvcFpvbmUoc2VnbWVudDogU3RhY2suU2VnbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdTSEJEWkM4MjI2NScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hsaWdodEFyZWEgPSB0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnNbc2VnbWVudF0uaGlnaGxpZ2h0QXJlYTtcclxuICAgICAgICAgICAgY29uc3QgZHJvcFRhcmdldEluZGljYXRvciA9IHRoaXMubGF5b3V0TWFuYWdlci5kcm9wVGFyZ2V0SW5kaWNhdG9yO1xyXG4gICAgICAgICAgICBpZiAoZHJvcFRhcmdldEluZGljYXRvciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1NIQkRaRDk2MTEwJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkcm9wVGFyZ2V0SW5kaWNhdG9yLmhpZ2hsaWdodEFyZWEoaGlnaGxpZ2h0QXJlYSwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kcm9wU2VnbWVudCA9IHNlZ21lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVSZXNpemUoKSB7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLnVwZGF0ZVRhYlNpemVzKClcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZU1heGltaXNlZCgpIHtcclxuICAgICAgICB0aGlzLl9oZWFkZXIucHJvY2Vzc01heGltaXNlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlTWluaW1pc2VkKCkge1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci5wcm9jZXNzTWluaW1pc2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVQb3BvdXRFdmVudCgpIHtcclxuICAgICAgICB0aGlzLnBvcG91dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlSGVhZGVyQ2xpY2tFdmVudChldjogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IEV2ZW50RW1pdHRlci5oZWFkZXJDbGlja0V2ZW50TmFtZTtcclxuICAgICAgICBjb25zdCBidWJibGluZ0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlci5DbGlja0J1YmJsaW5nRXZlbnQoZXZlbnROYW1lLCB0aGlzLCBldik7XHJcbiAgICAgICAgdGhpcy5lbWl0KGV2ZW50TmFtZSwgYnViYmxpbmdFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVIZWFkZXJUb3VjaFN0YXJ0RXZlbnQoZXY6IFRvdWNoRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBldmVudE5hbWUgPSBFdmVudEVtaXR0ZXIuaGVhZGVyVG91Y2hTdGFydEV2ZW50TmFtZTtcclxuICAgICAgICBjb25zdCBidWJibGluZ0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlci5Ub3VjaFN0YXJ0QnViYmxpbmdFdmVudChldmVudE5hbWUsIHRoaXMsIGV2KTtcclxuICAgICAgICB0aGlzLmVtaXQoZXZlbnROYW1lLCBidWJibGluZ0V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUhlYWRlckNvbXBvbmVudFJlbW92ZUV2ZW50KGl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUNoaWxkKGl0ZW0sIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUhlYWRlckNvbXBvbmVudEZvY3VzRXZlbnQoaXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIHRoaXMuc2V0QWN0aXZlQ29tcG9uZW50SXRlbShpdGVtLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUhlYWRlckNvbXBvbmVudFN0YXJ0RHJhZ0V2ZW50KHg6IG51bWJlciwgeTogbnVtYmVyLCBkcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTWF4aW1pc2VkID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTWF4aW1pc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnN0YXJ0Q29tcG9uZW50RHJhZyh4LCB5LCBkcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlSGVhZGVyQ29uZmlnKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5faGVhZGVyU2lkZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KHRoaXMuX2hlYWRlckNvbmZpZyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hvdyA9IHRoaXMuX2hlYWRlci5zaG93ID8gdGhpcy5faGVhZGVyLnNpZGUgOiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weSh0aGlzLl9oZWFkZXJDb25maWcsIHNob3cpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93LFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcG91dDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heGltaXNlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2U6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbWlzZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRhYkRyb3Bkb3duOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCkge1xyXG4gICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBTdGFjayB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgY29uc3QgZW51bSBTZWdtZW50IHtcclxuICAgICAgICBIZWFkZXIgPSAnaGVhZGVyJyxcclxuICAgICAgICBCb2R5ID0gJ2JvZHknLFxyXG4gICAgICAgIExlZnQgPSAnbGVmdCcsXHJcbiAgICAgICAgUmlnaHQgPSAncmlnaHQnLFxyXG4gICAgICAgIFRvcCA9ICd0b3AnLFxyXG4gICAgICAgIEJvdHRvbSA9ICdib3R0b20nLFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEFyZWFEaW1lbnNpb24ge1xyXG4gICAgICAgIGhvdmVyQXJlYTogQXJlYUxpbmtlZFJlY3Q7XHJcbiAgICAgICAgaGlnaGxpZ2h0QXJlYTogQXJlYUxpbmtlZFJlY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ29udGVudEFyZWFEaW1lbnNpb25zID0ge1xyXG4gICAgICAgIFtzZWdtZW50OiBzdHJpbmddOiBDb250ZW50QXJlYURpbWVuc2lvbjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50KTogSFRNTERpdkVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5JdGVtKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5TdGFjayk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50SXRlbUNvbmZpZywgSXRlbUNvbmZpZywgTGF5b3V0Q29uZmlnLCBSb3dPckNvbHVtbkl0ZW1Db25maWcsIFN0YWNrSXRlbUNvbmZpZyB9IGZyb20gJy4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7XHJcbiAgICBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZEl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZExheW91dENvbmZpZyxcclxuICAgIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLFxyXG4gICAgUmVzb2x2ZWRSb290SXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWdcclxufSBmcm9tIFwiLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnXCI7XHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gJy4vY29udGFpbmVyL2NvbXBvbmVudC1jb250YWluZXInO1xyXG5pbXBvcnQgeyBCcm93c2VyUG9wb3V0IH0gZnJvbSAnLi9jb250cm9scy9icm93c2VyLXBvcG91dCc7XHJcbmltcG9ydCB7IERyYWdBY3Rpb24gfSBmcm9tICcuL2NvbnRyb2xzL2RyYWctYWN0aW9uJztcclxuaW1wb3J0IHsgRHJhZ1NvdXJjZSB9IGZyb20gJy4vY29udHJvbHMvZHJhZy1zb3VyY2UnO1xyXG5pbXBvcnQgeyBEcm9wVGFyZ2V0SW5kaWNhdG9yIH0gZnJvbSAnLi9jb250cm9scy9kcm9wLXRhcmdldC1pbmRpY2F0b3InO1xyXG5pbXBvcnQgeyBUcmFuc2l0aW9uSW5kaWNhdG9yIH0gZnJvbSAnLi9jb250cm9scy90cmFuc2l0aW9uLWluZGljYXRvcic7XHJcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gJy4vZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWROdWxsRXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciwgVW5yZWFjaGFibGVDYXNlRXJyb3IgfSBmcm9tICcuL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0gfSBmcm9tICcuL2l0ZW1zL2NvbXBvbmVudC1wYXJlbnRhYmxlLWl0ZW0nO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vaXRlbXMvY29udGVudC1pdGVtJztcclxuaW1wb3J0IHsgR3JvdW5kSXRlbSB9IGZyb20gJy4vaXRlbXMvZ3JvdW5kLWl0ZW0nO1xyXG5pbXBvcnQgeyBSb3dPckNvbHVtbiB9IGZyb20gJy4vaXRlbXMvcm93LW9yLWNvbHVtbic7XHJcbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi9pdGVtcy9zdGFjayc7XHJcbmltcG9ydCB7IENvbmZpZ01pbmlmaWVyIH0gZnJvbSAnLi91dGlscy9jb25maWctbWluaWZpZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBEcmFnTGlzdGVuZXIgfSBmcm9tICcuL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBFdmVudEh1YiB9IGZyb20gJy4vdXRpbHMvZXZlbnQtaHViJztcclxuaW1wb3J0IHsgSTE4blN0cmluZ0lkLCBJMThuU3RyaW5ncywgaTE4blN0cmluZ3MgfSBmcm9tICcuL3V0aWxzL2kxOG4tc3RyaW5ncyc7XHJcbmltcG9ydCB7IEl0ZW1UeXBlLCBKc29uVmFsdWUsIFJlY3QsIFJlc3BvbnNpdmVNb2RlLCBXaWR0aEFuZEhlaWdodCB9IGZyb20gJy4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gICAgZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0LFxyXG4gICAgZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbixcclxuICAgIHJlbW92ZUZyb21BcnJheSxcclxuICAgIHNldEVsZW1lbnRIZWlnaHQsXHJcbiAgICBzZXRFbGVtZW50V2lkdGhcclxufSBmcm9tICcuL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZGVjbGFyZSBnbG9iYWwge1xyXG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICAgICAgX19nbEluc3RhbmNlOiBMYXlvdXRNYW5hZ2VyO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogVGhlIG1haW4gY2xhc3MgdGhhdCB3aWxsIGJlIGV4cG9zZWQgYXMgR29sZGVuTGF5b3V0LlxyXG4gKi9cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMYXlvdXRNYW5hZ2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKiBXaGV0aGVyIHRoZSBsYXlvdXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGJlIHJlc2l6ZWQgdG8gY29udGFpbmVyIHdoZW5ldmVyIHRoZSBjb250YWluZXIncyBzaXplIGlzIGNoYW5nZWRcclxuICAgICAqIERlZmF1bHQgaXMgdHJ1ZSBpZiA8Ym9keT4gaXMgdGhlIGNvbnRhaW5lciBvdGhlcndpc2UgZmFsc2VcclxuICAgICAqIERlZmF1bHQgd2lsbCBiZSBjaGFuZ2VkIHRvIHRydWUgZm9yIGFueSBjb250YWluZXIgaW4gdGhlIGZ1dHVyZVxyXG4gICAgICovXHJcbiAgICByZXNpemVXaXRoQ29udGFpbmVyQXV0b21hdGljYWxseSA9IGZhbHNlO1xyXG4gICAgLyoqIFRoZSBkZWJvdW5jZSBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKSB1c2VkIHdoZW5ldmVyIGEgbGF5b3V0IGlzIGF1dG9tYXRpY2FsbHkgcmVzaXplZC4gIDAgbWVhbnMgbmV4dCB0aWNrICovXHJcbiAgICByZXNpemVEZWJvdW5jZUludGVydmFsID0gMTAwO1xyXG4gICAgLyoqIEV4dGVuZCB0aGUgY3VycmVudCBkZWJvdW5jZSBkZWxheSB0aW1lIHBlcmlvZCBpZiBpdCBpcyB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBkZWxheS5cclxuICAgICAqIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGxheW91dCB3aWxsIG9ubHkgcmVzaXplIHdoZW4gaXRzIGNvbnRhaW5lciBoYXMgc3RvcHBlZCBiZWluZyByZXNpemVkLlxyXG4gICAgICogSWYgaXQgaXMgZmFsc2UsIHRoZSBsYXlvdXQgd2lsbCByZXNpemUgYXQgaW50ZXJ2YWxzIHdoaWxlIGl0cyBjb250YWluZXIgaXMgYmVpbmcgcmVzaXplZC5cclxuICAgICAqL1xyXG4gICAgcmVzaXplRGVib3VuY2VFeHRlbmRlZFdoZW5Qb3NzaWJsZSA9IHRydWU7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0luaXRpYWxpc2VkID0gZmFsc2U7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9ncm91bmRJdGVtOiBHcm91bmRJdGVtIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfb3BlblBvcG91dHM6IEJyb3dzZXJQb3BvdXRbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJvcFRhcmdldEluZGljYXRvcjogRHJvcFRhcmdldEluZGljYXRvciB8IG51bGwgPSBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdHJhbnNpdGlvbkluZGljYXRvcjogVHJhbnNpdGlvbkluZGljYXRvciB8IG51bGwgPSBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcmVzaXplVGltZW91dElkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2l0ZW1BcmVhczogQ29udGVudEl0ZW0uQXJlYVtdID0gW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9tYXhpbWlzZWRTdGFjazogU3RhY2sgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9tYXhpbWlzZVBsYWNlaG9sZGVyID0gTGF5b3V0TWFuYWdlci5jcmVhdGVNYXhpbWlzZVBsYWNlRWxlbWVudChkb2N1bWVudCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90YWJEcm9wUGxhY2Vob2xkZXIgPSBMYXlvdXRNYW5hZ2VyLmNyZWF0ZVRhYkRyb3BQbGFjZWhvbGRlckVsZW1lbnQoZG9jdW1lbnQpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJhZ1NvdXJjZXM6IERyYWdTb3VyY2VbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdXBkYXRpbmdDb2x1bW5zUmVzcG9uc2l2ZSA9IGZhbHNlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZmlyc3RMb2FkID0gdHJ1ZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2V2ZW50SHViID0gbmV3IEV2ZW50SHViKHRoaXMpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfd2lkdGg6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2ZvY3VzZWRDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdmlydHVhbFNpemVkQ29udGFpbmVyczogQ29tcG9uZW50Q29udGFpbmVyW10gPSBbXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3ZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZ0JlZ2luQ291bnQgPSAwO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc2l6ZUludmFsaWRhdGlvbkJlZ2luQ291bnQgPSAwO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvdGVjdGVkIF9jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnOiBMYXlvdXRDb25maWcgfCB1bmRlZmluZWQ7IC8vIHByb3RlY3RlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3BhcmVudDogTGF5b3V0TWFuYWdlciB8IG51bGwgPSBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbGFzdEFyZWE6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLmhhbmRsZUNvbnRhaW5lclJlc2l6ZSgpKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgdG8gYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDMgKi9cclxuICAgIHByaXZhdGUgX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkJlZm9yZVVubG9hZCgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB0byBiZSByZW1vdmVkIGluIHZlcnNpb24gMyAqL1xyXG4gICAgcHJpdmF0ZSBfd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuaW5nID0gZmFsc2U7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9tYXhpbWlzZWRTdGFja0JlZm9yZURlc3Ryb3llZExpc3RlbmVyID0gKGV2OiBFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudCkgPT4gdGhpcy5jbGVhbnVwQmVmb3JlTWF4aW1pc2VkU3RhY2tEZXN0cm95ZWQoZXYpO1xyXG5cclxuICAgIHJlYWRvbmx5IGlzU3ViV2luZG93OiBib29sZWFuO1xyXG4gICAgbGF5b3V0Q29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZztcclxuXHJcbiAgICBiZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50OiBMYXlvdXRNYW5hZ2VyLkJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQgfCB1bmRlZmluZWQ7XHJcbiAgICBhZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQ6IExheW91dE1hbmFnZXIuQWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdGhlIGFzc29jaWF0ZWQgd2luZG93IHRvIHRoZSBmcm9udC5cclxuICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaGFzIG5vIGVmZmVjdCAoY2FuIGJlIHNldCBieSBFbGVjdHJvbikuXHJcbiAgICAgKiBAcHVibGljIFxyXG4gICAgICovXHJcbiAgICBtb3ZlV2luZG93VG9wOiAodGhpczogdm9pZCkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXMgdGhlIGFzc29jaWF0ZWQgd2luZG93IHdpbmRvdy5cclxuICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaW52b2tlcyB3aW5kb3cuZm9jdXMoKSAoY2FuIGJlIHNldCBieSBFbGVjdHJvbikuXHJcbiAgICAgKiBAcHVibGljIFxyXG4gICAgICovXHJcbiAgICBmb2N1c1dpbmRvdzogKHRoaXM6IHZvaWQpID0+IHZvaWQgPSAoKSA9PiBnbG9iYWxUaGlzLmZvY3VzKCk7XHJcblxyXG4gICAgZ2V0IGNvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9jb250YWluZXJFbGVtZW50OyB9XHJcbiAgICBnZXQgaXNJbml0aWFsaXNlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzSW5pdGlhbGlzZWQ7IH1cclxuICAgIGdldCBpc0RyYWdnaW5nKCk6IGJvb2xlYW4geyByZXR1cm4gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnZ2luZyk7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCBncm91bmRJdGVtKCk6IEdyb3VuZEl0ZW0gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fZ3JvdW5kSXRlbTsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5ncm91bmRJdGVtfSBpbnN0ZWFkICovXHJcbiAgICBnZXQgcm9vdCgpOiBHcm91bmRJdGVtIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2dyb3VuZEl0ZW07IH1cclxuICAgIGdldCBvcGVuUG9wb3V0cygpOiBCcm93c2VyUG9wb3V0W10geyByZXR1cm4gdGhpcy5fb3BlblBvcG91dHM7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCBkcm9wVGFyZ2V0SW5kaWNhdG9yKCk6IERyb3BUYXJnZXRJbmRpY2F0b3IgfCBudWxsIHsgcmV0dXJuIHRoaXMuX2Ryb3BUYXJnZXRJbmRpY2F0b3I7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCAqL1xyXG4gICAgZ2V0IHRyYW5zaXRpb25JbmRpY2F0b3IoKTogVHJhbnNpdGlvbkluZGljYXRvciB8IG51bGwgeyByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbkluZGljYXRvcjsgfVxyXG4gICAgZ2V0IHdpZHRoKCk6IG51bWJlciB8IG51bGwgeyByZXR1cm4gdGhpcy5fd2lkdGg7IH1cclxuICAgIGdldCBoZWlnaHQoKTogbnVtYmVyIHwgbnVsbCB7IHJldHVybiB0aGlzLl9oZWlnaHQ7IH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSB7QGxpbmsgKEV2ZW50SHViOmNsYXNzKX0gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF5b3V0IG1hbmFnZXIuXHJcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb3BhZ2F0ZSBldmVudHMgYmV0d2VlbiB0aGUgd2luZG93c1xyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBnZXQgZXZlbnRIdWIoKTogRXZlbnRIdWIgeyByZXR1cm4gdGhpcy5fZXZlbnRIdWI7IH1cclxuICAgIGdldCByb290SXRlbSgpOiBDb250ZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhY2Nlc3Mgcm9vdEl0ZW0gYmVmb3JlIGluaXQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBncm91bmRDb250ZW50SXRlbXMgPSB0aGlzLl9ncm91bmRJdGVtLmNvbnRlbnRJdGVtcztcclxuICAgICAgICAgICAgaWYgKGdyb3VuZENvbnRlbnRJdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgZm9jdXNlZENvbXBvbmVudEl0ZW0oKTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbTsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0IHRhYkRyb3BQbGFjZWhvbGRlcigpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl90YWJEcm9wUGxhY2Vob2xkZXI7IH1cclxuICAgIGdldCBtYXhpbWlzZWRTdGFjaygpOiBTdGFjayB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9tYXhpbWlzZWRTdGFjazsgfVxyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCBpbmRpY2F0ZXMgZGVwcmVjYXRlZCBjb25zdHJ1Y3RvciB1c2UgKi9cclxuICAgIGdldCBkZXByZWNhdGVkQ29uc3RydWN0b3IoKTogYm9vbGVhbiB7IHJldHVybiAhdGhpcy5pc1N1YldpbmRvdyAmJiB0aGlzLl9jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnICE9PSB1bmRlZmluZWQ7IH1cclxuXHJcbiAgICBnZXQgcGFyZW50KCk6IExheW91dE1hbmFnZXIgfCBudWxsIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfVxyXG4gICAgc2V0IHBhcmVudCh2YWx1ZTogTGF5b3V0TWFuYWdlciB8IG51bGwpIHsgdGhpcy5fcGFyZW50ID0gdmFsdWU7IH1cclxuXHJcbiAgICBnZXQgaW5zdGFuY2VzKCk6IExheW91dE1hbmFnZXJbXSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBMYXlvdXRNYW5hZ2VyW10gPSBbXTtcclxuXHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucGFyZW50ID8/IHRoaXM7XHJcbiAgICAgICAgcmVzdWx0LnB1c2gocm9vdCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHBvcG91dCBvZiByb290Lm9wZW5Qb3BvdXRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gcG9wb3V0LmdldEdsSW5zdGFuY2UoKTtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQHBhcmFtIGNvbnRhaW5lciAtIEEgRG9tIEhUTUwgZWxlbWVudC4gRGVmYXVsdHMgdG8gYm9keVxyXG4gICAgKiBAaW50ZXJuYWxcclxuICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzOiBMYXlvdXRNYW5hZ2VyLkNvbnN0cnVjdG9yUGFyYW1ldGVycykge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNTdWJXaW5kb3cgPSBwYXJhbWV0ZXJzLmlzU3ViV2luZG93O1xyXG5cclxuICAgICAgICB0aGlzLl9jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnID0gcGFyYW1ldGVycy5jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnO1xyXG5cclxuICAgICAgICBJMThuU3RyaW5ncy5jaGVja0luaXRpYWxpc2UoKTtcclxuICAgICAgICBDb25maWdNaW5pZmllci5jaGVja0luaXRpYWxpc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuY29udGFpbmVyRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQgPSBwYXJhbWV0ZXJzLmNvbnRhaW5lckVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhlIExheW91dE1hbmFnZXIgaW5zdGFuY2UgaXRzZWxmIGFzIHdlbGwgYXMgZXZlcnkgQ29udGVudEl0ZW1cclxuICAgICAqIHdpdGhpbiBpdC4gQWZ0ZXIgdGhpcyBpcyBjYWxsZWQgbm90aGluZyBzaG91bGQgYmUgbGVmdCBvZiB0aGUgTGF5b3V0TWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgbmVlZHMgdG8gYmUgY2FsbGVkIGlmIGFuIGFwcGxpY2F0aW9uIHdpc2hlcyB0byBkZXN0cm95IHRoZSBHb2xkZW4gTGF5b3V0IG9iamVjdCB3aGlsZVxyXG4gICAgICogYSBwYWdlIHJlbWFpbnMgbG9hZGVkLiBXaGVuIGEgcGFnZSBpcyB1bmxvYWRlZCwgYWxsIHJlc291cmNlcyBjbGFpbWVkIGJ5IEdvbGRlbiBMYXlvdXQgd2lsbCBhdXRvbWF0aWNhbGx5XHJcbiAgICAgKiBiZSByZWxlYXNlZC5cclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXNlZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXRDb25maWcuc2V0dGluZ3MuY2xvc2VQb3BvdXRzT25VbmxvYWQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxPcGVuUG9wb3V0cygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDbGVhclJlc2l6ZVRpbWVvdXQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYkRyb3BQbGFjZWhvbGRlci5yZW1vdmUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2Ryb3BUYXJnZXRJbmRpY2F0b3IgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BUYXJnZXRJbmRpY2F0b3IuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90cmFuc2l0aW9uSW5kaWNhdG9yICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uSW5kaWNhdG9yLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9ldmVudEh1Yi5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRyYWdTb3VyY2Ugb2YgdGhpcy5fZHJhZ1NvdXJjZXMpIHtcclxuICAgICAgICAgICAgICAgIGRyYWdTb3VyY2UuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdTb3VyY2VzID0gW107XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpc2VkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBHb2xkZW5MYXlvdXQgY29uZmlndXJhdGlvbiBvYmplY3QgYW5kXHJcbiAgICAgKiByZXBsYWNlcyBpdHMga2V5cyBhbmQgdmFsdWVzIHJlY3Vyc2l2ZWx5IHdpdGhcclxuICAgICAqIG9uZSBsZXR0ZXIgY29kZXNcclxuICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFJlc29sdmVkTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkubWluaWZ5Q29uZmlnfSBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIG1pbmlmeUNvbmZpZyhjb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiBSZXNvbHZlZExheW91dENvbmZpZy5taW5pZnlDb25maWcoY29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgY29uZmlndXJhdGlvbiBPYmplY3QgdGhhdCB3YXMgcHJldmlvdXNseSBtaW5pZmllZFxyXG4gICAgICogdXNpbmcgbWluaWZ5Q29uZmlnIGFuZCByZXR1cm5zIGl0cyBvcmlnaW5hbCB2ZXJzaW9uXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChSZXNvbHZlZExheW91dENvbmZpZzpuYW1lc3BhY2UpLnVubWluaWZ5Q29uZmlnfSBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIHVubWluaWZ5Q29uZmlnKGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIFJlc29sdmVkTGF5b3V0Q29uZmlnLnVubWluaWZ5Q29uZmlnKGNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYWJzdHJhY3QgYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogQ29tcG9uZW50Q29udGFpbmVyLkJpbmRhYmxlQ29tcG9uZW50O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYWJzdHJhY3QgdW5iaW5kQ29tcG9uZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB2aXJ0dWFsOiBib29sZWFuLCBjb21wb25lbnQ6IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQgfCB1bmRlZmluZWQpOiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGZyb20gR29sZGVuTGF5b3V0IGNsYXNzLiBGaW5pc2hlcyBvZiBpbml0XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldENvbnRhaW5lcigpO1xyXG4gICAgICAgIHRoaXMuX2Ryb3BUYXJnZXRJbmRpY2F0b3IgPSBuZXcgRHJvcFRhcmdldEluZGljYXRvcigvKnRoaXMuY29udGFpbmVyKi8pO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25JbmRpY2F0b3IgPSBuZXcgVHJhbnNpdGlvbkluZGljYXRvcigpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZUZyb21Db250YWluZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5sYXlvdXRDb25maWcgPSBSZXNvbHZlZExheW91dENvbmZpZy5jcmVhdGVEZWZhdWx0KCk7IC8vIHdpbGwgb3ZlcndyaXR0ZW4gYmUgbG9hZGVkIHZpYSBsb2FkTGF5b3V0XHJcbiAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbSA9IG5ldyBHcm91bmRJdGVtKHRoaXMsIHRoaXMubGF5b3V0Q29uZmlnLnJvb3QsIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uaW5pdCgpO1xyXG5cclxuICAgICAgICB0aGlzLmNoZWNrTG9hZGVkTGF5b3V0TWF4aW1pc2VJdGVtKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hZGp1c3RDb2x1bW5zUmVzcG9uc2l2ZSgpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnaW5pdGlhbGlzZWQnKTtcclxuXHJcbiAgICAgICAgbGV0IGxheW91dCA9IHRoaXMuX2NvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWc7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzU3ViV2luZG93ICYmIGxheW91dCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIFdyYXAgaW4gc3RhY2sgZm9yIG11bHRpd2luZG93IGRyYWctYW5kLWRyb3AgdG8gd29yayBwcm9wZXJseVxyXG4gICAgICAgICAgICBpZiAobGF5b3V0LnJvb3Q/LnR5cGUgPT0gSXRlbVR5cGUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICBsYXlvdXQucm9vdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBbIGxheW91dC5yb290IF0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvYWRMYXlvdXQobGF5b3V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIG5ldyBsYXlvdXRcclxuICAgICAqIEBwYXJhbSBsYXlvdXRDb25maWcgLSBOZXcgbGF5b3V0IHRvIGJlIGxvYWRlZFxyXG4gICAgICovXHJcbiAgICBsb2FkTGF5b3V0KGxheW91dENvbmZpZzogTGF5b3V0Q29uZmlnKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGlzZWQpIHtcclxuICAgICAgICAgICAgLy8gSW4gY2FzZSBhcHBsaWNhdGlvbiBub3QgY29ycmVjdGx5IHVzaW5nIGxlZ2FjeSBjb25zdHJ1Y3RvclxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dvbGRlbkxheW91dDogTmVlZCB0byBjYWxsIGluaXQoKSBpZiBMYXlvdXRDb25maWcgd2l0aCBkZWZpbmVkIHJvb3QgcGFzc2VkIHRvIGNvbnN0cnVjdG9yJylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUxMMTExMTknKTtcclxuICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dENvbmZpZyA9IExheW91dENvbmZpZy5yZXNvbHZlKGxheW91dENvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVN1YldpbmRvd3MoKTsgLy8gc3RpbGwgbmVlZHMgdG8gYmUgdGVzdGVkXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmxvYWRSb290KHRoaXMubGF5b3V0Q29uZmlnLnJvb3QpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0xvYWRlZExheW91dE1heGltaXNlSXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RDb2x1bW5zUmVzcG9uc2l2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGxheW91dCBjb25maWd1cmF0aW9uIG9iamVjdCBiYXNlZCBvbiB0aGUgdGhlIGN1cnJlbnQgc3RhdGVcclxuICAgICAqXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKiBAcmV0dXJucyBHb2xkZW5MYXlvdXQgY29uZmlndXJhdGlvblxyXG4gICAgICovXHJcbiAgICBzYXZlTGF5b3V0KCk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXNlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGNyZWF0ZSBjb25maWcsIGxheW91dCBub3QgeWV0IGluaXRpYWxpc2VkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIChyb290ICE9PSB1bmRlZmluZWQgJiYgIShyb290IGluc3RhbmNlb2YgQ29udGVudEl0ZW0pKSB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgbXVzdCBiZSBhIENvbnRlbnRJdGVtJyk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICogQ29udGVudFxyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTVRDMTgyNDQnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VuZENvbnRlbnQgPSB0aGlzLl9ncm91bmRJdGVtLmNhbGN1bGF0ZUNvbmZpZ0NvbnRlbnQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgcm9vdEl0ZW1Db25maWc6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdW5kQ29udGVudC5sZW5ndGggIT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICByb290SXRlbUNvbmZpZyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdEl0ZW1Db25maWcgPSBncm91bmRDb250ZW50WzBdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAqIFJldHJpZXZlIGNvbmZpZyBmb3Igc3Vid2luZG93c1xyXG4gICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb25jaWxlUG9wb3V0V2luZG93cygpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3BlblBvcG91dHM6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW10gPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fb3BlblBvcG91dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBvcGVuUG9wb3V0cy5wdXNoKHRoaXMuX29wZW5Qb3BvdXRzW2ldLnRvQ29uZmlnKCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdDogcm9vdEl0ZW1Db25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3BlblBvcG91dHMsXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6ICBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5jcmVhdGVDb3B5KHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmNyZWF0ZUNvcHkodGhpcy5sYXlvdXRDb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuY3JlYXRlQ29weSh0aGlzLmxheW91dENvbmZpZy5oZWFkZXIpLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFueSBleGlzdGluZyBsYXlvdXQuIEVmZmVjdGl2ZWx5LCBhbiBlbXB0eSBsYXlvdXQgd2lsbCBiZSBsb2FkZWQuXHJcbiAgICAgKi9cclxuXHJcbiAgICBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQ0wxMTEyOScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uY2xlYXJSb290KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykuc2F2ZUxheW91dH1cclxuICAgICAqL1xyXG4gICAgdG9Db25maWcoKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNhdmVMYXlvdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgQ29tcG9uZW50SXRlbS4gIFdpbGwgdXNlIGRlZmF1bHQgbG9jYXRpb24gc2VsZWN0b3JzIHRvIGVuc3VyZSBhIGxvY2F0aW9uIGlzIGZvdW5kIGFuZFxyXG4gICAgICogY29tcG9uZW50IGlzIHN1Y2Nlc3NmdWxseSBhZGRlZFxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGVOYW1lIC0gTmFtZSBvZiBjb21wb25lbnQgdHlwZSB0byBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHN0YXRlIC0gT3B0aW9uYWwgaW5pdGlhbCBzdGF0ZSB0byBiZSBhc3NpZ25lZCB0byBjb21wb25lbnRcclxuICAgICAqIEByZXR1cm5zIE5ldyBDb21wb25lbnRJdGVtIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIG5ld0NvbXBvbmVudChjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZyk6IENvbXBvbmVudEl0ZW0ge1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEl0ZW0gPSB0aGlzLm5ld0NvbXBvbmVudEF0TG9jYXRpb24oY29tcG9uZW50VHlwZSwgY29tcG9uZW50U3RhdGUsIHRpdGxlKTtcclxuICAgICAgICBpZiAoY29tcG9uZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1OQzY1NTg4Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIENvbXBvbmVudEl0ZW0gYXQgdGhlIGZpcnN0IHZhbGlkIHNlbGVjdG9yIGxvY2F0aW9uLlxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGVOYW1lIC0gTmFtZSBvZiBjb21wb25lbnQgdHlwZSB0byBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHN0YXRlIC0gT3B0aW9uYWwgaW5pdGlhbCBzdGF0ZSB0byBiZSBhc3NpZ25lZCB0byBjb21wb25lbnRcclxuICAgICAqIEBwYXJhbSBsb2NhdGlvblNlbGVjdG9ycyAtIEFycmF5IG9mIGxvY2F0aW9uIHNlbGVjdG9ycyB1c2VkIHRvIGZpbmQgbG9jYXRpb24gaW4gbGF5b3V0IHdoZXJlIGNvbXBvbmVudFxyXG4gICAgICogd2lsbCBiZSBhZGRlZC4gRmlyc3QgbG9jYXRpb24gaW4gYXJyYXkgd2hpY2ggaXMgdmFsaWQgd2lsbCBiZSB1c2VkLiBJZiBsb2NhdGlvblNlbGVjdG9ycyBpcyB1bmRlZmluZWQsXHJcbiAgICAgKiB7QGxpbmsgKExheW91dE1hbmFnZXI6bmFtZXNwYWNlKS5kZWZhdWx0TG9jYXRpb25TZWxlY3RvcnN9IHdpbGwgYmUgdXNlZFxyXG4gICAgICogQHJldHVybnMgTmV3IENvbXBvbmVudEl0ZW0gY3JlYXRlZCBvciB1bmRlZmluZWQgaWYgbm8gdmFsaWQgbG9jYXRpb24gc2VsZWN0b3Igd2FzIGluIGFycmF5LlxyXG4gICAgICovXHJcbiAgICBuZXdDb21wb25lbnRBdExvY2F0aW9uKGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nLFxyXG4gICAgICAgIGxvY2F0aW9uU2VsZWN0b3JzPzogTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yW11cclxuICAgICk6IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWR7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgY29tcG9uZW50IGJlZm9yZSBpbml0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmFkZENvbXBvbmVudEF0TG9jYXRpb24oY29tcG9uZW50VHlwZSwgY29tcG9uZW50U3RhdGUsIHRpdGxlLCBsb2NhdGlvblNlbGVjdG9ycyk7XHJcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZEl0ZW0gPSBsb2NhdGlvbi5wYXJlbnRJdGVtLmNvbnRlbnRJdGVtc1tsb2NhdGlvbi5pbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAoIUNvbnRlbnRJdGVtLmlzQ29tcG9uZW50SXRlbShjcmVhdGVkSXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNTkM5OTI4Nzc1MzMnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5ldyBDb21wb25lbnRJdGVtLiAgV2lsbCB1c2UgZGVmYXVsdCBsb2NhdGlvbiBzZWxlY3RvcnMgdG8gZW5zdXJlIGEgbG9jYXRpb24gaXMgZm91bmQgYW5kXHJcbiAgICAgKiBjb21wb25lbnQgaXMgc3VjY2Vzc2Z1bGx5IGFkZGVkXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSAtIFR5cGUgb2YgY29tcG9uZW50IHRvIGJlIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlIHRvIGJlIGFzc2lnbmVkIHRvIGNvbXBvbmVudFxyXG4gICAgICogQHJldHVybnMgTG9jYXRpb24gb2YgbmV3IENvbXBvbmVudEl0ZW0gY3JlYXRlZC5cclxuICAgICAqL1xyXG4gICAgYWRkQ29tcG9uZW50KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nKTogTGF5b3V0TWFuYWdlci5Mb2NhdGlvbiB7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmFkZENvbXBvbmVudEF0TG9jYXRpb24oY29tcG9uZW50VHlwZSwgY29tcG9uZW50U3RhdGUsIHRpdGxlKTtcclxuICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQUM5OTk0MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgQ29tcG9uZW50SXRlbSBhdCB0aGUgZmlyc3QgdmFsaWQgc2VsZWN0b3IgbG9jYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSAtIFR5cGUgb2YgY29tcG9uZW50IHRvIGJlIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlIHRvIGJlIGFzc2lnbmVkIHRvIGNvbXBvbmVudFxyXG4gICAgICogQHBhcmFtIGxvY2F0aW9uU2VsZWN0b3JzIC0gQXJyYXkgb2YgbG9jYXRpb24gc2VsZWN0b3JzIHVzZWQgdG8gZmluZCBkZXRlcm1pbmUgbG9jYXRpb24gaW4gbGF5b3V0IHdoZXJlIGNvbXBvbmVudFxyXG4gICAgICogd2lsbCBiZSBhZGRlZC4gRmlyc3QgbG9jYXRpb24gaW4gYXJyYXkgd2hpY2ggaXMgdmFsaWQgd2lsbCBiZSB1c2VkLiBJZiB1bmRlZmluZWQsXHJcbiAgICAgKiB7QGxpbmsgKExheW91dE1hbmFnZXI6bmFtZXNwYWNlKS5kZWZhdWx0TG9jYXRpb25TZWxlY3RvcnN9IHdpbGwgYmUgdXNlZC5cclxuICAgICAqIEByZXR1cm5zIExvY2F0aW9uIG9mIG5ldyBDb21wb25lbnRJdGVtIGNyZWF0ZWQgb3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkIGxvY2F0aW9uIHNlbGVjdG9yIHdhcyBpbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgYWRkQ29tcG9uZW50QXRMb2NhdGlvbihjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZyxcclxuICAgICAgICBsb2NhdGlvblNlbGVjdG9ycz86IHJlYWRvbmx5IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3RvcltdXHJcbiAgICApOiBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW1BdExvY2F0aW9uKGl0ZW1Db25maWcsIGxvY2F0aW9uU2VsZWN0b3JzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgQ29udGVudEl0ZW0uICBXaWxsIHVzZSBkZWZhdWx0IGxvY2F0aW9uIHNlbGVjdG9ycyB0byBlbnN1cmUgYSBsb2NhdGlvbiBpcyBmb3VuZCBhbmRcclxuICAgICAqIGNvbXBvbmVudCBpcyBzdWNjZXNzZnVsbHkgYWRkZWRcclxuICAgICAqIEBwYXJhbSBpdGVtQ29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnIG9mIGNoaWxkIHRvIGJlIGFkZGVkLlxyXG4gICAgICogQHJldHVybnMgTmV3IENvbnRlbnRJdGVtIGNyZWF0ZWQuXHJcbiAgICAqL1xyXG4gICAgbmV3SXRlbShpdGVtQ29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5uZXdJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnKTtcclxuICAgICAgICBpZiAoY29udGVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNTkM2NTU4OCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50SXRlbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IGNoaWxkIENvbnRlbnRJdGVtIHVuZGVyIHRoZSByb290IENvbnRlbnRJdGVtLiAgSWYgYSByb290IGRvZXMgbm90IGV4aXN0LCB0aGVuIGNyZWF0ZSByb290IENvbnRlbnRJdGVtIGluc3RlYWRcclxuICAgICAqIEBwYXJhbSBpdGVtQ29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnIG9mIGNoaWxkIHRvIGJlIGFkZGVkLlxyXG4gICAgICogQHBhcmFtIGxvY2F0aW9uU2VsZWN0b3JzIC0gQXJyYXkgb2YgbG9jYXRpb24gc2VsZWN0b3JzIHVzZWQgdG8gZmluZCBkZXRlcm1pbmUgbG9jYXRpb24gaW4gbGF5b3V0IHdoZXJlIENvbnRlbnRJdGVtXHJcbiAgICAgKiB3aWxsIGJlIGFkZGVkLiBGaXJzdCBsb2NhdGlvbiBpbiBhcnJheSB3aGljaCBpcyB2YWxpZCB3aWxsIGJlIHVzZWQuIElmIHVuZGVmaW5lZCxcclxuICAgICAqIHtAbGluayAoTGF5b3V0TWFuYWdlcjpuYW1lc3BhY2UpLmRlZmF1bHRMb2NhdGlvblNlbGVjdG9yc30gd2lsbCBiZSB1c2VkLlxyXG4gICAgICogQHJldHVybnMgTmV3IENvbnRlbnRJdGVtIGNyZWF0ZWQgb3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkIGxvY2F0aW9uIHNlbGVjdG9yIHdhcyBpbiBhcnJheS4gKi9cclxuICAgIG5ld0l0ZW1BdExvY2F0aW9uKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICAgICAgbG9jYXRpb25TZWxlY3RvcnM/OiByZWFkb25seSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3JbXVxyXG4gICAgKTogQ29udGVudEl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGNvbXBvbmVudCBiZWZvcmUgaW5pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hZGRJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnLCBsb2NhdGlvblNlbGVjdG9ycyk7XHJcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZEl0ZW0gPSBsb2NhdGlvbi5wYXJlbnRJdGVtLmNvbnRlbnRJdGVtc1tsb2NhdGlvbi5pbmRleF07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlZEl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IENvbnRlbnRJdGVtLiAgV2lsbCB1c2UgZGVmYXVsdCBsb2NhdGlvbiBzZWxlY3RvcnMgdG8gZW5zdXJlIGEgbG9jYXRpb24gaXMgZm91bmQgYW5kXHJcbiAgICAgKiBjb21wb25lbnQgaXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLlxyXG4gICAgICogQHBhcmFtIGl0ZW1Db25maWcgLSBSZXNvbHZlZEl0ZW1Db25maWcgb2YgY2hpbGQgdG8gYmUgYWRkZWQuXHJcbiAgICAgKiBAcmV0dXJucyBMb2NhdGlvbiBvZiBuZXcgQ29udGVudEl0ZW0gY3JlYXRlZC4gKi9cclxuICAgIGFkZEl0ZW0oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZyk6IExheW91dE1hbmFnZXIuTG9jYXRpb24ge1xyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hZGRJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnKTtcclxuICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQUk5OTk0MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgQ29udGVudEl0ZW0gYXQgdGhlIGZpcnN0IHZhbGlkIHNlbGVjdG9yIGxvY2F0aW9uLlxyXG4gICAgICogQHBhcmFtIGl0ZW1Db25maWcgLSBSZXNvbHZlZEl0ZW1Db25maWcgb2YgY2hpbGQgdG8gYmUgYWRkZWQuXHJcbiAgICAgKiBAcGFyYW0gbG9jYXRpb25TZWxlY3RvcnMgLSBBcnJheSBvZiBsb2NhdGlvbiBzZWxlY3RvcnMgdXNlZCB0byBmaW5kIGRldGVybWluZSBsb2NhdGlvbiBpbiBsYXlvdXQgd2hlcmUgQ29udGVudEl0ZW1cclxuICAgICAqIHdpbGwgYmUgYWRkZWQuIEZpcnN0IGxvY2F0aW9uIGluIGFycmF5IHdoaWNoIGlzIHZhbGlkIHdpbGwgYmUgdXNlZC4gSWYgdW5kZWZpbmVkLFxyXG4gICAgICoge0BsaW5rIChMYXlvdXRNYW5hZ2VyOm5hbWVzcGFjZSkuZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzfSB3aWxsIGJlIHVzZWQuXHJcbiAgICAgKiBAcmV0dXJucyBMb2NhdGlvbiBvZiBuZXcgQ29udGVudEl0ZW0gY3JlYXRlZCBvciB1bmRlZmluZWQgaWYgbm8gdmFsaWQgbG9jYXRpb24gc2VsZWN0b3Igd2FzIGluIGFycmF5LiAqL1xyXG4gICAgYWRkSXRlbUF0TG9jYXRpb24oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgICAgICBsb2NhdGlvblNlbGVjdG9ycz86IHJlYWRvbmx5IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3RvcltdXHJcbiAgICApOiBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBjb21wb25lbnQgYmVmb3JlIGluaXQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb25TZWxlY3RvcnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzIHNob3VsZCBhbHdheXMgZmluZCBhIGxvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICBsb2NhdGlvblNlbGVjdG9ycyA9IExheW91dE1hbmFnZXIuZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuZmluZEZpcnN0TG9jYXRpb24obG9jYXRpb25TZWxlY3RvcnMpO1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRJdGVtID0gbG9jYXRpb24ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIGxldCBhZGRJZHg6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50SXRlbS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdW5kSXRlbSA9IHBhcmVudEl0ZW0gYXMgR3JvdW5kSXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWR4ID0gZ3JvdW5kSXRlbS5hZGRJdGVtKGl0ZW1Db25maWcsIGxvY2F0aW9uLmluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZElkeCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJdGVtID0gdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF07IC8vIHdhcyBhZGRlZCB0byByb290SXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWR4ID0gMDsgLy8gd2FzIGFkZGVkIGFzIHJvb3RJdGVtICh3aGljaCBpcyB0aGUgZmlyc3QgYW5kIG9ubHkgQ29udGVudEl0ZW0gaW4gR3JvdW5kSXRlbSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93T3JDb2x1bW4gPSBwYXJlbnRJdGVtIGFzIFJvd09yQ29sdW1uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJZHggPSByb3dPckNvbHVtbi5hZGRJdGVtKGl0ZW1Db25maWcsIGxvY2F0aW9uLmluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJdGVtQ29uZmlnLmlzQ29tcG9uZW50KGl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuSXRlbUNvbmZpZ0lzTm90VHlwZUNvbXBvbmVudF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBwYXJlbnRJdGVtIGFzIFN0YWNrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWR4ID0gc3RhY2suYWRkSXRlbShpdGVtQ29uZmlnLCBsb2NhdGlvbi5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQUlBTEM4NzQ0NDYwMicpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0xNQUlBTFU5ODg4MTczMycsIHBhcmVudEl0ZW0udHlwZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKEl0ZW1Db25maWcuaXNDb21wb25lbnQoaXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgc3RhY2sgd2FzIGluc2VydGVkXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHBhcmVudEl0ZW0uY29udGVudEl0ZW1zW2FkZElkeF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzU3RhY2soaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElkeCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnBhcmVudEl0ZW0gPSBwYXJlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgbG9jYXRpb24uaW5kZXggPSBhZGRJZHg7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBMb2FkcyB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBSZXNvbHZlZEl0ZW1Db25maWcgYXMgcm9vdC5cclxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhIENvbXBvbmVudCBhbGwgYnkgaXRzZWxmLiAgVGhlIGxheW91dCBjYW5ub3QgYmUgY2hhbmdlZCBvdGhlciB0aGFuIGhhdmluZyBhbm90aGVyIG5ldyBsYXlvdXQgbG9hZGVkLlxyXG4gICAgICogTm90ZSB0aGF0LCBpZiB0aGlzIGxheW91dCBpcyBzYXZlZCBhbmQgcmVsb2FkZWQsIGl0IHdpbGwgcmVsb2FkIHdpdGggdGhlIENvbXBvbmVudCBhcyBhIGNoaWxkIG9mIGEgU3RhY2suXHJcbiAgICAqL1xyXG4gICAgbG9hZENvbXBvbmVudEFzUm9vdChpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgaXRlbSBiZWZvcmUgaW5pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0ubG9hZENvbXBvbmVudEFzUm9vdChpdGVtQ29uZmlnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLnNldFNpemV9ICovXHJcbiAgICB1cGRhdGVTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgbGF5b3V0IG1hbmFnZXJzIHNpemVcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gd2lkdGggLSBXaWR0aCBpbiBwaXhlbHNcclxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBIZWlnaHQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIHNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1VUzE4ODgxJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLnNldFNpemUodGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZFN0YWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQodGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuX21heGltaXNlZFN0YWNrLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuX21heGltaXNlZFN0YWNrLmVsZW1lbnQsIGhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VkU3RhY2sudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RDb2x1bW5zUmVzcG9uc2l2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGJlZ2luU2l6ZUludmFsaWRhdGlvbigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zaXplSW52YWxpZGF0aW9uQmVnaW5Db3VudCsrO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVuZFNpemVJbnZhbGlkYXRpb24oKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKC0tdGhpcy5fc2l6ZUludmFsaWRhdGlvbkJlZ2luQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplRnJvbUNvbnRhaW5lcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICB1cGRhdGVTaXplRnJvbUNvbnRhaW5lcigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCh0aGlzLl9jb250YWluZXJFbGVtZW50KTtcclxuICAgICAgICB0aGlzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIHNpemUgb2YgdGhlIHJvb3QgQ29udGVudEl0ZW0uICBUaGlzIHdpbGwgdXBkYXRlIHRoZSBzaXplIG9mIGFsbCBjb250ZW50SXRlbXMgaW4gdGhlIHRyZWVcclxuICAgICAqIEBwYXJhbSBmb3JjZSAtIEluIHNvbWUgY2FzZXMgdGhlIHNpemUgaXMgbm90IHVwZGF0ZWQgaWYgaXQgaGFzIG5vdCBjaGFuZ2VkLiBJbiB0aGlzIGNhc2UsIGV2ZW50c1xyXG4gICAgICogKHN1Y2ggYXMgQ29tcG9uZW50Q29udGFpbmVyLnZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCkgYXJlIG5vdCBmaXJlZC4gU2V0dGluZyBmb3JjZSB0byB0cnVlLCBlbnN1cmVzIHRoZSBzaXplIGlzIHVwZGF0ZWQgcmVnYXJkbGVzcywgYW5kXHJcbiAgICAgKiB0aGUgcmVzcGVjdGl2ZSBldmVudHMgYXJlIGZpcmVkLiBUaGlzIGlzIHNvbWV0aW1lcyBuZWNlc3Nhcnkgd2hlbiBhIGNvbXBvbmVudCdzIHNpemUgaGFzIG5vdCBjaGFuZ2VkIGJ1dCBpdCBoYXMgYmVjb21lIHZpc2libGUsIGFuZCB0aGVcclxuICAgICAqIHJlbGV2YW50IGV2ZW50cyBuZWVkIHRvIGJlIGZpcmVkLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVSb290U2l6ZShmb3JjZSA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTVVSUzI4ODgxJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbS51cGRhdGVTaXplKGZvcmNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwdWJsaWMgKi9cclxuICAgIGNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShjb25maWc6IFJlc29sdmVkSXRlbUNvbmZpZywgcGFyZW50OiBDb250ZW50SXRlbSk6IENvbnRlbnRJdGVtIHtcclxuICAgICAgICBjb25zdCBuZXdJdGVtID0gdGhpcy5jcmVhdGVDb250ZW50SXRlbShjb25maWcsIHBhcmVudCk7XHJcbiAgICAgICAgbmV3SXRlbS5pbml0KCk7XHJcbiAgICAgICAgcmV0dXJuIG5ld0l0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWN1cnNpdmVseSBjcmVhdGVzIG5ldyBpdGVtIHRyZWUgc3RydWN0dXJlcyBiYXNlZCBvbiBhIHByb3ZpZGVkXHJcbiAgICAgKiBJdGVtQ29uZmlndXJhdGlvbiBvYmplY3RcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnXHJcbiAgICAgKiBAcGFyYW0gcGFyZW50IC0gVGhlIGl0ZW0gdGhlIG5ld2x5IGNyZWF0ZWQgaXRlbSBzaG91bGQgYmUgYSBjaGlsZCBvZlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUNvbnRlbnRJdGVtKGNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnLCBwYXJlbnQ6IENvbnRlbnRJdGVtKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLnR5cGUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIFxcJ3R5cGVcXCcnLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdlIGFkZCBhbiBhZGRpdGlvbmFsIHN0YWNrIGFyb3VuZCBldmVyeSBjb21wb25lbnQgdGhhdCdzIG5vdCB3aXRoaW4gYSBzdGFjayBhbnl3YXlzLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbXBvbmVudFxyXG4gICAgICAgICAgICBSZXNvbHZlZEl0ZW1Db25maWcuaXNDb21wb25lbnRJdGVtKGNvbmZpZykgJiZcclxuXHJcbiAgICAgICAgICAgIC8vIGFuZCBpdCdzIG5vdCBhbHJlYWR5IHdpdGhpbiBhIHN0YWNrXHJcbiAgICAgICAgICAgICEocGFyZW50IGluc3RhbmNlb2YgU3RhY2spICYmXHJcblxyXG4gICAgICAgICAgICAvLyBhbmQgd2UgaGF2ZSBhIHBhcmVudFxyXG4gICAgICAgICAgICAhIXBhcmVudCAmJlxyXG5cclxuICAgICAgICAgICAgLy8gYW5kIGl0J3Mgbm90IHRoZSB0b3Btb3N0IGl0ZW0gaW4gYSBuZXcgd2luZG93XHJcbiAgICAgICAgICAgICEodGhpcy5pc1N1YldpbmRvdyA9PT0gdHJ1ZSAmJiBwYXJlbnQgaW5zdGFuY2VvZiBHcm91bmRJdGVtKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFja0NvbmZpZzogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFtjb25maWddLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogY29uZmlnLnNpemUsXHJcbiAgICAgICAgICAgICAgICBzaXplVW5pdDogY29uZmlnLnNpemVVbml0LFxyXG4gICAgICAgICAgICAgICAgbWluU2l6ZTogY29uZmlnLm1pblNpemUsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplVW5pdDogY29uZmlnLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICAgICAgaWQ6IGNvbmZpZy5pZCxcclxuICAgICAgICAgICAgICAgIG1heGltaXNlZDogY29uZmlnLm1heGltaXNlZCxcclxuICAgICAgICAgICAgICAgIGlzQ2xvc2FibGU6IGNvbmZpZy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4OiAwLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25maWcgPSBzdGFja0NvbmZpZztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5jcmVhdGVDb250ZW50SXRlbUZyb21Db25maWcoY29uZmlnLCBwYXJlbnQpO1xyXG4gICAgICAgIHJldHVybiBjb250ZW50SXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kRmlyc3RDb21wb25lbnRJdGVtQnlJZChpZDogc3RyaW5nKTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUZGQ0lCSTgyNDQ2Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlQnlJZFJlY3Vyc2l2ZShJdGVtVHlwZS5jb21wb25lbnQsIGlkLCB0aGlzLl9ncm91bmRJdGVtKSBhcyBDb21wb25lbnRJdGVtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjcmVhdGVQb3BvdXRGcm9tQ29udGVudEl0ZW0oaXRlbTogQ29udGVudEl0ZW0sXHJcbiAgICAgICAgd2luZG93OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgcGFyZW50SWQ6IHN0cmluZyB8IG51bGwsXHJcbiAgICAgICAgZG9ja1BvaW50OiBDb250ZW50SXRlbS5Eb2NrUG9pbnQgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgKTogQnJvd3NlclBvcG91dCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhlIGl0ZW0gaXMgdGhlIG9ubHkgY29tcG9uZW50IHdpdGhpbiBhIHN0YWNrIG9yIGZvciBzb21lXHJcbiAgICAgICAgICogb3RoZXIgcmVhc29uIHRoZSBvbmx5IGNoaWxkIG9mIGl0cyBwYXJlbnQgdGhlIHBhcmVudCB3aWxsIGJlIGRlc3Ryb3llZFxyXG4gICAgICAgICAqIHdoZW4gdGhlIGNoaWxkIGlzIHJlbW92ZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBJbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgd2UgbW92ZSB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIHNvbWV0aGluZ1xyXG4gICAgICAgICAqIHRoYXQgd2lsbCByZW1haW4gYWZ0ZXIgdGhlIGl0ZW0gaXMgYmVpbmcgcG9wcGVkIG91dFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGRvY2sgPSBkb2NrUG9pbnQgPz8gaXRlbS5maW5kRG9ja1BvaW50KCk7XHJcblxyXG4gICAgICAgIGlmIChkb2NrID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdMTUNQRkNJMDA4MzQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50SWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGRvY2sucGFyZW50LmFkZFBvcEluUGFyZW50SWQocGFyZW50SWQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAod2luZG93ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyU2NyZWVuID0gZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbihnbG9iYWxUaGlzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSAoaXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudEl0ZW0pID8gaXRlbS5nZXRPdXRlckJvdW5kaW5nQ2xpZW50UmVjdCgpIDogaXRlbS5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHdpbmRvdyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBpbm5lclNjcmVlbi5sZWZ0ICsgY2xpZW50UmVjdC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogaW5uZXJTY3JlZW4udG9wICsgY2xpZW50UmVjdC50b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNsaWVudFJlY3Qud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjbGllbnRSZWN0LmhlaWdodCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBpdGVtLnRvQ29uZmlnKCk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnBhcmVudD8uY29udGVudEl0ZW1zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIVJlc29sdmVkUm9vdEl0ZW1Db25maWcuaXNSb290SXRlbUNvbmZpZyhpdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Qb3BvdXRDYW5ub3RCZUNyZWF0ZWRXaXRoR3JvdW5kSXRlbUNvbmZpZ119YCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQb3BvdXRGcm9tSXRlbUNvbmZpZyhpdGVtQ29uZmlnLCB3aW5kb3csIHBhcmVudElkLCBkb2NrLmluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBiZWdpblZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoKyt0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmdCZWdpbkNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lcnMubGVuZ3RoID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYWRkVmlydHVhbFNpemVkQ29udGFpbmVyKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdmlydHVhbFNpemVkQ29udGFpbmVycy5wdXNoKGNvbnRhaW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZW5kVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICgtLXRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZ0JlZ2luQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJzLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5ub3RpZnlWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lcnMubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmaXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGZpcmVBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5hZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVQb3BvdXRGcm9tSXRlbUNvbmZpZyhyb290SXRlbUNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyxcclxuICAgICAgICB3aW5kb3c6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdyxcclxuICAgICAgICBwYXJlbnRJZDogc3RyaW5nIHwgbnVsbCxcclxuICAgICAgICBpbmRleEluUGFyZW50OiBudW1iZXIgfCBudWxsXHJcbiAgICApIHtcclxuICAgICAgICBjb25zdCBsYXlvdXRDb25maWcgPSB0aGlzLnRvQ29uZmlnKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBvcG91dExheW91dENvbmZpZzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IHJvb3RJdGVtQ29uZmlnLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogW10sXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBsYXlvdXRDb25maWcuc2V0dGluZ3MsXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IGxheW91dENvbmZpZy5kaW1lbnNpb25zLFxyXG4gICAgICAgICAgICBoZWFkZXI6IGxheW91dENvbmZpZy5oZWFkZXIsXHJcbiAgICAgICAgICAgIHdpbmRvdyxcclxuICAgICAgICAgICAgcGFyZW50SWQsXHJcbiAgICAgICAgICAgIGluZGV4SW5QYXJlbnQsXHJcbiAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUG9wb3V0RnJvbVBvcG91dExheW91dENvbmZpZyhwb3BvdXRMYXlvdXRDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNyZWF0ZVBvcG91dEZyb21Qb3BvdXRMYXlvdXRDb25maWcoY29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyk6IEJyb3dzZXJQb3BvdXQge1xyXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYWxyZWFkeSBhIHBvcG91dCwgbGV0IHRoZSBwYXJlbnQgbGF5b3V0IG1hbmFnZXIgaGFuZGxlIHRoZSBuZXcgb25lLlxyXG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudC5jcmVhdGVQb3BvdXRGcm9tUG9wb3V0TGF5b3V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb25maWdXaW5kb3cgPSBjb25maWcud2luZG93O1xyXG4gICAgICAgIGNvbnN0IGluaXRpYWxXaW5kb3c6IFJlY3QgPSB7XHJcbiAgICAgICAgICAgIGxlZnQ6IGNvbmZpZ1dpbmRvdy5sZWZ0ID8/IChnbG9iYWxUaGlzLnNjcmVlblggfHwgZ2xvYmFsVGhpcy5zY3JlZW5MZWZ0ICsgMjApLFxyXG4gICAgICAgICAgICB0b3A6IGNvbmZpZ1dpbmRvdy50b3AgPz8gKGdsb2JhbFRoaXMuc2NyZWVuWSB8fCBnbG9iYWxUaGlzLnNjcmVlblRvcCArIDIwKSxcclxuICAgICAgICAgICAgd2lkdGg6IGNvbmZpZ1dpbmRvdy53aWR0aCA/PyA1MDAsXHJcbiAgICAgICAgICAgIGhlaWdodDogY29uZmlnV2luZG93LmhlaWdodCA/PyAzMDksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYnJvd3NlclBvcG91dCA9IG5ldyBCcm93c2VyUG9wb3V0KGNvbmZpZywgaW5pdGlhbFdpbmRvdywgdGhpcyk7XHJcblxyXG4gICAgICAgIGJyb3dzZXJQb3BvdXQub24oJ2luaXRpYWxpc2VkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsbSA9IGJyb3dzZXJQb3BvdXQuZ2V0R2xJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIHBvcG91dCB3aGVuIHRoZSBsYXN0IGNvbXBvbmVudCBpdGVtIGlzIGRlc3Ryb3llZC5cclxuICAgICAgICAgICAgY29uc3QgZGVzdHJveUlmRW1wdHkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxtLmlzRHJhZ2dpbmcgJiYgbG0uZ3JvdW5kSXRlbT8uZ2V0QWxsQ29tcG9uZW50SXRlbXMoKT8ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlclBvcG91dC5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbG0ub24oJ2l0ZW1Ecm9wcGVkJywgZGVzdHJveUlmRW1wdHkpO1xyXG4gICAgICAgICAgICBsbS5vbignaXRlbURlc3Ryb3llZCcsIGRlc3Ryb3lJZkVtcHR5KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnd2luZG93T3BlbmVkJywgYnJvd3NlclBvcG91dCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGJyb3dzZXJQb3BvdXQub24oJ2Nsb3NlZCcsICgpID0+IHRoaXMucmVjb25jaWxlUG9wb3V0V2luZG93cygpKTtcclxuXHJcbiAgICAgICAgdGhpcy5fb3BlblBvcG91dHMucHVzaChicm93c2VyUG9wb3V0KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLmNsb3NlUG9wb3V0c09uVW5sb2FkICYmICF0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcpIHtcclxuICAgICAgICAgICAgZ2xvYmFsVGhpcy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJyb3dzZXJQb3BvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbG9zZXMgYWxsIE9wZW4gUG9wb3V0c1xyXG4gICAgICogQXBwbGljYXRpb25zIGNhbiBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gYSBwYWdlIGlzIHVubG9hZGVkIHRvIHJlbW92ZSBpdHMgb3BlbiBwb3BvdXRzXHJcbiAgICAgKi9cclxuXHJcbiAgICBjbG9zZUFsbE9wZW5Qb3BvdXRzKHByZXZlbnRQb3BJbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9vcGVuUG9wb3V0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9vcGVuUG9wb3V0c1tpXS5jbG9zZShwcmV2ZW50UG9wSW4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb3BlblBvcG91dHMubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmluZykge1xyXG4gICAgICAgICAgICBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0YWNoZXMgRHJhZ0xpc3RlbmVyIHRvIGFueSBnaXZlbiBET00gZWxlbWVudFxyXG4gICAgICogYW5kIHR1cm5zIGl0IGludG8gYSB3YXkgb2YgY3JlYXRpbmcgbmV3IENvbXBvbmVudEl0ZW1zXHJcbiAgICAgKiBieSAnZHJhZ2dpbmcnIHRoZSBET00gZWxlbWVudCBpbnRvIHRoZSBsYXlvdXRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBIVE1MIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBsaXN0ZW5lZCB0byBmb3IgY29tbWVuY2VtZW50IG9mIGRyYWcuXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZU9ySXRlbUNvbmZpZ0NhbGxiYWNrIC0gVHlwZSBvZiBjb21wb25lbnQgdG8gYmUgY3JlYXRlZCwgb3IgYSBjYWxsYmFjayB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIEl0ZW1Db25maWdcclxuICAgICAqIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50U3RhdGUgLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlIG9mIGNvbXBvbmVudC4gIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIGNvbXBvbmVudFR5cGVPckZ0biBpcyBhIGZ1bmN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIGFuIG9wYXF1ZSBvYmplY3QgdGhhdCBpZGVudGlmaWVzIHRoZSBET00gZWxlbWVudFxyXG5cdCAqICAgICAgICAgIGFuZCB0aGUgYXR0YWNoZWQgaXRlbUNvbmZpZy4gVGhpcyBjYW4gYmUgdXNlZCBpblxyXG5cdCAqICAgICAgICAgIHJlbW92ZURyYWdTb3VyY2UoKSBsYXRlciB0byBnZXQgcmlkIG9mIHRoZSBkcmFnIGxpc3RlbmVycy5cclxuICAgICAqL1xyXG4gICAgbmV3RHJhZ1NvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCwgaXRlbUNvbmZpZ0NhbGxiYWNrOiAoKSA9PiAoRHJhZ1NvdXJjZS5Db21wb25lbnRJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZykpOiBEcmFnU291cmNlO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVwbGFjZWQgaW4gdmVyc2lvbiAzIHdpdGggbmV3RHJhZ1NvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCwgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZykgKi9cclxuICAgIG5ld0RyYWdTb3VyY2UoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogSnNvblZhbHVlLCBpZD86IHN0cmluZyk6IERyYWdTb3VyY2U7XHJcbiAgICBuZXdEcmFnU291cmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIGNvbXBvbmVudFR5cGVPckl0ZW1Db25maWdDYWxsYmFjazogSnNvblZhbHVlIHwgKCgpID0+IChEcmFnU291cmNlLkNvbXBvbmVudEl0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnKSksXHJcbiAgICAgICAgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsXHJcbiAgICAgICAgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICAgICAgaWQ/OiBzdHJpbmcsXHJcbiAgICApOiBEcmFnU291cmNlIHtcclxuICAgICAgICBjb25zdCBkcmFnU291cmNlID0gbmV3IERyYWdTb3VyY2UodGhpcywgZWxlbWVudCwgW10sIGNvbXBvbmVudFR5cGVPckl0ZW1Db25maWdDYWxsYmFjaywgY29tcG9uZW50U3RhdGUsIHRpdGxlLCBpZCk7XHJcbiAgICAgICAgdGhpcy5fZHJhZ1NvdXJjZXMucHVzaChkcmFnU291cmNlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRyYWdTb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogUmVtb3ZlcyBhIERyYWdMaXN0ZW5lciBhZGRlZCBieSBjcmVhdGVEcmFnU291cmNlKCkgc28gdGhlIGNvcnJlc3BvbmRpbmdcclxuXHQgKiBET00gZWxlbWVudCBpcyBub3QgYSBkcmFnIHNvdXJjZSBhbnkgbW9yZS5cclxuXHQgKi9cclxuXHRyZW1vdmVEcmFnU291cmNlKGRyYWdTb3VyY2U6IERyYWdTb3VyY2UpOiB2b2lkIHtcclxuXHRcdHJlbW92ZUZyb21BcnJheShkcmFnU291cmNlLCB0aGlzLl9kcmFnU291cmNlcyApO1xyXG5cdFx0ZHJhZ1NvdXJjZS5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBzdGFydEV4dGVybmFsQ29tcG9uZW50RHJhZyhwYXJlbnQ6IERyYWdBY3Rpb24pIHtcclxuICAgICAgICBEcmFnQWN0aW9uLnNwYXduKHRoaXMsIHBhcmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc3RhcnRDb21wb25lbnREcmFnKHg6IG51bWJlciwgeTogbnVtYmVyLCBkcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGlzTGFzdCA9IGNvbXBvbmVudEl0ZW0uZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCkgPT09IG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsbG93UG9wb3V0ID1cclxuICAgICAgICAgICAgY29tcG9uZW50SXRlbS5pc0Nsb3NhYmxlICYmXHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLmRyYWdUb05ld1dpbmRvdyAmJlxyXG4gICAgICAgICAgICAodGhpcy5wYXJlbnQgPT09IG51bGwgfHwgIWlzTGFzdCk7ICAgICAgICAgICAgICAgICAgLy8gUG9wb3V0IGlzIGRlc3Ryb3llZCB3aGVuIGxhc3QgY29tcG9uZW50IGlzIHJlbW92ZWQsIGRyYWcgdG8gbmV3IHBvcG91dCBtYWtlcyBubyBzZW5zZVxyXG5cclxuICAgICAgICBjb25zdCBjYW5Nb3ZlQmV0d2VlbldpbmRvd3MgPVxyXG4gICAgICAgICAgICBjb21wb25lbnRJdGVtLmlzQ2xvc2FibGUgJiZcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRDb25maWcuc2V0dGluZ3MuZHJhZ0JldHdlZW5XaW5kb3dzICYmXHJcbiAgICAgICAgICAgICh0aGlzLl9wYXJlbnQgPz8gdGhpcykuX29wZW5Qb3BvdXRzLmxlbmd0aCA+IDA7ICAgICAvLyBBcmUgdGhlcmUgZXZlbiBtdWx0aXBsZSB3aW5kb3dzP1xyXG5cclxuICAgICAgICAvLyBDYW5jZWwgdGhlIGRyYWcgaWYgdGhpcyBpcyB0aGUgbGFzdCBjb21wb25lbnQgYW5kIHRoZXJlIGFyZSBubyB2YWxpZCBleHRlcm5hbCB0YXJnZXRzLlxyXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSwgb25seSB0aGUgY3VycmVudCBsYXlvdXQgY29uZmlndXJhdGlvbiBpcyBwb3NzaWJsZSwgc28gdGhlcmUgaXMgbm8gcG9pbnQgaW4gZHJhZ2dpbmcuXHJcbiAgICAgICAgaWYgKGlzTGFzdCAmJiAhYWxsb3dQb3BvdXQgJiYgIWNhbk1vdmVCZXR3ZWVuV2luZG93cykge1xyXG4gICAgICAgICAgICBkcmFnTGlzdGVuZXIuY2FuY2VsRHJhZygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhY3Rpb24gPSBEcmFnQWN0aW9uLnN0YXJ0KHRoaXMsIGRyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbSwgeCwgeSwgYWxsb3dQb3BvdXQpO1xyXG5cclxuICAgICAgICBpZiAoY2FuTW92ZUJldHdlZW5XaW5kb3dzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGxtIG9mIHRoaXMuaW5zdGFuY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobG0gIT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBsbS5zdGFydEV4dGVybmFsQ29tcG9uZW50RHJhZyhhY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGhpZGVEcm9wVGFyZ2V0SW5kaWNhdG9yKCkge1xyXG4gICAgICAgIHRoaXMudGFiRHJvcFBsYWNlaG9sZGVyLnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMuZHJvcFRhcmdldEluZGljYXRvcj8uaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZ3JhbW1hdGljYWxseSBmb2N1c2VzIGFuIGl0ZW0uIFRoaXMgZm9jdXNlcyB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBpdGVtXHJcbiAgICAgKiBhbmQgdGhlIGl0ZW0gZW1pdHMgYSBmb2N1cyBldmVudFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpdGVtIC0gVGhlIGNvbXBvbmVudCBpdGVtIHRvIGJlIGZvY3VzZWRcclxuICAgICAqIEBwYXJhbSBzdXBwcmVzc0V2ZW50IC0gV2hldGhlciB0byBlbWl0IGZvY3VzIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIGZvY3VzQ29tcG9uZW50KGl0ZW06IENvbXBvbmVudEl0ZW0sIHN1cHByZXNzRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGl0ZW0uZm9jdXMoc3VwcHJlc3NFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9ncmFtbWF0aWNhbGx5IGJsdXJzIChkZWZvY3VzZXMpIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBjb21wb25lbnQuXHJcbiAgICAgKiBJZiBhIGNvbXBvbmVudCBpdGVtIGlzIGZvY3VzZWQsIHRoZW4gaXQgaXMgYmx1cnJlZCBhbmQgYW5kIHRoZSBpdGVtIGVtaXRzIGEgYmx1ciBldmVudFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpdGVtIC0gVGhlIGNvbXBvbmVudCBpdGVtIHRvIGJlIGJsdXJyZWRcclxuICAgICAqIEBwYXJhbSBzdXBwcmVzc0V2ZW50IC0gV2hldGhlciB0byBlbWl0IGJsdXIgZXZlbnRcclxuICAgICAqL1xyXG4gICAgY2xlYXJDb21wb25lbnRGb2N1cyhzdXBwcmVzc0V2ZW50ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldEZvY3VzZWRDb21wb25lbnRJdGVtKHVuZGVmaW5lZCwgc3VwcHJlc3NFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9ncmFtbWF0aWNhbGx5IGZvY3VzZXMgYSBjb21wb25lbnQgaXRlbSBvciByZW1vdmVzIGZvY3VzIChibHVycykgZnJvbSBhbiBleGlzdGluZyBmb2N1c2VkIGNvbXBvbmVudCBpdGVtLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpdGVtIC0gSWYgZGVmaW5lZCwgc3BlY2lmaWVzIHRoZSBjb21wb25lbnQgaXRlbSB0byBiZSBnaXZlbiBmb2N1cy4gIElmIHVuZGVmaW5lZCwgY2xlYXIgY29tcG9uZW50IGZvY3VzLlxyXG4gICAgICogQHBhcmFtIHN1cHByZXNzRXZlbnRzIC0gV2hldGhlciB0byBlbWl0IGZvY3VzIGFuZCBibHVyIGV2ZW50c1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHNldEZvY3VzZWRDb21wb25lbnRJdGVtKGl0ZW06IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWQsIHN1cHByZXNzRXZlbnRzID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAoaXRlbSAhPT0gdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0pIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBuZXdGb2N1c2VkUGFyZW50SXRlbTogQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0gfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGlmIChpdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG5ld0ZvY3VzZWRQYXJlbnRJdGVtID09PSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBuZXdGb2N1c2VkUGFyZW50SXRlbSA9IGl0ZW0ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZEZvY3VzZWRJdGVtID0gdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIG9sZEZvY3VzZWRJdGVtLnNldEJsdXJyZWQoc3VwcHJlc3NFdmVudHMpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkRm9jdXNlZFBhcmVudEl0ZW0gPSBvbGRGb2N1c2VkSXRlbS5wYXJlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld0ZvY3VzZWRQYXJlbnRJdGVtID09PSBvbGRGb2N1c2VkUGFyZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0ZvY3VzZWRQYXJlbnRJdGVtID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBvbGRGb2N1c2VkUGFyZW50SXRlbS5zZXRGb2N1c2VkVmFsdWUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICBpdGVtLnNldEZvY3VzZWQoc3VwcHJlc3NFdmVudHMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld0ZvY3VzZWRQYXJlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdGb2N1c2VkUGFyZW50SXRlbS5zZXRGb2N1c2VkVmFsdWUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVDb250ZW50SXRlbUZyb21Db25maWcoY29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcsIHBhcmVudDogQ29udGVudEl0ZW0pOiBDb250ZW50SXRlbSB7XHJcbiAgICAgICAgc3dpdGNoIChjb25maWcudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDogdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTUNDSUZDNjg4NzEnKTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6IHJldHVybiBuZXcgUm93T3JDb2x1bW4oZmFsc2UsIHRoaXMsIGNvbmZpZyBhcyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46IHJldHVybiBuZXcgUm93T3JDb2x1bW4odHJ1ZSwgdGhpcywgY29uZmlnIGFzIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLCBwYXJlbnQpO1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOiByZXR1cm4gbmV3IFN0YWNrKHRoaXMsIGNvbmZpZyBhcyBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudEl0ZW0odGhpcywgY29uZmlnIGFzIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZywgcGFyZW50IGFzIFN0YWNrKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignQ0NDOTEzNTY0JywgY29uZmlnLnR5cGUsICdJbnZhbGlkIENvbmZpZyBJdGVtIHR5cGUgc3BlY2lmaWVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBzdGFjayBjb21wb25lbnQuXHJcbiAgICAgKiBTdGFjayB3aWxsIGxvb2sgYWZ0ZXIgZG9ja2luZyBwcm9jZXNzaW5nIGFzc29jaWF0ZWQgd2l0aCBtYXhpbWlzZS9taW5pbWlzZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKiovXHJcbiAgICBzZXRNYXhpbWlzZWRTdGFjayhzdGFjazogU3RhY2sgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoc3RhY2sgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VkU3RhY2sgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHN0YWNrICE9PSB0aGlzLl9tYXhpbWlzZWRTdGFjaykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZFN0YWNrICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NNaW5pbWlzZU1heGltaXNlZFN0YWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTWF4aW1pc2VTdGFjayhzdGFjayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tNaW5pbWlzZU1heGltaXNlZFN0YWNrKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZWRTdGFjayAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21heGltaXNlZFN0YWNrLm1pbmltaXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHNob3dBbGxBY3RpdmVDb250ZW50SXRlbXMoKSB3YXMgY2FsbGVkIGZyb20gQ29udGVudEl0ZW0uc2hvdygpLiAgTm90IHN1cmUgd2hhdCBpdHMgcHVycG9zZSB3YXMgc28gaGF2ZSBjb21tZW50ZWQgb3V0XHJcbiAgICAvLyBFdmVyeXRoaW5nIHNlZW1zIHRvIHdvcmsgb2sgd2l0aG91dCB0aGlzLiAgSGF2ZSBsZWZ0IGNvbW1lbnRlZCBjb2RlIGp1c3QgaW4gY2FzZSB0aGVyZSB3YXMgYSByZWFzb24gZm9yIGl0IGJlY29tZXNcclxuICAgIC8vIGFwcGFyZW50XHJcblxyXG4gICAgLy8gLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgLy8gc2hvd0FsbEFjdGl2ZUNvbnRlbnRJdGVtcygpOiB2b2lkIHtcclxuICAgIC8vICAgICBjb25zdCBhbGxTdGFja3MgPSB0aGlzLmdldEFsbFN0YWNrcygpO1xyXG5cclxuICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFN0YWNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICBjb25zdCBzdGFjayA9IGFsbFN0YWNrc1tpXTtcclxuICAgIC8vICAgICAgICAgY29uc3QgYWN0aXZlQ29udGVudEl0ZW0gPSBzdGFjay5nZXRBY3RpdmVDb21wb25lbnRJdGVtKCk7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoYWN0aXZlQ29udGVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKCEoYWN0aXZlQ29udGVudEl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRJdGVtKSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1TQUFDSVMyMjI5OCcpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBhY3RpdmVDb250ZW50SXRlbS5jb250YWluZXIuc2hvdygpO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIGhpZGVBbGxBY3RpdmVDb250ZW50SXRlbXMoKSB3YXMgY2FsbGVkIGZyb20gQ29udGVudEl0ZW0uaGlkZSgpLiAgTm90IHN1cmUgd2hhdCBpdHMgcHVycG9zZSB3YXMgc28gaGF2ZSBjb21tZW50ZWQgb3V0XHJcbiAgICAvLyBFdmVyeXRoaW5nIHNlZW1zIHRvIHdvcmsgb2sgd2l0aG91dCB0aGlzLiAgSGF2ZSBsZWZ0IGNvbW1lbnRlZCBjb2RlIGp1c3QgaW4gY2FzZSB0aGVyZSB3YXMgYSByZWFzb24gZm9yIGl0IGJlY29tZXNcclxuICAgIC8vIGFwcGFyZW50XHJcblxyXG4gICAgLy8gLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgLy8gaGlkZUFsbEFjdGl2ZUNvbnRlbnRJdGVtcygpOiB2b2lkIHtcclxuICAgIC8vICAgICBjb25zdCBhbGxTdGFja3MgPSB0aGlzLmdldEFsbFN0YWNrcygpO1xyXG5cclxuICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFN0YWNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICBjb25zdCBzdGFjayA9IGFsbFN0YWNrc1tpXTtcclxuICAgIC8vICAgICAgICAgY29uc3QgYWN0aXZlQ29udGVudEl0ZW0gPSBzdGFjay5nZXRBY3RpdmVDb21wb25lbnRJdGVtKCk7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoYWN0aXZlQ29udGVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKCEoYWN0aXZlQ29udGVudEl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRJdGVtKSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1TQUFDSUgyMjI5OCcpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBhY3RpdmVDb250ZW50SXRlbS5jb250YWluZXIuaGlkZSgpO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgY2xlYW51cEJlZm9yZU1heGltaXNlZFN0YWNrRGVzdHJveWVkKGV2ZW50OiBFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudCkge1xyXG5cdFx0aWYgKHRoaXMuX21heGltaXNlZFN0YWNrICE9PSBudWxsICYmIHRoaXMuX21heGltaXNlZFN0YWNrID09PSBldmVudC50YXJnZXQpIHtcclxuXHRcdFx0dGhpcy5fbWF4aW1pc2VkU3RhY2sub2ZmKCdiZWZvcmVJdGVtRGVzdHJveWVkJywgdGhpcy5fbWF4aW1pc2VkU3RhY2tCZWZvcmVEZXN0cm95ZWRMaXN0ZW5lcik7XHJcblx0XHRcdHRoaXMuX21heGltaXNlZFN0YWNrID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgYXJvdW5kIHNhbmRib3hlZCBpZnJhbWUgcmVzdHJpY3Rpb25zLlxyXG4gICAgICogSWYgJ2FsbG93LXRvcC1uYXZpZ2F0aW9uJyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBpZnJhbWUncyAnc2FuZGJveCcgYXR0cmlidXRlXHJcbiAgICAgKiAoYXMgaXMgdGhlIGNhc2Ugd2l0aCBjb2RlcGVucykgdGhlIHBhcmVudCB3aW5kb3cgaXMgZm9yYmlkZGVuIGZyb20gY2FsbGluZyBjZXJ0YWluXHJcbiAgICAgKiBtZXRob2RzIG9uIHRoZSBjaGlsZCwgc3VjaCBhcyB3aW5kb3cuY2xvc2UoKSBvciBzZXR0aW5nIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBwcmV2ZW50ZWQgR29sZGVuTGF5b3V0IHBvcG91dHMgZnJvbSBwb3BwaW5nIGluIGluIGNvZGVwZW5zLiBUaGUgZml4IGlzIHRvIGNhbGxcclxuICAgICAqIF8kY2xvc2VXaW5kb3cgb24gdGhlIGNoaWxkIHdpbmRvdydzIGdsIGluc3RhbmNlIHdoaWNoIChhZnRlciBhIHRpbWVvdXQgdG8gZGlzY29ubmVjdFxyXG4gICAgICogdGhlIGludm9raW5nIG1ldGhvZCBmcm9tIHRoZSBjbG9zZSBjYWxsKSBjbG9zZXMgaXRzZWxmLlxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBjbG9zZVdpbmRvdygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4gZ2xvYmFsVGhpcy5jbG9zZSgpLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXRBcmVhKHg6IG51bWJlciwgeTogbnVtYmVyKTogQ29udGVudEl0ZW0uQXJlYSB8IG51bGwge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1HQTQ0MzY1Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBncm91bmRBcmVhID0gdGhpcy5fZ3JvdW5kSXRlbS5nZXRFbGVtZW50QXJlYSgpO1xyXG4gICAgICAgIGxldCBtYXRjaGluZ0FyZWE6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBsZXQgc21hbGxlc3RTdXJmYWNlID0gSW5maW5pdHk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5faXRlbUFyZWFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLl9pdGVtQXJlYXNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICB4ID49IGFyZWEueDEgJiZcclxuICAgICAgICAgICAgICAgIHggPCBhcmVhLngyICYmIC8vIHgyIGlzIG5vdCBpbmNsdWRlZCBpbiBhcmVhXHJcbiAgICAgICAgICAgICAgICB5ID49IGFyZWEueTEgJiZcclxuICAgICAgICAgICAgICAgIHkgPCBhcmVhLnkyICYmIC8vIHkyIGlzIG5vdCBpbmNsdWRlZCBpbiBhcmVhXHJcbiAgICAgICAgICAgICAgICBzbWFsbGVzdFN1cmZhY2UgPiBhcmVhLnN1cmZhY2VcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBzbWFsbGVzdFN1cmZhY2UgPSBhcmVhLnN1cmZhY2U7XHJcbiAgICAgICAgICAgICAgICBtYXRjaGluZ0FyZWEgPSBhcmVhO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIG1hdGNoaW5nIGFyZWEsIHJldHVybiB0aGUgbGFzdCBhcmVhIGluc3RlYWQgKHVubGVzcyB3ZSBhcmUgb3V0IG9mIGJvdW5kcyBvZiB0aGUgZ3JvdW5kIGl0ZW0pLlxyXG4gICAgICAgIC8vIEF2b2lkcyBpc3N1ZXMgd2l0aCBzcGxpdHRlcnMgd2hpY2ggZG9uJ3QgaGF2ZSBhbiBhcmVhIHRoZW1zZWx2ZXMuXHJcbiAgICAgICAgaWYgKG1hdGNoaW5nQXJlYSAhPT0gbnVsbCB8fCB4IDwgZ3JvdW5kQXJlYS54MSB8fCB4ID49IGdyb3VuZEFyZWEueDIgfHwgeSA8IGdyb3VuZEFyZWEueTEgfHwgeSA+PSBncm91bmRBcmVhLnkyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RBcmVhID0gbWF0Y2hpbmdBcmVhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RBcmVhO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNhbGN1bGF0ZUl0ZW1BcmVhcygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhbGxDb250ZW50SXRlbXMgPSB0aGlzLmdldEFsbENvbnRlbnRJdGVtcygpO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRoZSBsYXN0IGl0ZW0gaXMgZHJhZ2dlZCBvdXQsIGhpZ2hsaWdodCB0aGUgZW50aXJlIGNvbnRhaW5lciBzaXplIHRvXHJcbiAgICAgICAgICogYWxsb3cgdG8gcmUtZHJvcCBpdC4gdGhpcy5ncm91bmQuY29udGVudGlJdGVtcy5sZW5ndGggPT09IDAgYXQgdGhpcyBwb2ludFxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogRG9uJ3QgaW5jbHVkZSBncm91bmQgaW50byB0aGUgcG9zc2libGUgZHJvcCBhcmVhcyB0aG91Z2ggb3RoZXJ3aXNlIHNpbmNlIGl0XHJcbiAgICAgICAgICogd2lsbCB1c2VkIGZvciBldmVyeSBnYXAgaW4gdGhlIGxheW91dCwgZS5nLiBzcGxpdHRlcnNcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBncm91bmRJdGVtID0gdGhpcy5fZ3JvdW5kSXRlbTtcclxuICAgICAgICBpZiAoZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQ0lBUjQ0MzY1Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGFsbENvbnRlbnRJdGVtcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vIHJvb3QgQ29udGVudEl0ZW0gKGp1c3QgR3JvdW5kIENvbnRlbnRJdGVtKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdW5kQXJlYSA9IGdyb3VuZEl0ZW0uZ2V0RWxlbWVudEFyZWEoKTtcclxuICAgICAgICAgICAgICAgIGlmIChncm91bmRBcmVhID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0xNQ0lBUkE0NDM2NScpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1BcmVhcyA9IFtncm91bmRBcmVhXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChncm91bmRJdGVtLmNvbnRlbnRJdGVtc1swXS5pc1N0YWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgcm9vdCBpcyBTdGFjaywgdGhlbiBzcGxpdCBzdGFjayBhbmQgc2lkZXMgb2YgTGF5b3V0IGFyZSBzYW1lLCBzbyBza2lwIHNpZGVzXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXRlbUFyZWFzID0gW107XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNpZGVzIG9mIGxheW91dFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1BcmVhcyA9IGdyb3VuZEl0ZW0uY3JlYXRlU2lkZUFyZWFzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxDb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IGFsbENvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQ29udGVudEl0ZW0uaXNTdGFjayhzdGFjaykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJlYSA9IHN0YWNrLmdldEFyZWEoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmVhID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1BcmVhcy5wdXNoKGFyZWEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2tDb250ZW50QXJlYURpbWVuc2lvbnMgPSBzdGFjay5jb250ZW50QXJlYURpbWVuc2lvbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tDb250ZW50QXJlYURpbWVuc2lvbnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQ0lBU0M0NTU5OScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdobGlnaHRBcmVhID0gc3RhY2tDb250ZW50QXJlYURpbWVuc2lvbnMuaGVhZGVyLmhpZ2hsaWdodEFyZWFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXJmYWNlID0gKGhpZ2hsaWdodEFyZWEueDIgLSBoaWdobGlnaHRBcmVhLngxKSAqIChoaWdobGlnaHRBcmVhLnkyIC0gaGlnaGxpZ2h0QXJlYS55MSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcjogQ29udGVudEl0ZW0uQXJlYSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDE6IGhpZ2hsaWdodEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyOiBoaWdobGlnaHRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MTogaGlnaGxpZ2h0QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTI6IGhpZ2hsaWdodEFyZWEueTIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtOiBzdGFjayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1BcmVhcy5wdXNoKGhlYWRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYXMgcGFydCBvZiBsb2FkaW5nIGEgbmV3IGxheW91dCAoaW5jbHVkaW5nIGluaXRpYWwgaW5pdCgpKS5cclxuICAgICAqIENoZWNrcyB0byBzZWUgbGF5b3V0IGhhcyBhIG1heGltaXNlZCBpdGVtLiBJZiBzbywgaXQgbWF4aW1pc2VzIHRoYXQgaXRlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNoZWNrTG9hZGVkTGF5b3V0TWF4aW1pc2VJdGVtKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1DTExNSTQzNDMyJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY29uZmlnTWF4aW1pc2VkSXRlbXMgPSB0aGlzLl9ncm91bmRJdGVtLmdldENvbmZpZ01heGltaXNlZEl0ZW1zKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29uZmlnTWF4aW1pc2VkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBjb25maWdNYXhpbWlzZWRJdGVtc1swXTtcclxuICAgICAgICAgICAgICAgIGlmIChDb250ZW50SXRlbS5pc0NvbXBvbmVudEl0ZW0oaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IGl0ZW0ucGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFjayA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignTE1YTExNSTY5OTk5Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHN0YWNrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghQ29udGVudEl0ZW0uaXNTdGFjayhpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1DTExNSTE5OTkzJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ubWF4aW1pc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHByb2Nlc3NNYXhpbWlzZVN0YWNrKHN0YWNrOiBTdGFjayk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX21heGltaXNlZFN0YWNrID0gc3RhY2s7XHJcbiAgICAgICAgc3RhY2sub24oJ2JlZm9yZUl0ZW1EZXN0cm95ZWQnLCB0aGlzLl9tYXhpbWlzZWRTdGFja0JlZm9yZURlc3Ryb3llZExpc3RlbmVyKTtcclxuICAgICAgICBzdGFjay5lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5NYXhpbWlzZWQpO1xyXG4gICAgICAgIHN0YWNrLmVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHRoaXMuX21heGltaXNlUGxhY2Vob2xkZXIpO1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1NWEkxOTk5MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uZWxlbWVudC5wcmVwZW5kKHN0YWNrLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCh0aGlzLl9jb250YWluZXJFbGVtZW50KTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHN0YWNrLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodChzdGFjay5lbGVtZW50LCBoZWlnaHQpO1xyXG4gICAgICAgICAgICBzdGFjay51cGRhdGVTaXplKHRydWUpO1xyXG4gICAgICAgICAgICBzdGFjay5mb2N1c0FjdGl2ZUNvbnRlbnRJdGVtKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX21heGltaXNlZFN0YWNrLmVtaXQoJ21heGltaXNlZCcpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHByb2Nlc3NNaW5pbWlzZU1heGltaXNlZFN0YWNrKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZWRTdGFjayA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1NTVM3NDQyMicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5fbWF4aW1pc2VkU3RhY2s7XHJcbiAgICAgICAgICAgIGlmIChzdGFjay5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdMTU1JMTM2NjgnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0YWNrLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLk1heGltaXNlZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhpbWlzZVBsYWNlaG9sZGVyLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBzdGFjay5lbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21heGltaXNlUGxhY2Vob2xkZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJvb3RTaXplKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VkU3RhY2sgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5vZmYoJ2JlZm9yZUl0ZW1EZXN0cm95ZWQnLCB0aGlzLl9tYXhpbWlzZWRTdGFja0JlZm9yZURlc3Ryb3llZExpc3RlbmVyKTtcclxuICAgICAgICAgICAgICAgIHN0YWNrLmVtaXQoJ21pbmltaXNlZCcpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGFycmF5IG9mIG9wZW4gcG9wb3V0IHdpbmRvd3MgYW5kIHJlbW92ZXMgdGhlIG9uZXNcclxuICAgICAqIHRoYXQgYXJlIGVmZmVjdGl2ZWx5IGNsb3NlZC4gVGhpcyBpcyBuZWNlc3NhcnkgZHVlIHRvIHRoZSBsYWNrIG9mIHJlbGlhYmx5XHJcbiAgICAgKiBsaXN0ZW5pbmcgZm9yIHdpbmRvdy5jbG9zZSAvIHVubG9hZCBldmVudHMgaW4gYSBjcm9zcyBicm93c2VyIGNvbXBhdGlibGUgZmFzaGlvbi5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlY29uY2lsZVBvcG91dFdpbmRvd3MoKSB7XHJcbiAgICAgICAgY29uc3Qgb3BlblBvcG91dHM6IEJyb3dzZXJQb3BvdXRbXSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX29wZW5Qb3BvdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcGVuUG9wb3V0c1tpXS5nZXRXaW5kb3coKS5jbG9zZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBvcGVuUG9wb3V0cy5wdXNoKHRoaXMuX29wZW5Qb3BvdXRzW2ldKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnd2luZG93Q2xvc2VkJywgdGhpcy5fb3BlblBvcG91dHNbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fb3BlblBvcG91dHMubGVuZ3RoICE9PSBvcGVuUG9wb3V0cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5fb3BlblBvcG91dHMgPSBvcGVuUG9wb3V0cztcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGZsYXR0ZW5lZCBhcnJheSBvZiBhbGwgY29udGVudCBpdGVtcyxcclxuICAgICAqIHJlZ2FyZGxlcyBvZiBsZXZlbCBvciB0eXBlXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRBbGxDb250ZW50SXRlbXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUdBQ0kxMzEzMCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ncm91bmRJdGVtLmdldEFsbENvbnRlbnRJdGVtcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgU3Vid2luZG93cyAoaWYgdGhlcmUgYXJlIGFueSkuIFRocm93cyBhbiBlcnJvclxyXG4gICAgICogaWYgcG9wb3V0cyBhcmUgYmxvY2tlZC5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVN1YldpbmRvd3MoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxheW91dENvbmZpZy5vcGVuUG9wb3V0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwb3BvdXRDb25maWcgPSB0aGlzLmxheW91dENvbmZpZy5vcGVuUG9wb3V0c1tpXTtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVQb3BvdXRGcm9tUG9wb3V0TGF5b3V0Q29uZmlnKHBvcG91dENvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVib3VuY2VzIHJlc2l6ZSBldmVudHNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUNvbnRhaW5lclJlc2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5yZXNpemVXaXRoQ29udGFpbmVyQXV0b21hdGljYWxseSkge1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXNpemVXaXRoRGVib3VuY2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWJvdW5jZXMgcmVzaXplIGV2ZW50c1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcHJvY2Vzc1Jlc2l6ZVdpdGhEZWJvdW5jZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5yZXNpemVEZWJvdW5jZUV4dGVuZGVkV2hlblBvc3NpYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDbGVhclJlc2l6ZVRpbWVvdXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yZXNpemVUaW1lb3V0SWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNpemVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZVRpbWVvdXRJZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplRGVib3VuY2VJbnRlcnZhbCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja0NsZWFyUmVzaXplVGltZW91dCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcmVzaXplVGltZW91dElkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Jlc2l6ZVRpbWVvdXRJZCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZVRpbWVvdXRJZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmVzIHdoYXQgZWxlbWVudCB0aGUgbGF5b3V0IHdpbGwgYmUgY3JlYXRlZCBpblxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0Q29udGFpbmVyKCkge1xyXG4gICAgICAgIGNvbnN0IGJvZHlFbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcclxuICAgICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5fY29udGFpbmVyRWxlbWVudCA/PyBib2R5RWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lckVsZW1lbnQgPT09IGJvZHlFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzaXplV2l0aENvbnRhaW5lckF1dG9tYXRpY2FsbHkgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG4gICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xyXG4gICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuc3R5bGUubWFyZ2luID0gJzAnO1xyXG4gICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcwJztcclxuICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XHJcbiAgICAgICAgICAgIGJvZHlFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcclxuICAgICAgICAgICAgYm9keUVsZW1lbnQuc3R5bGUubWFyZ2luID0gJzAnO1xyXG4gICAgICAgICAgICBib2R5RWxlbWVudC5zdHlsZS5wYWRkaW5nID0gJzAnO1xyXG4gICAgICAgICAgICBib2R5RWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lckVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgd2luZG93IGlzIGNsb3NlZCBvciB0aGUgdXNlciBuYXZpZ2F0ZXMgYXdheVxyXG4gICAgICogZnJvbSB0aGUgcGFnZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB0byBiZSByZW1vdmVkIGluIHZlcnNpb24gM1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uQmVmb3JlVW5sb2FkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRqdXN0cyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgdG8gYmUgbG93ZXIgdG8gZml0IHRoZSBzY3JlZW4gYW5kIHN0aWxsIG1haW50YWluIG1pbkl0ZW1XaWR0aC5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFkanVzdENvbHVtbnNSZXNwb25zaXZlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1BQ1IyMDg4MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0TG9hZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBtaW4gd2lkdGggc2V0LCBvciBub3QgY29udGVudCBpdGVtcywgZG8gbm90aGluZy5cclxuICAgICAgICAgICAgaWYgKHRoaXMudXNlUmVzcG9uc2l2ZUxheW91dCgpICYmXHJcbiAgICAgICAgICAgICAgICAhdGhpcy5fdXBkYXRpbmdDb2x1bW5zUmVzcG9uc2l2ZSAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF0uaXNSb3cpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd2lkdGggPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUFDUjc3NDEyJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIGNvbHVtbiwgZG8gbm90aGluZy5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5Db3VudCA9IHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zWzBdLmNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkNvdW50IDw9IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXkgYWxsIHN0aWxsIGZpdCwgZG8gbm90aGluZy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWluSXRlbVdpZHRoID0gdGhpcy5sYXlvdXRDb25maWcuZGltZW5zaW9ucy5kZWZhdWx0TWluSXRlbVdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3RhbE1pbldpZHRoID0gY29sdW1uQ291bnQgKiBtaW5JdGVtV2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbE1pbldpZHRoIDw9IHRoaXMuX3dpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHVwZGF0ZXMgd2hpbGUgaXQgaXMgYWxyZWFkeSBoYXBwZW5pbmcuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ0NvbHVtbnNSZXNwb25zaXZlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IGhvdyBtYW55IGNvbHVtbnMgdG8gc3RhY2ssIGFuZCBwdXQgdGhlbSBhbGwgaW4gdGhlIGZpcnN0IHN0YWNrIGNvbnRhaW5lci5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsQ29sdW1uQ291bnQgPSBNYXRoLm1heChNYXRoLmZsb29yKHRoaXMuX3dpZHRoIC8gbWluSXRlbVdpZHRoKSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFja0NvbHVtbkNvdW50ID0gY29sdW1uQ291bnQgLSBmaW5hbENvbHVtbkNvdW50O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvb3RDb250ZW50SXRlbSA9IHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsU3RhY2tzID0gdGhpcy5nZXRBbGxTdGFja3MoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxTdGFja3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTUFDUlM3NzQxMycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0U3RhY2tDb250YWluZXIgPSBhbGxTdGFja3NbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFja0NvbHVtbkNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhY2sgZnJvbSByaWdodC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW1uID0gcm9vdENvbnRlbnRJdGVtLmNvbnRlbnRJdGVtc1tyb290Q29udGVudEl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkQ29udGVudEl0ZW1zVG9Db250YWluZXIoZmlyc3RTdGFja0NvbnRhaW5lciwgY29sdW1uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nQ29sdW1uc1Jlc3BvbnNpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZXMgaWYgcmVzcG9uc2l2ZSBsYXlvdXQgc2hvdWxkIGJlIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiByZXNwb25zaXZlIGxheW91dCBzaG91bGQgYmUgdXNlZDsgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXNlUmVzcG9uc2l2ZUxheW91dCgpIHtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzO1xyXG4gICAgICAgIGNvbnN0IGFsd2F5c1Jlc3BvbnNpdmVNb2RlID0gc2V0dGluZ3MucmVzcG9uc2l2ZU1vZGUgPT09IFJlc3BvbnNpdmVNb2RlLmFsd2F5cztcclxuICAgICAgICBjb25zdCBvbkxvYWRSZXNwb25zaXZlTW9kZUFuZEZpcnN0ID0gc2V0dGluZ3MucmVzcG9uc2l2ZU1vZGUgPT09IFJlc3BvbnNpdmVNb2RlLm9ubG9hZCAmJiB0aGlzLl9maXJzdExvYWQ7XHJcbiAgICAgICAgcmV0dXJuIGFsd2F5c1Jlc3BvbnNpdmVNb2RlIHx8IG9uTG9hZFJlc3BvbnNpdmVNb2RlQW5kRmlyc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGFsbCBjaGlsZHJlbiBvZiBhIG5vZGUgdG8gYW5vdGhlciBjb250YWluZXIgcmVjdXJzaXZlbHkuXHJcbiAgICAgKiBAcGFyYW0gY29udGFpbmVyIC0gQ29udGFpbmVyIHRvIGFkZCBjaGlsZCBjb250ZW50IGl0ZW1zIHRvLlxyXG4gICAgICogQHBhcmFtIG5vZGUgLSBOb2RlIHRvIHNlYXJjaCBmb3IgY29udGVudCBpdGVtcy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFkZENoaWxkQ29udGVudEl0ZW1zVG9Db250YWluZXIoY29udGFpbmVyOiBDb250ZW50SXRlbSwgbm9kZTogQ29udGVudEl0ZW0pIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSBub2RlLmNvbnRlbnRJdGVtcztcclxuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFN0YWNrKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChpdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRDaGlsZChpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZENvbnRlbnRJdGVtc1RvQ29udGFpbmVyKGNvbnRhaW5lciwgaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyBhbGwgdGhlIHN0YWNrcy5cclxuICAgICAqIEByZXR1cm5zIFRoZSBmb3VuZCBzdGFjayBjb250YWluZXJzLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0QWxsU3RhY2tzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1GQVNDNTI3NzgnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFja3M6IFN0YWNrW10gPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5maW5kQWxsU3RhY2tzUmVjdXJzaXZlKHN0YWNrcywgdGhpcy5fZ3JvdW5kSXRlbSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc3RhY2tzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZSh0eXBlOiBJdGVtVHlwZSk6IENvbnRlbnRJdGVtIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNRkZDSVQ4MjQ0NicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZVJlY3Vyc2l2ZSh0eXBlLCB0aGlzLl9ncm91bmRJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBmaW5kRmlyc3RDb250ZW50SXRlbVR5cGVSZWN1cnNpdmUodHlwZTogSXRlbVR5cGUsIG5vZGU6IENvbnRlbnRJdGVtKTogQ29udGVudEl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IG5vZGUuY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtQ291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChjb250ZW50SXRlbUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50SXRlbUNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJdGVtLnR5cGUgPT09IHR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ29udGVudEl0ZW0gPSB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZVJlY3Vyc2l2ZSh0eXBlLCBjb250ZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZm91bmRDb250ZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kQ29udGVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlQnlJZFJlY3Vyc2l2ZSh0eXBlOiBJdGVtVHlwZSwgaWQ6IHN0cmluZywgbm9kZTogQ29udGVudEl0ZW0pOiBDb250ZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gbm9kZS5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1Db3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGNvbnRlbnRJdGVtQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudEl0ZW0udHlwZSA9PT0gdHlwZSAmJiBjb250ZW50SXRlbS5pZCA9PT0gaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ29udGVudEl0ZW0gPSB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZUJ5SWRSZWN1cnNpdmUodHlwZSwgaWQsIGNvbnRlbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgIGlmIChmb3VuZENvbnRlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRDb250ZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyBhbGwgdGhlIHN0YWNrIGNvbnRhaW5lcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHN0YWNrcyAtIFNldCBvZiBjb250YWluZXJzIHRvIHBvcHVsYXRlLlxyXG4gICAgICogQHBhcmFtIG5vZGUgLSBDdXJyZW50IG5vZGUgdG8gcHJvY2Vzcy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpbmRBbGxTdGFja3NSZWN1cnNpdmUoc3RhY2tzOiBTdGFja1tdLCBub2RlOiBDb250ZW50SXRlbSkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IG5vZGUuY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgU3RhY2spIHtcclxuICAgICAgICAgICAgICAgIHN0YWNrcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpdGVtLmlzQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kQWxsU3RhY2tzUmVjdXJzaXZlKHN0YWNrcywgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBmaW5kRmlyc3RMb2NhdGlvbihzZWxlY3RvcnM6IHJlYWRvbmx5IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3RvcltdKTogTGF5b3V0TWFuYWdlci5Mb2NhdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBzZWxlY3RvcnMubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTtcclxuICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmZpbmRMb2NhdGlvbihzZWxlY3Rvcik7XHJcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGZpbmRMb2NhdGlvbihzZWxlY3RvcjogTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yKTogTGF5b3V0TWFuYWdlci5Mb2NhdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0b3JJbmRleCA9IHNlbGVjdG9yLmluZGV4O1xyXG4gICAgICAgIHN3aXRjaCAoc2VsZWN0b3IudHlwZUlkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5Gb2N1c2VkSXRlbToge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSB0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbS5wYXJlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbnRlbnRJdGVtcyA9IHBhcmVudEl0ZW0uY29udGVudEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbnRlbnRJdGVtQ291bnQgPSBwYXJlbnRDb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvckluZGV4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50SXRlbSwgaW5kZXg6IHBhcmVudENvbnRlbnRJdGVtQ291bnQgfTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2VkSW5kZXggPSBwYXJlbnRDb250ZW50SXRlbXMuaW5kZXhPZih0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZm9jdXNlZEluZGV4ICsgc2VsZWN0b3JJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHBhcmVudENvbnRlbnRJdGVtQ291bnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBwYXJlbnRJdGVtLCBpbmRleCB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5Gb2N1c2VkU3RhY2s6IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW0sIHNlbGVjdG9ySW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFN0YWNrOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGUoSXRlbVR5cGUuc3RhY2spO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyeUNyZWF0ZUxvY2F0aW9uRnJvbVBhcmVudEl0ZW0ocGFyZW50SXRlbSwgc2VsZWN0b3JJbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZpcnN0Um93T3JDb2x1bW46IHtcclxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGUoSXRlbVR5cGUucm93KTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW0sIHNlbGVjdG9ySW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGUoSXRlbVR5cGUuY29sdW1uKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyeUNyZWF0ZUxvY2F0aW9uRnJvbVBhcmVudEl0ZW0ocGFyZW50SXRlbSwgc2VsZWN0b3JJbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZpcnN0Um93OiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGUoSXRlbVR5cGUucm93KTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW0sIHNlbGVjdG9ySW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdENvbHVtbjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKEl0ZW1UeXBlLmNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRW1wdHk6IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUZMUklGMTgyNDQnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucm9vdEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvckluZGV4ID09PSB1bmRlZmluZWQgfHwgc2VsZWN0b3JJbmRleCA9PT0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhcmVudEl0ZW06IHRoaXMuX2dyb3VuZEl0ZW0sIGluZGV4OiAwIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuUm9vdDoge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNRkxGMTgyNDQnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdW5kQ29udGVudEl0ZW1zID0gdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VuZENvbnRlbnRJdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9ySW5kZXggPT09IHVuZGVmaW5lZCB8fCBzZWxlY3RvckluZGV4ID09PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50SXRlbTogdGhpcy5fZ3JvdW5kSXRlbSwgaW5kZXg6IDAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IGdyb3VuZENvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSB0cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW06IENvbnRlbnRJdGVtLFxyXG4gICAgICAgIHNlbGVjdG9ySW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZFxyXG4gICAgKTogTGF5b3V0TWFuYWdlci5Mb2NhdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Q29udGVudEl0ZW1zID0gcGFyZW50SXRlbS5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Q29udGVudEl0ZW1Db3VudCA9IHBhcmVudENvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHNlbGVjdG9ySW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4geyBwYXJlbnRJdGVtLCBpbmRleDogcGFyZW50Q29udGVudEl0ZW1Db3VudCB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RvckluZGV4IDwgMCB8fCBzZWxlY3RvckluZGV4ID4gcGFyZW50Q29udGVudEl0ZW1Db3VudCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHBhcmVudEl0ZW0sIGluZGV4OiBzZWxlY3RvckluZGV4IH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgTGF5b3V0TWFuYWdlciB7XHJcbiAgICBleHBvcnQgdHlwZSBCZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50ID0gKHRoaXM6IHZvaWQsIGNvdW50OiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbnN0cnVjdG9yUGFyYW1ldGVycyB7XHJcbiAgICAgICAgY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZzogTGF5b3V0Q29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlzU3ViV2luZG93OiBib29sZWFuO1xyXG4gICAgICAgIGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNYXhpbWlzZVBsYWNlRWxlbWVudChkb2N1bWVudDogRG9jdW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLk1heGltaXNlUGxhY2UpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYWJEcm9wUGxhY2Vob2xkZXJFbGVtZW50KGRvY3VtZW50OiBEb2N1bWVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJvcFRhYlBsYWNlaG9sZGVyKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNwZWNpZmllcyBhIGxvY2F0aW9uIG9mIGEgQ29udGVudEl0ZW0gd2l0aG91dCByZWZlcmVuY2luZyB0aGUgY29udGVudCBpdGVtLlxyXG4gICAgICogVXNlZCB0byBzcGVjaWZ5IHdoZXJlIGEgbmV3IGl0ZW0gaXMgdG8gYmUgYWRkZWRcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBMb2NhdGlvbiB7XHJcbiAgICAgICAgcGFyZW50SXRlbTogQ29udGVudEl0ZW07XHJcbiAgICAgICAgaW5kZXg6IG51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgc2VsZWN0b3IgdXNlZCB0byBzcGVjaWZ5IGEgdW5pcXVlIGxvY2F0aW9uIGluIHRoZSBsYXlvdXRcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBMb2NhdGlvblNlbGVjdG9yIHtcclxuICAgICAgICAvKiogU3BlY2lmaWVzIHNlbGVjdG9yIGFsZ29yaXRobSAqL1xyXG4gICAgICAgIHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQ7XHJcbiAgICAgICAgLyoqIFVzZWQgYnkgYWxnb3JpdGhtIHRvIGRldGVybWluZSBpbmRleCBpbiBmb3VuZCBDb250ZW50SXRlbSAqL1xyXG4gICAgICAgIGluZGV4PzogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHVibGljICovXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIExvY2F0aW9uU2VsZWN0b3Ige1xyXG4gICAgICAgIGV4cG9ydCBjb25zdCBlbnVtIFR5cGVJZCB7XHJcbiAgICAgICAgICAgIC8qKiBTdGFjayB3aXRoIGZvY3VzZWQgSXRlbS4gSW5kZXggc3BlY2lmaWVzIG9mZnNldCBmcm9tIGluZGV4IG9mIGZvY3VzZWQgaXRlbSAoZWcgMSBpcyB0aGUgcG9zaXRpb24gYWZ0ZXIgZm9jdXNlZCBpdGVtKSAqL1xyXG4gICAgICAgICAgICBGb2N1c2VkSXRlbSxcclxuICAgICAgICAgICAgLyoqIFN0YWNrIHdpdGggZm9jdXNlZCBJdGVtLiBJbmRleCBzcGVjZmllcyBDb250ZW50SXRlbXMgaW5kZXggKi9cclxuICAgICAgICAgICAgRm9jdXNlZFN0YWNrLFxyXG4gICAgICAgICAgICAvKiogRmlyc3Qgc3RhY2sgZm91bmQgaW4gbGF5b3V0ICovXHJcbiAgICAgICAgICAgIEZpcnN0U3RhY2ssXHJcbiAgICAgICAgICAgIC8qKiBGaXJzdCBSb3cgb3IgQ29sdW1uIGZvdW5kIGluIGxheW91dCAocm93cyBhcmUgc2VhcmNoZWQgZmlyc3QpICovXHJcbiAgICAgICAgICAgIEZpcnN0Um93T3JDb2x1bW4sXHJcbiAgICAgICAgICAgIC8qKiBGaXJzdCBSb3cgaW4gbGF5b3V0ICovXHJcbiAgICAgICAgICAgIEZpcnN0Um93LFxyXG4gICAgICAgICAgICAvKiogRmlyc3QgQ29sdW1uIGluIGxheW91dCAqL1xyXG4gICAgICAgICAgICBGaXJzdENvbHVtbixcclxuICAgICAgICAgICAgLyoqIEZpbmRzIGEgbG9jYXRpb24gaWYgbGF5b3V0IGlzIGVtcHR5LiBUaGUgZm91bmQgbG9jYXRpb24gd2lsbCBiZSB0aGUgcm9vdCBDb250ZW50SXRlbS4gKi9cclxuICAgICAgICAgICAgRW1wdHksXHJcbiAgICAgICAgICAgIC8qKiBGaW5kcyByb290IGlmIGxheW91dCBpcyBlbXB0eSwgb3RoZXJ3aXNlIGEgY2hpbGQgdW5kZXIgcm9vdCAqL1xyXG4gICAgICAgICAgICBSb290LFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmF1bHQgTG9jYXRpb25TZWxlY3RvcnMgYXJyYXkgdXNlZCBpZiBub25lIGlzIHNwZWNpZmllZC4gIFdpbGwgYWx3YXlzIGZpbmQgYSBsb2NhdGlvbi5cclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRMb2NhdGlvblNlbGVjdG9yczogcmVhZG9ubHkgTG9jYXRpb25TZWxlY3RvcltdID0gW1xyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5Gb2N1c2VkU3RhY2ssIGluZGV4OiB1bmRlZmluZWQgfSxcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RTdGFjaywgaW5kZXg6IHVuZGVmaW5lZCB9LFxyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFJvd09yQ29sdW1uLCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLlJvb3QsIGluZGV4OiB1bmRlZmluZWQgfSxcclxuICAgIF07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2NhdGlvblNlbGVjdG9ycyB0byB0cnkgdG8gZ2V0IGxvY2F0aW9uIG5leHQgdG8gZXhpc3RpbmcgZm9jdXNlZCBpdGVtXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBjb25zdCBhZnRlckZvY3VzZWRJdGVtSWZQb3NzaWJsZUxvY2F0aW9uU2VsZWN0b3JzOiByZWFkb25seSBMb2NhdGlvblNlbGVjdG9yW10gPSBbXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZvY3VzZWRJdGVtLCBpbmRleDogMSB9LFxyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFN0YWNrLCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZpcnN0Um93T3JDb2x1bW4sIGluZGV4OiB1bmRlZmluZWQgfSxcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuUm9vdCwgaW5kZXg6IHVuZGVmaW5lZCB9LFxyXG4gICAgXTtcclxufVxyXG4iLCIvKipcclxuICogTWluaWZpZXMgYW5kIHVubWluaWZpZXMgY29uZmlncyBieSByZXBsYWNpbmcgZnJlcXVlbnQga2V5c1xyXG4gKiBhbmQgdmFsdWVzIHdpdGggb25lIGxldHRlciBzdWJzdGl0dXRlcy4gQ29uZmlnIG9wdGlvbnMgbXVzdFxyXG4gKiByZXRhaW4gYXJyYXkgcG9zaXRpb24vaW5kZXgsIGFkZCBuZXcgb3B0aW9ucyBhdCB0aGUgZW5kLlxyXG4gKiBAaW50ZXJuYWxcclxuKi9cclxuXHJcbmV4cG9ydCBuYW1lc3BhY2UgQ29uZmlnTWluaWZpZXIge1xyXG5cclxuICAgIGV4cG9ydCB0eXBlIFlZID0gJ2lkJyB8ICd0aXRsZSc7XHJcbiAgICBleHBvcnQgY29uc3QgZW51bSBYWCB7XHJcbiAgICAgICAgaWQgPSAnaWQnXHJcbiAgICB9XHJcbiAgICBjb25zdCBrZXlzOiByZWFkb25seSBzdHJpbmdbXSA9IFtcclxuICAgICAgICAnc2V0dGluZ3MnLFxyXG4gICAgICAgICdoYXNIZWFkZXJzJyxcclxuICAgICAgICAnZHJhZ0JldHdlZW5XaW5kb3dzJyxcclxuICAgICAgICAnZHJhZ1RvTmV3V2luZG93JyxcclxuICAgICAgICAnc2VsZWN0aW9uRW5hYmxlZCcsXHJcbiAgICAgICAgJ2RpbWVuc2lvbnMnLFxyXG4gICAgICAgICdib3JkZXJXaWR0aCcsXHJcbiAgICAgICAgJ21pbkl0ZW1IZWlnaHQnLFxyXG4gICAgICAgICdtaW5JdGVtV2lkdGgnLFxyXG4gICAgICAgICdoZWFkZXJIZWlnaHQnLFxyXG4gICAgICAgICdkcmFnUHJveHlXaWR0aCcsXHJcbiAgICAgICAgJ2RyYWdQcm94eUhlaWdodCcsXHJcbiAgICAgICAgJ2xhYmVscycsXHJcbiAgICAgICAgJ2Nsb3NlJyxcclxuICAgICAgICAnbWF4aW1pc2UnLFxyXG4gICAgICAgICdtaW5pbWlzZScsXHJcbiAgICAgICAgJ3BvcG91dCcsXHJcbiAgICAgICAgJ2NvbnRlbnQnLFxyXG4gICAgICAgICdjb21wb25lbnRUeXBlJyxcclxuICAgICAgICAnY29tcG9uZW50U3RhdGUnLFxyXG4gICAgICAgICdpZCcsXHJcbiAgICAgICAgJ3dpZHRoJyxcclxuICAgICAgICAndHlwZScsXHJcbiAgICAgICAgJ2hlaWdodCcsXHJcbiAgICAgICAgJ2lzQ2xvc2FibGUnLFxyXG4gICAgICAgICd0aXRsZScsXHJcbiAgICAgICAgJ3BvcG91dFdob2xlU3RhY2snLFxyXG4gICAgICAgICdvcGVuUG9wb3V0cycsXHJcbiAgICAgICAgJ3BhcmVudElkJyxcclxuICAgICAgICAnYWN0aXZlSXRlbUluZGV4JyxcclxuICAgICAgICAncmVvcmRlckVuYWJsZWQnLFxyXG4gICAgICAgICdib3JkZXJHcmFiV2lkdGgnLFxyXG5cclxuXHJcblxyXG4gICAgICAgIC8vTWF4aW11bSAzNiBlbnRyaWVzLCBkbyBub3QgY3Jvc3MgdGhpcyBsaW5lIVxyXG4gICAgXTtcclxuXHJcbiAgICBjb25zdCB2YWx1ZXM6IHJlYWRvbmx5IChib29sZWFuIHwgc3RyaW5nKVtdID0gW1xyXG4gICAgICAgIHRydWUsXHJcbiAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgJ3JvdycsXHJcbiAgICAgICAgJ2NvbHVtbicsXHJcbiAgICAgICAgJ3N0YWNrJyxcclxuICAgICAgICAnY29tcG9uZW50JyxcclxuICAgICAgICAnY2xvc2UnLFxyXG4gICAgICAgICdtYXhpbWlzZScsXHJcbiAgICAgICAgJ21pbmltaXNlJyxcclxuICAgICAgICAnb3BlbiBpbiBuZXcgd2luZG93J1xyXG4gICAgXTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY2hlY2tJbml0aWFsaXNlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDM2KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9vIG1hbnkga2V5cyBpbiBjb25maWcgbWluaWZpZXIgbWFwJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVPYmplY3QoZnJvbTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1pbmlmeTogYm9vbGVhbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcclxuICAgICAgICBjb25zdCB0bzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XHJcbiAgICAgICAgICAgIGlmIChmcm9tLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gSW4gY2FzZSBzb21ldGhpbmcgaGFzIGV4dGVuZGVkIE9iamVjdCBwcm90b3R5cGVzXHJcbiAgICAgICAgICAgICAgICBsZXQgdHJhbnNsYXRlZEtleTogc3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1pbmlmeSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRLZXkgPSBtaW5pZnlLZXkoa2V5KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlZEtleSA9IHVubWluaWZ5S2V5KGtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbVZhbHVlID0gZnJvbVtrZXldO1xyXG4gICAgICAgICAgICAgICAgdG9bdHJhbnNsYXRlZEtleV0gPSB0cmFuc2xhdGVWYWx1ZShmcm9tVmFsdWUsIG1pbmlmeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0bztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVBcnJheShmcm9tOiB1bmtub3duW10sIG1pbmlmeTogYm9vbGVhbikge1xyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGZyb20ubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHRvID0gbmV3IEFycmF5PHVua25vd24+KGxlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAvLyBJbiBvcmlnaW5hbCBjb2RlLCBhcnJheSBpbmRpY2VzIHdlcmUgbnVtYmVycyBhbmQgbm90IHRyYW5zbGF0ZWRcclxuICAgICAgICAgICAgY29uc3QgZnJvbVZhbHVlID0gZnJvbVtpXTtcclxuICAgICAgICAgICAgdG9baV0gPSB0cmFuc2xhdGVWYWx1ZShmcm9tVmFsdWUsIG1pbmlmeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0bztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVWYWx1ZShmcm9tOiB1bmtub3duLCBtaW5pZnk6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodHlwZW9mIGZyb20gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIGlmIChmcm9tID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZyb20pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUFycmF5KGZyb20sIG1pbmlmeSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVPYmplY3QoZnJvbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbWluaWZ5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChtaW5pZnkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtaW5pZnlWYWx1ZShmcm9tKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bm1pbmlmeVZhbHVlKGZyb20pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1pbmlmeUtleSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgYSB2YWx1ZSBhY3R1YWxseSBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIsIHByZWZpeCBpdFxyXG4gICAgICAgICAqIHdpdGggX19fIHRvIGF2b2lkIG1pc3Rha2luZyBpdCBmb3IgYSBtaW5pZmljYXRpb24gY29kZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ19fXycgKyB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBjb25zdCBpbmRleCA9IGluZGV4T2ZLZXkodmFsdWUpO1xyXG4gICAgXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogdmFsdWUgbm90IGZvdW5kIGluIHRoZSBkaWN0aW9uYXJ5LCByZXR1cm4gaXQgdW5tb2RpZmllZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiB2YWx1ZSBmb3VuZCBpbiBkaWN0aW9uYXJ5LCByZXR1cm4gaXRzIGJhc2UzNiBjb3VudGVycGFydFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB1bm1pbmlmeUtleShrZXk6IHN0cmluZykge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIGlzIGEgc2luZ2xlIGNoYXJhY3Rlci4gQXNzdW1lIHRoYXQgaXQncyBhIHRyYW5zbGF0aW9uXHJcbiAgICAgICAgICogYW5kIHJldHVybiB0aGUgb3JpZ2luYWwgdmFsdWUgZnJvbSB0aGUgZGljdGlvbmFyeVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBrZXlzW3BhcnNlSW50KGtleSwgMzYpXTtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSBvcmlnaW5hbGx5IHdhcyBhIHNpbmdsZSBjaGFyYWN0ZXIgYW5kIHdhcyBwcmVmaXhlZCB3aXRoIF9fX1xyXG4gICAgICAgICAqIHRvIGF2b2lkIG1pc3Rha2luZyBpdCBmb3IgYSB0cmFuc2xhdGlvbi4gUmVtb3ZlIHRoZSBwcmVmaXhcclxuICAgICAgICAgKiBhbmQgcmV0dXJuIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXJcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoa2V5LnN1YnN0cigwLCAzKSA9PT0gJ19fXycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGtleVszXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogdmFsdWUgd2FzIG5vdCBtaW5pZmllZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbWluaWZ5VmFsdWUodmFsdWU6IHVua25vd24pIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiBhIHZhbHVlIGFjdHVhbGx5IGlzIGEgc2luZ2xlIGNoYXJhY3RlciwgcHJlZml4IGl0XHJcbiAgICAgICAgICogd2l0aCBfX18gdG8gYXZvaWQgbWlzdGFraW5nIGl0IGZvciBhIG1pbmlmaWNhdGlvbiBjb2RlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnX19fJyArIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gaW5kZXhPZlZhbHVlKHZhbHVlKTtcclxuICAgIFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIG5vdCBmb3VuZCBpbiB0aGUgZGljdGlvbmFyeSwgcmV0dXJuIGl0IHVubW9kaWZpZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIFxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogdmFsdWUgZm91bmQgaW4gZGljdGlvbmFyeSwgcmV0dXJuIGl0cyBiYXNlMzYgY291bnRlcnBhcnRcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdW5taW5pZnlWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIGlzIGEgc2luZ2xlIGNoYXJhY3Rlci4gQXNzdW1lIHRoYXQgaXQncyBhIHRyYW5zbGF0aW9uXHJcbiAgICAgICAgICogYW5kIHJldHVybiB0aGUgb3JpZ2luYWwgdmFsdWUgZnJvbSB0aGUgZGljdGlvbmFyeVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzW3BhcnNlSW50KHZhbHVlLCAzNildO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogdmFsdWUgb3JpZ2luYWxseSB3YXMgYSBzaW5nbGUgY2hhcmFjdGVyIGFuZCB3YXMgcHJlZml4ZWQgd2l0aCBfX19cclxuICAgICAgICAgKiB0byBhdm9pZCBtaXN0YWtpbmcgaXQgZm9yIGEgdHJhbnNsYXRpb24uIFJlbW92ZSB0aGUgcHJlZml4XHJcbiAgICAgICAgICogYW5kIHJldHVybiB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3Vic3RyKDAsIDMpID09PSAnX19fJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVbM107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIHdhcyBub3QgbWluaWZpZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaW5kZXhPZktleShrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoa2V5c1tpXSA9PT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaW5kZXhPZlZhbHVlKHZhbHVlOiB1bmtub3duKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL2V2ZW50LWVtaXR0ZXInO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgRHJhZ0xpc3RlbmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIHByaXZhdGUgX3RpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSBfYWxsb3dhYmxlVGFyZ2V0czogSFRNTEVsZW1lbnRbXTtcclxuICAgIHByaXZhdGUgX29Eb2N1bWVudDogRG9jdW1lbnQ7XHJcbiAgICBwcml2YXRlIF9lQm9keTogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF9uRGVsYXk6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX25EaXN0YW5jZTogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfb3JpZ2luYWxFdmVudDogRXZlbnRFbWl0dGVyLkRyYWdFdmVudDtcclxuICAgIHByaXZhdGUgX2RyYWdnaW5nOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfcG9pbnRlclRyYWNraW5nID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBfcG9pbnRlckRvd25FdmVudExpc3RlbmVyID0gKGV2OiBQb2ludGVyRXZlbnQpID0+IHRoaXMub25Qb2ludGVyRG93bihldik7XHJcbiAgICBwcml2YXRlIF9wb2ludGVyTW92ZUV2ZW50TGlzdGVuZXIgPSAoZXY6IFBvaW50ZXJFdmVudCkgPT4gdGhpcy5vblBvaW50ZXJNb3ZlKGV2KTtcclxuICAgIHByaXZhdGUgX3BvaW50ZXJVcEV2ZW50TGlzdGVuZXIgPSAoZXY6IFBvaW50ZXJFdmVudCkgPT4gdGhpcy5vblBvaW50ZXJVcChldik7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfZUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBleHRyYUFsbG93YWJsZUNoaWxkVGFyZ2V0czogSFRNTEVsZW1lbnRbXSkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIHRoaXMuX2FsbG93YWJsZVRhcmdldHMgPSBbX2VFbGVtZW50LCAuLi5leHRyYUFsbG93YWJsZUNoaWxkVGFyZ2V0c107XHJcbiAgICAgICAgdGhpcy5fb0RvY3VtZW50ID0gZG9jdW1lbnQ7XHJcbiAgICAgICAgdGhpcy5fZUJvZHkgPSBkb2N1bWVudC5ib2R5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGVsYXkgYWZ0ZXIgd2hpY2ggdG8gc3RhcnQgdGhlIGRyYWcgaW4gbWlsbGlzZWNvbmRzXHJcbiAgICAgICAgICogRG8gTk9UIG1ha2UgdG9vIHNob3J0IChwcmV2aW91cyB2YWx1ZSBvZiAyMDAgd2FzIG5vdCBsb25nIGVub3VnaCBmb3IgbXkgdG91Y2hwYWQpXHJcbiAgICAgICAgICogU2hvdWxkIGdlbmVyYWxseSByZWx5IG9uIHRoZSBtb3VzZSBtb3ZlIHRvIHN0YXJ0IGRyYWcuICBOb3QgdGhpcyBkZWxheS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9uRGVsYXkgPSAxODAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGlzdGFuY2UgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkIHRvIHF1YWxpZnkgYXMgYSBkcmFnXHJcbiAgICAgICAgICogUHJldmlvdXMgY29tbWVudDogd29ya3MgYmV0dGVyIHdpdGggZGVsYXkgb25seVxyXG4gICAgICAgICAqID8/P1xyXG4gICAgICAgICAqIFByb2JhYmx5IHNvbWVob3cgbmVlZHMgdHVuaW5nIGZvciBkaWZmZXJlbnQgZGV2aWNlc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX25EaXN0YW5jZSA9IDEwO1xyXG5cclxuICAgICAgICB0aGlzLl9vcmlnaW5hbEV2ZW50ID0geyBwYWdlWDogMCwgcGFnZVk6IDAsIHNjcmVlblg6IDAsIHNjcmVlblk6IDB9O1xyXG5cclxuICAgICAgICB0aGlzLl9kcmFnZ2luZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLl9lRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMuX3BvaW50ZXJEb3duRXZlbnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlbW92ZVBvaW50ZXJUcmFja2luZ0V2ZW50TGlzdGVuZXJzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2VFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5fcG9pbnRlckRvd25FdmVudExpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBjYW5jZWxEcmFnKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0RyYWdTdG9wKHVuZGVmaW5lZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblBvaW50ZXJEb3duKG9FdmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2FsbG93YWJsZVRhcmdldHMuaW5jbHVkZXMob0V2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkgJiYgb0V2ZW50LmlzUHJpbWFyeSkge1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NQb2ludGVyRG93bihvRXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NQb2ludGVyRG93bihldmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fb3JpZ2luYWxFdmVudCA9IGV2ZW50O1xyXG5cclxuICAgICAgICB0aGlzLl9vRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLl9wb2ludGVyTW92ZUV2ZW50TGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMuX29Eb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLl9wb2ludGVyVXBFdmVudExpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgdGhpcy5fZUJvZHkuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlBvaW50ZXJUcmFja2luZyk7XHJcbiAgICAgICAgdGhpcy5fcG9pbnRlclRyYWNraW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydERyYWcoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLCB0aGlzLl9uRGVsYXkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Qb2ludGVyTW92ZShvRXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wb2ludGVyVHJhY2tpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRHJhZ01vdmUob0V2ZW50KTtcclxuICAgICAgICAgICAgb0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc0RyYWdNb3ZlKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBvZmZzZXRYID0gZXZlbnQucGFnZVggLSB0aGlzLl9vcmlnaW5hbEV2ZW50LnBhZ2VYO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSBldmVudC5wYWdlWSAtIHRoaXMuX29yaWdpbmFsRXZlbnQucGFnZVk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnZ2luZyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgTWF0aC5hYnMob2Zmc2V0WCkgPiB0aGlzLl9uRGlzdGFuY2UgfHxcclxuICAgICAgICAgICAgICAgIE1hdGguYWJzKG9mZnNldFkpID4gdGhpcy5fbkRpc3RhbmNlXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydERyYWcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdnaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZHJhZycsIG9mZnNldFgsIG9mZnNldFksIGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblBvaW50ZXJVcChvRXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0RyYWdTdG9wKG9FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzRHJhZ1N0b3AoZHJhZ0V2ZW50PzogUG9pbnRlckV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNoZWNrUmVtb3ZlUG9pbnRlclRyYWNraW5nRXZlbnRMaXN0ZW5lcnMoKTtcclxuICAgIFxyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnZ2luZyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9lQm9keS5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJhZ2dpbmcpO1xyXG4gICAgICAgICAgICB0aGlzLl9lRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJhZ2dpbmcpO1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RyYWdTdG9wJywgZHJhZ0V2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja1JlbW92ZVBvaW50ZXJUcmFja2luZ0V2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9wb2ludGVyVHJhY2tpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5fb0RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5fcG9pbnRlck1vdmVFdmVudExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fb0RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMuX3BvaW50ZXJVcEV2ZW50TGlzdGVuZXIpO1xyXG4gICAgICAgICAgICB0aGlzLl9lQm9keS5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuUG9pbnRlclRyYWNraW5nKTtcclxuICAgICAgICAgICAgdGhpcy5fcG9pbnRlclRyYWNraW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSAgICBcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXJ0RHJhZygpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcclxuICAgICAgICAgICAgdGhpcy5fdGltZW91dCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZHJhZ2dpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2VCb2R5LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnZ2luZyk7XHJcbiAgICAgICAgdGhpcy5fZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyYWdnaW5nKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2RyYWdTdGFydCcsIHRoaXMuX29yaWdpbmFsRXZlbnQucGFnZVgsIHRoaXMuX29yaWdpbmFsRXZlbnQucGFnZVkpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZHJhZycsIDAsIDAsIHRoaXMuX29yaWdpbmFsRXZlbnQpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQnJvd3NlclBvcG91dCB9IGZyb20gJy4uL2NvbnRyb2xzL2Jyb3dzZXItcG9wb3V0JztcclxuaW1wb3J0IHsgVGFiIH0gZnJvbSAnLi4vY29udHJvbHMvdGFiJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuXHJcbi8qKlxyXG4gKiBBIGdlbmVyaWMgYW5kIHZlcnkgZmFzdCBFdmVudEVtaXR0ZXIgaW1wbGVtZW50YXRpb24uIE9uIHRvcCBvZiBlbWl0dGluZyB0aGUgYWN0dWFsIGV2ZW50IGl0IGVtaXRzIGFuXHJcbiAqIHtAbGluayAoRXZlbnRFbWl0dGVyOm5hbWVzcGFjZSkuQUxMX0VWRU5UfSBldmVudCBmb3IgZXZlcnkgZXZlbnQgdHJpZ2dlcmVkLiBUaGlzIGFsbG93cyB0byBob29rIGludG8gaXQgYW5kIHByb3h5IGV2ZW50cyBmb3J3YXJkc1xyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2FsbEV2ZW50U3Vic2NyaXB0aW9uczogRXZlbnRFbWl0dGVyLlVua25vd25DYWxsYmFja1tdID0gW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zdWJzY3JpcHRpb25zTWFwID0gbmV3IE1hcDxzdHJpbmcsIEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2tbXT4oKTtcclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICB0cnlCdWJibGVFdmVudChuYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xyXG4gICAgICAgIC8vIG92ZXJyaWRkZW4gYnkgQ29udGVudEl0ZW1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXQgYW4gZXZlbnQgYW5kIG5vdGlmeSBsaXN0ZW5lcnNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAgKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGxpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIGVtaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCAuLi5hcmdzOiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXBbS10pOiB2b2lkIHtcclxuICAgICAgICBsZXQgc3ViY3JpcHRpb25zID0gdGhpcy5fc3Vic2NyaXB0aW9uc01hcC5nZXQoZXZlbnROYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKHN1YmNyaXB0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHN1YmNyaXB0aW9ucyA9IHN1YmNyaXB0aW9ucy5zbGljZSgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YmNyaXB0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gc3ViY3JpcHRpb25zW2ldO1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uKC4uLmFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVtaXRBbGxFdmVudChldmVudE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgIHRoaXMudHJ5QnViYmxlRXZlbnQoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBlbWl0VW5rbm93bihldmVudE5hbWU6IHN0cmluZywgLi4uYXJnczogRXZlbnRFbWl0dGVyLlVua25vd25QYXJhbXMpOiB2b2lkIHtcclxuICAgICAgICBsZXQgc3VicyA9IHRoaXMuX3N1YnNjcmlwdGlvbnNNYXAuZ2V0KGV2ZW50TmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChzdWJzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgc3VicyA9IHN1YnMuc2xpY2UoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJzW2ldKC4uLmFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVtaXRBbGxFdmVudChldmVudE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgIHRoaXMudHJ5QnViYmxlRXZlbnQoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiBAaW50ZXJuYWwgKiovXHJcbiAgICBlbWl0QmFzZUJ1YmJsaW5nRXZlbnQ8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQoZXZlbnROYW1lLCB0aGlzKTtcclxuICAgICAgICB0aGlzLmVtaXRVbmtub3duKGV2ZW50TmFtZSwgZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVtaXRVbmtub3duQnViYmxpbmdFdmVudChldmVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50KGV2ZW50TmFtZSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5lbWl0VW5rbm93bihldmVudE5hbWUsIGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmb3IgYW4gZXZlbnQuXHJcbiAgICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgcHJldmlvdXNseSByZWdpc3RlcmVkIGNhbGxiYWNrIG1ldGhvZCAob3B0aW9uYWwpXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLkNhbGxiYWNrPEs+KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdW5rbm93bkNhbGxiYWNrID0gY2FsbGJhY2sgYXMgRXZlbnRFbWl0dGVyLlVua25vd25DYWxsYmFjaztcclxuICAgICAgICB0aGlzLnJlbW92ZVVua25vd25FdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgdW5rbm93bkNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBvZmY8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLkNhbGxiYWNrPEs+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWxpYXMgZm9yIG9mZlxyXG4gICAgICovXHJcbiAgICB1bmJpbmQgPSB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbGlhcyBmb3IgZW1pdFxyXG4gICAgICovXHJcbiAgICB0cmlnZ2VyID0gdGhpcy5lbWl0O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlzdGVuIGZvciBldmVudHNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiB0b1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgb2NjdXJzXHJcbiAgICAgKi9cclxuICAgIGFkZEV2ZW50TGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLkNhbGxiYWNrPEs+KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdW5rbm93bkNhbGxiYWNrID0gY2FsbGJhY2sgYXMgRXZlbnRFbWl0dGVyLlVua25vd25DYWxsYmFjaztcclxuICAgICAgICB0aGlzLmFkZFVua25vd25FdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgdW5rbm93bkNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBvbjxLIGV4dGVuZHMga2V5b2YgRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwPihldmVudE5hbWU6IEssIGNhbGxiYWNrOiBFdmVudEVtaXR0ZXIuQ2FsbGJhY2s8Sz4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBjYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBhZGRVbmtub3duRXZlbnRMaXN0ZW5lcihldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2spOiB2b2lkIHtcclxuICAgICAgICBpZiAoZXZlbnROYW1lID09PSBFdmVudEVtaXR0ZXIuQUxMX0VWRU5UKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FsbEV2ZW50U3Vic2NyaXB0aW9ucy5wdXNoKGNhbGxiYWNrKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgc3Vic2NyaXB0aW9ucyA9IHRoaXMuX3N1YnNjcmlwdGlvbnNNYXAuZ2V0KGV2ZW50TmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25zICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMucHVzaChjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zID0gW2NhbGxiYWNrXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnNNYXAuc2V0KGV2ZW50TmFtZSwgc3Vic2NyaXB0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZW1vdmVVbmtub3duRXZlbnRMaXN0ZW5lcihldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2spOiB2b2lkIHtcclxuICAgICAgICBpZiAoZXZlbnROYW1lID09PSBFdmVudEVtaXR0ZXIuQUxMX0VWRU5UKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU3Vic2NyaXB0aW9uKGV2ZW50TmFtZSwgdGhpcy5fYWxsRXZlbnRTdWJzY3JpcHRpb25zLCBjYWxsYmFjayk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IHRoaXMuX3N1YnNjcmlwdGlvbnNNYXAuZ2V0KGV2ZW50TmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc3Vic2NyaWJ0aW9ucyB0byB1bnN1YnNjcmliZSBmb3IgZXZlbnQgJyArIGV2ZW50TmFtZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVN1YnNjcmlwdGlvbihldmVudE5hbWUsIHN1YnNjcmlwdGlvbnMsIGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlbW92ZVN1YnNjcmlwdGlvbihldmVudE5hbWU6IHN0cmluZywgc3Vic2NyaXB0aW9uczogRXZlbnRFbWl0dGVyLlVua25vd25DYWxsYmFja1tdLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLlVua25vd25DYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IGlkeCA9IHN1YnNjcmlwdGlvbnMuaW5kZXhPZihjYWxsYmFjayk7XHJcbiAgICAgICAgaWYgKGlkeCA8IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3RoaW5nIHRvIHVuYmluZCBmb3IgJyArIGV2ZW50TmFtZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3Vic2NyaXB0aW9ucy5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBlbWl0QWxsRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSkge1xyXG4gICAgICAgIGNvbnN0IGFsbEV2ZW50U3Vic2NyaXB0aW9uc0NvdW50ID0gdGhpcy5fYWxsRXZlbnRTdWJzY3JpcHRpb25zLmxlbmd0aDtcclxuICAgICAgICBpZiAoYWxsRXZlbnRTdWJzY3JpcHRpb25zQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVua25vd25BcmdzID0gYXJncy5zbGljZSgpIGFzIEV2ZW50RW1pdHRlci5Vbmtub3duUGFyYW1zO1xyXG4gICAgICAgICAgICB1bmtub3duQXJncy51bnNoaWZ0KGV2ZW50TmFtZSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhbGxFdmVudFN1YmNyaXB0aW9ucyA9IHRoaXMuX2FsbEV2ZW50U3Vic2NyaXB0aW9ucy5zbGljZSgpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxFdmVudFN1YnNjcmlwdGlvbnNDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhbGxFdmVudFN1YmNyaXB0aW9uc1tpXSguLi51bmtub3duQXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRoYXQncyB0cmlnZ2VyZWQgZm9yIGV2ZXJ5IGV2ZW50XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBjb25zdCBBTExfRVZFTlQgPSAnX19hbGwnO1xyXG5cclxuICAgIGV4cG9ydCBjb25zdCBoZWFkZXJDbGlja0V2ZW50TmFtZSA9ICdzdGFja0hlYWRlckNsaWNrJztcclxuICAgIGV4cG9ydCBjb25zdCBoZWFkZXJUb3VjaFN0YXJ0RXZlbnROYW1lID0gJ3N0YWNrSGVhZGVyVG91Y2hTdGFydCc7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgVW5rbm93bkNhbGxiYWNrID0gKHRoaXM6IHZvaWQsIC4uLmFyZ3M6IFVua25vd25QYXJhbXMpID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBDYWxsYmFjazxLIGV4dGVuZHMga2V5b2YgRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwPiA9ICh0aGlzOiB2b2lkLCAuLi5hcmdzOiBFdmVudFBhcmFtc01hcFtLXSkgPT4gdm9pZDtcclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEV2ZW50UGFyYW1zTWFwIHtcclxuICAgICAgICBcIl9fYWxsXCI6IFVua25vd25QYXJhbXM7XHJcbiAgICAgICAgXCJhY3RpdmVDb250ZW50SXRlbUNoYW5nZWRcIjogQ29tcG9uZW50SXRlbVBhcmFtO1xyXG4gICAgICAgIFwiY2xvc2VcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJjbG9zZWRcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJkZXN0cm95XCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwiZHJhZ1wiOiBEcmFnUGFyYW1zO1xyXG4gICAgICAgIFwiZHJhZ1N0YXJ0XCI6IERyYWdTdGFydFBhcmFtcztcclxuICAgICAgICBcImRyYWdTdG9wXCI6IERyYWdTdG9wUGFyYW1zO1xyXG4gICAgICAgIFwiaGlkZVwiOiBOb1BhcmFtcztcclxuICAgICAgICBcImluaXRpYWxpc2VkXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwiaXRlbURyb3BwZWRcIjogQ29tcG9uZW50SXRlbVBhcmFtO1xyXG4gICAgICAgIFwibWF4aW1pc2VkXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwibWluaW1pc2VkXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwib3BlblwiOiBOb1BhcmFtcztcclxuICAgICAgICBcInBvcEluXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwicmVzaXplXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwic2hvd1wiOiBOb1BhcmFtcztcclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgLSB1c2Ugc2hvdyBpbnN0ZWFkICovXHJcbiAgICAgICAgXCJzaG93blwiOiBOb1BhcmFtcztcclxuICAgICAgICBcInN0YXRlQ2hhbmdlZFwiOiBOb1BhcmFtcztcclxuICAgICAgICBcInRhYlwiOiBUYWJQYXJhbTtcclxuICAgICAgICBcInRhYkNyZWF0ZWRcIjogVGFiUGFyYW07XHJcbiAgICAgICAgXCJ0aXRsZUNoYW5nZWRcIjogU3RyaW5nUGFyYW07XHJcbiAgICAgICAgXCJ3aW5kb3dDbG9zZWRcIjogUG9wb3V0UGFyYW07XHJcbiAgICAgICAgXCJ3aW5kb3dPcGVuZWRcIjogUG9wb3V0UGFyYW07XHJcbiAgICAgICAgXCJiZWZvcmVDb21wb25lbnRSZWxlYXNlXCI6IEJlZm9yZUNvbXBvbmVudFJlbGVhc2VQYXJhbXM7XHJcbiAgICAgICAgXCJiZWZvcmVJdGVtRGVzdHJveWVkXCI6IEJ1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcIml0ZW1DcmVhdGVkXCI6IEJ1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcIml0ZW1EZXN0cm95ZWRcIjogQnViYmxpbmdFdmVudFBhcmFtO1xyXG4gICAgICAgIFwiZm9jdXNcIjogQnViYmxpbmdFdmVudFBhcmFtO1xyXG4gICAgICAgIFwiYmx1clwiOiBCdWJibGluZ0V2ZW50UGFyYW07XHJcbiAgICAgICAgXCJzdGFja0hlYWRlckNsaWNrXCI6IENsaWNrQnViYmxpbmdFdmVudFBhcmFtO1xyXG4gICAgICAgIFwic3RhY2tIZWFkZXJUb3VjaFN0YXJ0XCI6IFRvdWNoU3RhcnRCdWJibGluZ0V2ZW50UGFyYW07XHJcbiAgICAgICAgXCJ1c2VyQnJvYWRjYXN0XCI6IFVua25vd25QYXJhbXM7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IHR5cGUgVW5rbm93blBhcmFtcyA9IHVua25vd25bXTtcclxuICAgIGV4cG9ydCB0eXBlIE5vUGFyYW1zID0gW107XHJcbiAgICBleHBvcnQgdHlwZSBVbmtub3duUGFyYW0gPSBbdW5rbm93bl07XHJcbiAgICBleHBvcnQgdHlwZSBQb3BvdXRQYXJhbSA9IFtCcm93c2VyUG9wb3V0XTtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudEl0ZW1QYXJhbSA9IFtDb21wb25lbnRJdGVtXTtcclxuICAgIGV4cG9ydCB0eXBlIFRhYlBhcmFtID0gW1RhYl07XHJcbiAgICBleHBvcnQgdHlwZSBCdWJibGluZ0V2ZW50UGFyYW0gPSBbRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnRdXHJcbiAgICBleHBvcnQgdHlwZSBTdHJpbmdQYXJhbSA9IFtzdHJpbmddO1xyXG4gICAgZXhwb3J0IHR5cGUgRHJhZ1N0YXJ0UGFyYW1zID0gW29yaWdpbmFsWDogbnVtYmVyLCBvcmlnaW5hbFk6IG51bWJlcl07XHJcbiAgICBleHBvcnQgdHlwZSBEcmFnU3RvcFBhcmFtcyA9IFtldmVudDogUG9pbnRlckV2ZW50IHwgdW5kZWZpbmVkXTtcclxuICAgIGV4cG9ydCB0eXBlIERyYWdQYXJhbXMgPSBbb2Zmc2V0WDogbnVtYmVyLCBvZmZzZXRZOiBudW1iZXIsIGV2ZW50OiBFdmVudEVtaXR0ZXIuRHJhZ0V2ZW50XTtcclxuICAgIGV4cG9ydCB0eXBlIEJlZm9yZUNvbXBvbmVudFJlbGVhc2VQYXJhbXMgPSBbY29tcG9uZW50OiB1bmtub3duXTtcclxuICAgIGV4cG9ydCB0eXBlIENsaWNrQnViYmxpbmdFdmVudFBhcmFtID0gW0NsaWNrQnViYmxpbmdFdmVudF07XHJcbiAgICBleHBvcnQgdHlwZSBUb3VjaFN0YXJ0QnViYmxpbmdFdmVudFBhcmFtID0gW1RvdWNoU3RhcnRCdWJibGluZ0V2ZW50XTtcclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIERyYWdFdmVudCB7XHJcbiAgICAgICAgcmVhZG9ubHkgcGFnZVg6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBwYWdlWTogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IHNjcmVlblg6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBzY3JlZW5ZOiBudW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIEJ1YmJsaW5nRXZlbnQge1xyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBnZXQgbmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fbmFtZTsgfVxyXG4gICAgICAgIGdldCB0YXJnZXQoKTogRXZlbnRFbWl0dGVyIHsgcmV0dXJuIHRoaXMuX3RhcmdldDsgfVxyXG4gICAgICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChFdmVudEVtaXR0ZXI6bmFtZXNwYWNlKS4oQnViYmxpbmdFdmVudDpjbGFzcykudGFyZ2V0fSBpbnN0ZWFkICovXHJcbiAgICAgICAgZ2V0IG9yaWdpbigpOiBFdmVudEVtaXR0ZXIgeyByZXR1cm4gdGhpcy5fdGFyZ2V0OyB9XHJcbiAgICAgICAgZ2V0IGlzUHJvcGFnYXRpb25TdG9wcGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faXNQcm9wYWdhdGlvblN0b3BwZWQ7IH1cclxuXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX25hbWU6IHN0cmluZyxcclxuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF90YXJnZXQ6IEV2ZW50RW1pdHRlcikge1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgICAgICB0aGlzLl9pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBDbGlja0J1YmJsaW5nRXZlbnQgZXh0ZW5kcyBCdWJibGluZ0V2ZW50IHtcclxuICAgICAgICBnZXQgbW91c2VFdmVudCgpOiBNb3VzZUV2ZW50IHsgcmV0dXJuIHRoaXMuX21vdXNlRXZlbnQ7IH1cclxuXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdGFyZ2V0OiBFdmVudEVtaXR0ZXIsXHJcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbW91c2VFdmVudDogTW91c2VFdmVudFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBzdXBlcihuYW1lLCB0YXJnZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgVG91Y2hTdGFydEJ1YmJsaW5nRXZlbnQgZXh0ZW5kcyBCdWJibGluZ0V2ZW50IHtcclxuICAgICAgICBnZXQgdG91Y2hFdmVudCgpOiBUb3VjaEV2ZW50IHsgcmV0dXJuIHRoaXMuX3RvdWNoRXZlbnQ7IH1cclxuXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdGFyZ2V0OiBFdmVudEVtaXR0ZXIsXHJcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfdG91Y2hFdmVudDogVG91Y2hFdmVudFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBzdXBlcihuYW1lLCB0YXJnZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBVbmV4cGVjdGVkTnVsbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi9ldmVudC1lbWl0dGVyJztcclxuXHJcbi8vIEFkZCBvdXIgQ2hpbGRFdmVudCB0byBXaW5kb3dFdmVudE1hcCBmb3IgdHlwZSBzYWZldHlcclxuLyoqIEBwdWJsaWMgKi9cclxuZGVjbGFyZSBnbG9iYWwge1xyXG4gICAgaW50ZXJmYWNlIFdpbmRvd0V2ZW50TWFwIHtcclxuICAgICAgICBbRXZlbnRIdWIuQ2hpbGRFdmVudE5hbWVdOiBDdXN0b21FdmVudDxFdmVudEh1Yi5DaGlsZEV2ZW50RGV0YWlsPjtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEFuIEV2ZW50RW1pdHRlciBzaW5nbGV0b24gdGhhdCBwcm9wYWdhdGVzIGV2ZW50c1xyXG4gKiBhY3Jvc3MgbXVsdGlwbGUgd2luZG93cy4gVGhpcyBpcyBhIGxpdHRsZSBiaXQgdHJpY2tpZXIgc2luY2VcclxuICogd2luZG93cyBhcmUgYWxsb3dlZCB0byBvcGVuIGNoaWxkV2luZG93cyBpbiB0aGVpciBvd24gcmlnaHQuXHJcbiAqXHJcbiAqIFRoaXMgbWVhbnMgdGhhdCB3ZSBkZWFsIHdpdGggYSB0cmVlIG9mIHdpbmRvd3MuIFRoZXJlZm9yZSwgd2UgZG8gdGhlIGV2ZW50IHByb3BhZ2F0aW9uIGluIHR3byBwaGFzZXM6XHJcbiAqXHJcbiAqIC0gUHJvcGFnYXRlIGV2ZW50cyBmcm9tIHRoaXMgbGF5b3V0IHRvIHRoZSBwYXJlbnQgbGF5b3V0XHJcbiAqICAgLSBSZXBlYXQgdW50aWwgdGhlIGV2ZW50IGFycml2ZWQgYXQgdGhlIHJvb3QgbGF5b3V0XHJcbiAqIC0gUHJvcGFnYXRlIGV2ZW50cyB0byB0aGlzIGxheW91dCBhbmQgdG8gYWxsIGNoaWxkcmVuXHJcbiAqICAgLSBSZXBlYXQgdW50aWwgYWxsIGxheW91dHMgZ290IHRoZSBldmVudFxyXG4gKlxyXG4gKiAqKldBUk5JTkcqKjogT25seSB1c2VyQnJvYWRjYXN0IGV2ZW50cyBhcmUgcHJvcGFnYXRlZCBiZXR3ZWVuIHdpbmRvd3MuXHJcbiAqIFRoaXMgbWVhbnMgdGhlIHlvdSBoYXZlIHRvIHRha2UgY2FyZSBvZiBwcm9wYWdhdGluZyBzdGF0ZSBjaGFuZ2VzIGJldHdlZW4gd2luZG93cyB5b3Vyc2VsZi5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEV2ZW50SHViIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jaGlsZEV2ZW50TGlzdGVuZXIgPSAoY2hpbGRFdmVudDogQ3VzdG9tRXZlbnQ8RXZlbnRIdWIuQ2hpbGRFdmVudERldGFpbD4pID0+IHRoaXMub25FdmVudEZyb21DaGlsZChjaGlsZEV2ZW50KTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgRXZlbnRIdWIgaW5zdGFuY2VcclxuICAgICAqIEBwYXJhbSBfbGF5b3V0TWFuYWdlciAtIHRoZSBsYXlvdXQgbWFuYWdlciB0byBzeW5jaHJvbml6ZSBiZXR3ZWVuIHRoZSB3aW5kb3dzXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXJcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgZ2xvYmFsVGhpcy5hZGRFdmVudExpc3RlbmVyKEV2ZW50SHViLkNoaWxkRXZlbnROYW1lLCB0aGlzLl9jaGlsZEV2ZW50TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXQgYW4gZXZlbnQgYW5kIG5vdGlmeSBsaXN0ZW5lcnNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAgKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGxpc3RlbmVyXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIGVtaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCAuLi5hcmdzOiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXBbS10pOiB2b2lkIHtcclxuICAgICAgICBpZiAoZXZlbnROYW1lID09PSAndXNlckJyb2FkY2FzdCcpIHtcclxuICAgICAgICAgICAgLy8gRXhwbGljaXRseSByZWRpcmVjdCB0aGUgdXNlciBicm9hZGNhc3QgdG8gb3VyIG92ZXJyaWRkZW4gbWV0aG9kLlxyXG4gICAgICAgICAgICB0aGlzLmVtaXRVc2VyQnJvYWRjYXN0KC4uLmFyZ3MpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCcm9hZGNhc3RzIGEgbWVzc2FnZSB0byBhbGwgb3RoZXIgY3VycmVudGx5IG9wZW5lZCB3aW5kb3dzLlxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBlbWl0VXNlckJyb2FkY2FzdCguLi5hcmdzOiBFdmVudEVtaXR0ZXIuVW5rbm93blBhcmFtcyk6IHZvaWQge1xyXG4gICAgICAgIC8vIFN0ZXAgMTogQnViYmxlIHVwIHRoZSBldmVudFxyXG4gICAgICAgIHRoaXMuaGFuZGxlVXNlckJyb2FkY2FzdEV2ZW50KCd1c2VyQnJvYWRjYXN0JywgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGUgRXZlbnRIdWJcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbFRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihFdmVudEh1Yi5DaGlsZEV2ZW50TmFtZSwgdGhpcy5fY2hpbGRFdmVudExpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIHByb2Nlc3NvciB0byBwcm9jZXNzIGxvY2FsIGV2ZW50cy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVVzZXJCcm9hZGNhc3RFdmVudChldmVudE5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bltdKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIuaXNTdWJXaW5kb3cpIHtcclxuICAgICAgICAgICAgLy8gV2UgYXJlIGEgc3ViIHdpbmRvdyBhbmQgcmVjZWl2ZWQgYW4gZXZlbnQgZnJvbSBvbmUgb2Ygb3VyIGNoaWxkcmVuLlxyXG4gICAgICAgICAgICAvLyBTbyBwcm9wYWdhdGUgaXQgdG8gdGhlIFJvb3QuXHJcbiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRlVG9QYXJlbnQoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBXZSBhcmUgdGhlIHJvb3Qgd2luZG93LCBwcm9wYWdhdGUgaXQgdG8gdGhlIHN1YnRyZWUgYmVsb3cgdXMuXHJcbiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRlVG9UaGlzQW5kU3VidHJlZShldmVudE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIGZvciBjaGlsZCBldmVudHMgcmFpc2VkIG9uIHRoZSB3aW5kb3dcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uRXZlbnRGcm9tQ2hpbGQoZXZlbnQ6IEN1c3RvbUV2ZW50PEV2ZW50SHViLkNoaWxkRXZlbnREZXRhaWw+KSB7XHJcbiAgICAgICAgY29uc3QgZGV0YWlsID0gZXZlbnQuZGV0YWlsO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlVXNlckJyb2FkY2FzdEV2ZW50KGRldGFpbC5ldmVudE5hbWUsIGRldGFpbC5hcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb3BhZ2F0ZXMgdGhlIGV2ZW50IHRvIHRoZSBwYXJlbnQgYnkgZW1pdHRpbmdcclxuICAgICAqIGl0IG9uIHRoZSBwYXJlbnQncyBET00gd2luZG93XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwcm9wYWdhdGVUb1BhcmVudChldmVudE5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bltdKSB7XHJcbiAgICAgICAgY29uc3QgZGV0YWlsOiBFdmVudEh1Yi5DaGlsZEV2ZW50RGV0YWlsID0ge1xyXG4gICAgICAgICAgICBsYXlvdXRNYW5hZ2VyOiB0aGlzLl9sYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgICAgICBldmVudE5hbWUsXHJcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3MsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBldmVudEluaXQ6IEV2ZW50SHViLkNoaWxkRXZlbnRJbml0ID0ge1xyXG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxyXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICBkZXRhaWwsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8RXZlbnRIdWIuQ2hpbGRFdmVudERldGFpbD4oRXZlbnRIdWIuQ2hpbGRFdmVudE5hbWUsIGV2ZW50SW5pdCk7XHJcbiAgICAgICAgY29uc3Qgb3BlbmVyID0gZ2xvYmFsVGhpcy5vcGVuZXI7XHJcbiAgICAgICAgaWYgKG9wZW5lciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignRUhQVFAxNTc3OCcpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvcGVuZXIuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9wYWdhdGUgZXZlbnRzIHRvIHRoZSB3aG9sZSBzdWJ0cmVlIHVuZGVyIHRoaXMgZXZlbnQgaHViLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcHJvcGFnYXRlVG9UaGlzQW5kU3VidHJlZShldmVudE5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bltdKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0VW5rbm93bihldmVudE5hbWUsIC4uLmFyZ3MpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGF5b3V0TWFuYWdlci5vcGVuUG9wb3V0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZEdsID0gdGhpcy5fbGF5b3V0TWFuYWdlci5vcGVuUG9wb3V0c1tpXS5nZXRHbEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2hpbGRHbCkge1xyXG4gICAgICAgICAgICAgICAgY2hpbGRHbC5ldmVudEh1Yi5wcm9wYWdhdGVUb1RoaXNBbmRTdWJ0cmVlKGV2ZW50TmFtZSwgYXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgRXZlbnRIdWIge1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBjb25zdCBDaGlsZEV2ZW50TmFtZSA9ICdnbF9jaGlsZF9ldmVudCc7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2hpbGRFdmVudERldGFpbCA9IHtcclxuICAgICAgICBsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyO1xyXG4gICAgICAgIGV2ZW50TmFtZTogc3RyaW5nO1xyXG4gICAgICAgIGFyZ3M6IHVua25vd25bXTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2hpbGRFdmVudEluaXQgPSBDdXN0b21FdmVudEluaXQ8Q2hpbGRFdmVudERldGFpbD47XHJcbn1cclxuIiwiaW1wb3J0IHsgQXNzZXJ0RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNvbnN0IGVudW0gSTE4blN0cmluZ0lkIHtcclxuICAgIFBvcG91dENhbm5vdEJlQ3JlYXRlZFdpdGhHcm91bmRJdGVtQ29uZmlnLFxyXG4gICAgUGxlYXNlUmVnaXN0ZXJBQ29uc3RydWN0b3JGdW5jdGlvbixcclxuICAgIENvbXBvbmVudFR5cGVOb3RSZWdpc3RlcmVkQW5kQmluZENvbXBvbmVudEV2ZW50SGFuZGxlck5vdEFzc2lnbmVkLFxyXG4gICAgQ29tcG9uZW50SXNBbHJlYWR5UmVnaXN0ZXJlZCxcclxuICAgIENvbXBvbmVudElzTm90VmlydHVhYmxlLFxyXG4gICAgVmlydHVhbENvbXBvbmVudERvZXNOb3RIYXZlUm9vdEh0bWxFbGVtZW50LFxyXG4gICAgSXRlbUNvbmZpZ0lzTm90VHlwZUNvbXBvbmVudCxcclxuICAgIEludmFsaWROdW1iZXJQYXJ0SW5TaXplU3RyaW5nLFxyXG4gICAgVW5rbm93blVuaXRJblNpemVTdHJpbmcsXHJcbiAgICBVbnN1cHBvcnRlZFVuaXRJblNpemVTdHJpbmcsXHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSTE4blN0cmluZ3Mge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgbGV0IGluaXRpYWxpc2VkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgaW50ZXJmYWNlIEluZm8ge1xyXG4gICAgICAgIHJlYWRvbmx5IGlkOiBJMThuU3RyaW5nSWQ7XHJcbiAgICAgICAgcmVhZG9ubHkgZGVmYXVsdDogc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHR5cGUgSW5mb3NPYmplY3QgPSB7IFtpZCBpbiBrZXlvZiB0eXBlb2YgSTE4blN0cmluZ0lkXTogSW5mbyB9O1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0IGluZm9zT2JqZWN0OiBJbmZvc09iamVjdCA9IHtcclxuICAgICAgICBQb3BvdXRDYW5ub3RCZUNyZWF0ZWRXaXRoR3JvdW5kSXRlbUNvbmZpZzoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLlBvcG91dENhbm5vdEJlQ3JlYXRlZFdpdGhHcm91bmRJdGVtQ29uZmlnLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnUG9wb3V0IGNhbm5vdCBiZSBjcmVhdGVkIHdpdGggZ3JvdW5kIEl0ZW1Db25maWcnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBQbGVhc2VSZWdpc3RlckFDb25zdHJ1Y3RvckZ1bmN0aW9uOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuUGxlYXNlUmVnaXN0ZXJBQ29uc3RydWN0b3JGdW5jdGlvbixcclxuICAgICAgICAgICAgZGVmYXVsdDogJ1BsZWFzZSByZWdpc3RlciBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgQ29tcG9uZW50VHlwZU5vdFJlZ2lzdGVyZWRBbmRCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyTm90QXNzaWduZWQ6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5Db21wb25lbnRUeXBlTm90UmVnaXN0ZXJlZEFuZEJpbmRDb21wb25lbnRFdmVudEhhbmRsZXJOb3RBc3NpZ25lZCxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ0NvbXBvbmVudCB0eXBlIG5vdCByZWdpc3RlcmVkIGFuZCBCaW5kQ29tcG9uZW50RXZlbnQgaGFuZGxlciBub3QgYXNzaWduZWQnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgQ29tcG9uZW50SXNBbHJlYWR5UmVnaXN0ZXJlZDoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLkNvbXBvbmVudElzQWxyZWFkeVJlZ2lzdGVyZWQsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdDb21wb25lbnQgaXMgYWxyZWFkeSByZWdpc3RlcmVkJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIENvbXBvbmVudElzTm90VmlydHVhYmxlOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuQ29tcG9uZW50SXNOb3RWaXJ0dWFibGUsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdDb21wb25lbnQgaXMgbm90IHZpcnR1YWJsZS4gUmVxdWlyZXMgcm9vdEh0bWxFbGVtZW50IGZpZWxkL2dldHRlcicsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBWaXJ0dWFsQ29tcG9uZW50RG9lc05vdEhhdmVSb290SHRtbEVsZW1lbnQ6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5WaXJ0dWFsQ29tcG9uZW50RG9lc05vdEhhdmVSb290SHRtbEVsZW1lbnQsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdWaXJ0dWFsIGNvbXBvbmVudCBkb2VzIG5vdCBoYXZlIGdldHRlciBcInJvb3RIdG1sRWxlbWVudFwiJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIEl0ZW1Db25maWdJc05vdFR5cGVDb21wb25lbnQ6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5JdGVtQ29uZmlnSXNOb3RUeXBlQ29tcG9uZW50LFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnSXRlbUNvbmZpZyBpcyBub3Qgb2YgdHlwZSBjb21wb25lbnQnLFxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIEludmFsaWROdW1iZXJQYXJ0SW5TaXplU3RyaW5nOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuSW52YWxpZE51bWJlclBhcnRJblNpemVTdHJpbmcsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdJbnZhbGlkIG51bWJlciBwYXJ0IGluIHNpemUgc3RyaW5nJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIFVua25vd25Vbml0SW5TaXplU3RyaW5nOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuVW5rbm93blVuaXRJblNpemVTdHJpbmcsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdVbmtub3duIHVuaXQgaW4gc2l6ZSBzdHJpbmcnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgVW5zdXBwb3J0ZWRVbml0SW5TaXplU3RyaW5nOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuVW5zdXBwb3J0ZWRVbml0SW5TaXplU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnVW5zdXBwb3J0ZWQgdW5pdCBpbiBzaXplIHN0cmluZycsXHJcbiAgICAgICAgfSxcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY29uc3QgaWRDb3VudCA9IE9iamVjdC5rZXlzKGluZm9zT2JqZWN0KS5sZW5ndGg7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdCBpbmZvcyA9IE9iamVjdC52YWx1ZXMoaW5mb3NPYmplY3QpO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjaGVja0luaXRpYWxpc2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFpbml0aWFsaXNlZCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IGluZm9zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZm8uaWQgIT09IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0lOU0kwMDExMCcsIGAke2l9OiAke2luZm8uaWR9YCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGkxOG5TdHJpbmdzW2ldID0gaW5mby5kZWZhdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluaXRpYWxpc2VkID0gdHJ1ZTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNvbnN0IGkxOG5TdHJpbmdzID0gbmV3IEFycmF5PHN0cmluZz4oSTE4blN0cmluZ3MuaWRDb3VudCk7XHJcbiIsIi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgU3R5bGVDb25zdGFudHMge1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRDb21wb25lbnRCYXNlWkluZGV4ID0gJ2F1dG8nO1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRDb21wb25lbnREcmFnWkluZGV4ID0gJzMyJztcclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0Q29tcG9uZW50U3RhY2tNYXhpbWlzZWRaSW5kZXggPSAnNDEnO1xyXG59XHJcbiIsImltcG9ydCB7IFVucmVhY2hhYmxlQ2FzZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgU3R5bGVDb25zdGFudHMgfSBmcm9tICcuL3N0eWxlLWNvbnN0YW50cyc7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCB0eXBlIFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUgPSAnd2lkdGgnIHwgJ2hlaWdodCc7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZSB7XHJcbiAgICBleHBvcnQgY29uc3Qgd2lkdGggPSAnd2lkdGgnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGhlaWdodCA9ICdoZWlnaHQnO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgV2lkdGhBbmRIZWlnaHQge1xyXG4gICAgd2lkdGg6IG51bWJlcjtcclxuICAgIGhlaWdodDogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGVmdEFuZFRvcCB7XHJcbiAgICBsZWZ0OiBudW1iZXI7XHJcbiAgICB0b3A6IG51bWJlcjtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IHR5cGUgU2lkZSA9ICd0b3AnIHwgJ2xlZnQnIHwgJ3JpZ2h0JyB8ICdib3R0b20nO1xyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFNpZGUge1xyXG4gICAgZXhwb3J0IGNvbnN0IHRvcCA9ICd0b3AnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGxlZnQgPSAnbGVmdCc7XHJcbiAgICBleHBvcnQgY29uc3QgcmlnaHQgPSAncmlnaHQnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGJvdHRvbSA9ICdib3R0b20nO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgdHlwZSBMb2dpY2FsWkluZGV4ID0gJ2Jhc2UnIHwgJ2RyYWcnIHwgJ3N0YWNrTWF4aW1pc2VkJztcclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBMb2dpY2FsWkluZGV4IHtcclxuICAgIGV4cG9ydCBjb25zdCBiYXNlID0gJ2Jhc2UnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGRyYWcgPSAnZHJhZyc7XHJcbiAgICBleHBvcnQgY29uc3Qgc3RhY2tNYXhpbWlzZWQgPSAnc3RhY2tNYXhpbWlzZWQnO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY29uc3QgTG9naWNhbFpJbmRleFRvRGVmYXVsdE1hcCA9IHtcclxuICAgIGJhc2U6IFN0eWxlQ29uc3RhbnRzLmRlZmF1bHRDb21wb25lbnRCYXNlWkluZGV4LFxyXG4gICAgZHJhZzogU3R5bGVDb25zdGFudHMuZGVmYXVsdENvbXBvbmVudERyYWdaSW5kZXgsXHJcbiAgICBzdGFja01heGltaXNlZDogU3R5bGVDb25zdGFudHMuZGVmYXVsdENvbXBvbmVudFN0YWNrTWF4aW1pc2VkWkluZGV4LFxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVjdCB7XHJcbiAgICBsZWZ0OiBudW1iZXIsXHJcbiAgICB0b3A6IG51bWJlcixcclxuICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICBoZWlnaHQ6IG51bWJlcixcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEFyZWFMaW5rZWRSZWN0IHtcclxuICAgIHgxOiBudW1iZXIsIC8vIGxlZnRcclxuICAgIHgyOiBudW1iZXIsIC8vIG5leHRMZWZ0XHJcbiAgICB5MTogbnVtYmVyLCAvLyB0b3BcclxuICAgIHkyOiBudW1iZXIsIC8vIG5leHRUb3BcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcclxuZXhwb3J0IHR5cGUgSnNvblZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCBKc29uIHwgb2JqZWN0IHwgSnNvblZhbHVlQXJyYXk7XHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSnNvbiB7XHJcbiAgICBbbmFtZTogc3RyaW5nXTogSnNvblZhbHVlO1xyXG59XHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCB0eXBlIEpzb25WYWx1ZUFycmF5ID0gQXJyYXk8SnNvblZhbHVlPlxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEpzb25WYWx1ZSB7XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNKc29uKHZhbHVlOiBKc29uVmFsdWUpOiB2YWx1ZSBpcyBKc29uIHtcclxuICAgICAgICByZXR1cm4gaXNKc29uT2JqZWN0KHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzSnNvbk9iamVjdCh2YWx1ZTogSnNvblZhbHVlKTogdmFsdWUgaXMgSnNvbiB8IG9iamVjdCB7XHJcbiAgICAgICAgcmV0dXJuICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgdHlwZSBJdGVtVHlwZSA9ICdncm91bmQnIHwgJ3JvdycgfCAnY29sdW1uJyB8ICdzdGFjaycgfCAnY29tcG9uZW50JztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSXRlbVR5cGUge1xyXG4gICAgZXhwb3J0IGNvbnN0IGdyb3VuZCA9ICdncm91bmQnO1xyXG4gICAgZXhwb3J0IGNvbnN0IHJvdyA9ICdyb3cnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGNvbHVtbiA9ICdjb2x1bW4nO1xyXG4gICAgZXhwb3J0IGNvbnN0IHN0YWNrID0gJ3N0YWNrJztcclxuICAgIGV4cG9ydCBjb25zdCBjb21wb25lbnQgPSAnY29tcG9uZW50JztcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IHR5cGUgUmVzcG9uc2l2ZU1vZGUgPSAnbm9uZScgfCAnYWx3YXlzJyB8ICdvbmxvYWQnO1xyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc3BvbnNpdmVNb2RlIHtcclxuICAgIGV4cG9ydCBjb25zdCBub25lID0gJ25vbmUnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGFsd2F5cyA9ICdhbHdheXMnO1xyXG4gICAgZXhwb3J0IGNvbnN0IG9ubG9hZCA9ICdvbmxvYWQnO1xyXG59XHJcblxyXG4vKipcclxuICogTGVuZ3RoIHVuaXRzIHdoaWNoIGNhbiBzcGVjaWZ5IHRoZSBzaXplIG9mIGEgQ29tcG9uZW50IEl0ZW1cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IHR5cGUgU2l6ZVVuaXQgPSAncHgnIHwgJyUnIHwgJ2ZyJyB8ICdlbSc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgZW51bSBTaXplVW5pdEVudW0ge1xyXG4gICAgUGl4ZWwgPSAncHgnLFxyXG4gICAgUGVyY2VudCA9ICclJyxcclxuICAgIEZyYWN0aW9uYWwgPSAnZnInLFxyXG4gICAgRW0gPSAnZW0nLFxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFNpemVVbml0RW51bSB7XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gdHJ5UGFyc2UodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uUGl4ZWw6IHJldHVybiBTaXplVW5pdEVudW0uUGl4ZWw7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLlBlcmNlbnQ6IHJldHVybiBTaXplVW5pdEVudW0uUGVyY2VudDtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uRnJhY3Rpb25hbDogcmV0dXJuIFNpemVVbml0RW51bS5GcmFjdGlvbmFsO1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5FbTogcmV0dXJuIFNpemVVbml0RW51bS5FbTtcclxuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdCh2YWx1ZTogU2l6ZVVuaXRFbnVtKSB7XHJcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5QaXhlbDogcmV0dXJuIFNpemVVbml0RW51bS5QaXhlbDtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uUGVyY2VudDogcmV0dXJuIFNpemVVbml0RW51bS5QZXJjZW50O1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5GcmFjdGlvbmFsOiByZXR1cm4gU2l6ZVVuaXRFbnVtLkZyYWN0aW9uYWw7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLkVtOiByZXR1cm4gU2l6ZVVuaXRFbnVtLkVtO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdTVUVGNDQ5OTgnLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IExlZnRBbmRUb3AsIFdpZHRoQW5kSGVpZ2h0IH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJUb1BpeGVscyh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygxMCkgKyAncHgnO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwaXhlbHNUb051bWJlcih2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IG51bWJlclN0ciA9IHZhbHVlLnJlcGxhY2UoXCJweFwiLCBcIlwiKTtcclxuICAgIHJldHVybiBwYXJzZUZsb2F0KG51bWJlclN0cik7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBTcGxpdFN0cmluZ0F0Rmlyc3ROb25OdW1lcmljQ2hhclJlc3VsdCB7XHJcbiAgICBudW1lcmljUGFydDogc3RyaW5nO1xyXG4gICAgZmlyc3ROb25OdW1lcmljQ2hhclBhcnQ6IHN0cmluZztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTdHJpbmdBdEZpcnN0Tm9uTnVtZXJpY0NoYXIodmFsdWU6IHN0cmluZyk6IFNwbGl0U3RyaW5nQXRGaXJzdE5vbk51bWVyaWNDaGFyUmVzdWx0IHtcclxuICAgIHZhbHVlID0gdmFsdWUudHJpbVN0YXJ0KCk7XHJcblxyXG4gICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xyXG4gICAgaWYgKGxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiB7IG51bWVyaWNQYXJ0OiAnJywgZmlyc3ROb25OdW1lcmljQ2hhclBhcnQ6ICcnIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGZpcnN0Tm9uRGlnaXRQYXJ0SW5kZXggPSBsZW5ndGg7XHJcbiAgICAgICAgbGV0IGdvdERlY2ltYWxQb2ludCA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY2hhciA9IHZhbHVlW2ldO1xyXG4gICAgICAgICAgICBpZiAoIWlzRGlnaXQoY2hhcikpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGFyICE9PSAnLicpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdE5vbkRpZ2l0UGFydEluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdvdERlY2ltYWxQb2ludCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE5vbkRpZ2l0UGFydEluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ290RGVjaW1hbFBvaW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGlnaXRzUGFydCA9IHZhbHVlLnN1YnN0cmluZygwLCBmaXJzdE5vbkRpZ2l0UGFydEluZGV4KTtcclxuICAgICAgICBjb25zdCBmaXJzdE5vbkRpZ2l0UGFydCA9IHZhbHVlLnN1YnN0cmluZyhmaXJzdE5vbkRpZ2l0UGFydEluZGV4KS50cmltKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7IG51bWVyaWNQYXJ0OiBkaWdpdHNQYXJ0LCBmaXJzdE5vbk51bWVyaWNDaGFyUGFydDogZmlyc3ROb25EaWdpdFBhcnQgfTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNEaWdpdChjaGFyOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBjaGFyID49ICcwJyAmJiBjaGFyIDw9ICc5JztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudFdpZHRoKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogbnVtYmVyIHtcclxuICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFdpZHRoO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRFbGVtZW50V2lkdGgoZWxlbWVudDogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IHdpZHRoQXNQaXhlbHMgPSBudW1iZXJUb1BpeGVscyh3aWR0aCk7XHJcbiAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gd2lkdGhBc1BpeGVscztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudEhlaWdodChlbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEVsZW1lbnRIZWlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBoZWlnaHRBc1BpeGVscyA9IG51bWJlclRvUGl4ZWxzKGhlaWdodCk7XHJcbiAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodEFzUGl4ZWxzO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBXaWR0aEFuZEhlaWdodCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHdpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoLFxyXG4gICAgICAgIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQsXHJcbiAgICB9O1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRXaW5kb3dUb3BMZWZ0Qm9yZGVyKHdpbmRvdzogV2luZG93IHwgdHlwZW9mIGdsb2JhbFRoaXMpOiBXaWR0aEFuZEhlaWdodCB7XHJcbiAgICBsZXQgaW5uZXJTY3JlZW5YOiBudW1iZXIgfCB1bmRlZmluZWQgPSAoPGFueT53aW5kb3cpLm1veklubmVyU2NyZWVuWDtcclxuICAgIGxldCBpbm5lclNjcmVlblk6IG51bWJlciB8IHVuZGVmaW5lZCA9ICg8YW55PndpbmRvdykubW96SW5uZXJTY3JlZW5ZO1xyXG4gICAgbGV0IGJvcmRlclg6IG51bWJlciwgYm9yZGVyWTogbnVtYmVyO1xyXG5cclxuICAgIGlmIChpbm5lclNjcmVlblggPT09IHVuZGVmaW5lZCB8fCBpbm5lclNjcmVlblkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGJvcmRlclggPSAod2luZG93Lm91dGVyV2lkdGggLSB3aW5kb3cuaW5uZXJXaWR0aCkgLyAyOyAgICAgICAgLy8gQXNzdW1lIGxlZnQgLyByaWdodCBib3JkZXIgaXMgdGhlIHNhbWVcclxuICAgICAgICBib3JkZXJZID0gd2luZG93Lm91dGVySGVpZ2h0IC0gd2luZG93LmlubmVySGVpZ2h0IC0gYm9yZGVyWDsgIC8vIEFzc3VtZSBib3R0b20gYm9yZGVyIGlzIHRoZSBzYW1lIGFzIGxlZnQgLyByaWdodFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBib3JkZXJYID0gaW5uZXJTY3JlZW5YIC0gd2luZG93LnNjcmVlblg7XHJcbiAgICAgICAgYm9yZGVyWSA9IGlubmVyU2NyZWVuWSAtIHdpbmRvdy5zY3JlZW5ZO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHdpZHRoOiBNYXRoLm1heCgwLCBib3JkZXJYKSwgaGVpZ2h0OiBNYXRoLm1heCgwLCBib3JkZXJZKSB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFdpbmRvd0lubmVyU2NyZWVuUG9zaXRpb24od2luZG93OiBXaW5kb3cgfCB0eXBlb2YgZ2xvYmFsVGhpcyk6IExlZnRBbmRUb3Age1xyXG4gICAgbGV0IGlubmVyU2NyZWVuWDogbnVtYmVyIHwgdW5kZWZpbmVkID0gKDxhbnk+d2luZG93KS5tb3pJbm5lclNjcmVlblg7XHJcbiAgICBsZXQgaW5uZXJTY3JlZW5ZOiBudW1iZXIgfCB1bmRlZmluZWQgPSAoPGFueT53aW5kb3cpLm1veklubmVyU2NyZWVuWTtcclxuXHJcbiAgICBpZiAoaW5uZXJTY3JlZW5YID09PSB1bmRlZmluZWQgfHwgaW5uZXJTY3JlZW5ZID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBib3JkZXIgPSBnZXRXaW5kb3dUb3BMZWZ0Qm9yZGVyKHdpbmRvdyk7XHJcbiAgICAgICAgaW5uZXJTY3JlZW5YID0gd2luZG93LnNjcmVlblggKyBib3JkZXIud2lkdGg7XHJcbiAgICAgICAgaW5uZXJTY3JlZW5ZID0gd2luZG93LnNjcmVlblkgKyBib3JkZXIuaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IGxlZnQ6IGlubmVyU2NyZWVuWCwgdG9wOiBpbm5lclNjcmVlblkgfTtcclxufVxyXG5cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eShlbGVtZW50OiBIVE1MRWxlbWVudCwgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHZpc2libGUpIHtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVFbGVtZW50UG9zaXRpb25BYnNvbHV0ZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgYWJzb2x1dGVQb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICBpZiAoZWxlbWVudC5zdHlsZS5wb3NpdGlvbiAhPT0gYWJzb2x1dGVQb3NpdGlvbikge1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBhYnNvbHV0ZVBvc2l0aW9uO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmVwbGFjZW1lbnQgZm9yIEpRdWVyeSAkLmV4dGVuZCh0YXJnZXQsIG9iailcclxuICogQGludGVybmFsXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IG9ialtrZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXBsYWNlbWVudCBmb3IgSlF1ZXJ5ICQuZXh0ZW5kKHRydWUsIHRhcmdldCwgb2JqKVxyXG4gKiBAaW50ZXJuYWxcclxuKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFeHRlbmQodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcclxuICAgIGlmIChvYmogIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1RhcmdldCA9IHRhcmdldFtrZXldO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBkZWVwRXh0ZW5kVmFsdWUoZXhpc3RpbmdUYXJnZXQsIHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXh0ZW5kVmFsdWUoZXhpc3RpbmdUYXJnZXQ6IHVua25vd24sIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0QXJyYXkgPSBuZXcgQXJyYXk8dW5rbm93bj4obGVuZ3RoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHZhbHVlW2ldO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXlbaV0gPSBkZWVwRXh0ZW5kVmFsdWUoe30sIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRBcnJheTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVPYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1RhcmdldCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZXBFeHRlbmQoe30sIHZhbHVlT2JqKTsgLy8gb3ZlcndyaXRlXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmdUYXJnZXQgIT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZXBFeHRlbmQoe30sIHZhbHVlT2JqKTsgLy8gb3ZlcndyaXRlXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmdUYXJnZXQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVlcEV4dGVuZCh7fSwgdmFsdWVPYmopOyAvLyBvdmVyd3JpdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1RhcmdldCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWVwRXh0ZW5kKHt9LCB2YWx1ZU9iaik7IC8vIG92ZXJ3cml0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1RhcmdldE9iaiA9IGV4aXN0aW5nVGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWVwRXh0ZW5kKGV4aXN0aW5nVGFyZ2V0T2JqLCB2YWx1ZU9iaik7IC8vIG1lcmdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUZyb21BcnJheTxUPihpdGVtOiBULCBhcnJheTogVFtdKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbmRleCA9IGFycmF5LmluZGV4T2YoaXRlbSk7XHJcblxyXG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCByZW1vdmUgaXRlbSBmcm9tIGFycmF5LiBJdGVtIGlzIG5vdCBpbiB0aGUgYXJyYXknKTtcclxuICAgIH1cclxuXHJcbiAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmlxdWVJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIChNYXRoLnJhbmRvbSgpICogMTAwMDAwMDAwMDAwMDAwMClcclxuICAgICAgICAudG9TdHJpbmcoMzYpXHJcbiAgICAgICAgLnJlcGxhY2UoJy4nLCAnJyk7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZShlOiB1bmtub3duKTogc3RyaW5nIHtcclxuICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICByZXR1cm4gZS5tZXNzYWdlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodHlwZW9mIGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnVW5rbm93biBFcnJvcic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IExheW91dENvbmZpZyB9IGZyb20gJy4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZywgUmVzb2x2ZWRMYXlvdXRDb25maWcsIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIH0gZnJvbSAnLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnLi9jb250YWluZXIvY29tcG9uZW50LWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IEJpbmRFcnJvciB9IGZyb20gJy4vZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEkxOG5TdHJpbmdJZCwgaTE4blN0cmluZ3MgfSBmcm9tICcuL3V0aWxzL2kxOG4tc3RyaW5ncyc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgVmlydHVhbExheW91dCBleHRlbmRzIExheW91dE1hbmFnZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5iaW5kQ29tcG9uZW50RXZlbnR9IGFuZFxyXG4gICAgICoge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS51bmJpbmRDb21wb25lbnRFdmVudH0gd2l0aCB2aXJ0dWFsIGNvbXBvbmVudHNcclxuICAgICAqL1xyXG4gICAgZ2V0Q29tcG9uZW50RXZlbnQ6IFZpcnR1YWxMYXlvdXQuR2V0Q29tcG9uZW50RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5iaW5kQ29tcG9uZW50RXZlbnR9IGFuZFxyXG4gICAgICoge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS51bmJpbmRDb21wb25lbnRFdmVudH0gd2l0aCB2aXJ0dWFsIGNvbXBvbmVudHNcclxuICAgICAqL1xyXG4gICAgcmVsZWFzZUNvbXBvbmVudEV2ZW50OiBWaXJ0dWFsTGF5b3V0LlJlbGVhc2VDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgYmluZENvbXBvbmVudEV2ZW50OiBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcbiAgICB1bmJpbmRDb21wb25lbnRFdmVudDogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB1c2Ugd2hpbGUgY29uc3RydWN0b3IgaXMgbm90IGRldGVybWluYXRlICovXHJcbiAgICBwcml2YXRlIF9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3RvciA9IGZhbHNlOyAvLyByZW1vdmUgd2hlbiBjb25zdHJ1Y3RvciBpcyBkZXRlcm1pbmF0ZVxyXG4gICAgLyoqIEBpbnRlcm5hbCAgQGRlcHJlY2F0ZWQgdXNlIHdoaWxlIGNvbnN0cnVjdG9yIGlzIG5vdCBkZXRlcm1pbmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBfY3JlYXRpb25UaW1lb3V0UGFzc2VkID0gZmFsc2U7IC8vIHJlbW92ZSB3aGVuIGNvbnN0cnVjdG9yIGlzIGRldGVybWluYXRlXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gY29udGFpbmVyIC0gQSBEb20gSFRNTCBlbGVtZW50LiBEZWZhdWx0cyB0byBib2R5XHJcbiAgICAgKiBAcGFyYW0gYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gYmluZCBjb21wb25lbnRzXHJcbiAgICAgKiBAcGFyYW0gYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gdW5iaW5kIGNvbXBvbmVudHNcclxuICAgICAqIElmIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgaXMgZGVmaW5lZCwgdGhlbiBjb25zdHJ1Y3RvciB3aWxsIGJlIGRldGVybWluYXRlLiBJdCB3aWxsIGFsd2F5cyBjYWxsIHRoZSBpbml0KClcclxuICAgICAqIGZ1bmN0aW9uIGFuZCB0aGUgaW5pdCgpIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGNvbXBsZXRlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgd2lsbCBiZSBjYWxsZWRcclxuICAgICAqIGlmIGNvbnN0cnVjdG9yIGlzIGZvciBhIHBvcG91dCB3aW5kb3cuIE1ha2Ugc3VyZSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIGlzIHJlYWR5IGZvciBldmVudHMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI/OiBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgdW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICApO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHNwZWNpZnkgbGF5b3V0Q29uZmlnIGluIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykubG9hZExheW91dH0gKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTGF5b3V0Q29uZmlnLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWdPck9wdGlvbmFsQ29udGFpbmVyOiBMYXlvdXRDb25maWcgfCBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI6IEhUTUxFbGVtZW50IHwgVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcjogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgc2tpcEluaXQ6IHRydWUsXHJcbiAgICApO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lcjogTGF5b3V0Q29uZmlnIHwgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogSFRNTEVsZW1lbnQgfCBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgdW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgc2tpcEluaXQ/OiB0cnVlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoVmlydHVhbExheW91dC5jcmVhdGVMYXlvdXRNYW5hZ2VyQ29uc3RydWN0b3JQYXJhbWV0ZXJzKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXIsIGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcikpO1xyXG5cclxuICAgICAgICBpZiAoY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZENvbXBvbmVudEV2ZW50ID0gY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZENvbXBvbmVudEV2ZW50SGFubGRlclBhc3NlZEluQ29uc3RydWN0b3IgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5iaW5kQ29tcG9uZW50RXZlbnQgPSB1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fYmluZENvbXBvbmVudEV2ZW50SGFubGRlclBhc3NlZEluQ29uc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTdWJXaW5kb3cpIHtcclxuICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50LmJvZHkuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgICAgICAgICAgICAgLy8gU2V0IHVwIGxheW91dENvbmZpZyBzaW5jZSBjb25zdHJ1Y3RvciBpcyBub3QgZGV0ZXJtaW5hdGUgYW5kIG1heSBleGl0IGVhcmx5LiBPdGhlciBmdW5jdGlvbnMgbWF5IG5lZWRcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMubGF5b3V0Q29uZmlnLiB0aGlzLmxheW91dENvbmZpZyBpcyBhZ2FpbiBjYWxjdWxhdGVkIGluIHRoZSBzYW1lIHdheSB3aGVuIGluaXQoKSBjb21wbGV0ZXMuXHJcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyB3aGVuIGNvbnN0cnVjdG9yIGlzIGRldGVybWluYXRlLlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWcgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1ZMQzk4ODIzJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkTGF5b3V0Q29uZmlnID0gTGF5b3V0Q29uZmlnLnJlc29sdmUodGhpcy5fY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJvb3QgZnJvbSBsYXlvdXRDb25maWdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmVzb2x2ZWRMYXlvdXRDb25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChza2lwSW5pdCAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVwcmVjYXRlZENvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYmluZENvbXBvbmVudEV2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMudW5iaW5kQ29tcG9uZW50RXZlbnQgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBhY3R1YWwgbGF5b3V0LiBNdXN0IGJlIGNhbGxlZCBhZnRlciBhbGwgaW5pdGlhbCBjb21wb25lbnRzXHJcbiAgICAgKiBhcmUgcmVnaXN0ZXJlZC4gUmVjdXJzZXMgdGhyb3VnaCB0aGUgY29uZmlndXJhdGlvbiBhbmQgc2V0cyB1cFxyXG4gICAgICogdGhlIGl0ZW0gdHJlZS5cclxuICAgICAqXHJcbiAgICAgKiBJZiBjYWxsZWQgYmVmb3JlIHRoZSBkb2N1bWVudCBpcyByZWFkeSBpdCBhZGRzIGl0c2VsZiBhcyBhIGxpc3RlbmVyXHJcbiAgICAgKiB0byB0aGUgZG9jdW1lbnQucmVhZHkgZXZlbnRcclxuICAgICAqIEBkZXByZWNhdGVkIExheW91dENvbmZpZyBzaG91bGQgbm90IGJlIGxvYWRlZCBpbiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpfSBjb25zdHJ1Y3RvciwgYnV0IHJhdGhlciBpbiBhXHJcbiAgICAgKiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLmxvYWRMYXlvdXR9IGNhbGwuICBJZiBMYXlvdXRDb25maWcgaXMgbm90IHNwZWNpZmllZCBpbiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpfSBjb25zdHJ1Y3RvcixcclxuICAgICAqIHRoZW4gaW5pdCgpIHdpbGwgYmUgYXV0b21hdGljYWxseSBjYWxsZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZXh0ZXJuYWxseS5cclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhlIGRvY3VtZW50IGlzbid0IHJlYWR5IHlldCwgd2FpdCBmb3IgaXQuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKCF0aGlzLl9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3RvciAmJiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8IGRvY3VtZW50LmJvZHkgPT09IG51bGwpKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB0aGlzLmluaXQoKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIGlzIGEgc3Vid2luZG93LCB3YWl0IGEgZmV3IG1pbGxpc2Vjb25kcyBmb3IgdGhlIG9yaWdpbmFsXHJcbiAgICAgICAgICogcGFnZSdzIGpzIGNhbGxzIHRvIGJlIGV4ZWN1dGVkLCB0aGVuIHJlcGxhY2UgdGhlIGJvZGllcyBjb250ZW50XHJcbiAgICAgICAgICogd2l0aCBHb2xkZW5MYXlvdXRcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoIXRoaXMuX2JpbmRDb21wb25lbnRFdmVudEhhbmxkZXJQYXNzZWRJbkNvbnN0cnVjdG9yICYmIHRoaXMuaXNTdWJXaW5kb3cgPT09IHRydWUgJiYgIXRoaXMuX2NyZWF0aW9uVGltZW91dFBhc3NlZCkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaW5pdCgpLCA3KTtcclxuICAgICAgICAgICAgdGhpcy5fY3JlYXRpb25UaW1lb3V0UGFzc2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTdWJXaW5kb3cgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckh0bWxBbmRBZGp1c3RTdHlsZXNGb3JTdWJXaW5kb3coKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gRXhwb3NlIHRoaXMgaW5zdGFuY2Ugb24gdGhlIHdpbmRvdyBvYmplY3QgdG8gYWxsb3cgdGhlIG9wZW5pbmcgd2luZG93IHRvIGludGVyYWN0IHdpdGggaXRcclxuICAgICAgICAgICAgd2luZG93Ll9fZ2xJbnN0YW5jZSA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgZXhpc3RpbmcgSFRNTCBhbmQgYWRqdXN0cyBzdHlsZSB0byBtYWtlIHdpbmRvdyBzdWl0YWJsZSB0byBiZSBhIHBvcG91dCBzdWIgd2luZG93XHJcbiAgICAgKiBDdXJlbnRseSBpcyBhdXRvbWF0aWNhbGx5IGNhbGxlZCB3aGVuIHdpbmRvdyBpcyBhIHN1YldpbmRvdyBhbmQgYmluZENvbXBvbmVudEV2ZW50IGlzIG5vdCBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yXHJcbiAgICAgKiBJZiBiaW5kQ29tcG9uZW50RXZlbnQgaXMgbm90IHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3IsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGVpdGhlciBjYWxsIHRoaXMgZnVuY3Rpb24gZXhwbGljaXRseSBvclxyXG4gICAgICogKHByZWZlcmFibHkpIG1ha2UgdGhlIHdpbmRvdyBzdWl0YWJsZSBhcyBhIHN1YndpbmRvdy5cclxuICAgICAqIEluIHRoZSBmdXR1cmUsIGl0IGlzIHBsYW5uZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIE5PVCBhdXRvbWF0aWNhbGx5IGNhbGxlZCBpbiBhbnkgY2lyY3Vtc3RhbmNlcy4gIEFwcGxpY2F0aW9ucyB3aWxsXHJcbiAgICAgKiBuZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgd2luZG93IGlzIGEgR29sZGVuIExheW91dCBwb3BvdXQgd2luZG93IGFuZCBlaXRoZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIGV4cGxpY2l0bHkgb3JcclxuICAgICAqIGhpZGUgSFRNTCBub3QgcmVsZXZhbnQgdG8gdGhlIHBvcG91dC5cclxuICAgICAqIFNlZSBhcGl0ZXN0IGZvciBhbiBleGFtcGxlIG9mIGhvdyBIVE1MIGlzIGhpZGRlbiB3aGVuIHBvcG91dCB3aW5kb3dzIGFyZSBkaXNwbGF5ZWRcclxuICAgICAqL1xyXG4gICAgY2xlYXJIdG1sQW5kQWRqdXN0U3R5bGVzRm9yU3ViV2luZG93KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGhlYWRFbGVtZW50ID0gZG9jdW1lbnQuaGVhZDtcclxuXHJcbiAgICAgICAgY29uc3QgYXBwZW5kTm9kZUxpc3RzID0gbmV3IEFycmF5PE5vZGVMaXN0T2Y8RWxlbWVudD4+KDQpO1xyXG4gICAgICAgIGFwcGVuZE5vZGVMaXN0c1swXSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgbGluaycpO1xyXG4gICAgICAgIGFwcGVuZE5vZGVMaXN0c1sxXSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgc3R5bGUnKTtcclxuICAgICAgICBhcHBlbmROb2RlTGlzdHNbMl0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZW1wbGF0ZScpO1xyXG4gICAgICAgIGFwcGVuZE5vZGVMaXN0c1szXSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5nbF9rZWVwJyk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGxpc3RJZHggPSAwOyBsaXN0SWR4IDwgYXBwZW5kTm9kZUxpc3RzLmxlbmd0aDsgbGlzdElkeCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFwcGVuZE5vZGVMaXN0ID0gYXBwZW5kTm9kZUxpc3RzW2xpc3RJZHhdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBub2RlSWR4ID0gMDsgbm9kZUlkeCA8IGFwcGVuZE5vZGVMaXN0Lmxlbmd0aDsgbm9kZUlkeCsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gYXBwZW5kTm9kZUxpc3Rbbm9kZUlkeF07XHJcbiAgICAgICAgICAgICAgICBoZWFkRWxlbWVudC5hcHBlbmRDaGlsZChub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYm9keUVsZW1lbnQgPSBkb2N1bWVudC5ib2R5O1xyXG4gICAgICAgIGJvZHlFbGVtZW50LmlubmVySFRNTCA9ICcnO1xyXG4gICAgICAgIGJvZHlFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XHJcbiAgICAgICAgdGhpcy5jaGVja0FkZERlZmF1bHRQb3BpbkJ1dHRvbigpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICogVGhpcyBzZWVtcyBhIGJpdCBwb2ludGxlc3MsIGJ1dCBhY3R1YWxseSBjYXVzZXMgYSByZWZsb3cvcmUtZXZhbHVhdGlvbiBnZXR0aW5nIGFyb3VuZFxyXG4gICAgICAgICogc2xpY2tncmlkJ3MgXCJDYW5ub3QgZmluZCBzdHlsZXNoZWV0LlwiIGJ1ZyBpbiBjaHJvbWVcclxuICAgICAgICAqL1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgICAgICBjb25zdCB4ID0gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFdpbGwgYWRkIGJ1dHRvbiBpZiBub3QgcG9waW5PbkNsb3NlIHNwZWNpZmllZCBpbiBzZXR0aW5nc1xyXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhZGRlZCBvdGhlcndpc2UgZmFsc2VcclxuICAgICAqL1xyXG4gICAgY2hlY2tBZGREZWZhdWx0UG9waW5CdXR0b24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcEluT25DbG9zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcG9wSW5CdXR0b25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIHBvcEluQnV0dG9uRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuUG9waW4pO1xyXG4gICAgICAgICAgICBwb3BJbkJ1dHRvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMubGF5b3V0Q29uZmlnLmhlYWRlci5wb3Bpbik7XHJcbiAgICAgICAgICAgIGNvbnN0IGljb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGljb25FbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5JY29uKTtcclxuICAgICAgICAgICAgY29uc3QgYmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGJnRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQmcpO1xyXG4gICAgICAgICAgICBwb3BJbkJ1dHRvbkVsZW1lbnQuYXBwZW5kQ2hpbGQoaWNvbkVsZW1lbnQpO1xyXG4gICAgICAgICAgICBwb3BJbkJ1dHRvbkVsZW1lbnQuYXBwZW5kQ2hpbGQoYmdFbGVtZW50KTtcclxuICAgICAgICAgICAgcG9wSW5CdXR0b25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5lbWl0KCdwb3BJbicpKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwb3BJbkJ1dHRvbkVsZW1lbnQpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogQ29tcG9uZW50Q29udGFpbmVyLkJpbmRhYmxlQ29tcG9uZW50IHtcclxuICAgICAgICBpZiAodGhpcy5iaW5kQ29tcG9uZW50RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBiaW5kYWJsZUNvbXBvbmVudCA9IHRoaXMuYmluZENvbXBvbmVudEV2ZW50KGNvbnRhaW5lciwgaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgIHJldHVybiBiaW5kYWJsZUNvbXBvbmVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRDb21wb25lbnRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpcnR1YWw6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5nZXRDb21wb25lbnRFdmVudChjb250YWluZXIsIGl0ZW1Db25maWcpLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gY29tcG9uZW50IHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSwgYW5kIHdlIGRvbid0IGhhdmUgYSBnZXRDb21wb25lbnRFdmVudCBkZWZpbmVkLlxyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aGUgdXNlciBwb3BzIG91dCBhIGRpYWxvZyBhbmQgdGhlIGNvbXBvbmVudCB0eXBlcyBhcmUgbm90IHJlZ2lzdGVyZWQgdXBmcm9udC5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuQ29tcG9uZW50VHlwZU5vdFJlZ2lzdGVyZWRBbmRCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyTm90QXNzaWduZWRdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGAke3RleHR9OiAke0pTT04uc3RyaW5naWZ5KGl0ZW1Db25maWcpfWBcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgdW5iaW5kQ29tcG9uZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB2aXJ0dWFsOiBib29sZWFuLCBjb21wb25lbnQ6IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy51bmJpbmRDb21wb25lbnRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5iaW5kQ29tcG9uZW50RXZlbnQoY29udGFpbmVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXZpcnR1YWwgJiYgdGhpcy5yZWxlYXNlQ29tcG9uZW50RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignVkNVQ1JDVTMzMzk5OCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbGVhc2VDb21wb25lbnRFdmVudChjb250YWluZXIsIGNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgVmlydHVhbExheW91dCB7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB2aXJ0dWFsIGNvbXBvbmVudHMgd2l0aCB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmJpbmRDb21wb25lbnRFdmVudH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLnVuYmluZENvbXBvbmVudEV2ZW50fSBldmVudHMuXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB0eXBlIEdldENvbXBvbmVudEV2ZW50SGFuZGxlciA9XHJcbiAgICAgICAgKHRoaXM6IHZvaWQsIGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBpdGVtQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpID0+IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQ7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB2aXJ0dWFsIGNvbXBvbmVudHMgd2l0aCB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmJpbmRDb21wb25lbnRFdmVudH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLnVuYmluZENvbXBvbmVudEV2ZW50fSBldmVudHMuXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB0eXBlIFJlbGVhc2VDb21wb25lbnRFdmVudEhhbmRsZXIgPVxyXG4gICAgICAgICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgY29tcG9uZW50OiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50KSA9PiB2b2lkO1xyXG5cclxuICAgIGV4cG9ydCB0eXBlIEJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgPVxyXG4gICAgICAgICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKSA9PiBDb21wb25lbnRDb250YWluZXIuQmluZGFibGVDb21wb25lbnQ7XHJcbiAgICBleHBvcnQgdHlwZSBVbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgPVxyXG4gICAgICAgICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lcikgPT4gdm9pZDtcclxuXHJcbiAgICBleHBvcnQgdHlwZSBCZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50ID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbFxyXG4gICAgICogVmVyaWFibGUgdG8gaG9sZCB0aGUgc3RhdGUgd2hldGhlciB3ZSBhbHJlYWR5IGNoZWNrZWQgaWYgd2UgYXJlIHJ1bm5pbmcgaW4gYSBzdWIgd2luZG93LlxyXG4gICAgICogRml4ZXMgcG9wb3V0IGFuZCBjcmVhdGlvbiBvZiBuZXN0ZWQgZ29sZGVuLWxheW91dHMuXHJcbiAgICAgKi9cclxuICAgIGxldCBzdWJXaW5kb3dDaGVja2VkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxheW91dE1hbmFnZXJDb25zdHJ1Y3RvclBhcmFtZXRlcnMoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lcjogTGF5b3V0Q29uZmlnIHwgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogSFRNTEVsZW1lbnQgfCAgVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyKTpcclxuICAgICAgICBMYXlvdXRNYW5hZ2VyLkNvbnN0cnVjdG9yUGFyYW1ldGVyc1xyXG4gICAge1xyXG4gICAgICAgIGNvbnN0IHdpbmRvd0NvbmZpZ0tleSA9IHN1YldpbmRvd0NoZWNrZWQgPyBudWxsIDogbmV3IFVSTChkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCdnbC13aW5kb3cnKTtcclxuICAgICAgICBzdWJXaW5kb3dDaGVja2VkID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBpc1N1YldpbmRvdyA9IHdpbmRvd0NvbmZpZ0tleSAhPT0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBjb25maWc6IExheW91dENvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAod2luZG93Q29uZmlnS2V5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpbmRvd0NvbmZpZ1N0ciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHdpbmRvd0NvbmZpZ0tleSk7XHJcbiAgICAgICAgICAgIGlmICh3aW5kb3dDb25maWdTdHIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTnVsbCBnbC13aW5kb3cgQ29uZmlnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0od2luZG93Q29uZmlnS2V5KTtcclxuICAgICAgICAgICAgY29uc3QgbWluaWZpZWRXaW5kb3dDb25maWcgPSBKU09OLnBhcnNlKHdpbmRvd0NvbmZpZ1N0cikgYXMgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWc7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ29uZmlnID0gUmVzb2x2ZWRMYXlvdXRDb25maWcudW5taW5pZnlDb25maWcobWluaWZpZWRXaW5kb3dDb25maWcpO1xyXG4gICAgICAgICAgICBjb25maWcgPSBMYXlvdXRDb25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29uZmlnKVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudCA9IGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQgPSBjb25maWdPck9wdGlvbmFsQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXJFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWc6IGNvbmZpZyxcclxuICAgICAgICAgICAgaXNTdWJXaW5kb3csXHJcbiAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImV4cG9ydCAqIGZyb20gJy4vdHMvY29uZmlnL2NvbmZpZyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdHMvY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmV4cG9ydCB7IENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gJy4vdHMvY29udGFpbmVyL2NvbXBvbmVudC1jb250YWluZXInO1xyXG5leHBvcnQgeyBCcm93c2VyUG9wb3V0IH0gZnJvbSAnLi90cy9jb250cm9scy9icm93c2VyLXBvcG91dCc7XHJcbmV4cG9ydCB7IERyYWdTb3VyY2UgfSBmcm9tICcuL3RzL2NvbnRyb2xzL2RyYWctc291cmNlJztcclxuZXhwb3J0IHsgSGVhZGVyIH0gZnJvbSAnLi90cy9jb250cm9scy9oZWFkZXInO1xyXG5leHBvcnQgeyBUYWIgfSBmcm9tICcuL3RzL2NvbnRyb2xzL3RhYic7XHJcbmV4cG9ydCAqIGZyb20gJy4vdHMvZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuZXhwb3J0IHsgR29sZGVuTGF5b3V0IH0gZnJvbSAnLi90cy9nb2xkZW4tbGF5b3V0JztcclxuZXhwb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4vdHMvaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5leHBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vdHMvaXRlbXMvY29udGVudC1pdGVtJztcclxuZXhwb3J0IHsgUm93T3JDb2x1bW4gfSBmcm9tICcuL3RzL2l0ZW1zL3Jvdy1vci1jb2x1bW4nO1xyXG5leHBvcnQgeyBTdGFjayB9IGZyb20gJy4vdHMvaXRlbXMvc3RhY2snO1xyXG5leHBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi90cy9sYXlvdXQtbWFuYWdlcic7XHJcbmV4cG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vdHMvdXRpbHMvZXZlbnQtZW1pdHRlcic7XHJcbmV4cG9ydCB7IEV2ZW50SHViIH0gZnJvbSAnLi90cy91dGlscy9ldmVudC1odWInO1xyXG5leHBvcnQgKiBmcm9tICcuL3RzL3V0aWxzL2kxOG4tc3RyaW5ncyc7XHJcbmV4cG9ydCB7IFN0eWxlQ29uc3RhbnRzIH0gZnJvbSAnLi90cy91dGlscy9zdHlsZS1jb25zdGFudHMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3RzL3V0aWxzL3R5cGVzJztcclxuZXhwb3J0IHsgVmlydHVhbExheW91dCB9IGZyb20gJy4vdHMvdmlydHVhbC1sYXlvdXQnO1xyXG5cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/src/Scratch/25 - GoldenLayout/resources/golden-layout/bundle/umd/golden-layout.min.js b/src/Scratch/25 - GoldenLayout/resources/golden-layout/bundle/umd/golden-layout.min.js index e7c5e267..d1e46083 100644 --- a/src/Scratch/25 - GoldenLayout/resources/golden-layout/bundle/umd/golden-layout.min.js +++ b/src/Scratch/25 - GoldenLayout/resources/golden-layout/bundle/umd/golden-layout.min.js @@ -1 +1 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.goldenLayout=e():t.goldenLayout=e()}(globalThis,(()=>(()=>{"use strict";var t,e={d:(t,i)=>{for(var n in i)e.o(i,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},i={};e.r(i),e.d(i,{ApiError:()=>r,BindError:()=>a,BrowserPopout:()=>lt,ComponentContainer:()=>nt,ComponentItem:()=>ht,ComponentItemConfig:()=>W,ConfigurationError:()=>o,ContentItem:()=>rt,DragSource:()=>gt,EventEmitter:()=>it,EventHub:()=>bt,ExternalError:()=>n,GoldenLayout:()=>xt,Header:()=>Ct,HeaderedItemConfig:()=>R,I18nStrings:()=>t,ItemConfig:()=>D,ItemType:()=>y,JsonValue:()=>C,LayoutConfig:()=>B,LayoutManager:()=>St,LogicalZIndex:()=>_,LogicalZIndexToDefaultMap:()=>v,PopoutBlockedError:()=>s,PopoutLayoutConfig:()=>O,ResolvedComponentItemConfig:()=>z,ResolvedGroundItemConfig:()=>P,ResolvedHeaderedItemConfig:()=>E,ResolvedItemConfig:()=>S,ResolvedLayoutConfig:()=>T,ResolvedPopoutLayoutConfig:()=>A,ResolvedRootItemConfig:()=>M,ResolvedRowOrColumnItemConfig:()=>L,ResolvedStackItemConfig:()=>x,ResponsiveMode:()=>w,RootItemConfig:()=>H,RowOrColumn:()=>at,RowOrColumnItemConfig:()=>U,Side:()=>f,SizeUnitEnum:()=>I,Stack:()=>It,StackItemConfig:()=>k,StyleConstants:()=>p,Tab:()=>_t,VirtualLayout:()=>Et,WidthOrHeightPropertyName:()=>g,formatSize:()=>tt,formatUndefinableSize:()=>et,i18nStrings:()=>m,parseSize:()=>Q});class n extends Error{constructor(t,e){super(e),this.type=t}}class o extends n{constructor(t,e){super("Configuration",t),this.node=e}}class s extends n{constructor(t){super("PopoutBlocked",t)}}class r extends n{constructor(t){super("API",t)}}class a extends n{constructor(t){super("Bind",t)}}class l extends Error{constructor(t,e,i){super(`${t}: ${e}${void 0===i?"":": "+i}`)}}class h extends l{constructor(t,e){super("Assert",t,e)}}class d extends l{constructor(t,e,i){super("UnreachableCase",t,`${e}${void 0===i?"":": "+i}`)}}class c extends l{constructor(t,e){super("UnexpectedNull",t,e)}}class u extends l{constructor(t,e){super("UnexpectedUndefined",t,e)}}!function(t){let e=!1;const i={PopoutCannotBeCreatedWithGroundItemConfig:{id:0,default:"Popout cannot be created with ground ItemConfig"},PleaseRegisterAConstructorFunction:{id:1,default:"Please register a constructor function"},ComponentTypeNotRegisteredAndBindComponentEventHandlerNotAssigned:{id:2,default:"Component type not registered and BindComponentEvent handler not assigned"},ComponentIsAlreadyRegistered:{id:3,default:"Component is already registered"},ComponentIsNotVirtuable:{id:4,default:"Component is not virtuable. Requires rootHtmlElement field/getter"},VirtualComponentDoesNotHaveRootHtmlElement:{id:5,default:'Virtual component does not have getter "rootHtmlElement"'},ItemConfigIsNotTypeComponent:{id:6,default:"ItemConfig is not of type component"},InvalidNumberPartInSizeString:{id:7,default:"Invalid number part in size string"},UnknownUnitInSizeString:{id:8,default:"Unknown unit in size string"},UnsupportedUnitInSizeString:{id:9,default:"Unsupported unit in size string"}};t.idCount=Object.keys(i).length;const n=Object.values(i);t.checkInitialise=function(){if(!e)for(let e=0;e="0"&&t<="9"}function G(t,e){const i=F(e);t.style.width=i}function Z(t,e){const i=F(e);t.style.height=i}function q(t){return{width:t.offsetWidth,height:t.offsetHeight}}function j(t){let e,i,n=t.mozInnerScreenX,o=t.mozInnerScreenY;return void 0===n||void 0===o?(e=(t.outerWidth-t.innerWidth)/2,i=t.outerHeight-t.innerHeight-e):(e=n-t.screenX,i=o-t.screenY),{width:e,height:i}}function $(t){let e=t.mozInnerScreenX,i=t.mozInnerScreenY;if(void 0===e||void 0===i){const n=j(t);e=t.screenX+n.width,i=t.screenY+n.height}return{left:e,top:i}}function X(t,e){t.style.display=e?"":"none"}function Y(t,e){if(void 0!==e)for(const i in e)if(e.hasOwnProperty(i)){const n=e[i],o=t[i];t[i]=J(o,n)}return t}function J(t,e){if("object"!=typeof e)return e;if(Array.isArray(e)){const t=e.length,i=new Array(t);for(let n=0;n36)throw new Error("Too many keys in config minifier map")},t.translateObject=n}(b||(b={})),function(t){t.defaults={type:y.ground,content:[],size:1,sizeUnit:I.Fractional,minSize:void 0,minSizeUnit:I.Pixel,id:"",isClosable:!0},t.createCopy=function(t,e){switch(t.type){case y.ground:case y.row:case y.column:return L.createCopy(t,e);case y.stack:return x.createCopy(t,e);case y.component:return z.createCopy(t);default:throw new d("CICC91354",t.type,"Invalid Config Item type specified")}},t.createDefault=function(t){switch(t){case y.ground:throw new h("CICCDR91562");case y.row:case y.column:return L.createDefault(t);case y.stack:return x.createDefault();case y.component:return z.createDefault();default:throw new d("CICCDD91563",t,"Invalid Config Item type specified")}},t.isComponentItem=function(t){return t.type===y.component},t.isStackItem=function(t){return t.type===y.stack},t.isGroundItem=function(t){return t.type===y.ground}}(S||(S={})),function(t){let e;t.defaultMaximised=!1,function(t){t.createCopy=function(t,e){return void 0===t?void 0:{show:null!=e?e:t.show,popout:t.popout,close:t.close,maximise:t.maximise,minimise:t.minimise,tabDropdown:t.tabDropdown}}}(e=t.Header||(t.Header={}))}(E||(E={})),function(t){function e(t){const e=t.length,i=new Array(e);for(let n=0;n"__glMaximised"===t));t>0&&(o=!0,n=n.splice(t,1)),e=n.length>0?n[0]:S.defaults.id}else e=n;return i=void 0!==t.maximised?t.maximised:o,{id:e,maximised:i}}}(R||(R={})),function(t){function e(t){if(void 0===t)return[];{const e=t.length,i=new Array(e);for(let n=0;n0?e.content[0]:void 0,{resolved:!0,root:H.resolve(i),openPopouts:t.resolveOpenPopouts(e.openPopouts),dimensions:t.Dimensions.resolve(e.dimensions),settings:t.Settings.resolve(e.settings),header:t.Header.resolve(e.header,e.settings,e.labels)}}},t.fromResolved=function(e){return{root:H.fromResolvedOrUndefined(e.root),openPopouts:O.fromResolvedArray(e.openPopouts),settings:T.Settings.createCopy(e.settings),dimensions:t.Dimensions.fromResolved(e.dimensions),header:T.Header.createCopy(e.header)}},t.isResolved=function(t){const e=t;return void 0!==e.resolved&&!0===e.resolved},t.resolveOpenPopouts=function(t){if(void 0===t)return[];{const e=t.length,i=new Array(e);for(let n=0;n0?e.content[0]:void 0,{root:H.resolve(o),openPopouts:B.resolveOpenPopouts(e.openPopouts),dimensions:B.Dimensions.resolve(e.dimensions),settings:B.Settings.resolve(e.settings),header:B.Header.resolve(e.header,e.settings,e.labels),parentId:null!==(i=e.parentId)&&void 0!==i?i:null,indexInParent:null!==(n=e.indexInParent)&&void 0!==n?n:null,window:t.Window.resolve(e.window,e.dimensions),resolved:!0}},t.fromResolved=function(e){return{root:H.fromResolvedOrUndefined(e.root),openPopouts:i(e.openPopouts),dimensions:B.Dimensions.fromResolved(e.dimensions),settings:T.Settings.createCopy(e.settings),header:T.Header.createCopy(e.header),parentId:e.parentId,indexInParent:e.indexInParent,window:t.Window.fromResolved(e.window)}},t.fromResolvedArray=i}(O||(O={}));class it{constructor(){this._allEventSubscriptions=[],this._subscriptionsMap=new Map,this.unbind=this.removeEventListener,this.trigger=this.emit}tryBubbleEvent(t,e){}emit(t,...e){let i=this._subscriptionsMap.get(t);if(void 0!==i){i=i.slice();for(let t=0;t0){const n=e.slice();n.unshift(t);const o=this._allEventSubscriptions.slice();for(let t=0;tthis.onPointerDown(t),this._pointerMoveEventListener=t=>this.onPointerMove(t),this._pointerUpEventListener=t=>this.onPointerUp(t),this._timeout=void 0,this._allowableTargets=[t,...e],this._oDocument=document,this._eBody=document.body,this._nDelay=1800,this._nDistance=10,this._originalEvent={pageX:0,pageY:0,screenX:0,screenY:0},this._dragging=!1,this._eElement.addEventListener("pointerdown",this._pointerDownEventListener,{passive:!0})}destroy(){this.checkRemovePointerTrackingEventListeners(),this._eElement.removeEventListener("pointerdown",this._pointerDownEventListener)}cancelDrag(){this.processDragStop(void 0)}onPointerDown(t){this._allowableTargets.includes(t.target)&&t.isPrimary&&this.processPointerDown(t)}processPointerDown(t){this._originalEvent=t,this._oDocument.addEventListener("pointermove",this._pointerMoveEventListener),this._oDocument.addEventListener("pointerup",this._pointerUpEventListener,{passive:!0}),this._eBody.classList.add("lm_pointer_tracking"),this._pointerTracking=!0,this._timeout=setTimeout((()=>{try{this.startDrag()}catch(t){throw console.error(t),t}}),this._nDelay)}onPointerMove(t){this._pointerTracking&&(this.processDragMove(t),t.preventDefault())}processDragMove(t){const e=t.pageX-this._originalEvent.pageX,i=t.pageY-this._originalEvent.pageY;!1===this._dragging&&(Math.abs(e)>this._nDistance||Math.abs(i)>this._nDistance)&&this.startDrag(),this._dragging&&this.emit("drag",e,i,t)}onPointerUp(t){this.processDragStop(t)}processDragStop(t){void 0!==this._timeout&&(clearTimeout(this._timeout),this._timeout=void 0),this.checkRemovePointerTrackingEventListeners(),!0===this._dragging&&(this._eBody.classList.remove("lm_dragging"),this._eElement.classList.remove("lm_dragging"),this._dragging=!1,this.emit("dragStop",t))}checkRemovePointerTrackingEventListeners(){this._pointerTracking&&(this._oDocument.removeEventListener("pointermove",this._pointerMoveEventListener),this._oDocument.removeEventListener("pointerup",this._pointerUpEventListener),this._eBody.classList.remove("lm_pointer_tracking"),this._pointerTracking=!1)}startDrag(){void 0!==this._timeout&&(clearTimeout(this._timeout),this._timeout=void 0),this._dragging=!0,this._eBody.classList.add("lm_dragging"),this._eElement.classList.add("lm_dragging"),this.emit("dragStart",this._originalEvent.pageX,this._originalEvent.pageY),this.emit("drag",0,0,this._originalEvent)}}class st{constructor(t,e,i){this._isVertical=t,this._size=e,this._grabSize=i0)this.updateSize(!1);else if(!this.isGround){if(null===this._parent)throw new c("CIUC00874");this._parent.removeChild(this)}}addChild(t,e,i){return null!=e||(e=this._contentItems.length),this._contentItems.splice(e,0,t),t.setParent(this),!0===this._isInitialised&&!1===t._isInitialised&&t.init(),e}replaceChild(t,e,i=!1){const n=this._contentItems.indexOf(t),o=t._element.parentNode;if(-1===n)throw new h("CIRCI23232","Can't replace child. oldChild is not child of this");if(null===o)throw new c("CIRCP23232");if(o.replaceChild(e._element,t._element),!0===i&&(t._parent=null,t.destroy()),this._contentItems[n]=e,e.setParent(this),e.size=t.size,e.sizeUnit=t.sizeUnit,e.minSize=t.minSize,e.minSizeUnit=t.minSizeUnit,null===e._parent)throw new c("CIRCNC45699");!0===e._parent._isInitialised&&!1===e._isInitialised&&e.init(),this.updateSize(!1)}remove(){if(null===this._parent)throw new c("CIR11110");this._parent.removeChild(this)}popout(){const t=K(),e=this.layoutManager.createPopoutFromContentItem(this,void 0,t,void 0);return this.emitBaseBubblingEvent("stateChanged"),e}calculateConfigContent(){const t=this._contentItems,e=t.length,i=new Array(e);for(let n=0;n1)return t;t=t.parent}return null}init(){this._isInitialised=!0,this.emitBaseBubblingEvent("itemCreated"),this.emitUnknownBubblingEvent(this.type+"Created")}setParent(t){this._parent=t}addPopInParentId(t){this.popInParentIds.includes(t)||this.popInParentIds.push(t)}initContentItems(){for(let t=0;tthis.propagateEventToLayoutManager(t,e))))}propagateEventToLayoutManager(t,e){this._pendingEventPropagations[t]=!1,this.layoutManager.emitUnknown(t,e)}}class at extends rt{constructor(t,e,i,n){switch(super(e,i,n,at.createElement(document,t)),this._rowOrColumnParent=n,this._splitter=[],this.isRow=!t,this.isColumn=t,this._childElementContainer=this.element,this._splitterSize=e.layoutConfig.dimensions.borderWidth,this._splitterGrabSize=e.layoutConfig.dimensions.borderGrabWidth,this._isColumn=t,this._dimension=t?"height":"width",this._splitterPosition=null,this._splitterMinPosition=null,this._splitterMaxPosition=null,i.type){case y.row:case y.column:this._configType=i.type;break;default:throw new h("ROCCCT00925")}}newComponent(t,e,i,n){const o={type:"component",componentType:t,componentState:e,title:i};return this.newItem(o,n)}addComponent(t,e,i,n){const o={type:"component",componentType:t,componentState:e,title:i};return this.addItem(o,n)}newItem(t,e){e=this.addItem(t,e);const i=this.contentItems[e];return rt.isStack(i)&&D.isComponent(t)?i.contentItems[0]:i}addItem(t,e){this.layoutManager.checkMinimiseMaximisedStack();const i=D.resolve(t,!1),n=this.layoutManager.createAndInitContentItem(i,this);return this.addChild(n,e,!1)}addChild(t,e,i){if(void 0===e&&(e=this.contentItems.length),this.contentItems.length>0){const i=this.createSplitter(Math.max(0,e-1)).element;e>0?(this.contentItems[e-1].element.insertAdjacentElement("afterend",i),i.insertAdjacentElement("afterend",t.element)):(this.contentItems[0].element.insertAdjacentElement("beforebegin",i),i.insertAdjacentElement("beforebegin",t.element))}else this._childElementContainer.appendChild(t.element);super.addChild(t,e);const n=1/this.contentItems.length*100;if(!0===i)return this.emitBaseBubblingEvent("stateChanged"),e;for(let e=0;e0&&(this.calculateRelativeSizes(),this.setAbsoluteSizes()),this.emitBaseBubblingEvent("stateChanged"),this.emit("resize")}setAbsoluteSizes(){const t=this.calculateAbsoluteSizes();for(let e=0;e0&&t.itemSizes[e]++,this._isColumn?(G(this.contentItems[e].element,t.crossAxisSize),Z(this.contentItems[e].element,t.itemSizes[e])):(G(this.contentItems[e].element,t.itemSizes[e]),Z(this.contentItems[e].element,t.crossAxisSize))}calculateAbsoluteSizes(){const t=(this.contentItems.length-1)*this._splitterSize,{width:e,height:i}=q(this.element);let n,o;this._isColumn?(n=i-t,o=e):(n=e-t,o=i);let s=0;const r=[];for(let t=0;t0){const n=100-t;for(let t=0;t100&&e.length>0){for(let t=0;te)return;{const r=i/e;let a=i;for(let e=0;ethis.onSplitterDrag(e,t,i))),e.on("dragStop",(()=>this.onSplitterDragStop(e))),e.on("dragStart",(()=>this.onSplitterDragStart(e))),this._splitter.splice(t,0,e),e}getSplitItems(t){const e=this._splitter.indexOf(t);return{before:this.contentItems[e],after:this.contentItems[e+1]}}calculateContentItemMinSize(t){const e=t.minSize;if(void 0!==e){if(t.minSizeUnit===I.Pixel)return e;throw new h("ROCGMD98831",JSON.stringify(t))}{const t=this.layoutManager.layoutConfig.dimensions;return this._isColumn?t.defaultMinItemHeight:t.defaultMinItemWidth}}calculateContentItemsTotalMinSize(t){let e=0;for(const i of t)e+=this.calculateContentItemMinSize(i);return e}onSplitterDragStart(t){const e=this.getSplitItems(t),i=V(e.before.element.style[this._dimension]),n=V(e.after.element.style[this._dimension]),o=this.calculateContentItemsTotalMinSize(e.before.contentItems),s=this.calculateContentItemsTotalMinSize(e.after.contentItems);this._splitterPosition=0,this._splitterMinPosition=-1*(i-o),this._splitterMaxPosition=n-s}onSplitterDrag(t,e,i){let n=this._isColumn?i:e;if(null===this._splitterMinPosition||null===this._splitterMaxPosition)throw new c("ROCOSD59226");n=Math.max(n,this._splitterMinPosition),n=Math.min(n,this._splitterMaxPosition),this._splitterPosition=n;const o=F(n);this._isColumn?t.element.style.top=o:t.element.style.left=o}onSplitterDragStop(t){if(null===this._splitterPosition)throw new c("ROCOSDS66932");{const e=this.getSplitItems(t),i=V(e.before.element.style[this._dimension]),n=V(e.after.element.style[this._dimension]),o=(this._splitterPosition+i)/(i+n),s=e.before.size+e.after.size;e.before.size=o*s,e.after.size=(1-o)*s,t.element.style.top=F(0),t.element.style.left=F(0),globalThis.requestAnimationFrame((()=>this.updateSize(!1)))}}}!function(t){t.getElementDimensionSize=function(t,e){return"width"===e?function(t){return t.offsetWidth}(t):function(t){return t.offsetHeight}(t)},t.setElementDimensionSize=function(t,e,i){return"width"===e?G(t,i):Z(t,i)},t.createElement=function(t,e){const i=t.createElement("div");return i.classList.add("lm_item"),e?i.classList.add("lm_column"):i.classList.add("lm_row"),i}}(at||(at={}));class lt extends it{constructor(t,e,i){super(),this._config=t,this._initialWindowSize=e,this._layoutManager=i,this._isInitialised=!1,this._popoutWindow=null,this._preventPopInOnClose=!1,this.createWindow()}toConfig(){var t,e;if(!1===this._isInitialised)throw new Error("Can't create config, layout not yet initialised");const i=this.getGlInstance().saveLayout();let n,o;null===this._popoutWindow?(n=null,o=null):(n=null!==(t=this._popoutWindow.screenX)&&void 0!==t?t:this._popoutWindow.screenLeft,o=null!==(e=this._popoutWindow.screenY)&&void 0!==e?e:this._popoutWindow.screenTop);const s={width:this.getGlInstance().width,height:this.getGlInstance().height,left:n,top:o};return{root:i.root,openPopouts:i.openPopouts,settings:i.settings,dimensions:i.dimensions,header:i.header,window:s,parentId:this._config.parentId,indexInParent:this._config.indexInParent,resolved:!0}}getGlInstance(){if(null===this._popoutWindow)throw new c("BPGGI24693");return this._popoutWindow.__glInstance}getWindow(){if(null===this._popoutWindow)throw new c("BPGW087215");return this._popoutWindow}close(t=!1){if(t&&(this._preventPopInOnClose=!0),this.getGlInstance())this.getGlInstance().closeWindow();else try{this.getWindow().close()}catch(t){}}popIn(){let t,e=this._config.indexInParent;if(!this._config.parentId)return;let i=Y({},this.getGlInstance().saveLayout()).root;if(void 0===i)return;const n=this._layoutManager.groundItem;if(void 0===n)throw new u("BPPIG34972");if(t=n.getItemsByPopInParentId(this._config.parentId)[0],t||(t=n.contentItems.length>0?n.contentItems[0]:n,e=t.contentItems.length),t.isStack){for(;i.type!==y.component&&1===i.content.length;)i=i.content[0];if(i.type!==y.component){if(null===t.parent)throw new c("BPPIG34973");const i=new at(!1,this._layoutManager,L.createDefault("row"),t.parent);t.parent.replaceChild(t,i,!1),i.addChild(t),t=i,e=1}}const o=this._layoutManager.createAndInitContentItem(i,t);t.addChild(o,e),this._layoutManager.layoutConfig.settings.popInOnClose?this._onClose():this.close()}createWindow(){const t=this.createUrl(),e=Math.floor(1e6*Math.random()).toString(36),i=this.serializeWindowFeatures({left:this._initialWindowSize.left,top:this._initialWindowSize.top,width:this._initialWindowSize.width,height:this._initialWindowSize.height,innerWidth:this._initialWindowSize.width,innerHeight:this._initialWindowSize.height,menubar:"no",toolbar:"no",location:"no",personalbar:"no",resizable:"yes",scrollbars:"no",status:"no"});if(this._popoutWindow=globalThis.open(t,e,i),this._popoutWindow)this._popoutWindow.addEventListener("load",(()=>{this.positionAndResizeWindow(),this._popoutWindow&&this._popoutWindow.addEventListener("beforeunload",(()=>{this._layoutManager.layoutConfig.settings.popInOnClose&&!this._preventPopInOnClose?this.popIn():this._onClose()}),{passive:!0})}),{passive:!0}),this._checkReadyInterval=setInterval((()=>this.checkReady()),10);else if(!0===this._layoutManager.layoutConfig.settings.blockedPopoutsThrowError)throw new s("Popout blocked")}checkReady(){if(null===this._popoutWindow)throw new c("BPCR01844");this._popoutWindow.__glInstance&&this._popoutWindow.__glInstance.isInitialised&&(this._popoutWindow.__glInstance.parent=this._layoutManager,this.onInitialised(),void 0!==this._checkReadyInterval&&(clearInterval(this._checkReadyInterval),this._checkReadyInterval=void 0))}positionAndResizeWindow(){if(null===this._popoutWindow)throw new c("BPPARW1");const t=j(this._popoutWindow);this._popoutWindow.moveTo(this._initialWindowSize.left-t.width,this._initialWindowSize.top-t.height),this._popoutWindow.resizeTo(this._initialWindowSize.width+(this._popoutWindow.outerWidth-this._popoutWindow.innerWidth),this._initialWindowSize.height+(this._popoutWindow.outerHeight-this._popoutWindow.innerHeight)),this._popoutWindow.focus()}serializeWindowFeatures(t){const e=[];for(const i in t)e.push(i+"="+t[i].toString());return e.join(",")}createUrl(){const t="gl-window-config-"+K(),e=T.minifyConfig(this._config);try{localStorage.setItem(t,JSON.stringify(e))}catch(t){throw new Error("Error while writing to localStorage "+function(t){return t instanceof Error?t.message:"string"==typeof t?t:"Unknown Error"}(t))}const i=new URL("/gl-popout",location.origin);i.searchParams.set("gl-window",t);const n=this._layoutManager.container.dataset.theme;return void 0!==n&&i.searchParams.set("gl-theme",n),i.toString()}onInitialised(){this._isInitialised=!0,this.getGlInstance().on("popIn",(()=>this.popIn())),this.emit("initialised")}_onClose(){setTimeout((()=>this.emit("closed")),50)}}class ht extends rt{constructor(t,e,i){super(t,e,i,document.createElement("div")),this._parentItem=i,this._focused=!1,this.isComponent=!0,this._reorderEnabled=e.reorderEnabled,this.applyUpdatableConfig(e),this._initialWantMaximise=e.maximised;const n=document.createElement("div");n.classList.add("lm_content"),this.element.appendChild(n),this._container=new nt(e,this,t,n,(t=>this.handleUpdateItemConfigEvent(t)),(()=>this.show()),(()=>this.hide()),(t=>this.focus(t)),(t=>this.blur(t)))}get componentName(){return this._container.componentType}get componentType(){return this._container.componentType}get reorderEnabled(){return this._reorderEnabled}get initialWantMaximise(){return this._initialWantMaximise}get component(){return this._container.component}get container(){return this._container}get parentItem(){return this._parentItem}get headerConfig(){return this._headerConfig}get title(){return this._title}get tab(){return this._tab}get focused(){return this._focused}destroy(){this._container.destroy(),super.destroy()}applyUpdatableConfig(t){this.setTitle(t.title),this._headerConfig=t.header}toConfig(){const t=this._container.stateRequestEvent,e=void 0===t?this._container.state:t();return{type:y.component,content:[],size:this.size,sizeUnit:this.sizeUnit,minSize:this.minSize,minSizeUnit:this.minSizeUnit,id:this.id,maximised:!1,isClosable:this.isClosable,reorderEnabled:this._reorderEnabled,title:this._title,header:E.Header.createCopy(this._headerConfig),componentType:z.copyComponentType(this.componentType),componentState:e}}close(){if(null===this.parent)throw new c("CIC68883");this.parent.removeChild(this,!1)}enterDragMode(t,e){G(this.element,t),Z(this.element,e),this._container.enterDragMode(t,e)}exitDragMode(){this._container.exitDragMode()}enterStackMaximised(){this._container.enterStackMaximised()}exitStackMaximised(){this._container.exitStackMaximised()}drag(){this._container.drag()}getOuterBoundingClientRect(){var t;const e=this.element.getBoundingClientRect(),i=null===(t=this.headerConfig)||void 0===t?void 0:t.show,n=T.Dimensions.defaults.headerHeight,o="left"===i||"right"===i?n:0,s="top"===i||"bottom"===i||void 0===i?n:0;return DOMRect.fromRect({x:e.left-o,y:e.top-s,width:e.width+o,height:e.height+s})}updateSize(t){this.updateNodeSize(t)}init(){this.updateNodeSize(!1),super.init(),this._container.emit("open"),this.initContentItems()}setTitle(t){this._title=t,this.emit("titleChanged",t),this.emit("stateChanged")}setTab(t){this._tab=t,this.emit("tab",t),this._container.setTab(t)}hide(){super.hide(),this._container.setVisibility(!1)}show(){super.show(),this._container.setVisibility(!0)}focus(t=!1){this.parentItem.setActiveComponentItem(this,!0,t)}setFocused(t){this._focused=!0,this.tab.setFocused(),t||this.emitBaseBubblingEvent("focus")}blur(t=!1){this._focused&&this.layoutManager.setFocusedComponentItem(void 0,t)}setBlurred(t){this._focused=!1,this.tab.setBlurred(),t||this.emitBaseBubblingEvent("blur")}setParent(t){this._parentItem=t,super.setParent(t)}handleUpdateItemConfigEvent(t){this.applyUpdatableConfig(t)}updateNodeSize(t){if("none"!==this.element.style.display){const{width:e,height:i}=q(this.element);this._container.setSizeToNodeSize(e,i,t)}}}class dt extends rt{constructor(){super(...arguments),this._focused=!1}get focused(){return this._focused}setFocusedValue(t){this._focused=t}}class ct extends dt{constructor(t,e,i){super(t,P.create(e),null,ct.createElement(document)),this.isGround=!0,this._childElementContainer=this.element,this._containerElement=i;let n=null;for(;;){const t=n?n.previousSibling:this._containerElement.lastChild;if(!(t instanceof Element&&t.classList.contains("lm_content")))break;n=t}this._containerElement.insertBefore(this.element,n)}init(){if(!0!==this.isInitialised){this.updateNodeSize();for(let t=0;t0?this.contentItems[0]:this,n.isComponent)throw new Error("Cannot add item as child to ComponentItem");{const t=this.layoutManager.createAndInitContentItem(i,n);return e=n.addChild(t,e),n===this?-1:e}}loadComponentAsRoot(t){this.clearRoot();const e=D.resolve(t,!1);if(e.maximised)throw new Error("Root Component cannot be maximised");{const t=new ht(this.layoutManager,e,this);t.init(),this.addChild(t,0)}}addChild(t,e){if(this.contentItems.length>0)throw new Error("Ground node can only have a single child");return this._childElementContainer.appendChild(t.element),e=super.addChild(t,e),this.updateSize(!1),this.emitBaseBubblingEvent("stateChanged"),e}calculateConfigContent(){const t=this.contentItems,e=t.length,i=new Array(e);for(let n=0;n0&&(G(this.contentItems[0].element,t),Z(this.contentItems[0].element,e)),this.updateContentItemsSize(!1))}updateSize(t){this.layoutManager.beginVirtualSizedContainerAdding();try{this.updateNodeSize(),this.updateContentItemsSize(t)}finally{this.layoutManager.endVirtualSizedContainerAdding()}}createSideAreas(){const t=ct.Area.oppositeSides,e=new Array(Object.keys(t).length);let i=0;for(const n in t){const o=n,s=this.getElementArea();if(null===s)throw new c("RCSA77553");s.side=o,"2"===t[o][1]?s[o]=s[t[o]]-50:s[o]=s[t[o]]+50,s.surface=(s.x2-s.x1)*(s.y2-s.y1),e[i++]=s}return e}highlightDropZone(t,e,i){this.layoutManager.tabDropPlaceholder.remove(),super.highlightDropZone(t,e,i)}onDrop(t,e){if(t.isComponent){const e=x.createDefault(),i=t;e.header=E.Header.createCopy(i.headerConfig);const n=this.layoutManager.createAndInitContentItem(e,this);n.addChild(t),t=n}if(0===this.contentItems.length)this.addChild(t);else{if(t.type===y.row||t.type===y.column){const e=x.createDefault(),i=this.layoutManager.createContentItem(e,this);i.addChild(t),t=i}const i="x"==e.side[0]?y.row:y.column,n="2"==e.side[1],o=this.contentItems[0];if(o instanceof at&&o.type===i){const e=o.contentItems[n?0:o.contentItems.length-1];o.addChild(t,n?0:void 0,!0),e.size*=.5,t.size=e.size,t.sizeUnit=I.Percent,o.updateSize(!1)}else{const e=S.createDefault(i),s=this.layoutManager.createContentItem(e,this);this.replaceChild(o,s),s.addChild(t,n?0:void 0,!0),s.addChild(o,n?void 0:0,!0),o.size=50,t.size=50,t.sizeUnit=I.Percent,s.updateSize(!1)}}}dock(){throw new h("GID87731")}validateDocking(){throw new h("GIVD87732")}getAllContentItems(){const t=[this];return this.deepGetAllContentItems(this.contentItems,t),t}getAllComponentItems(){const t=[];return this.deepFilterContentItems(this.contentItems,t,(t=>t.isComponent)),t}getConfigMaximisedItems(){const t=[];return this.deepFilterContentItems(this.contentItems,t,(t=>!(!rt.isStack(t)||!t.initialWantMaximise)||!(!rt.isComponentItem(t)||!t.initialWantMaximise))),t}getItemsByPopInParentId(t){const e=[];return this.deepFilterContentItems(this.contentItems,e,(e=>e.popInParentIds.includes(t))),e}toConfig(){throw new Error("Cannot generate GroundItem config")}setActiveComponentItem(t,e,i){}updateNodeSize(){const{width:t,height:e}=q(this._containerElement);G(this.element,t),Z(this.element,e),this.contentItems.length>0&&(G(this.contentItems[0].element,t),Z(this.contentItems[0].element,e))}deepGetAllContentItems(t,e){for(let i=0;i=0&&this._proxyContainerElement.insertAdjacentElement("afterend",r)),this._element.style.left=F(t),this._element.style.top=F(e),l.setAttribute("title",this._componentItem.title),h.insertAdjacentText("afterbegin",this._componentItem.title),this._proxyContainerElement.appendChild(this._componentItem.element)}drag(t,e){const i=this.setDropPosition(t,e);return this._componentItem.drag(),i}setDropPosition(t,e){return this._element.style.left=F(t),this._element.style.top=F(e),this.layoutManager.getArea(t,e)}drop(){this._componentItem.exitDragMode();let t=null,e=null;const i=this._action.currentTarget;if((null==i?void 0:i.owner)===this._action&&(t=i.area),null!==t)e=this._componentItem,t.contentItem.onDrop(e,t),this.layoutManager.focusWindow();else if(null===i&&null===this._action.parent){const t=$(globalThis),e={left:t.left+this.element.offsetLeft,top:t.top+this.element.offsetTop,width:this._originalSize.width,height:this._originalSize.height};this.layoutManager.createPopoutFromContentItem(this._componentItem,e,K(),void 0),this._componentItem.destroy()}else this._componentItem.destroy();this.layoutManager.emit("itemDropped",this._componentItem),this._componentItemFocused&&(null==e||e.focus()),this._element.remove()}setDimensions(){const t=this.layoutManager.layoutConfig.dimensions;if(void 0===t)throw new Error("DragProxy.setDimensions: dimensions undefined");let e=t.dragProxyWidth,i=t.dragProxyHeight;if(void 0===e||void 0===i)throw new Error("DragProxy.setDimensions: width and/or height undefined");this._outerWidth=e,this._outerHeight=i;const n=!1===this.layoutManager.layoutConfig.header.show?0:t.headerHeight;this._element.style.width=F(e),this._element.style.height=F(i),e-=this._sided?n:0,i-=this._sided?0:n,this._proxyContainerElement.style.width=F(e),this._proxyContainerElement.style.height=F(i),this._componentItem.enterDragMode(e,i),this._componentItem.show()}}class mt{constructor(t,e,i,n){if(this._owner=t,this._area=e,this._pageX=i,this._pageY=n,t.layoutManager!==e.contentItem.layoutManager)throw Error("LayoutManager of Area and DragProxy must match")}get owner(){return this._owner}get area(){return this._area}drop(t){this._area.contentItem.onDrop(t,this._area)}highlightDropZone(){this.area.contentItem.highlightDropZone(this._pageX,this._pageY,this._area)}}class pt extends it{constructor(t,e=!1,i=null){super(),this._layoutManager=t,this._allowPopout=e,this._parent=i,this._dragProxy=null,this._currentTarget=null,this._dragListener=null,this._actions=[],this._dragEventHandler=(t,e,i)=>this.onDrag(i),this._dragStopEventHandler=()=>this.onDragStop(),this._boundingRect=this.computeBoundingRect(),this.parentOrSelf._actions.push(this)}get layoutManager(){return this._layoutManager}get parent(){return this._parent}get proxy(){return this._dragProxy}get parentOrSelf(){var t;return null!==(t=this._parent)&&void 0!==t?t:this}get currentTarget(){return this.parentOrSelf._currentTarget}set currentTarget(t){this.parentOrSelf._currentTarget=t}computeBoundingRect(){if(void 0===this._layoutManager.groundItem)throw new u("DACBR11120");{const t=this._layoutManager.groundItem.element.getBoundingClientRect();return DOMRect.fromRect({x:document.body.scrollLeft+t.left,y:document.body.scrollTop+t.top,width:t.width,height:t.height})}}screenToPage(t,e){const i=$(globalThis);return{x:document.body.scrollLeft+t-i.left,y:document.body.scrollTop+e-i.top}}isProxyVisible(t,e,i){return e>=this._boundingRect.left-t.outerWidth&&e=this._boundingRect.top-t.outerHeight&&ithis.onDragStart(t,e))),this._dragListener.on("dragStop",(()=>this.onDragStop()))}onDragStart(t,e){var i,n;const o="component";let s;if("function"==typeof this._componentTypeOrFtn){const t=this._componentTypeOrFtn();s=gt.isDragSourceComponentItemConfig(t)?{type:o,componentState:t.state,componentType:t.type,title:null!==(i=t.title)&&void 0!==i?i:this._title}:t}else s={type:o,componentState:this._componentState,componentType:this._componentTypeOrFtn,title:this._title,id:this._id};const r=W.resolve(s,!1),a=new ht(this._layoutManager,r,this._dummyGroundContentItem);if(this._dummyGroundContentItem.contentItems.push(a),null===this._dragListener)throw new c("DSODSD66746");{const i=pt.start(this._layoutManager,this._dragListener,a,null,t,e),o=this._layoutManager.transitionIndicator;if(null===o)throw new c("DSODST66746");{const t=null===(n=i.proxy)||void 0===n?void 0:n.element;if(void 0===t)throw new u("DSODST66747");o.transitionElements(this._element,t)}}}onDragStop(){this.createDragListener()}removeDragListener(){null!==this._dragListener&&(this._dragListener.destroy(),this._dragListener=null)}}!function(t){t.isDragSourceComponentItemConfig=function(t){return!("componentType"in t)}}(gt||(gt={}));class ft{constructor(t,e,i,n){this._header=t,this._pushEvent=n,this._clickEventListener=t=>this.onClick(t),this._touchStartEventListener=t=>this.onTouchStart(t),this._element=document.createElement("div"),this._element.classList.add(i),this._element.title=e,this._header.on("destroy",(()=>this.destroy())),this._element.addEventListener("click",this._clickEventListener,{passive:!0}),this._element.addEventListener("touchstart",this._touchStartEventListener,{passive:!0}),this._header.controlsContainerElement.appendChild(this._element)}get element(){return this._element}destroy(){var t;this._element.removeEventListener("click",this._clickEventListener),this._element.removeEventListener("touchstart",this._touchStartEventListener),null===(t=this._element.parentNode)||void 0===t||t.removeChild(this._element)}onClick(t){this._pushEvent(t)}onTouchStart(t){this._pushEvent(t)}}class _t{constructor(t,e,i,n,o){var s;this._layoutManager=t,this._componentItem=e,this._closeEvent=i,this._focusEvent=n,this._dragStartEvent=o,this._isActive=!1,this._tabClickListener=t=>this.onTabClickDown(t),this._tabTouchStartListener=t=>this.onTabTouchStart(t),this._closeClickListener=()=>this.onCloseClick(),this._closeTouchStartListener=()=>this.onCloseTouchStart(),this._dragStartListener=(t,e)=>this.onDragStart(t,e),this._contentItemDestroyListener=()=>this.onContentItemDestroy(),this._tabTitleChangedListener=t=>this.setTitle(t),this._element=document.createElement("div"),this._element.classList.add("lm_tab"),this._titleElement=document.createElement("span"),this._titleElement.classList.add("lm_title"),this._closeElement=document.createElement("div"),this._closeElement.classList.add("lm_close_tab"),this._element.appendChild(this._titleElement),this._element.appendChild(this._closeElement),e.isClosable?(this._closeElement.style.display="",this.element.classList.add("lm_closable")):this._closeElement.style.display="none",this.setTitle(e.title),this._componentItem.on("titleChanged",this._tabTitleChangedListener),(null!==(s=e.reorderEnabled)&&void 0!==s?s:this._layoutManager.layoutConfig.settings.reorderEnabled)&&this.enableReorder(),this._element.addEventListener("click",this._tabClickListener,{passive:!0}),this._element.addEventListener("touchstart",this._tabTouchStartListener,{passive:!0}),this._componentItem.isClosable?(this._closeElement.addEventListener("click",this._closeClickListener,{passive:!0}),this._closeElement.addEventListener("touchstart",this._closeTouchStartListener,{passive:!0})):(this._closeElement.remove(),this._closeElement=void 0),this._componentItem.setTab(this),this._layoutManager.emit("tabCreated",this)}get isActive(){return this._isActive}get componentItem(){return this._componentItem}get contentItem(){return this._componentItem}get element(){return this._element}get titleElement(){return this._titleElement}get closeElement(){return this._closeElement}get reorderEnabled(){return void 0!==this._dragListener}set reorderEnabled(t){t!==this.reorderEnabled&&(t?this.enableReorder():this.disableReorder())}setTitle(t){this._titleElement.innerText=t,this._element.title=t}setActive(t){t!==this._isActive&&(this._isActive=t,t?this._element.classList.add("lm_active"):this._element.classList.remove("lm_active"))}destroy(){var t,e;this._closeEvent=void 0,this._focusEvent=void 0,this._dragStartEvent=void 0,this._element.removeEventListener("click",this._tabClickListener),this._element.removeEventListener("touchstart",this._tabTouchStartListener),null===(t=this._closeElement)||void 0===t||t.removeEventListener("click",this._closeClickListener),null===(e=this._closeElement)||void 0===e||e.removeEventListener("touchstart",this._closeTouchStartListener),this._componentItem.off("titleChanged",this._tabTitleChangedListener),this.reorderEnabled&&this.disableReorder(),this._element.remove()}setBlurred(){this._element.classList.remove("lm_focused"),this._titleElement.classList.remove("lm_focused")}setFocused(){this._element.classList.add("lm_focused"),this._titleElement.classList.add("lm_focused")}onDragStart(t,e){if(void 0===this._dragListener)throw new u("TODSDLU10093");if(void 0===this._dragStartEvent)throw new u("TODS23309");this._dragStartEvent(t,e,this._dragListener,this.componentItem)}onContentItemDestroy(){void 0!==this._dragListener&&(this._dragListener.destroy(),this._dragListener=void 0)}onTabClickDown(t){const e=t.target;e!==this._element&&e!==this._titleElement||(0===t.button?this.notifyFocus():1===t.button&&this._componentItem.isClosable&&this.notifyClose())}onTabTouchStart(t){t.target===this._element&&this.notifyFocus()}onCloseClick(){this.notifyClose()}onCloseTouchStart(){this.notifyClose()}notifyClose(){if(void 0===this._closeEvent)throw new u("TNC15007");this._closeEvent(this._componentItem)}notifyFocus(){if(void 0===this._focusEvent)throw new u("TNA15007");this._focusEvent(this._componentItem)}enableReorder(){this._dragListener=new ot(this._element,[this._titleElement]),this._dragListener.on("dragStart",this._dragStartListener),this._componentItem.on("destroy",this._contentItemDestroyListener)}disableReorder(){if(void 0===this._dragListener)throw new u("TDR87745");this._componentItem.off("destroy",this._contentItemDestroyListener),this._dragListener.off("dragStart",this._dragStartListener),this._dragListener=void 0}}class vt{constructor(t,e,i,n,o){this._layoutManager=t,this._componentRemoveEvent=e,this._componentFocusEvent=i,this._componentDragStartEvent=n,this._dropdownActiveChangedEvent=o,this._tabs=[],this._lastVisibleTabIndex=-1,this._dropdownActive=!1,this._element=document.createElement("section"),this._element.classList.add("lm_tabs"),this._dropdownElement=document.createElement("section"),this._dropdownElement.classList.add("lm_tabdropdown_list"),this._dropdownElement.style.display="none"}get tabs(){return this._tabs}get tabCount(){return this._tabs.length}get lastVisibleTabIndex(){return this._lastVisibleTabIndex}get element(){return this._element}get dropdownElement(){return this._dropdownElement}get dropdownActive(){return this._dropdownActive}destroy(){for(let t=0;tthis.handleTabCloseEvent(t)),(t=>this.handleTabFocusEvent(t)),((t,e,i,n)=>this.handleTabDragStartEvent(t,e,i,n)));void 0===e&&(e=this._tabs.length),this._tabs.splice(e,0,i),ethis._lastVisibleTabIndex){const t=this._tabs[e];for(let t=e;t>0;t--)this._tabs[t]=this._tabs[t-1];this._tabs[0]=t}}updateTabSizes(t,e){let i=!1;this.tryUpdateTabSizes(i,t,e)||(i=!0,this.tryUpdateTabSizes(i,t,e)),i!==this._dropdownActive&&(this._dropdownActive=i,this._dropdownActiveChangedEvent())}tryUpdateTabSizes(t,e,i){if(this._tabs.length>0){if(void 0===i)throw new Error("non-empty tabs must have active component item");let n=0,o=!1;const s=this._layoutManager.layoutConfig.settings.tabOverlapAllowance,r=this._tabs.indexOf(i.tab),a=this._tabs[r];this._lastVisibleTabIndex=-1;for(let i=0;ie){if(o)i===r&&(l.style.zIndex="auto",l.style.marginLeft="",l.parentElement!==this._element&&this._element.appendChild(l));else{let t;if(t=r>0&&r<=i?(d-e)/(i-1):(d-e)/i,tthis.onClick(t),this._touchStartListener=t=>this.onTouchStart(t),this._layoutStateListener=()=>this.onLayoutChanged(),this._tabsContainer=new vt(this._layoutManager,(t=>this.handleTabInitiatedComponentRemoveEvent(t)),(t=>this.handleTabInitiatedComponentFocusEvent(t)),((t,e,i,n)=>this.handleTabInitiatedDragStartEvent(t,e,i,n)),(()=>this.processTabDropdownActiveChanged())),this._show=i.show,this._popoutLabel=i.popoutLabel,this._maximiseLabel=i.maximiseLabel,this._minimiseLabel=i.minimiseLabel,this._closeLabel=i.closeLabel,this._tabDropdownEnabled=i.tabDropdownEnabled,this._tabDropdownLabel=i.tabDropdownLabel,this.setSide(i.side),this._element=document.createElement("section"),this._element.classList.add("lm_header"),this._controlsContainerElement=document.createElement("section"),this._controlsContainerElement.classList.add("lm_controls"),this._element.appendChild(this._tabsContainer.element),this._element.appendChild(this._controlsContainerElement),this._element.appendChild(this._tabsContainer.dropdownElement),this._element.addEventListener("click",this._clickListener,{passive:!0}),this._element.addEventListener("touchstart",this._touchStartListener,{passive:!0}),this._documentMouseUpListener=()=>this._tabsContainer.hideAdditionalTabsDropdown(),globalThis.document.addEventListener("mouseup",this._documentMouseUpListener,{passive:!0}),this._tabControlOffset=this._layoutManager.layoutConfig.settings.tabControlOffset,this._tabDropdownEnabled&&(this._tabDropdownButton=new ft(this,this._tabDropdownLabel,"lm_tabdropdown",(()=>this._tabsContainer.showAdditionalTabsDropdown()))),this._popoutButton=new ft(this,this._popoutLabel,"lm_popout",(()=>this.handleButtonPopoutEvent())),this._maximiseButton=new ft(this,this._maximiseLabel,"lm_maximise",(t=>this.handleButtonMaximiseToggleEvent(t))),this._closeButton=new ft(this,this._closeLabel,"lm_close",(()=>o())),this.processTabDropdownActiveChanged(),this.layoutManager.addEventListener("stateChanged",this._layoutStateListener)}get show(){return this._show}get side(){return this._side}get leftRightSided(){return this._leftRightSided}get layoutManager(){return this._layoutManager}get parent(){return this._parent}get tabs(){return this._tabsContainer.tabs}get lastVisibleTabIndex(){return this._tabsContainer.lastVisibleTabIndex}get element(){return this._element}get tabsContainerElement(){return this._tabsContainer.element}get controlsContainerElement(){return this._controlsContainerElement}destroy(){this.emit("destroy"),this._popoutEvent=void 0,this._maximiseToggleEvent=void 0,this._clickEvent=void 0,this._touchStartEvent=void 0,this._componentRemoveEvent=void 0,this._componentFocusEvent=void 0,this._componentDragStartEvent=void 0,this._tabsContainer.destroy(),globalThis.document.removeEventListener("mouseup",this._documentMouseUpListener),this.layoutManager.removeEventListener("stateChanged",this._layoutStateListener),this._element.remove()}createTab(t,e){this._tabsContainer.createTab(t,e)}removeTab(t){this._tabsContainer.removeTab(t)}processActiveComponentChanged(t){this._tabsContainer.processActiveComponentChanged(t),this.updateTabSizes()}setSide(t){this._side=t,this._leftRightSided=[f.right,f.left].includes(this._side)}updateButtons(){var t,e;const i=this._getActiveComponentItemEvent(),n=this.tabs.every((t=>t.componentItem.isClosable)),o=!1!==(null===(t=null==i?void 0:i.headerConfig)||void 0===t?void 0:t.close);let s;X(this._closeButton.element,n&&o);let r=null===this.tabs[0].componentItem.findAncestorWithSiblings();if(this._layoutManager.layoutConfig.settings.popoutWholeStack){const t=this.tabs.every((t=>{var e;return!1!==(null===(e=t.componentItem.headerConfig)||void 0===e?void 0:e.popout)}));s=!r&&n&&t}else{r&&(r=1===this.tabs.length);const t=!1!==(null==i?void 0:i.isClosable);s=!r&&t&&!1!==(null===(e=null==i?void 0:i.headerConfig)||void 0===e?void 0:e.popout)}X(this._popoutButton.element,s);const a=this.tabs.every((t=>{var e;return!1!==(null===(e=t.componentItem.headerConfig)||void 0===e?void 0:e.maximise)}));X(this._maximiseButton.element,a)}applyFocusedValue(t){t?this._element.classList.add("lm_focused"):this._element.classList.remove("lm_focused")}processMaximised(){if(void 0===this._maximiseButton)throw new u("HPMAX16997");this._maximiseButton.element.setAttribute("title",this._minimiseLabel)}processMinimised(){if(void 0===this._maximiseButton)throw new u("HPMIN16997");this._maximiseButton.element.setAttribute("title",this._maximiseLabel)}updateTabSizes(){if(this._tabsContainer.tabCount>0){const t=this._show?this._layoutManager.layoutConfig.dimensions.headerHeight:0;let e;this._leftRightSided?(this._element.style.height="",this._element.style.width=F(t)):(this._element.style.width="",this._element.style.height=F(t)),e=this._leftRightSided?this._element.offsetHeight-this._controlsContainerElement.offsetHeight-this._tabControlOffset:this._element.offsetWidth-this._controlsContainerElement.offsetWidth-this._tabControlOffset,this._tabsContainer.updateTabSizes(e,this._getActiveComponentItemEvent())}}handleTabInitiatedComponentRemoveEvent(t){if(void 0===this._componentRemoveEvent)throw new u("HHTCE22294");this._componentRemoveEvent(t)}handleTabInitiatedComponentFocusEvent(t){if(void 0===this._componentFocusEvent)throw new u("HHTAE22294");this._componentFocusEvent(t)}handleTabInitiatedDragStartEvent(t,e,i,n){if(void 0===this._componentDragStartEvent)throw new u("HHTDSE22294");this._componentDragStartEvent(t,e,i,n)}processTabDropdownActiveChanged(){void 0!==this._tabDropdownButton&&X(this._tabDropdownButton.element,this._tabsContainer.dropdownActive)}handleButtonPopoutEvent(){if(this._layoutManager.layoutConfig.settings.popoutWholeStack){if(void 0===this._popoutEvent)throw new u("HHBPOE17834");this._popoutEvent()}else{const t=this._getActiveComponentItemEvent();t&&t.popout()}}handleButtonMaximiseToggleEvent(t){if(void 0===this._maximiseToggleEvent)throw new u("HHBMTE16834");this._maximiseToggleEvent()}onClick(t){t.target===this._element&&this.notifyClick(t)}onTouchStart(t){t.target===this._element&&this.notifyTouchStart(t)}onLayoutChanged(){this.updateButtons()}notifyClick(t){if(void 0===this._clickEvent)throw new u("HNHC46834");this._clickEvent(t)}notifyTouchStart(t){if(void 0===this._touchStartEvent)throw new u("HNHTS46834");this._touchStartEvent(t)}}class yt{constructor(){this._element=document.createElement("div"),this._element.classList.add("lm_dropTargetIndicator");const t=document.createElement("div");t.classList.add("lm_inner"),this._element.appendChild(t),document.body.appendChild(this._element)}destroy(){this._element.remove()}highlightArea(t,e){this._element.style.left=F(t.x1+e),this._element.style.top=F(t.y1+e),this._element.style.width=F(t.x2-t.x1-e-1),this._element.style.height=F(t.y2-t.y1-e-1),this._element.style.visibility="visible"}hide(){this._element.style.visibility="hidden"}}class wt{constructor(){this._element=document.createElement("div"),this._element.classList.add("lm_transition_indicator"),document.body.appendChild(this._element),this._toElement=null,this._fromDimensions=null,this._totalAnimationDuration=200,this._animationStartTime=null}destroy(){this._element.remove()}transitionElements(t,e){}nextAnimationFrame(){}measure(t){const e=t.getBoundingClientRect();return{left:e.left,top:e.top,width:t.offsetWidth,height:t.offsetHeight}}}class It extends dt{constructor(t,e,i){var n,o,s,r,a,l,h,d,c,u,m,p,g,_,v,C,y,w,I;super(t,e,i,It.createElement(document)),this._headerSideChanged=!1,this._resizeListener=()=>this.handleResize(),this._maximisedListener=()=>this.handleMaximised(),this._minimisedListener=()=>this.handleMinimised(),this._headerConfig=e.header;const b=t.layoutConfig.header,S=e.content;let E;E=1!==S.length?void 0:S[0].header,this._initialWantMaximise=e.maximised,this._initialActiveItemIndex=null!==(n=e.activeItemIndex)&&void 0!==n?n:0;const x=null!==(r=null!==(s=null===(o=this._headerConfig)||void 0===o?void 0:o.show)&&void 0!==s?s:null==E?void 0:E.show)&&void 0!==r?r:b.show,z=null!==(h=null!==(l=null===(a=this._headerConfig)||void 0===a?void 0:a.popout)&&void 0!==l?l:null==E?void 0:E.popout)&&void 0!==h?h:b.popout,L=null!==(u=null!==(c=null===(d=this._headerConfig)||void 0===d?void 0:d.maximise)&&void 0!==c?c:null==E?void 0:E.maximise)&&void 0!==u?u:b.maximise,M=null!==(g=null!==(p=null===(m=this._headerConfig)||void 0===m?void 0:m.close)&&void 0!==p?p:null==E?void 0:E.close)&&void 0!==g?g:b.close,P=null!==(C=null!==(v=null===(_=this._headerConfig)||void 0===_?void 0:_.minimise)&&void 0!==v?v:null==E?void 0:E.minimise)&&void 0!==C?C:b.minimise,T=null!==(I=null!==(w=null===(y=this._headerConfig)||void 0===y?void 0:y.tabDropdown)&&void 0!==w?w:null==E?void 0:E.tabDropdown)&&void 0!==I?I:b.tabDropdown;this._maximisedEnabled=!1!==L;const A={show:!1!==x,side:!1===x?f.top:x,popoutEnabled:!1!==z,popoutLabel:!1===z?"":z,maximiseEnabled:this._maximisedEnabled,maximiseLabel:!1===L?"":L,closeEnabled:!1!==M,closeLabel:!1===M?"":M,minimiseEnabled:!0,minimiseLabel:P,tabDropdownEnabled:!1!==T,tabDropdownLabel:!1===T?"":T};this._header=new Ct(t,this,A,(()=>this.getActiveComponentItem()),(()=>this.remove()),(()=>this.handlePopoutEvent()),(()=>this.toggleMaximise()),(t=>this.handleHeaderClickEvent(t)),(t=>this.handleHeaderTouchStartEvent(t)),(t=>this.handleHeaderComponentRemoveEvent(t)),(t=>this.handleHeaderComponentFocusEvent(t)),((t,e,i,n)=>this.handleHeaderComponentStartDragEvent(t,e,i,n))),this.isStack=!0,this._childElementContainer=document.createElement("section"),this._childElementContainer.classList.add("lm_items"),this.on("resize",this._resizeListener),this._maximisedEnabled&&(this.on("maximised",this._maximisedListener),this.on("minimised",this._minimisedListener)),this.element.appendChild(this._header.element),this.element.appendChild(this._childElementContainer),this.setupHeaderPosition()}get childElementContainer(){return this._childElementContainer}get header(){return this._header}get headerShow(){return this._header.show}get headerSide(){return this._header.side}get headerLeftRightSided(){return this._header.leftRightSided}get contentAreaDimensions(){return this._contentAreaDimensions}get initialWantMaximise(){return this._initialWantMaximise}get isMaximised(){return this===this.layoutManager.maximisedStack}get stackParent(){if(!this.parent)throw new Error("Stack should always have a parent");return this.parent}updateSize(t){this.layoutManager.beginVirtualSizedContainerAdding();try{this.updateNodeSize(),this.updateContentItemsSize(t)}finally{this.layoutManager.endVirtualSizedContainerAdding()}}init(){if(!0===this.isInitialised)return;this.updateNodeSize();for(let t=0;t0){if(this._initialActiveItemIndex<0||this._initialActiveItemIndex>=e)throw new Error(`ActiveItemIndex out of range: ${this._initialActiveItemIndex} id: ${this.id}`);for(let i=0;ithis.contentItems.length)throw e-=1,new h("SAC99728");if(t instanceof ht)return e=super.addChild(t,e),this._childElementContainer.appendChild(t.element),this._header.createTab(t,e),this.setActiveComponentItem(t,i),this._header.updateTabSizes(),this.updateSize(!1),t.container.setBaseLogicalZIndex(),this.emitStateChangedEvent(),e;throw new h("SACC88532")}removeChild(t,e){const i=t,n=this.contentItems.indexOf(i),o=1===this.contentItems.length;if(this._activeComponentItem===i&&(i.focused&&i.blur(),!o)){const t=0===n?1:n-1;this.setActiveComponentItem(this.contentItems[t],!1)}this._header.removeTab(i),super.removeChild(i,e),this.emitStateChangedEvent()}toggleMaximise(){this.isMaximised?this.minimise():this.maximise()}maximise(){if(!this.isMaximised){this.layoutManager.setMaximisedStack(this);const t=this.contentItems,e=t.length;for(let i=0;i0&&void 0===t)throw new Error("expected non-empty stack to have an active component item");return{type:"stack",content:this.calculateConfigContent(),size:this.size,sizeUnit:this.sizeUnit,minSize:this.minSize,minSizeUnit:this.minSizeUnit,id:this.id,isClosable:this.isClosable,maximised:this.isMaximised,header:this.createHeaderConfig(),activeItemIndex:t}}onDrop(t,e){if("header"===this._dropSegment){if(this.resetHeaderDropZone(),void 0===this._dropIndex)throw new u("SODDI68990");return void this.addChild(t,this._dropIndex)}if("body"===this._dropSegment)return void this.addChild(t,0,!0);const i="top"===this._dropSegment||"bottom"===this._dropSegment,n="left"===this._dropSegment||"right"===this._dropSegment,o="top"===this._dropSegment||"left"===this._dropSegment,s=i&&this.stackParent.isColumn||n&&this.stackParent.isRow;if(t.isComponent){const e=x.createDefault();e.header=t.headerConfig;const i=this.layoutManager.createAndInitContentItem(e,this);i.addChild(t),t=i}if(t.type===y.row||t.type===y.column){const e=x.createDefault();e.header=this.createHeaderConfig();const i=this.layoutManager.createContentItem(e,this);i.addChild(t),t=i}if(s){const e=this.stackParent.contentItems.indexOf(this);this.stackParent.addChild(t,o?e:e+1,!0),this.size*=.5,t.size=this.size,t.sizeUnit=this.sizeUnit,this.stackParent.updateSize(!1)}else{const e=i?y.column:y.row,n=S.createDefault(e),s=this.layoutManager.createContentItem(n,this);this.stackParent.replaceChild(this,s),s.addChild(t,o?0:void 0,!0),s.addChild(this,o?void 0:0,!0),this.size=50,t.size=50,t.sizeUnit=I.Percent,s.updateSize(!1)}}highlightDropZone(t,e){for(const i in this._contentAreaDimensions){const n=i,o=this._contentAreaDimensions[n].hoverArea;if(o.x1t&&o.y1e)return void("header"===n?(this._dropSegment="header",this.highlightHeaderDropZone(this._header.leftRightSided?e:t)):(this.resetHeaderDropZone(),this.highlightBodyDropZone(n)))}}getArea(){if("none"===this.element.style.display)return null;const t=super.getElementArea(this._header.element),e=super.getElementArea(this._childElementContainer);if(null===t||null===e)throw new c("SGAHC13086");const i=e.x2-e.x1,n=e.y2-e.y1;return this._contentAreaDimensions={header:{hoverArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2},highlightArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2}}},0===this.contentItems.length?(this._contentAreaDimensions.body={hoverArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2}},super.getElementArea(this.element)):(this._contentAreaDimensions.left={hoverArea:{x1:e.x1,y1:e.y1,x2:e.x1+.25*i,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x1+.5*i,y2:e.y2}},this._contentAreaDimensions.top={hoverArea:{x1:e.x1+.25*i,y1:e.y1,x2:e.x1+.75*i,y2:e.y1+.5*n},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y1+.5*n}},this._contentAreaDimensions.right={hoverArea:{x1:e.x1+.75*i,y1:e.y1,x2:e.x2,y2:e.y2},highlightArea:{x1:e.x1+.5*i,y1:e.y1,x2:e.x2,y2:e.y2}},this._contentAreaDimensions.bottom={hoverArea:{x1:e.x1+.25*i,y1:e.y1+.5*n,x2:e.x1+.75*i,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1+.5*n,x2:e.x2,y2:e.y2}},super.getElementArea(this.element))}positionHeader(t){this._header.side!==t&&(this._header.setSide(t),this._headerSideChanged=!0,this.setupHeaderPosition())}updateNodeSize(){if("none"!==this.element.style.display){const t=q(this.element);this._header.show&&(t[this._header.leftRightSided?g.width:g.height]-=this.layoutManager.layoutConfig.dimensions.headerHeight),this._childElementContainer.style.width=F(t.width),this._childElementContainer.style.height=F(t.height);for(let e=0;e=o&&tthis.onEventFromChild(t),globalThis.addEventListener(bt.ChildEventName,this._childEventListener,{passive:!0})}emit(t,...e){"userBroadcast"===t?this.emitUserBroadcast(...e):super.emit(t,...e)}emitUserBroadcast(...t){this.handleUserBroadcastEvent("userBroadcast",t)}destroy(){globalThis.removeEventListener(bt.ChildEventName,this._childEventListener)}handleUserBroadcastEvent(t,e){this._layoutManager.isSubWindow?this.propagateToParent(t,e):this.propagateToThisAndSubtree(t,e)}onEventFromChild(t){const e=t.detail;this.handleUserBroadcastEvent(e.eventName,e.args)}propagateToParent(t,e){const i={bubbles:!0,cancelable:!0,detail:{layoutManager:this._layoutManager,eventName:t,args:e}},n=new CustomEvent(bt.ChildEventName,i),o=globalThis.opener;if(null===o)throw new c("EHPTP15778");o.dispatchEvent(n)}propagateToThisAndSubtree(t,e){this.emitUnknown(t,...e);for(let i=0;ithis.handleContainerResize())),this._windowBeforeUnloadListener=()=>this.onBeforeUnload(),this._windowBeforeUnloadListening=!1,this._maximisedStackBeforeDestroyedListener=t=>this.cleanupBeforeMaximisedStackDestroyed(t),this.moveWindowTop=()=>{},this.focusWindow=()=>globalThis.focus(),this.isSubWindow=e.isSubWindow,this._constructorOrSubWindowLayoutConfig=e.constructorOrSubWindowLayoutConfig,t.checkInitialise(),b.checkInitialise(),void 0!==e.containerElement&&(this._containerElement=e.containerElement)}get container(){return this._containerElement}get isInitialised(){return this._isInitialised}get isDragging(){return document.body.classList.contains("lm_dragging")}get groundItem(){return this._groundItem}get root(){return this._groundItem}get openPopouts(){return this._openPopouts}get dropTargetIndicator(){return this._dropTargetIndicator}get transitionIndicator(){return this._transitionIndicator}get width(){return this._width}get height(){return this._height}get eventHub(){return this._eventHub}get rootItem(){if(void 0===this._groundItem)throw new Error("Cannot access rootItem before init");return 0===this._groundItem.contentItems.length?void 0:this._groundItem.contentItems[0]}get focusedComponentItem(){return this._focusedComponentItem}get tabDropPlaceholder(){return this._tabDropPlaceholder}get maximisedStack(){return this._maximisedStack}get deprecatedConstructor(){return!this.isSubWindow&&void 0!==this._constructorOrSubWindowLayoutConfig}get parent(){return this._parent}set parent(t){this._parent=t}get instances(){var t;const e=[],i=null!==(t=this.parent)&&void 0!==t?t:this;e.push(i);for(let t of i.openPopouts){const i=t.getGlInstance();e.push(i)}return e}destroy(){if(this._isInitialised){this._windowBeforeUnloadListening&&(globalThis.removeEventListener("beforeunload",this._windowBeforeUnloadListener),this._windowBeforeUnloadListening=!1),!0===this.layoutConfig.settings.closePopoutsOnUnload&&this.closeAllOpenPopouts(),this._resizeObserver.disconnect(),this.checkClearResizeTimeout(),void 0!==this._groundItem&&this._groundItem.destroy(),this._tabDropPlaceholder.remove(),null!==this._dropTargetIndicator&&this._dropTargetIndicator.destroy(),null!==this._transitionIndicator&&this._transitionIndicator.destroy(),this._eventHub.destroy();for(const t of this._dragSources)t.destroy();this._dragSources=[],this._isInitialised=!1}}minifyConfig(t){return T.minifyConfig(t)}unminifyConfig(t){return T.unminifyConfig(t)}init(){var t;this.setContainer(),this._dropTargetIndicator=new yt,this._transitionIndicator=new wt,this.updateSizeFromContainer(),this.layoutConfig=T.createDefault(),this._groundItem=new ct(this,this.layoutConfig.root,this._containerElement),this._groundItem.init(),this.checkLoadedLayoutMaximiseItem(),this._resizeObserver.observe(this._containerElement),this._isInitialised=!0,this.adjustColumnsResponsive(),this.emit("initialised");let e=this._constructorOrSubWindowLayoutConfig;this.isSubWindow&&void 0!==e&&((null===(t=e.root)||void 0===t?void 0:t.type)==y.component&&(e.root={type:y.stack,content:[e.root]}),this.loadLayout(e))}loadLayout(t){if(!this.isInitialised)throw new Error("GoldenLayout: Need to call init() if LayoutConfig with defined root passed to constructor");if(void 0===this._groundItem)throw new u("LMLL11119");this.layoutConfig=B.resolve(t),this.createSubWindows(),this._groundItem.loadRoot(this.layoutConfig.root),this.checkLoadedLayoutMaximiseItem(),this.adjustColumnsResponsive()}saveLayout(){if(!1===this._isInitialised)throw new Error("Can't create config, layout not yet initialised");if(void 0===this._groundItem)throw new u("LMTC18244");{const t=this._groundItem.calculateConfigContent();let e;e=1!==t.length?void 0:t[0],this.reconcilePopoutWindows();const i=[];for(let t=0;t=0?n=this._groundItem.contentItems[0]:e=0;break;case y.row:case y.column:e=n.addItem(t,i.index);break;case y.stack:if(D.isComponent(t)){e=n.addItem(t,i.index);break}throw Error(m[6]);case y.component:throw new h("LMAIALC87444602");default:throw new d("LMAIALU98881733",n.type)}if(D.isComponent(t)){const t=n.contentItems[e];rt.isStack(t)&&(n=t,e=0)}return i.parentItem=n,i.index=e,i}}}loadComponentAsRoot(t){if(void 0===this._groundItem)throw new Error("Cannot add item before init");this._groundItem.loadComponentAsRoot(t)}updateSize(t,e){this.setSize(t,e)}setSize(t,e){if(this._width=t,this._height=e,!0===this._isInitialised){if(void 0===this._groundItem)throw new u("LMUS18881");if(this._groundItem.setSize(this._width,this._height),this._maximisedStack){const{width:t,height:e}=q(this._containerElement);G(this._maximisedStack.element,t),Z(this._maximisedStack.element,e),this._maximisedStack.updateSize(!1)}this.adjustColumnsResponsive()}}beginSizeInvalidation(){this._sizeInvalidationBeginCount++}endSizeInvalidation(){0==--this._sizeInvalidationBeginCount&&this.updateSizeFromContainer()}updateSizeFromContainer(){const{width:t,height:e}=q(this._containerElement);this.setSize(t,e)}updateRootSize(t=!1){if(void 0===this._groundItem)throw new u("LMURS28881");this._groundItem.updateSize(t)}createAndInitContentItem(t,e){const i=this.createContentItem(t,e);return i.init(),i}createContentItem(t,e){if("string"!=typeof t.type)throw new o("Missing parameter 'type'",JSON.stringify(t));return!S.isComponentItem(t)||e instanceof It||!e||!0===this.isSubWindow&&e instanceof ct||(t={type:y.stack,content:[t],size:t.size,sizeUnit:t.sizeUnit,minSize:t.minSize,minSizeUnit:t.minSizeUnit,id:t.id,maximised:t.maximised,isClosable:t.isClosable,activeItemIndex:0,header:void 0}),this.createContentItemFromConfig(t,e)}findFirstComponentItemById(t){if(void 0===this._groundItem)throw new u("LMFFCIBI82446");return this.findFirstContentItemTypeByIdRecursive(y.component,t,this._groundItem)}createPopout(t,e,i,n){return t instanceof rt?this.createPopoutFromContentItem(t,e,i,n):this.createPopoutFromItemConfig(t,e,i,n)}createPopoutFromContentItem(t,e,i,n){var o,s,r;const a=null!==(o=t.findAncestorWithSiblings())&&void 0!==o?o:null===(s=this.groundItem)||void 0===s?void 0:s.contentItems[0];if(void 0===a)throw new u("LMCPFCI00833");if(null===a.parent)throw new c("LMCPFCI00834");{if(void 0===n&&(n=a.parent.contentItems.indexOf(a)),null!==i&&a.parent.addPopInParentId(i),void 0===e){const i=$(globalThis),n=t instanceof ht?t.getOuterBoundingClientRect():t.element.getBoundingClientRect();e={left:i.left+n.left,top:i.top+n.top,width:n.width,height:n.height}}const o=t.toConfig();if((null===(r=t.parent)||void 0===r?void 0:r.contentItems.includes(t))&&t.remove(),M.isRootItemConfig(o))return this.createPopoutFromItemConfig(o,e,i,n);throw new Error(`${m[0]}`)}}beginVirtualSizedContainerAdding(){0==++this._virtualSizedContainerAddingBeginCount&&(this._virtualSizedContainers.length=0)}addVirtualSizedContainer(t){this._virtualSizedContainers.push(t)}endVirtualSizedContainerAdding(){if(0==--this._virtualSizedContainerAddingBeginCount){const t=this._virtualSizedContainers.length;if(t>0){this.fireBeforeVirtualRectingEvent(t);for(let e=0;e{const t=a.getGlInstance(),e=function(){var e,i;t.isDragging||0!==(null===(i=null===(e=t.groundItem)||void 0===e?void 0:e.getAllComponentItems())||void 0===i?void 0:i.length)||a.close()};t.on("itemDropped",e),t.on("itemDestroyed",e),this.emit("windowOpened",a)})),a.on("closed",(()=>this.reconcilePopoutWindows())),this._openPopouts.push(a),this.layoutConfig.settings.closePopoutsOnUnload&&!this._windowBeforeUnloadListening&&(globalThis.addEventListener("beforeunload",this._windowBeforeUnloadListener,{passive:!0}),this._windowBeforeUnloadListening=!0),a}closeAllOpenPopouts(t=!1){for(let e=0;eglobalThis.close()),1)}getArea(t,e){let i=null,n=1/0;for(let o=0;o=s.x1&&t=s.y1&&es.surface&&(n=s.surface,i=s)}return i}calculateItemAreas(){const t=this.getAllContentItems(),e=this._groundItem;if(void 0===e)throw new u("LMCIAR44365");if(1!==t.length){e.contentItems[0].isStack?this._itemAreas=[]:this._itemAreas=e.createSideAreas();for(let e=0;e0){let e=t[0];if(rt.isComponentItem(e)){const t=e.parent;if(null===t)throw new c("LMXLLMI69999");e=t}if(!rt.isStack(e))throw new h("LMCLLMI19993");e.maximise()}}}processMaximiseStack(t){if(this._maximisedStack=t,t.on("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),t.element.classList.add("lm_maximised"),t.element.insertAdjacentElement("afterend",this._maximisePlaceholder),void 0===this._groundItem)throw new u("LMMXI19993");{this._groundItem.element.prepend(t.element);const{width:e,height:i}=q(this._containerElement);G(t.element,e),Z(t.element,i),t.updateSize(!0),t.focusActiveContentItem(),this._maximisedStack.emit("maximised"),this.emit("stateChanged")}}processMinimiseMaximisedStack(){if(void 0===this._maximisedStack)throw new h("LMMMS74422");{const t=this._maximisedStack;if(null===t.parent)throw new c("LMMI13668");t.element.classList.remove("lm_maximised"),this._maximisePlaceholder.insertAdjacentElement("afterend",t.element),this._maximisePlaceholder.remove(),this.updateRootSize(!0),this._maximisedStack=void 0,t.off("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),t.emit("minimised"),this.emit("stateChanged")}}reconcilePopoutWindows(){const t=[];for(let e=0;e{this._resizeTimeoutId=void 0,this.beginSizeInvalidation(),this.endSizeInvalidation()}),this.resizeDebounceInterval))}checkClearResizeTimeout(){void 0!==this._resizeTimeoutId&&(clearTimeout(this._resizeTimeoutId),this._resizeTimeoutId=void 0)}setContainer(){var t;const e=document.body,i=null!==(t=this._containerElement)&&void 0!==t?t:e;if(i===e){this.resizeWithContainerAutomatically=!0;const t=document.documentElement;t.style.height="100%",t.style.margin="0",t.style.padding="0",t.style.overflow="hidden",e.style.height="100%",e.style.margin="0",e.style.padding="0",e.style.overflow="hidden"}this._containerElement=i}onBeforeUnload(){this.destroy()}adjustColumnsResponsive(){if(void 0===this._groundItem)throw new u("LMACR20883");if(this._firstLoad=!1,this.useResponsiveLayout()&&!this._updatingColumnsResponsive&&this._groundItem.contentItems.length>0&&this._groundItem.contentItems[0].isRow){if(void 0===this._groundItem||null===this._width)throw new u("LMACR77412");{const t=this._groundItem.contentItems[0].contentItems.length;if(t<=1)return;{const e=this.layoutConfig.dimensions.defaultMinItemWidth;if(t*e<=this._width)return;{this._updatingColumnsResponsive=!0;const i=t-Math.max(Math.floor(this._width/e),1),n=this._groundItem.contentItems[0],o=this.getAllStacks();if(0===o.length)throw new h("LMACRS77413");{const t=o[0];for(let e=0;en?void 0:{parentItem:t,index:o}}}case 1:if(void 0===this._focusedComponentItem)return;{const t=this._focusedComponentItem.parentItem;return this.tryCreateLocationFromParentItem(t,e)}case 2:{const t=this.findFirstContentItemType(y.stack);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 3:{let t=this.findFirstContentItemType(y.row);return void 0!==t?this.tryCreateLocationFromParentItem(t,e):(t=this.findFirstContentItemType(y.column),void 0!==t?this.tryCreateLocationFromParentItem(t,e):void 0)}case 4:{const t=this.findFirstContentItemType(y.row);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 5:{const t=this.findFirstContentItemType(y.column);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 6:if(void 0===this._groundItem)throw new u("LMFLRIF18244");return void 0!==this.rootItem?void 0:void 0===e||0===e?{parentItem:this._groundItem,index:0}:void 0;case 7:if(void 0===this._groundItem)throw new u("LMFLF18244");{const t=this._groundItem.contentItems;if(0===t.length)return void 0===e||0===e?{parentItem:this._groundItem,index:0}:void 0;{const i=t[0];return this.tryCreateLocationFromParentItem(i,e)}}}}tryCreateLocationFromParentItem(t,e){const i=t.contentItems.length;return void 0===e?{parentItem:t,index:i}:e<0||e>i?void 0:{parentItem:t,index:e}}}!function(t){t.createMaximisePlaceElement=function(t){const e=t.createElement("div");return e.classList.add("lm_maximise_place"),e},t.createTabDropPlaceholderElement=function(t){const e=t.createElement("div");return e.classList.add("lm_drop_tab_placeholder"),e},t.defaultLocationSelectors=[{typeId:1,index:void 0},{typeId:2,index:void 0},{typeId:3,index:void 0},{typeId:7,index:void 0}],t.afterFocusedItemIfPossibleLocationSelectors=[{typeId:0,index:1},{typeId:2,index:void 0},{typeId:3,index:void 0},{typeId:7,index:void 0}]}(St||(St={}));class Et extends St{constructor(t,e,i,n){if(super(Et.createLayoutManagerConstructorParameters(t,e)),this._bindComponentEventHanlderPassedInConstructor=!1,this._creationTimeoutPassed=!1,void 0!==e&&"function"==typeof e&&(this.bindComponentEvent=e,this._bindComponentEventHanlderPassedInConstructor=!0,void 0!==i&&(this.unbindComponentEvent=i)),!this._bindComponentEventHanlderPassedInConstructor&&this.isSubWindow){if(void 0===this._constructorOrSubWindowLayoutConfig)throw new u("VLC98823");{const t=B.resolve(this._constructorOrSubWindowLayoutConfig);this.layoutConfig=Object.assign(Object.assign({},t),{root:void 0})}}!0!==n&&(this.deprecatedConstructor||this.init())}destroy(){this.bindComponentEvent=void 0,this.unbindComponentEvent=void 0,super.destroy()}init(){if(this._bindComponentEventHanlderPassedInConstructor||"loading"!==document.readyState&&null!==document.body){if(!this._bindComponentEventHanlderPassedInConstructor&&!0===this.isSubWindow&&!this._creationTimeoutPassed)return setTimeout((()=>this.init()),7),void(this._creationTimeoutPassed=!0);!0===this.isSubWindow&&(this._bindComponentEventHanlderPassedInConstructor||this.clearHtmlAndAdjustStylesForSubWindow(),window.__glInstance=this),super.init()}else document.addEventListener("DOMContentLoaded",(()=>this.init()),{passive:!0})}clearHtmlAndAdjustStylesForSubWindow(){const t=document.head,e=new Array(4);e[0]=document.querySelectorAll("body link"),e[1]=document.querySelectorAll("body style"),e[2]=document.querySelectorAll("template"),e[3]=document.querySelectorAll(".gl_keep");for(let i=0;ithis.emit("popIn"))),document.body.appendChild(t),!0}}bindComponent(t,e){if(void 0!==this.bindComponentEvent)return this.bindComponentEvent(t,e);if(void 0!==this.getComponentEvent)return{virtual:!1,component:this.getComponentEvent(t,e)};{const t=`${m[2]}: ${JSON.stringify(e)}`;throw new a(t)}}unbindComponent(t,e,i){if(void 0!==this.unbindComponentEvent)this.unbindComponentEvent(t);else if(!e&&void 0!==this.releaseComponentEvent){if(void 0===i)throw new u("VCUCRCU333998");this.releaseComponentEvent(t,i)}}}!function(t){let e=!1;t.createLayoutManagerConstructorParameters=function(t,i){const n=e?null:new URL(document.location.href).searchParams.get("gl-window");e=!0;const o=null!==n;let s,r;if(null!==n){const e=localStorage.getItem(n);if(null===e)throw new Error("Null gl-window Config");localStorage.removeItem(n);const i=JSON.parse(e),o=T.unminifyConfig(i);r=B.fromResolved(o),t instanceof HTMLElement&&(s=t)}else void 0===t?r=void 0:t instanceof HTMLElement?(r=void 0,s=t):r=t,void 0===s&&i instanceof HTMLElement&&(s=i);return{constructorOrSubWindowLayoutConfig:r,isSubWindow:o,containerElement:s}}}(Et||(Et={}));class xt extends Et{constructor(t,e,i){super(t,e,i,!0),this._componentTypesMap=new Map,this._registeredComponentMap=new Map,this._virtuableComponentMap=new Map,this._containerVirtualRectingRequiredEventListener=(t,e,i)=>this.handleContainerVirtualRectingRequiredEvent(t,e,i),this._containerVirtualVisibilityChangeRequiredEventListener=(t,e)=>this.handleContainerVirtualVisibilityChangeRequiredEvent(t,e),this._containerVirtualZIndexChangeRequiredEventListener=(t,e,i)=>this.handleContainerVirtualZIndexChangeRequiredEvent(t,e,i),this.deprecatedConstructor||this.init()}registerComponent(t,e,i=!1){if("function"!=typeof e)throw new r("registerComponent() componentConstructorOrFactoryFtn parameter is not a function");if(e.hasOwnProperty("prototype")){const n=e;this.registerComponentConstructor(t,n,i)}else{const n=e;this.registerComponentFactoryFunction(t,n,i)}}registerComponentConstructor(t,e,i=!1){if("function"!=typeof e)throw new Error(m[1]);if(void 0!==this._componentTypesMap.get(t))throw new a(`${m[3]}: ${t}`);this._componentTypesMap.set(t,{constructor:e,factoryFunction:void 0,virtual:i})}registerComponentFactoryFunction(t,e,i=!1){if("function"!=typeof e)throw new a("Please register a constructor function");if(void 0!==this._componentTypesMap.get(t))throw new a(`${m[3]}: ${t}`);this._componentTypesMap.set(t,{constructor:void 0,factoryFunction:e,virtual:i})}registerComponentFunction(t){this.registerGetComponentConstructorCallback(t)}registerGetComponentConstructorCallback(t){if("function"!=typeof t)throw new Error("Please register a callback function");void 0!==this._getComponentConstructorFtn&&console.warn("Multiple component functions are being registered. Only the final registered function will be used."),this._getComponentConstructorFtn=t}getRegisteredComponentTypeNames(){const t=this._componentTypesMap.keys();return Array.from(t)}getComponentInstantiator(t){let e;const i=z.resolveComponentTypeName(t);return void 0!==i&&(e=this._componentTypesMap.get(i)),void 0===e&&void 0!==this._getComponentConstructorFtn&&(e={constructor:this._getComponentConstructorFtn(t),factoryFunction:void 0,virtual:!1}),e}bindComponent(t,e){let i;const n=z.resolveComponentTypeName(e);let o;if(void 0!==n&&(i=this._componentTypesMap.get(n)),void 0===i&&void 0!==this._getComponentConstructorFtn&&(i={constructor:this._getComponentConstructorFtn(e),factoryFunction:void 0,virtual:!1}),void 0!==i){const s=i.virtual;let r,l;r=void 0===e.componentState?void 0:J({},e.componentState);const d=i.constructor;if(void 0!==d)l=new d(t,r,s);else{const e=i.factoryFunction;if(void 0===e)throw new h("LMBCFFU10008");l=e(t,r,s)}if(s){if(void 0===l)throw new u("GLBCVCU988774");{const e=l,i=e.rootHtmlElement;if(void 0===i)throw new a(`${m[5]}: ${n}`);!function(t){const e="absolute";t.style.position!==e&&(t.style.position=e)}(i),this.container.appendChild(i),this._virtuableComponentMap.set(t,e),t.virtualRectingRequiredEvent=this._containerVirtualRectingRequiredEventListener,t.virtualVisibilityChangeRequiredEvent=this._containerVirtualVisibilityChangeRequiredEventListener,t.virtualZIndexChangeRequiredEvent=this._containerVirtualZIndexChangeRequiredEventListener}}this._registeredComponentMap.set(t,l),o={virtual:i.virtual,component:l}}else o=super.bindComponent(t,e);return o}unbindComponent(t,e,i){if(void 0===this._registeredComponentMap.get(t))super.unbindComponent(t,e,i);else{const e=this._virtuableComponentMap.get(t);if(void 0!==e){const i=e.rootHtmlElement;if(void 0===i)throw new h("GLUC77743",t.title);this.container.removeChild(i),this._virtuableComponentMap.delete(t)}}}fireBeforeVirtualRectingEvent(t){this._goldenLayoutBoundingClientRect=this.container.getBoundingClientRect(),super.fireBeforeVirtualRectingEvent(t)}handleContainerVirtualRectingRequiredEvent(t,e,i){const n=this._virtuableComponentMap.get(t);if(void 0===n)throw new u("GLHCSCE55933");{const o=n.rootHtmlElement;if(void 0===o)throw new a(m[4]+" "+t.title);{const n=t.element.getBoundingClientRect(),s=n.left-this._goldenLayoutBoundingClientRect.left;o.style.left=F(s);const r=n.top-this._goldenLayoutBoundingClientRect.top;o.style.top=F(r),G(o,e),Z(o,i)}}}handleContainerVirtualVisibilityChangeRequiredEvent(t,e){const i=this._virtuableComponentMap.get(t);if(void 0===i)throw new u("GLHCVVCRE55934");{const n=i.rootHtmlElement;if(void 0===n)throw new a(m[4]+" "+t.title);X(n,e)}}handleContainerVirtualZIndexChangeRequiredEvent(t,e,i){const n=this._virtuableComponentMap.get(t);if(void 0===n)throw new u("GLHCVZICRE55935");{const e=n.rootHtmlElement;if(void 0===e)throw new a(m[4]+" "+t.title);e.style.zIndex=i}}}return i})())); \ No newline at end of file +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.goldenLayout=e():t.goldenLayout=e()}(globalThis,(()=>(()=>{"use strict";var t,e={d:(t,i)=>{for(var n in i)e.o(i,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},i={};e.r(i),e.d(i,{ApiError:()=>r,BindError:()=>a,BrowserPopout:()=>lt,ComponentContainer:()=>nt,ComponentItem:()=>ht,ComponentItemConfig:()=>W,ConfigurationError:()=>o,ContentItem:()=>rt,DragSource:()=>gt,EventEmitter:()=>it,EventHub:()=>bt,ExternalError:()=>n,GoldenLayout:()=>xt,Header:()=>Ct,HeaderedItemConfig:()=>R,I18nStrings:()=>t,ItemConfig:()=>D,ItemType:()=>y,JsonValue:()=>C,LayoutConfig:()=>B,LayoutManager:()=>St,LogicalZIndex:()=>f,LogicalZIndexToDefaultMap:()=>v,PopoutBlockedError:()=>s,PopoutLayoutConfig:()=>O,ResolvedComponentItemConfig:()=>z,ResolvedGroundItemConfig:()=>P,ResolvedHeaderedItemConfig:()=>E,ResolvedItemConfig:()=>S,ResolvedLayoutConfig:()=>T,ResolvedPopoutLayoutConfig:()=>A,ResolvedRootItemConfig:()=>L,ResolvedRowOrColumnItemConfig:()=>M,ResolvedStackItemConfig:()=>x,ResponsiveMode:()=>w,RootItemConfig:()=>H,RowOrColumn:()=>at,RowOrColumnItemConfig:()=>U,Side:()=>_,SizeUnitEnum:()=>I,Stack:()=>It,StackItemConfig:()=>k,StyleConstants:()=>p,Tab:()=>ft,VirtualLayout:()=>Et,WidthOrHeightPropertyName:()=>g,formatSize:()=>tt,formatUndefinableSize:()=>et,i18nStrings:()=>m,parseSize:()=>Q});class n extends Error{constructor(t,e){super(e),this.type=t}}class o extends n{constructor(t,e){super("Configuration",t),this.node=e}}class s extends n{constructor(t){super("PopoutBlocked",t)}}class r extends n{constructor(t){super("API",t)}}class a extends n{constructor(t){super("Bind",t)}}class l extends Error{constructor(t,e,i){super(`${t}: ${e}${void 0===i?"":": "+i}`)}}class h extends l{constructor(t,e){super("Assert",t,e)}}class d extends l{constructor(t,e,i){super("UnreachableCase",t,`${e}${void 0===i?"":": "+i}`)}}class c extends l{constructor(t,e){super("UnexpectedNull",t,e)}}class u extends l{constructor(t,e){super("UnexpectedUndefined",t,e)}}!function(t){let e=!1;const i={PopoutCannotBeCreatedWithGroundItemConfig:{id:0,default:"Popout cannot be created with ground ItemConfig"},PleaseRegisterAConstructorFunction:{id:1,default:"Please register a constructor function"},ComponentTypeNotRegisteredAndBindComponentEventHandlerNotAssigned:{id:2,default:"Component type not registered and BindComponentEvent handler not assigned"},ComponentIsAlreadyRegistered:{id:3,default:"Component is already registered"},ComponentIsNotVirtuable:{id:4,default:"Component is not virtuable. Requires rootHtmlElement field/getter"},VirtualComponentDoesNotHaveRootHtmlElement:{id:5,default:'Virtual component does not have getter "rootHtmlElement"'},ItemConfigIsNotTypeComponent:{id:6,default:"ItemConfig is not of type component"},InvalidNumberPartInSizeString:{id:7,default:"Invalid number part in size string"},UnknownUnitInSizeString:{id:8,default:"Unknown unit in size string"},UnsupportedUnitInSizeString:{id:9,default:"Unsupported unit in size string"}};t.idCount=Object.keys(i).length;const n=Object.values(i);t.checkInitialise=function(){if(!e)for(let e=0;e="0"&&t<="9"}function G(t,e){const i=F(e);t.style.width=i}function Z(t,e){const i=F(e);t.style.height=i}function q(t){return{width:t.offsetWidth,height:t.offsetHeight}}function j(t){let e,i,n=t.mozInnerScreenX,o=t.mozInnerScreenY;return void 0===n||void 0===o?(e=(t.outerWidth-t.innerWidth)/2,i=t.outerHeight-t.innerHeight-e):(e=n-t.screenX,i=o-t.screenY),{width:Math.max(0,e),height:Math.max(0,i)}}function $(t){let e=t.mozInnerScreenX,i=t.mozInnerScreenY;if(void 0===e||void 0===i){const n=j(t);e=t.screenX+n.width,i=t.screenY+n.height}return{left:e,top:i}}function X(t,e){t.style.display=e?"":"none"}function Y(t,e){if(void 0!==e)for(const i in e)if(e.hasOwnProperty(i)){const n=e[i],o=t[i];t[i]=J(o,n)}return t}function J(t,e){if("object"!=typeof e)return e;if(Array.isArray(e)){const t=e.length,i=new Array(t);for(let n=0;n36)throw new Error("Too many keys in config minifier map")},t.translateObject=n}(b||(b={})),function(t){t.defaults={type:y.ground,content:[],size:1,sizeUnit:I.Fractional,minSize:void 0,minSizeUnit:I.Pixel,id:"",isClosable:!0},t.createCopy=function(t,e){switch(t.type){case y.ground:case y.row:case y.column:return M.createCopy(t,e);case y.stack:return x.createCopy(t,e);case y.component:return z.createCopy(t);default:throw new d("CICC91354",t.type,"Invalid Config Item type specified")}},t.createDefault=function(t){switch(t){case y.ground:throw new h("CICCDR91562");case y.row:case y.column:return M.createDefault(t);case y.stack:return x.createDefault();case y.component:return z.createDefault();default:throw new d("CICCDD91563",t,"Invalid Config Item type specified")}},t.isComponentItem=function(t){return t.type===y.component},t.isStackItem=function(t){return t.type===y.stack},t.isGroundItem=function(t){return t.type===y.ground}}(S||(S={})),function(t){let e;t.defaultMaximised=!1,function(t){t.createCopy=function(t,e){return void 0===t?void 0:{show:null!=e?e:t.show,popout:t.popout,close:t.close,maximise:t.maximise,minimise:t.minimise,tabDropdown:t.tabDropdown}}}(e=t.Header||(t.Header={}))}(E||(E={})),function(t){function e(t){const e=t.length,i=new Array(e);for(let n=0;n"__glMaximised"===t));t>0&&(o=!0,n=n.splice(t,1)),e=n.length>0?n[0]:S.defaults.id}else e=n;return i=void 0!==t.maximised?t.maximised:o,{id:e,maximised:i}}}(R||(R={})),function(t){function e(t){if(void 0===t)return[];{const e=t.length,i=new Array(e);for(let n=0;n0?e.content[0]:void 0,{resolved:!0,root:H.resolve(i),openPopouts:t.resolveOpenPopouts(e.openPopouts),dimensions:t.Dimensions.resolve(e.dimensions),settings:t.Settings.resolve(e.settings),header:t.Header.resolve(e.header,e.settings,e.labels)}}},t.fromResolved=function(e){return{root:H.fromResolvedOrUndefined(e.root),openPopouts:O.fromResolvedArray(e.openPopouts),settings:T.Settings.createCopy(e.settings),dimensions:t.Dimensions.fromResolved(e.dimensions),header:T.Header.createCopy(e.header)}},t.isResolved=function(t){const e=t;return void 0!==e.resolved&&!0===e.resolved},t.resolveOpenPopouts=function(t){if(void 0===t)return[];{const e=t.length,i=new Array(e);for(let n=0;n0?e.content[0]:void 0,{root:H.resolve(o),openPopouts:B.resolveOpenPopouts(e.openPopouts),dimensions:B.Dimensions.resolve(e.dimensions),settings:B.Settings.resolve(e.settings),header:B.Header.resolve(e.header,e.settings,e.labels),parentId:null!==(i=e.parentId)&&void 0!==i?i:null,indexInParent:null!==(n=e.indexInParent)&&void 0!==n?n:null,window:t.Window.resolve(e.window,e.dimensions),resolved:!0}},t.fromResolved=function(e){return{root:H.fromResolvedOrUndefined(e.root),openPopouts:i(e.openPopouts),dimensions:B.Dimensions.fromResolved(e.dimensions),settings:T.Settings.createCopy(e.settings),header:T.Header.createCopy(e.header),parentId:e.parentId,indexInParent:e.indexInParent,window:t.Window.fromResolved(e.window)}},t.fromResolvedArray=i}(O||(O={}));class it{constructor(){this._allEventSubscriptions=[],this._subscriptionsMap=new Map,this.unbind=this.removeEventListener,this.trigger=this.emit}tryBubbleEvent(t,e){}emit(t,...e){let i=this._subscriptionsMap.get(t);if(void 0!==i){i=i.slice();for(let t=0;t0){const n=e.slice();n.unshift(t);const o=this._allEventSubscriptions.slice();for(let t=0;tthis.onPointerDown(t),this._pointerMoveEventListener=t=>this.onPointerMove(t),this._pointerUpEventListener=t=>this.onPointerUp(t),this._timeout=void 0,this._allowableTargets=[t,...e],this._oDocument=document,this._eBody=document.body,this._nDelay=1800,this._nDistance=10,this._originalEvent={pageX:0,pageY:0,screenX:0,screenY:0},this._dragging=!1,this._eElement.addEventListener("pointerdown",this._pointerDownEventListener,{passive:!0})}destroy(){this.checkRemovePointerTrackingEventListeners(),this._eElement.removeEventListener("pointerdown",this._pointerDownEventListener)}cancelDrag(){this.processDragStop(void 0)}onPointerDown(t){this._allowableTargets.includes(t.target)&&t.isPrimary&&this.processPointerDown(t)}processPointerDown(t){this._originalEvent=t,this._oDocument.addEventListener("pointermove",this._pointerMoveEventListener),this._oDocument.addEventListener("pointerup",this._pointerUpEventListener,{passive:!0}),this._eBody.classList.add("lm_pointer_tracking"),this._pointerTracking=!0,this._timeout=setTimeout((()=>{try{this.startDrag()}catch(t){throw console.error(t),t}}),this._nDelay)}onPointerMove(t){this._pointerTracking&&(this.processDragMove(t),t.preventDefault())}processDragMove(t){const e=t.pageX-this._originalEvent.pageX,i=t.pageY-this._originalEvent.pageY;!1===this._dragging&&(Math.abs(e)>this._nDistance||Math.abs(i)>this._nDistance)&&this.startDrag(),this._dragging&&this.emit("drag",e,i,t)}onPointerUp(t){this.processDragStop(t)}processDragStop(t){void 0!==this._timeout&&(clearTimeout(this._timeout),this._timeout=void 0),this.checkRemovePointerTrackingEventListeners(),!0===this._dragging&&(this._eBody.classList.remove("lm_dragging"),this._eElement.classList.remove("lm_dragging"),this._dragging=!1,this.emit("dragStop",t))}checkRemovePointerTrackingEventListeners(){this._pointerTracking&&(this._oDocument.removeEventListener("pointermove",this._pointerMoveEventListener),this._oDocument.removeEventListener("pointerup",this._pointerUpEventListener),this._eBody.classList.remove("lm_pointer_tracking"),this._pointerTracking=!1)}startDrag(){void 0!==this._timeout&&(clearTimeout(this._timeout),this._timeout=void 0),this._dragging=!0,this._eBody.classList.add("lm_dragging"),this._eElement.classList.add("lm_dragging"),this.emit("dragStart",this._originalEvent.pageX,this._originalEvent.pageY),this.emit("drag",0,0,this._originalEvent)}}class st{constructor(t,e,i){this._isVertical=t,this._size=e,this._grabSize=i0)this.updateSize(!1);else if(!this.isGround){if(null===this._parent)throw new c("CIUC00874");this._parent.removeChild(this)}}addChild(t,e,i){return null!=e||(e=this._contentItems.length),this._contentItems.splice(e,0,t),t.setParent(this),!0===this._isInitialised&&!1===t._isInitialised&&t.init(),e}replaceChild(t,e,i=!1){const n=this._contentItems.indexOf(t),o=t._element.parentNode;if(-1===n)throw new h("CIRCI23232","Can't replace child. oldChild is not child of this");if(null===o)throw new c("CIRCP23232");if(o.replaceChild(e._element,t._element),!0===i&&(t._parent=null,t.destroy()),this._contentItems[n]=e,e.setParent(this),e.size=t.size,e.sizeUnit=t.sizeUnit,e.minSize=t.minSize,e.minSizeUnit=t.minSizeUnit,null===e._parent)throw new c("CIRCNC45699");!0===e._parent._isInitialised&&!1===e._isInitialised&&e.init(),this.updateSize(!1)}remove(){if(null===this._parent)throw new c("CIR11110");this._parent.removeChild(this)}popout(){const t=K(),e=this.layoutManager.createPopoutFromContentItem(this,void 0,t,void 0);return this.emitBaseBubblingEvent("stateChanged"),e}calculateConfigContent(){const t=this._contentItems,e=t.length,i=new Array(e);for(let n=0;n1)return t;t=t.parent}return null}findDockPoint(){const t=this.findAncestorWithSiblings();if(null!==t&&null!==t.parent){const e=t.parent._contentItems.indexOf(t);return{parent:t.parent,index:e}}return this.layoutManager.groundItem?{parent:this.layoutManager.groundItem,index:null}:null}init(){this._isInitialised=!0,this.emitBaseBubblingEvent("itemCreated"),this.emitUnknownBubblingEvent(this.type+"Created")}setParent(t){this._parent=t}addPopInParentId(t){this.popInParentIds.includes(t)||this.popInParentIds.push(t)}initContentItems(){for(let t=0;tthis.propagateEventToLayoutManager(t,e))))}propagateEventToLayoutManager(t,e){this._pendingEventPropagations[t]=!1,this.layoutManager.emitUnknown(t,e)}}class at extends rt{constructor(t,e,i,n){switch(super(e,i,n,at.createElement(document,t)),this._rowOrColumnParent=n,this._splitter=[],this.isRow=!t,this.isColumn=t,this._childElementContainer=this.element,this._splitterSize=e.layoutConfig.dimensions.borderWidth,this._splitterGrabSize=e.layoutConfig.dimensions.borderGrabWidth,this._isColumn=t,this._dimension=t?"height":"width",this._splitterPosition=null,this._splitterMinPosition=null,this._splitterMaxPosition=null,i.type){case y.row:case y.column:this._configType=i.type;break;default:throw new h("ROCCCT00925")}}newComponent(t,e,i,n){const o={type:"component",componentType:t,componentState:e,title:i};return this.newItem(o,n)}addComponent(t,e,i,n){const o={type:"component",componentType:t,componentState:e,title:i};return this.addItem(o,n)}newItem(t,e){e=this.addItem(t,e);const i=this.contentItems[e];return rt.isStack(i)&&D.isComponent(t)?i.contentItems[0]:i}addItem(t,e){this.layoutManager.checkMinimiseMaximisedStack();const i=D.resolve(t,!1),n=this.layoutManager.createAndInitContentItem(i,this);return this.addChild(n,e,!1)}addChild(t,e,i){if(void 0===e&&(e=this.contentItems.length),this.contentItems.length>0){const i=this.createSplitter(Math.max(0,e-1)).element;e>0?(this.contentItems[e-1].element.insertAdjacentElement("afterend",i),i.insertAdjacentElement("afterend",t.element)):(this.contentItems[0].element.insertAdjacentElement("beforebegin",i),i.insertAdjacentElement("beforebegin",t.element))}else this._childElementContainer.appendChild(t.element);super.addChild(t,e);const n=1/this.contentItems.length*100;if(!0===i)return this.emitBaseBubblingEvent("stateChanged"),e;for(let e=0;e0&&(this.calculateRelativeSizes(),this.setAbsoluteSizes()),this.emitBaseBubblingEvent("stateChanged"),this.emit("resize")}setAbsoluteSizes(){const t=this.calculateAbsoluteSizes();for(let e=0;e0&&t.itemSizes[e]++,this._isColumn?(G(this.contentItems[e].element,t.crossAxisSize),Z(this.contentItems[e].element,t.itemSizes[e])):(G(this.contentItems[e].element,t.itemSizes[e]),Z(this.contentItems[e].element,t.crossAxisSize))}calculateAbsoluteSizes(){const t=(this.contentItems.length-1)*this._splitterSize,{width:e,height:i}=q(this.element);let n,o;this._isColumn?(n=i-t,o=e):(n=e-t,o=i);let s=0;const r=[];for(let t=0;t0){const n=100-t;for(let t=0;t100&&e.length>0){for(let t=0;te)return;{const r=i/e;let a=i;for(let e=0;ethis.onSplitterDrag(e,t,i))),e.on("dragStop",(()=>this.onSplitterDragStop(e))),e.on("dragStart",(()=>this.onSplitterDragStart(e))),this._splitter.splice(t,0,e),e}getSplitItems(t){const e=this._splitter.indexOf(t);return{before:this.contentItems[e],after:this.contentItems[e+1]}}calculateContentItemMinSize(t){const e=t.minSize;if(void 0!==e){if(t.minSizeUnit===I.Pixel)return e;throw new h("ROCGMD98831",JSON.stringify(t))}{const t=this.layoutManager.layoutConfig.dimensions;return this._isColumn?t.defaultMinItemHeight:t.defaultMinItemWidth}}calculateContentItemsTotalMinSize(t){let e=0;for(const i of t)e+=this.calculateContentItemMinSize(i);return e}onSplitterDragStart(t){const e=this.getSplitItems(t),i=V(e.before.element.style[this._dimension]),n=V(e.after.element.style[this._dimension]),o=this.calculateContentItemsTotalMinSize(e.before.contentItems),s=this.calculateContentItemsTotalMinSize(e.after.contentItems);this._splitterPosition=0,this._splitterMinPosition=-1*(i-o),this._splitterMaxPosition=n-s}onSplitterDrag(t,e,i){let n=this._isColumn?i:e;if(null===this._splitterMinPosition||null===this._splitterMaxPosition)throw new c("ROCOSD59226");n=Math.max(n,this._splitterMinPosition),n=Math.min(n,this._splitterMaxPosition),this._splitterPosition=n;const o=F(n);this._isColumn?t.element.style.top=o:t.element.style.left=o}onSplitterDragStop(t){if(null===this._splitterPosition)throw new c("ROCOSDS66932");{const e=this.getSplitItems(t),i=V(e.before.element.style[this._dimension]),n=V(e.after.element.style[this._dimension]),o=(this._splitterPosition+i)/(i+n),s=e.before.size+e.after.size;e.before.size=o*s,e.after.size=(1-o)*s,t.element.style.top=F(0),t.element.style.left=F(0),globalThis.requestAnimationFrame((()=>this.updateSize(!1)))}}}!function(t){t.getElementDimensionSize=function(t,e){return"width"===e?function(t){return t.offsetWidth}(t):function(t){return t.offsetHeight}(t)},t.setElementDimensionSize=function(t,e,i){return"width"===e?G(t,i):Z(t,i)},t.createElement=function(t,e){const i=t.createElement("div");return i.classList.add("lm_item"),e?i.classList.add("lm_column"):i.classList.add("lm_row"),i}}(at||(at={}));class lt extends it{constructor(t,e,i){super(),this._config=t,this._initialWindowSize=e,this._layoutManager=i,this._isInitialised=!1,this._popoutWindow=null,this._preventPopInOnClose=!1,this.createWindow()}toConfig(){var t,e;if(!1===this._isInitialised)throw new Error("Can't create config, layout not yet initialised");const i=this.getGlInstance().saveLayout();let n,o;null===this._popoutWindow?(n=null,o=null):(n=null!==(t=this._popoutWindow.screenX)&&void 0!==t?t:this._popoutWindow.screenLeft,o=null!==(e=this._popoutWindow.screenY)&&void 0!==e?e:this._popoutWindow.screenTop);const s={width:this.getGlInstance().width,height:this.getGlInstance().height,left:n,top:o};return{root:i.root,openPopouts:i.openPopouts,settings:i.settings,dimensions:i.dimensions,header:i.header,window:s,parentId:this._config.parentId,indexInParent:this._config.indexInParent,resolved:!0}}getGlInstance(){if(null===this._popoutWindow)throw new c("BPGGI24693");return this._popoutWindow.__glInstance}getWindow(){if(null===this._popoutWindow)throw new c("BPGW087215");return this._popoutWindow}close(t=!1){if(t&&(this._preventPopInOnClose=!0),this.getGlInstance())this.getGlInstance().closeWindow();else try{this.getWindow().close()}catch(t){}}popIn(){let t,e=this._config.indexInParent;if(!this._config.parentId)return;let i=Y({},this.getGlInstance().saveLayout()).root;if(void 0===i)return;const n=this._layoutManager.groundItem;if(void 0===n)throw new u("BPPIG34972");if(t=n.getItemsByPopInParentId(this._config.parentId)[0],t||(t=n.contentItems.length>0?n.contentItems[0]:n,e=t.contentItems.length),t.isStack){for(;i.type!==y.component&&1===i.content.length;)i=i.content[0];if(i.type!==y.component){if(null===t.parent)throw new c("BPPIG34973");const i=new at(!1,this._layoutManager,M.createDefault("row"),t.parent);t.parent.replaceChild(t,i,!1),i.addChild(t),t=i,e=1}}const o=this._layoutManager.createAndInitContentItem(i,t);t.addChild(o,e),this._layoutManager.layoutConfig.settings.popInOnClose?this._onClose():this.close()}createWindow(){const t=this.createUrl(),e=Math.floor(1e6*Math.random()).toString(36),i=this.serializeWindowFeatures({left:this._initialWindowSize.left,top:this._initialWindowSize.top,width:this._initialWindowSize.width,height:this._initialWindowSize.height,innerWidth:this._initialWindowSize.width,innerHeight:this._initialWindowSize.height,menubar:"no",toolbar:"no",location:"no",personalbar:"no",resizable:"yes",scrollbars:"no",status:"no"});if(this._popoutWindow=globalThis.open(t,e,i),this._popoutWindow)this._popoutWindow.addEventListener("load",(()=>{this.positionAndResizeWindow(),this._popoutWindow&&this._popoutWindow.addEventListener("beforeunload",(()=>{this._layoutManager.layoutConfig.settings.popInOnClose&&!this._preventPopInOnClose?this.popIn():this._onClose()}),{passive:!0})}),{passive:!0}),this._checkReadyInterval=setInterval((()=>this.checkReady()),10);else if(!0===this._layoutManager.layoutConfig.settings.blockedPopoutsThrowError)throw new s("Popout blocked")}checkReady(){if(null===this._popoutWindow)throw new c("BPCR01844");this._popoutWindow.__glInstance&&this._popoutWindow.__glInstance.isInitialised&&(this._popoutWindow.__glInstance.parent=this._layoutManager,this.onInitialised(),void 0!==this._checkReadyInterval&&(clearInterval(this._checkReadyInterval),this._checkReadyInterval=void 0))}positionAndResizeWindow(){if(null===this._popoutWindow)throw new c("BPPARW1");if(this._popoutWindow.innerWidth>0&&this._popoutWindow.innerHeight>0&&this._popoutWindow.outerWidth>0&&this._popoutWindow.outerHeight>0&&this._popoutWindow.innerWidth<=this._popoutWindow.outerWidth&&this._popoutWindow.innerHeight<=this._popoutWindow.outerHeight){const t=j(this._popoutWindow);this._popoutWindow.moveTo(this._initialWindowSize.left-t.width,this._initialWindowSize.top-t.height),this._popoutWindow.resizeTo(this._initialWindowSize.width+(this._popoutWindow.outerWidth-this._popoutWindow.innerWidth),this._initialWindowSize.height+(this._popoutWindow.outerHeight-this._popoutWindow.innerHeight))}this._popoutWindow.focus()}serializeWindowFeatures(t){const e=[];for(const i in t)e.push(i+"="+t[i].toString());return e.join(",")}createUrl(){const t="gl-window-config-"+K(),e=T.minifyConfig(this._config);try{localStorage.setItem(t,JSON.stringify(e))}catch(t){throw new Error("Error while writing to localStorage "+function(t){return t instanceof Error?t.message:"string"==typeof t?t:"Unknown Error"}(t))}const i=new URL("/gl-popout",location.origin);i.searchParams.set("gl-window",t);const n=this._layoutManager.container.dataset.theme;return void 0!==n&&i.searchParams.set("gl-theme",n),i.toString()}onInitialised(){this._isInitialised=!0,this.getGlInstance().on("popIn",(()=>this.popIn())),this.emit("initialised")}_onClose(){setTimeout((()=>this.emit("closed")),50)}}class ht extends rt{constructor(t,e,i){super(t,e,i,document.createElement("div")),this._parentItem=i,this._focused=!1,this.isComponent=!0,this._reorderEnabled=e.reorderEnabled,this.applyUpdatableConfig(e),this._initialWantMaximise=e.maximised;const n=document.createElement("div");n.classList.add("lm_content"),this.element.appendChild(n),this._container=new nt(e,this,t,n,(t=>this.handleUpdateItemConfigEvent(t)),(()=>this.show()),(()=>this.hide()),(t=>this.focus(t)),(t=>this.blur(t)))}get componentName(){return this._container.componentType}get componentType(){return this._container.componentType}get reorderEnabled(){return this._reorderEnabled}get initialWantMaximise(){return this._initialWantMaximise}get component(){return this._container.component}get container(){return this._container}get parentItem(){return this._parentItem}get headerConfig(){return this._headerConfig}get title(){return this._title}get tab(){return this._tab}get focused(){return this._focused}destroy(){this._container.destroy(),super.destroy()}applyUpdatableConfig(t){this.setTitle(t.title),this._headerConfig=t.header}toConfig(){const t=this._container.stateRequestEvent,e=void 0===t?this._container.state:t();return{type:y.component,content:[],size:this.size,sizeUnit:this.sizeUnit,minSize:this.minSize,minSizeUnit:this.minSizeUnit,id:this.id,maximised:!1,isClosable:this.isClosable,reorderEnabled:this._reorderEnabled,title:this._title,header:E.Header.createCopy(this._headerConfig),componentType:z.copyComponentType(this.componentType),componentState:e}}close(){if(null===this.parent)throw new c("CIC68883");this.parent.removeChild(this,!1)}enterDragMode(t,e){G(this.element,t),Z(this.element,e),this._container.enterDragMode(t,e)}exitDragMode(){this._container.exitDragMode()}enterStackMaximised(){this._container.enterStackMaximised()}exitStackMaximised(){this._container.exitStackMaximised()}drag(){this._container.drag()}getOuterBoundingClientRect(){var t;const e=this.element.getBoundingClientRect(),i=null===(t=this.headerConfig)||void 0===t?void 0:t.show,n=T.Dimensions.defaults.headerHeight,o="left"===i||"right"===i?n:0,s="top"===i||"bottom"===i||void 0===i?n:0;return DOMRect.fromRect({x:e.left-o,y:e.top-s,width:e.width+o,height:e.height+s})}updateSize(t){this.updateNodeSize(t)}init(){this.updateNodeSize(!1),super.init(),this._container.emit("open"),this.initContentItems()}setTitle(t){this._title=t,this.emit("titleChanged",t),this.emit("stateChanged")}setTab(t){this._tab=t,this.emit("tab",t),this._container.setTab(t)}hide(){super.hide(),this._container.setVisibility(!1)}show(){super.show(),this._container.setVisibility(!0)}focus(t=!1){this.parentItem.setActiveComponentItem(this,!0,t)}setFocused(t){this._focused=!0,this.tab.setFocused(),t||this.emitBaseBubblingEvent("focus")}blur(t=!1){this._focused&&this.layoutManager.setFocusedComponentItem(void 0,t)}setBlurred(t){this._focused=!1,this.tab.setBlurred(),t||this.emitBaseBubblingEvent("blur")}setParent(t){this._parentItem=t,super.setParent(t)}handleUpdateItemConfigEvent(t){this.applyUpdatableConfig(t)}updateNodeSize(t){if("none"!==this.element.style.display){const{width:e,height:i}=q(this.element);this._container.setSizeToNodeSize(e,i,t)}}}class dt extends rt{constructor(){super(...arguments),this._focused=!1}get focused(){return this._focused}setFocusedValue(t){this._focused=t}}class ct extends dt{constructor(t,e,i){super(t,P.create(e),null,ct.createElement(document)),this.isGround=!0,this._childElementContainer=this.element,this._containerElement=i;let n=null;for(;;){const t=n?n.previousSibling:this._containerElement.lastChild;if(!(t instanceof Element&&t.classList.contains("lm_content")))break;n=t}this._containerElement.insertBefore(this.element,n)}init(){if(!0!==this.isInitialised){this.updateNodeSize();for(let t=0;t0?this.contentItems[0]:this,n.isComponent)throw new Error("Cannot add item as child to ComponentItem");{const t=this.layoutManager.createAndInitContentItem(i,n);return e=n.addChild(t,e),n===this?-1:e}}loadComponentAsRoot(t){this.clearRoot();const e=D.resolve(t,!1);if(e.maximised)throw new Error("Root Component cannot be maximised");{const t=new ht(this.layoutManager,e,this);t.init(),this.addChild(t,0)}}addChild(t,e){if(this.contentItems.length>0)throw new Error("Ground node can only have a single child");return this._childElementContainer.appendChild(t.element),e=super.addChild(t,e),this.updateSize(!1),this.emitBaseBubblingEvent("stateChanged"),e}calculateConfigContent(){const t=this.contentItems,e=t.length,i=new Array(e);for(let n=0;n0&&(G(this.contentItems[0].element,t),Z(this.contentItems[0].element,e)),this.updateContentItemsSize(!1))}updateSize(t){this.layoutManager.beginVirtualSizedContainerAdding();try{this.updateNodeSize(),this.updateContentItemsSize(t)}finally{this.layoutManager.endVirtualSizedContainerAdding()}}createSideAreas(){const t=ct.Area.oppositeSides,e=new Array(Object.keys(t).length);let i=0;for(const n in t){const o=n,s=this.getElementArea();if(null===s)throw new c("RCSA77553");s.side=o,"2"===t[o][1]?s[o]=s[t[o]]-50:s[o]=s[t[o]]+50,s.surface=(s.x2-s.x1)*(s.y2-s.y1),e[i++]=s}return e}highlightDropZone(t,e,i){this.layoutManager.tabDropPlaceholder.remove(),super.highlightDropZone(t,e,i)}onDrop(t,e){if(t.isComponent){const e=x.createDefault(),i=t;e.header=E.Header.createCopy(i.headerConfig);const n=this.layoutManager.createAndInitContentItem(e,this);n.addChild(t),t=n}if(0===this.contentItems.length)this.addChild(t);else{if(t.type===y.row||t.type===y.column){const e=x.createDefault(),i=this.layoutManager.createContentItem(e,this);i.addChild(t),t=i}const i="x"==e.side[0]?y.row:y.column,n="2"==e.side[1],o=this.contentItems[0];if(o instanceof at&&o.type===i){const e=o.contentItems[n?0:o.contentItems.length-1];o.addChild(t,n?0:void 0,!0),e.size*=.5,t.size=e.size,t.sizeUnit=I.Percent,o.updateSize(!1)}else{const e=S.createDefault(i),s=this.layoutManager.createContentItem(e,this);this.replaceChild(o,s),s.addChild(t,n?0:void 0,!0),s.addChild(o,n?void 0:0,!0),o.size=50,t.size=50,t.sizeUnit=I.Percent,s.updateSize(!1)}}}dock(){throw new h("GID87731")}validateDocking(){throw new h("GIVD87732")}getAllContentItems(){const t=[this];return this.deepGetAllContentItems(this.contentItems,t),t}getAllComponentItems(){const t=[];return this.deepFilterContentItems(this.contentItems,t,(t=>t.isComponent)),t}getConfigMaximisedItems(){const t=[];return this.deepFilterContentItems(this.contentItems,t,(t=>!(!rt.isStack(t)||!t.initialWantMaximise)||!(!rt.isComponentItem(t)||!t.initialWantMaximise))),t}getItemsByPopInParentId(t){const e=[];return this.deepFilterContentItems(this.contentItems,e,(e=>e.popInParentIds.includes(t))),e}toConfig(){throw new Error("Cannot generate GroundItem config")}setActiveComponentItem(t,e,i){}updateNodeSize(){const{width:t,height:e}=q(this._containerElement);G(this.element,t),Z(this.element,e),this.contentItems.length>0&&(G(this.contentItems[0].element,t),Z(this.contentItems[0].element,e))}deepGetAllContentItems(t,e){for(let i=0;i=0&&this._proxyContainerElement.insertAdjacentElement("afterend",n)),this._element.style.left=F(t),this._element.style.top=F(e),s.setAttribute("title",this._componentItem.title),r.insertAdjacentText("afterbegin",this._componentItem.title),this._proxyContainerElement.appendChild(this._componentItem.element)}drag(t,e){const i=this.setDropPosition(t,e);return this._componentItem.drag(),i}setDropPosition(t,e){return this._element.style.left=F(t),this._element.style.top=F(e),this.layoutManager.getArea(t,e)}drop(){this._componentItem.exitDragMode();let t=null,e=null;const i=this._action.currentTarget;if((null==i?void 0:i.owner)===this._action&&(t=i.area),null!==t)e=this._componentItem,t.contentItem.onDrop(e,t),this.layoutManager.focusWindow();else if(null===i&&null===this._action.parent){const t=$(globalThis),e={left:t.left+this.element.offsetLeft,top:t.top+this.element.offsetTop,width:this._originalSize.width,height:this._originalSize.height};this.layoutManager.createPopoutFromContentItem(this._componentItem,e,K(),this._dockPoint),this._componentItem.destroy()}else this._componentItem.destroy();this.layoutManager.emit("itemDropped",this._componentItem),this._componentItemFocused&&(null==e||e.focus()),this._element.remove()}setDimensions(){const t=this.layoutManager.layoutConfig.dimensions;if(void 0===t)throw new Error("DragProxy.setDimensions: dimensions undefined");let e=t.dragProxyWidth,i=t.dragProxyHeight;if(void 0===e||void 0===i)throw new Error("DragProxy.setDimensions: width and/or height undefined");this._outerWidth=e,this._outerHeight=i;const n=!1===this.layoutManager.layoutConfig.header.show?0:t.headerHeight;this._element.style.width=F(e),this._element.style.height=F(i),e-=this._sided?n:0,i-=this._sided?0:n,this._proxyContainerElement.style.width=F(e),this._proxyContainerElement.style.height=F(i),this._componentItem.enterDragMode(e,i),this._componentItem.show()}}class mt{constructor(t,e,i,n){if(this._owner=t,this._area=e,this._pageX=i,this._pageY=n,t.layoutManager!==e.contentItem.layoutManager)throw Error("LayoutManager of Area and DragProxy must match")}get owner(){return this._owner}get area(){return this._area}drop(t){this._area.contentItem.onDrop(t,this._area)}highlightDropZone(){this.area.contentItem.highlightDropZone(this._pageX,this._pageY,this._area)}}class pt extends it{constructor(t,e=!1,i=null){super(),this._layoutManager=t,this._allowPopout=e,this._parent=i,this._dragProxy=null,this._currentTarget=null,this._dragListener=null,this._actions=[],this._dragEventHandler=(t,e,i)=>this.onDrag(i),this._dragStopEventHandler=()=>this.onDragStop(),this._boundingRect=this.computeBoundingRect(),this.parentOrSelf._actions.push(this)}get layoutManager(){return this._layoutManager}get parent(){return this._parent}get proxy(){return this._dragProxy}get parentOrSelf(){var t;return null!==(t=this._parent)&&void 0!==t?t:this}get currentTarget(){return this.parentOrSelf._currentTarget}set currentTarget(t){this.parentOrSelf._currentTarget=t}computeBoundingRect(){if(void 0===this._layoutManager.groundItem)throw new u("DACBR11120");{const t=this._layoutManager.groundItem.element.getBoundingClientRect();return DOMRect.fromRect({x:document.body.scrollLeft+t.left,y:document.body.scrollTop+t.top,width:t.width,height:t.height})}}screenToPage(t,e){const i=$(globalThis);return{x:document.body.scrollLeft+t-i.left,y:document.body.scrollTop+e-i.top}}isProxyVisible(t,e,i){return e>=this._boundingRect.left-t.outerWidth&&e=this._boundingRect.top-t.outerHeight&&ithis.onDragStart(t,e))),this._dragListener.on("dragStop",(()=>this.onDragStop()))}onDragStart(t,e){var i,n;const o="component";let s;if("function"==typeof this._componentTypeOrFtn){const t=this._componentTypeOrFtn();s=gt.isDragSourceComponentItemConfig(t)?{type:o,componentState:t.state,componentType:t.type,title:null!==(i=t.title)&&void 0!==i?i:this._title}:t}else s={type:o,componentState:this._componentState,componentType:this._componentTypeOrFtn,title:this._title,id:this._id};const r=W.resolve(s,!1),a=new ht(this._layoutManager,r,this._dummyGroundContentItem);if(this._dummyGroundContentItem.contentItems.push(a),null===this._dragListener)throw new c("DSODSD66746");{const i=pt.start(this._layoutManager,this._dragListener,a,t,e,!1),o=this._layoutManager.transitionIndicator;if(null===o)throw new c("DSODST66746");{const t=null===(n=i.proxy)||void 0===n?void 0:n.element;if(void 0===t)throw new u("DSODST66747");o.transitionElements(this._element,t)}}}onDragStop(){this.createDragListener()}removeDragListener(){null!==this._dragListener&&(this._dragListener.destroy(),this._dragListener=null)}}!function(t){t.isDragSourceComponentItemConfig=function(t){return!("componentType"in t)}}(gt||(gt={}));class _t{constructor(t,e,i,n){this._header=t,this._pushEvent=n,this._clickEventListener=t=>this.onClick(t),this._touchStartEventListener=t=>this.onTouchStart(t),this._element=document.createElement("div"),this._element.classList.add(i),this._element.title=e,this._header.on("destroy",(()=>this.destroy())),this._element.addEventListener("click",this._clickEventListener,{passive:!0}),this._element.addEventListener("touchstart",this._touchStartEventListener,{passive:!0}),this._header.controlsContainerElement.appendChild(this._element)}get element(){return this._element}destroy(){var t;this._element.removeEventListener("click",this._clickEventListener),this._element.removeEventListener("touchstart",this._touchStartEventListener),null===(t=this._element.parentNode)||void 0===t||t.removeChild(this._element)}onClick(t){this._pushEvent(t)}onTouchStart(t){this._pushEvent(t)}}class ft{constructor(t,e,i,n,o){var s;this._layoutManager=t,this._componentItem=e,this._closeEvent=i,this._focusEvent=n,this._dragStartEvent=o,this._isActive=!1,this._tabClickListener=t=>this.onTabClickDown(t),this._tabTouchStartListener=t=>this.onTabTouchStart(t),this._closeClickListener=()=>this.onCloseClick(),this._closeTouchStartListener=()=>this.onCloseTouchStart(),this._dragStartListener=(t,e)=>this.onDragStart(t,e),this._contentItemDestroyListener=()=>this.onContentItemDestroy(),this._tabTitleChangedListener=t=>this.setTitle(t),this._element=document.createElement("div"),this._element.classList.add("lm_tab"),this._titleElement=document.createElement("span"),this._titleElement.classList.add("lm_title"),this._closeElement=document.createElement("div"),this._closeElement.classList.add("lm_close_tab"),this._element.appendChild(this._titleElement),this._element.appendChild(this._closeElement),e.isClosable?(this._closeElement.style.display="",this.element.classList.add("lm_closable")):this._closeElement.style.display="none",this.setTitle(e.title),this._componentItem.on("titleChanged",this._tabTitleChangedListener),(null!==(s=e.reorderEnabled)&&void 0!==s?s:this._layoutManager.layoutConfig.settings.reorderEnabled)&&this.enableReorder(),this._element.addEventListener("click",this._tabClickListener,{passive:!0}),this._element.addEventListener("touchstart",this._tabTouchStartListener,{passive:!0}),this._componentItem.isClosable?(this._closeElement.addEventListener("click",this._closeClickListener,{passive:!0}),this._closeElement.addEventListener("touchstart",this._closeTouchStartListener,{passive:!0})):(this._closeElement.remove(),this._closeElement=void 0),this._componentItem.setTab(this),this._layoutManager.emit("tabCreated",this)}get isActive(){return this._isActive}get componentItem(){return this._componentItem}get contentItem(){return this._componentItem}get element(){return this._element}get titleElement(){return this._titleElement}get closeElement(){return this._closeElement}get reorderEnabled(){return void 0!==this._dragListener}set reorderEnabled(t){t!==this.reorderEnabled&&(t?this.enableReorder():this.disableReorder())}setTitle(t){this._titleElement.innerText=t,this._element.title=t}setActive(t){t!==this._isActive&&(this._isActive=t,t?this._element.classList.add("lm_active"):this._element.classList.remove("lm_active"))}destroy(){var t,e;this._closeEvent=void 0,this._focusEvent=void 0,this._dragStartEvent=void 0,this._element.removeEventListener("click",this._tabClickListener),this._element.removeEventListener("touchstart",this._tabTouchStartListener),null===(t=this._closeElement)||void 0===t||t.removeEventListener("click",this._closeClickListener),null===(e=this._closeElement)||void 0===e||e.removeEventListener("touchstart",this._closeTouchStartListener),this._componentItem.off("titleChanged",this._tabTitleChangedListener),this.reorderEnabled&&this.disableReorder(),this._element.remove()}setBlurred(){this._element.classList.remove("lm_focused"),this._titleElement.classList.remove("lm_focused")}setFocused(){this._element.classList.add("lm_focused"),this._titleElement.classList.add("lm_focused")}onDragStart(t,e){if(void 0===this._dragListener)throw new u("TODSDLU10093");if(void 0===this._dragStartEvent)throw new u("TODS23309");this._dragStartEvent(t,e,this._dragListener,this.componentItem)}onContentItemDestroy(){void 0!==this._dragListener&&(this._dragListener.destroy(),this._dragListener=void 0)}onTabClickDown(t){const e=t.target;e!==this._element&&e!==this._titleElement||(0===t.button?this.notifyFocus():1===t.button&&this._componentItem.isClosable&&this.notifyClose())}onTabTouchStart(t){t.target===this._element&&this.notifyFocus()}onCloseClick(){this.notifyClose()}onCloseTouchStart(){this.notifyClose()}notifyClose(){if(void 0===this._closeEvent)throw new u("TNC15007");this._closeEvent(this._componentItem)}notifyFocus(){if(void 0===this._focusEvent)throw new u("TNA15007");this._focusEvent(this._componentItem)}enableReorder(){this._dragListener=new ot(this._element,[this._titleElement]),this._dragListener.on("dragStart",this._dragStartListener),this._componentItem.on("destroy",this._contentItemDestroyListener)}disableReorder(){if(void 0===this._dragListener)throw new u("TDR87745");this._componentItem.off("destroy",this._contentItemDestroyListener),this._dragListener.off("dragStart",this._dragStartListener),this._dragListener=void 0}}class vt{constructor(t,e,i,n,o){this._layoutManager=t,this._componentRemoveEvent=e,this._componentFocusEvent=i,this._componentDragStartEvent=n,this._dropdownActiveChangedEvent=o,this._tabs=[],this._lastVisibleTabIndex=-1,this._dropdownActive=!1,this._element=document.createElement("section"),this._element.classList.add("lm_tabs"),this._dropdownElement=document.createElement("section"),this._dropdownElement.classList.add("lm_tabdropdown_list"),this._dropdownElement.style.display="none"}get tabs(){return this._tabs}get tabCount(){return this._tabs.length}get lastVisibleTabIndex(){return this._lastVisibleTabIndex}get element(){return this._element}get dropdownElement(){return this._dropdownElement}get dropdownActive(){return this._dropdownActive}destroy(){for(let t=0;tthis.handleTabCloseEvent(t)),(t=>this.handleTabFocusEvent(t)),((t,e,i,n)=>this.handleTabDragStartEvent(t,e,i,n)));void 0===e&&(e=this._tabs.length),this._tabs.splice(e,0,i),ethis._lastVisibleTabIndex){const t=this._tabs[e];for(let t=e;t>0;t--)this._tabs[t]=this._tabs[t-1];this._tabs[0]=t}}updateTabSizes(t,e){let i=!1;this.tryUpdateTabSizes(i,t,e)||(i=!0,this.tryUpdateTabSizes(i,t,e)),i!==this._dropdownActive&&(this._dropdownActive=i,this._dropdownActiveChangedEvent())}tryUpdateTabSizes(t,e,i){if(this._tabs.length>0){if(void 0===i)throw new Error("non-empty tabs must have active component item");let n=0,o=!1;const s=this._layoutManager.layoutConfig.settings.tabOverlapAllowance,r=this._tabs.indexOf(i.tab),a=this._tabs[r];this._lastVisibleTabIndex=-1;for(let i=0;ie){if(o)i===r&&(l.style.zIndex="auto",l.style.marginLeft="",l.parentElement!==this._element&&this._element.appendChild(l));else{let t;if(t=r>0&&r<=i?(d-e)/(i-1):(d-e)/i,tthis.onClick(t),this._touchStartListener=t=>this.onTouchStart(t),this._layoutStateListener=()=>this.onLayoutChanged(),this._tabsContainer=new vt(this._layoutManager,(t=>this.handleTabInitiatedComponentRemoveEvent(t)),(t=>this.handleTabInitiatedComponentFocusEvent(t)),((t,e,i,n)=>this.handleTabInitiatedDragStartEvent(t,e,i,n)),(()=>this.processTabDropdownActiveChanged())),this._show=i.show,this._popoutLabel=i.popoutLabel,this._maximiseLabel=i.maximiseLabel,this._minimiseLabel=i.minimiseLabel,this._closeLabel=i.closeLabel,this._tabDropdownEnabled=i.tabDropdownEnabled,this._tabDropdownLabel=i.tabDropdownLabel,this.setSide(i.side),this._element=document.createElement("section"),this._element.classList.add("lm_header"),this._controlsContainerElement=document.createElement("section"),this._controlsContainerElement.classList.add("lm_controls"),this._element.appendChild(this._tabsContainer.element),this._element.appendChild(this._controlsContainerElement),this._element.appendChild(this._tabsContainer.dropdownElement),this._element.addEventListener("click",this._clickListener,{passive:!0}),this._element.addEventListener("touchstart",this._touchStartListener,{passive:!0}),this._documentMouseUpListener=()=>this._tabsContainer.hideAdditionalTabsDropdown(),globalThis.document.addEventListener("mouseup",this._documentMouseUpListener,{passive:!0}),this._tabControlOffset=this._layoutManager.layoutConfig.settings.tabControlOffset,this._tabDropdownEnabled&&(this._tabDropdownButton=new _t(this,this._tabDropdownLabel,"lm_tabdropdown",(()=>this._tabsContainer.showAdditionalTabsDropdown()))),this._popoutButton=new _t(this,this._popoutLabel,"lm_popout",(()=>this.handleButtonPopoutEvent())),this._maximiseButton=new _t(this,this._maximiseLabel,"lm_maximise",(t=>this.handleButtonMaximiseToggleEvent(t))),this._closeButton=new _t(this,this._closeLabel,"lm_close",(()=>o())),this.processTabDropdownActiveChanged(),this.layoutManager.addEventListener("stateChanged",this._layoutStateListener)}get show(){return this._show}get side(){return this._side}get leftRightSided(){return this._leftRightSided}get layoutManager(){return this._layoutManager}get parent(){return this._parent}get tabs(){return this._tabsContainer.tabs}get lastVisibleTabIndex(){return this._tabsContainer.lastVisibleTabIndex}get element(){return this._element}get tabsContainerElement(){return this._tabsContainer.element}get controlsContainerElement(){return this._controlsContainerElement}destroy(){this.emit("destroy"),this._popoutEvent=void 0,this._maximiseToggleEvent=void 0,this._clickEvent=void 0,this._touchStartEvent=void 0,this._componentRemoveEvent=void 0,this._componentFocusEvent=void 0,this._componentDragStartEvent=void 0,this._tabsContainer.destroy(),globalThis.document.removeEventListener("mouseup",this._documentMouseUpListener),this.layoutManager.removeEventListener("stateChanged",this._layoutStateListener),this._element.remove()}createTab(t,e){this._tabsContainer.createTab(t,e)}removeTab(t){this._tabsContainer.removeTab(t)}processActiveComponentChanged(t){this._tabsContainer.processActiveComponentChanged(t),this.updateTabSizes()}setSide(t){this._side=t,this._leftRightSided=[_.right,_.left].includes(this._side)}updateButtons(){var t,e,i;const n=this._getActiveComponentItemEvent(),o=null===this._parent.findAncestorWithSiblings(),s=this.tabs.every((t=>t.componentItem.isClosable)),r=!1!==(null===(t=null==n?void 0:n.headerConfig)||void 0===t?void 0:t.close);X(this._closeButton.element,s&&r);let a=!1!==(null===(e=null==n?void 0:n.headerConfig)||void 0===e?void 0:e.popout);if(this._layoutManager.layoutConfig.settings.popoutWholeStack)a&&(a=!o&&s);else{const t=!1!==(null==n?void 0:n.isClosable);a&&(a=!(o&&1===this.tabs.length)&&t)}X(this._popoutButton.element,a);const l=(!1!==(null===(i=null==n?void 0:n.headerConfig)||void 0===i?void 0:i.maximise)||this._parent.isMaximised)&&!o;X(this._maximiseButton.element,l)}applyFocusedValue(t){t?this._element.classList.add("lm_focused"):this._element.classList.remove("lm_focused")}processMaximised(){if(void 0===this._maximiseButton)throw new u("HPMAX16997");this._maximiseButton.element.setAttribute("title",this._minimiseLabel)}processMinimised(){if(void 0===this._maximiseButton)throw new u("HPMIN16997");this._maximiseButton.element.setAttribute("title",this._maximiseLabel)}updateTabSizes(){if(this._tabsContainer.tabCount>0){const t=this._show?this._layoutManager.layoutConfig.dimensions.headerHeight:0;let e;this._leftRightSided?(this._element.style.height="",this._element.style.width=F(t)):(this._element.style.width="",this._element.style.height=F(t)),e=this._leftRightSided?this._element.offsetHeight-this._controlsContainerElement.offsetHeight-this._tabControlOffset:this._element.offsetWidth-this._controlsContainerElement.offsetWidth-this._tabControlOffset,this._tabsContainer.updateTabSizes(e,this._getActiveComponentItemEvent())}}handleTabInitiatedComponentRemoveEvent(t){if(void 0===this._componentRemoveEvent)throw new u("HHTCE22294");this._componentRemoveEvent(t)}handleTabInitiatedComponentFocusEvent(t){if(void 0===this._componentFocusEvent)throw new u("HHTAE22294");this._componentFocusEvent(t)}handleTabInitiatedDragStartEvent(t,e,i,n){if(void 0===this._componentDragStartEvent)throw new u("HHTDSE22294");this._componentDragStartEvent(t,e,i,n)}processTabDropdownActiveChanged(){void 0!==this._tabDropdownButton&&X(this._tabDropdownButton.element,this._tabsContainer.dropdownActive)}handleButtonPopoutEvent(){if(this._layoutManager.layoutConfig.settings.popoutWholeStack){if(void 0===this._popoutEvent)throw new u("HHBPOE17834");this._popoutEvent()}else{const t=this._getActiveComponentItemEvent();t&&t.popout()}}handleButtonMaximiseToggleEvent(t){if(void 0===this._maximiseToggleEvent)throw new u("HHBMTE16834");this._maximiseToggleEvent()}onClick(t){t.target===this._element&&this.notifyClick(t)}onTouchStart(t){t.target===this._element&&this.notifyTouchStart(t)}onLayoutChanged(){this.updateButtons()}notifyClick(t){if(void 0===this._clickEvent)throw new u("HNHC46834");this._clickEvent(t)}notifyTouchStart(t){if(void 0===this._touchStartEvent)throw new u("HNHTS46834");this._touchStartEvent(t)}}class yt{constructor(){this._element=document.createElement("div"),this._element.classList.add("lm_dropTargetIndicator");const t=document.createElement("div");t.classList.add("lm_inner"),this._element.appendChild(t),document.body.appendChild(this._element)}destroy(){this._element.remove()}highlightArea(t,e){this._element.style.left=F(t.x1+e),this._element.style.top=F(t.y1+e),this._element.style.width=F(t.x2-t.x1-e-1),this._element.style.height=F(t.y2-t.y1-e-1),this._element.style.visibility="visible"}hide(){this._element.style.visibility="hidden"}}class wt{constructor(){this._element=document.createElement("div"),this._element.classList.add("lm_transition_indicator"),document.body.appendChild(this._element),this._toElement=null,this._fromDimensions=null,this._totalAnimationDuration=200,this._animationStartTime=null}destroy(){this._element.remove()}transitionElements(t,e){}nextAnimationFrame(){}measure(t){const e=t.getBoundingClientRect();return{left:e.left,top:e.top,width:t.offsetWidth,height:t.offsetHeight}}}class It extends dt{constructor(t,e,i){var n,o,s,r,a,l,h,d,c,u,m,p,g,f,v,C,y,w,I;super(t,e,i,It.createElement(document)),this._headerSideChanged=!1,this._resizeListener=()=>this.handleResize(),this._maximisedListener=()=>this.handleMaximised(),this._minimisedListener=()=>this.handleMinimised(),this._headerConfig=e.header;const b=t.layoutConfig.header,S=e.content;let E;E=1!==S.length?void 0:S[0].header,this._initialWantMaximise=e.maximised,this._initialActiveItemIndex=null!==(n=e.activeItemIndex)&&void 0!==n?n:0;const x=null!==(r=null!==(s=null===(o=this._headerConfig)||void 0===o?void 0:o.show)&&void 0!==s?s:null==E?void 0:E.show)&&void 0!==r?r:b.show,z=null!==(h=null!==(l=null===(a=this._headerConfig)||void 0===a?void 0:a.popout)&&void 0!==l?l:null==E?void 0:E.popout)&&void 0!==h?h:b.popout,M=null!==(u=null!==(c=null===(d=this._headerConfig)||void 0===d?void 0:d.maximise)&&void 0!==c?c:null==E?void 0:E.maximise)&&void 0!==u?u:b.maximise,L=null!==(g=null!==(p=null===(m=this._headerConfig)||void 0===m?void 0:m.close)&&void 0!==p?p:null==E?void 0:E.close)&&void 0!==g?g:b.close,P=null!==(C=null!==(v=null===(f=this._headerConfig)||void 0===f?void 0:f.minimise)&&void 0!==v?v:null==E?void 0:E.minimise)&&void 0!==C?C:b.minimise,T=null!==(I=null!==(w=null===(y=this._headerConfig)||void 0===y?void 0:y.tabDropdown)&&void 0!==w?w:null==E?void 0:E.tabDropdown)&&void 0!==I?I:b.tabDropdown;this._maximisedEnabled=!1!==M;const A={show:!1!==x,side:!1===x?_.top:x,popoutEnabled:!1!==z,popoutLabel:!1===z?"":z,maximiseEnabled:this._maximisedEnabled,maximiseLabel:!1===M?"":M,closeEnabled:!1!==L,closeLabel:!1===L?"":L,minimiseEnabled:!0,minimiseLabel:P,tabDropdownEnabled:!1!==T,tabDropdownLabel:!1===T?"":T};this._header=new Ct(t,this,A,(()=>this.getActiveComponentItem()),(()=>this.remove()),(()=>this.handlePopoutEvent()),(()=>this.toggleMaximise()),(t=>this.handleHeaderClickEvent(t)),(t=>this.handleHeaderTouchStartEvent(t)),(t=>this.handleHeaderComponentRemoveEvent(t)),(t=>this.handleHeaderComponentFocusEvent(t)),((t,e,i,n)=>this.handleHeaderComponentStartDragEvent(t,e,i,n))),this.isStack=!0,this._childElementContainer=document.createElement("section"),this._childElementContainer.classList.add("lm_items"),this.on("resize",this._resizeListener),this._maximisedEnabled&&(this.on("maximised",this._maximisedListener),this.on("minimised",this._minimisedListener)),this.element.appendChild(this._header.element),this.element.appendChild(this._childElementContainer),this.setupHeaderPosition()}get childElementContainer(){return this._childElementContainer}get header(){return this._header}get headerShow(){return this._header.show}get headerSide(){return this._header.side}get headerLeftRightSided(){return this._header.leftRightSided}get contentAreaDimensions(){return this._contentAreaDimensions}get initialWantMaximise(){return this._initialWantMaximise}get isMaximised(){return this===this.layoutManager.maximisedStack}get stackParent(){if(!this.parent)throw new Error("Stack should always have a parent");return this.parent}updateSize(t){this.layoutManager.beginVirtualSizedContainerAdding();try{this.updateNodeSize(),this.updateContentItemsSize(t)}finally{this.layoutManager.endVirtualSizedContainerAdding()}}init(){if(!0===this.isInitialised)return;this.updateNodeSize();for(let t=0;t0){if(this._initialActiveItemIndex<0||this._initialActiveItemIndex>=e)throw new Error(`ActiveItemIndex out of range: ${this._initialActiveItemIndex} id: ${this.id}`);for(let i=0;ithis.contentItems.length)throw e-=1,new h("SAC99728");if(t instanceof ht)return e=super.addChild(t,e),this._childElementContainer.appendChild(t.element),this._header.createTab(t,e),this.setActiveComponentItem(t,i),this._header.updateTabSizes(),this.updateSize(!1),t.container.setBaseLogicalZIndex(),this.emitStateChangedEvent(),e;throw new h("SACC88532")}removeChild(t,e){const i=t,n=this.contentItems.indexOf(i),o=1===this.contentItems.length;if(this._activeComponentItem===i&&(i.focused&&i.blur(),!o)){const t=0===n?1:n-1;this.setActiveComponentItem(this.contentItems[t],!1)}this._header.removeTab(i),super.removeChild(i,e),this.emitStateChangedEvent()}toggleMaximise(){this.isMaximised?this.minimise():this.maximise()}maximise(){if(!this.isMaximised){this.layoutManager.setMaximisedStack(this);const t=this.contentItems,e=t.length;for(let i=0;i0&&void 0===t)throw new Error("expected non-empty stack to have an active component item");return{type:"stack",content:this.calculateConfigContent(),size:this.size,sizeUnit:this.sizeUnit,minSize:this.minSize,minSizeUnit:this.minSizeUnit,id:this.id,isClosable:this.isClosable,maximised:this.isMaximised,header:this.createHeaderConfig(),activeItemIndex:t}}onDrop(t,e){if("header"===this._dropSegment){if(this.resetHeaderDropZone(),void 0===this._dropIndex)throw new u("SODDI68990");return void this.addChild(t,this._dropIndex)}if("body"===this._dropSegment)return void this.addChild(t,0,!0);const i="top"===this._dropSegment||"bottom"===this._dropSegment,n="left"===this._dropSegment||"right"===this._dropSegment,o="top"===this._dropSegment||"left"===this._dropSegment,s=i&&this.stackParent.isColumn||n&&this.stackParent.isRow;if(t.isComponent){const e=x.createDefault();e.header=t.headerConfig;const i=this.layoutManager.createAndInitContentItem(e,this);i.addChild(t),t=i}if(t.type===y.row||t.type===y.column){const e=x.createDefault();e.header=this.createHeaderConfig();const i=this.layoutManager.createContentItem(e,this);i.addChild(t),t=i}if(s){const e=this.stackParent.contentItems.indexOf(this);this.stackParent.addChild(t,o?e:e+1,!0),this.size*=.5,t.size=this.size,t.sizeUnit=this.sizeUnit,this.stackParent.updateSize(!1)}else{const e=i?y.column:y.row,n=S.createDefault(e),s=this.layoutManager.createContentItem(n,this);this.stackParent.replaceChild(this,s),s.addChild(t,o?0:void 0,!0),s.addChild(this,o?void 0:0,!0),this.size=50,t.size=50,t.sizeUnit=I.Percent,s.updateSize(!1)}}highlightDropZone(t,e){for(const i in this._contentAreaDimensions){const n=i,o=this._contentAreaDimensions[n].hoverArea;if(o.x1t&&o.y1e)return void("header"===n?(this._dropSegment="header",this.highlightHeaderDropZone(this._header.leftRightSided?e:t)):(this.resetHeaderDropZone(),this.highlightBodyDropZone(n)))}}getArea(){if("none"===this.element.style.display)return null;const t=super.getElementArea(this._header.element),e=super.getElementArea(this._childElementContainer);if(null===t||null===e)throw new c("SGAHC13086");const i=e.x2-e.x1,n=e.y2-e.y1;return this._contentAreaDimensions={header:{hoverArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2},highlightArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2}}},0===this.contentItems.length?(this._contentAreaDimensions.body={hoverArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2}},super.getElementArea(this.element)):(this._contentAreaDimensions.left={hoverArea:{x1:e.x1,y1:e.y1,x2:e.x1+.25*i,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x1+.5*i,y2:e.y2}},this._contentAreaDimensions.top={hoverArea:{x1:e.x1+.25*i,y1:e.y1,x2:e.x1+.75*i,y2:e.y1+.5*n},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y1+.5*n}},this._contentAreaDimensions.right={hoverArea:{x1:e.x1+.75*i,y1:e.y1,x2:e.x2,y2:e.y2},highlightArea:{x1:e.x1+.5*i,y1:e.y1,x2:e.x2,y2:e.y2}},this._contentAreaDimensions.bottom={hoverArea:{x1:e.x1+.25*i,y1:e.y1+.5*n,x2:e.x1+.75*i,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1+.5*n,x2:e.x2,y2:e.y2}},super.getElementArea(this.element))}positionHeader(t){this._header.side!==t&&(this._header.setSide(t),this._headerSideChanged=!0,this.setupHeaderPosition())}updateNodeSize(){if("none"!==this.element.style.display){const t=q(this.element);this._header.show&&(t[this._header.leftRightSided?g.width:g.height]-=this.layoutManager.layoutConfig.dimensions.headerHeight),this._childElementContainer.style.width=F(t.width),this._childElementContainer.style.height=F(t.height);for(let e=0;e=o&&tthis.onEventFromChild(t),globalThis.addEventListener(bt.ChildEventName,this._childEventListener,{passive:!0})}emit(t,...e){"userBroadcast"===t?this.emitUserBroadcast(...e):super.emit(t,...e)}emitUserBroadcast(...t){this.handleUserBroadcastEvent("userBroadcast",t)}destroy(){globalThis.removeEventListener(bt.ChildEventName,this._childEventListener)}handleUserBroadcastEvent(t,e){this._layoutManager.isSubWindow?this.propagateToParent(t,e):this.propagateToThisAndSubtree(t,e)}onEventFromChild(t){const e=t.detail;this.handleUserBroadcastEvent(e.eventName,e.args)}propagateToParent(t,e){const i={bubbles:!0,cancelable:!0,detail:{layoutManager:this._layoutManager,eventName:t,args:e}},n=new CustomEvent(bt.ChildEventName,i),o=globalThis.opener;if(null===o)throw new c("EHPTP15778");o.dispatchEvent(n)}propagateToThisAndSubtree(t,e){this.emitUnknown(t,...e);for(let i=0;ithis.handleContainerResize())),this._windowBeforeUnloadListener=()=>this.onBeforeUnload(),this._windowBeforeUnloadListening=!1,this._maximisedStackBeforeDestroyedListener=t=>this.cleanupBeforeMaximisedStackDestroyed(t),this.moveWindowTop=()=>{},this.focusWindow=()=>globalThis.focus(),this.isSubWindow=e.isSubWindow,this._constructorOrSubWindowLayoutConfig=e.constructorOrSubWindowLayoutConfig,t.checkInitialise(),b.checkInitialise(),void 0!==e.containerElement&&(this._containerElement=e.containerElement)}get container(){return this._containerElement}get isInitialised(){return this._isInitialised}get isDragging(){return document.body.classList.contains("lm_dragging")}get groundItem(){return this._groundItem}get root(){return this._groundItem}get openPopouts(){return this._openPopouts}get dropTargetIndicator(){return this._dropTargetIndicator}get transitionIndicator(){return this._transitionIndicator}get width(){return this._width}get height(){return this._height}get eventHub(){return this._eventHub}get rootItem(){if(void 0===this._groundItem)throw new Error("Cannot access rootItem before init");return 0===this._groundItem.contentItems.length?void 0:this._groundItem.contentItems[0]}get focusedComponentItem(){return this._focusedComponentItem}get tabDropPlaceholder(){return this._tabDropPlaceholder}get maximisedStack(){return this._maximisedStack}get deprecatedConstructor(){return!this.isSubWindow&&void 0!==this._constructorOrSubWindowLayoutConfig}get parent(){return this._parent}set parent(t){this._parent=t}get instances(){var t;const e=[],i=null!==(t=this.parent)&&void 0!==t?t:this;e.push(i);for(let t of i.openPopouts){const i=t.getGlInstance();e.push(i)}return e}destroy(){if(this._isInitialised){this._windowBeforeUnloadListening&&(globalThis.removeEventListener("beforeunload",this._windowBeforeUnloadListener),this._windowBeforeUnloadListening=!1),!0===this.layoutConfig.settings.closePopoutsOnUnload&&this.closeAllOpenPopouts(),this._resizeObserver.disconnect(),this.checkClearResizeTimeout(),void 0!==this._groundItem&&this._groundItem.destroy(),this._tabDropPlaceholder.remove(),null!==this._dropTargetIndicator&&this._dropTargetIndicator.destroy(),null!==this._transitionIndicator&&this._transitionIndicator.destroy(),this._eventHub.destroy();for(const t of this._dragSources)t.destroy();this._dragSources=[],this._isInitialised=!1}}minifyConfig(t){return T.minifyConfig(t)}unminifyConfig(t){return T.unminifyConfig(t)}init(){var t;this.setContainer(),this._dropTargetIndicator=new yt,this._transitionIndicator=new wt,this.updateSizeFromContainer(),this.layoutConfig=T.createDefault(),this._groundItem=new ct(this,this.layoutConfig.root,this._containerElement),this._groundItem.init(),this.checkLoadedLayoutMaximiseItem(),this._resizeObserver.observe(this._containerElement),this._isInitialised=!0,this.adjustColumnsResponsive(),this.emit("initialised");let e=this._constructorOrSubWindowLayoutConfig;this.isSubWindow&&void 0!==e&&((null===(t=e.root)||void 0===t?void 0:t.type)==y.component&&(e.root={type:y.stack,content:[e.root]}),this.loadLayout(e))}loadLayout(t){if(!this.isInitialised)throw new Error("GoldenLayout: Need to call init() if LayoutConfig with defined root passed to constructor");if(void 0===this._groundItem)throw new u("LMLL11119");this.layoutConfig=B.resolve(t),this.createSubWindows(),this._groundItem.loadRoot(this.layoutConfig.root),this.checkLoadedLayoutMaximiseItem(),this.adjustColumnsResponsive()}saveLayout(){if(!1===this._isInitialised)throw new Error("Can't create config, layout not yet initialised");if(void 0===this._groundItem)throw new u("LMTC18244");{const t=this._groundItem.calculateConfigContent();let e;e=1!==t.length?void 0:t[0],this.reconcilePopoutWindows();const i=[];for(let t=0;t=0?n=this._groundItem.contentItems[0]:e=0;break;case y.row:case y.column:e=n.addItem(t,i.index);break;case y.stack:if(D.isComponent(t)){e=n.addItem(t,i.index);break}throw Error(m[6]);case y.component:throw new h("LMAIALC87444602");default:throw new d("LMAIALU98881733",n.type)}if(D.isComponent(t)){const t=n.contentItems[e];rt.isStack(t)&&(n=t,e=0)}return i.parentItem=n,i.index=e,i}}}loadComponentAsRoot(t){if(void 0===this._groundItem)throw new Error("Cannot add item before init");this._groundItem.loadComponentAsRoot(t)}updateSize(t,e){this.setSize(t,e)}setSize(t,e){if(this._width=t,this._height=e,!0===this._isInitialised){if(void 0===this._groundItem)throw new u("LMUS18881");if(this._groundItem.setSize(this._width,this._height),this._maximisedStack){const{width:t,height:e}=q(this._containerElement);G(this._maximisedStack.element,t),Z(this._maximisedStack.element,e),this._maximisedStack.updateSize(!1)}this.adjustColumnsResponsive()}}beginSizeInvalidation(){this._sizeInvalidationBeginCount++}endSizeInvalidation(){0==--this._sizeInvalidationBeginCount&&this.updateSizeFromContainer()}updateSizeFromContainer(){const{width:t,height:e}=q(this._containerElement);this.setSize(t,e)}updateRootSize(t=!1){if(void 0===this._groundItem)throw new u("LMURS28881");this._groundItem.updateSize(t)}createAndInitContentItem(t,e){const i=this.createContentItem(t,e);return i.init(),i}createContentItem(t,e){if("string"!=typeof t.type)throw new o("Missing parameter 'type'",JSON.stringify(t));return!S.isComponentItem(t)||e instanceof It||!e||!0===this.isSubWindow&&e instanceof ct||(t={type:y.stack,content:[t],size:t.size,sizeUnit:t.sizeUnit,minSize:t.minSize,minSizeUnit:t.minSizeUnit,id:t.id,maximised:t.maximised,isClosable:t.isClosable,activeItemIndex:0,header:void 0}),this.createContentItemFromConfig(t,e)}findFirstComponentItemById(t){if(void 0===this._groundItem)throw new u("LMFFCIBI82446");return this.findFirstContentItemTypeByIdRecursive(y.component,t,this._groundItem)}createPopoutFromContentItem(t,e,i,n){var o;const s=null!=n?n:t.findDockPoint();if(null===s)throw new c("LMCPFCI00834");{if(null!==i&&s.parent.addPopInParentId(i),void 0===e){const i=$(globalThis),n=t instanceof ht?t.getOuterBoundingClientRect():t.element.getBoundingClientRect();e={left:i.left+n.left,top:i.top+n.top,width:n.width,height:n.height}}const n=t.toConfig();if((null===(o=t.parent)||void 0===o?void 0:o.contentItems.includes(t))&&t.remove(),L.isRootItemConfig(n))return this.createPopoutFromItemConfig(n,e,i,s.index);throw new Error(`${m[0]}`)}}beginVirtualSizedContainerAdding(){0==++this._virtualSizedContainerAddingBeginCount&&(this._virtualSizedContainers.length=0)}addVirtualSizedContainer(t){this._virtualSizedContainers.push(t)}endVirtualSizedContainerAdding(){if(0==--this._virtualSizedContainerAddingBeginCount){const t=this._virtualSizedContainers.length;if(t>0){this.fireBeforeVirtualRectingEvent(t);for(let e=0;e{const t=a.getGlInstance(),e=function(){var e,i;t.isDragging||0!==(null===(i=null===(e=t.groundItem)||void 0===e?void 0:e.getAllComponentItems())||void 0===i?void 0:i.length)||a.close()};t.on("itemDropped",e),t.on("itemDestroyed",e),this.emit("windowOpened",a)})),a.on("closed",(()=>this.reconcilePopoutWindows())),this._openPopouts.push(a),this.layoutConfig.settings.closePopoutsOnUnload&&!this._windowBeforeUnloadListening&&(globalThis.addEventListener("beforeunload",this._windowBeforeUnloadListener,{passive:!0}),this._windowBeforeUnloadListening=!0),a}closeAllOpenPopouts(t=!1){for(let e=0;e0;if(s&&!r&&!a)return void i.cancelDrag();const l=pt.start(this,i,n,t,e,r);if(a)for(let t of this.instances)t!==this&&t.startExternalComponentDrag(l)}hideDropTargetIndicator(){var t;this.tabDropPlaceholder.remove(),null===(t=this.dropTargetIndicator)||void 0===t||t.hide()}focusComponent(t,e=!1){t.focus(e)}clearComponentFocus(t=!1){this.setFocusedComponentItem(void 0,t)}setFocusedComponentItem(t,e=!1){if(t!==this._focusedComponentItem){let i;if(void 0===t||(i=t.parentItem),void 0!==this._focusedComponentItem){const t=this._focusedComponentItem;this._focusedComponentItem=void 0,t.setBlurred(e);const n=t.parentItem;i===n?i=void 0:n.setFocusedValue(!1)}void 0!==t&&(this._focusedComponentItem=t,t.setFocused(e),void 0!==i&&i.setFocusedValue(!0))}}createContentItemFromConfig(t,e){switch(t.type){case y.ground:throw new h("LMCCIFC68871");case y.row:return new at(!1,this,t,e);case y.column:return new at(!0,this,t,e);case y.stack:return new It(this,t,e);case y.component:return new ht(this,t,e);default:throw new d("CCC913564",t.type,"Invalid Config Item type specified")}}setMaximisedStack(t){void 0===t?void 0!==this._maximisedStack&&this.processMinimiseMaximisedStack():t!==this._maximisedStack&&(void 0!==this._maximisedStack&&this.processMinimiseMaximisedStack(),this.processMaximiseStack(t))}checkMinimiseMaximisedStack(){void 0!==this._maximisedStack&&this._maximisedStack.minimise()}cleanupBeforeMaximisedStackDestroyed(t){null!==this._maximisedStack&&this._maximisedStack===t.target&&(this._maximisedStack.off("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),this._maximisedStack=void 0)}closeWindow(){globalThis.setTimeout((()=>globalThis.close()),1)}getArea(t,e){if(void 0===this._groundItem)throw new u("LMGA44365");const i=this._groundItem.getElementArea();let n=null,o=1/0;for(let i=0;i=s.x1&&t=s.y1&&es.surface&&(o=s.surface,n=s)}return(null!==n||t=i.x2||e=i.y2)&&(this._lastArea=n),this._lastArea}calculateItemAreas(){const t=this.getAllContentItems(),e=this._groundItem;if(void 0===e)throw new u("LMCIAR44365");if(1!==t.length){e.contentItems[0].isStack?this._itemAreas=[]:this._itemAreas=e.createSideAreas();for(let e=0;e0){let e=t[0];if(rt.isComponentItem(e)){const t=e.parent;if(null===t)throw new c("LMXLLMI69999");e=t}if(!rt.isStack(e))throw new h("LMCLLMI19993");e.maximise()}}}processMaximiseStack(t){if(this._maximisedStack=t,t.on("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),t.element.classList.add("lm_maximised"),t.element.insertAdjacentElement("afterend",this._maximisePlaceholder),void 0===this._groundItem)throw new u("LMMXI19993");{this._groundItem.element.prepend(t.element);const{width:e,height:i}=q(this._containerElement);G(t.element,e),Z(t.element,i),t.updateSize(!0),t.focusActiveContentItem(),this._maximisedStack.emit("maximised"),this.emit("stateChanged")}}processMinimiseMaximisedStack(){if(void 0===this._maximisedStack)throw new h("LMMMS74422");{const t=this._maximisedStack;if(null===t.parent)throw new c("LMMI13668");t.element.classList.remove("lm_maximised"),this._maximisePlaceholder.insertAdjacentElement("afterend",t.element),this._maximisePlaceholder.remove(),this.updateRootSize(!0),this._maximisedStack=void 0,t.off("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),t.emit("minimised"),this.emit("stateChanged")}}reconcilePopoutWindows(){const t=[];for(let e=0;e{this._resizeTimeoutId=void 0,this.beginSizeInvalidation(),this.endSizeInvalidation()}),this.resizeDebounceInterval))}checkClearResizeTimeout(){void 0!==this._resizeTimeoutId&&(clearTimeout(this._resizeTimeoutId),this._resizeTimeoutId=void 0)}setContainer(){var t;const e=document.body,i=null!==(t=this._containerElement)&&void 0!==t?t:e;if(i===e){this.resizeWithContainerAutomatically=!0;const t=document.documentElement;t.style.height="100%",t.style.margin="0",t.style.padding="0",t.style.overflow="hidden",e.style.height="100%",e.style.margin="0",e.style.padding="0",e.style.overflow="hidden"}this._containerElement=i}onBeforeUnload(){this.destroy()}adjustColumnsResponsive(){if(void 0===this._groundItem)throw new u("LMACR20883");if(this._firstLoad=!1,this.useResponsiveLayout()&&!this._updatingColumnsResponsive&&this._groundItem.contentItems.length>0&&this._groundItem.contentItems[0].isRow){if(void 0===this._groundItem||null===this._width)throw new u("LMACR77412");{const t=this._groundItem.contentItems[0].contentItems.length;if(t<=1)return;{const e=this.layoutConfig.dimensions.defaultMinItemWidth;if(t*e<=this._width)return;{this._updatingColumnsResponsive=!0;const i=t-Math.max(Math.floor(this._width/e),1),n=this._groundItem.contentItems[0],o=this.getAllStacks();if(0===o.length)throw new h("LMACRS77413");{const t=o[0];for(let e=0;en?void 0:{parentItem:t,index:o}}}case 1:if(void 0===this._focusedComponentItem)return;{const t=this._focusedComponentItem.parentItem;return this.tryCreateLocationFromParentItem(t,e)}case 2:{const t=this.findFirstContentItemType(y.stack);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 3:{let t=this.findFirstContentItemType(y.row);return void 0!==t?this.tryCreateLocationFromParentItem(t,e):(t=this.findFirstContentItemType(y.column),void 0!==t?this.tryCreateLocationFromParentItem(t,e):void 0)}case 4:{const t=this.findFirstContentItemType(y.row);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 5:{const t=this.findFirstContentItemType(y.column);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 6:if(void 0===this._groundItem)throw new u("LMFLRIF18244");return void 0!==this.rootItem?void 0:void 0===e||0===e?{parentItem:this._groundItem,index:0}:void 0;case 7:if(void 0===this._groundItem)throw new u("LMFLF18244");{const t=this._groundItem.contentItems;if(0===t.length)return void 0===e||0===e?{parentItem:this._groundItem,index:0}:void 0;{const i=t[0];return this.tryCreateLocationFromParentItem(i,e)}}}}tryCreateLocationFromParentItem(t,e){const i=t.contentItems.length;return void 0===e?{parentItem:t,index:i}:e<0||e>i?void 0:{parentItem:t,index:e}}}!function(t){t.createMaximisePlaceElement=function(t){const e=t.createElement("div");return e.classList.add("lm_maximise_place"),e},t.createTabDropPlaceholderElement=function(t){const e=t.createElement("div");return e.classList.add("lm_drop_tab_placeholder"),e},t.defaultLocationSelectors=[{typeId:1,index:void 0},{typeId:2,index:void 0},{typeId:3,index:void 0},{typeId:7,index:void 0}],t.afterFocusedItemIfPossibleLocationSelectors=[{typeId:0,index:1},{typeId:2,index:void 0},{typeId:3,index:void 0},{typeId:7,index:void 0}]}(St||(St={}));class Et extends St{constructor(t,e,i,n){if(super(Et.createLayoutManagerConstructorParameters(t,e)),this._bindComponentEventHanlderPassedInConstructor=!1,this._creationTimeoutPassed=!1,void 0!==e&&"function"==typeof e&&(this.bindComponentEvent=e,this._bindComponentEventHanlderPassedInConstructor=!0,void 0!==i&&(this.unbindComponentEvent=i)),!this._bindComponentEventHanlderPassedInConstructor&&this.isSubWindow){if(void 0===this._constructorOrSubWindowLayoutConfig)throw new u("VLC98823");{const t=B.resolve(this._constructorOrSubWindowLayoutConfig);this.layoutConfig=Object.assign(Object.assign({},t),{root:void 0})}}!0!==n&&(this.deprecatedConstructor||this.init())}destroy(){this.bindComponentEvent=void 0,this.unbindComponentEvent=void 0,super.destroy()}init(){if(this._bindComponentEventHanlderPassedInConstructor||"loading"!==document.readyState&&null!==document.body){if(!this._bindComponentEventHanlderPassedInConstructor&&!0===this.isSubWindow&&!this._creationTimeoutPassed)return setTimeout((()=>this.init()),7),void(this._creationTimeoutPassed=!0);!0===this.isSubWindow&&(this._bindComponentEventHanlderPassedInConstructor||this.clearHtmlAndAdjustStylesForSubWindow(),window.__glInstance=this),super.init()}else document.addEventListener("DOMContentLoaded",(()=>this.init()),{passive:!0})}clearHtmlAndAdjustStylesForSubWindow(){const t=document.head,e=new Array(4);e[0]=document.querySelectorAll("body link"),e[1]=document.querySelectorAll("body style"),e[2]=document.querySelectorAll("template"),e[3]=document.querySelectorAll(".gl_keep");for(let i=0;ithis.emit("popIn"))),document.body.appendChild(t),!0}}bindComponent(t,e){if(void 0!==this.bindComponentEvent)return this.bindComponentEvent(t,e);if(void 0!==this.getComponentEvent)return{virtual:!1,component:this.getComponentEvent(t,e)};{const t=`${m[2]}: ${JSON.stringify(e)}`;throw new a(t)}}unbindComponent(t,e,i){if(void 0!==this.unbindComponentEvent)this.unbindComponentEvent(t);else if(!e&&void 0!==this.releaseComponentEvent){if(void 0===i)throw new u("VCUCRCU333998");this.releaseComponentEvent(t,i)}}}!function(t){let e=!1;t.createLayoutManagerConstructorParameters=function(t,i){const n=e?null:new URL(document.location.href).searchParams.get("gl-window");e=!0;const o=null!==n;let s,r;if(null!==n){const e=localStorage.getItem(n);if(null===e)throw new Error("Null gl-window Config");localStorage.removeItem(n);const i=JSON.parse(e),o=T.unminifyConfig(i);r=B.fromResolved(o),t instanceof HTMLElement&&(s=t)}else void 0===t?r=void 0:t instanceof HTMLElement?(r=void 0,s=t):r=t,void 0===s&&i instanceof HTMLElement&&(s=i);return{constructorOrSubWindowLayoutConfig:r,isSubWindow:o,containerElement:s}}}(Et||(Et={}));class xt extends Et{constructor(t,e,i){super(t,e,i,!0),this._componentTypesMap=new Map,this._registeredComponentMap=new Map,this._virtuableComponentMap=new Map,this._containerVirtualRectingRequiredEventListener=(t,e,i)=>this.handleContainerVirtualRectingRequiredEvent(t,e,i),this._containerVirtualVisibilityChangeRequiredEventListener=(t,e)=>this.handleContainerVirtualVisibilityChangeRequiredEvent(t,e),this._containerVirtualZIndexChangeRequiredEventListener=(t,e,i)=>this.handleContainerVirtualZIndexChangeRequiredEvent(t,e,i),this.deprecatedConstructor||this.init()}registerComponent(t,e,i=!1){if("function"!=typeof e)throw new r("registerComponent() componentConstructorOrFactoryFtn parameter is not a function");if(e.hasOwnProperty("prototype")){const n=e;this.registerComponentConstructor(t,n,i)}else{const n=e;this.registerComponentFactoryFunction(t,n,i)}}registerComponentConstructor(t,e,i=!1){if("function"!=typeof e)throw new Error(m[1]);if(void 0!==this._componentTypesMap.get(t))throw new a(`${m[3]}: ${t}`);this._componentTypesMap.set(t,{constructor:e,factoryFunction:void 0,virtual:i})}registerComponentFactoryFunction(t,e,i=!1){if("function"!=typeof e)throw new a("Please register a constructor function");if(void 0!==this._componentTypesMap.get(t))throw new a(`${m[3]}: ${t}`);this._componentTypesMap.set(t,{constructor:void 0,factoryFunction:e,virtual:i})}registerComponentFunction(t){this.registerGetComponentConstructorCallback(t)}registerGetComponentConstructorCallback(t){if("function"!=typeof t)throw new Error("Please register a callback function");void 0!==this._getComponentConstructorFtn&&console.warn("Multiple component functions are being registered. Only the final registered function will be used."),this._getComponentConstructorFtn=t}getRegisteredComponentTypeNames(){const t=this._componentTypesMap.keys();return Array.from(t)}getComponentInstantiator(t){let e;const i=z.resolveComponentTypeName(t);return void 0!==i&&(e=this._componentTypesMap.get(i)),void 0===e&&void 0!==this._getComponentConstructorFtn&&(e={constructor:this._getComponentConstructorFtn(t),factoryFunction:void 0,virtual:!1}),e}bindComponent(t,e){let i;const n=z.resolveComponentTypeName(e);let o;if(void 0!==n&&(i=this._componentTypesMap.get(n)),void 0===i&&void 0!==this._getComponentConstructorFtn&&(i={constructor:this._getComponentConstructorFtn(e),factoryFunction:void 0,virtual:!1}),void 0!==i){const s=i.virtual;let r,l;r=void 0===e.componentState?void 0:J({},e.componentState);const d=i.constructor;if(void 0!==d)l=new d(t,r,s);else{const e=i.factoryFunction;if(void 0===e)throw new h("LMBCFFU10008");l=e(t,r,s)}if(s){if(void 0===l)throw new u("GLBCVCU988774");{const e=l,i=e.rootHtmlElement;if(void 0===i)throw new a(`${m[5]}: ${n}`);!function(t){const e="absolute";t.style.position!==e&&(t.style.position=e)}(i),this.container.appendChild(i),this._virtuableComponentMap.set(t,e),t.virtualRectingRequiredEvent=this._containerVirtualRectingRequiredEventListener,t.virtualVisibilityChangeRequiredEvent=this._containerVirtualVisibilityChangeRequiredEventListener,t.virtualZIndexChangeRequiredEvent=this._containerVirtualZIndexChangeRequiredEventListener}}this._registeredComponentMap.set(t,l),o={virtual:i.virtual,component:l}}else o=super.bindComponent(t,e);return o}unbindComponent(t,e,i){if(void 0===this._registeredComponentMap.get(t))super.unbindComponent(t,e,i);else{const e=this._virtuableComponentMap.get(t);if(void 0!==e){const i=e.rootHtmlElement;if(void 0===i)throw new h("GLUC77743",t.title);this.container.removeChild(i),this._virtuableComponentMap.delete(t)}}}fireBeforeVirtualRectingEvent(t){this._goldenLayoutBoundingClientRect=this.container.getBoundingClientRect(),super.fireBeforeVirtualRectingEvent(t)}handleContainerVirtualRectingRequiredEvent(t,e,i){const n=this._virtuableComponentMap.get(t);if(void 0===n)throw new u("GLHCSCE55933");{const o=n.rootHtmlElement;if(void 0===o)throw new a(m[4]+" "+t.title);{const n=t.element.getBoundingClientRect(),s=n.left-this._goldenLayoutBoundingClientRect.left;o.style.left=F(s);const r=n.top-this._goldenLayoutBoundingClientRect.top;o.style.top=F(r),G(o,e),Z(o,i)}}}handleContainerVirtualVisibilityChangeRequiredEvent(t,e){const i=this._virtuableComponentMap.get(t);if(void 0===i)throw new u("GLHCVVCRE55934");{const n=i.rootHtmlElement;if(void 0===n)throw new a(m[4]+" "+t.title);X(n,e)}}handleContainerVirtualZIndexChangeRequiredEvent(t,e,i){const n=this._virtuableComponentMap.get(t);if(void 0===n)throw new u("GLHCVZICRE55935");{const e=n.rootHtmlElement;if(void 0===e)throw new a(m[4]+" "+t.title);e.style.zIndex=i}}}return i})())); \ No newline at end of file diff --git a/src/Scratch/25 - GoldenLayout/resources/golden-layout/css/goldenlayout-base.css b/src/Scratch/25 - GoldenLayout/resources/golden-layout/css/goldenlayout-base.css index 95c8687e..441f1cb9 100644 --- a/src/Scratch/25 - GoldenLayout/resources/golden-layout/css/goldenlayout-base.css +++ b/src/Scratch/25 - GoldenLayout/resources/golden-layout/css/goldenlayout-base.css @@ -77,11 +77,11 @@ .lm_header .lm_tabs { position: absolute; display: flex; + height: 20px; } .lm_header .lm_tab { cursor: pointer; float: left; - height: 14px; margin-top: 1px; padding: 0px 10px 5px; position: relative;