import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/filters/Panel.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/filters/LogicSelector.vue"; import { default as __nuxt_component_1 } from "/_nuxt/components/viewer/filters/filter/Card.vue"; import { default as __nuxt_component_2 } from "/_nuxt/components/viewer/filters/filter/EmptyState.vue"; import { default as __nuxt_component_3 } from "/_nuxt/components/viewer/filters/property-selection/Panel.vue"; import { default as __nuxt_component_4 } from "/_nuxt/components/viewer/filters/LargePropertyWarningDialog.vue"; import { default as __nuxt_component_5 } from "/_nuxt/components/viewer/layout/SidePanel.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createBlock as __createBlock,createVNode as __createVNode,createElementVNode as __createElementVNode,createElementBlock as __createElementBlock } 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 _createBlock(...args) { return _interopVNode(__createBlock(...args)) } function _createVNode(...args) { return _interopVNode(__createVNode(...args)) } function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) } function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...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 { useInjectedViewerInterfaceState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { FilterType } from "/_nuxt/lib/viewer/helpers/filters/types.ts"; import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts"; import { X, Plus } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29"; import { FormButton } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { useFilterUtilities } from "/_nuxt/lib/viewer/composables/filtering/filtering.ts"; import { onKeyStroke, onClickOutside } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29"; import { useFilteredObjectsCount } from "/_nuxt/lib/viewer/composables/filtering/counts.ts"; import { ref, computed, watch, nextTick } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ViewerFiltersPanel", setup(__props, { expose: __expose }) { __expose(); const { filters: { propertyFilters }, getPropertyOptionsFromDataStore, addActiveFilter, updateFilterProperty, resetFilters, isLargeProperty } = useFilterUtilities(); const { filteredObjectsCount } = useFilteredObjectsCount(); const mp = useMixpanel(); const { filters: { hasAnyFiltersApplied } } = useInjectedViewerInterfaceState(); const showPropertySelection = ref(false); const propertySelectionRef = ref(); const swappingFilterId = ref(null); const filtersContainerRef = ref(); const shouldScrollToNewFilter = ref(false); const showLargePropertyWarning = ref(false); const pendingProperty = ref(null); const propertySelectOptions = computed(() => { if (!showPropertySelection.value) { return []; } const existingFilterKeys = new Set( propertyFilters.value.map((f) => f.filter?.key).filter(Boolean) ); const relevantFilters = getPropertyOptionsFromDataStore(); const allOptions = relevantFilters.filter((filter) => !existingFilterKeys.has(filter.key)).map((filter) => { const lastDotIndex = filter.key.lastIndexOf("."); let propertyName = lastDotIndex === -1 ? filter.key : filter.key.slice(lastDotIndex + 1); let parentPath = lastDotIndex === -1 ? "" : filter.key.slice(0, lastDotIndex).replace(/\./g, " › "); if (propertyName === "value" && lastDotIndex !== -1) { const valueParentPath = filter.key.slice(0, lastDotIndex); const valueParentLastDot = valueParentPath.lastIndexOf("."); propertyName = valueParentLastDot === -1 ? valueParentPath : valueParentPath.slice(valueParentLastDot + 1); parentPath = valueParentLastDot === -1 ? "" : valueParentPath.slice(0, valueParentLastDot).replace(/\./g, " › "); } return { value: filter.key, label: propertyName, parentPath, type: filter.type === "number" ? FilterType.Numeric : filter.type === "boolean" ? FilterType.Boolean : FilterType.String, hasParent: parentPath !== "" }; }); const sortedOptions = allOptions.sort((a, b) => { if (a.hasParent !== b.hasParent) { return a.hasParent ? 1 : -1; } if (a.hasParent && b.hasParent) { const parentComparison = a.parentPath.localeCompare(b.parentPath); if (parentComparison !== 0) return parentComparison; } return a.label.localeCompare(b.label); }); return sortedOptions; }); const addNewEmptyFilter = () => { swappingFilterId.value = null; showPropertySelection.value = true; mp.track("Viewer Action", { type: "action", name: "filters", action: "open-property-selection" }); }; const startPropertySwap = (filterId) => { swappingFilterId.value = filterId; showPropertySelection.value = true; mp.track("Viewer Action", { type: "action", name: "filters", action: "open-property-swap" }); }; const handleAddFilterClick = () => { if (showPropertySelection.value) { showPropertySelection.value = false; } else { addNewEmptyFilter(); } }; const scrollToNewFilter = () => { if (filtersContainerRef.value) { filtersContainerRef.value.scrollTo({ top: filtersContainerRef.value.scrollHeight, behavior: "smooth" }); } }; const selectProperty = async (propertyKey) => { const relevantFilters = getPropertyOptionsFromDataStore(); const property = relevantFilters.find((p) => p.key === propertyKey); if (!property) { return; } const { isLarge, count } = isLargeProperty(property.key); if (isLarge) { pendingProperty.value = { property, count }; showLargePropertyWarning.value = true; return; } processPropertySelection(property, propertyKey); }; const processPropertySelection = (property, propertyKey) => { if (swappingFilterId.value) { updateFilterProperty(swappingFilterId.value, property); mp.track("Viewer Action", { type: "action", name: "filters", action: "swap-filter-property", value: propertyKey }); } else { shouldScrollToNewFilter.value = true; addActiveFilter(property); mp.track("Viewer Action", { type: "action", name: "filters", action: "add-new-filter", value: propertyKey }); } showPropertySelection.value = false; swappingFilterId.value = null; }; const confirmLargePropertySelection = () => { if (!pendingProperty.value) return; processPropertySelection( pendingProperty.value.property, pendingProperty.value.property.key ); pendingProperty.value = null; }; onKeyStroke("Escape", () => { if (showLargePropertyWarning.value) { showLargePropertyWarning.value = false; showPropertySelection.value = false; swappingFilterId.value = null; pendingProperty.value = null; } else if (showPropertySelection.value) { showPropertySelection.value = false; } }); onClickOutside(propertySelectionRef, () => { if (showPropertySelection.value) { showPropertySelection.value = false; swappingFilterId.value = null; } }); watch( () => propertyFilters.value.length, (newLength, oldLength) => { if (shouldScrollToNewFilter.value && newLength > oldLength) { nextTick(() => { scrollToNewFilter(); shouldScrollToNewFilter.value = false; }); } } ); const __returned__ = { propertyFilters, getPropertyOptionsFromDataStore, addActiveFilter, updateFilterProperty, resetFilters, isLargeProperty, filteredObjectsCount, mp, hasAnyFiltersApplied, showPropertySelection, propertySelectionRef, swappingFilterId, filtersContainerRef, shouldScrollToNewFilter, showLargePropertyWarning, pendingProperty, propertySelectOptions, addNewEmptyFilter, startPropertySwap, handleAddFilterClick, scrollToNewFilter, selectProperty, processPropertySelection, confirmLargePropertySelection, get X() { return X; }, get Plus() { return Plus; }, get FormButton() { return FormButton; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives, resolveComponent as _resolveComponent, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { class: "flex gap-x-0.5 items-center", "data-v-inspector": "components/viewer/filters/Panel.vue:5:7" }; const _hoisted_2 = { class: "flex items-center justify-between pr-0.5", "data-v-inspector": "components/viewer/filters/Panel.vue:26:5" }; const _hoisted_3 = { key: 1, class: "flex items-center pr-4 text-body-3xs text-foreground-2 select-none", "data-v-inspector": "components/viewer/filters/Panel.vue:29:7" }; const _hoisted_4 = { "data-v-inspector": "components/viewer/filters/Panel.vue:33:9" }; const _hoisted_5 = { class: "flex flex-col h-full justify-center select-none group/panel", "data-v-inspector": "components/viewer/filters/Panel.vue:38:5" }; const _hoisted_6 = { key: 0, ref: "filtersContainerRef", class: "flex-1 overflow-y-auto simple-scrollbar", "data-v-inspector": "components/viewer/filters/Panel.vue:39:7" }; const _hoisted_7 = { class: "flex flex-col gap-1 p-2 py-0", "data-v-inspector": "components/viewer/filters/Panel.vue:44:9" }; const _hoisted_8 = { class: "px-2 pb-6 mt-1 h-14", "data-v-inspector": "components/viewer/filters/Panel.vue:53:9" }; const _hoisted_9 = { ref: "propertySelectionRef", class: "h-full", "data-v-inspector": "components/viewer/filters/Panel.vue:72:7" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_ViewerFiltersLogicSelector = __nuxt_component_0; const _component_ViewerFiltersFilterCard = __nuxt_component_1; const _component_ViewerFiltersFilterEmptyState = __nuxt_component_2; const _component_ViewerFiltersPropertySelectionPanel = __nuxt_component_3; const _component_Portal = _resolveComponent("Portal"); const _component_ViewerFiltersLargePropertyWarningDialog = __nuxt_component_4; const _component_ViewerLayoutSidePanel = __nuxt_component_5; const _directive_tippy = _resolveDirective("tippy"); return _openBlock(), _createBlock(_component_ViewerLayoutSidePanel, { "max-height-class": "max-h-[calc(100dvh-5rem)]", "disable-scrollbar": "", "data-v-inspector": "components/viewer/filters/Panel.vue:2:3" }, { title: _withCtx(() => [..._cache[2] || (_cache[2] = [ _createTextVNode( "Filters", -1 /* CACHED */ ) ])]), actions: _withCtx(() => [ _createElementVNode("div", _hoisted_1, [ $setup.hasAnyFiltersApplied ? (_openBlock(), _createBlock($setup["FormButton"], { key: 0, size: "sm", color: "subtle", tabindex: "-1", onClick: _cache[0] || (_cache[0] = ($event) => $setup.resetFilters()), "data-v-inspector": "components/viewer/filters/Panel.vue:6:9" }, { default: _withCtx(() => [..._cache[3] || (_cache[3] = [ _createTextVNode( " Reset ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ })) : _createCommentVNode("v-if", true), _withDirectives(_createVNode($setup["FormButton"], { color: "subtle", size: "sm", class: _normalizeClass($setup.showPropertySelection ? "!bg-highlight-3 !pointer-events-none" : ""), "hide-text": "", "icon-left": $setup.showPropertySelection ? $setup.X : $setup.Plus, onClick: $setup.handleAddFilterClick, "data-v-inspector": "components/viewer/filters/Panel.vue:15:9" }, null, 8, ["class", "icon-left"]), [ [_directive_tippy, $setup.showPropertySelection ? void 0 : "Add new filter"] ]) ]) ]), default: _withCtx(() => [ _createElementVNode("div", _hoisted_2, [ $setup.propertyFilters.length > 0 ? (_openBlock(), _createBlock(_component_ViewerFiltersLogicSelector, { key: 0, "data-v-inspector": "components/viewer/filters/Panel.vue:27:7" })) : _createCommentVNode("v-if", true), $setup.propertyFilters.length > 0 ? (_openBlock(), _createElementBlock("div", _hoisted_3, [ _createElementVNode( "span", _hoisted_4, _toDisplayString($setup.filteredObjectsCount) + " result" + _toDisplayString($setup.filteredObjectsCount === 1 ? "" : "s"), 1 /* TEXT */ ) ])) : _createCommentVNode("v-if", true) ]), _createElementVNode("div", _hoisted_5, [ $setup.propertyFilters.length > 0 ? (_openBlock(), _createElementBlock( "div", _hoisted_6, [ _createElementVNode("div", _hoisted_7, [ (_openBlock(true), _createElementBlock( _Fragment, null, _renderList($setup.propertyFilters, (filter) => { return _openBlock(), _createBlock(_component_ViewerFiltersFilterCard, { key: filter.id, filter, collapsed: "", onSwapProperty: $setup.startPropertySwap, "data-v-inspector": "components/viewer/filters/Panel.vue:45:11" }, null, 8, ["filter"]); }), 128 /* KEYED_FRAGMENT */ )) ]), _createElementVNode("div", _hoisted_8, [ $setup.propertyFilters.length > 0 ? (_openBlock(), _createBlock($setup["FormButton"], { key: 0, "full-width": "", color: "outline", class: "rounded-xl text-foreground-2 hover:text-foreground !shadow-none", "icon-left": $setup.Plus, "hide-text": "", onClick: $setup.addNewEmptyFilter, "data-v-inspector": "components/viewer/filters/Panel.vue:54:11" }, { default: _withCtx(() => [..._cache[4] || (_cache[4] = [ _createTextVNode( " Add filter ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }, 8, ["icon-left"])) : _createCommentVNode("v-if", true) ]) ], 512 /* NEED_PATCH */ )) : (_openBlock(), _createBlock(_component_ViewerFiltersFilterEmptyState, { key: 1, onAddFilter: $setup.addNewEmptyFilter, "data-v-inspector": "components/viewer/filters/Panel.vue:68:7" })) ]), $setup.showPropertySelection ? (_openBlock(), _createBlock(_component_Portal, { key: 0, to: "panel-extension", "data-v-inspector": "components/viewer/filters/Panel.vue:71:5" }, { default: _withCtx(() => [ _createElementVNode( "div", _hoisted_9, [ _createVNode(_component_ViewerFiltersPropertySelectionPanel, { options: $setup.propertySelectOptions, onSelectProperty: $setup.selectProperty, "data-v-inspector": "components/viewer/filters/Panel.vue:73:9" }, null, 8, ["options"]) ], 512 /* NEED_PATCH */ ) ]), _: 1 /* STABLE */ })) : _createCommentVNode("v-if", true), _createVNode(_component_ViewerFiltersLargePropertyWarningDialog, { open: $setup.showLargePropertyWarning, "onUpdate:open": _cache[1] || (_cache[1] = ($event) => $setup.showLargePropertyWarning = $event), count: $setup.pendingProperty?.count, onConfirm: $setup.confirmLargePropertySelection, "data-v-inspector": "components/viewer/filters/Panel.vue:80:5" }, null, 8, ["open", "count"]) ]), _: 1 /* STABLE */ }); } _sfc_main.__hmrId = "618b7277"; 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/filters/Panel.vue"]]); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdGQSxTQUFTLHVDQUF1QztBQUtoRCxTQUFTLGtCQUFrQjtBQUMzQixTQUFTLG1CQUFtQjtBQUM1QixTQUFTLEdBQUcsWUFBWTtBQUN4QixTQUFTLGtCQUFrQjtBQUMzQixTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLGFBQWEsc0JBQXNCO0FBQzVDLFNBQVMsK0JBQStCOzs7Ozs7O0FBR3hDLFVBQU07QUFBQSxNQUNKLFNBQVMsRUFBRSxnQkFBZ0I7QUFBQSxNQUMzQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLElBQUksbUJBQW1CO0FBRXZCLFVBQU0sRUFBRSxxQkFBcUIsSUFBSSx3QkFBd0I7QUFDekQsVUFBTSxLQUFLLFlBQVk7QUFDdkIsVUFBTTtBQUFBLE1BQ0osU0FBUyxFQUFFLHFCQUFxQjtBQUFBLElBQ2xDLElBQUksZ0NBQWdDO0FBRXBDLFVBQU0sd0JBQXdCLElBQUksS0FBSztBQUN2QyxVQUFNLHVCQUF1QixJQUFpQjtBQUM5QyxVQUFNLG1CQUFtQixJQUFzQixJQUFJO0FBQ25ELFVBQU0sc0JBQXNCLElBQWlCO0FBQzdDLFVBQU0sMEJBQTBCLElBQUksS0FBSztBQUV6QyxVQUFNLDJCQUEyQixJQUFJLEtBQUs7QUFDMUMsVUFBTSxrQkFDSixJQUFpRSxJQUFJO0FBRXZFLFVBQU0sd0JBQXdCLFNBQVMsTUFBOEI7QUFDbkUsVUFBSSxDQUFDLHNCQUFzQixPQUFPO0FBQ2hDLGVBQU8sQ0FBQztBQUFBLE1BQ1Y7QUFFQSxZQUFNLHFCQUFxQixJQUFJO0FBQUEsUUFDN0IsZ0JBQWdCLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEdBQUcsRUFBRSxPQUFPLE9BQU87QUFBQSxNQUNoRTtBQUVBLFlBQU0sa0JBQWtCLGdDQUFnQztBQUV4RCxZQUFNLGFBQXFDLGdCQUN4QyxPQUFPLENBQUMsV0FBVyxDQUFDLG1CQUFtQixJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQ3RELElBQUksQ0FBQyxXQUFXO0FBQ2YsY0FBTSxlQUFlLE9BQU8sSUFBSSxZQUFZLEdBQUc7QUFDL0MsWUFBSSxlQUNGLGlCQUFpQixLQUFLLE9BQU8sTUFBTSxPQUFPLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEUsWUFBSSxhQUNGLGlCQUFpQixLQUNiLEtBQ0EsT0FBTyxJQUFJLE1BQU0sR0FBRyxZQUFZLEVBQUUsUUFBUSxPQUFPLEtBQUs7QUFJNUQsWUFBSSxpQkFBaUIsV0FBVyxpQkFBaUIsSUFBSTtBQUNuRCxnQkFBTSxrQkFBa0IsT0FBTyxJQUFJLE1BQU0sR0FBRyxZQUFZO0FBQ3hELGdCQUFNLHFCQUFxQixnQkFBZ0IsWUFBWSxHQUFHO0FBQzFELHlCQUNFLHVCQUF1QixLQUNuQixrQkFDQSxnQkFBZ0IsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRCx1QkFDRSx1QkFBdUIsS0FDbkIsS0FDQSxnQkFBZ0IsTUFBTSxHQUFHLGtCQUFrQixFQUFFLFFBQVEsT0FBTyxLQUFLO0FBQUEsUUFDekU7QUFFQSxlQUFPO0FBQUEsVUFDTCxPQUFPLE9BQU87QUFBQSxVQUNkLE9BQU87QUFBQSxVQUNQO0FBQUEsVUFDQSxNQUNFLE9BQU8sU0FBUyxXQUNaLFdBQVcsVUFDVixPQUE0QixTQUFTLFlBQ3RDLFdBQVcsVUFDWCxXQUFXO0FBQUEsVUFDakIsV0FBVyxlQUFlO0FBQUEsUUFDNUI7QUFBQSxNQUNGLENBQUM7QUFFSCxZQUFNLGdCQUFnQixXQUFXLEtBQUssQ0FBQyxHQUFHLE1BQU07QUFFOUMsWUFBSSxFQUFFLGNBQWMsRUFBRSxXQUFXO0FBQy9CLGlCQUFPLEVBQUUsWUFBWSxJQUFJO0FBQUEsUUFDM0I7QUFHQSxZQUFJLEVBQUUsYUFBYSxFQUFFLFdBQVc7QUFDOUIsZ0JBQU0sbUJBQW1CLEVBQUUsV0FBVyxjQUFjLEVBQUUsVUFBVTtBQUNoRSxjQUFJLHFCQUFxQixFQUFHLFFBQU87QUFBQSxRQUNyQztBQUdBLGVBQU8sRUFBRSxNQUFNLGNBQWMsRUFBRSxLQUFLO0FBQUEsTUFDdEMsQ0FBQztBQUVELGFBQU87QUFBQSxJQUNULENBQUM7QUFFRCxVQUFNLG9CQUFvQixNQUFNO0FBQzlCLHVCQUFpQixRQUFRO0FBQ3pCLDRCQUFzQixRQUFRO0FBRTlCLFNBQUcsTUFBTSxpQkFBaUI7QUFBQSxRQUN4QixNQUFNO0FBQUEsUUFDTixNQUFNO0FBQUEsUUFDTixRQUFRO0FBQUEsTUFDVixDQUFDO0FBQUEsSUFDSDtBQUVBLFVBQU0sb0JBQW9CLENBQUMsYUFBcUI7QUFDOUMsdUJBQWlCLFFBQVE7QUFDekIsNEJBQXNCLFFBQVE7QUFFOUIsU0FBRyxNQUFNLGlCQUFpQjtBQUFBLFFBQ3hCLE1BQU07QUFBQSxRQUNOLE1BQU07QUFBQSxRQUNOLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBRUEsVUFBTSx1QkFBdUIsTUFBTTtBQUNqQyxVQUFJLHNCQUFzQixPQUFPO0FBQy9CLDhCQUFzQixRQUFRO0FBQUEsTUFDaEMsT0FBTztBQUNMLDBCQUFrQjtBQUFBLE1BQ3BCO0FBQUEsSUFDRjtBQUVBLFVBQU0sb0JBQW9CLE1BQU07QUFDOUIsVUFBSSxvQkFBb0IsT0FBTztBQUM3Qiw0QkFBb0IsTUFBTSxTQUFTO0FBQUEsVUFDakMsS0FBSyxvQkFBb0IsTUFBTTtBQUFBLFVBQy9CLFVBQVU7QUFBQSxRQUNaLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUVBLFVBQU0saUJBQWlCLE9BQU8sZ0JBQXdCO0FBQ3BELFlBQU0sa0JBQWtCLGdDQUFnQztBQUN4RCxZQUFNLFdBQVcsZ0JBQWdCLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxXQUFXO0FBRWxFLFVBQUksQ0FBQyxVQUFVO0FBQ2I7QUFBQSxNQUNGO0FBR0EsWUFBTSxFQUFFLFNBQVMsTUFBTSxJQUFJLGdCQUFnQixTQUFTLEdBQUc7QUFFdkQsVUFBSSxTQUFTO0FBRVgsd0JBQWdCLFFBQVEsRUFBRSxVQUFVLE1BQU07QUFDMUMsaUNBQXlCLFFBQVE7QUFDakM7QUFBQSxNQUNGO0FBRUEsK0JBQXlCLFVBQVUsV0FBVztBQUFBLElBQ2hEO0FBRUEsVUFBTSwyQkFBMkIsQ0FDL0IsVUFDQSxnQkFDRztBQUNILFVBQUksaUJBQWlCLE9BQU87QUFDMUIsNkJBQXFCLGlCQUFpQixPQUFPLFFBQVE7QUFDckQsV0FBRyxNQUFNLGlCQUFpQjtBQUFBLFVBQ3hCLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxRQUNULENBQUM7QUFBQSxNQUNILE9BQU87QUFFTCxnQ0FBd0IsUUFBUTtBQUNoQyx3QkFBZ0IsUUFBUTtBQUN4QixXQUFHLE1BQU0saUJBQWlCO0FBQUEsVUFDeEIsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sUUFBUTtBQUFBLFVBQ1IsT0FBTztBQUFBLFFBQ1QsQ0FBQztBQUFBLE1BQ0g7QUFDQSw0QkFBc0IsUUFBUTtBQUM5Qix1QkFBaUIsUUFBUTtBQUFBLElBQzNCO0FBRUEsVUFBTSxnQ0FBZ0MsTUFBTTtBQUMxQyxVQUFJLENBQUMsZ0JBQWdCLE1BQU87QUFFNUI7QUFBQSxRQUNFLGdCQUFnQixNQUFNO0FBQUEsUUFDdEIsZ0JBQWdCLE1BQU0sU0FBUztBQUFBLE1BQ2pDO0FBQ0Esc0JBQWdCLFFBQVE7QUFBQSxJQUMxQjtBQUVBLGdCQUFZLFVBQVUsTUFBTTtBQUMxQixVQUFJLHlCQUF5QixPQUFPO0FBQ2xDLGlDQUF5QixRQUFRO0FBQ2pDLDhCQUFzQixRQUFRO0FBQzlCLHlCQUFpQixRQUFRO0FBQ3pCLHdCQUFnQixRQUFRO0FBQUEsTUFDMUIsV0FBVyxzQkFBc0IsT0FBTztBQUN0Qyw4QkFBc0IsUUFBUTtBQUFBLE1BQ2hDO0FBQUEsSUFDRixDQUFDO0FBRUQsbUJBQWUsc0JBQXNCLE1BQU07QUFDekMsVUFBSSxzQkFBc0IsT0FBTztBQUMvQiw4QkFBc0IsUUFBUTtBQUM5Qix5QkFBaUIsUUFBUTtBQUFBLE1BQzNCO0FBQUEsSUFDRixDQUFDO0FBR0Q7QUFBQSxNQUNFLE1BQU0sZ0JBQWdCLE1BQU07QUFBQSxNQUM1QixDQUFDLFdBQVcsY0FBYztBQUN4QixZQUFJLHdCQUF3QixTQUFTLFlBQVksV0FBVztBQUMxRCxtQkFBUyxNQUFNO0FBQ2IsOEJBQWtCO0FBQ2xCLG9DQUF3QixRQUFRO0FBQUEsVUFDbEMsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNGO0FBQUEsSUFDRjs7Ozs7Ozs7Ozs7Ozs7RUFoVVcsT0FBTTtBQUFBLEVBQThCLG9CQUFpQjs7O0VBcUJ2RCxPQUFNO0FBQUEsRUFBMkMsb0JBQWlCOzs7O0VBS25FLE9BQU07QUFBQSxFQUFxRSxvQkFBaUI7O3FCQUV0RixvQkFBaUIsMkNBQTBDOztFQUtoRSxPQUFNO0FBQUEsRUFBOEQsb0JBQWlCOzs7O0VBR3RGLEtBQUk7QUFBQSxFQUNKLE9BQU07QUFBQSxFQUEwQyxvQkFBaUI7OztFQUU1RCxPQUFNO0FBQUEsRUFBK0Isb0JBQWlCOzs7RUFTdEQsT0FBTTtBQUFBLEVBQXNCLG9CQUFpQjs7O0VBbUIvQyxLQUFJO0FBQUEsRUFBdUIsT0FBTTtBQUFBLEVBQVMsb0JBQWlCOzs7Ozs7Ozs7Ozt1QkF0RXBFLGFBbUZ3QjtBQUFBLElBbkZELG9CQUFpQjtBQUFBLElBQTRCO0FBQUEsSUFBa0Isb0JBQWlCO0FBQUE7SUFDMUYsT0FBSyxTQUFDLE1BQU87QUFBQTtRQUFQO0FBQUEsUUFBTztBQUFBO0FBQUE7QUFBQTtJQUNiLFNBQU8sU0FDaEIsTUFtQk07QUFBQSxNQW5CTixvQkFtQk0sT0FuQk4sWUFtQk07QUFBQSxRQWpCSSw2Q0FEUixhQVFhO0FBQUE7VUFOWCxNQUFLO0FBQUEsVUFDTCxPQUFNO0FBQUEsVUFDTixVQUFTO0FBQUEsVUFDUixTQUFLLHNDQUFFLG9CQUFZO0FBQUEsVUFBSSxvQkFBaUI7QUFBQTs0QkFDMUMsTUFFRDtBQUFBO2NBRkM7QUFBQSxjQUVEO0FBQUE7QUFBQTtBQUFBOzs7O3dCQUNBLGFBUUU7QUFBQSxVQU5BLE9BQU07QUFBQSxVQUNOLE1BQUs7QUFBQSxVQUNKLE9BQUssZ0JBQUUsK0JBQXFCO0FBQUEsVUFDN0I7QUFBQSxVQUNDLGFBQVcsK0JBQXdCLFdBQUk7QUFBQSxVQUN2QyxTQUFPO0FBQUEsVUFBc0Isb0JBQWlCO0FBQUE7NkJBTnRDLCtCQUF3QixTQUFTO0FBQUE7OztzQkFVaEQsTUFXTTtBQUFBLE1BWE4sb0JBV00sT0FYTixZQVdNO0FBQUEsUUFWOEIsdUJBQWdCLFNBQU0sbUJBQXhELGFBQTRIO0FBQUE7VUFBOUQsb0JBQWlCO0FBQUE7UUFHdkUsdUJBQWdCLFNBQU0sbUJBRDlCLG9CQU9NLE9BUE4sWUFPTTtBQUFBLFVBSEo7QUFBQSxZQUVPO0FBQUEsWUFGUDtBQUFBLFlBRU8saUJBREYsMkJBQW9CLElBQUcsWUFBTyxpQkFBRyxnQ0FBb0I7QUFBQTtBQUFBO0FBQUE7QUFBQTs7TUFJOUQsb0JBK0JNLE9BL0JOLFlBK0JNO0FBQUEsUUE3QkksdUJBQWdCLFNBQU0sbUJBRDlCO0FBQUEsVUEyQk07QUFBQSxVQTNCTjtBQUFBLFVBMkJNO0FBQUEsWUF0Qkosb0JBUU0sT0FSTixZQVFNO0FBQUEsaUNBUEo7QUFBQSxnQkFNRTtBQUFBO0FBQUEsNEJBTGlCLHdCQUFlLENBQXpCLFdBQU07dUNBRGYsYUFNRTtBQUFBLG9CQUpDLEtBQUssT0FBTztBQUFBLG9CQUNaO0FBQUEsb0JBQ0Q7QUFBQSxvQkFDQyxnQkFBZTtBQUFBLG9CQUFtQixvQkFBaUI7QUFBQTs7Ozs7O1lBR3hELG9CQVlNLE9BWk4sWUFZTTtBQUFBLGNBVkksdUJBQWdCLFNBQU0sbUJBRDlCLGFBVWE7QUFBQTtnQkFSWDtBQUFBLGdCQUNBLE9BQU07QUFBQSxnQkFDTixPQUFNO0FBQUEsZ0JBQ0wsYUFBVztBQUFBLGdCQUNaO0FBQUEsZ0JBQ0MsU0FBTztBQUFBLGdCQUFtQixvQkFBaUI7QUFBQTtrQ0FDN0MsTUFFRDtBQUFBO29CQUZDO0FBQUEsb0JBRUQ7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7OzRCQUlKLGFBQW9JO0FBQUE7VUFBN0YsYUFBWTtBQUFBLFVBQW1CLG9CQUFpQjtBQUFBOztNQUczRSw4Q0FBZCxhQU9TO0FBQUE7UUFQNEIsSUFBRztBQUFBLFFBQWtCLG9CQUFpQjtBQUFBOzBCQUN6RSxNQUtNO0FBQUEsVUFMTjtBQUFBLFlBS007QUFBQSxZQUxOO0FBQUEsWUFLTTtBQUFBLGNBSkosYUFHRTtBQUFBLGdCQUZDLFNBQVM7QUFBQSxnQkFDVCxrQkFBaUI7QUFBQSxnQkFBZ0Isb0JBQWlCO0FBQUE7Ozs7Ozs7OztNQUt6RCxhQUlFO0FBQUEsUUFIUSxNQUFNO0FBQUEsaUdBQXdCO0FBQUEsUUFDckMsT0FBTyx3QkFBaUI7QUFBQSxRQUN4QixXQUFTO0FBQUEsUUFBK0Isb0JBQWlCO0FBQUEiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIlBhbmVsLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcbiAgPFZpZXdlckxheW91dFNpZGVQYW5lbCBtYXgtaGVpZ2h0LWNsYXNzPVwibWF4LWgtW2NhbGMoMTAwZHZoLTVyZW0pXVwiIGRpc2FibGUtc2Nyb2xsYmFyIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZToyOjNcIj5cclxuICAgIDx0ZW1wbGF0ZSAjdGl0bGU+RmlsdGVyczwvdGVtcGxhdGU+XHJcbiAgICA8dGVtcGxhdGUgI2FjdGlvbnM+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC14LTAuNSBpdGVtcy1jZW50ZXJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvZmlsdGVycy9QYW5lbC52dWU6NTo3XCI+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIHYtaWY9XCJoYXNBbnlGaWx0ZXJzQXBwbGllZFwiXHJcbiAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXHJcbiAgICAgICAgICBAY2xpY2s9XCJyZXNldEZpbHRlcnMoKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZTo2OjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIFJlc2V0XHJcbiAgICAgICAgPC9Gb3JtQnV0dG9uPlxyXG4gICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICB2LXRpcHB5PVwic2hvd1Byb3BlcnR5U2VsZWN0aW9uID8gdW5kZWZpbmVkIDogJ0FkZCBuZXcgZmlsdGVyJ1wiXHJcbiAgICAgICAgICBjb2xvcj1cInN1YnRsZVwiXHJcbiAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgOmNsYXNzPVwic2hvd1Byb3BlcnR5U2VsZWN0aW9uID8gJyFiZy1oaWdobGlnaHQtMyAhcG9pbnRlci1ldmVudHMtbm9uZScgOiAnJ1wiXHJcbiAgICAgICAgICBoaWRlLXRleHRcclxuICAgICAgICAgIDppY29uLWxlZnQ9XCJzaG93UHJvcGVydHlTZWxlY3Rpb24gPyBYIDogUGx1c1wiXHJcbiAgICAgICAgICBAY2xpY2s9XCJoYW5kbGVBZGRGaWx0ZXJDbGlja1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZToxNTo5XCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHByLTAuNVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZToyNjo1XCI+XHJcbiAgICAgIDxWaWV3ZXJGaWx0ZXJzTG9naWNTZWxlY3RvciB2LWlmPVwicHJvcGVydHlGaWx0ZXJzLmxlbmd0aCA+IDBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvZmlsdGVycy9QYW5lbC52dWU6Mjc6N1wiIC8+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgdi1pZj1cInByb3BlcnR5RmlsdGVycy5sZW5ndGggPiAwXCJcclxuICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHByLTQgdGV4dC1ib2R5LTN4cyB0ZXh0LWZvcmVncm91bmQtMiBzZWxlY3Qtbm9uZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZToyOTo3XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZTozMzo5XCI+XHJcbiAgICAgICAgICB7eyBmaWx0ZXJlZE9iamVjdHNDb3VudCB9fSByZXN1bHR7eyBmaWx0ZXJlZE9iamVjdHNDb3VudCA9PT0gMSA/ICcnIDogJ3MnIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaC1mdWxsIGp1c3RpZnktY2VudGVyIHNlbGVjdC1ub25lIGdyb3VwL3BhbmVsXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2ZpbHRlcnMvUGFuZWwudnVlOjM4OjVcIj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtaWY9XCJwcm9wZXJ0eUZpbHRlcnMubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgcmVmPVwiZmlsdGVyc0NvbnRhaW5lclJlZlwiXHJcbiAgICAgICAgY2xhc3M9XCJmbGV4LTEgb3ZlcmZsb3cteS1hdXRvIHNpbXBsZS1zY3JvbGxiYXJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvZmlsdGVycy9QYW5lbC52dWU6Mzk6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBwLTIgcHktMFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZTo0NDo5XCI+XHJcbiAgICAgICAgICA8Vmlld2VyRmlsdGVyc0ZpbHRlckNhcmRcclxuICAgICAgICAgICAgdi1mb3I9XCJmaWx0ZXIgaW4gcHJvcGVydHlGaWx0ZXJzXCJcclxuICAgICAgICAgICAgOmtleT1cImZpbHRlci5pZFwiXHJcbiAgICAgICAgICAgIDpmaWx0ZXI9XCJmaWx0ZXJcIlxyXG4gICAgICAgICAgICBjb2xsYXBzZWRcclxuICAgICAgICAgICAgQHN3YXAtcHJvcGVydHk9XCJzdGFydFByb3BlcnR5U3dhcFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZTo0NToxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIHBiLTYgbXQtMSBoLTE0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2ZpbHRlcnMvUGFuZWwudnVlOjUzOjlcIj5cclxuICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgIHYtaWY9XCJwcm9wZXJ0eUZpbHRlcnMubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICAgIGZ1bGwtd2lkdGhcclxuICAgICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXhsIHRleHQtZm9yZWdyb3VuZC0yIGhvdmVyOnRleHQtZm9yZWdyb3VuZCAhc2hhZG93LW5vbmVcIlxyXG4gICAgICAgICAgICA6aWNvbi1sZWZ0PVwiUGx1c1wiXHJcbiAgICAgICAgICAgIGhpZGUtdGV4dFxyXG4gICAgICAgICAgICBAY2xpY2s9XCJhZGROZXdFbXB0eUZpbHRlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZTo1NDoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIEFkZCBmaWx0ZXJcclxuICAgICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8Vmlld2VyRmlsdGVyc0ZpbHRlckVtcHR5U3RhdGUgdi1lbHNlIEBhZGQtZmlsdGVyPVwiYWRkTmV3RW1wdHlGaWx0ZXJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvZmlsdGVycy9QYW5lbC52dWU6Njg6N1wiIC8+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8UG9ydGFsIHYtaWY9XCJzaG93UHJvcGVydHlTZWxlY3Rpb25cIiB0bz1cInBhbmVsLWV4dGVuc2lvblwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZTo3MTo1XCI+XHJcbiAgICAgIDxkaXYgcmVmPVwicHJvcGVydHlTZWxlY3Rpb25SZWZcIiBjbGFzcz1cImgtZnVsbFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZTo3Mjo3XCI+XHJcbiAgICAgICAgPFZpZXdlckZpbHRlcnNQcm9wZXJ0eVNlbGVjdGlvblBhbmVsXHJcbiAgICAgICAgICA6b3B0aW9ucz1cInByb3BlcnR5U2VsZWN0T3B0aW9uc1wiXHJcbiAgICAgICAgICBAc2VsZWN0LXByb3BlcnR5PVwic2VsZWN0UHJvcGVydHlcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvZmlsdGVycy9QYW5lbC52dWU6NzM6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L1BvcnRhbD5cclxuXHJcbiAgICA8Vmlld2VyRmlsdGVyc0xhcmdlUHJvcGVydHlXYXJuaW5nRGlhbG9nXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dMYXJnZVByb3BlcnR5V2FybmluZ1wiXHJcbiAgICAgIDpjb3VudD1cInBlbmRpbmdQcm9wZXJ0eT8uY291bnRcIlxyXG4gICAgICBAY29uZmlybT1cImNvbmZpcm1MYXJnZVByb3BlcnR5U2VsZWN0aW9uXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2ZpbHRlcnMvUGFuZWwudnVlOjgwOjVcIlxyXG4gICAgLz5cclxuICA8L1ZpZXdlckxheW91dFNpZGVQYW5lbD5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IHVzZUluamVjdGVkVmlld2VySW50ZXJmYWNlU3RhdGUgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgUHJvcGVydHlTZWxlY3RPcHRpb24sXHJcbiAgRXh0ZW5kZWRQcm9wZXJ0eUluZm9cclxufSBmcm9tICd+L2xpYi92aWV3ZXIvaGVscGVycy9maWx0ZXJzL3R5cGVzJ1xyXG5pbXBvcnQgeyBGaWx0ZXJUeXBlIH0gZnJvbSAnfi9saWIvdmlld2VyL2hlbHBlcnMvZmlsdGVycy90eXBlcydcclxuaW1wb3J0IHsgdXNlTWl4cGFuZWwgfSBmcm9tICd+fi9saWIvY29yZS9jb21wb3NhYmxlcy9tcCdcclxuaW1wb3J0IHsgWCwgUGx1cyB9IGZyb20gJ2x1Y2lkZS12dWUtbmV4dCdcclxuaW1wb3J0IHsgRm9ybUJ1dHRvbiB9IGZyb20gJ0BzcGVja2xlL3VpLWNvbXBvbmVudHMnXHJcbmltcG9ydCB7IHVzZUZpbHRlclV0aWxpdGllcyB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9maWx0ZXJpbmcvZmlsdGVyaW5nJ1xyXG5pbXBvcnQgeyBvbktleVN0cm9rZSwgb25DbGlja091dHNpZGUgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB7IHVzZUZpbHRlcmVkT2JqZWN0c0NvdW50IH0gZnJvbSAnfi9saWIvdmlld2VyL2NvbXBvc2FibGVzL2ZpbHRlcmluZy9jb3VudHMnXHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcblxyXG5jb25zdCB7XHJcbiAgZmlsdGVyczogeyBwcm9wZXJ0eUZpbHRlcnMgfSxcclxuICBnZXRQcm9wZXJ0eU9wdGlvbnNGcm9tRGF0YVN0b3JlLFxyXG4gIGFkZEFjdGl2ZUZpbHRlcixcclxuICB1cGRhdGVGaWx0ZXJQcm9wZXJ0eSxcclxuICByZXNldEZpbHRlcnMsXHJcbiAgaXNMYXJnZVByb3BlcnR5XHJcbn0gPSB1c2VGaWx0ZXJVdGlsaXRpZXMoKVxyXG5cclxuY29uc3QgeyBmaWx0ZXJlZE9iamVjdHNDb3VudCB9ID0gdXNlRmlsdGVyZWRPYmplY3RzQ291bnQoKVxyXG5jb25zdCBtcCA9IHVzZU1peHBhbmVsKClcclxuY29uc3Qge1xyXG4gIGZpbHRlcnM6IHsgaGFzQW55RmlsdGVyc0FwcGxpZWQgfVxyXG59ID0gdXNlSW5qZWN0ZWRWaWV3ZXJJbnRlcmZhY2VTdGF0ZSgpXHJcblxyXG5jb25zdCBzaG93UHJvcGVydHlTZWxlY3Rpb24gPSByZWYoZmFsc2UpXHJcbmNvbnN0IHByb3BlcnR5U2VsZWN0aW9uUmVmID0gcmVmPEhUTUxFbGVtZW50PigpXHJcbmNvbnN0IHN3YXBwaW5nRmlsdGVySWQgPSByZWY8TnVsbGFibGU8c3RyaW5nPj4obnVsbClcclxuY29uc3QgZmlsdGVyc0NvbnRhaW5lclJlZiA9IHJlZjxIVE1MRWxlbWVudD4oKVxyXG5jb25zdCBzaG91bGRTY3JvbGxUb05ld0ZpbHRlciA9IHJlZihmYWxzZSlcclxuXHJcbmNvbnN0IHNob3dMYXJnZVByb3BlcnR5V2FybmluZyA9IHJlZihmYWxzZSlcclxuY29uc3QgcGVuZGluZ1Byb3BlcnR5ID1cclxuICByZWY8TnVsbGFibGU8eyBwcm9wZXJ0eTogRXh0ZW5kZWRQcm9wZXJ0eUluZm87IGNvdW50OiBudW1iZXIgfT4+KG51bGwpXHJcblxyXG5jb25zdCBwcm9wZXJ0eVNlbGVjdE9wdGlvbnMgPSBjb21wdXRlZCgoKTogUHJvcGVydHlTZWxlY3RPcHRpb25bXSA9PiB7XHJcbiAgaWYgKCFzaG93UHJvcGVydHlTZWxlY3Rpb24udmFsdWUpIHtcclxuICAgIHJldHVybiBbXVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZXhpc3RpbmdGaWx0ZXJLZXlzID0gbmV3IFNldChcclxuICAgIHByb3BlcnR5RmlsdGVycy52YWx1ZS5tYXAoKGYpID0+IGYuZmlsdGVyPy5rZXkpLmZpbHRlcihCb29sZWFuKVxyXG4gIClcclxuXHJcbiAgY29uc3QgcmVsZXZhbnRGaWx0ZXJzID0gZ2V0UHJvcGVydHlPcHRpb25zRnJvbURhdGFTdG9yZSgpXHJcblxyXG4gIGNvbnN0IGFsbE9wdGlvbnM6IFByb3BlcnR5U2VsZWN0T3B0aW9uW10gPSByZWxldmFudEZpbHRlcnNcclxuICAgIC5maWx0ZXIoKGZpbHRlcikgPT4gIWV4aXN0aW5nRmlsdGVyS2V5cy5oYXMoZmlsdGVyLmtleSkpXHJcbiAgICAubWFwKChmaWx0ZXIpID0+IHtcclxuICAgICAgY29uc3QgbGFzdERvdEluZGV4ID0gZmlsdGVyLmtleS5sYXN0SW5kZXhPZignLicpXHJcbiAgICAgIGxldCBwcm9wZXJ0eU5hbWUgPVxyXG4gICAgICAgIGxhc3REb3RJbmRleCA9PT0gLTEgPyBmaWx0ZXIua2V5IDogZmlsdGVyLmtleS5zbGljZShsYXN0RG90SW5kZXggKyAxKVxyXG4gICAgICBsZXQgcGFyZW50UGF0aCA9XHJcbiAgICAgICAgbGFzdERvdEluZGV4ID09PSAtMVxyXG4gICAgICAgICAgPyAnJ1xyXG4gICAgICAgICAgOiBmaWx0ZXIua2V5LnNsaWNlKDAsIGxhc3REb3RJbmRleCkucmVwbGFjZSgvXFwuL2csICcg4oC6ICcpXHJcblxyXG4gICAgICAvLyBIYW5kbGUgbmFtZS12YWx1ZSBwYWlycyBieSBjb2xsYXBzaW5nIHRoZW0gdG8ganVzdCB0aGUgdmFsdWVcclxuICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IG5hbWUgZW5kcyB3aXRoICcudmFsdWUnLCB1c2UgdGhlIHBhcmVudCBhcyB0aGUgZGlzcGxheSBuYW1lXHJcbiAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT09ICd2YWx1ZScgJiYgbGFzdERvdEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlUGFyZW50UGF0aCA9IGZpbHRlci5rZXkuc2xpY2UoMCwgbGFzdERvdEluZGV4KVxyXG4gICAgICAgIGNvbnN0IHZhbHVlUGFyZW50TGFzdERvdCA9IHZhbHVlUGFyZW50UGF0aC5sYXN0SW5kZXhPZignLicpXHJcbiAgICAgICAgcHJvcGVydHlOYW1lID1cclxuICAgICAgICAgIHZhbHVlUGFyZW50TGFzdERvdCA9PT0gLTFcclxuICAgICAgICAgICAgPyB2YWx1ZVBhcmVudFBhdGhcclxuICAgICAgICAgICAgOiB2YWx1ZVBhcmVudFBhdGguc2xpY2UodmFsdWVQYXJlbnRMYXN0RG90ICsgMSlcclxuXHJcbiAgICAgICAgcGFyZW50UGF0aCA9XHJcbiAgICAgICAgICB2YWx1ZVBhcmVudExhc3REb3QgPT09IC0xXHJcbiAgICAgICAgICAgID8gJydcclxuICAgICAgICAgICAgOiB2YWx1ZVBhcmVudFBhdGguc2xpY2UoMCwgdmFsdWVQYXJlbnRMYXN0RG90KS5yZXBsYWNlKC9cXC4vZywgJyDigLogJylcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB2YWx1ZTogZmlsdGVyLmtleSxcclxuICAgICAgICBsYWJlbDogcHJvcGVydHlOYW1lLFxyXG4gICAgICAgIHBhcmVudFBhdGgsXHJcbiAgICAgICAgdHlwZTpcclxuICAgICAgICAgIGZpbHRlci50eXBlID09PSAnbnVtYmVyJ1xyXG4gICAgICAgICAgICA/IEZpbHRlclR5cGUuTnVtZXJpY1xyXG4gICAgICAgICAgICA6IChmaWx0ZXIgYXMgeyB0eXBlOiBzdHJpbmcgfSkudHlwZSA9PT0gJ2Jvb2xlYW4nXHJcbiAgICAgICAgICAgID8gRmlsdGVyVHlwZS5Cb29sZWFuXHJcbiAgICAgICAgICAgIDogRmlsdGVyVHlwZS5TdHJpbmcsXHJcbiAgICAgICAgaGFzUGFyZW50OiBwYXJlbnRQYXRoICE9PSAnJ1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICBjb25zdCBzb3J0ZWRPcHRpb25zID0gYWxsT3B0aW9ucy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAvLyBGaXJzdCBzb3J0IGJ5IHdoZXRoZXIgdGhleSBoYXZlIHBhcmVudHMgKG5vLXBhcmVudCBpdGVtcyBmaXJzdClcclxuICAgIGlmIChhLmhhc1BhcmVudCAhPT0gYi5oYXNQYXJlbnQpIHtcclxuICAgICAgcmV0dXJuIGEuaGFzUGFyZW50ID8gMSA6IC0xXHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgYm90aCBoYXZlIHBhcmVudHMsIHNvcnQgYnkgcGFyZW50IHBhdGggZmlyc3RcclxuICAgIGlmIChhLmhhc1BhcmVudCAmJiBiLmhhc1BhcmVudCkge1xyXG4gICAgICBjb25zdCBwYXJlbnRDb21wYXJpc29uID0gYS5wYXJlbnRQYXRoLmxvY2FsZUNvbXBhcmUoYi5wYXJlbnRQYXRoKVxyXG4gICAgICBpZiAocGFyZW50Q29tcGFyaXNvbiAhPT0gMCkgcmV0dXJuIHBhcmVudENvbXBhcmlzb25cclxuICAgIH1cclxuXHJcbiAgICAvLyBGaW5hbGx5IHNvcnQgYnkgbGFiZWxcclxuICAgIHJldHVybiBhLmxhYmVsLmxvY2FsZUNvbXBhcmUoYi5sYWJlbClcclxuICB9KVxyXG5cclxuICByZXR1cm4gc29ydGVkT3B0aW9uc1xyXG59KVxyXG5cclxuY29uc3QgYWRkTmV3RW1wdHlGaWx0ZXIgPSAoKSA9PiB7XHJcbiAgc3dhcHBpbmdGaWx0ZXJJZC52YWx1ZSA9IG51bGxcclxuICBzaG93UHJvcGVydHlTZWxlY3Rpb24udmFsdWUgPSB0cnVlXHJcblxyXG4gIG1wLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywge1xyXG4gICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICBuYW1lOiAnZmlsdGVycycsXHJcbiAgICBhY3Rpb246ICdvcGVuLXByb3BlcnR5LXNlbGVjdGlvbidcclxuICB9KVxyXG59XHJcblxyXG5jb25zdCBzdGFydFByb3BlcnR5U3dhcCA9IChmaWx0ZXJJZDogc3RyaW5nKSA9PiB7XHJcbiAgc3dhcHBpbmdGaWx0ZXJJZC52YWx1ZSA9IGZpbHRlcklkXHJcbiAgc2hvd1Byb3BlcnR5U2VsZWN0aW9uLnZhbHVlID0gdHJ1ZVxyXG5cclxuICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgbmFtZTogJ2ZpbHRlcnMnLFxyXG4gICAgYWN0aW9uOiAnb3Blbi1wcm9wZXJ0eS1zd2FwJ1xyXG4gIH0pXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZUFkZEZpbHRlckNsaWNrID0gKCkgPT4ge1xyXG4gIGlmIChzaG93UHJvcGVydHlTZWxlY3Rpb24udmFsdWUpIHtcclxuICAgIHNob3dQcm9wZXJ0eVNlbGVjdGlvbi52YWx1ZSA9IGZhbHNlXHJcbiAgfSBlbHNlIHtcclxuICAgIGFkZE5ld0VtcHR5RmlsdGVyKClcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHNjcm9sbFRvTmV3RmlsdGVyID0gKCkgPT4ge1xyXG4gIGlmIChmaWx0ZXJzQ29udGFpbmVyUmVmLnZhbHVlKSB7XHJcbiAgICBmaWx0ZXJzQ29udGFpbmVyUmVmLnZhbHVlLnNjcm9sbFRvKHtcclxuICAgICAgdG9wOiBmaWx0ZXJzQ29udGFpbmVyUmVmLnZhbHVlLnNjcm9sbEhlaWdodCxcclxuICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuY29uc3Qgc2VsZWN0UHJvcGVydHkgPSBhc3luYyAocHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IHJlbGV2YW50RmlsdGVycyA9IGdldFByb3BlcnR5T3B0aW9uc0Zyb21EYXRhU3RvcmUoKVxyXG4gIGNvbnN0IHByb3BlcnR5ID0gcmVsZXZhbnRGaWx0ZXJzLmZpbmQoKHApID0+IHAua2V5ID09PSBwcm9wZXJ0eUtleSlcclxuXHJcbiAgaWYgKCFwcm9wZXJ0eSkge1xyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICAvLyBDaGVjayBpZiB0aGlzIHByb3BlcnR5IGhhcyB0b28gbWFueSB1bmlxdWUgdmFsdWVzXHJcbiAgY29uc3QgeyBpc0xhcmdlLCBjb3VudCB9ID0gaXNMYXJnZVByb3BlcnR5KHByb3BlcnR5LmtleSlcclxuXHJcbiAgaWYgKGlzTGFyZ2UpIHtcclxuICAgIC8vIFN0b3JlIHRoZSBwZW5kaW5nIHByb3BlcnR5IGFuZCBzaG93IHdhcm5pbmdcclxuICAgIHBlbmRpbmdQcm9wZXJ0eS52YWx1ZSA9IHsgcHJvcGVydHksIGNvdW50IH1cclxuICAgIHNob3dMYXJnZVByb3BlcnR5V2FybmluZy52YWx1ZSA9IHRydWVcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc1Byb3BlcnR5U2VsZWN0aW9uKHByb3BlcnR5LCBwcm9wZXJ0eUtleSlcclxufVxyXG5cclxuY29uc3QgcHJvY2Vzc1Byb3BlcnR5U2VsZWN0aW9uID0gKFxyXG4gIHByb3BlcnR5OiBFeHRlbmRlZFByb3BlcnR5SW5mbyxcclxuICBwcm9wZXJ0eUtleTogc3RyaW5nXHJcbikgPT4ge1xyXG4gIGlmIChzd2FwcGluZ0ZpbHRlcklkLnZhbHVlKSB7XHJcbiAgICB1cGRhdGVGaWx0ZXJQcm9wZXJ0eShzd2FwcGluZ0ZpbHRlcklkLnZhbHVlLCBwcm9wZXJ0eSlcclxuICAgIG1wLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywge1xyXG4gICAgICB0eXBlOiAnYWN0aW9uJyxcclxuICAgICAgbmFtZTogJ2ZpbHRlcnMnLFxyXG4gICAgICBhY3Rpb246ICdzd2FwLWZpbHRlci1wcm9wZXJ0eScsXHJcbiAgICAgIHZhbHVlOiBwcm9wZXJ0eUtleVxyXG4gICAgfSlcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gU2V0IGZsYWcgdG8gc2Nyb2xsIHdoZW4gbmV3IGZpbHRlciBpcyBhZGRlZFxyXG4gICAgc2hvdWxkU2Nyb2xsVG9OZXdGaWx0ZXIudmFsdWUgPSB0cnVlXHJcbiAgICBhZGRBY3RpdmVGaWx0ZXIocHJvcGVydHkpXHJcbiAgICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICAgIG5hbWU6ICdmaWx0ZXJzJyxcclxuICAgICAgYWN0aW9uOiAnYWRkLW5ldy1maWx0ZXInLFxyXG4gICAgICB2YWx1ZTogcHJvcGVydHlLZXlcclxuICAgIH0pXHJcbiAgfVxyXG4gIHNob3dQcm9wZXJ0eVNlbGVjdGlvbi52YWx1ZSA9IGZhbHNlXHJcbiAgc3dhcHBpbmdGaWx0ZXJJZC52YWx1ZSA9IG51bGxcclxufVxyXG5cclxuY29uc3QgY29uZmlybUxhcmdlUHJvcGVydHlTZWxlY3Rpb24gPSAoKSA9PiB7XHJcbiAgaWYgKCFwZW5kaW5nUHJvcGVydHkudmFsdWUpIHJldHVyblxyXG5cclxuICBwcm9jZXNzUHJvcGVydHlTZWxlY3Rpb24oXHJcbiAgICBwZW5kaW5nUHJvcGVydHkudmFsdWUucHJvcGVydHksXHJcbiAgICBwZW5kaW5nUHJvcGVydHkudmFsdWUucHJvcGVydHkua2V5XHJcbiAgKVxyXG4gIHBlbmRpbmdQcm9wZXJ0eS52YWx1ZSA9IG51bGxcclxufVxyXG5cclxub25LZXlTdHJva2UoJ0VzY2FwZScsICgpID0+IHtcclxuICBpZiAoc2hvd0xhcmdlUHJvcGVydHlXYXJuaW5nLnZhbHVlKSB7XHJcbiAgICBzaG93TGFyZ2VQcm9wZXJ0eVdhcm5pbmcudmFsdWUgPSBmYWxzZVxyXG4gICAgc2hvd1Byb3BlcnR5U2VsZWN0aW9uLnZhbHVlID0gZmFsc2VcclxuICAgIHN3YXBwaW5nRmlsdGVySWQudmFsdWUgPSBudWxsXHJcbiAgICBwZW5kaW5nUHJvcGVydHkudmFsdWUgPSBudWxsXHJcbiAgfSBlbHNlIGlmIChzaG93UHJvcGVydHlTZWxlY3Rpb24udmFsdWUpIHtcclxuICAgIHNob3dQcm9wZXJ0eVNlbGVjdGlvbi52YWx1ZSA9IGZhbHNlXHJcbiAgfVxyXG59KVxyXG5cclxub25DbGlja091dHNpZGUocHJvcGVydHlTZWxlY3Rpb25SZWYsICgpID0+IHtcclxuICBpZiAoc2hvd1Byb3BlcnR5U2VsZWN0aW9uLnZhbHVlKSB7XHJcbiAgICBzaG93UHJvcGVydHlTZWxlY3Rpb24udmFsdWUgPSBmYWxzZVxyXG4gICAgc3dhcHBpbmdGaWx0ZXJJZC52YWx1ZSA9IG51bGxcclxuICB9XHJcbn0pXHJcblxyXG4vLyBXYXRjaCBmb3IgbmV3IGZpbHRlcnMgYmVpbmcgYWRkZWQgYW5kIHNjcm9sbCB3aGVuIG5lZWRlZFxyXG53YXRjaChcclxuICAoKSA9PiBwcm9wZXJ0eUZpbHRlcnMudmFsdWUubGVuZ3RoLFxyXG4gIChuZXdMZW5ndGgsIG9sZExlbmd0aCkgPT4ge1xyXG4gICAgaWYgKHNob3VsZFNjcm9sbFRvTmV3RmlsdGVyLnZhbHVlICYmIG5ld0xlbmd0aCA+IG9sZExlbmd0aCkge1xyXG4gICAgICBuZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgc2Nyb2xsVG9OZXdGaWx0ZXIoKVxyXG4gICAgICAgIHNob3VsZFNjcm9sbFRvTmV3RmlsdGVyLnZhbHVlID0gZmFsc2VcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbilcclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZSJ9