import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/selection/KeyValuePair.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/filters/LargePropertyWarningDialog.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createElementVNode as __createElementVNode,createElementBlock as __createElementBlock,createVNode as __createVNode } 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 _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) } function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) } function _createVNode(...args) { return _interopVNode(__createVNode(...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 { VALID_HTTP_URL } from "/_nuxt/lib/common/helpers/validation.ts"; import { LayoutMenu } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { Ellipsis } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29"; import { useFilterUtilities } from "/_nuxt/lib/viewer/composables/filtering/filtering.ts"; import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { isNumericPropertyInfo } from "/_nuxt/lib/viewer/helpers/sceneExplorer.ts"; import { BooleanFilterCondition, NumericFilterCondition } from "/_nuxt/lib/viewer/helpers/filters/types.ts"; import { isBooleanProperty } from "/_nuxt/lib/viewer/helpers/filters/utils.ts"; import { computed, ref } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { useClipboard } from "/_nuxt/composables/browser.ts"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ViewerSelectionKeyValuePair", props: { kvp: { type: Object, required: true } }, setup(__props, { expose: __expose }) { __expose(); const props = __props; const { isKvpFilterable, getFilterDisabledReason, findFilterByKvp, addActiveFilter, updateActiveFilterValues, updateFilterCondition, setNumericRange, isLargeProperty, getPropertyOptionsFromDataStore } = useFilterUtilities(); const { ui: { panels: { active: activePanel } } } = useInjectedViewerState(); const availableFilters = computed( () => getPropertyOptionsFromDataStore() ); const showActionsMenu = ref(false); const showLargePropertyWarning = ref(false); const pendingFilter = ref(null); const pendingFilterCount = ref(0); const isUrlString = (v) => typeof v === "string" && VALID_HTTP_URL.test(v); const isCopyable = computed(() => { return props.kvp.value !== null && props.kvp.value !== void 0 && typeof props.kvp.value !== "object"; }); const isFilterable = computed(() => { if (props.kvp.value === null || props.kvp.value === void 0) { return false; } return isKvpFilterable(props.kvp, availableFilters.value); }); const getDisabledReason = computed(() => { if (props.kvp.value === null || props.kvp.value === void 0) { return "Cannot filter on null values"; } return getFilterDisabledReason(props.kvp, availableFilters.value); }); const handleAddToFilters = (kvp) => { const filter = findFilterByKvp(kvp, availableFilters.value); if (filter && kvp.value !== null && kvp.value !== void 0) { const { isLarge, count } = isLargeProperty(filter.key); if (isLarge) { pendingFilter.value = filter; pendingFilterCount.value = count; showLargePropertyWarning.value = true; return; } addFilterWithValue(filter, kvp); } }; const addFilterWithValue = (filter, kvp) => { const filterId = addActiveFilter(filter); if (isNumericPropertyInfo(filter)) { const numericValue = typeof kvp.value === "number" ? kvp.value : parseFloat(String(kvp.value)); if (!isNaN(numericValue)) { updateFilterCondition(filterId, NumericFilterCondition.IsEqualTo); setNumericRange(filterId, numericValue, numericValue); } } else if (isBooleanProperty(filter)) { const boolValue = kvp.value === true || kvp.value === "true"; const condition = boolValue ? BooleanFilterCondition.IsTrue : BooleanFilterCondition.IsFalse; updateFilterCondition(filterId, condition); } else { const values = [String(kvp.value)]; updateActiveFilterValues(filterId, values); } activePanel.value = "filters"; }; const confirmLargePropertySelection = () => { if (pendingFilter.value) { addFilterWithValue(pendingFilter.value, props.kvp); pendingFilter.value = null; pendingFilterCount.value = 0; } }; const handleCopy = async (kvp) => { const { copy } = useClipboard(); if (isCopyable.value) { await copy(kvp.value, { successMessage: `${kvp.key} copied to clipboard`, failureMessage: `Failed to copy ${kvp.key} to clipboard` }); } }; const actionsItems = computed(() => { return [ [ { title: "Copy value", id: "copy-value", disabled: !isCopyable.value, disabledTooltip: isCopyable.value ? void 0 : "Cannot copy objects, arrays, or null values" } ], [ { title: "Add to filters", id: "add-to-filters", disabled: !isFilterable.value, disabledTooltip: isFilterable.value ? "Add this property to filters" : getDisabledReason.value } ] ]; }); const onActionChosen = (params) => { const { item } = params; if (item.disabled) return; switch (item.id) { case "copy-value": handleCopy(props.kvp); break; case "add-to-filters": handleAddToFilters(props.kvp); break; } }; const __returned__ = { props, isKvpFilterable, getFilterDisabledReason, findFilterByKvp, addActiveFilter, updateActiveFilterValues, updateFilterCondition, setNumericRange, isLargeProperty, getPropertyOptionsFromDataStore, activePanel, availableFilters, showActionsMenu, showLargePropertyWarning, pendingFilter, pendingFilterCount, isUrlString, isCopyable, isFilterable, getDisabledReason, handleAddToFilters, addFilterWithValue, confirmLargePropertySelection, handleCopy, actionsItems, onActionChosen, get LayoutMenu() { return LayoutMenu; }, get Ellipsis() { return Ellipsis; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { toDisplayString as _toDisplayString, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, withModifiers as _withModifiers, withCtx as _withCtx, resolveComponent as _resolveComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { "data-v-inspector": "components/viewer/selection/KeyValuePair.vue:2:3" }; const _hoisted_2 = { class: "flex w-full", "data-v-inspector": "components/viewer/selection/KeyValuePair.vue:3:5" }; const _hoisted_3 = ["title"]; const _hoisted_4 = ["title"]; const _hoisted_5 = { class: "flex gap-1 items-center w-full", "data-v-inspector": "components/viewer/selection/KeyValuePair.vue:19:11" }; const _hoisted_6 = ["href"]; const _hoisted_7 = { key: 2, class: "truncate opacity-70", "data-v-inspector": "components/viewer/selection/KeyValuePair.vue:40:13" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_ViewerFiltersLargePropertyWarningDialog = __nuxt_component_0; return _openBlock(), _createElementBlock("div", _hoisted_1, [ _createElementVNode("div", _hoisted_2, [ _createElementVNode( "div", { class: _normalizeClass(`grid grid-cols-3 w-full pl-2 h-5 items-center ${$props.kvp.value === null || $props.kvp.value === void 0 ? "text-foreground-2" : ""}`), "data-v-inspector": "components/viewer/selection/KeyValuePair.vue:4:7" }, [ _createElementVNode("div", { class: "col-span-1 truncate text-body-3xs mr-2 font-medium text-foreground-2", title: $props.kvp.key, "data-v-inspector": "components/viewer/selection/KeyValuePair.vue:9:9" }, _toDisplayString($props.kvp.key), 9, _hoisted_3), _createElementVNode("div", { class: "group col-span-2 pl-1 truncate text-body-3xs flex gap-1 items-center text-foreground", title: $props.kvp.value, "data-v-inspector": "components/viewer/selection/KeyValuePair.vue:15:9" }, [ _createElementVNode("div", _hoisted_5, [ _createCommentVNode(" NOTE: can't do kvp.value || 'null' because 0 || 'null' = 'null' "), $setup.isUrlString($props.kvp.value) ? (_openBlock(), _createElementBlock("a", { key: 0, href: $props.kvp.value, target: "_blank", rel: "noopener", class: _normalizeClass(["truncate border-b border-outline-3 hover:border-outline-5", $props.kvp.value === null ? "" : "group-hover:max-w-[calc(100%-1rem)]"]), "data-v-inspector": "components/viewer/selection/KeyValuePair.vue:22:15" }, _toDisplayString($props.kvp.value), 11, _hoisted_6)) : (_openBlock(), _createElementBlock( "span", { key: 1, class: _normalizeClass(["truncate", $props.kvp.value === null ? "" : "group-hover:max-w-[calc(100%-1rem)]"]), "data-v-inspector": "components/viewer/selection/KeyValuePair.vue:33:15" }, _toDisplayString($props.kvp.value === null ? "null" : $props.kvp.value), 3 /* TEXT, CLASS */ )), $props.kvp.units ? (_openBlock(), _createElementBlock( "span", _hoisted_7, _toDisplayString($props.kvp.units), 1 /* TEXT */ )) : _createCommentVNode("v-if", true), _createVNode($setup["LayoutMenu"], { open: $setup.showActionsMenu, "onUpdate:open": _cache[1] || (_cache[1] = ($event) => $setup.showActionsMenu = $event), items: $setup.actionsItems, "mount-menu-on-body": "", onClick: _cache[2] || (_cache[2] = _withModifiers(() => { }, ["stop", "prevent"])), onChosen: $setup.onActionChosen, "data-v-inspector": "components/viewer/selection/KeyValuePair.vue:43:13" }, { default: _withCtx(() => [ _createElementVNode( "button", { class: _normalizeClass(["group-hover:opacity-100 hover:bg-highlight-1 rounded h-4 w-4 flex items-center justify-center", $setup.showActionsMenu ? "bg-highlight-1 opacity-100" : "opacity-0"]), onClick: _cache[0] || (_cache[0] = ($event) => $setup.showActionsMenu = !$setup.showActionsMenu), "data-v-inspector": "components/viewer/selection/KeyValuePair.vue:50:15" }, [ _createVNode($setup["Ellipsis"], { class: "h-3 w-3", "data-v-inspector": "components/viewer/selection/KeyValuePair.vue:55:17" }) ], 2 /* CLASS */ ) ]), _: 1 /* STABLE */ }, 8, ["open", "items"]) ]) ], 8, _hoisted_4) ], 2 /* CLASS */ ) ]), _createVNode(_component_ViewerFiltersLargePropertyWarningDialog, { open: $setup.showLargePropertyWarning, "onUpdate:open": _cache[3] || (_cache[3] = ($event) => $setup.showLargePropertyWarning = $event), count: $setup.pendingFilterCount, onConfirm: $setup.confirmLargePropertySelection, "data-v-inspector": "components/viewer/selection/KeyValuePair.vue:63:5" }, null, 8, ["open", "count"]) ]); } _sfc_main.__hmrId = "5bb083b2"; 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/selection/KeyValuePair.vue"]]); //# sourceMappingURL=data:application/json;base64,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aUJBREYsV0FBSSxLQUFLO0FBQUE7QUFBQTtBQUFBO2NBRWQsYUFjYTtBQUFBLGdCQWJILE1BQU07QUFBQSxnR0FBZTtBQUFBLGdCQUM1QixPQUFPO0FBQUEsZ0JBQ1I7QUFBQSxnQkFDQyxTQUFLLHlDQUFOO0FBQUEsbUJBQW1CO0FBQUEsZ0JBQ2xCLFVBQVE7QUFBQSxnQkFBZ0Isb0JBQWlCO0FBQUE7a0NBRTFDLE1BTVM7QUFBQSxrQkFOVDtBQUFBLG9CQU1TO0FBQUE7QUFBQSxzQkFMUCxPQUFLLGlCQUFDLGlHQUNFLHlCQUFlO0FBQUEsc0JBQ3RCLFNBQUssc0NBQUUseUJBQWUsQ0FBSTtBQUFBLHNCQUFpQixvQkFBaUI7QUFBQTs7c0JBRTdELGFBQWtHO0FBQUEsd0JBQXhGLE9BQU07QUFBQSx3QkFBVSxvQkFBaUI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7OztJQVF2RCxhQUlFO0FBQUEsTUFIUSxNQUFNO0FBQUEsK0ZBQXdCO0FBQUEsTUFDckMsT0FBTztBQUFBLE1BQ1AsV0FBUztBQUFBLE1BQStCLG9CQUFpQjtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJLZXlWYWx1ZVBhaXIudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZToyOjNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZTozOjVcIj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIDpjbGFzcz1cImBncmlkIGdyaWQtY29scy0zIHctZnVsbCBwbC0yIGgtNSBpdGVtcy1jZW50ZXIgJHtcclxuICAgICAgICAgIGt2cC52YWx1ZSA9PT0gbnVsbCB8fCBrdnAudmFsdWUgPT09IHVuZGVmaW5lZCA/ICd0ZXh0LWZvcmVncm91bmQtMicgOiAnJ1xyXG4gICAgICAgIH1gXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9LZXlWYWx1ZVBhaXIudnVlOjQ6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImNvbC1zcGFuLTEgdHJ1bmNhdGUgdGV4dC1ib2R5LTN4cyBtci0yIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZC0yXCJcclxuICAgICAgICAgIDp0aXRsZT1cImt2cC5rZXlcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL0tleVZhbHVlUGFpci52dWU6OTo5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBrdnAua2V5IH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJncm91cCBjb2wtc3Bhbi0yIHBsLTEgdHJ1bmNhdGUgdGV4dC1ib2R5LTN4cyBmbGV4IGdhcC0xIGl0ZW1zLWNlbnRlciB0ZXh0LWZvcmVncm91bmRcIlxyXG4gICAgICAgICAgOnRpdGxlPVwiKGt2cC52YWx1ZSBhcyBzdHJpbmcpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9LZXlWYWx1ZVBhaXIudnVlOjE1OjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0xIGl0ZW1zLWNlbnRlciB3LWZ1bGxcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL0tleVZhbHVlUGFpci52dWU6MTk6MTFcIj5cclxuICAgICAgICAgICAgPCEtLSBOT1RFOiBjYW4ndCBkbyBrdnAudmFsdWUgfHwgJ251bGwnIGJlY2F1c2UgMCB8fCAnbnVsbCcgPSAnbnVsbCcgLS0+XHJcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiaXNVcmxTdHJpbmcoa3ZwLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgICA6aHJlZj1cImt2cC52YWx1ZSBhcyBzdHJpbmdcIlxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcclxuICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHJ1bmNhdGUgYm9yZGVyLWIgYm9yZGVyLW91dGxpbmUtMyBob3Zlcjpib3JkZXItb3V0bGluZS01XCJcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cImt2cC52YWx1ZSA9PT0gbnVsbCA/ICcnIDogJ2dyb3VwLWhvdmVyOm1heC13LVtjYWxjKDEwMCUtMXJlbSldJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZToyMjoxNVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3sga3ZwLnZhbHVlIH19XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRydW5jYXRlXCJcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cImt2cC52YWx1ZSA9PT0gbnVsbCA/ICcnIDogJ2dyb3VwLWhvdmVyOm1heC13LVtjYWxjKDEwMCUtMXJlbSldJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZTozMzoxNVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3sga3ZwLnZhbHVlID09PSBudWxsID8gJ251bGwnIDoga3ZwLnZhbHVlIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICA8c3BhbiB2LWlmPVwia3ZwLnVuaXRzXCIgY2xhc3M9XCJ0cnVuY2F0ZSBvcGFjaXR5LTcwXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9LZXlWYWx1ZVBhaXIudnVlOjQwOjEzXCI+XHJcbiAgICAgICAgICAgICAge3sga3ZwLnVuaXRzIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPExheW91dE1lbnVcclxuICAgICAgICAgICAgICB2LW1vZGVsOm9wZW49XCJzaG93QWN0aW9uc01lbnVcIlxyXG4gICAgICAgICAgICAgIDppdGVtcz1cImFjdGlvbnNJdGVtc1wiXHJcbiAgICAgICAgICAgICAgbW91bnQtbWVudS1vbi1ib2R5XHJcbiAgICAgICAgICAgICAgQGNsaWNrLnN0b3AucHJldmVudFxyXG4gICAgICAgICAgICAgIEBjaG9zZW49XCJvbkFjdGlvbkNob3NlblwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZTo0MzoxM1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImdyb3VwLWhvdmVyOm9wYWNpdHktMTAwIGhvdmVyOmJnLWhpZ2hsaWdodC0xIHJvdW5kZWQgaC00IHctNCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XCJzaG93QWN0aW9uc01lbnUgPyAnYmctaGlnaGxpZ2h0LTEgb3BhY2l0eS0xMDAnIDogJ29wYWNpdHktMCdcIlxyXG4gICAgICAgICAgICAgICAgQGNsaWNrPVwic2hvd0FjdGlvbnNNZW51ID0gIXNob3dBY3Rpb25zTWVudVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZTo1MDoxNVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPEVsbGlwc2lzIGNsYXNzPVwiaC0zIHctM1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZTo1NToxN1wiIC8+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvTGF5b3V0TWVudT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxWaWV3ZXJGaWx0ZXJzTGFyZ2VQcm9wZXJ0eVdhcm5pbmdEaWFsb2dcclxuICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd0xhcmdlUHJvcGVydHlXYXJuaW5nXCJcclxuICAgICAgOmNvdW50PVwicGVuZGluZ0ZpbHRlckNvdW50XCJcclxuICAgICAgQGNvbmZpcm09XCJjb25maXJtTGFyZ2VQcm9wZXJ0eVNlbGVjdGlvblwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZTo2Mzo1XCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBWQUxJRF9IVFRQX1VSTCB9IGZyb20gJ35+L2xpYi9jb21tb24vaGVscGVycy92YWxpZGF0aW9uJ1xyXG5pbXBvcnQgeyBMYXlvdXRNZW51LCB0eXBlIExheW91dE1lbnVJdGVtIH0gZnJvbSAnQHNwZWNrbGUvdWktY29tcG9uZW50cydcclxuaW1wb3J0IHsgRWxsaXBzaXMgfSBmcm9tICdsdWNpZGUtdnVlLW5leHQnXHJcbmltcG9ydCB7IHVzZUZpbHRlclV0aWxpdGllcyB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9maWx0ZXJpbmcvZmlsdGVyaW5nJ1xyXG5pbXBvcnQgeyB1c2VJbmplY3RlZFZpZXdlclN0YXRlIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cCdcclxuaW1wb3J0IHR5cGUgeyBLZXlWYWx1ZVBhaXIgfSBmcm9tICd+L2NvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi90eXBlcydcclxuaW1wb3J0IHsgaXNOdW1lcmljUHJvcGVydHlJbmZvIH0gZnJvbSAnfi9saWIvdmlld2VyL2hlbHBlcnMvc2NlbmVFeHBsb3JlcidcclxuaW1wb3J0IHtcclxuICBCb29sZWFuRmlsdGVyQ29uZGl0aW9uLFxyXG4gIE51bWVyaWNGaWx0ZXJDb25kaXRpb24sXHJcbiAgdHlwZSBFeHRlbmRlZFByb3BlcnR5SW5mb1xyXG59IGZyb20gJ34vbGliL3ZpZXdlci9oZWxwZXJzL2ZpbHRlcnMvdHlwZXMnXHJcbmltcG9ydCB7IGlzQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnfi9saWIvdmlld2VyL2hlbHBlcnMvZmlsdGVycy91dGlscydcclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8e1xyXG4gIGt2cDogS2V5VmFsdWVQYWlyXHJcbn0+KClcclxuXHJcbmNvbnN0IHtcclxuICBpc0t2cEZpbHRlcmFibGUsXHJcbiAgZ2V0RmlsdGVyRGlzYWJsZWRSZWFzb24sXHJcbiAgZmluZEZpbHRlckJ5S3ZwLFxyXG4gIGFkZEFjdGl2ZUZpbHRlcixcclxuICB1cGRhdGVBY3RpdmVGaWx0ZXJWYWx1ZXMsXHJcbiAgdXBkYXRlRmlsdGVyQ29uZGl0aW9uLFxyXG4gIHNldE51bWVyaWNSYW5nZSxcclxuICBpc0xhcmdlUHJvcGVydHksXHJcbiAgZ2V0UHJvcGVydHlPcHRpb25zRnJvbURhdGFTdG9yZVxyXG59ID0gdXNlRmlsdGVyVXRpbGl0aWVzKClcclxuXHJcbmNvbnN0IHtcclxuICB1aToge1xyXG4gICAgcGFuZWxzOiB7IGFjdGl2ZTogYWN0aXZlUGFuZWwgfVxyXG4gIH1cclxufSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG5cclxuY29uc3QgYXZhaWxhYmxlRmlsdGVycyA9IGNvbXB1dGVkKFxyXG4gICgpID0+IGdldFByb3BlcnR5T3B0aW9uc0Zyb21EYXRhU3RvcmUoKSBhcyBFeHRlbmRlZFByb3BlcnR5SW5mb1tdXHJcbilcclxuXHJcbmNvbnN0IHNob3dBY3Rpb25zTWVudSA9IHJlZihmYWxzZSlcclxuXHJcbmNvbnN0IHNob3dMYXJnZVByb3BlcnR5V2FybmluZyA9IHJlZihmYWxzZSlcclxuY29uc3QgcGVuZGluZ0ZpbHRlciA9IHJlZjxFeHRlbmRlZFByb3BlcnR5SW5mbyB8IG51bGw+KG51bGwpXHJcbmNvbnN0IHBlbmRpbmdGaWx0ZXJDb3VudCA9IHJlZigwKVxyXG5cclxuY29uc3QgaXNVcmxTdHJpbmcgPSAodjogdW5rbm93bikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIFZBTElEX0hUVFBfVVJMLnRlc3QodilcclxuXHJcbmNvbnN0IGlzQ29weWFibGUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIChcclxuICAgIHByb3BzLmt2cC52YWx1ZSAhPT0gbnVsbCAmJlxyXG4gICAgcHJvcHMua3ZwLnZhbHVlICE9PSB1bmRlZmluZWQgJiZcclxuICAgIHR5cGVvZiBwcm9wcy5rdnAudmFsdWUgIT09ICdvYmplY3QnXHJcbiAgKVxyXG59KVxyXG5cclxuY29uc3QgaXNGaWx0ZXJhYmxlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChwcm9wcy5rdnAudmFsdWUgPT09IG51bGwgfHwgcHJvcHMua3ZwLnZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuICByZXR1cm4gaXNLdnBGaWx0ZXJhYmxlKHByb3BzLmt2cCwgYXZhaWxhYmxlRmlsdGVycy52YWx1ZSlcclxufSlcclxuXHJcbmNvbnN0IGdldERpc2FibGVkUmVhc29uID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChwcm9wcy5rdnAudmFsdWUgPT09IG51bGwgfHwgcHJvcHMua3ZwLnZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiAnQ2Fubm90IGZpbHRlciBvbiBudWxsIHZhbHVlcydcclxuICB9XHJcbiAgcmV0dXJuIGdldEZpbHRlckRpc2FibGVkUmVhc29uKHByb3BzLmt2cCwgYXZhaWxhYmxlRmlsdGVycy52YWx1ZSlcclxufSlcclxuXHJcbmNvbnN0IGhhbmRsZUFkZFRvRmlsdGVycyA9IChrdnA6IEtleVZhbHVlUGFpcikgPT4ge1xyXG4gIGNvbnN0IGZpbHRlciA9IGZpbmRGaWx0ZXJCeUt2cChrdnAsIGF2YWlsYWJsZUZpbHRlcnMudmFsdWUpXHJcbiAgaWYgKGZpbHRlciAmJiBrdnAudmFsdWUgIT09IG51bGwgJiYga3ZwLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgIGNvbnN0IHsgaXNMYXJnZSwgY291bnQgfSA9IGlzTGFyZ2VQcm9wZXJ0eShmaWx0ZXIua2V5KVxyXG5cclxuICAgIGlmIChpc0xhcmdlKSB7XHJcbiAgICAgIHBlbmRpbmdGaWx0ZXIudmFsdWUgPSBmaWx0ZXJcclxuICAgICAgcGVuZGluZ0ZpbHRlckNvdW50LnZhbHVlID0gY291bnRcclxuICAgICAgc2hvd0xhcmdlUHJvcGVydHlXYXJuaW5nLnZhbHVlID0gdHJ1ZVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBhZGRGaWx0ZXJXaXRoVmFsdWUoZmlsdGVyLCBrdnApXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBhZGRGaWx0ZXJXaXRoVmFsdWUgPSAoZmlsdGVyOiBFeHRlbmRlZFByb3BlcnR5SW5mbywga3ZwOiBLZXlWYWx1ZVBhaXIpID0+IHtcclxuICBjb25zdCBmaWx0ZXJJZCA9IGFkZEFjdGl2ZUZpbHRlcihmaWx0ZXIpXHJcblxyXG4gIGlmIChpc051bWVyaWNQcm9wZXJ0eUluZm8oZmlsdGVyKSkge1xyXG4gICAgLy8gRm9yIG51bWVyaWMgZmlsdGVycywgc2V0IHRoZSBzcGVjaWZpYyBudW1lcmljIHZhbHVlIHdpdGggSXNFcXVhbFRvIGNvbmRpdGlvblxyXG4gICAgY29uc3QgbnVtZXJpY1ZhbHVlID1cclxuICAgICAgdHlwZW9mIGt2cC52YWx1ZSA9PT0gJ251bWJlcicgPyBrdnAudmFsdWUgOiBwYXJzZUZsb2F0KFN0cmluZyhrdnAudmFsdWUpKVxyXG4gICAgaWYgKCFpc05hTihudW1lcmljVmFsdWUpKSB7XHJcbiAgICAgIHVwZGF0ZUZpbHRlckNvbmRpdGlvbihmaWx0ZXJJZCwgTnVtZXJpY0ZpbHRlckNvbmRpdGlvbi5Jc0VxdWFsVG8pXHJcbiAgICAgIHNldE51bWVyaWNSYW5nZShmaWx0ZXJJZCwgbnVtZXJpY1ZhbHVlLCBudW1lcmljVmFsdWUpXHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5Qcm9wZXJ0eShmaWx0ZXIpKSB7XHJcbiAgICAvLyBGb3IgYm9vbGVhbiBmaWx0ZXJzLCBzZXQgdGhlIGNvbmRpdGlvbiBiYXNlZCBvbiB0aGUgdmFsdWVcclxuICAgIGNvbnN0IGJvb2xWYWx1ZSA9IGt2cC52YWx1ZSA9PT0gdHJ1ZSB8fCBrdnAudmFsdWUgPT09ICd0cnVlJ1xyXG4gICAgY29uc3QgY29uZGl0aW9uID0gYm9vbFZhbHVlXHJcbiAgICAgID8gQm9vbGVhbkZpbHRlckNvbmRpdGlvbi5Jc1RydWVcclxuICAgICAgOiBCb29sZWFuRmlsdGVyQ29uZGl0aW9uLklzRmFsc2VcclxuICAgIHVwZGF0ZUZpbHRlckNvbmRpdGlvbihmaWx0ZXJJZCwgY29uZGl0aW9uKVxyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBGb3Igc3RyaW5nIGZpbHRlcnMsIHVzZSB0aGUgc2VsZWN0ZWRWYWx1ZXMgYXJyYXlcclxuICAgIGNvbnN0IHZhbHVlcyA9IFtTdHJpbmcoa3ZwLnZhbHVlKV1cclxuICAgIHVwZGF0ZUFjdGl2ZUZpbHRlclZhbHVlcyhmaWx0ZXJJZCwgdmFsdWVzKVxyXG4gIH1cclxuXHJcbiAgYWN0aXZlUGFuZWwudmFsdWUgPSAnZmlsdGVycydcclxufVxyXG5cclxuY29uc3QgY29uZmlybUxhcmdlUHJvcGVydHlTZWxlY3Rpb24gPSAoKSA9PiB7XHJcbiAgaWYgKHBlbmRpbmdGaWx0ZXIudmFsdWUpIHtcclxuICAgIGFkZEZpbHRlcldpdGhWYWx1ZShwZW5kaW5nRmlsdGVyLnZhbHVlLCBwcm9wcy5rdnApXHJcbiAgICBwZW5kaW5nRmlsdGVyLnZhbHVlID0gbnVsbFxyXG4gICAgcGVuZGluZ0ZpbHRlckNvdW50LnZhbHVlID0gMFxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgaGFuZGxlQ29weSA9IGFzeW5jIChrdnA6IEtleVZhbHVlUGFpcikgPT4ge1xyXG4gIGNvbnN0IHsgY29weSB9ID0gdXNlQ2xpcGJvYXJkKClcclxuICBpZiAoaXNDb3B5YWJsZS52YWx1ZSkge1xyXG4gICAgYXdhaXQgY29weShrdnAudmFsdWUgYXMgc3RyaW5nLCB7XHJcbiAgICAgIHN1Y2Nlc3NNZXNzYWdlOiBgJHtrdnAua2V5fSBjb3BpZWQgdG8gY2xpcGJvYXJkYCxcclxuICAgICAgZmFpbHVyZU1lc3NhZ2U6IGBGYWlsZWQgdG8gY29weSAke2t2cC5rZXl9IHRvIGNsaXBib2FyZGBcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBhY3Rpb25zSXRlbXMgPSBjb21wdXRlZDxMYXlvdXRNZW51SXRlbVtdW10+KCgpID0+IHtcclxuICByZXR1cm4gW1xyXG4gICAgW1xyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6ICdDb3B5IHZhbHVlJyxcclxuICAgICAgICBpZDogJ2NvcHktdmFsdWUnLFxyXG4gICAgICAgIGRpc2FibGVkOiAhaXNDb3B5YWJsZS52YWx1ZSxcclxuICAgICAgICBkaXNhYmxlZFRvb2x0aXA6IGlzQ29weWFibGUudmFsdWVcclxuICAgICAgICAgID8gdW5kZWZpbmVkXHJcbiAgICAgICAgICA6ICdDYW5ub3QgY29weSBvYmplY3RzLCBhcnJheXMsIG9yIG51bGwgdmFsdWVzJ1xyXG4gICAgICB9XHJcbiAgICBdLFxyXG4gICAgW1xyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6ICdBZGQgdG8gZmlsdGVycycsXHJcbiAgICAgICAgaWQ6ICdhZGQtdG8tZmlsdGVycycsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICFpc0ZpbHRlcmFibGUudmFsdWUsXHJcbiAgICAgICAgZGlzYWJsZWRUb29sdGlwOiBpc0ZpbHRlcmFibGUudmFsdWVcclxuICAgICAgICAgID8gJ0FkZCB0aGlzIHByb3BlcnR5IHRvIGZpbHRlcnMnXHJcbiAgICAgICAgICA6IGdldERpc2FibGVkUmVhc29uLnZhbHVlXHJcbiAgICAgIH1cclxuICAgIF1cclxuICBdXHJcbn0pXHJcblxyXG5jb25zdCBvbkFjdGlvbkNob3NlbiA9IChwYXJhbXM6IHsgaXRlbTogTGF5b3V0TWVudUl0ZW0gfSkgPT4ge1xyXG4gIGNvbnN0IHsgaXRlbSB9ID0gcGFyYW1zXHJcblxyXG4gIC8vIERvbid0IGV4ZWN1dGUgaWYgaXRlbSBpcyBkaXNhYmxlZFxyXG4gIGlmIChpdGVtLmRpc2FibGVkKSByZXR1cm5cclxuXHJcbiAgc3dpdGNoIChpdGVtLmlkKSB7XHJcbiAgICBjYXNlICdjb3B5LXZhbHVlJzpcclxuICAgICAgaGFuZGxlQ29weShwcm9wcy5rdnApXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICdhZGQtdG8tZmlsdGVycyc6XHJcbiAgICAgIGhhbmRsZUFkZFRvRmlsdGVycyhwcm9wcy5rdnApXHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL0tleVZhbHVlUGFpci52dWUifQ==