import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/controls/Left.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/controls/ButtonToggle.vue"; import { default as __nuxt_component_1 } from "/_nuxt/components/automate/runs/trigger-status/Icon.vue"; import { default as __nuxt_component_2 } from "/_nuxt/components/viewer/models/Panel.vue"; import { default as __nuxt_component_3 } from "/_nuxt/components/viewer/filters/Panel.vue"; import { default as __nuxt_component_4 } from "/_nuxt/components/viewer/elements/Panel.vue"; import { default as __nuxt_component_5 } from "/_nuxt/components/viewer/comments/Panel.vue"; import { default as __nuxt_component_6 } from "/_nuxt/components/automate/viewer/Panel.vue"; import { default as __nuxt_component_7 } from "/_nuxt/components/viewer/dataviewer/Panel.vue"; import { default as __nuxt_component_8 } from "/_nuxt/components/viewer/saved-views/Panel.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createVNode as __createVNode,createBlock as __createBlock,createElementBlock as __createElementBlock,createElementVNode as __createElementVNode } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29" function _interopVNode(vnode) { if (vnode && vnode.props && 'data-v-inspector' in vnode.props) { const data = vnode.props['data-v-inspector'] delete vnode.props['data-v-inspector'] Object.defineProperty(vnode.props, '__v_inspector', { value: data, enumerable: false }) } return vnode } function _createVNode(...args) { return _interopVNode(__createVNode(...args)) } function _createBlock(...args) { return _interopVNode(__createBlock(...args)) } function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) } function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) } /* Injection by vite-plugin-vue-inspector End */ import { defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { useViewerShortcuts } from "/_nuxt/lib/viewer/composables/ui.ts"; import { useInjectedViewerInterfaceState, useInjectedViewerLoadedResources, useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { useEmbed } from "/_nuxt/lib/viewer/composables/setup/embed.ts"; import { TailwindBreakpoints } from "/_nuxt/lib/common/helpers/tailwind.ts"; import { useEventListener, useResizeObserver, useBreakpoints, useWindowSize, useThrottleFn } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29"; import { isNonNullable } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { useFunctionRunsStatusSummary } from "/_nuxt/lib/automate/composables/runStatus.ts"; import { useIntercomEnabled } from "/_nuxt/lib/intercom/composables/enabled.ts"; import { viewerDocsRoute } from "/_nuxt/lib/common/helpers/route.ts"; import { useAreSavedViewsEnabled } from "/_nuxt/lib/viewer/composables/savedViews/general.ts"; import { Camera, CodeXml, BookOpen, Box, ListFilter, Search, MessageSquareText, CircleQuestionMark } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29"; import { useViewerPanelsUtilities } from "/_nuxt/lib/viewer/composables/setup/panels.ts"; import { useSmartTooltipDelay } from "/_nuxt/composables/tooltips.ts"; import { useIsWorkspacesEnabled } from "/_nuxt/composables/globals.ts"; import { useNuxtApp } from "/_nuxt/node_modules/nuxt/dist/app/nuxt.js?v=e4f18c29"; import { ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ViewerControlsLeft", emits: ["forceClosePanels"], setup(__props, { expose: __expose, emit: __emit }) { const emit = __emit; const { width: windowWidth } = useWindowSize(); const { isIntercomEnabled } = useIntercomEnabled(); const { resourceItems, modelsAndVersionIds } = useInjectedViewerLoadedResources(); const { registerShortcuts, getShortcutDisplayText, shortcuts } = useViewerShortcuts(); const { isEnabled: isEmbedEnabled } = useEmbed(); const breakpoints = useBreakpoints(TailwindBreakpoints); const isMobile = breakpoints.smaller("sm"); const isTablet = breakpoints.smaller("lg"); const isLargerThanLg = breakpoints.greater("lg"); const { getTooltipProps } = useSmartTooltipDelay(); const isSavedViewsEnabled = useAreSavedViewsEnabled(); const isWorkspacesEnabled = useIsWorkspacesEnabled(); const { $intercom } = useNuxtApp(); const { filters: { hasAnyFiltersApplied } } = useInjectedViewerInterfaceState(); const { ui: { panels: { active: activePanel, modelsSubView } } } = useInjectedViewerState(); const { onPanelButtonClick } = useViewerPanelsUtilities(); const width = ref(264); const panelExtensionWidth = ref(isMobile.value ? 200 : isLargerThanLg.value ? 300 : 256); const scrollableControlsContainer = ref(null); const height = ref(scrollableControlsContainer.value?.clientHeight); const isResizing = ref(false); const isPanelExtensionResizing = ref(false); const resizeHandle = ref(null); const panelExtensionResizeHandle = ref(null); let startWidth = 0; let startX = 0; let startPanelExtensionWidth = 0; let startPanelExtensionX = 0; const startResizing = (event) => { if (isMobile.value) return; event.preventDefault(); isResizing.value = true; startX = event.clientX; startWidth = width.value; }; const startPanelExtensionResizing = (event) => { if (isMobile.value) return; event.preventDefault(); isPanelExtensionResizing.value = true; startPanelExtensionX = event.clientX; startPanelExtensionWidth = panelExtensionWidth.value; }; const throttledHandleMouseMove = useThrottleFn((event) => { if (isResizing.value) { const diffX = event.clientX - startX; const newWidth = Math.max( 240, Math.min(startWidth + diffX, Math.min(440, windowWidth.value * 0.5 - 60)) ); width.value = newWidth; } else if (isPanelExtensionResizing.value) { const diffX = event.clientX - startPanelExtensionX; const newWidth = Math.max( 200, Math.min(startPanelExtensionWidth + diffX, Math.min(400, windowWidth.value * 0.4)) ); panelExtensionWidth.value = newWidth; } }, 50); if (true) { useResizeObserver(scrollableControlsContainer, (entries) => { const { height: newHeight } = entries[0].contentRect; height.value = newHeight; }); useEventListener(resizeHandle, "mousedown", startResizing); useEventListener(panelExtensionResizeHandle, "mousedown", startPanelExtensionResizing); useEventListener(document, "mousemove", throttledHandleMouseMove); useEventListener(document, "mouseup", () => { if (isResizing.value) { isResizing.value = false; } if (isPanelExtensionResizing.value) { isPanelExtensionResizing.value = false; } }); } const hasActivePanel = computed(() => activePanel.value !== "none"); const allAutomationRuns = computed(() => { const allAutomationStatuses = modelsAndVersionIds.value.map(({ model }) => model.loadedVersion.items[0].automationsStatus).flat().filter(isNonNullable); return allAutomationStatuses.map((status) => status.automationRuns).flat(); }); const allFunctionRuns = computed(() => { return allAutomationRuns.value.map((run) => run.functionRuns).flat(); }); const widthClass = computed(() => { if (isMobile.value) { return "calc(100vw - 3.6rem)"; } else if (isTablet.value) { return "240px"; } else { return `${width.value + 4}px`; } }); const panelExtensionLeft = computed(() => { if (isMobile.value || isTablet.value) { return; } const mainPanelLeft = isEmbedEnabled.value ? 52 : 60; return `${mainPanelLeft + width.value}px`; }); const { summary } = useFunctionRunsStatusSummary({ runs: allFunctionRuns }); registerShortcuts({ ToggleModels: () => toggleActivePanel("models"), ToggleFilters: () => toggleActivePanel("filters"), ToggleDiscussions: () => toggleActivePanel("discussions"), ToggleDevMode: () => toggleActivePanel("devMode"), ToggleSavedViews: () => isSavedViewsEnabled && toggleActivePanel("savedViews") }); const toggleActivePanel = (panel) => { onPanelButtonClick(panel); }; const forceClosePanel = () => { activePanel.value = "none"; }; const openDocs = () => { window.open(viewerDocsRoute, "_blank"); }; const openIntercomChat = () => { if (isIntercomEnabled.value) { $intercom.show(); } }; watch(activePanel, (newVal, oldVal) => { const wasNone = oldVal === "none"; if (wasNone && newVal !== "none" && isMobile.value) { emit("forceClosePanels"); } }); __expose({ forceClosePanel, forceClosePanels: forceClosePanel }); const __returned__ = { emit, windowWidth, isIntercomEnabled, resourceItems, modelsAndVersionIds, registerShortcuts, getShortcutDisplayText, shortcuts, isEmbedEnabled, breakpoints, isMobile, isTablet, isLargerThanLg, getTooltipProps, isSavedViewsEnabled, isWorkspacesEnabled, $intercom, hasAnyFiltersApplied, activePanel, modelsSubView, onPanelButtonClick, width, panelExtensionWidth, scrollableControlsContainer, height, isResizing, isPanelExtensionResizing, resizeHandle, panelExtensionResizeHandle, get startWidth() { return startWidth; }, set startWidth(v) { startWidth = v; }, get startX() { return startX; }, set startX(v) { startX = v; }, get startPanelExtensionWidth() { return startPanelExtensionWidth; }, set startPanelExtensionWidth(v) { startPanelExtensionWidth = v; }, get startPanelExtensionX() { return startPanelExtensionX; }, set startPanelExtensionX(v) { startPanelExtensionX = v; }, startResizing, startPanelExtensionResizing, throttledHandleMouseMove, hasActivePanel, allAutomationRuns, allFunctionRuns, widthClass, panelExtensionLeft, summary, toggleActivePanel, forceClosePanel, openDocs, openIntercomChat, get Camera() { return Camera; }, get CodeXml() { return CodeXml; }, get BookOpen() { return BookOpen; }, get Box() { return Box; }, get ListFilter() { return ListFilter; }, get Search() { return Search; }, get MessageSquareText() { return MessageSquareText; }, get CircleQuestionMark() { return CircleQuestionMark; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { resolveComponent as _resolveComponent, resolveDirective as _resolveDirective, withDirectives as _withDirectives, createCommentVNode as _createCommentVNode, openBlock as _openBlock, withCtx as _withCtx, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, vShow as _vShow, KeepAlive as _KeepAlive } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { key: 2, class: "mt-auto flex flex-col gap-2", "data-v-inspector": "components/viewer/controls/Left.vue:94:7" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_ViewerControlsButtonToggle = __nuxt_component_0; const _component_AutomateRunsTriggerStatusIcon = __nuxt_component_1; const _component_ViewerModelsPanel = __nuxt_component_2; const _component_ViewerFiltersPanel = __nuxt_component_3; const _component_ViewerElementsPanel = __nuxt_component_4; const _component_ViewerCommentsPanel = __nuxt_component_5; const _component_AutomateViewerPanel = __nuxt_component_6; const _component_ViewerDataviewerPanel = __nuxt_component_7; const _component_ViewerSavedViewsPanel = __nuxt_component_8; const _component_PortalTarget = _resolveComponent("PortalTarget"); const _directive_tippy = _resolveDirective("tippy"); return _openBlock(), _createElementBlock( "aside", { class: _normalizeClass(["absolute left-2 z-50 flex rounded-lg border border-outline-2 bg-foundation px-1 overflow-visible focus-visible:outline-none", [ $setup.isEmbedEnabled ? "top-[0.5rem]" : "top-[3.5rem] lg:top-[3rem] lg:rounded-none lg:px-2 lg:max-h-[calc(100dvh-3rem)] lg:border-l-0 lg:border-t-0 lg:border-b-0 lg:h-full lg:left-0", $setup.hasActivePanel && "h-full max-h-[calc(100dvh-8rem)] rounded-r-none" ]]), "data-v-inspector": "components/viewer/controls/Left.vue:3:3" }, [ _createElementVNode( "div", { class: _normalizeClass(["flex flex-col gap-2 py-1", $setup.isEmbedEnabled ? "" : "lg:py-2"]), "data-v-inspector": "components/viewer/controls/Left.vue:12:5" }, [ _withDirectives(_createVNode(_component_ViewerControlsButtonToggle, { active: $setup.activePanel === "models", icon: $setup.Box, onClick: _cache[0] || (_cache[0] = ($event) => $setup.toggleActivePanel("models")), "data-v-inspector": "components/viewer/controls/Left.vue:13:7" }, null, 8, ["active", "icon"]), [ [ _directive_tippy, $setup.getTooltipProps( $setup.getShortcutDisplayText($setup.shortcuts.ToggleModels, { format: "separate" }), { placement: "right" } ) ] ]), _withDirectives(_createVNode(_component_ViewerControlsButtonToggle, { active: $setup.activePanel === "filters", icon: $setup.ListFilter, dot: $setup.hasAnyFiltersApplied, onClick: _cache[1] || (_cache[1] = ($event) => $setup.toggleActivePanel("filters")), "data-v-inspector": "components/viewer/controls/Left.vue:26:7" }, null, 8, ["active", "icon", "dot"]), [ [ _directive_tippy, $setup.getTooltipProps( $setup.getShortcutDisplayText($setup.shortcuts.ToggleFilters, { format: "separate" }), { placement: "right" } ) ] ]), _withDirectives(_createVNode(_component_ViewerControlsButtonToggle, { active: $setup.activePanel === "elements", icon: $setup.Search, onClick: _cache[2] || (_cache[2] = ($event) => $setup.toggleActivePanel("elements")), "data-v-inspector": "components/viewer/controls/Left.vue:40:7" }, null, 8, ["active", "icon"]), [ [ _directive_tippy, $setup.getTooltipProps("Elements", { placement: "right" }) ] ]), _withDirectives(_createVNode(_component_ViewerControlsButtonToggle, { active: $setup.activePanel === "discussions", icon: $setup.MessageSquareText, onClick: _cache[3] || (_cache[3] = ($event) => $setup.toggleActivePanel("discussions")), "data-v-inspector": "components/viewer/controls/Left.vue:50:7" }, null, 8, ["active", "icon"]), [ [ _directive_tippy, $setup.getTooltipProps( $setup.getShortcutDisplayText($setup.shortcuts.ToggleDiscussions, { format: "separate" }), { placement: "right" } ) ] ]), _createCommentVNode(" Saved views "), $setup.isSavedViewsEnabled ? _withDirectives((_openBlock(), _createBlock(_component_ViewerControlsButtonToggle, { key: 0, active: $setup.activePanel === "savedViews", icon: $setup.Camera, onClick: _cache[4] || (_cache[4] = ($event) => $setup.toggleActivePanel("savedViews")), "data-v-inspector": "components/viewer/controls/Left.vue:65:7" }, null, 8, ["active", "icon"])), [ [ _directive_tippy, $setup.getTooltipProps( $setup.getShortcutDisplayText($setup.shortcuts.ToggleSavedViews, { format: "separate" }), { placement: "right" } ) ] ]) : _createCommentVNode("v-if", true), $setup.allAutomationRuns.length !== 0 ? _withDirectives((_openBlock(), _createBlock(_component_ViewerControlsButtonToggle, { key: 1, active: $setup.activePanel === "automate", onClick: _cache[5] || (_cache[5] = ($event) => $setup.toggleActivePanel("automate")), "data-v-inspector": "components/viewer/controls/Left.vue:80:7" }, { default: _withCtx(() => [ _createVNode(_component_AutomateRunsTriggerStatusIcon, { summary: $setup.summary, class: "h-5 w-5 md:h-6 md:w-6", "data-v-inspector": "components/viewer/controls/Left.vue:89:9" }, null, 8, ["summary"]) ]), _: 1 /* STABLE */ }, 8, ["active"])), [ [_directive_tippy, { content: $setup.summary.longSummary, placement: "right" }] ]) : _createCommentVNode("v-if", true), !$setup.isEmbedEnabled && (!$setup.isTablet || $setup.activePanel !== "none") ? (_openBlock(), _createElementBlock("div", _hoisted_1, [ _withDirectives(_createVNode(_component_ViewerControlsButtonToggle, { active: $setup.activePanel === "devMode", icon: $setup.CodeXml, secondary: "", onClick: _cache[6] || (_cache[6] = ($event) => $setup.toggleActivePanel("devMode")), "data-v-inspector": "components/viewer/controls/Left.vue:98:9" }, null, 8, ["active", "icon"]), [ [ _directive_tippy, $setup.getTooltipProps( $setup.getShortcutDisplayText($setup.shortcuts.ToggleDevMode, { format: "separate" }), { placement: "right" } ) ] ]), _withDirectives(_createVNode(_component_ViewerControlsButtonToggle, { icon: $setup.BookOpen, secondary: "", onClick: $setup.openDocs, "data-v-inspector": "components/viewer/controls/Left.vue:112:9" }, null, 8, ["icon"]), [ [ _directive_tippy, $setup.getTooltipProps("Documentation", { placement: "right" }) ] ]), $setup.isIntercomEnabled ? _withDirectives((_openBlock(), _createBlock(_component_ViewerControlsButtonToggle, { key: 0, icon: $setup.CircleQuestionMark, secondary: "", onClick: $setup.openIntercomChat, "data-v-inspector": "components/viewer/controls/Left.vue:122:9" }, null, 8, ["icon"])), [ [_directive_tippy, $setup.getTooltipProps("Get help")] ]) : _createCommentVNode("v-if", true) ])) : _createCommentVNode("v-if", true) ], 2 /* CLASS */ ), _createCommentVNode(" Resize handle "), $setup.activePanel !== "none" && !$setup.isEmbedEnabled ? (_openBlock(), _createElementBlock( "div", { key: 0, ref: "resizeHandle", class: "absolute h-full max-h-[calc(100dvh-3rem)] w-4 transition border-l hover:border-l-[2px] border-outline-2 hover:border-primary hidden lg:flex items-center cursor-ew-resize z-30", style: _normalizeStyle(`left:${$setup.width + 52}px;`), onMousedown: $setup.startResizing, "data-v-inspector": "components/viewer/controls/Left.vue:133:5" }, null, 36 /* STYLE, NEED_HYDRATION */ )) : _createCommentVNode("v-if", true), _createCommentVNode(" Scrollable controls container "), _withDirectives(_createElementVNode( "div", { ref: "scrollableControlsContainer", class: _normalizeClass([ "bg-foundation absolute z-10 left-[calc(2.5rem+1px)] top-[-1px] bottom-[-1px] overflow-hidden border-outline-2 border border-l-0 rounded-lg rounded-tl-none rounded-bl-none ", $setup.hasActivePanel ? "opacity-100" : "opacity-0", $setup.isEmbedEnabled ? "" : "lg:left-[calc(3rem+1px)] lg:border-none lg:rounded-none" ]), style: _normalizeStyle(`width: ${$setup.widthClass};`), "data-v-inspector": "components/viewer/controls/Left.vue:142:5" }, [ _withDirectives(_createVNode(_component_ViewerModelsPanel, { "sub-view": $setup.modelsSubView, "onUpdate:subView": _cache[7] || (_cache[7] = ($event) => $setup.modelsSubView = $event), "data-v-inspector": "components/viewer/controls/Left.vue:152:7" }, null, 8, ["sub-view"]), [ [_vShow, $setup.activePanel === "models"] ]), $setup.activePanel === "filters" ? (_openBlock(), _createBlock(_component_ViewerFiltersPanel, { key: 0, "data-v-inspector": "components/viewer/controls/Left.vue:156:7" })) : _createCommentVNode("v-if", true), $setup.activePanel === "elements" ? (_openBlock(), _createBlock(_component_ViewerElementsPanel, { key: 1, "data-v-inspector": "components/viewer/controls/Left.vue:157:7" })) : _createCommentVNode("v-if", true), $setup.resourceItems.length !== 0 && $setup.activePanel === "discussions" ? (_openBlock(), _createBlock(_component_ViewerCommentsPanel, { key: 2, "data-v-inspector": "components/viewer/controls/Left.vue:158:7" })) : _createCommentVNode("v-if", true), $setup.activePanel === "automate" ? (_openBlock(), _createBlock(_component_AutomateViewerPanel, { key: 3, "automation-runs": $setup.allAutomationRuns, summary: $setup.summary, "data-v-inspector": "components/viewer/controls/Left.vue:161:7" }, null, 8, ["automation-runs", "summary"])) : _createCommentVNode("v-if", true), $setup.activePanel === "devMode" ? (_openBlock(), _createBlock(_component_ViewerDataviewerPanel, { key: 4, "data-v-inspector": "components/viewer/controls/Left.vue:166:7" })) : _createCommentVNode("v-if", true), (_openBlock(), _createBlock( _KeepAlive, { "data-v-inspector": "components/viewer/controls/Left.vue:167:7" }, [ $setup.isSavedViewsEnabled && $setup.isWorkspacesEnabled && $setup.activePanel === "savedViews" ? (_openBlock(), _createBlock(_component_ViewerSavedViewsPanel, { key: 0, onClose: _cache[8] || (_cache[8] = ($event) => $setup.activePanel = "none"), "data-v-inspector": "components/viewer/controls/Left.vue:168:9" })) : _createCommentVNode("v-if", true) ], 1024 /* DYNAMIC_SLOTS */ )) ], 6 /* CLASS, STYLE */ ), [ [_vShow, $setup.activePanel !== "none"] ]), _createCommentVNode(" Panel Extension - Portal target for additional content "), _createElementVNode( "div", { id: "panel-extension", class: "absolute z-50 left-[calc(100dvw-16rem)] sm:left-72 max-h-[calc(100dvh-6rem)] md:max-h-[calc(100dvh-4rem)] top-1.5 bg-foundation rounded-lg overflow-hidden", style: _normalizeStyle(`left: ${$setup.panelExtensionLeft} !important; width: ${$setup.panelExtensionWidth}px;`), "data-v-inspector": "components/viewer/controls/Left.vue:178:5" }, [ _createCommentVNode(" Resize handle for panel extension "), _createElementVNode( "div", { ref: "panelExtensionResizeHandle", class: "absolute h-full max-h-[calc(100dvh-6rem)] md:max-h-[calc(100dvh-4rem)] w-4 transition border-r hover:border-r-[2px] border-outline-2 hover:border-primary hidden lg:flex items-center cursor-ew-resize z-30 right-0", onMousedown: $setup.startPanelExtensionResizing, "data-v-inspector": "components/viewer/controls/Left.vue:184:7" }, null, 544 /* NEED_HYDRATION, NEED_PATCH */ ), _createVNode(_component_PortalTarget, { name: "panel-extension", "data-v-inspector": "components/viewer/controls/Left.vue:189:7" }) ], 4 /* STYLE */ ) ], 2 /* CLASS */ ); } _sfc_main.__hmrId = "6b48c724"; typeof __VUE_HMR_RUNTIME__ !== "undefined" && __VUE_HMR_RUNTIME__.createRecord(_sfc_main.__hmrId, _sfc_main); import.meta.hot.on("file-changed", ({ file }) => { __VUE_HMR_RUNTIME__.CHANGED_FILE = file; }); import.meta.hot.accept((mod) => { if (!mod) return; const { default: updated, _rerender_only } = mod; if (_rerender_only) { __VUE_HMR_RUNTIME__.rerender(updated.__hmrId, updated.render); } else { __VUE_HMR_RUNTIME__.reload(updated.__hmrId, updated); } }); import _export_sfc from "/_nuxt/@id/__x00__plugin-vue:export-helper"; export default /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "D:/speckle-server/packages/frontend-2/components/viewer/controls/Left.vue"]]); //# sourceMappingURL=data:application/json;base64,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WU07QUFBQTtBQUFBLFVBWEosSUFBRztBQUFBLFVBQ0gsT0FBTTtBQUFBLFVBQ0wsT0FBSyx5QkFBVyx5QkFBa0IsdUJBQXVCLDBCQUFtQjtBQUFBLFVBQU8sb0JBQWlCO0FBQUE7O1VBRXJHO0FBQUEsVUFDQTtBQUFBLFlBSUU7QUFBQTtBQUFBLGNBSEEsS0FBSTtBQUFBLGNBQ0osT0FBTTtBQUFBLGNBQ0wsYUFBVztBQUFBLGNBQTZCLG9CQUFpQjtBQUFBOzs7OztVQUU1RCxhQUFpSDtBQUFBLFlBQW5HLE1BQUs7QUFBQSxZQUFrQixvQkFBaUI7QUFBQSIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiTGVmdC52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPCEtLSBlc2xpbnQtZGlzYWJsZSB2dWVqcy1hY2Nlc3NpYmlsaXR5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAtLT5cclxuPHRlbXBsYXRlPlxyXG4gIDxhc2lkZVxyXG4gICAgY2xhc3M9XCJhYnNvbHV0ZSBsZWZ0LTIgei01MCBmbGV4IHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1vdXRsaW5lLTIgYmctZm91bmRhdGlvbiBweC0xIG92ZXJmbG93LXZpc2libGUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmVcIlxyXG4gICAgOmNsYXNzPVwiW1xyXG4gICAgICBpc0VtYmVkRW5hYmxlZFxyXG4gICAgICAgID8gJ3RvcC1bMC41cmVtXSdcclxuICAgICAgICA6ICd0b3AtWzMuNXJlbV0gbGc6dG9wLVszcmVtXSBsZzpyb3VuZGVkLW5vbmUgbGc6cHgtMiBsZzptYXgtaC1bY2FsYygxMDBkdmgtM3JlbSldIGxnOmJvcmRlci1sLTAgbGc6Ym9yZGVyLXQtMCBsZzpib3JkZXItYi0wIGxnOmgtZnVsbCBsZzpsZWZ0LTAnLFxyXG4gICAgICBoYXNBY3RpdmVQYW5lbCAmJiAnaC1mdWxsIG1heC1oLVtjYWxjKDEwMGR2aC04cmVtKV0gcm91bmRlZC1yLW5vbmUnXHJcbiAgICBdXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0xlZnQudnVlOjM6M1wiXHJcbiAgPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTIgcHktMVwiIDpjbGFzcz1cImlzRW1iZWRFbmFibGVkID8gJycgOiAnbGc6cHktMidcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvTGVmdC52dWU6MTI6NVwiPlxyXG4gICAgICA8Vmlld2VyQ29udHJvbHNCdXR0b25Ub2dnbGVcclxuICAgICAgICB2LXRpcHB5PVwiXHJcbiAgICAgICAgICBnZXRUb29sdGlwUHJvcHMoXHJcbiAgICAgICAgICAgIGdldFNob3J0Y3V0RGlzcGxheVRleHQoc2hvcnRjdXRzLlRvZ2dsZU1vZGVscywgeyBmb3JtYXQ6ICdzZXBhcmF0ZScgfSksXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBwbGFjZW1lbnQ6ICdyaWdodCdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgOmFjdGl2ZT1cImFjdGl2ZVBhbmVsID09PSAnbW9kZWxzJ1wiXHJcbiAgICAgICAgOmljb249XCJCb3hcIlxyXG4gICAgICAgIEBjbGljaz1cInRvZ2dsZUFjdGl2ZVBhbmVsKCdtb2RlbHMnKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9MZWZ0LnZ1ZToxMzo3XCJcclxuICAgICAgLz5cclxuICAgICAgPFZpZXdlckNvbnRyb2xzQnV0dG9uVG9nZ2xlXG4gICAgICAgIHYtdGlwcHk9XCJcbiAgICAgICAgICBnZXRUb29sdGlwUHJvcHMoXG4gICAgICAgICAgICBnZXRTaG9ydGN1dERpc3BsYXlUZXh0KHNob3J0Y3V0cy5Ub2dnbGVGaWx0ZXJzLCB7IGZvcm1hdDogJ3NlcGFyYXRlJyB9KSxcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBwbGFjZW1lbnQ6ICdyaWdodCdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgOmFjdGl2ZT1cImFjdGl2ZVBhbmVsID09PSAnZmlsdGVycydcIlxyXG4gICAgICAgIDppY29uPVwiTGlzdEZpbHRlclwiXHJcbiAgICAgICAgOmRvdD1cImhhc0FueUZpbHRlcnNBcHBsaWVkXCJcclxuICAgICAgICBAY2xpY2s9XCJ0b2dnbGVBY3RpdmVQYW5lbCgnZmlsdGVycycpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0xlZnQudnVlOjI2OjdcIlxuICAgICAgLz5cbiAgICAgIDxWaWV3ZXJDb250cm9sc0J1dHRvblRvZ2dsZVxuICAgICAgICB2LXRpcHB5PVwiXG4gICAgICAgICAgZ2V0VG9vbHRpcFByb3BzKCdFbGVtZW50cycsIHtcbiAgICAgICAgICAgIHBsYWNlbWVudDogJ3JpZ2h0J1xuICAgICAgICAgIH0pXG4gICAgICAgIFwiXG4gICAgICAgIDphY3RpdmU9XCJhY3RpdmVQYW5lbCA9PT0gJ2VsZW1lbnRzJ1wiXG4gICAgICAgIDppY29uPVwiU2VhcmNoXCJcbiAgICAgICAgQGNsaWNrPVwidG9nZ2xlQWN0aXZlUGFuZWwoJ2VsZW1lbnRzJylcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvTGVmdC52dWU6NDA6N1wiXG4gICAgICAvPlxuICAgICAgPFZpZXdlckNvbnRyb2xzQnV0dG9uVG9nZ2xlXG4gICAgICAgIHYtdGlwcHk9XCJcbiAgICAgICAgICBnZXRUb29sdGlwUHJvcHMoXG4gICAgICAgICAgICBnZXRTaG9ydGN1dERpc3BsYXlUZXh0KHNob3J0Y3V0cy5Ub2dnbGVEaXNjdXNzaW9ucywgeyBmb3JtYXQ6ICdzZXBhcmF0ZScgfSksXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgcGxhY2VtZW50OiAncmlnaHQnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIClcclxuICAgICAgICBcIlxyXG4gICAgICAgIDphY3RpdmU9XCJhY3RpdmVQYW5lbCA9PT0gJ2Rpc2N1c3Npb25zJ1wiXHJcbiAgICAgICAgOmljb249XCJNZXNzYWdlU3F1YXJlVGV4dFwiXHJcbiAgICAgICAgQGNsaWNrPVwidG9nZ2xlQWN0aXZlUGFuZWwoJ2Rpc2N1c3Npb25zJylcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvTGVmdC52dWU6NTA6N1wiXHJcbiAgICAgIC8+XHJcblxyXG4gICAgICA8IS0tIFNhdmVkIHZpZXdzIC0tPlxyXG4gICAgICA8Vmlld2VyQ29udHJvbHNCdXR0b25Ub2dnbGVcclxuICAgICAgICB2LWlmPVwiaXNTYXZlZFZpZXdzRW5hYmxlZFwiXHJcbiAgICAgICAgdi10aXBweT1cIlxyXG4gICAgICAgICAgZ2V0VG9vbHRpcFByb3BzKFxyXG4gICAgICAgICAgICBnZXRTaG9ydGN1dERpc3BsYXlUZXh0KHNob3J0Y3V0cy5Ub2dnbGVTYXZlZFZpZXdzLCB7IGZvcm1hdDogJ3NlcGFyYXRlJyB9KSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHBsYWNlbWVudDogJ3JpZ2h0J1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgXCJcclxuICAgICAgICA6YWN0aXZlPVwiYWN0aXZlUGFuZWwgPT09ICdzYXZlZFZpZXdzJ1wiXHJcbiAgICAgICAgOmljb249XCJDYW1lcmFcIlxyXG4gICAgICAgIEBjbGljaz1cInRvZ2dsZUFjdGl2ZVBhbmVsKCdzYXZlZFZpZXdzJylcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvTGVmdC52dWU6NjU6N1wiXHJcbiAgICAgID48L1ZpZXdlckNvbnRyb2xzQnV0dG9uVG9nZ2xlPlxyXG5cclxuICAgICAgPFZpZXdlckNvbnRyb2xzQnV0dG9uVG9nZ2xlXHJcbiAgICAgICAgdi1pZj1cImFsbEF1dG9tYXRpb25SdW5zLmxlbmd0aCAhPT0gMFwiXHJcbiAgICAgICAgdi10aXBweT1cIntcclxuICAgICAgICAgIGNvbnRlbnQ6IHN1bW1hcnkubG9uZ1N1bW1hcnksXHJcbiAgICAgICAgICBwbGFjZW1lbnQ6ICdyaWdodCdcclxuICAgICAgICB9XCJcclxuICAgICAgICA6YWN0aXZlPVwiYWN0aXZlUGFuZWwgPT09ICdhdXRvbWF0ZSdcIlxyXG4gICAgICAgIEBjbGljaz1cInRvZ2dsZUFjdGl2ZVBhbmVsKCdhdXRvbWF0ZScpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0xlZnQudnVlOjgwOjdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEF1dG9tYXRlUnVuc1RyaWdnZXJTdGF0dXNJY29uXHJcbiAgICAgICAgICA6c3VtbWFyeT1cInN1bW1hcnlcIlxyXG4gICAgICAgICAgY2xhc3M9XCJoLTUgdy01IG1kOmgtNiBtZDp3LTZcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvTGVmdC52dWU6ODk6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9WaWV3ZXJDb250cm9sc0J1dHRvblRvZ2dsZT5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtaWY9XCIhaXNFbWJlZEVuYWJsZWQgJiYgKCFpc1RhYmxldCB8fCBhY3RpdmVQYW5lbCAhPT0gJ25vbmUnKVwiXHJcbiAgICAgICAgY2xhc3M9XCJtdC1hdXRvIGZsZXggZmxleC1jb2wgZ2FwLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvTGVmdC52dWU6OTQ6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8Vmlld2VyQ29udHJvbHNCdXR0b25Ub2dnbGVcclxuICAgICAgICAgIHYtdGlwcHk9XCJcclxuICAgICAgICAgICAgZ2V0VG9vbHRpcFByb3BzKFxyXG4gICAgICAgICAgICAgIGdldFNob3J0Y3V0RGlzcGxheVRleHQoc2hvcnRjdXRzLlRvZ2dsZURldk1vZGUsIHsgZm9ybWF0OiAnc2VwYXJhdGUnIH0pLFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBsYWNlbWVudDogJ3JpZ2h0J1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICAgIDphY3RpdmU9XCJhY3RpdmVQYW5lbCA9PT0gJ2Rldk1vZGUnXCJcclxuICAgICAgICAgIDppY29uPVwiQ29kZVhtbFwiXHJcbiAgICAgICAgICBzZWNvbmRhcnlcclxuICAgICAgICAgIEBjbGljaz1cInRvZ2dsZUFjdGl2ZVBhbmVsKCdkZXZNb2RlJylcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvTGVmdC52dWU6OTg6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8Vmlld2VyQ29udHJvbHNCdXR0b25Ub2dnbGVcclxuICAgICAgICAgIHYtdGlwcHk9XCJcclxuICAgICAgICAgICAgZ2V0VG9vbHRpcFByb3BzKCdEb2N1bWVudGF0aW9uJywge1xyXG4gICAgICAgICAgICAgIHBsYWNlbWVudDogJ3JpZ2h0J1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICAgIDppY29uPVwiQm9va09wZW5cIlxyXG4gICAgICAgICAgc2Vjb25kYXJ5XHJcbiAgICAgICAgICBAY2xpY2s9XCJvcGVuRG9jc1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9MZWZ0LnZ1ZToxMTI6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8Vmlld2VyQ29udHJvbHNCdXR0b25Ub2dnbGVcclxuICAgICAgICAgIHYtaWY9XCJpc0ludGVyY29tRW5hYmxlZFwiXHJcbiAgICAgICAgICB2LXRpcHB5PVwiZ2V0VG9vbHRpcFByb3BzKCdHZXQgaGVscCcpXCJcclxuICAgICAgICAgIDppY29uPVwiQ2lyY2xlUXVlc3Rpb25NYXJrXCJcclxuICAgICAgICAgIHNlY29uZGFyeVxyXG4gICAgICAgICAgQGNsaWNrPVwib3BlbkludGVyY29tQ2hhdFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9MZWZ0LnZ1ZToxMjI6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFJlc2l6ZSBoYW5kbGUgLS0+XHJcbiAgICA8ZGl2XHJcbiAgICAgIHYtaWY9XCJhY3RpdmVQYW5lbCAhPT0gJ25vbmUnICYmICFpc0VtYmVkRW5hYmxlZFwiXHJcbiAgICAgIHJlZj1cInJlc2l6ZUhhbmRsZVwiXHJcbiAgICAgIGNsYXNzPVwiYWJzb2x1dGUgaC1mdWxsIG1heC1oLVtjYWxjKDEwMGR2aC0zcmVtKV0gdy00IHRyYW5zaXRpb24gYm9yZGVyLWwgaG92ZXI6Ym9yZGVyLWwtWzJweF0gYm9yZGVyLW91dGxpbmUtMiBob3Zlcjpib3JkZXItcHJpbWFyeSBoaWRkZW4gbGc6ZmxleCBpdGVtcy1jZW50ZXIgY3Vyc29yLWV3LXJlc2l6ZSB6LTMwXCJcclxuICAgICAgOnN0eWxlPVwiYGxlZnQ6JHt3aWR0aCArIDUyfXB4O2BcIlxyXG4gICAgICBAbW91c2Vkb3duPVwic3RhcnRSZXNpemluZ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9MZWZ0LnZ1ZToxMzM6NVwiXHJcbiAgICAvPlxyXG5cclxuICAgIDwhLS0gU2Nyb2xsYWJsZSBjb250cm9scyBjb250YWluZXIgLS0+XHJcbiAgICA8ZGl2XHJcbiAgICAgIHYtc2hvdz1cImFjdGl2ZVBhbmVsICE9PSAnbm9uZSdcIlxyXG4gICAgICByZWY9XCJzY3JvbGxhYmxlQ29udHJvbHNDb250YWluZXJcIlxyXG4gICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgJ2JnLWZvdW5kYXRpb24gYWJzb2x1dGUgei0xMCBsZWZ0LVtjYWxjKDIuNXJlbSsxcHgpXSB0b3AtWy0xcHhdIGJvdHRvbS1bLTFweF0gb3ZlcmZsb3ctaGlkZGVuIGJvcmRlci1vdXRsaW5lLTIgYm9yZGVyIGJvcmRlci1sLTAgcm91bmRlZC1sZyByb3VuZGVkLXRsLW5vbmUgcm91bmRlZC1ibC1ub25lICcsXHJcbiAgICAgICAgaGFzQWN0aXZlUGFuZWwgPyAnb3BhY2l0eS0xMDAnIDogJ29wYWNpdHktMCcsXHJcbiAgICAgICAgaXNFbWJlZEVuYWJsZWQgPyAnJyA6ICdsZzpsZWZ0LVtjYWxjKDNyZW0rMXB4KV0gbGc6Ym9yZGVyLW5vbmUgbGc6cm91bmRlZC1ub25lJ1xyXG4gICAgICBdXCJcclxuICAgICAgOnN0eWxlPVwiYHdpZHRoOiAke3dpZHRoQ2xhc3N9O2BcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvTGVmdC52dWU6MTQyOjVcIlxyXG4gICAgPlxyXG4gICAgICA8Vmlld2VyTW9kZWxzUGFuZWxcbiAgICAgICAgdi1zaG93PVwiYWN0aXZlUGFuZWwgPT09ICdtb2RlbHMnXCJcbiAgICAgICAgdi1tb2RlbDpzdWItdmlldz1cIm1vZGVsc1N1YlZpZXdcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvTGVmdC52dWU6MTUyOjdcIlxuICAgICAgLz5cbiAgICAgIDxWaWV3ZXJGaWx0ZXJzUGFuZWwgdi1pZj1cImFjdGl2ZVBhbmVsID09PSAnZmlsdGVycydcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvTGVmdC52dWU6MTU2OjdcIiAvPlxuICAgICAgPFZpZXdlckVsZW1lbnRzUGFuZWwgdi1pZj1cImFjdGl2ZVBhbmVsID09PSAnZWxlbWVudHMnXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0xlZnQudnVlOjE1Nzo3XCIgLz5cbiAgICAgIDxWaWV3ZXJDb21tZW50c1BhbmVsXG4gICAgICAgIHYtaWY9XCJyZXNvdXJjZUl0ZW1zLmxlbmd0aCAhPT0gMCAmJiBhY3RpdmVQYW5lbCA9PT0gJ2Rpc2N1c3Npb25zJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9MZWZ0LnZ1ZToxNTg6N1wiXG4gICAgICAvPlxuICAgICAgPEF1dG9tYXRlVmlld2VyUGFuZWxcclxuICAgICAgICB2LWlmPVwiYWN0aXZlUGFuZWwgPT09ICdhdXRvbWF0ZSdcIlxyXG4gICAgICAgIDphdXRvbWF0aW9uLXJ1bnM9XCJhbGxBdXRvbWF0aW9uUnVuc1wiXHJcbiAgICAgICAgOnN1bW1hcnk9XCJzdW1tYXJ5XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0xlZnQudnVlOjE2MTo3XCJcclxuICAgICAgLz5cclxuICAgICAgPFZpZXdlckRhdGF2aWV3ZXJQYW5lbCB2LWlmPVwiYWN0aXZlUGFuZWwgPT09ICdkZXZNb2RlJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9MZWZ0LnZ1ZToxNjY6N1wiIC8+XHJcbiAgICAgIDxLZWVwQWxpdmUgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0xlZnQudnVlOjE2Nzo3XCI+XHJcbiAgICAgICAgPFZpZXdlclNhdmVkVmlld3NQYW5lbFxyXG4gICAgICAgICAgdi1pZj1cIlxyXG4gICAgICAgICAgICBpc1NhdmVkVmlld3NFbmFibGVkICYmIGlzV29ya3NwYWNlc0VuYWJsZWQgJiYgYWN0aXZlUGFuZWwgPT09ICdzYXZlZFZpZXdzJ1xyXG4gICAgICAgICAgXCJcclxuICAgICAgICAgIEBjbG9zZT1cImFjdGl2ZVBhbmVsID0gJ25vbmUnXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0xlZnQudnVlOjE2ODo5XCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L0tlZXBBbGl2ZT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gUGFuZWwgRXh0ZW5zaW9uIC0gUG9ydGFsIHRhcmdldCBmb3IgYWRkaXRpb25hbCBjb250ZW50IC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICBpZD1cInBhbmVsLWV4dGVuc2lvblwiXHJcbiAgICAgIGNsYXNzPVwiYWJzb2x1dGUgei01MCBsZWZ0LVtjYWxjKDEwMGR2dy0xNnJlbSldIHNtOmxlZnQtNzIgbWF4LWgtW2NhbGMoMTAwZHZoLTZyZW0pXSBtZDptYXgtaC1bY2FsYygxMDBkdmgtNHJlbSldIHRvcC0xLjUgYmctZm91bmRhdGlvbiByb3VuZGVkLWxnIG92ZXJmbG93LWhpZGRlblwiXHJcbiAgICAgIDpzdHlsZT1cImBsZWZ0OiAke3BhbmVsRXh0ZW5zaW9uTGVmdH0gIWltcG9ydGFudDsgd2lkdGg6ICR7cGFuZWxFeHRlbnNpb25XaWR0aH1weDtgXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0xlZnQudnVlOjE3ODo1XCJcclxuICAgID5cclxuICAgICAgPCEtLSBSZXNpemUgaGFuZGxlIGZvciBwYW5lbCBleHRlbnNpb24gLS0+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICByZWY9XCJwYW5lbEV4dGVuc2lvblJlc2l6ZUhhbmRsZVwiXHJcbiAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBoLWZ1bGwgbWF4LWgtW2NhbGMoMTAwZHZoLTZyZW0pXSBtZDptYXgtaC1bY2FsYygxMDBkdmgtNHJlbSldIHctNCB0cmFuc2l0aW9uIGJvcmRlci1yIGhvdmVyOmJvcmRlci1yLVsycHhdIGJvcmRlci1vdXRsaW5lLTIgaG92ZXI6Ym9yZGVyLXByaW1hcnkgaGlkZGVuIGxnOmZsZXggaXRlbXMtY2VudGVyIGN1cnNvci1ldy1yZXNpemUgei0zMCByaWdodC0wXCJcclxuICAgICAgICBAbW91c2Vkb3duPVwic3RhcnRQYW5lbEV4dGVuc2lvblJlc2l6aW5nXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0xlZnQudnVlOjE4NDo3XCJcclxuICAgICAgLz5cclxuICAgICAgPFBvcnRhbFRhcmdldCBuYW1lPVwicGFuZWwtZXh0ZW5zaW9uXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0xlZnQudnVlOjE4OTo3XCI+PC9Qb3J0YWxUYXJnZXQ+XHJcbiAgICA8L2Rpdj5cclxuICA8L2FzaWRlPlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgdXNlVmlld2VyU2hvcnRjdXRzIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy91aSdcclxuaW1wb3J0IHtcclxuICB1c2VJbmplY3RlZFZpZXdlckludGVyZmFjZVN0YXRlLFxyXG4gIHVzZUluamVjdGVkVmlld2VyTG9hZGVkUmVzb3VyY2VzLFxyXG4gIHVzZUluamVjdGVkVmlld2VyU3RhdGVcclxufSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQgeyB1c2VFbWJlZCB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cC9lbWJlZCdcclxuaW1wb3J0IHsgVGFpbHdpbmRCcmVha3BvaW50cyB9IGZyb20gJ35+L2xpYi9jb21tb24vaGVscGVycy90YWlsd2luZCdcclxuaW1wb3J0IHtcclxuICB1c2VFdmVudExpc3RlbmVyLFxyXG4gIHVzZVJlc2l6ZU9ic2VydmVyLFxyXG4gIHVzZUJyZWFrcG9pbnRzLFxyXG4gIHVzZVdpbmRvd1NpemUsXHJcbiAgdXNlVGhyb3R0bGVGblxyXG59IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHsgdHlwZSBOdWxsYWJsZSwgaXNOb25OdWxsYWJsZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgdXNlRnVuY3Rpb25SdW5zU3RhdHVzU3VtbWFyeSB9IGZyb20gJ34vbGliL2F1dG9tYXRlL2NvbXBvc2FibGVzL3J1blN0YXR1cydcclxuaW1wb3J0IHsgdXNlSW50ZXJjb21FbmFibGVkIH0gZnJvbSAnfn4vbGliL2ludGVyY29tL2NvbXBvc2FibGVzL2VuYWJsZWQnXHJcbmltcG9ydCB7IHZpZXdlckRvY3NSb3V0ZSB9IGZyb20gJ35+L2xpYi9jb21tb24vaGVscGVycy9yb3V0ZSdcclxuaW1wb3J0IHsgdXNlQXJlU2F2ZWRWaWV3c0VuYWJsZWQgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2F2ZWRWaWV3cy9nZW5lcmFsJ1xyXG5pbXBvcnQge1xyXG4gIENhbWVyYSxcbiAgQ29kZVhtbCxcbiAgQm9va09wZW4sXG4gIEJveCxcbiAgTGlzdEZpbHRlcixcbiAgU2VhcmNoLFxuICBNZXNzYWdlU3F1YXJlVGV4dCxcbiAgQ2lyY2xlUXVlc3Rpb25NYXJrXG59IGZyb20gJ2x1Y2lkZS12dWUtbmV4dCdcbmltcG9ydCB7IHVzZVZpZXdlclBhbmVsc1V0aWxpdGllcyB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cC9wYW5lbHMnXHJcbmltcG9ydCB0eXBlIHsgQWN0aXZlUGFuZWwgfSBmcm9tICd+L2xpYi92aWV3ZXIvaGVscGVycy9zY2VuZUV4cGxvcmVyJ1xyXG5cclxuLy8gVE9ETzogUmVmYWN0b3IgYWxsIG9mIHRoaXMgZXZlbnQgYnVzaW5lc3MgYW5kIGp1c3QgcmVhZC93cml0ZSBwYW5lbHMgc3RhdGUgZGlyZWN0bHlcclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICBmb3JjZUNsb3NlUGFuZWxzOiBbXVxyXG59PigpXHJcblxyXG5jb25zdCB7IHdpZHRoOiB3aW5kb3dXaWR0aCB9ID0gdXNlV2luZG93U2l6ZSgpXHJcblxyXG5jb25zdCB7IGlzSW50ZXJjb21FbmFibGVkIH0gPSB1c2VJbnRlcmNvbUVuYWJsZWQoKVxyXG5jb25zdCB7IHJlc291cmNlSXRlbXMsIG1vZGVsc0FuZFZlcnNpb25JZHMgfSA9IHVzZUluamVjdGVkVmlld2VyTG9hZGVkUmVzb3VyY2VzKClcclxuY29uc3QgeyByZWdpc3RlclNob3J0Y3V0cywgZ2V0U2hvcnRjdXREaXNwbGF5VGV4dCwgc2hvcnRjdXRzIH0gPSB1c2VWaWV3ZXJTaG9ydGN1dHMoKVxyXG5jb25zdCB7IGlzRW5hYmxlZDogaXNFbWJlZEVuYWJsZWQgfSA9IHVzZUVtYmVkKClcclxuY29uc3QgYnJlYWtwb2ludHMgPSB1c2VCcmVha3BvaW50cyhUYWlsd2luZEJyZWFrcG9pbnRzKVxyXG5jb25zdCBpc01vYmlsZSA9IGJyZWFrcG9pbnRzLnNtYWxsZXIoJ3NtJylcclxuY29uc3QgaXNUYWJsZXQgPSBicmVha3BvaW50cy5zbWFsbGVyKCdsZycpXHJcbmNvbnN0IGlzTGFyZ2VyVGhhbkxnID0gYnJlYWtwb2ludHMuZ3JlYXRlcignbGcnKVxyXG5jb25zdCB7IGdldFRvb2x0aXBQcm9wcyB9ID0gdXNlU21hcnRUb29sdGlwRGVsYXkoKVxyXG5jb25zdCBpc1NhdmVkVmlld3NFbmFibGVkID0gdXNlQXJlU2F2ZWRWaWV3c0VuYWJsZWQoKVxyXG5jb25zdCBpc1dvcmtzcGFjZXNFbmFibGVkID0gdXNlSXNXb3Jrc3BhY2VzRW5hYmxlZCgpXHJcbmNvbnN0IHsgJGludGVyY29tIH0gPSB1c2VOdXh0QXBwKClcclxuY29uc3Qge1xyXG4gIGZpbHRlcnM6IHsgaGFzQW55RmlsdGVyc0FwcGxpZWQgfVxyXG59ID0gdXNlSW5qZWN0ZWRWaWV3ZXJJbnRlcmZhY2VTdGF0ZSgpXHJcbmNvbnN0IHtcclxuICB1aToge1xyXG4gICAgcGFuZWxzOiB7IGFjdGl2ZTogYWN0aXZlUGFuZWwsIG1vZGVsc1N1YlZpZXcgfVxyXG4gIH1cclxufSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG5cclxuY29uc3QgeyBvblBhbmVsQnV0dG9uQ2xpY2sgfSA9IHVzZVZpZXdlclBhbmVsc1V0aWxpdGllcygpXHJcblxyXG5jb25zdCB3aWR0aCA9IHJlZigyNjQpXHJcbmNvbnN0IHBhbmVsRXh0ZW5zaW9uV2lkdGggPSByZWYoaXNNb2JpbGUudmFsdWUgPyAyMDAgOiBpc0xhcmdlclRoYW5MZy52YWx1ZSA/IDMwMCA6IDI1NilcclxuY29uc3Qgc2Nyb2xsYWJsZUNvbnRyb2xzQ29udGFpbmVyID0gcmVmKG51bGwgYXMgTnVsbGFibGU8SFRNTERpdkVsZW1lbnQ+KVxyXG5jb25zdCBoZWlnaHQgPSByZWYoc2Nyb2xsYWJsZUNvbnRyb2xzQ29udGFpbmVyLnZhbHVlPy5jbGllbnRIZWlnaHQpXHJcbmNvbnN0IGlzUmVzaXppbmcgPSByZWYoZmFsc2UpXHJcbmNvbnN0IGlzUGFuZWxFeHRlbnNpb25SZXNpemluZyA9IHJlZihmYWxzZSlcclxuY29uc3QgcmVzaXplSGFuZGxlID0gcmVmKG51bGwpXHJcbmNvbnN0IHBhbmVsRXh0ZW5zaW9uUmVzaXplSGFuZGxlID0gcmVmKG51bGwpXHJcblxyXG5sZXQgc3RhcnRXaWR0aCA9IDBcclxubGV0IHN0YXJ0WCA9IDBcclxubGV0IHN0YXJ0UGFuZWxFeHRlbnNpb25XaWR0aCA9IDBcclxubGV0IHN0YXJ0UGFuZWxFeHRlbnNpb25YID0gMFxyXG5cclxuY29uc3Qgc3RhcnRSZXNpemluZyA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gIGlmIChpc01vYmlsZS52YWx1ZSkgcmV0dXJuXHJcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gIGlzUmVzaXppbmcudmFsdWUgPSB0cnVlXHJcbiAgc3RhcnRYID0gZXZlbnQuY2xpZW50WFxyXG4gIHN0YXJ0V2lkdGggPSB3aWR0aC52YWx1ZVxyXG59XHJcblxyXG5jb25zdCBzdGFydFBhbmVsRXh0ZW5zaW9uUmVzaXppbmcgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICBpZiAoaXNNb2JpbGUudmFsdWUpIHJldHVyblxyXG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICBpc1BhbmVsRXh0ZW5zaW9uUmVzaXppbmcudmFsdWUgPSB0cnVlXHJcbiAgc3RhcnRQYW5lbEV4dGVuc2lvblggPSBldmVudC5jbGllbnRYXHJcbiAgc3RhcnRQYW5lbEV4dGVuc2lvbldpZHRoID0gcGFuZWxFeHRlbnNpb25XaWR0aC52YWx1ZVxyXG59XHJcblxyXG5jb25zdCB0aHJvdHRsZWRIYW5kbGVNb3VzZU1vdmUgPSB1c2VUaHJvdHRsZUZuKChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gIGlmIChpc1Jlc2l6aW5nLnZhbHVlKSB7XHJcbiAgICBjb25zdCBkaWZmWCA9IGV2ZW50LmNsaWVudFggLSBzdGFydFhcclxuICAgIGNvbnN0IG5ld1dpZHRoID0gTWF0aC5tYXgoXHJcbiAgICAgIDI0MCxcclxuICAgICAgTWF0aC5taW4oc3RhcnRXaWR0aCArIGRpZmZYLCBNYXRoLm1pbig0NDAsIHdpbmRvd1dpZHRoLnZhbHVlICogMC41IC0gNjApKVxyXG4gICAgKVxyXG4gICAgd2lkdGgudmFsdWUgPSBuZXdXaWR0aFxyXG4gIH0gZWxzZSBpZiAoaXNQYW5lbEV4dGVuc2lvblJlc2l6aW5nLnZhbHVlKSB7XHJcbiAgICBjb25zdCBkaWZmWCA9IGV2ZW50LmNsaWVudFggLSBzdGFydFBhbmVsRXh0ZW5zaW9uWFxyXG4gICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1heChcclxuICAgICAgMjAwLFxyXG4gICAgICBNYXRoLm1pbihzdGFydFBhbmVsRXh0ZW5zaW9uV2lkdGggKyBkaWZmWCwgTWF0aC5taW4oNDAwLCB3aW5kb3dXaWR0aC52YWx1ZSAqIDAuNCkpXHJcbiAgICApXHJcbiAgICBwYW5lbEV4dGVuc2lvbldpZHRoLnZhbHVlID0gbmV3V2lkdGhcclxuICB9XHJcbn0sIDUwKVxyXG5cclxuaWYgKGltcG9ydC5tZXRhLmNsaWVudCkge1xyXG4gIHVzZVJlc2l6ZU9ic2VydmVyKHNjcm9sbGFibGVDb250cm9sc0NvbnRhaW5lciwgKGVudHJpZXMpID0+IHtcclxuICAgIGNvbnN0IHsgaGVpZ2h0OiBuZXdIZWlnaHQgfSA9IGVudHJpZXNbMF0uY29udGVudFJlY3RcclxuICAgIGhlaWdodC52YWx1ZSA9IG5ld0hlaWdodFxyXG4gIH0pXHJcbiAgdXNlRXZlbnRMaXN0ZW5lcihyZXNpemVIYW5kbGUsICdtb3VzZWRvd24nLCBzdGFydFJlc2l6aW5nKVxyXG4gIHVzZUV2ZW50TGlzdGVuZXIocGFuZWxFeHRlbnNpb25SZXNpemVIYW5kbGUsICdtb3VzZWRvd24nLCBzdGFydFBhbmVsRXh0ZW5zaW9uUmVzaXppbmcpXHJcblxyXG4gIHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aHJvdHRsZWRIYW5kbGVNb3VzZU1vdmUpXHJcblxyXG4gIHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsICdtb3VzZXVwJywgKCkgPT4ge1xyXG4gICAgaWYgKGlzUmVzaXppbmcudmFsdWUpIHtcclxuICAgICAgaXNSZXNpemluZy52YWx1ZSA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICBpZiAoaXNQYW5lbEV4dGVuc2lvblJlc2l6aW5nLnZhbHVlKSB7XHJcbiAgICAgIGlzUGFuZWxFeHRlbnNpb25SZXNpemluZy52YWx1ZSA9IGZhbHNlXHJcbiAgICB9XHJcbiAgfSlcclxufVxyXG5cclxuY29uc3QgaGFzQWN0aXZlUGFuZWwgPSBjb21wdXRlZCgoKSA9PiBhY3RpdmVQYW5lbC52YWx1ZSAhPT0gJ25vbmUnKVxyXG5cclxuY29uc3QgYWxsQXV0b21hdGlvblJ1bnMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgYWxsQXV0b21hdGlvblN0YXR1c2VzID0gbW9kZWxzQW5kVmVyc2lvbklkcy52YWx1ZVxyXG4gICAgLm1hcCgoeyBtb2RlbCB9KSA9PiBtb2RlbC5sb2FkZWRWZXJzaW9uLml0ZW1zWzBdLmF1dG9tYXRpb25zU3RhdHVzKVxyXG4gICAgLmZsYXQoKVxyXG4gICAgLmZpbHRlcihpc05vbk51bGxhYmxlKVxyXG5cclxuICByZXR1cm4gYWxsQXV0b21hdGlvblN0YXR1c2VzLm1hcCgoc3RhdHVzKSA9PiBzdGF0dXMuYXV0b21hdGlvblJ1bnMpLmZsYXQoKVxyXG59KVxyXG5cclxuY29uc3QgYWxsRnVuY3Rpb25SdW5zID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiBhbGxBdXRvbWF0aW9uUnVucy52YWx1ZS5tYXAoKHJ1bikgPT4gcnVuLmZ1bmN0aW9uUnVucykuZmxhdCgpXHJcbn0pXHJcblxyXG5jb25zdCB3aWR0aENsYXNzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChpc01vYmlsZS52YWx1ZSkge1xyXG4gICAgcmV0dXJuICdjYWxjKDEwMHZ3IC0gMy42cmVtKSdcclxuICB9IGVsc2UgaWYgKGlzVGFibGV0LnZhbHVlKSB7XHJcbiAgICByZXR1cm4gJzI0MHB4J1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gYCR7d2lkdGgudmFsdWUgKyA0fXB4YFxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IHBhbmVsRXh0ZW5zaW9uTGVmdCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoaXNNb2JpbGUudmFsdWUgfHwgaXNUYWJsZXQudmFsdWUpIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuICBjb25zdCBtYWluUGFuZWxMZWZ0ID0gaXNFbWJlZEVuYWJsZWQudmFsdWUgPyA1MiA6IDYwXHJcbiAgcmV0dXJuIGAke21haW5QYW5lbExlZnQgKyB3aWR0aC52YWx1ZX1weGBcclxufSlcclxuXHJcbmNvbnN0IHsgc3VtbWFyeSB9ID0gdXNlRnVuY3Rpb25SdW5zU3RhdHVzU3VtbWFyeSh7XHJcbiAgcnVuczogYWxsRnVuY3Rpb25SdW5zXHJcbn0pXHJcblxyXG5yZWdpc3RlclNob3J0Y3V0cyh7XHJcbiAgVG9nZ2xlTW9kZWxzOiAoKSA9PiB0b2dnbGVBY3RpdmVQYW5lbCgnbW9kZWxzJyksXHJcbiAgVG9nZ2xlRmlsdGVyczogKCkgPT4gdG9nZ2xlQWN0aXZlUGFuZWwoJ2ZpbHRlcnMnKSxcclxuICBUb2dnbGVEaXNjdXNzaW9uczogKCkgPT4gdG9nZ2xlQWN0aXZlUGFuZWwoJ2Rpc2N1c3Npb25zJyksXHJcbiAgVG9nZ2xlRGV2TW9kZTogKCkgPT4gdG9nZ2xlQWN0aXZlUGFuZWwoJ2Rldk1vZGUnKSxcclxuICBUb2dnbGVTYXZlZFZpZXdzOiAoKSA9PiBpc1NhdmVkVmlld3NFbmFibGVkICYmIHRvZ2dsZUFjdGl2ZVBhbmVsKCdzYXZlZFZpZXdzJylcclxufSlcclxuXHJcbmNvbnN0IHRvZ2dsZUFjdGl2ZVBhbmVsID0gKHBhbmVsOiBBY3RpdmVQYW5lbCkgPT4ge1xyXG4gIG9uUGFuZWxCdXR0b25DbGljayhwYW5lbClcclxufVxyXG5cclxuY29uc3QgZm9yY2VDbG9zZVBhbmVsID0gKCkgPT4ge1xyXG4gIGFjdGl2ZVBhbmVsLnZhbHVlID0gJ25vbmUnXHJcbn1cclxuXHJcbmNvbnN0IG9wZW5Eb2NzID0gKCkgPT4ge1xyXG4gIHdpbmRvdy5vcGVuKHZpZXdlckRvY3NSb3V0ZSwgJ19ibGFuaycpXHJcbn1cclxuXHJcbmNvbnN0IG9wZW5JbnRlcmNvbUNoYXQgPSAoKSA9PiB7XHJcbiAgaWYgKGlzSW50ZXJjb21FbmFibGVkLnZhbHVlKSB7XHJcbiAgICAkaW50ZXJjb20uc2hvdygpXHJcbiAgfVxyXG59XHJcblxyXG53YXRjaChhY3RpdmVQYW5lbCwgKG5ld1ZhbCwgb2xkVmFsKSA9PiB7XHJcbiAgY29uc3Qgd2FzTm9uZSA9IG9sZFZhbCA9PT0gJ25vbmUnXHJcblxyXG4gIC8vIElmIGEgcGFuZWwgaXMgYmVpbmcgb3BlbmVkIChub3QgY2xvc2VkKSBvbiBtb2JpbGUsIGVtaXQgZXZlbnQgdG8gcGFyZW50XHJcbiAgaWYgKHdhc05vbmUgJiYgbmV3VmFsICE9PSAnbm9uZScgJiYgaXNNb2JpbGUudmFsdWUpIHtcclxuICAgIGVtaXQoJ2ZvcmNlQ2xvc2VQYW5lbHMnKVxyXG4gIH1cclxufSlcclxuXHJcbmRlZmluZUV4cG9zZSh7XHJcbiAgZm9yY2VDbG9zZVBhbmVsLFxyXG4gIGZvcmNlQ2xvc2VQYW5lbHM6IGZvcmNlQ2xvc2VQYW5lbFxyXG59KVxyXG48L3NjcmlwdD5cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2NvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0xlZnQudnVlIn0=