Files
speckle-server/scratch/edge-debug-selection/Default/Cache/Cache_Data/f_00015b
T

293 lines
30 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/models/VirtualTreeItem.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/ExpansionTriangle.vue";
import { default as __nuxt_component_1 } from "/_nuxt/components/viewer/VisibilityButton.vue";
import { default as __nuxt_component_2 } from "/_nuxt/components/viewer/IsolateButton.vue";
/* Injection by vite-plugin-vue-inspector Start */
import { createElementVNode as __createElementVNode,createBlock as __createBlock,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 _createBlock(...args) { return _interopVNode(__createBlock(...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 { containsAll } from "/_nuxt/lib/common/helpers/utils.ts";
import {
getTargetObjectIds,
getHeaderAndSubheaderForSpeckleObject
} from "/_nuxt/lib/object-sidebar/helpers.ts";
import {
useSelectionUtilities,
useHighlightedObjectsUtilities,
useCameraUtilities
} from "/_nuxt/lib/viewer/composables/ui.ts";
import { useFilterUtilities } from "/_nuxt/lib/viewer/composables/filtering/filtering.ts";
import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts";
import { computed } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "ViewerModelsVirtualTreeItem",
props: {
item: { type: Object, required: true }
},
emits: ["toggle-expansion", "item-click"],
setup(__props, { expose: __expose, emit: __emit }) {
__expose();
const props = __props;
const emit = __emit;
const { objects: selectedObjects } = useSelectionUtilities();
const { hideObjects, showObjects, isolateObjects, unIsolateObjects } = useFilterUtilities();
const { highlightObjects, unhighlightObjects } = useHighlightedObjectsUtilities();
const { zoom } = useCameraUtilities();
const {
viewer: {
metadata: { filteringState }
},
ui: { filters }
} = useInjectedViewerState();
const hiddenObjects = computed(() => filteringState.value?.hiddenObjects);
const { isolatedObjectsSet } = filters;
const stateHasIsolatedObjectsInGeneral = computed(() => {
if (!isolatedObjectsSet.value) return false;
return isolatedObjectsSet.value.size > 0;
});
const rawSpeckleData = computed(() => {
if (props.item.type !== "tree-item") return null;
const node = props.item.data;
return node.raw || null;
});
const isTreeItemHidden = computed(() => {
if (!rawSpeckleData.value || !hiddenObjects.value) return false;
const ids = getTargetObjectIds(rawSpeckleData.value);
return containsAll(ids, hiddenObjects.value);
});
const isTreeItemIsolated = computed(() => {
if (!rawSpeckleData.value || !isolatedObjectsSet.value) return false;
const ids = getTargetObjectIds(rawSpeckleData.value);
const isolatedObjectsArray = Array.from(isolatedObjectsSet.value);
return containsAll(ids, isolatedObjectsArray);
});
const toggleTreeItemVisibility = () => {
if (!rawSpeckleData.value) return;
const ids = getTargetObjectIds(rawSpeckleData.value);
if (!isTreeItemHidden.value) {
hideObjects(ids);
} else {
showObjects(ids);
}
};
const toggleTreeItemIsolation = () => {
if (!rawSpeckleData.value) return;
const ids = getTargetObjectIds(rawSpeckleData.value);
if (!isTreeItemIsolated.value) {
isolateObjects(ids);
} else {
unIsolateObjects(ids);
}
};
const toggleExpansion = () => {
emit("toggle-expansion", props.item.id);
};
const handleItemClick = (event) => {
emit("item-click", props.item, event);
};
const handleItemDoubleClick = () => {
if (!rawSpeckleData.value?.id) return;
zoom([rawSpeckleData.value.id]);
};
const handleItemMouseEnter = () => {
if (!rawSpeckleData.value) return;
highlightObjects(getTargetObjectIds(rawSpeckleData.value));
};
const handleItemMouseLeave = () => {
if (!rawSpeckleData.value) return;
unhighlightObjects(getTargetObjectIds(rawSpeckleData.value));
};
const getItemBackgroundClass = () => {
if (props.item.type !== "tree-item") return "";
const node = props.item.data;
const speckleData = node.raw;
if (!speckleData?.id) return "";
const isSelected = selectedObjects.value.find((o) => o.id === speckleData.id);
const isChildOfSelected = props.item.isDescendantOfSelected;
if (isSelected) return "bg-highlight-3 rounded-sm";
if (isChildOfSelected) return "bg-foundation-2 hover:bg-highlight-3";
return "bg-foundation hover:bg-highlight-1 hover:rounded-sm";
};
const getItemOpacityClass = () => {
if (!rawSpeckleData.value) return "";
const isHidden = isTreeItemHidden.value;
const isIsolated = isTreeItemIsolated.value;
if (isHidden || !isIsolated && stateHasIsolatedObjectsInGeneral.value) {
return "opacity-60";
}
return "";
};
const getItemTextColorClass = () => {
if (!rawSpeckleData.value) return "";
const isHidden = isTreeItemHidden.value;
const isIsolated = isTreeItemIsolated.value;
if (isHidden || !isIsolated && stateHasIsolatedObjectsInGeneral.value) {
return "text-foreground-2";
}
return "";
};
const getTreeItemHeader = () => {
if (props.item.type !== "tree-item") return "";
const node = props.item.data;
const speckleData = node.raw;
if (!speckleData) return "";
const { header } = getHeaderAndSubheaderForSpeckleObject(speckleData);
return header;
};
const getTreeItemSubheader = () => {
if (props.item.type !== "tree-item") return "";
const node = props.item.data;
const speckleData = node.raw;
if (!speckleData) return "";
const { subheader } = getHeaderAndSubheaderForSpeckleObject(speckleData);
return subheader;
};
const __returned__ = { props, emit, selectedObjects, hideObjects, showObjects, isolateObjects, unIsolateObjects, highlightObjects, unhighlightObjects, zoom, filteringState, filters, hiddenObjects, isolatedObjectsSet, stateHasIsolatedObjectsInGeneral, rawSpeckleData, isTreeItemHidden, isTreeItemIsolated, toggleTreeItemVisibility, toggleTreeItemIsolation, toggleExpansion, handleItemClick, handleItemDoubleClick, handleItemMouseEnter, handleItemMouseLeave, getItemBackgroundClass, getItemOpacityClass, getItemTextColorClass, getTreeItemHeader, getTreeItemSubheader };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { normalizeStyle as _normalizeStyle, resolveComponent as _resolveComponent, normalizeClass as _normalizeClass, openBlock as _openBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = {
class: "px-1",
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:2:3"
};
const _hoisted_2 = {
class: "flex items-center gap-0.5 min-w-0",
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:14:7"
};
const _hoisted_3 = {
key: 1,
class: "w-4 shrink-0",
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:27:9"
};
const _hoisted_4 = {
class: "truncate text-body-2xs",
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:34:11"
};
const _hoisted_5 = {
class: "truncate text-body-3xs text-foreground-2",
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:37:11"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_ViewerExpansionTriangle = __nuxt_component_0;
const _component_ViewerVisibilityButton = __nuxt_component_1;
const _component_ViewerIsolateButton = __nuxt_component_2;
return _openBlock(), _createElementBlock("div", _hoisted_1, [
_createElementVNode(
"button",
{
type: "button",
class: _normalizeClass(["group flex items-center w-full p-1 pr-2 cursor-pointer text-left justify-between", [$setup.getItemBackgroundClass(), $setup.getItemOpacityClass()]]),
onClick: _cache[3] || (_cache[3] = ($event) => $setup.handleItemClick($event)),
onDblclick: _cache[4] || (_cache[4] = ($event) => $setup.handleItemDoubleClick()),
onMouseenter: _cache[5] || (_cache[5] = ($event) => $setup.handleItemMouseEnter()),
onMouseleave: _cache[6] || (_cache[6] = ($event) => $setup.handleItemMouseLeave()),
onFocusin: _cache[7] || (_cache[7] = ($event) => $setup.handleItemMouseEnter()),
onFocusout: _cache[8] || (_cache[8] = ($event) => $setup.handleItemMouseLeave()),
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:3:5"
},
[
_createElementVNode("div", _hoisted_2, [
_createElementVNode(
"div",
{
style: _normalizeStyle({ width: `${($props.item.indent || 0) * 0.375}rem` }),
class: "shrink-0",
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:15:9"
},
null,
4
/* STYLE */
),
$props.item.hasChildren ? (_openBlock(), _createBlock(_component_ViewerExpansionTriangle, {
key: 0,
class: _normalizeClass(["h-8", $setup.getItemOpacityClass()]),
"is-expanded": $props.item.isExpanded,
onClick: _cache[0] || (_cache[0] = ($event) => $setup.toggleExpansion()),
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:20:9"
}, null, 8, ["is-expanded", "class"])) : (_openBlock(), _createElementBlock("div", _hoisted_3)),
_createCommentVNode(" Item content "),
_createElementVNode(
"div",
{
class: _normalizeClass(["flex min-w-0 flex-col", [$setup.getItemTextColorClass(), $setup.getItemOpacityClass()]]),
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:30:9"
},
[
_createElementVNode(
"div",
_hoisted_4,
_toDisplayString($setup.getTreeItemHeader()),
1
/* TEXT */
),
_createElementVNode(
"div",
_hoisted_5,
_toDisplayString($setup.getTreeItemSubheader()),
1
/* TEXT */
)
],
2
/* CLASS */
)
]),
_createElementVNode(
"div",
{
class: _normalizeClass(["flex items-center group-hover:w-auto overflow-hidden shrink-0", $setup.isTreeItemHidden || $setup.isTreeItemIsolated ? "w-auto" : "sm:w-0"]),
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:43:7"
},
[
_createVNode(_component_ViewerVisibilityButton, {
"is-hidden": $setup.isTreeItemHidden,
onClick: _cache[1] || (_cache[1] = ($event) => $setup.toggleTreeItemVisibility()),
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:47:9"
}, null, 8, ["is-hidden"]),
_createVNode(_component_ViewerIsolateButton, {
"is-isolated": $setup.isTreeItemIsolated,
onClick: _cache[2] || (_cache[2] = ($event) => $setup.toggleTreeItemIsolation()),
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:51:9"
}, null, 8, ["is-isolated"])
],
2
/* CLASS */
)
],
34
/* CLASS, NEED_HYDRATION */
)
]);
}
_sfc_main.__hmrId = "76d1a6a0";
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/models/VirtualTreeItem.vue"]]);
//# sourceMappingURL=data:application/json;base64,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QUFLLGlCQUFDLE9BRUUsMkJBQW1CO0FBQUEsWUFEMUIsZUFBYSxZQUFLO0FBQUEsWUFFbEIsU0FBSyxzQ0FBRSx1QkFBZTtBQUFBLFlBQUksb0JBQWlCO0FBQUEsa0VBRTlDLG9CQUE0RyxPQUE1RyxVQUE0RztBQUFBLFVBRTVHO0FBQUEsVUFDQTtBQUFBLFlBVU07QUFBQTtBQUFBLGNBVEosT0FBSyxpQkFBQyx5QkFBdUIsQ0FDcEIsNkJBQXFCLEdBQUksMkJBQW1CO0FBQUEsY0FBSyxvQkFBaUI7QUFBQTs7Y0FFM0U7QUFBQSxnQkFFTTtBQUFBLGdCQUZOO0FBQUEsZ0JBRU0saUJBREQseUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FFdEI7QUFBQSxnQkFFTTtBQUFBLGdCQUZOO0FBQUEsZ0JBRU0saUJBREQsNEJBQW9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7O1FBSzdCO0FBQUEsVUFZTTtBQUFBO0FBQUEsWUFYSixPQUFLLGlCQUFDLGlFQUNFLDJCQUFvQiw0QkFBa0I7QUFBQSxZQUF3QixvQkFBaUI7QUFBQTs7WUFFdkYsYUFHRTtBQUFBLGNBRkMsYUFBVztBQUFBLGNBQ1gsU0FBSyxzQ0FBRSxnQ0FBd0I7QUFBQSxjQUFJLG9CQUFpQjtBQUFBO1lBRXZELGFBR0U7QUFBQSxjQUZDLGVBQWE7QUFBQSxjQUNiLFNBQUssc0NBQUUsK0JBQXVCO0FBQUEsY0FBSSxvQkFBaUI7QUFBQSIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiVmlydHVhbFRyZWVJdGVtLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cInB4LTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6MjozXCI+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjbGFzcz1cImdyb3VwIGZsZXggaXRlbXMtY2VudGVyIHctZnVsbCBwLTEgcHItMiBjdXJzb3ItcG9pbnRlciB0ZXh0LWxlZnQganVzdGlmeS1iZXR3ZWVuXCJcclxuICAgICAgOmNsYXNzPVwiW2dldEl0ZW1CYWNrZ3JvdW5kQ2xhc3MoKSwgZ2V0SXRlbU9wYWNpdHlDbGFzcygpXVwiXHJcbiAgICAgIEBjbGljaz1cImhhbmRsZUl0ZW1DbGljaygkZXZlbnQpXCJcclxuICAgICAgQGRibGNsaWNrPVwiaGFuZGxlSXRlbURvdWJsZUNsaWNrKClcIlxyXG4gICAgICBAbW91c2VlbnRlcj1cImhhbmRsZUl0ZW1Nb3VzZUVudGVyKClcIlxyXG4gICAgICBAbW91c2VsZWF2ZT1cImhhbmRsZUl0ZW1Nb3VzZUxlYXZlKClcIlxyXG4gICAgICBAZm9jdXNpbj1cImhhbmRsZUl0ZW1Nb3VzZUVudGVyKClcIlxyXG4gICAgICBAZm9jdXNvdXQ9XCJoYW5kbGVJdGVtTW91c2VMZWF2ZSgpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9WaXJ0dWFsVHJlZUl0ZW0udnVlOjM6NVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMC41IG1pbi13LTBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6MTQ6N1wiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIDpzdHlsZT1cInsgd2lkdGg6IGAkeyhpdGVtLmluZGVudCB8fCAwKSAqIDAuMzc1fXJlbWAgfVwiXHJcbiAgICAgICAgICBjbGFzcz1cInNocmluay0wXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9WaXJ0dWFsVHJlZUl0ZW0udnVlOjE1OjlcIlxyXG4gICAgICAgID48L2Rpdj5cclxuXHJcbiAgICAgICAgPFZpZXdlckV4cGFuc2lvblRyaWFuZ2xlXHJcbiAgICAgICAgICB2LWlmPVwiaXRlbS5oYXNDaGlsZHJlblwiXHJcbiAgICAgICAgICBjbGFzcz1cImgtOFwiXHJcbiAgICAgICAgICA6aXMtZXhwYW5kZWQ9XCJpdGVtLmlzRXhwYW5kZWRcIlxyXG4gICAgICAgICAgOmNsYXNzPVwiZ2V0SXRlbU9wYWNpdHlDbGFzcygpXCJcclxuICAgICAgICAgIEBjbGljaz1cInRvZ2dsZUV4cGFuc2lvbigpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9WaXJ0dWFsVHJlZUl0ZW0udnVlOjIwOjlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGRpdiB2LWVsc2UgY2xhc3M9XCJ3LTQgc2hyaW5rLTBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6Mjc6OVwiPjwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEl0ZW0gY29udGVudCAtLT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggbWluLXctMCBmbGV4LWNvbFwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJbZ2V0SXRlbVRleHRDb2xvckNsYXNzKCksIGdldEl0ZW1PcGFjaXR5Q2xhc3MoKV1cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6MzA6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRydW5jYXRlIHRleHQtYm9keS0yeHNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6MzQ6MTFcIj5cclxuICAgICAgICAgICAge3sgZ2V0VHJlZUl0ZW1IZWFkZXIoKSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJ1bmNhdGUgdGV4dC1ib2R5LTN4cyB0ZXh0LWZvcmVncm91bmQtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvVmlydHVhbFRyZWVJdGVtLnZ1ZTozNzoxMVwiPlxyXG4gICAgICAgICAgICB7eyBnZXRUcmVlSXRlbVN1YmhlYWRlcigpIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBncm91cC1ob3Zlcjp3LWF1dG8gb3ZlcmZsb3ctaGlkZGVuIHNocmluay0wXCJcclxuICAgICAgICA6Y2xhc3M9XCJpc1RyZWVJdGVtSGlkZGVuIHx8IGlzVHJlZUl0ZW1Jc29sYXRlZCA/ICd3LWF1dG8nIDogJ3NtOnctMCdcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6NDM6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8Vmlld2VyVmlzaWJpbGl0eUJ1dHRvblxyXG4gICAgICAgICAgOmlzLWhpZGRlbj1cImlzVHJlZUl0ZW1IaWRkZW5cIlxyXG4gICAgICAgICAgQGNsaWNrPVwidG9nZ2xlVHJlZUl0ZW1WaXNpYmlsaXR5KClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6NDc6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8Vmlld2VySXNvbGF0ZUJ1dHRvblxyXG4gICAgICAgICAgOmlzLWlzb2xhdGVkPVwiaXNUcmVlSXRlbUlzb2xhdGVkXCJcclxuICAgICAgICAgIEBjbGljaz1cInRvZ2dsZVRyZWVJdGVtSXNvbGF0aW9uKClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6NTE6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgRXhwbG9yZXJOb2RlIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9oZWxwZXJzL3NjZW5lRXhwbG9yZXInXHJcbmltcG9ydCB7IGNvbnRhaW5zQWxsIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9oZWxwZXJzL3V0aWxzJ1xyXG5pbXBvcnQge1xyXG4gIGdldFRhcmdldE9iamVjdElkcyxcclxuICBnZXRIZWFkZXJBbmRTdWJoZWFkZXJGb3JTcGVja2xlT2JqZWN0XHJcbn0gZnJvbSAnfn4vbGliL29iamVjdC1zaWRlYmFyL2hlbHBlcnMnXHJcbmltcG9ydCB7XHJcbiAgdXNlU2VsZWN0aW9uVXRpbGl0aWVzLFxyXG4gIHVzZUhpZ2hsaWdodGVkT2JqZWN0c1V0aWxpdGllcyxcclxuICB1c2VDYW1lcmFVdGlsaXRpZXNcclxufSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3VpJ1xyXG5pbXBvcnQgeyB1c2VGaWx0ZXJVdGlsaXRpZXMgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvZmlsdGVyaW5nL2ZpbHRlcmluZydcclxuaW1wb3J0IHsgdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSB9IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAnXHJcbmltcG9ydCB0eXBlIHsgVW5pZmllZFZpcnR1YWxJdGVtIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy90cmVlJ1xyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgaXRlbTogVW5pZmllZFZpcnR1YWxJdGVtXHJcbn0+KClcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgJ3RvZ2dsZS1leHBhbnNpb24nOiBbaXRlbUlkOiBzdHJpbmddXHJcbiAgJ2l0ZW0tY2xpY2snOiBbaXRlbTogVW5pZmllZFZpcnR1YWxJdGVtLCBldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnRdXHJcbn0+KClcclxuXHJcbmNvbnN0IHsgb2JqZWN0czogc2VsZWN0ZWRPYmplY3RzIH0gPSB1c2VTZWxlY3Rpb25VdGlsaXRpZXMoKVxyXG5jb25zdCB7IGhpZGVPYmplY3RzLCBzaG93T2JqZWN0cywgaXNvbGF0ZU9iamVjdHMsIHVuSXNvbGF0ZU9iamVjdHMgfSA9XHJcbiAgdXNlRmlsdGVyVXRpbGl0aWVzKClcclxuY29uc3QgeyBoaWdobGlnaHRPYmplY3RzLCB1bmhpZ2hsaWdodE9iamVjdHMgfSA9IHVzZUhpZ2hsaWdodGVkT2JqZWN0c1V0aWxpdGllcygpXHJcbmNvbnN0IHsgem9vbSB9ID0gdXNlQ2FtZXJhVXRpbGl0aWVzKClcclxuXHJcbmNvbnN0IHtcclxuICB2aWV3ZXI6IHtcclxuICAgIG1ldGFkYXRhOiB7IGZpbHRlcmluZ1N0YXRlIH1cclxuICB9LFxyXG4gIHVpOiB7IGZpbHRlcnMgfVxyXG59ID0gdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSgpXHJcblxyXG5jb25zdCBoaWRkZW5PYmplY3RzID0gY29tcHV0ZWQoKCkgPT4gZmlsdGVyaW5nU3RhdGUudmFsdWU/LmhpZGRlbk9iamVjdHMpXHJcbi8vIFVzZSBzaW5nbGV0b24gaXNvbGF0ZWRPYmplY3RzU2V0IGZyb20gdmlld2VyIHN0YXRlXHJcbmNvbnN0IHsgaXNvbGF0ZWRPYmplY3RzU2V0IH0gPSBmaWx0ZXJzXHJcblxyXG5jb25zdCBzdGF0ZUhhc0lzb2xhdGVkT2JqZWN0c0luR2VuZXJhbCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoIWlzb2xhdGVkT2JqZWN0c1NldC52YWx1ZSkgcmV0dXJuIGZhbHNlXHJcbiAgcmV0dXJuIGlzb2xhdGVkT2JqZWN0c1NldC52YWx1ZS5zaXplID4gMFxyXG59KVxyXG5cclxuY29uc3QgcmF3U3BlY2tsZURhdGEgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKHByb3BzLml0ZW0udHlwZSAhPT0gJ3RyZWUtaXRlbScpIHJldHVybiBudWxsXHJcbiAgY29uc3Qgbm9kZSA9IHByb3BzLml0ZW0uZGF0YSBhcyBFeHBsb3Jlck5vZGVcclxuICByZXR1cm4gbm9kZS5yYXcgfHwgbnVsbFxyXG59KVxyXG5cclxuY29uc3QgaXNUcmVlSXRlbUhpZGRlbiA9IGNvbXB1dGVkKCgpOiBib29sZWFuID0+IHtcclxuICBpZiAoIXJhd1NwZWNrbGVEYXRhLnZhbHVlIHx8ICFoaWRkZW5PYmplY3RzLnZhbHVlKSByZXR1cm4gZmFsc2VcclxuICBjb25zdCBpZHMgPSBnZXRUYXJnZXRPYmplY3RJZHMocmF3U3BlY2tsZURhdGEudmFsdWUpXHJcbiAgcmV0dXJuIGNvbnRhaW5zQWxsKGlkcywgaGlkZGVuT2JqZWN0cy52YWx1ZSlcclxufSlcclxuXHJcbmNvbnN0IGlzVHJlZUl0ZW1Jc29sYXRlZCA9IGNvbXB1dGVkKCgpOiBib29sZWFuID0+IHtcclxuICBpZiAoIXJhd1NwZWNrbGVEYXRhLnZhbHVlIHx8ICFpc29sYXRlZE9iamVjdHNTZXQudmFsdWUpIHJldHVybiBmYWxzZVxyXG4gIGNvbnN0IGlkcyA9IGdldFRhcmdldE9iamVjdElkcyhyYXdTcGVja2xlRGF0YS52YWx1ZSlcclxuICBjb25zdCBpc29sYXRlZE9iamVjdHNBcnJheSA9IEFycmF5LmZyb20oaXNvbGF0ZWRPYmplY3RzU2V0LnZhbHVlKVxyXG4gIHJldHVybiBjb250YWluc0FsbChpZHMsIGlzb2xhdGVkT2JqZWN0c0FycmF5KVxyXG59KVxyXG5cclxuY29uc3QgdG9nZ2xlVHJlZUl0ZW1WaXNpYmlsaXR5ID0gKCkgPT4ge1xyXG4gIGlmICghcmF3U3BlY2tsZURhdGEudmFsdWUpIHJldHVyblxyXG4gIGNvbnN0IGlkcyA9IGdldFRhcmdldE9iamVjdElkcyhyYXdTcGVja2xlRGF0YS52YWx1ZSlcclxuXHJcbiAgaWYgKCFpc1RyZWVJdGVtSGlkZGVuLnZhbHVlKSB7XHJcbiAgICBoaWRlT2JqZWN0cyhpZHMpXHJcbiAgfSBlbHNlIHtcclxuICAgIHNob3dPYmplY3RzKGlkcylcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHRvZ2dsZVRyZWVJdGVtSXNvbGF0aW9uID0gKCkgPT4ge1xyXG4gIGlmICghcmF3U3BlY2tsZURhdGEudmFsdWUpIHJldHVyblxyXG4gIGNvbnN0IGlkcyA9IGdldFRhcmdldE9iamVjdElkcyhyYXdTcGVja2xlRGF0YS52YWx1ZSlcclxuXHJcbiAgaWYgKCFpc1RyZWVJdGVtSXNvbGF0ZWQudmFsdWUpIHtcclxuICAgIGlzb2xhdGVPYmplY3RzKGlkcylcclxuICB9IGVsc2Uge1xyXG4gICAgdW5Jc29sYXRlT2JqZWN0cyhpZHMpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCB0b2dnbGVFeHBhbnNpb24gPSAoKSA9PiB7XHJcbiAgZW1pdCgndG9nZ2xlLWV4cGFuc2lvbicsIHByb3BzLml0ZW0uaWQpXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZUl0ZW1DbGljayA9IChldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICBlbWl0KCdpdGVtLWNsaWNrJywgcHJvcHMuaXRlbSwgZXZlbnQpXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZUl0ZW1Eb3VibGVDbGljayA9ICgpID0+IHtcclxuICBpZiAoIXJhd1NwZWNrbGVEYXRhLnZhbHVlPy5pZCkgcmV0dXJuXHJcbiAgem9vbShbcmF3U3BlY2tsZURhdGEudmFsdWUuaWRdKVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVJdGVtTW91c2VFbnRlciA9ICgpID0+IHtcclxuICBpZiAoIXJhd1NwZWNrbGVEYXRhLnZhbHVlKSByZXR1cm5cclxuICBoaWdobGlnaHRPYmplY3RzKGdldFRhcmdldE9iamVjdElkcyhyYXdTcGVja2xlRGF0YS52YWx1ZSkpXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZUl0ZW1Nb3VzZUxlYXZlID0gKCkgPT4ge1xyXG4gIGlmICghcmF3U3BlY2tsZURhdGEudmFsdWUpIHJldHVyblxyXG4gIHVuaGlnaGxpZ2h0T2JqZWN0cyhnZXRUYXJnZXRPYmplY3RJZHMocmF3U3BlY2tsZURhdGEudmFsdWUpKVxyXG59XHJcblxyXG5jb25zdCBnZXRJdGVtQmFja2dyb3VuZENsYXNzID0gKCk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKHByb3BzLml0ZW0udHlwZSAhPT0gJ3RyZWUtaXRlbScpIHJldHVybiAnJ1xyXG5cclxuICBjb25zdCBub2RlID0gcHJvcHMuaXRlbS5kYXRhIGFzIEV4cGxvcmVyTm9kZVxyXG4gIGNvbnN0IHNwZWNrbGVEYXRhID0gbm9kZS5yYXdcclxuICBpZiAoIXNwZWNrbGVEYXRhPy5pZCkgcmV0dXJuICcnXHJcblxyXG4gIGNvbnN0IGlzU2VsZWN0ZWQgPSBzZWxlY3RlZE9iamVjdHMudmFsdWUuZmluZCgobykgPT4gby5pZCA9PT0gc3BlY2tsZURhdGEuaWQpXHJcbiAgY29uc3QgaXNDaGlsZE9mU2VsZWN0ZWQgPSBwcm9wcy5pdGVtLmlzRGVzY2VuZGFudE9mU2VsZWN0ZWRcclxuXHJcbiAgaWYgKGlzU2VsZWN0ZWQpIHJldHVybiAnYmctaGlnaGxpZ2h0LTMgcm91bmRlZC1zbSdcclxuICBpZiAoaXNDaGlsZE9mU2VsZWN0ZWQpIHJldHVybiAnYmctZm91bmRhdGlvbi0yIGhvdmVyOmJnLWhpZ2hsaWdodC0zJ1xyXG4gIHJldHVybiAnYmctZm91bmRhdGlvbiBob3ZlcjpiZy1oaWdobGlnaHQtMSBob3Zlcjpyb3VuZGVkLXNtJ1xyXG59XHJcblxyXG5jb25zdCBnZXRJdGVtT3BhY2l0eUNsYXNzID0gKCk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKCFyYXdTcGVja2xlRGF0YS52YWx1ZSkgcmV0dXJuICcnXHJcblxyXG4gIGNvbnN0IGlzSGlkZGVuID0gaXNUcmVlSXRlbUhpZGRlbi52YWx1ZVxyXG4gIGNvbnN0IGlzSXNvbGF0ZWQgPSBpc1RyZWVJdGVtSXNvbGF0ZWQudmFsdWVcclxuXHJcbiAgaWYgKGlzSGlkZGVuIHx8ICghaXNJc29sYXRlZCAmJiBzdGF0ZUhhc0lzb2xhdGVkT2JqZWN0c0luR2VuZXJhbC52YWx1ZSkpIHtcclxuICAgIHJldHVybiAnb3BhY2l0eS02MCdcclxuICB9XHJcbiAgcmV0dXJuICcnXHJcbn1cclxuXHJcbmNvbnN0IGdldEl0ZW1UZXh0Q29sb3JDbGFzcyA9ICgpOiBzdHJpbmcgPT4ge1xyXG4gIGlmICghcmF3U3BlY2tsZURhdGEudmFsdWUpIHJldHVybiAnJ1xyXG5cclxuICBjb25zdCBpc0hpZGRlbiA9IGlzVHJlZUl0ZW1IaWRkZW4udmFsdWVcclxuICBjb25zdCBpc0lzb2xhdGVkID0gaXNUcmVlSXRlbUlzb2xhdGVkLnZhbHVlXHJcblxyXG4gIGlmIChpc0hpZGRlbiB8fCAoIWlzSXNvbGF0ZWQgJiYgc3RhdGVIYXNJc29sYXRlZE9iamVjdHNJbkdlbmVyYWwudmFsdWUpKSB7XHJcbiAgICByZXR1cm4gJ3RleHQtZm9yZWdyb3VuZC0yJ1xyXG4gIH1cclxuICByZXR1cm4gJydcclxufVxyXG5cclxuY29uc3QgZ2V0VHJlZUl0ZW1IZWFkZXIgPSAoKTogc3RyaW5nID0+IHtcclxuICBpZiAocHJvcHMuaXRlbS50eXBlICE9PSAndHJlZS1pdGVtJykgcmV0dXJuICcnXHJcblxyXG4gIGNvbnN0IG5vZGUgPSBwcm9wcy5pdGVtLmRhdGEgYXMgRXhwbG9yZXJOb2RlXHJcbiAgY29uc3Qgc3BlY2tsZURhdGEgPSBub2RlLnJhd1xyXG4gIGlmICghc3BlY2tsZURhdGEpIHJldHVybiAnJ1xyXG5cclxuICBjb25zdCB7IGhlYWRlciB9ID0gZ2V0SGVhZGVyQW5kU3ViaGVhZGVyRm9yU3BlY2tsZU9iamVjdChzcGVja2xlRGF0YSlcclxuICByZXR1cm4gaGVhZGVyXHJcbn1cclxuXHJcbmNvbnN0IGdldFRyZWVJdGVtU3ViaGVhZGVyID0gKCk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKHByb3BzLml0ZW0udHlwZSAhPT0gJ3RyZWUtaXRlbScpIHJldHVybiAnJ1xyXG5cclxuICBjb25zdCBub2RlID0gcHJvcHMuaXRlbS5kYXRhIGFzIEV4cGxvcmVyTm9kZVxyXG4gIGNvbnN0IHNwZWNrbGVEYXRhID0gbm9kZS5yYXdcclxuICBpZiAoIXNwZWNrbGVEYXRhKSByZXR1cm4gJydcclxuXHJcbiAgY29uc3QgeyBzdWJoZWFkZXIgfSA9IGdldEhlYWRlckFuZFN1YmhlYWRlckZvclNwZWNrbGVPYmplY3Qoc3BlY2tsZURhdGEpXHJcbiAgcmV0dXJuIHN1YmhlYWRlclxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWUifQ==