import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/workspace/moveProject/SelectWorkspace.vue");import { CommonLoadingIcon as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { CommonBadge 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/workspace/Card.vue"; import { default as __nuxt_component_3 } from "/_nuxt/components/workspace/plan/ProjectModelLimitReachedDialog.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 { graphql } from "/_nuxt/lib/common/generated/gql/index.ts"; import { useQuery } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29"; import { UserAvatarGroup } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { workspaceMoveProjectManagerUserQuery } from "/_nuxt/lib/workspaces/graphql/queries.ts"; import { formatName } from "/_nuxt/lib/billing/helpers/plan.ts"; import { Roles } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { WorkspaceLimitsReachedError, WorkspaceSsoSessionNoAccessError } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/authz/index.js"; import { computed, ref } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "WorkspaceMoveProjectSelectWorkspace", props: { project: { type: null, required: true }, checker: { type: Function, required: true }, subheading: { type: String, required: false } }, emits: ["workspace-selected"], setup(__props, { expose: __expose, emit: __emit }) { __expose(); graphql(` fragment WorkspaceMoveProjectSelectWorkspace_Workspace on Workspace { id name role slug plan { name } permissions { canMoveProjectToWorkspace(projectId: $projectId) { ...FullPermissionCheckResult } canCreateProject { ...FullPermissionCheckResult } } } `); graphql(` fragment WorkspaceMoveProjectSelectWorkspace_User on User { workspaces { items { ...WorkspaceMoveProjectManager_Workspace } } projects(cursor: $cursor, filter: $filter, sortBy: $sortBy) { items { ...WorkspaceMoveProjectManager_Project } cursor totalCount } } `); const props = __props; const emit = __emit; const { result, loading: initialLoading } = useQuery( workspaceMoveProjectManagerUserQuery, () => ({ cursor: null, filter: {}, projectId: props.project?.id }) ); const workspaces = computed(() => result.value?.activeUser?.workspaces.items ?? []); const hasWorkspaces = computed(() => workspaces.value.length > 0); const showLoading = computed( () => initialLoading.value && workspaces.value.length === 0 ); const showLimitDialog = ref(false); const limitReachedWorkspace = ref(null); const isWorkspaceAdmin = computed( () => (workspace) => { if (!workspace) return false; return workspace.role === Roles.Workspace.Admin; } ); const isWorkspaceDisabled = (workspace) => { if (!isWorkspaceAdmin.value(workspace)) { return true; } const permission = props.checker(workspace); return !permission?.authorized && permission?.code !== WorkspaceLimitsReachedError.code; }; const getWorkspaceTooltip = (workspace) => { const permission = props.checker(workspace); if (permission.authorized) { return void 0; } if (permission.code === WorkspaceLimitsReachedError.code) { return void 0; } return permission?.message; }; const sortedWorkspaces = computed(() => { return [...workspaces.value].sort((a, b) => { const aEnabled = props.checker(a).authorized || props.checker(a).code === WorkspaceLimitsReachedError.code; const bEnabled = props.checker(b).authorized || props.checker(b).code === WorkspaceLimitsReachedError.code; if (aEnabled && !bEnabled) return -1; if (!aEnabled && bEnabled) return 1; return 0; }); }); const handleWorkspaceClick = (workspace) => { const permission = props.checker(workspace); if (permission?.code === WorkspaceLimitsReachedError.code) { limitReachedWorkspace.value = workspace; showLimitDialog.value = true; return; } if (permission?.authorized) { emit("workspace-selected", workspace); } }; const isSsoRequired = (workspace) => { return props.checker(workspace).code === WorkspaceSsoSessionNoAccessError.code; }; const __returned__ = { props, emit, result, initialLoading, workspaces, hasWorkspaces, showLoading, showLimitDialog, limitReachedWorkspace, isWorkspaceAdmin, isWorkspaceDisabled, getWorkspaceTooltip, sortedWorkspaces, handleWorkspaceClick, isSsoRequired, get UserAvatarGroup() { return UserAvatarGroup; }, get formatName() { return formatName; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { resolveComponent as _resolveComponent, openBlock as _openBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, createTextVNode as _createTextVNode, withCtx as _withCtx, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:2:3" }; const _hoisted_2 = { key: 0, class: "py-4 flex items-center justify-center w-full h-32", "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:3:5" }; const _hoisted_3 = { key: 0, "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:7:7" }; const _hoisted_4 = { class: "mb-4", "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:8:9" }; const _hoisted_5 = { class: "flex flex-col gap-2", "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:11:9" }; const _hoisted_6 = ["disabled", "onClick"]; const _hoisted_7 = { class: "flex flex-col gap-2 items-start", "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:29:19" }; const _hoisted_8 = { "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:38:21" }; const _hoisted_9 = { key: 1, class: "text-body-xs text-foreground", "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:59:7" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_CommonLoadingIcon = __nuxt_component_0; const _component_CommonBadge = __nuxt_component_1; const _component_WorkspaceCard = __nuxt_component_2; const _component_WorkspacePlanProjectModelLimitReachedDialog = __nuxt_component_3; const _directive_tippy = _resolveDirective("tippy"); return _openBlock(), _createElementBlock("div", _hoisted_1, [ $setup.showLoading ? (_openBlock(), _createElementBlock("div", _hoisted_2, [ _createVNode(_component_CommonLoadingIcon, { size: "sm", "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:4:7" }) ])) : (_openBlock(), _createElementBlock( _Fragment, { key: 1 }, [ $setup.hasWorkspaces ? (_openBlock(), _createElementBlock("div", _hoisted_3, [ _createElementVNode( "p", _hoisted_4, _toDisplayString($props.subheading || "Select an existing workspace or create a new one."), 1 /* TEXT */ ), _createElementVNode("div", _hoisted_5, [ (_openBlock(true), _createElementBlock( _Fragment, null, _renderList($setup.sortedWorkspaces, (ws) => { return _withDirectives((_openBlock(), _createElementBlock("div", { key: `${ws.id}-${ws.permissions?.canMoveProjectToWorkspace?.code}`, "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:12:11" }, [ _createElementVNode("button", { class: _normalizeClass(["w-full", !$setup.isWorkspaceDisabled(ws) ? "cursor-not-allowed" : ""]), disabled: $setup.isWorkspaceDisabled(ws), onClick: ($event) => $setup.handleWorkspaceClick(ws), "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:17:13" }, [ _createVNode(_component_WorkspaceCard, { logo: ws.logo ?? "", name: ws.name, clickable: !$setup.isWorkspaceDisabled(ws), "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:23:15" }, { text: _withCtx(() => [ _createElementVNode("div", _hoisted_7, [ $setup.isSsoRequired(ws) ? (_openBlock(), _createBlock(_component_CommonBadge, { key: 0, color: "secondary", class: "capitalize", rounded: "", "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:30:21" }, { default: _withCtx(() => [..._cache[1] || (_cache[1] = [ _createTextVNode( " SSO login required ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ })) : _createCommentVNode("v-if", true), _createElementVNode( "p", _hoisted_8, _toDisplayString(ws.plan?.usage.projectCount) + " projects, " + _toDisplayString(ws.plan?.usage.modelCount) + " models ", 1 /* TEXT */ ), _createVNode($setup["UserAvatarGroup"], { users: ws.team.items.map((t) => t.user), "max-count": 6, size: "sm", "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:42:21" }, null, 8, ["users"]) ]) ]), actions: _withCtx(() => [ _createVNode( _component_CommonBadge, { color: "secondary", rounded: "", "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:50:19" }, { default: _withCtx(() => [ _createTextVNode( _toDisplayString($setup.formatName(ws.plan?.name)), 1 /* TEXT */ ) ]), _: 2 /* DYNAMIC */ }, 1024 /* DYNAMIC_SLOTS */ ) ]), _: 2 /* DYNAMIC */ }, 1032, ["logo", "name", "clickable"]) ], 10, _hoisted_6) ])), [ [_directive_tippy, $setup.getWorkspaceTooltip(ws)] ]); }), 128 /* KEYED_FRAGMENT */ )) ]) ])) : (_openBlock(), _createElementBlock("p", _hoisted_9, " Looks like you haven't created any workspaces yet. Workspaces help you easily organise and control your digital projects. Create one to move your project into. ")) ], 64 /* STABLE_FRAGMENT */ )), _createVNode(_component_WorkspacePlanProjectModelLimitReachedDialog, { open: $setup.showLimitDialog, "onUpdate:open": _cache[0] || (_cache[0] = ($event) => $setup.showLimitDialog = $event), "workspace-name": $setup.limitReachedWorkspace?.name, plan: $setup.limitReachedWorkspace?.plan?.name, "workspace-role": $setup.limitReachedWorkspace?.role, "workspace-slug": $setup.limitReachedWorkspace?.slug || "", location: "move_project_dialog", "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:66:5" }, null, 8, ["open", "workspace-name", "plan", "workspace-role", "workspace-slug"]) ]); } _sfc_main.__hmrId = "254d4d03"; 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/workspace/moveProject/SelectWorkspace.vue"]]); //# sourceMappingURL=data:application/json;base64,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Q3ZDLE1BQU0sOEJBQXVCLE1BQU07QUFBQSxNQUNuQyxrQkFBZ0IsOEJBQXVCO0FBQUEsTUFDdkMsa0JBQWdCLDhCQUF1QixRQUFJO0FBQUEsTUFDNUMsVUFBUztBQUFBLE1BQXNCLG9CQUFpQjtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJTZWxlY3RXb3Jrc3BhY2UudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjI6M1wiPlxyXG4gICAgPGRpdiB2LWlmPVwic2hvd0xvYWRpbmdcIiBjbGFzcz1cInB5LTQgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtMzJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTozOjVcIj5cclxuICAgICAgPENvbW1vbkxvYWRpbmdJY29uIHNpemU9XCJzbVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjQ6N1wiIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgIDxkaXYgdi1pZj1cImhhc1dvcmtzcGFjZXNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTo3OjdcIj5cclxuICAgICAgICA8cCBjbGFzcz1cIm1iLTRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTo4OjlcIj5cclxuICAgICAgICAgIHt7IHN1YmhlYWRpbmcgfHwgJ1NlbGVjdCBhbiBleGlzdGluZyB3b3Jrc3BhY2Ugb3IgY3JlYXRlIGEgbmV3IG9uZS4nIH19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL21vdmVQcm9qZWN0L1NlbGVjdFdvcmtzcGFjZS52dWU6MTE6OVwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICB2LWZvcj1cIndzIGluIHNvcnRlZFdvcmtzcGFjZXNcIlxyXG4gICAgICAgICAgICA6a2V5PVwiYCR7d3MuaWR9LSR7d3MucGVybWlzc2lvbnM/LmNhbk1vdmVQcm9qZWN0VG9Xb3Jrc3BhY2U/LmNvZGV9YFwiXHJcbiAgICAgICAgICAgIHYtdGlwcHk9XCJnZXRXb3Jrc3BhY2VUb29sdGlwKHdzKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjEyOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsXCJcclxuICAgICAgICAgICAgICA6Y2xhc3M9XCIhaXNXb3Jrc3BhY2VEaXNhYmxlZCh3cykgPyAnY3Vyc29yLW5vdC1hbGxvd2VkJyA6ICcnXCJcclxuICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJpc1dvcmtzcGFjZURpc2FibGVkKHdzKVwiXHJcbiAgICAgICAgICAgICAgQGNsaWNrPVwiaGFuZGxlV29ya3NwYWNlQ2xpY2sod3MpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL21vdmVQcm9qZWN0L1NlbGVjdFdvcmtzcGFjZS52dWU6MTc6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPFdvcmtzcGFjZUNhcmRcclxuICAgICAgICAgICAgICAgIDpsb2dvPVwid3MubG9nbyA/PyAnJ1wiXHJcbiAgICAgICAgICAgICAgICA6bmFtZT1cIndzLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgOmNsaWNrYWJsZT1cIiFpc1dvcmtzcGFjZURpc2FibGVkKHdzKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjIzOjE1XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI3RleHQ+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIGl0ZW1zLXN0YXJ0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL21vdmVQcm9qZWN0L1NlbGVjdFdvcmtzcGFjZS52dWU6Mjk6MTlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Q29tbW9uQmFkZ2VcclxuICAgICAgICAgICAgICAgICAgICAgIHYtaWY9XCJpc1Nzb1JlcXVpcmVkKHdzKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcGl0YWxpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcm91bmRlZCBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTozMDoyMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgU1NPIGxvZ2luIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgPC9Db21tb25CYWRnZT5cclxuICAgICAgICAgICAgICAgICAgICA8cCBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTozODoyMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgd3MucGxhbj8udXNhZ2UucHJvamVjdENvdW50IH19IHByb2plY3RzLFxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgd3MucGxhbj8udXNhZ2UubW9kZWxDb3VudCB9fSBtb2RlbHNcclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPFVzZXJBdmF0YXJHcm91cFxyXG4gICAgICAgICAgICAgICAgICAgICAgOnVzZXJzPVwid3MudGVhbS5pdGVtcy5tYXAoKHQpID0+IHQudXNlcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgOm1heC1jb3VudD1cIjZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL21vdmVQcm9qZWN0L1NlbGVjdFdvcmtzcGFjZS52dWU6NDI6MjFcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYWN0aW9ucz5cclxuICAgICAgICAgICAgICAgICAgPENvbW1vbkJhZGdlIGNvbG9yPVwic2Vjb25kYXJ5XCIgcm91bmRlZCBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTo1MDoxOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdE5hbWUod3MucGxhbj8ubmFtZSkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9Db21tb25CYWRnZT5cclxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9Xb3Jrc3BhY2VDYXJkPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPHAgdi1lbHNlIGNsYXNzPVwidGV4dC1ib2R5LXhzIHRleHQtZm9yZWdyb3VuZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjU5OjdcIj5cclxuICAgICAgICBMb29rcyBsaWtlIHlvdSBoYXZlbid0IGNyZWF0ZWQgYW55IHdvcmtzcGFjZXMgeWV0LiBXb3Jrc3BhY2VzIGhlbHAgeW91IGVhc2lseVxyXG4gICAgICAgIG9yZ2FuaXNlIGFuZCBjb250cm9sIHlvdXIgZGlnaXRhbCBwcm9qZWN0cy4gQ3JlYXRlIG9uZSB0byBtb3ZlIHlvdXIgcHJvamVjdFxyXG4gICAgICAgIGludG8uXHJcbiAgICAgIDwvcD5cclxuICAgIDwvdGVtcGxhdGU+XHJcblxyXG4gICAgPFdvcmtzcGFjZVBsYW5Qcm9qZWN0TW9kZWxMaW1pdFJlYWNoZWREaWFsb2dcclxuICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd0xpbWl0RGlhbG9nXCJcclxuICAgICAgOndvcmtzcGFjZS1uYW1lPVwibGltaXRSZWFjaGVkV29ya3NwYWNlPy5uYW1lXCJcclxuICAgICAgOnBsYW49XCJsaW1pdFJlYWNoZWRXb3Jrc3BhY2U/LnBsYW4/Lm5hbWVcIlxyXG4gICAgICA6d29ya3NwYWNlLXJvbGU9XCJsaW1pdFJlYWNoZWRXb3Jrc3BhY2U/LnJvbGVcIlxyXG4gICAgICA6d29ya3NwYWNlLXNsdWc9XCJsaW1pdFJlYWNoZWRXb3Jrc3BhY2U/LnNsdWcgfHwgJydcIlxyXG4gICAgICBsb2NhdGlvbj1cIm1vdmVfcHJvamVjdF9kaWFsb2dcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTo2Njo1XCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBncmFwaHFsIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdEZyYWdtZW50LFxyXG4gIFdvcmtzcGFjZU1vdmVQcm9qZWN0TWFuYWdlcl9Qcm9qZWN0RnJhZ21lbnQsXHJcbiAgV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxufSBmcm9tICd+fi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwvZ3JhcGhxbCdcclxuaW1wb3J0IHsgdXNlUXVlcnkgfSBmcm9tICdAdnVlL2Fwb2xsby1jb21wb3NhYmxlJ1xyXG5pbXBvcnQgeyBVc2VyQXZhdGFyR3JvdXAgfSBmcm9tICdAc3BlY2tsZS91aS1jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyB3b3Jrc3BhY2VNb3ZlUHJvamVjdE1hbmFnZXJVc2VyUXVlcnkgfSBmcm9tICd+L2xpYi93b3Jrc3BhY2VzL2dyYXBocWwvcXVlcmllcydcclxuaW1wb3J0IHsgZm9ybWF0TmFtZSB9IGZyb20gJ34vbGliL2JpbGxpbmcvaGVscGVycy9wbGFuJ1xyXG5pbXBvcnQgeyBSb2xlcywgdHlwZSBNYXliZU51bGxPclVuZGVmaW5lZCB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHtcclxuICBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IsXHJcbiAgV29ya3NwYWNlU3NvU2Vzc2lvbk5vQWNjZXNzRXJyb3JcclxufSBmcm9tICdAc3BlY2tsZS9zaGFyZWQvYXV0aHonXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBXb3Jrc3BhY2VNb3ZlUHJvamVjdFNlbGVjdFdvcmtzcGFjZV9Xb3Jrc3BhY2Ugb24gV29ya3NwYWNlIHtcclxuICAgIGlkXHJcbiAgICBuYW1lXHJcbiAgICByb2xlXHJcbiAgICBzbHVnXHJcbiAgICBwbGFuIHtcclxuICAgICAgbmFtZVxyXG4gICAgfVxyXG4gICAgcGVybWlzc2lvbnMge1xyXG4gICAgICBjYW5Nb3ZlUHJvamVjdFRvV29ya3NwYWNlKHByb2plY3RJZDogJHByb2plY3RJZCkge1xyXG4gICAgICAgIC4uLkZ1bGxQZXJtaXNzaW9uQ2hlY2tSZXN1bHRcclxuICAgICAgfVxyXG4gICAgICBjYW5DcmVhdGVQcm9qZWN0IHtcclxuICAgICAgICAuLi5GdWxsUGVybWlzc2lvbkNoZWNrUmVzdWx0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbmApXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBXb3Jrc3BhY2VNb3ZlUHJvamVjdFNlbGVjdFdvcmtzcGFjZV9Vc2VyIG9uIFVzZXIge1xyXG4gICAgd29ya3NwYWNlcyB7XHJcbiAgICAgIGl0ZW1zIHtcclxuICAgICAgICAuLi5Xb3Jrc3BhY2VNb3ZlUHJvamVjdE1hbmFnZXJfV29ya3NwYWNlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHByb2plY3RzKGN1cnNvcjogJGN1cnNvciwgZmlsdGVyOiAkZmlsdGVyLCBzb3J0Qnk6ICRzb3J0QnkpIHtcclxuICAgICAgaXRlbXMge1xyXG4gICAgICAgIC4uLldvcmtzcGFjZU1vdmVQcm9qZWN0TWFuYWdlcl9Qcm9qZWN0XHJcbiAgICAgIH1cclxuICAgICAgY3Vyc29yXHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICB9XHJcbmApXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBwcm9qZWN0OiBNYXliZU51bGxPclVuZGVmaW5lZDxXb3Jrc3BhY2VNb3ZlUHJvamVjdE1hbmFnZXJfUHJvamVjdEZyYWdtZW50PlxyXG4gIGNoZWNrZXI6IChcclxuICAgIHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxuICApID0+IEZ1bGxQZXJtaXNzaW9uQ2hlY2tSZXN1bHRGcmFnbWVudFxyXG4gIHN1YmhlYWRpbmc/OiBzdHJpbmdcclxufT4oKVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoXHJcbiAgICBlOiAnd29ya3NwYWNlLXNlbGVjdGVkJyxcclxuICAgIHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxuICApOiB2b2lkXHJcbn0+KClcclxuXHJcbmNvbnN0IHsgcmVzdWx0LCBsb2FkaW5nOiBpbml0aWFsTG9hZGluZyB9ID0gdXNlUXVlcnkoXHJcbiAgd29ya3NwYWNlTW92ZVByb2plY3RNYW5hZ2VyVXNlclF1ZXJ5LFxyXG4gICgpID0+ICh7XHJcbiAgICBjdXJzb3I6IG51bGwsXHJcbiAgICBmaWx0ZXI6IHt9LFxyXG4gICAgcHJvamVjdElkOiBwcm9wcy5wcm9qZWN0Py5pZFxyXG4gIH0pXHJcbilcclxuXHJcbmNvbnN0IHdvcmtzcGFjZXMgPSBjb21wdXRlZCgoKSA9PiByZXN1bHQudmFsdWU/LmFjdGl2ZVVzZXI/LndvcmtzcGFjZXMuaXRlbXMgPz8gW10pXHJcbmNvbnN0IGhhc1dvcmtzcGFjZXMgPSBjb21wdXRlZCgoKSA9PiB3b3Jrc3BhY2VzLnZhbHVlLmxlbmd0aCA+IDApXHJcbmNvbnN0IHNob3dMb2FkaW5nID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gaW5pdGlhbExvYWRpbmcudmFsdWUgJiYgd29ya3NwYWNlcy52YWx1ZS5sZW5ndGggPT09IDBcclxuKVxyXG5cclxuY29uc3Qgc2hvd0xpbWl0RGlhbG9nID0gcmVmKGZhbHNlKVxyXG5jb25zdCBsaW1pdFJlYWNoZWRXb3Jrc3BhY2UgPVxyXG4gIHJlZjxXb3Jrc3BhY2VNb3ZlUHJvamVjdFNlbGVjdFdvcmtzcGFjZV9Xb3Jrc3BhY2VGcmFnbWVudCB8IG51bGw+KG51bGwpXHJcblxyXG5jb25zdCBpc1dvcmtzcGFjZUFkbWluID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gKHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnQgfCBudWxsKSA9PiB7XHJcbiAgICBpZiAoIXdvcmtzcGFjZSkgcmV0dXJuIGZhbHNlXHJcbiAgICByZXR1cm4gd29ya3NwYWNlLnJvbGUgPT09IFJvbGVzLldvcmtzcGFjZS5BZG1pblxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgaXNXb3Jrc3BhY2VEaXNhYmxlZCA9IChcclxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZU1vdmVQcm9qZWN0U2VsZWN0V29ya3NwYWNlX1dvcmtzcGFjZUZyYWdtZW50XHJcbikgPT4ge1xyXG4gIGlmICghaXNXb3Jrc3BhY2VBZG1pbi52YWx1ZSh3b3Jrc3BhY2UpKSB7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgY29uc3QgcGVybWlzc2lvbiA9IHByb3BzLmNoZWNrZXIod29ya3NwYWNlKVxyXG4gIHJldHVybiAoXHJcbiAgICAhcGVybWlzc2lvbj8uYXV0aG9yaXplZCAmJiBwZXJtaXNzaW9uPy5jb2RlICE9PSBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IuY29kZVxyXG4gIClcclxufVxyXG5cclxuY29uc3QgZ2V0V29ya3NwYWNlVG9vbHRpcCA9IChcclxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZU1vdmVQcm9qZWN0U2VsZWN0V29ya3NwYWNlX1dvcmtzcGFjZUZyYWdtZW50XHJcbikgPT4ge1xyXG4gIGNvbnN0IHBlcm1pc3Npb24gPSBwcm9wcy5jaGVja2VyKHdvcmtzcGFjZSlcclxuICBpZiAocGVybWlzc2lvbi5hdXRob3JpemVkKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgfVxyXG4gIGlmIChwZXJtaXNzaW9uLmNvZGUgPT09IFdvcmtzcGFjZUxpbWl0c1JlYWNoZWRFcnJvci5jb2RlKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgfVxyXG5cclxuICByZXR1cm4gcGVybWlzc2lvbj8ubWVzc2FnZVxyXG59XHJcblxyXG5jb25zdCBzb3J0ZWRXb3Jrc3BhY2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiBbLi4ud29ya3NwYWNlcy52YWx1ZV0uc29ydCgoYSwgYikgPT4ge1xyXG4gICAgY29uc3QgYUVuYWJsZWQgPVxyXG4gICAgICBwcm9wcy5jaGVja2VyKGEpLmF1dGhvcml6ZWQgfHxcclxuICAgICAgcHJvcHMuY2hlY2tlcihhKS5jb2RlID09PSBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IuY29kZVxyXG4gICAgY29uc3QgYkVuYWJsZWQgPVxyXG4gICAgICBwcm9wcy5jaGVja2VyKGIpLmF1dGhvcml6ZWQgfHxcclxuICAgICAgcHJvcHMuY2hlY2tlcihiKS5jb2RlID09PSBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IuY29kZVxyXG5cclxuICAgIGlmIChhRW5hYmxlZCAmJiAhYkVuYWJsZWQpIHJldHVybiAtMVxyXG4gICAgaWYgKCFhRW5hYmxlZCAmJiBiRW5hYmxlZCkgcmV0dXJuIDFcclxuICAgIHJldHVybiAwXHJcbiAgfSlcclxufSlcclxuXHJcbmNvbnN0IGhhbmRsZVdvcmtzcGFjZUNsaWNrID0gKFxyXG4gIHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxuKSA9PiB7XHJcbiAgY29uc3QgcGVybWlzc2lvbiA9IHByb3BzLmNoZWNrZXIod29ya3NwYWNlKVxyXG4gIGlmIChwZXJtaXNzaW9uPy5jb2RlID09PSBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IuY29kZSkge1xyXG4gICAgbGltaXRSZWFjaGVkV29ya3NwYWNlLnZhbHVlID0gd29ya3NwYWNlXHJcbiAgICBzaG93TGltaXREaWFsb2cudmFsdWUgPSB0cnVlXHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIGlmIChwZXJtaXNzaW9uPy5hdXRob3JpemVkKSB7XHJcbiAgICBlbWl0KCd3b3Jrc3BhY2Utc2VsZWN0ZWQnLCB3b3Jrc3BhY2UpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBpc1Nzb1JlcXVpcmVkID0gKFxyXG4gIHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxuKSA9PiB7XHJcbiAgcmV0dXJuIHByb3BzLmNoZWNrZXIod29ya3NwYWNlKS5jb2RlID09PSBXb3Jrc3BhY2VTc29TZXNzaW9uTm9BY2Nlc3NFcnJvci5jb2RlXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlIn0=