import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/models/versions/Card.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/ExpansionTriangle.vue"; import { default as __nuxt_component_1 } from "/_nuxt/components/preview/Image.vue"; import { default as __nuxt_component_2 } from "/_nuxt/components/viewer/resources/VersionCard.vue"; import { FormButton as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_4 } from "/_nuxt/components/project/model-page/dialog/Delete.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createVNode as __createVNode,createBlock as __createBlock,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 _createVNode(...args) { return _interopVNode(__createVNode(...args)) } function _createBlock(...args) { return _interopVNode(__createBlock(...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 __vite__cjsImport7_dayjs from "/_nuxt/node_modules/.cache/vite/client/deps/dayjs.js?v=e4f18c29"; const dayjs = __vite__cjsImport7_dayjs.__esModule ? __vite__cjsImport7_dayjs.default : __vite__cjsImport7_dayjs; import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts"; import { useInjectedViewerLoadedResources, useInjectedViewerRequestedResources, useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { useDiffUtilities, useHighlightedObjectsUtilities } from "/_nuxt/lib/viewer/composables/ui.ts"; import { useDateFormatters } from "/_nuxt/composables/dates.ts"; import { ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ViewerModelsVersionsCard", props: { model: { type: null, required: true }, versionId: { type: String, required: true }, last: { type: Boolean, required: true }, initiallyExpanded: { type: Boolean, required: false } }, setup(__props, { expose: __expose }) { __expose(); const props = __props; const { switchModelToVersion } = useInjectedViewerRequestedResources(); const { loadMoreVersions } = useInjectedViewerLoadedResources(); const { diffModelVersions } = useDiffUtilities(); const { highlightObjects, unhighlightObjects } = useHighlightedObjectsUtilities(); const { resources: { response: { project } } } = useInjectedViewerState(); const { formattedRelativeDate, formattedFullDate } = useDateFormatters(); const showVersions = ref(!!props.initiallyExpanded); const showDeleteDialog = ref(false); const versionsToDelete = ref([]); graphql(` fragment ViewerModelVersionCardItem on Version { id message referencedObject sourceApplication createdAt previewUrl authorUser { ...LimitedUserAvatar } } `); const modelId = computed(() => props.model.id); const versions = computed(() => [ ...props.model.loadedVersion.items, ...props.model.versions.items ]); const showLoadMore = computed(() => { const totalCount = props.model.versions.totalCount; const currentCount = versions.value.length; return currentCount < totalCount; }); const loadedVersion = computed( () => versions.value.find((v) => v.id === props.versionId) ); const createdAt = computed(() => loadedVersion.value?.createdAt); const createdAtFormatted = computed(() => { return { full: formattedFullDate(createdAt.value), relative: formattedRelativeDate(createdAt.value, { capitalize: true }) }; }); const latestVersion = computed(() => { return versions.value.slice().sort((a, b) => dayjs(a.createdAt).isBefore(dayjs(b.createdAt)) ? 1 : -1)[0]; }); const isLatest = computed(() => loadedVersion.value?.id === latestVersion.value.id); const latestVersionId = computed(() => latestVersion.value.id); const modelName = computed(() => { const parts = props.model.name.split("/"); return { subheader: parts.length > 1 ? parts.slice(0, -1).join("/") : null, header: parts[parts.length - 1] }; }); async function handleVersionChange(versionId) { await switchModelToVersion(props.model.id, versionId); } const onLoadMore = async () => { await loadMoreVersions(props.model.id); }; async function handleViewChanges(version) { if (!loadedVersion.value?.id) return; await diffModelVersions(modelId.value, loadedVersion.value.id, version.id); } const highlightObject = () => { const refObject = props.model.loadedVersion.items[0]?.referencedObject; if (refObject && typeof refObject === "string") highlightObjects([refObject]); }; const unhighlightObject = () => { const refObject = props.model.loadedVersion.items[0]?.referencedObject; if (refObject && typeof refObject === "string") unhighlightObjects([refObject]); }; const handleRemoveVersion = (versionId) => { const versionToDelete = versions.value.find((v) => v.id === versionId); if (versionToDelete) { versionsToDelete.value = [ { id: versionToDelete.id, message: versionToDelete.message } ]; showDeleteDialog.value = true; } }; const onVersionDeleted = () => { loadMoreVersions(props.model.id); }; watch(showDeleteDialog, (isOpen) => { if (!isOpen) { versionsToDelete.value = []; } }); const __returned__ = { props, switchModelToVersion, loadMoreVersions, diffModelVersions, highlightObjects, unhighlightObjects, project, formattedRelativeDate, formattedFullDate, showVersions, showDeleteDialog, versionsToDelete, modelId, versions, showLoadMore, loadedVersion, createdAt, createdAtFormatted, latestVersion, isLatest, latestVersionId, modelName, handleVersionChange, onLoadMore, handleViewChanges, highlightObject, unhighlightObject, handleRemoveVersion, onVersionDeleted }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, openBlock as _openBlock, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives, renderList as _renderList, Fragment as _Fragment, withCtx as _withCtx, vShow as _vShow, normalizeClass as _normalizeClass } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { class: "h-12 w-12 rounded-md overflow-hidden border border-outline-3 mr-3 shrink-0", "data-v-inspector": "components/viewer/models/versions/Card.vue:19:7" }; const _hoisted_2 = { class: "flex flex-col", "data-v-inspector": "components/viewer/models/versions/Card.vue:27:7" }; const _hoisted_3 = { class: "text-foreground text-body-2xs font-medium", "data-v-inspector": "components/viewer/models/versions/Card.vue:28:9" }; const _hoisted_4 = { key: 0, class: "text-body-3xs text-foreground", "data-v-inspector": "components/viewer/models/versions/Card.vue:34:9" }; const _hoisted_5 = { class: "text-body-3xs text-foreground-2", "data-v-inspector": "components/viewer/models/versions/Card.vue:37:9" }; const _hoisted_6 = { class: "text-foreground-2 text-body-3xs font-medium ml-auto pr-3", "data-v-inspector": "components/viewer/models/versions/Card.vue:41:7" }; const _hoisted_7 = { class: "flex-col", "data-v-inspector": "components/viewer/models/versions/Card.vue:47:5" }; const _hoisted_8 = { key: 0, class: "mt-4 pr-2 py-2 -ml-3", "data-v-inspector": "components/viewer/models/versions/Card.vue:63:7" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_ViewerExpansionTriangle = __nuxt_component_0; const _component_PreviewImage = __nuxt_component_1; const _component_ViewerResourcesVersionCard = __nuxt_component_2; const _component_FormButton = __nuxt_component_3; const _component_ProjectModelPageDialogDelete = __nuxt_component_4; const _directive_tippy = _resolveDirective("tippy"); return _openBlock(), _createElementBlock( "div", { class: _normalizeClass(["relative", $setup.showVersions ? "border-b border-outline-3" : ""]), "data-v-inspector": "components/viewer/models/versions/Card.vue:4:3" }, [ _createCommentVNode(" Model Header - Sticky "), _createElementVNode( "div", { class: "group sticky top-0 z-20 bg-foundation cursor-pointer flex items-center h-16 pr-0.5 border-b border-outline-3 hover:bg-highlight-1", onClick: _cache[1] || (_cache[1] = ($event) => $setup.showVersions = !$setup.showVersions), onMouseenter: $setup.highlightObject, onMouseleave: $setup.unhighlightObject, onFocusin: $setup.highlightObject, onFocusout: $setup.unhighlightObject, "data-v-inspector": "components/viewer/models/versions/Card.vue:6:5" }, [ _createVNode(_component_ViewerExpansionTriangle, { class: "h-8", "is-expanded": $setup.showVersions, onClick: _cache[0] || (_cache[0] = ($event) => $setup.showVersions = !$setup.showVersions), "data-v-inspector": "components/viewer/models/versions/Card.vue:14:7" }, null, 8, ["is-expanded"]), _createElementVNode("div", _hoisted_1, [ $setup.loadedVersion?.previewUrl ? (_openBlock(), _createBlock(_component_PreviewImage, { key: 0, "preview-url": $setup.loadedVersion?.previewUrl, "data-v-inspector": "components/viewer/models/versions/Card.vue:22:9" }, null, 8, ["preview-url"])) : _createCommentVNode("v-if", true) ]), _createElementVNode("div", _hoisted_2, [ _withDirectives((_openBlock(), _createElementBlock("span", _hoisted_3, [ _createTextVNode( _toDisplayString($setup.modelName.header), 1 /* TEXT */ ) ])), [ [_directive_tippy, $setup.modelName.subheader ? $props.model.name : null] ]), $setup.isLatest ? (_openBlock(), _createElementBlock("span", _hoisted_4, " Latest version ")) : _createCommentVNode("v-if", true), _withDirectives((_openBlock(), _createElementBlock("span", _hoisted_5, [ _createTextVNode( _toDisplayString($setup.createdAtFormatted.relative), 1 /* TEXT */ ) ])), [ [_directive_tippy, $setup.createdAtFormatted.full] ]) ]), _createElementVNode( "span", _hoisted_6, _toDisplayString($props.model.versions?.totalCount), 1 /* TEXT */ ) ], 32 /* NEED_HYDRATION */ ), _createCommentVNode(" Version List "), _withDirectives(_createElementVNode( "div", _hoisted_7, [ (_openBlock(true), _createElementBlock( _Fragment, null, _renderList($setup.props.model.versions.items, (version, index) => { return _openBlock(), _createBlock(_component_ViewerResourcesVersionCard, { key: version.id, "model-id": $setup.modelId, version, "is-latest-version": version.id === $setup.latestVersionId, "is-loaded-version": version.id === $setup.loadedVersion?.id, last: index === $setup.props.model.versions.totalCount - 1, "last-loaded": index === $setup.props.model.versions.items.length - 1, clickable: version.id !== $setup.loadedVersion?.id, "total-versions": $setup.props.model.versions.totalCount, onChangeVersion: $setup.handleVersionChange, onViewChanges: $setup.handleViewChanges, onRemoveVersion: $setup.handleRemoveVersion, "data-v-inspector": "components/viewer/models/versions/Card.vue:48:7" }, null, 8, ["model-id", "version", "is-latest-version", "is-loaded-version", "last", "last-loaded", "clickable", "total-versions"]); }), 128 /* KEYED_FRAGMENT */ )), $setup.showLoadMore ? (_openBlock(), _createElementBlock("div", _hoisted_8, [ _createVNode(_component_FormButton, { "full-width": "", size: "sm", text: "", color: "subtle", disabled: !$setup.showLoadMore, onClick: $setup.onLoadMore, "data-v-inspector": "components/viewer/models/versions/Card.vue:64:9" }, { default: _withCtx(() => [..._cache[3] || (_cache[3] = [ _createTextVNode( " View older versions ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }, 8, ["disabled"]) ])) : _createCommentVNode("v-if", true) ], 512 /* NEED_PATCH */ ), [ [_vShow, $setup.showVersions] ]), _createCommentVNode(" Version Delete Dialog "), $setup.project?.id ? (_openBlock(), _createBlock(_component_ProjectModelPageDialogDelete, { key: 0, open: $setup.showDeleteDialog, "onUpdate:open": _cache[2] || (_cache[2] = ($event) => $setup.showDeleteDialog = $event), "project-id": $setup.project.id, "model-id": $props.model.id, versions: $setup.versionsToDelete, onDeleted: $setup.onVersionDeleted, "data-v-inspector": "components/viewer/models/versions/Card.vue:78:5" }, null, 8, ["open", "project-id", "model-id", "versions"])) : _createCommentVNode("v-if", true) ], 2 /* CLASS */ ); } _sfc_main.__hmrId = "578d1ed2"; 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/versions/Card.vue"]]); //# sourceMappingURL=data:application/json;base64,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Y2VzQ29udGVudCI6WyI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cclxuPCEtLSBlc2xpbnQtZGlzYWJsZSB2dWVqcy1hY2Nlc3NpYmlsaXR5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAtLT5cclxuPHRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZVwiIDpjbGFzcz1cInNob3dWZXJzaW9ucyA/ICdib3JkZXItYiBib3JkZXItb3V0bGluZS0zJyA6ICcnXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy92ZXJzaW9ucy9DYXJkLnZ1ZTo0OjNcIj5cclxuICAgIDwhLS0gTW9kZWwgSGVhZGVyIC0gU3RpY2t5IC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImdyb3VwIHN0aWNreSB0b3AtMCB6LTIwIGJnLWZvdW5kYXRpb24gY3Vyc29yLXBvaW50ZXIgZmxleCBpdGVtcy1jZW50ZXIgaC0xNiBwci0wLjUgYm9yZGVyLWIgYm9yZGVyLW91dGxpbmUtMyBob3ZlcjpiZy1oaWdobGlnaHQtMVwiXHJcbiAgICAgIEBjbGljaz1cInNob3dWZXJzaW9ucyA9ICFzaG93VmVyc2lvbnNcIlxyXG4gICAgICBAbW91c2VlbnRlcj1cImhpZ2hsaWdodE9iamVjdFwiXHJcbiAgICAgIEBtb3VzZWxlYXZlPVwidW5oaWdobGlnaHRPYmplY3RcIlxyXG4gICAgICBAZm9jdXNpbj1cImhpZ2hsaWdodE9iamVjdFwiXHJcbiAgICAgIEBmb2N1c291dD1cInVuaGlnaGxpZ2h0T2JqZWN0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy92ZXJzaW9ucy9DYXJkLnZ1ZTo2OjVcIlxyXG4gICAgPlxyXG4gICAgICA8Vmlld2VyRXhwYW5zaW9uVHJpYW5nbGVcclxuICAgICAgICBjbGFzcz1cImgtOFwiXHJcbiAgICAgICAgOmlzLWV4cGFuZGVkPVwic2hvd1ZlcnNpb25zXCJcclxuICAgICAgICBAY2xpY2s9XCJzaG93VmVyc2lvbnMgPSAhc2hvd1ZlcnNpb25zXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy92ZXJzaW9ucy9DYXJkLnZ1ZToxNDo3XCJcclxuICAgICAgLz5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiaC0xMiB3LTEyIHJvdW5kZWQtbWQgb3ZlcmZsb3ctaGlkZGVuIGJvcmRlciBib3JkZXItb3V0bGluZS0zIG1yLTMgc2hyaW5rLTBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL3ZlcnNpb25zL0NhcmQudnVlOjE5OjdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPFByZXZpZXdJbWFnZVxyXG4gICAgICAgICAgdi1pZj1cImxvYWRlZFZlcnNpb24/LnByZXZpZXdVcmxcIlxyXG4gICAgICAgICAgOnByZXZpZXctdXJsPVwibG9hZGVkVmVyc2lvbj8ucHJldmlld1VybFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvdmVyc2lvbnMvQ2FyZC52dWU6MjI6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy92ZXJzaW9ucy9DYXJkLnZ1ZToyNzo3XCI+XHJcbiAgICAgICAgPHNwYW5cclxuICAgICAgICAgIHYtdGlwcHk9XCJtb2RlbE5hbWUuc3ViaGVhZGVyID8gbW9kZWwubmFtZSA6IG51bGxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQgdGV4dC1ib2R5LTJ4cyBmb250LW1lZGl1bVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvdmVyc2lvbnMvQ2FyZC52dWU6Mjg6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgbW9kZWxOYW1lLmhlYWRlciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3BhbiB2LWlmPVwiaXNMYXRlc3RcIiBjbGFzcz1cInRleHQtYm9keS0zeHMgdGV4dC1mb3JlZ3JvdW5kXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy92ZXJzaW9ucy9DYXJkLnZ1ZTozNDo5XCI+XHJcbiAgICAgICAgICBMYXRlc3QgdmVyc2lvblxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3BhbiB2LXRpcHB5PVwiY3JlYXRlZEF0Rm9ybWF0dGVkLmZ1bGxcIiBjbGFzcz1cInRleHQtYm9keS0zeHMgdGV4dC1mb3JlZ3JvdW5kLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL3ZlcnNpb25zL0NhcmQudnVlOjM3OjlcIj5cclxuICAgICAgICAgIHt7IGNyZWF0ZWRBdEZvcm1hdHRlZC5yZWxhdGl2ZSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1mb3JlZ3JvdW5kLTIgdGV4dC1ib2R5LTN4cyBmb250LW1lZGl1bSBtbC1hdXRvIHByLTNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL3ZlcnNpb25zL0NhcmQudnVlOjQxOjdcIj5cclxuICAgICAgICB7eyBtb2RlbC52ZXJzaW9ucz8udG90YWxDb3VudCB9fVxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFZlcnNpb24gTGlzdCAtLT5cclxuICAgIDxkaXYgdi1zaG93PVwic2hvd1ZlcnNpb25zXCIgY2xhc3M9XCJmbGV4LWNvbFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvdmVyc2lvbnMvQ2FyZC52dWU6NDc6NVwiPlxyXG4gICAgICA8Vmlld2VyUmVzb3VyY2VzVmVyc2lvbkNhcmRcclxuICAgICAgICB2LWZvcj1cIih2ZXJzaW9uLCBpbmRleCkgaW4gcHJvcHMubW9kZWwudmVyc2lvbnMuaXRlbXNcIlxyXG4gICAgICAgIDprZXk9XCJ2ZXJzaW9uLmlkXCJcclxuICAgICAgICA6bW9kZWwtaWQ9XCJtb2RlbElkXCJcclxuICAgICAgICA6dmVyc2lvbj1cInZlcnNpb25cIlxyXG4gICAgICAgIDppcy1sYXRlc3QtdmVyc2lvbj1cInZlcnNpb24uaWQgPT09IGxhdGVzdFZlcnNpb25JZFwiXHJcbiAgICAgICAgOmlzLWxvYWRlZC12ZXJzaW9uPVwidmVyc2lvbi5pZCA9PT0gbG9hZGVkVmVyc2lvbj8uaWRcIlxyXG4gICAgICAgIDpsYXN0PVwiaW5kZXggPT09IHByb3BzLm1vZGVsLnZlcnNpb25zLnRvdGFsQ291bnQgLSAxXCJcclxuICAgICAgICA6bGFzdC1sb2FkZWQ9XCJpbmRleCA9PT0gcHJvcHMubW9kZWwudmVyc2lvbnMuaXRlbXMubGVuZ3RoIC0gMVwiXHJcbiAgICAgICAgOmNsaWNrYWJsZT1cInZlcnNpb24uaWQgIT09IGxvYWRlZFZlcnNpb24/LmlkXCJcclxuICAgICAgICA6dG90YWwtdmVyc2lvbnM9XCJwcm9wcy5tb2RlbC52ZXJzaW9ucy50b3RhbENvdW50XCJcclxuICAgICAgICBAY2hhbmdlLXZlcnNpb249XCJoYW5kbGVWZXJzaW9uQ2hhbmdlXCJcclxuICAgICAgICBAdmlldy1jaGFuZ2VzPVwiaGFuZGxlVmlld0NoYW5nZXNcIlxyXG4gICAgICAgIEByZW1vdmUtdmVyc2lvbj1cImhhbmRsZVJlbW92ZVZlcnNpb25cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL3ZlcnNpb25zL0NhcmQudnVlOjQ4OjdcIlxyXG4gICAgICAvPlxyXG4gICAgICA8ZGl2IHYtaWY9XCJzaG93TG9hZE1vcmVcIiBjbGFzcz1cIm10LTQgcHItMiBweS0yIC1tbC0zXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy92ZXJzaW9ucy9DYXJkLnZ1ZTo2Mzo3XCI+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIGZ1bGwtd2lkdGhcclxuICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICB0ZXh0XHJcbiAgICAgICAgICBjb2xvcj1cInN1YnRsZVwiXHJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCIhc2hvd0xvYWRNb3JlXCJcclxuICAgICAgICAgIEBjbGljaz1cIm9uTG9hZE1vcmVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL3ZlcnNpb25zL0NhcmQudnVlOjY0OjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIFZpZXcgb2xkZXIgdmVyc2lvbnNcclxuICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBWZXJzaW9uIERlbGV0ZSBEaWFsb2cgLS0+XHJcbiAgICA8UHJvamVjdE1vZGVsUGFnZURpYWxvZ0RlbGV0ZVxyXG4gICAgICB2LWlmPVwicHJvamVjdD8uaWRcIlxyXG4gICAgICB2LW1vZGVsOm9wZW49XCJzaG93RGVsZXRlRGlhbG9nXCJcclxuICAgICAgOnByb2plY3QtaWQ9XCJwcm9qZWN0LmlkXCJcclxuICAgICAgOm1vZGVsLWlkPVwibW9kZWwuaWRcIlxyXG4gICAgICA6dmVyc2lvbnM9XCJ2ZXJzaW9uc1RvRGVsZXRlXCJcclxuICAgICAgQGRlbGV0ZWQ9XCJvblZlcnNpb25EZWxldGVkXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy92ZXJzaW9ucy9DYXJkLnZ1ZTo3ODo1XCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXHJcbmltcG9ydCB7IGdyYXBocWwgfSBmcm9tICd+fi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwnXHJcbmltcG9ydCB0eXBlIHtcclxuICBWaWV3ZXJMb2FkZWRSZXNvdXJjZXNRdWVyeSxcclxuICBWaWV3ZXJNb2RlbFZlcnNpb25DYXJkSXRlbUZyYWdtZW50XHJcbn0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB0eXBlIHsgR2V0IH0gZnJvbSAndHlwZS1mZXN0J1xyXG5pbXBvcnQge1xyXG4gIHVzZUluamVjdGVkVmlld2VyTG9hZGVkUmVzb3VyY2VzLFxyXG4gIHVzZUluamVjdGVkVmlld2VyUmVxdWVzdGVkUmVzb3VyY2VzLFxyXG4gIHVzZUluamVjdGVkVmlld2VyU3RhdGVcclxufSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQge1xyXG4gIHVzZURpZmZVdGlsaXRpZXMsXHJcbiAgdXNlSGlnaGxpZ2h0ZWRPYmplY3RzVXRpbGl0aWVzXHJcbn0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy91aSdcclxuXHJcbnR5cGUgTW9kZWxJdGVtID0gTm9uTnVsbGFibGU8R2V0PFZpZXdlckxvYWRlZFJlc291cmNlc1F1ZXJ5LCAncHJvamVjdC5tb2RlbHMuaXRlbXNbMF0nPj5cclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8e1xyXG4gIG1vZGVsOiBNb2RlbEl0ZW1cclxuICB2ZXJzaW9uSWQ6IHN0cmluZ1xyXG4gIGxhc3Q6IGJvb2xlYW5cclxuICBpbml0aWFsbHlFeHBhbmRlZD86IGJvb2xlYW5cclxufT4oKVxyXG5cclxuY29uc3QgeyBzd2l0Y2hNb2RlbFRvVmVyc2lvbiB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJSZXF1ZXN0ZWRSZXNvdXJjZXMoKVxyXG5jb25zdCB7IGxvYWRNb3JlVmVyc2lvbnMgfSA9IHVzZUluamVjdGVkVmlld2VyTG9hZGVkUmVzb3VyY2VzKClcclxuY29uc3QgeyBkaWZmTW9kZWxWZXJzaW9ucyB9ID0gdXNlRGlmZlV0aWxpdGllcygpXHJcbmNvbnN0IHsgaGlnaGxpZ2h0T2JqZWN0cywgdW5oaWdobGlnaHRPYmplY3RzIH0gPSB1c2VIaWdobGlnaHRlZE9iamVjdHNVdGlsaXRpZXMoKVxyXG5jb25zdCB7XHJcbiAgcmVzb3VyY2VzOiB7XHJcbiAgICByZXNwb25zZTogeyBwcm9qZWN0IH1cclxuICB9XHJcbn0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuY29uc3QgeyBmb3JtYXR0ZWRSZWxhdGl2ZURhdGUsIGZvcm1hdHRlZEZ1bGxEYXRlIH0gPSB1c2VEYXRlRm9ybWF0dGVycygpXHJcblxyXG5jb25zdCBzaG93VmVyc2lvbnMgPSByZWYoISFwcm9wcy5pbml0aWFsbHlFeHBhbmRlZClcclxuY29uc3Qgc2hvd0RlbGV0ZURpYWxvZyA9IHJlZihmYWxzZSlcclxuY29uc3QgdmVyc2lvbnNUb0RlbGV0ZSA9IHJlZjx7IGlkOiBzdHJpbmc7IG1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsIH1bXT4oW10pXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBWaWV3ZXJNb2RlbFZlcnNpb25DYXJkSXRlbSBvbiBWZXJzaW9uIHtcclxuICAgIGlkXHJcbiAgICBtZXNzYWdlXHJcbiAgICByZWZlcmVuY2VkT2JqZWN0XHJcbiAgICBzb3VyY2VBcHBsaWNhdGlvblxyXG4gICAgY3JlYXRlZEF0XHJcbiAgICBwcmV2aWV3VXJsXHJcbiAgICBhdXRob3JVc2VyIHtcclxuICAgICAgLi4uTGltaXRlZFVzZXJBdmF0YXJcclxuICAgIH1cclxuICB9XHJcbmApXHJcblxyXG5jb25zdCBtb2RlbElkID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMubW9kZWwuaWQpXHJcbmNvbnN0IHZlcnNpb25zID0gY29tcHV0ZWQoKCkgPT4gW1xyXG4gIC4uLnByb3BzLm1vZGVsLmxvYWRlZFZlcnNpb24uaXRlbXMsXHJcbiAgLi4ucHJvcHMubW9kZWwudmVyc2lvbnMuaXRlbXNcclxuXSlcclxuY29uc3Qgc2hvd0xvYWRNb3JlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IHRvdGFsQ291bnQgPSBwcm9wcy5tb2RlbC52ZXJzaW9ucy50b3RhbENvdW50XHJcbiAgY29uc3QgY3VycmVudENvdW50ID0gdmVyc2lvbnMudmFsdWUubGVuZ3RoXHJcbiAgcmV0dXJuIGN1cnJlbnRDb3VudCA8IHRvdGFsQ291bnRcclxufSlcclxuXHJcbmNvbnN0IGxvYWRlZFZlcnNpb24gPSBjb21wdXRlZCgoKSA9PlxyXG4gIHZlcnNpb25zLnZhbHVlLmZpbmQoKHYpID0+IHYuaWQgPT09IHByb3BzLnZlcnNpb25JZClcclxuKVxyXG5cclxuY29uc3QgY3JlYXRlZEF0ID0gY29tcHV0ZWQoKCkgPT4gbG9hZGVkVmVyc2lvbi52YWx1ZT8uY3JlYXRlZEF0KVxyXG5cclxuY29uc3QgY3JlYXRlZEF0Rm9ybWF0dGVkID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICBmdWxsOiBmb3JtYXR0ZWRGdWxsRGF0ZShjcmVhdGVkQXQudmFsdWUpLFxyXG4gICAgcmVsYXRpdmU6IGZvcm1hdHRlZFJlbGF0aXZlRGF0ZShjcmVhdGVkQXQudmFsdWUsIHsgY2FwaXRhbGl6ZTogdHJ1ZSB9KVxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGxhdGVzdFZlcnNpb24gPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIHZlcnNpb25zLnZhbHVlXHJcbiAgICAuc2xpY2UoKVxyXG4gICAgLnNvcnQoKGEsIGIpID0+IChkYXlqcyhhLmNyZWF0ZWRBdCkuaXNCZWZvcmUoZGF5anMoYi5jcmVhdGVkQXQpKSA/IDEgOiAtMSkpWzBdXHJcbn0pXHJcblxyXG5jb25zdCBpc0xhdGVzdCA9IGNvbXB1dGVkKCgpID0+IGxvYWRlZFZlcnNpb24udmFsdWU/LmlkID09PSBsYXRlc3RWZXJzaW9uLnZhbHVlLmlkKVxyXG5cclxuY29uc3QgbGF0ZXN0VmVyc2lvbklkID0gY29tcHV0ZWQoKCkgPT4gbGF0ZXN0VmVyc2lvbi52YWx1ZS5pZClcclxuXHJcbmNvbnN0IG1vZGVsTmFtZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBwYXJ0cyA9IHByb3BzLm1vZGVsLm5hbWUuc3BsaXQoJy8nKVxyXG4gIHJldHVybiB7XHJcbiAgICBzdWJoZWFkZXI6IHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0cy5zbGljZSgwLCAtMSkuam9pbignLycpIDogbnVsbCxcclxuICAgIGhlYWRlcjogcGFydHNbcGFydHMubGVuZ3RoIC0gMV1cclxuICB9XHJcbn0pXHJcblxyXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVWZXJzaW9uQ2hhbmdlKHZlcnNpb25JZDogc3RyaW5nKSB7XHJcbiAgYXdhaXQgc3dpdGNoTW9kZWxUb1ZlcnNpb24ocHJvcHMubW9kZWwuaWQsIHZlcnNpb25JZClcclxufVxyXG5cclxuY29uc3Qgb25Mb2FkTW9yZSA9IGFzeW5jICgpID0+IHtcclxuICBhd2FpdCBsb2FkTW9yZVZlcnNpb25zKHByb3BzLm1vZGVsLmlkKVxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVWaWV3Q2hhbmdlcyh2ZXJzaW9uOiBWaWV3ZXJNb2RlbFZlcnNpb25DYXJkSXRlbUZyYWdtZW50KSB7XHJcbiAgaWYgKCFsb2FkZWRWZXJzaW9uLnZhbHVlPy5pZCkgcmV0dXJuXHJcbiAgYXdhaXQgZGlmZk1vZGVsVmVyc2lvbnMobW9kZWxJZC52YWx1ZSwgbG9hZGVkVmVyc2lvbi52YWx1ZS5pZCwgdmVyc2lvbi5pZClcclxufVxyXG5cclxuY29uc3QgaGlnaGxpZ2h0T2JqZWN0ID0gKCkgPT4ge1xyXG4gIGNvbnN0IHJlZk9iamVjdCA9IHByb3BzLm1vZGVsLmxvYWRlZFZlcnNpb24uaXRlbXNbMF0/LnJlZmVyZW5jZWRPYmplY3RcclxuICBpZiAocmVmT2JqZWN0ICYmIHR5cGVvZiByZWZPYmplY3QgPT09ICdzdHJpbmcnKSBoaWdobGlnaHRPYmplY3RzKFtyZWZPYmplY3RdKVxyXG59XHJcblxyXG5jb25zdCB1bmhpZ2hsaWdodE9iamVjdCA9ICgpID0+IHtcclxuICBjb25zdCByZWZPYmplY3QgPSBwcm9wcy5tb2RlbC5sb2FkZWRWZXJzaW9uLml0ZW1zWzBdPy5yZWZlcmVuY2VkT2JqZWN0XHJcbiAgaWYgKHJlZk9iamVjdCAmJiB0eXBlb2YgcmVmT2JqZWN0ID09PSAnc3RyaW5nJykgdW5oaWdobGlnaHRPYmplY3RzKFtyZWZPYmplY3RdKVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVSZW1vdmVWZXJzaW9uID0gKHZlcnNpb25JZDogc3RyaW5nKSA9PiB7XHJcbiAgLy8gRmluZCB0aGUgdmVyc2lvbiB0byBkZWxldGVcclxuICBjb25zdCB2ZXJzaW9uVG9EZWxldGUgPSB2ZXJzaW9ucy52YWx1ZS5maW5kKCh2KSA9PiB2LmlkID09PSB2ZXJzaW9uSWQpXHJcbiAgaWYgKHZlcnNpb25Ub0RlbGV0ZSkge1xyXG4gICAgdmVyc2lvbnNUb0RlbGV0ZS52YWx1ZSA9IFtcclxuICAgICAgeyBpZDogdmVyc2lvblRvRGVsZXRlLmlkLCBtZXNzYWdlOiB2ZXJzaW9uVG9EZWxldGUubWVzc2FnZSB9XHJcbiAgICBdXHJcbiAgICBzaG93RGVsZXRlRGlhbG9nLnZhbHVlID0gdHJ1ZVxyXG4gIH1cclxufVxyXG5cclxuY29uc3Qgb25WZXJzaW9uRGVsZXRlZCA9ICgpID0+IHtcclxuICAvLyBSZWZyZXNoIHRoZSB2ZXJzaW9ucyBsaXN0IGFmdGVyIHN1Y2Nlc3NmdWwgZGVsZXRpb25cclxuICBsb2FkTW9yZVZlcnNpb25zKHByb3BzLm1vZGVsLmlkKVxyXG59XHJcblxyXG53YXRjaChzaG93RGVsZXRlRGlhbG9nLCAoaXNPcGVuKSA9PiB7XHJcbiAgaWYgKCFpc09wZW4pIHtcclxuICAgIHZlcnNpb25zVG9EZWxldGUudmFsdWUgPSBbXVxyXG4gIH1cclxufSlcclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvdmVyc2lvbnMvQ2FyZC52dWUifQ==