import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/resources/VersionCard.vue");import { FormButton as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { LayoutMenu as __nuxt_component_1 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_2 } from "/_nuxt/components/preview/Image.vue"; import { default as __nuxt_component_3 } from "/_nuxt/components/viewer/resources/LimitAlert.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createVNode as __createVNode,createElementBlock as __createElementBlock,createElementVNode as __createElementVNode,createBlock as __createBlock } 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 _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) } function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) } function _createBlock(...args) { return _interopVNode(__createBlock(...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 { CommonBadge, keyboardClick } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; 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 __vite__cjsImport8_dayjs_plugin_localizedFormat from "/_nuxt/node_modules/.cache/vite/client/deps/dayjs_plugin_localizedFormat.js?v=e4f18c29"; const localizedFormat = __vite__cjsImport8_dayjs_plugin_localizedFormat.__esModule ? __vite__cjsImport8_dayjs_plugin_localizedFormat.default : __vite__cjsImport8_dayjs_plugin_localizedFormat; import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { HorizontalDirection } from "/_nuxt/lib/common/composables/window.ts"; import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts"; import { useCopyModelLink } from "/_nuxt/lib/projects/composables/modelManagement.ts"; import { Ellipsis, Check, Lock } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29"; import { useDateFormatters } from "/_nuxt/composables/dates.ts"; import { computed, ref } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ViewerResourcesVersionCard", props: { version: { type: Object, required: true }, clickable: { type: Boolean, required: false, default: true }, isLatestVersion: { type: Boolean, required: true }, isLoadedVersion: { type: Boolean, required: true }, showTimeline: { type: Boolean, required: false, default: true }, last: { type: Boolean, required: true, default: false }, lastLoaded: { type: Boolean, required: true, default: false }, modelId: { type: String, required: false }, totalVersions: { type: Number, required: false } }, emits: ["changeVersion", "viewChanges", "removeVersion"], setup(__props, { expose: __expose, emit: __emit }) { __expose(); dayjs.extend(localizedFormat); const props = __props; const emit = __emit; const mp = useMixpanel(); const { resources: { response: { project } } } = useInjectedViewerState(); const copyModelLink = useCopyModelLink(); const { formattedRelativeDate, formattedFullDate } = useDateFormatters(); const isLoaded = computed(() => props.isLoadedVersion); const isLatest = computed(() => props.isLatestVersion); const isLimited = computed(() => { return props.version.referencedObject === null; }); const createdAt = computed(() => { return { full: formattedFullDate(props.version.createdAt), relative: formattedRelativeDate(props.version.createdAt, { capitalize: true }) }; }); const author = computed(() => props.version.authorUser); const showActionsMenu = ref(false); const canDeleteVersion = computed(() => { if (isLoaded.value) return false; if (props.totalVersions && props.totalVersions <= 1) return false; return true; }); const deleteDisabledReason = computed(() => { if (isLoaded.value) { return "Cannot delete the currently viewed version"; } if (props.totalVersions && props.totalVersions <= 1) { return "Cannot delete the last version"; } return void 0; }); const actionsItems = computed(() => [ [ { title: "View changes", id: "view-changes", disabled: isLoaded.value || isLimited.value, disabledTooltip: isLoaded.value ? "Cannot compare current version with itself" : isLimited.value ? "Version comparison unavailable" : void 0 }, { title: "Copy link to version", id: "copy-link-to-version", disabled: isLimited.value, disabledTooltip: isLimited.value ? "Outside workspace version limits" : void 0 } ], [ { title: "Delete version...", id: "remove-version", disabled: !canDeleteVersion.value, disabledTooltip: deleteDisabledReason.value } ] ]); const handleClick = () => { if (isLimited.value) return; if (props.clickable) emit("changeVersion", props.version.id); mp.track("Viewer Action", { type: "action", name: "change-version" }); }; const handleViewChanges = () => { emit("viewChanges", props.version); mp.track("Viewer Action", { type: "action", name: "diffs", action: "enable" }); }; const onActionChosen = (params) => { const { item } = params; switch (item.id) { case "view-changes": if (!isLoaded.value && !isLimited.value) { handleViewChanges(); } break; case "copy-link-to-version": if (project.value?.id && props.modelId) { void copyModelLink({ model: { projectId: project.value.id, id: props.modelId }, versionId: props.version.id }); } break; case "remove-version": if (canDeleteVersion.value) { emit("removeVersion", props.version.id); } break; } }; const __returned__ = { props, emit, mp, project, copyModelLink, formattedRelativeDate, formattedFullDate, isLoaded, isLatest, isLimited, createdAt, author, showActionsMenu, canDeleteVersion, deleteDisabledReason, actionsItems, handleClick, handleViewChanges, onActionChosen, get CommonBadge() { return CommonBadge; }, get keyboardClick() { return keyboardClick; }, get HorizontalDirection() { return HorizontalDirection; }, get Ellipsis() { return Ellipsis; }, get Check() { return Check; }, get Lock() { return Lock; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { createCommentVNode as _createCommentVNode, openBlock as _openBlock, normalizeClass as _normalizeClass, toDisplayString as _toDisplayString, vShow as _vShow, resolveDirective as _resolveDirective, withDirectives as _withDirectives, createTextVNode as _createTextVNode, withCtx as _withCtx, resolveComponent as _resolveComponent, withModifiers as _withModifiers } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { key: 0, class: "absolute -top-1.5 -left-2 flex items-center justify-center h-4 w-4 bg-foundation-2 rounded-full", "data-v-inspector": "components/viewer/resources/VersionCard.vue:17:7" }; const _hoisted_2 = { key: 1, class: "absolute top-0 -left-[2px] h-[3px] w-[3px] bg-foreground rounded-full", "data-v-inspector": "components/viewer/resources/VersionCard.vue:23:7" }; const _hoisted_3 = { class: "flex items-center gap-1", "data-v-inspector": "components/viewer/resources/VersionCard.vue:29:5" }; const _hoisted_4 = { class: "rounded-full px-2 text-body-xs font-medium ml-3", "data-v-inspector": "components/viewer/resources/VersionCard.vue:30:7" }; const _hoisted_5 = { "data-v-inspector": "components/viewer/resources/VersionCard.vue:35:9" }; const _hoisted_6 = { class: "ml-auto mr-2 mt-0.5", "data-v-inspector": "components/viewer/resources/VersionCard.vue:40:7" }; const _hoisted_7 = { class: "flex items-center pl-5 gap-2 mt-1", "data-v-inspector": "components/viewer/resources/VersionCard.vue:62:5" }; const _hoisted_8 = { key: 0, class: "flex items-center justify-center w-full h-full", "data-v-inspector": "components/viewer/resources/VersionCard.vue:67:9" }; const _hoisted_9 = { class: "flex h-8 w-8 items-center justify-center rounded-md bg-foundation border border-outline-3", "data-v-inspector": "components/viewer/resources/VersionCard.vue:68:11" }; const _hoisted_10 = { class: "flex flex-col space-y-1 overflow-hidden", "data-v-inspector": "components/viewer/resources/VersionCard.vue:76:7" }; const _hoisted_11 = { class: "flex min-w-0 items-center space-x-1", "data-v-inspector": "components/viewer/resources/VersionCard.vue:77:9" }; const _hoisted_12 = { key: 1, class: "truncate pr-2", "data-v-inspector": "components/viewer/resources/VersionCard.vue:84:11" }; const _hoisted_13 = { key: 0, class: "text-body-2xs truncate", "data-v-inspector": "components/viewer/resources/VersionCard.vue:85:13" }; const _hoisted_14 = { class: "text-body-3xs text-foreground-2 truncate", "data-v-inspector": "components/viewer/resources/VersionCard.vue:88:13" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_FormButton = __nuxt_component_0; const _component_LayoutMenu = __nuxt_component_1; const _component_PreviewImage = __nuxt_component_2; const _component_ViewerResourcesLimitAlert = __nuxt_component_3; const _directive_tippy = _resolveDirective("tippy"); return _openBlock(), _createElementBlock( "div", { class: _normalizeClass([ "group relative w-full rounded-md text-left pl-5 pt-1 pb-2", $props.clickable && !$setup.isLimited ? "hover:bg-highlight-1 cursor-pointer" : "cursor-default" ]), onClick: $setup.handleClick, onKeypress: _cache[3] || (_cache[3] = ($event) => $setup.keyboardClick($setup.handleClick)), "data-v-inspector": "components/viewer/resources/VersionCard.vue:3:3" }, [ _createCommentVNode(" Timeline left border "), $props.showTimeline ? (_openBlock(), _createElementBlock( "div", { key: 0, class: _normalizeClass(["absolute top-4 left-4 z-10 ml-[2px] mt-[2px] w-1 border-l border-outline-3", $props.last ? "h-0" : "h-[99%]"]), "data-v-inspector": "components/viewer/resources/VersionCard.vue:12:5" }, [ $setup.isLoaded ? (_openBlock(), _createElementBlock("div", _hoisted_1, [ _createVNode($setup["Check"], { class: "h-3 w-3 text-foreground", "data-v-inspector": "components/viewer/resources/VersionCard.vue:21:9" }) ])) : (_openBlock(), _createElementBlock("div", _hoisted_2)) ], 2 /* CLASS */ )) : _createCommentVNode("v-if", true), _createElementVNode("div", _hoisted_3, [ _withDirectives((_openBlock(), _createElementBlock("div", _hoisted_4, [ _createElementVNode( "span", _hoisted_5, _toDisplayString($setup.isLatest ? "Latest" : $setup.createdAt.relative), 1 /* TEXT */ ) ])), [ [_vShow, $props.showTimeline], [_directive_tippy, $setup.createdAt.full] ]), $setup.isLoaded ? (_openBlock(), _createBlock($setup["CommonBadge"], { key: 0, rounded: "", "data-v-inspector": "components/viewer/resources/VersionCard.vue:39:7" }, { default: _withCtx(() => [..._cache[4] || (_cache[4] = [ _createTextVNode( "Viewing", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ })) : _createCommentVNode("v-if", true), _createElementVNode("div", _hoisted_6, [ _createVNode(_component_LayoutMenu, { open: $setup.showActionsMenu, "onUpdate:open": _cache[1] || (_cache[1] = ($event) => $setup.showActionsMenu = $event), items: $setup.actionsItems, "menu-position": $setup.HorizontalDirection.Left, "mount-menu-on-body": "", onClick: _cache[2] || (_cache[2] = _withModifiers(() => { }, ["stop", "prevent"])), onChosen: $setup.onActionChosen, "data-v-inspector": "components/viewer/resources/VersionCard.vue:41:9" }, { default: _withCtx(() => [ _createVNode(_component_FormButton, { "hide-text": "", color: "subtle", "icon-left": $setup.Ellipsis, size: "sm", onClick: _cache[0] || (_cache[0] = _withModifiers(($event) => $setup.showActionsMenu = !$setup.showActionsMenu, ["stop"])), "data-v-inspector": "components/viewer/resources/VersionCard.vue:49:11" }, { default: _withCtx(() => [..._cache[5] || (_cache[5] = [ _createTextVNode( " Menu ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }, 8, ["icon-left"]) ]), _: 1 /* STABLE */ }, 8, ["open", "items", "menu-position"]) ]) ]), _createCommentVNode(" Main stuff "), _createElementVNode("div", _hoisted_7, [ _createElementVNode( "div", { class: _normalizeClass(["bg-foundation h-12 w-12 flex-shrink-0 rounded-md border border-outline-3", $setup.isLimited ? "diagonal-stripes" : ""]), "data-v-inspector": "components/viewer/resources/VersionCard.vue:63:7" }, [ $setup.isLimited ? (_openBlock(), _createElementBlock("div", _hoisted_8, [ _createElementVNode("div", _hoisted_9, [ _createVNode($setup["Lock"], { class: "h-4 w-4 text-foreground-3", "data-v-inspector": "components/viewer/resources/VersionCard.vue:71:13" }) ]) ])) : (_openBlock(), _createBlock(_component_PreviewImage, { key: 1, "preview-url": $props.version.previewUrl, "data-v-inspector": "components/viewer/resources/VersionCard.vue:74:9" }, null, 8, ["preview-url"])) ], 2 /* CLASS */ ), _createElementVNode("div", _hoisted_10, [ _createElementVNode("div", _hoisted_11, [ $setup.isLimited ? (_openBlock(), _createBlock(_component_ViewerResourcesLimitAlert, { key: 0, "limit-type": "version", variant: "inline", project: $setup.project, "data-v-inspector": "components/viewer/resources/VersionCard.vue:78:11" }, null, 8, ["project"])) : (_openBlock(), _createElementBlock("div", _hoisted_12, [ $setup.author ? (_openBlock(), _createElementBlock( "div", _hoisted_13, _toDisplayString($setup.author.name), 1 /* TEXT */ )) : _createCommentVNode("v-if", true), _createElementVNode( "div", _hoisted_14, _toDisplayString($props.version.message || "no message"), 1 /* TEXT */ ) ])) ]) ]) ]) ], 34 /* CLASS, NEED_HYDRATION */ ); } _sfc_main.__hmrId = "ae9e9e77"; 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/resources/VersionCard.vue"]]); //# sourceMappingURL=data:application/json;base64,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UFg7QUFBQSxnQkFDQSxPQUFNO0FBQUEsZ0JBQ0wsYUFBVztBQUFBLGdCQUNaLE1BQUs7QUFBQSxnQkFDSixTQUFLLHFEQUFPLHlCQUFlLENBQUksd0JBQWU7QUFBQSxnQkFBRSxvQkFBaUI7QUFBQTtrQ0FDbkUsTUFFRDtBQUFBO29CQUZDO0FBQUEsb0JBRUQ7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7TUFJTjtBQUFBLE1BQ0Esb0JBZ0NNLE9BaENOLFlBZ0NNO0FBQUEsUUEvQko7QUFBQSxVQVlNO0FBQUE7QUFBQSxZQVhKLE9BQUssaUJBQUMsNEVBQ0UsbUJBQVM7QUFBQSxZQUE0QixvQkFBaUI7QUFBQTs7WUFFbkQsa0NBQVgsb0JBTU0sT0FOTixZQU1NO0FBQUEsY0FMSixvQkFJTSxPQUpOLFlBSU07QUFBQSxnQkFESixhQUErRztBQUFBLGtCQUF6RyxPQUFNO0FBQUEsa0JBQTRCLG9CQUFpQjtBQUFBOztpQ0FHN0QsYUFBNkg7QUFBQTtjQUF2RyxlQUFhLGVBQVE7QUFBQSxjQUFZLG9CQUFpQjtBQUFBOzs7OztRQUUxRSxvQkFpQk0sT0FqQk4sYUFpQk07QUFBQSxVQWhCSixvQkFlTSxPQWZOLGFBZU07QUFBQSxZQWJJLGtDQURSLGFBS0U7QUFBQTtjQUhBLGNBQVc7QUFBQSxjQUNYLFNBQVE7QUFBQSxjQUNQLFNBQVM7QUFBQSxjQUFTLG9CQUFpQjtBQUFBLHVEQUV0QyxvQkFPTSxPQVBOLGFBT007QUFBQSxjQU5PLCtCQUFYO0FBQUEsZ0JBRU07QUFBQSxnQkFGTjtBQUFBLGdCQUVNLGlCQURELGNBQU8sSUFBSTtBQUFBO0FBQUE7QUFBQTtjQUVoQjtBQUFBLGdCQUVNO0FBQUEsZ0JBRk47QUFBQSxnQkFFTSxpQkFERCxlQUFRLFdBQU87QUFBQTtBQUFBO0FBQUE7QUFBQSIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiVmVyc2lvbkNhcmQudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlanMtYWNjZXNzaWJpbGl0eS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgLS0+XHJcbjx0ZW1wbGF0ZT5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImdyb3VwIHJlbGF0aXZlIHctZnVsbCByb3VuZGVkLW1kIHRleHQtbGVmdCBwbC01IHB0LTEgcGItMlwiXHJcbiAgICA6Y2xhc3M9XCJcclxuICAgICAgY2xpY2thYmxlICYmICFpc0xpbWl0ZWQgPyAnaG92ZXI6YmctaGlnaGxpZ2h0LTEgY3Vyc29yLXBvaW50ZXInIDogJ2N1cnNvci1kZWZhdWx0J1xyXG4gICAgXCJcclxuICAgIEBjbGljaz1cImhhbmRsZUNsaWNrXCJcclxuICAgIEBrZXlwcmVzcz1cImtleWJvYXJkQ2xpY2soaGFuZGxlQ2xpY2spXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6MzozXCJcclxuICA+XHJcbiAgICA8IS0tIFRpbWVsaW5lIGxlZnQgYm9yZGVyIC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICB2LWlmPVwic2hvd1RpbWVsaW5lXCJcclxuICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtNCBsZWZ0LTQgei0xMCBtbC1bMnB4XSBtdC1bMnB4XSB3LTEgYm9yZGVyLWwgYm9yZGVyLW91dGxpbmUtM1wiXHJcbiAgICAgIDpjbGFzcz1cImxhc3QgPyAnaC0wJyA6ICdoLVs5OSVdJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjEyOjVcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgdi1pZj1cImlzTG9hZGVkXCJcclxuICAgICAgICBjbGFzcz1cImFic29sdXRlIC10b3AtMS41IC1sZWZ0LTIgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgaC00IHctNCBiZy1mb3VuZGF0aW9uLTIgcm91bmRlZC1mdWxsXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6MTc6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8Q2hlY2sgY2xhc3M9XCJoLTMgdy0zIHRleHQtZm9yZWdyb3VuZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjIxOjlcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtZWxzZVxyXG4gICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdG9wLTAgLWxlZnQtWzJweF0gaC1bM3B4XSB3LVszcHhdIGJnLWZvcmVncm91bmQgcm91bmRlZC1mdWxsXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6MjM6N1wiXHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZToyOTo1XCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICB2LXNob3c9XCJzaG93VGltZWxpbmVcIlxyXG4gICAgICAgIHYtdGlwcHk9XCJjcmVhdGVkQXQuZnVsbFwiXHJcbiAgICAgICAgY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcHgtMiB0ZXh0LWJvZHkteHMgZm9udC1tZWRpdW0gbWwtM1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjMwOjdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHNwYW4gZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6MzU6OVwiPlxyXG4gICAgICAgICAge3sgaXNMYXRlc3QgPyAnTGF0ZXN0JyA6IGNyZWF0ZWRBdC5yZWxhdGl2ZSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxDb21tb25CYWRnZSB2LWlmPVwiaXNMb2FkZWRcIiByb3VuZGVkIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjM5OjdcIj5WaWV3aW5nPC9Db21tb25CYWRnZT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1sLWF1dG8gbXItMiBtdC0wLjVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZTo0MDo3XCI+XHJcbiAgICAgICAgPExheW91dE1lbnVcclxuICAgICAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dBY3Rpb25zTWVudVwiXHJcbiAgICAgICAgICA6aXRlbXM9XCJhY3Rpb25zSXRlbXNcIlxyXG4gICAgICAgICAgOm1lbnUtcG9zaXRpb249XCJIb3Jpem9udGFsRGlyZWN0aW9uLkxlZnRcIlxyXG4gICAgICAgICAgbW91bnQtbWVudS1vbi1ib2R5XHJcbiAgICAgICAgICBAY2xpY2suc3RvcC5wcmV2ZW50XHJcbiAgICAgICAgICBAY2hvc2VuPVwib25BY3Rpb25DaG9zZW5cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZTo0MTo5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICBoaWRlLXRleHRcclxuICAgICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgICA6aWNvbi1sZWZ0PVwiRWxsaXBzaXNcIlxyXG4gICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICBAY2xpY2suc3RvcD1cInNob3dBY3Rpb25zTWVudSA9ICFzaG93QWN0aW9uc01lbnVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZTo0OToxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIE1lbnVcclxuICAgICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgICA8L0xheW91dE1lbnU+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIE1haW4gc3R1ZmYgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcGwtNSBnYXAtMiBtdC0xXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6NjI6NVwiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJiZy1mb3VuZGF0aW9uIGgtMTIgdy0xMiBmbGV4LXNocmluay0wIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1vdXRsaW5lLTNcIlxyXG4gICAgICAgIDpjbGFzcz1cImlzTGltaXRlZCA/ICdkaWFnb25hbC1zdHJpcGVzJyA6ICcnXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6NjM6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IHYtaWY9XCJpc0xpbWl0ZWRcIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGxcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZTo2Nzo5XCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTggdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIGJnLWZvdW5kYXRpb24gYm9yZGVyIGJvcmRlci1vdXRsaW5lLTNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZTo2ODoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxMb2NrIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmQtM1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjcxOjEzXCIgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxQcmV2aWV3SW1hZ2Ugdi1lbHNlIDpwcmV2aWV3LXVybD1cInZlcnNpb24ucHJldmlld1VybFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjc0OjlcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgc3BhY2UteS0xIG92ZXJmbG93LWhpZGRlblwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjc2OjdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBtaW4tdy0wIGl0ZW1zLWNlbnRlciBzcGFjZS14LTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZTo3Nzo5XCI+XHJcbiAgICAgICAgICA8Vmlld2VyUmVzb3VyY2VzTGltaXRBbGVydFxyXG4gICAgICAgICAgICB2LWlmPVwiaXNMaW1pdGVkXCJcclxuICAgICAgICAgICAgbGltaXQtdHlwZT1cInZlcnNpb25cIlxyXG4gICAgICAgICAgICB2YXJpYW50PVwiaW5saW5lXCJcclxuICAgICAgICAgICAgOnByb2plY3Q9XCJwcm9qZWN0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6Nzg6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwidHJ1bmNhdGUgcHItMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjg0OjExXCI+XHJcbiAgICAgICAgICAgIDxkaXYgdi1pZj1cImF1dGhvclwiIGNsYXNzPVwidGV4dC1ib2R5LTJ4cyB0cnVuY2F0ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjg1OjEzXCI+XHJcbiAgICAgICAgICAgICAge3sgYXV0aG9yLm5hbWUgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJvZHktM3hzIHRleHQtZm9yZWdyb3VuZC0yIHRydW5jYXRlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6ODg6MTNcIj5cclxuICAgICAgICAgICAgICB7eyB2ZXJzaW9uLm1lc3NhZ2UgfHwgJ25vIG1lc3NhZ2UnIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IENvbW1vbkJhZGdlLCBrZXlib2FyZENsaWNrIH0gZnJvbSAnQHNwZWNrbGUvdWktY29tcG9uZW50cydcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xyXG5pbXBvcnQgbG9jYWxpemVkRm9ybWF0IGZyb20gJ2RheWpzL3BsdWdpbi9sb2NhbGl6ZWRGb3JtYXQnXHJcbmltcG9ydCB7IHVzZUluamVjdGVkVmlld2VyU3RhdGUgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAnXHJcbmltcG9ydCB0eXBlIHsgVmlld2VyTW9kZWxWZXJzaW9uQ2FyZEl0ZW1GcmFnbWVudCB9IGZyb20gJ35+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbC9ncmFwaHFsJ1xyXG5pbXBvcnQgdHlwZSB7IExheW91dE1lbnVJdGVtIH0gZnJvbSAnfn4vbGliL2xheW91dC9oZWxwZXJzL2NvbXBvbmVudHMnXHJcbmltcG9ydCB7IEhvcml6b250YWxEaXJlY3Rpb24gfSBmcm9tICd+fi9saWIvY29tbW9uL2NvbXBvc2FibGVzL3dpbmRvdydcclxuaW1wb3J0IHsgdXNlTWl4cGFuZWwgfSBmcm9tICd+fi9saWIvY29yZS9jb21wb3NhYmxlcy9tcCdcclxuaW1wb3J0IHsgdXNlQ29weU1vZGVsTGluayB9IGZyb20gJ34vbGliL3Byb2plY3RzL2NvbXBvc2FibGVzL21vZGVsTWFuYWdlbWVudCdcclxuaW1wb3J0IHsgRWxsaXBzaXMsIENoZWNrLCBMb2NrIH0gZnJvbSAnbHVjaWRlLXZ1ZS1uZXh0J1xyXG5cclxuZGF5anMuZXh0ZW5kKGxvY2FsaXplZEZvcm1hdClcclxuXHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKFxyXG4gIGRlZmluZVByb3BzPHtcclxuICAgIHZlcnNpb246IFZpZXdlck1vZGVsVmVyc2lvbkNhcmRJdGVtRnJhZ21lbnRcclxuICAgIGNsaWNrYWJsZT86IGJvb2xlYW5cclxuICAgIGlzTGF0ZXN0VmVyc2lvbjogYm9vbGVhblxyXG4gICAgaXNMb2FkZWRWZXJzaW9uOiBib29sZWFuXHJcbiAgICBzaG93VGltZWxpbmU/OiBib29sZWFuXHJcbiAgICBsYXN0OiBib29sZWFuXHJcbiAgICBsYXN0TG9hZGVkOiBib29sZWFuXHJcbiAgICBtb2RlbElkPzogc3RyaW5nXHJcbiAgICB0b3RhbFZlcnNpb25zPzogbnVtYmVyXHJcbiAgfT4oKSxcclxuICB7XHJcbiAgICBjbGlja2FibGU6IHRydWUsXHJcbiAgICBkZWZhdWx0OiBmYWxzZSxcclxuICAgIHNob3dUaW1lbGluZTogdHJ1ZSxcclxuICAgIGxhc3Q6IGZhbHNlLFxyXG4gICAgbGFzdExvYWRlZDogZmFsc2VcclxuICB9XHJcbilcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICdjaGFuZ2VWZXJzaW9uJywgdmVyc2lvbjogc3RyaW5nKTogdm9pZFxyXG4gIChlOiAndmlld0NoYW5nZXMnLCB2ZXJzaW9uOiBWaWV3ZXJNb2RlbFZlcnNpb25DYXJkSXRlbUZyYWdtZW50KTogdm9pZFxyXG4gIChlOiAncmVtb3ZlVmVyc2lvbicsIHZlcnNpb25JZDogc3RyaW5nKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBtcCA9IHVzZU1peHBhbmVsKClcclxuY29uc3Qge1xyXG4gIHJlc291cmNlczoge1xyXG4gICAgcmVzcG9uc2U6IHsgcHJvamVjdCB9XHJcbiAgfVxyXG59ID0gdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSgpXHJcbmNvbnN0IGNvcHlNb2RlbExpbmsgPSB1c2VDb3B5TW9kZWxMaW5rKClcclxuY29uc3QgeyBmb3JtYXR0ZWRSZWxhdGl2ZURhdGUsIGZvcm1hdHRlZEZ1bGxEYXRlIH0gPSB1c2VEYXRlRm9ybWF0dGVycygpXHJcblxyXG5jb25zdCBpc0xvYWRlZCA9IGNvbXB1dGVkKCgpID0+IHByb3BzLmlzTG9hZGVkVmVyc2lvbilcclxuY29uc3QgaXNMYXRlc3QgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5pc0xhdGVzdFZlcnNpb24pXHJcblxyXG4vLyBDaGVjayBpZiB2ZXJzaW9uIGlzIGxpbWl0ZWQgYnkgcGxhbiByZXN0cmljdGlvbnNcclxuY29uc3QgaXNMaW1pdGVkID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiBwcm9wcy52ZXJzaW9uLnJlZmVyZW5jZWRPYmplY3QgPT09IG51bGxcclxufSlcclxuXHJcbmNvbnN0IGNyZWF0ZWRBdCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgZnVsbDogZm9ybWF0dGVkRnVsbERhdGUocHJvcHMudmVyc2lvbi5jcmVhdGVkQXQpLFxyXG4gICAgcmVsYXRpdmU6IGZvcm1hdHRlZFJlbGF0aXZlRGF0ZShwcm9wcy52ZXJzaW9uLmNyZWF0ZWRBdCwgeyBjYXBpdGFsaXplOiB0cnVlIH0pXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgYXV0aG9yID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMudmVyc2lvbi5hdXRob3JVc2VyKVxyXG5cclxuY29uc3Qgc2hvd0FjdGlvbnNNZW51ID0gcmVmKGZhbHNlKVxyXG5cclxuY29uc3QgY2FuRGVsZXRlVmVyc2lvbiA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoaXNMb2FkZWQudmFsdWUpIHJldHVybiBmYWxzZVxyXG4gIGlmIChwcm9wcy50b3RhbFZlcnNpb25zICYmIHByb3BzLnRvdGFsVmVyc2lvbnMgPD0gMSkgcmV0dXJuIGZhbHNlXHJcbiAgcmV0dXJuIHRydWVcclxufSlcclxuXHJcbmNvbnN0IGRlbGV0ZURpc2FibGVkUmVhc29uID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChpc0xvYWRlZC52YWx1ZSkge1xyXG4gICAgcmV0dXJuICdDYW5ub3QgZGVsZXRlIHRoZSBjdXJyZW50bHkgdmlld2VkIHZlcnNpb24nXHJcbiAgfVxyXG4gIGlmIChwcm9wcy50b3RhbFZlcnNpb25zICYmIHByb3BzLnRvdGFsVmVyc2lvbnMgPD0gMSkge1xyXG4gICAgcmV0dXJuICdDYW5ub3QgZGVsZXRlIHRoZSBsYXN0IHZlcnNpb24nXHJcbiAgfVxyXG4gIHJldHVybiB1bmRlZmluZWRcclxufSlcclxuXHJcbmNvbnN0IGFjdGlvbnNJdGVtcyA9IGNvbXB1dGVkPExheW91dE1lbnVJdGVtW11bXT4oKCkgPT4gW1xyXG4gIFtcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdWaWV3IGNoYW5nZXMnLFxyXG4gICAgICBpZDogJ3ZpZXctY2hhbmdlcycsXHJcbiAgICAgIGRpc2FibGVkOiBpc0xvYWRlZC52YWx1ZSB8fCBpc0xpbWl0ZWQudmFsdWUsXHJcbiAgICAgIGRpc2FibGVkVG9vbHRpcDogaXNMb2FkZWQudmFsdWVcclxuICAgICAgICA/ICdDYW5ub3QgY29tcGFyZSBjdXJyZW50IHZlcnNpb24gd2l0aCBpdHNlbGYnXHJcbiAgICAgICAgOiBpc0xpbWl0ZWQudmFsdWVcclxuICAgICAgICA/ICdWZXJzaW9uIGNvbXBhcmlzb24gdW5hdmFpbGFibGUnXHJcbiAgICAgICAgOiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnQ29weSBsaW5rIHRvIHZlcnNpb24nLFxyXG4gICAgICBpZDogJ2NvcHktbGluay10by12ZXJzaW9uJyxcclxuICAgICAgZGlzYWJsZWQ6IGlzTGltaXRlZC52YWx1ZSxcclxuICAgICAgZGlzYWJsZWRUb29sdGlwOiBpc0xpbWl0ZWQudmFsdWUgPyAnT3V0c2lkZSB3b3Jrc3BhY2UgdmVyc2lvbiBsaW1pdHMnIDogdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgXSxcclxuICBbXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnRGVsZXRlIHZlcnNpb24uLi4nLFxyXG4gICAgICBpZDogJ3JlbW92ZS12ZXJzaW9uJyxcclxuICAgICAgZGlzYWJsZWQ6ICFjYW5EZWxldGVWZXJzaW9uLnZhbHVlLFxyXG4gICAgICBkaXNhYmxlZFRvb2x0aXA6IGRlbGV0ZURpc2FibGVkUmVhc29uLnZhbHVlXHJcbiAgICB9XHJcbiAgXVxyXG5dKVxyXG5cclxuY29uc3QgaGFuZGxlQ2xpY2sgPSAoKSA9PiB7XHJcbiAgaWYgKGlzTGltaXRlZC52YWx1ZSkgcmV0dXJuXHJcbiAgaWYgKHByb3BzLmNsaWNrYWJsZSkgZW1pdCgnY2hhbmdlVmVyc2lvbicsIHByb3BzLnZlcnNpb24uaWQpXHJcbiAgbXAudHJhY2soJ1ZpZXdlciBBY3Rpb24nLCB7XHJcbiAgICB0eXBlOiAnYWN0aW9uJyxcclxuICAgIG5hbWU6ICdjaGFuZ2UtdmVyc2lvbidcclxuICB9KVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVWaWV3Q2hhbmdlcyA9ICgpID0+IHtcclxuICBlbWl0KCd2aWV3Q2hhbmdlcycsIHByb3BzLnZlcnNpb24pXHJcbiAgbXAudHJhY2soJ1ZpZXdlciBBY3Rpb24nLCB7XHJcbiAgICB0eXBlOiAnYWN0aW9uJyxcclxuICAgIG5hbWU6ICdkaWZmcycsXHJcbiAgICBhY3Rpb246ICdlbmFibGUnXHJcbiAgfSlcclxufVxyXG5cclxuY29uc3Qgb25BY3Rpb25DaG9zZW4gPSAocGFyYW1zOiB7IGl0ZW06IExheW91dE1lbnVJdGVtIH0pID0+IHtcclxuICBjb25zdCB7IGl0ZW0gfSA9IHBhcmFtc1xyXG5cclxuICBzd2l0Y2ggKGl0ZW0uaWQpIHtcclxuICAgIGNhc2UgJ3ZpZXctY2hhbmdlcyc6XHJcbiAgICAgIGlmICghaXNMb2FkZWQudmFsdWUgJiYgIWlzTGltaXRlZC52YWx1ZSkge1xyXG4gICAgICAgIGhhbmRsZVZpZXdDaGFuZ2VzKClcclxuICAgICAgfVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnY29weS1saW5rLXRvLXZlcnNpb24nOlxyXG4gICAgICBpZiAocHJvamVjdC52YWx1ZT8uaWQgJiYgcHJvcHMubW9kZWxJZCkge1xyXG4gICAgICAgIHZvaWQgY29weU1vZGVsTGluayh7XHJcbiAgICAgICAgICBtb2RlbDoge1xyXG4gICAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3QudmFsdWUuaWQsXHJcbiAgICAgICAgICAgIGlkOiBwcm9wcy5tb2RlbElkXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdmVyc2lvbklkOiBwcm9wcy52ZXJzaW9uLmlkXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAncmVtb3ZlLXZlcnNpb24nOlxyXG4gICAgICBpZiAoY2FuRGVsZXRlVmVyc2lvbi52YWx1ZSkge1xyXG4gICAgICAgIGVtaXQoJ3JlbW92ZVZlcnNpb24nLCBwcm9wcy52ZXJzaW9uLmlkKVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZSJ9