463 lines
44 KiB
Plaintext
463 lines
44 KiB
Plaintext
import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/PageSetup.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/header/nav/Link.vue";
|
|
import { default as __nuxt_component_1 } from "/_nuxt/components/viewer/explorer/NavbarLink.vue";
|
|
import { default as __nuxt_component_2 } from "/_nuxt/components/viewer/Scope.vue";
|
|
import { default as __nuxt_component_3 } from "/_nuxt/components/viewer/AnchoredPoints.vue";
|
|
import { default as __nuxt_component_4 } from "/_nuxt/components/viewer/CoreSetup.vue";
|
|
import { default as __nuxt_component_5 } from "/_nuxt/components/viewer/controls/Left.vue";
|
|
import { default as __nuxt_component_6 } from "/_nuxt/components/viewer/controls/Bottom.vue";
|
|
import { default as __nuxt_component_7 } from "/_nuxt/components/viewer/controls/Right.vue";
|
|
import { default as __nuxt_component_8 } from "/_nuxt/components/viewer/limits/Dialog.vue";
|
|
import { default as __nuxt_component_9 } from "/_nuxt/components/viewer/selection/Sidebar.vue";
|
|
import { default as __nuxt_component_10 } from "/_nuxt/node_modules/nuxt/dist/app/components/client-only.js?v=e4f18c29";
|
|
import { default as __nuxt_component_11 } from "/_nuxt/components/viewer/embed/Footer.vue";
|
|
import { default as __nuxt_component_12 } from "/_nuxt/components/header/nav/Share.vue";
|
|
/* Injection by vite-plugin-vue-inspector Start */
|
|
import { createBlock as __createBlock,createVNode as __createVNode,createElementBlock as __createElementBlock,createElementVNode as __createElementVNode } 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 _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
|
|
function _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
|
|
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
|
|
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...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 { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts";
|
|
import __vite__cjsImport16_dayjs from "/_nuxt/node_modules/.cache/vite/client/deps/dayjs.js?v=e4f18c29"; const dayjs = __vite__cjsImport16_dayjs.__esModule ? __vite__cjsImport16_dayjs.default : __vite__cjsImport16_dayjs;
|
|
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
|
|
import { useEmbed } from "/_nuxt/lib/viewer/composables/setup/embed.ts";
|
|
import { projectsRoute, workspaceRoute } from "/_nuxt/lib/common/helpers/route.ts";
|
|
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
|
|
import { parseUrlParameters, resourceBuilder } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/viewer/helpers/route.js";
|
|
import { ViewerLimitsDialogType } from "/_nuxt/lib/projects/helpers/limits.ts";
|
|
import { TailwindBreakpoints } from "/_nuxt/lib/common/helpers/tailwind.ts";
|
|
import { useBreakpoints } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29";
|
|
|
|
import { useRoute } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29";
|
|
import { useIsWorkspacesEnabled } from "/_nuxt/composables/globals.ts";
|
|
import { ref, computed, onMounted, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
import { useHead } from "/_nuxt/node_modules/nuxt/dist/app/composables/head.js?v=e4f18c29";
|
|
const _sfc_main = /* @__PURE__ */ _defineComponent({
|
|
__name: "ViewerPageSetup",
|
|
setup(__props, { expose: __expose }) {
|
|
__expose();
|
|
graphql(`
|
|
fragment ViewerPageSetup_SavedView on SavedView {
|
|
id
|
|
name
|
|
}
|
|
`);
|
|
graphql(`
|
|
fragment ModelPageProject on Project {
|
|
id
|
|
createdAt
|
|
name
|
|
visibility
|
|
limitedWorkspace {
|
|
id
|
|
slug
|
|
name
|
|
}
|
|
embedOptions {
|
|
hideSpeckleBranding
|
|
}
|
|
hasAccessToFeature(featureName: hideSpeckleBranding)
|
|
...ViewerLimitsDialog_Project
|
|
}
|
|
`);
|
|
const route = useRoute();
|
|
const isWorkspacesEnabled = useIsWorkspacesEnabled();
|
|
const breakpoints = useBreakpoints(TailwindBreakpoints);
|
|
const isMobile = breakpoints.smaller("sm");
|
|
const leftControls = ref();
|
|
const bottomControls = ref();
|
|
const selectionSidebar = ref();
|
|
const anchoredPoints = ref();
|
|
const state = useInjectedViewerState();
|
|
const resourceIdString = computed(() => state.resources.request.resourceIdString.value);
|
|
const {
|
|
isEnabled: isEmbedEnabled,
|
|
hideSelectionInfo,
|
|
isTransparent,
|
|
showControls,
|
|
disableModelLink,
|
|
hideSpeckleBranding
|
|
} = useEmbed();
|
|
const mp = useMixpanel();
|
|
const {
|
|
resources: {
|
|
response: { project, modelsAndVersionIds, savedView }
|
|
}
|
|
} = state;
|
|
const showLimitsDialog = ref(false);
|
|
const limitsDialogType = ref(ViewerLimitsDialogType.Version);
|
|
const hasMissingReferencedObject = computed(() => {
|
|
const resources = parseUrlParameters(resourceIdString.value);
|
|
const result = modelsAndVersionIds.value.some((item) => {
|
|
const version = item.model?.loadedVersion?.items?.find(
|
|
(v) => v.id === item.versionId
|
|
);
|
|
if (!version || version.referencedObject === null) {
|
|
const modelVersionString = resourceBuilder().addModel(item.model.id, item.versionId).toString();
|
|
const isInUrl = resources.some(
|
|
(r) => r.toString().toLowerCase() === modelVersionString
|
|
);
|
|
return isInUrl;
|
|
}
|
|
return false;
|
|
});
|
|
return result;
|
|
});
|
|
const isFederated = computed(
|
|
() => state.resources.response.resourceItems.value.length > 1
|
|
);
|
|
const title = computed(() => {
|
|
if (project.value?.models?.items) {
|
|
const modelCount = project.value.models.items.length;
|
|
const projectName = project.value.name || "";
|
|
if (modelCount > 1) {
|
|
return projectName ? `Multiple models - ${projectName}` : "Multiple models";
|
|
} else if (modelCount === 1) {
|
|
const modelName2 = project.value.models.items[0].name || "";
|
|
return projectName ? `${modelName2} - ${projectName}` : modelName2;
|
|
}
|
|
}
|
|
return "";
|
|
});
|
|
const modelName = computed(() => {
|
|
if (project.value?.models?.items && project.value.models.items.length > 0) {
|
|
return project.value.models.items[0].name;
|
|
} else {
|
|
return project.value?.name;
|
|
}
|
|
});
|
|
const embedName = computed(() => {
|
|
if (!modelName.value) return "Loading...";
|
|
let ret = "";
|
|
if (savedView.value) {
|
|
ret += `${savedView.value.name} | `;
|
|
}
|
|
ret += modelName.value;
|
|
return ret;
|
|
});
|
|
const lastUpdate = computed(() => {
|
|
if (project.value?.models?.items[0] && project.value.models.items[0].updatedAt) {
|
|
return "Updated " + dayjs(project.value.models.items[0].updatedAt).fromNow();
|
|
} else if (project.value) {
|
|
return "Created " + dayjs(project.value.createdAt).fromNow();
|
|
} else return void 0;
|
|
});
|
|
const canEditEmbedOptions = computed(() => {
|
|
return project.value?.hasAccessToFeature;
|
|
});
|
|
const hideSpeckleLogo = computed(() => {
|
|
if (!canEditEmbedOptions.value) return false;
|
|
if (project.value?.embedOptions?.hideSpeckleBranding) return true;
|
|
else return hideSpeckleBranding.value;
|
|
});
|
|
useHead({ title });
|
|
onMounted(() => {
|
|
const referrer = document.referrer;
|
|
const shouldTrackEvent = !referrer?.includes("speckle.systems") && !true;
|
|
if (isEmbedEnabled.value && shouldTrackEvent) {
|
|
mp.track("Embedded Model Load");
|
|
}
|
|
});
|
|
watch(
|
|
[hasMissingReferencedObject, state.resources.response.resourcesLoading],
|
|
([missingObject, resourcesLoading]) => {
|
|
if (missingObject && !resourcesLoading) {
|
|
if (isFederated.value) {
|
|
limitsDialogType.value = "federated";
|
|
} else {
|
|
limitsDialogType.value = "version";
|
|
}
|
|
showLimitsDialog.value = true;
|
|
} else {
|
|
showLimitsDialog.value = false;
|
|
}
|
|
},
|
|
{ immediate: true }
|
|
);
|
|
const closeAllPanels = (except) => {
|
|
if (except !== "left" && leftControls.value?.forceClosePanels) {
|
|
leftControls.value.forceClosePanels();
|
|
}
|
|
if (except !== "bottom" && bottomControls.value?.forceClosePanels) {
|
|
bottomControls.value.forceClosePanels();
|
|
}
|
|
if (except !== "threads" && anchoredPoints.value?.forceCloseThreads) {
|
|
anchoredPoints.value.forceCloseThreads();
|
|
}
|
|
selectionSidebar.value.forceClose();
|
|
};
|
|
const __returned__ = { route, isWorkspacesEnabled, breakpoints, isMobile, leftControls, bottomControls, selectionSidebar, anchoredPoints, state, resourceIdString, isEmbedEnabled, hideSelectionInfo, isTransparent, showControls, disableModelLink, hideSpeckleBranding, mp, project, modelsAndVersionIds, savedView, showLimitsDialog, limitsDialogType, hasMissingReferencedObject, isFederated, title, modelName, embedName, lastUpdate, canEditEmbedOptions, hideSpeckleLogo, closeAllPanels, get projectsRoute() {
|
|
return projectsRoute;
|
|
}, get workspaceRoute() {
|
|
return workspaceRoute;
|
|
} };
|
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
return __returned__;
|
|
}
|
|
});
|
|
import { createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, openBlock as _openBlock, withCtx as _withCtx, Transition as _Transition, Fragment as _Fragment, } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _hoisted_1 = { "data-v-inspector": "components/viewer/PageSetup.vue:2:3" };
|
|
const _hoisted_2 = {
|
|
class: "flex-1",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:3:5"
|
|
};
|
|
const _hoisted_3 = {
|
|
class: "absolute z-10 w-screen px-8 grid grid-cols-1 sm:grid-cols-3 gap-2 top-[3.75rem]",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:78:9"
|
|
};
|
|
const _hoisted_4 = {
|
|
class: "flex items-end justify-center sm:justify-start",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:81:11"
|
|
};
|
|
const _hoisted_5 = {
|
|
class: "flex flex-col gap-2 items-center justify-end",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:84:11"
|
|
};
|
|
const _hoisted_6 = {
|
|
class: "flex gap-3",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:86:13"
|
|
};
|
|
const _hoisted_7 = {
|
|
class: "flex items-end justify-center sm:justify-end",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:90:11"
|
|
};
|
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
const _component_HeaderNavLink = __nuxt_component_0;
|
|
const _component_ViewerExplorerNavbarLink = __nuxt_component_1;
|
|
const _component_ViewerScope = __nuxt_component_2;
|
|
const _component_Portal = _resolveComponent("Portal");
|
|
const _component_ViewerAnchoredPoints = __nuxt_component_3;
|
|
const _component_ViewerCoreSetup = __nuxt_component_4;
|
|
const _component_ViewerControlsLeft = __nuxt_component_5;
|
|
const _component_ViewerControlsBottom = __nuxt_component_6;
|
|
const _component_ViewerControlsRight = __nuxt_component_7;
|
|
const _component_ViewerLimitsDialog = __nuxt_component_8;
|
|
const _component_ViewerSelectionSidebar = __nuxt_component_9;
|
|
const _component_PortalTarget = _resolveComponent("PortalTarget");
|
|
const _component_ClientOnly = __nuxt_component_10;
|
|
const _component_ViewerEmbedFooter = __nuxt_component_11;
|
|
const _component_HeaderNavShare = __nuxt_component_12;
|
|
return _openBlock(), _createElementBlock("div", _hoisted_1, [
|
|
_createElementVNode("div", _hoisted_2, [
|
|
_createCommentVNode(" Nav "),
|
|
_createVNode(_component_Portal, {
|
|
to: "navigation",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:5:7"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
_createVNode(_component_ViewerScope, {
|
|
state: $setup.state,
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:6:9"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
$setup.project?.workspace && $setup.isWorkspacesEnabled ? (_openBlock(), _createBlock(_component_HeaderNavLink, {
|
|
key: 0,
|
|
to: $setup.workspaceRoute($setup.project?.workspace.slug),
|
|
name: "Projects",
|
|
separator: false,
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:8:13"
|
|
}, null, 8, ["to"])) : (_openBlock(), _createBlock(_component_HeaderNavLink, {
|
|
key: 1,
|
|
to: $setup.projectsRoute,
|
|
name: "Projects",
|
|
separator: false,
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:14:11"
|
|
}, null, 8, ["to"])),
|
|
_createVNode(_component_HeaderNavLink, {
|
|
to: `/projects/${$setup.project?.id}`,
|
|
name: $setup.project?.name,
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:20:11"
|
|
}, null, 8, ["to", "name"]),
|
|
_createVNode(_component_ViewerExplorerNavbarLink, { "data-v-inspector": "components/viewer/PageSetup.vue:21:11" })
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["state"])
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
}),
|
|
_createVNode(_component_ViewerCoreSetup, {
|
|
"viewer-host-classes": $setup.isEmbedEnabled ? $setup.isTransparent ? "viewer-transparent h-[100dvh]" : "h-[calc(100dvh-3.5rem)]" : "h-[100dvh]",
|
|
"loading-bar-classes": $setup.isEmbedEnabled ? "top-0" : "top-12",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:25:7"
|
|
}, {
|
|
"after-viewer-base": _withCtx(() => [
|
|
_createVNode(_Transition, {
|
|
"enter-from-class": "opacity-0",
|
|
"enter-active-class": "transition duration-1000",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:36:11"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
_createVNode(
|
|
_component_ViewerAnchoredPoints,
|
|
{
|
|
ref: "anchoredPoints",
|
|
onForceClosePanels: _cache[0] || (_cache[0] = () => $setup.closeAllPanels("threads")),
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:40:13"
|
|
},
|
|
null,
|
|
512
|
|
/* NEED_PATCH */
|
|
)
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
})
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["viewer-host-classes", "loading-bar-classes"]),
|
|
_createVNode(_component_ClientOnly, { "data-v-inspector": "components/viewer/PageSetup.vue:48:7" }, {
|
|
default: _withCtx(() => [
|
|
_createCommentVNode(" Controls "),
|
|
$setup.showControls ? (_openBlock(), _createElementBlock(
|
|
_Fragment,
|
|
{ key: 0 },
|
|
[
|
|
_createVNode(
|
|
_component_ViewerControlsLeft,
|
|
{
|
|
ref: "leftControls",
|
|
onForceClosePanels: _cache[1] || (_cache[1] = () => $setup.closeAllPanels("left")),
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:51:11"
|
|
},
|
|
null,
|
|
512
|
|
/* NEED_PATCH */
|
|
),
|
|
_createVNode(
|
|
_component_ViewerControlsBottom,
|
|
{
|
|
ref: "bottomControls",
|
|
onForceClosePanels: _cache[2] || (_cache[2] = () => $setup.closeAllPanels("bottom")),
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:55:11"
|
|
},
|
|
null,
|
|
512
|
|
/* NEED_PATCH */
|
|
),
|
|
$setup.isMobile ? (_openBlock(), _createBlock(_component_ViewerControlsRight, {
|
|
key: 0,
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:59:11"
|
|
})) : _createCommentVNode("v-if", true)
|
|
],
|
|
64
|
|
/* STABLE_FRAGMENT */
|
|
)) : _createCommentVNode("v-if", true),
|
|
$setup.project ? (_openBlock(), _createBlock(_component_ViewerLimitsDialog, {
|
|
key: 1,
|
|
open: $setup.showLimitsDialog,
|
|
"onUpdate:open": _cache[3] || (_cache[3] = ($event) => $setup.showLimitsDialog = $event),
|
|
project: $setup.project,
|
|
"resource-id-string": $setup.resourceIdString,
|
|
"limit-type": $setup.limitsDialogType,
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:62:9"
|
|
}, null, 8, ["open", "project", "resource-id-string", "limit-type"])) : _createCommentVNode("v-if", true),
|
|
_createCommentVNode(" Viewer Object Selection Info Display "),
|
|
!$setup.hideSelectionInfo ? (_openBlock(), _createBlock(_Transition, {
|
|
key: 2,
|
|
"enter-from-class": "opacity-0",
|
|
"enter-active-class": "transition duration-1000",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:71:9"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
_createVNode(
|
|
_component_ViewerSelectionSidebar,
|
|
{
|
|
ref: "selectionSidebar",
|
|
class: "z-20",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:76:11"
|
|
},
|
|
null,
|
|
512
|
|
/* NEED_PATCH */
|
|
)
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
})) : _createCommentVNode("v-if", true),
|
|
_createElementVNode("div", _hoisted_3, [
|
|
_createElementVNode("div", _hoisted_4, [
|
|
_createVNode(_component_PortalTarget, {
|
|
name: "pocket-left",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:82:13"
|
|
})
|
|
]),
|
|
_createElementVNode("div", _hoisted_5, [
|
|
_createVNode(_component_PortalTarget, {
|
|
name: "pocket-tip",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:85:13"
|
|
}),
|
|
_createElementVNode("div", _hoisted_6, [
|
|
_createVNode(_component_PortalTarget, {
|
|
name: "pocket-actions",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:87:15"
|
|
})
|
|
])
|
|
]),
|
|
_createElementVNode("div", _hoisted_7, [
|
|
_createVNode(_component_PortalTarget, {
|
|
name: "pocket-right",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:91:13"
|
|
})
|
|
])
|
|
])
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
})
|
|
]),
|
|
_createVNode(_component_ViewerEmbedFooter, {
|
|
name: $setup.embedName,
|
|
date: $setup.lastUpdate,
|
|
url: $setup.route.path,
|
|
"hide-speckle-branding": $setup.hideSpeckleLogo,
|
|
"disable-model-link": $setup.disableModelLink,
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:96:5"
|
|
}, null, 8, ["name", "date", "url", "hide-speckle-branding", "disable-model-link"]),
|
|
_createVNode(_component_Portal, {
|
|
to: "primary-actions",
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:103:5"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
$setup.project ? (_openBlock(), _createBlock(_component_HeaderNavShare, {
|
|
key: 0,
|
|
"resource-id-string": $setup.resourceIdString,
|
|
project: $setup.project,
|
|
"data-v-inspector": "components/viewer/PageSetup.vue:104:7"
|
|
}, null, 8, ["resource-id-string", "project"])) : _createCommentVNode("v-if", true)
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
})
|
|
]);
|
|
}
|
|
_sfc_main.__hmrId = "97f0d7ac";
|
|
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/PageSetup.vue"]]);
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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QjtBQUFBOzs7WUFHekQsb0JBRU0sT0FGTixZQUVNO0FBQUEsY0FESixhQUEwRztBQUFBLGdCQUE1RixNQUFLO0FBQUEsZ0JBQWUsb0JBQWlCO0FBQUE7Ozs7Ozs7O0lBSzNELGFBTUU7QUFBQSxNQUxDLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxNQUNOLEtBQUssYUFBTTtBQUFBLE1BQ1gseUJBQXVCO0FBQUEsTUFDdkIsc0JBQW9CO0FBQUEsTUFBa0Isb0JBQWlCO0FBQUE7SUFFMUQsYUFNUztBQUFBLE1BTkQsSUFBRztBQUFBLE1BQWtCLG9CQUFpQjtBQUFBO3dCQTBESSxNQVNqRDtBQUFBLFFBakVTLGdDQURSLGFBSUU7QUFBQTtVQUZDLHNCQUFvQjtBQUFBLFVBQ3BCLFNBQVM7QUFBQSxVQUFTLG9CQUFpQjtBQUFBIiwibmFtZXMiOlsibW9kZWxOYW1lIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIlBhZ2VTZXR1cC52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxyXG4gIDxkaXYgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL1BhZ2VTZXR1cC52dWU6MjozXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL1BhZ2VTZXR1cC52dWU6Mzo1XCI+XHJcbiAgICAgIDwhLS0gTmF2IC0tPlxyXG4gICAgICA8UG9ydGFsIHRvPVwibmF2aWdhdGlvblwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9QYWdlU2V0dXAudnVlOjU6N1wiPlxyXG4gICAgICAgIDxWaWV3ZXJTY29wZSA6c3RhdGU9XCJzdGF0ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9QYWdlU2V0dXAudnVlOjY6OVwiPlxyXG4gICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJwcm9qZWN0Py53b3Jrc3BhY2UgJiYgaXNXb3Jrc3BhY2VzRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICA8SGVhZGVyTmF2TGlua1xyXG4gICAgICAgICAgICAgIDp0bz1cIndvcmtzcGFjZVJvdXRlKHByb2plY3Q/LndvcmtzcGFjZS5zbHVnKVwiXHJcbiAgICAgICAgICAgICAgbmFtZT1cIlByb2plY3RzXCJcclxuICAgICAgICAgICAgICA6c2VwYXJhdG9yPVwiZmFsc2VcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvUGFnZVNldHVwLnZ1ZTo4OjEzXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICA8SGVhZGVyTmF2TGlua1xyXG4gICAgICAgICAgICB2LWVsc2VcclxuICAgICAgICAgICAgOnRvPVwicHJvamVjdHNSb3V0ZVwiXHJcbiAgICAgICAgICAgIG5hbWU9XCJQcm9qZWN0c1wiXHJcbiAgICAgICAgICAgIDpzZXBhcmF0b3I9XCJmYWxzZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9QYWdlU2V0dXAudnVlOjE0OjExXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8SGVhZGVyTmF2TGluayA6dG89XCJgL3Byb2plY3RzLyR7cHJvamVjdD8uaWR9YFwiIDpuYW1lPVwicHJvamVjdD8ubmFtZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9QYWdlU2V0dXAudnVlOjIwOjExXCIgLz5cclxuICAgICAgICAgIDxWaWV3ZXJFeHBsb3Jlck5hdmJhckxpbmsgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL1BhZ2VTZXR1cC52dWU6MjE6MTFcIiAvPlxyXG4gICAgICAgIDwvVmlld2VyU2NvcGU+XHJcbiAgICAgIDwvUG9ydGFsPlxyXG5cclxuICAgICAgPFZpZXdlckNvcmVTZXR1cFxyXG4gICAgICAgIDp2aWV3ZXItaG9zdC1jbGFzc2VzPVwiXHJcbiAgICAgICAgICBpc0VtYmVkRW5hYmxlZFxyXG4gICAgICAgICAgICA/IGlzVHJhbnNwYXJlbnRcclxuICAgICAgICAgICAgICA/ICd2aWV3ZXItdHJhbnNwYXJlbnQgaC1bMTAwZHZoXSdcclxuICAgICAgICAgICAgICA6ICdoLVtjYWxjKDEwMGR2aC0zLjVyZW0pXSdcclxuICAgICAgICAgICAgOiAnaC1bMTAwZHZoXSdcclxuICAgICAgICBcIlxyXG4gICAgICAgIDpsb2FkaW5nLWJhci1jbGFzc2VzPVwiaXNFbWJlZEVuYWJsZWQgPyAndG9wLTAnIDogJ3RvcC0xMidcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvUGFnZVNldHVwLnZ1ZToyNTo3XCJcclxuICAgICAgPlxyXG4gICAgICAgIDx0ZW1wbGF0ZSAjYWZ0ZXItdmlld2VyLWJhc2U+XHJcbiAgICAgICAgICA8VHJhbnNpdGlvblxyXG4gICAgICAgICAgICBlbnRlci1mcm9tLWNsYXNzPVwib3BhY2l0eS0wXCJcclxuICAgICAgICAgICAgZW50ZXItYWN0aXZlLWNsYXNzPVwidHJhbnNpdGlvbiBkdXJhdGlvbi0xMDAwXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL1BhZ2VTZXR1cC52dWU6MzY6MTFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8Vmlld2VyQW5jaG9yZWRQb2ludHNcclxuICAgICAgICAgICAgICByZWY9XCJhbmNob3JlZFBvaW50c1wiXHJcbiAgICAgICAgICAgICAgQGZvcmNlLWNsb3NlLXBhbmVscz1cIigpID0+IGNsb3NlQWxsUGFuZWxzKCd0aHJlYWRzJylcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvUGFnZVNldHVwLnZ1ZTo0MDoxM1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L1RyYW5zaXRpb24+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPC9WaWV3ZXJDb3JlU2V0dXA+XHJcblxyXG4gICAgICA8Q2xpZW50T25seSBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvUGFnZVNldHVwLnZ1ZTo0ODo3XCI+XHJcbiAgICAgICAgPCEtLSBDb250cm9scyAtLT5cclxuICAgICAgICA8dGVtcGxhdGUgdi1pZj1cInNob3dDb250cm9sc1wiPlxyXG4gICAgICAgICAgPFZpZXdlckNvbnRyb2xzTGVmdFxyXG4gICAgICAgICAgICByZWY9XCJsZWZ0Q29udHJvbHNcIlxyXG4gICAgICAgICAgICBAZm9yY2UtY2xvc2UtcGFuZWxzPVwiKCkgPT4gY2xvc2VBbGxQYW5lbHMoJ2xlZnQnKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9QYWdlU2V0dXAudnVlOjUxOjExXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8Vmlld2VyQ29udHJvbHNCb3R0b21cclxuICAgICAgICAgICAgcmVmPVwiYm90dG9tQ29udHJvbHNcIlxyXG4gICAgICAgICAgICBAZm9yY2UtY2xvc2UtcGFuZWxzPVwiKCkgPT4gY2xvc2VBbGxQYW5lbHMoJ2JvdHRvbScpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL1BhZ2VTZXR1cC52dWU6NTU6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxWaWV3ZXJDb250cm9sc1JpZ2h0IHYtaWY9XCJpc01vYmlsZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9QYWdlU2V0dXAudnVlOjU5OjExXCIgLz5cclxuICAgICAgICA8L3RlbXBsYXRlPlxyXG5cclxuICAgICAgICA8Vmlld2VyTGltaXRzRGlhbG9nXHJcbiAgICAgICAgICB2LWlmPVwicHJvamVjdFwiXHJcbiAgICAgICAgICB2LW1vZGVsOm9wZW49XCJzaG93TGltaXRzRGlhbG9nXCJcclxuICAgICAgICAgIDpwcm9qZWN0PVwicHJvamVjdFwiXHJcbiAgICAgICAgICA6cmVzb3VyY2UtaWQtc3RyaW5nPVwicmVzb3VyY2VJZFN0cmluZ1wiXHJcbiAgICAgICAgICA6bGltaXQtdHlwZT1cImxpbWl0c0RpYWxvZ1R5cGVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvUGFnZVNldHVwLnZ1ZTo2Mjo5XCJcclxuICAgICAgICAvPlxyXG5cclxuICAgICAgICA8IS0tIFZpZXdlciBPYmplY3QgU2VsZWN0aW9uIEluZm8gRGlzcGxheSAtLT5cclxuICAgICAgICA8VHJhbnNpdGlvblxyXG4gICAgICAgICAgdi1pZj1cIiFoaWRlU2VsZWN0aW9uSW5mb1wiXHJcbiAgICAgICAgICBlbnRlci1mcm9tLWNsYXNzPVwib3BhY2l0eS0wXCJcclxuICAgICAgICAgIGVudGVyLWFjdGl2ZS1jbGFzcz1cInRyYW5zaXRpb24gZHVyYXRpb24tMTAwMFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9QYWdlU2V0dXAudnVlOjcxOjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxWaWV3ZXJTZWxlY3Rpb25TaWRlYmFyIHJlZj1cInNlbGVjdGlvblNpZGViYXJcIiBjbGFzcz1cInotMjBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvUGFnZVNldHVwLnZ1ZTo3NjoxMVwiIC8+XHJcbiAgICAgICAgPC9UcmFuc2l0aW9uPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgei0xMCB3LXNjcmVlbiBweC04IGdyaWQgZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTMgZ2FwLTIgdG9wLVszLjc1cmVtXVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9QYWdlU2V0dXAudnVlOjc4OjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWVuZCBqdXN0aWZ5LWNlbnRlciBzbTpqdXN0aWZ5LXN0YXJ0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL1BhZ2VTZXR1cC52dWU6ODE6MTFcIj5cclxuICAgICAgICAgICAgPFBvcnRhbFRhcmdldCBuYW1lPVwicG9ja2V0LWxlZnRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvUGFnZVNldHVwLnZ1ZTo4MjoxM1wiPjwvUG9ydGFsVGFyZ2V0PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvUGFnZVNldHVwLnZ1ZTo4NDoxMVwiPlxyXG4gICAgICAgICAgICA8UG9ydGFsVGFyZ2V0IG5hbWU9XCJwb2NrZXQtdGlwXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL1BhZ2VTZXR1cC52dWU6ODU6MTNcIj48L1BvcnRhbFRhcmdldD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvUGFnZVNldHVwLnZ1ZTo4NjoxM1wiPlxyXG4gICAgICAgICAgICAgIDxQb3J0YWxUYXJnZXQgbmFtZT1cInBvY2tldC1hY3Rpb25zXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL1BhZ2VTZXR1cC52dWU6ODc6MTVcIj48L1BvcnRhbFRhcmdldD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWVuZCBqdXN0aWZ5LWNlbnRlciBzbTpqdXN0aWZ5LWVuZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9QYWdlU2V0dXAudnVlOjkwOjExXCI+XHJcbiAgICAgICAgICAgIDxQb3J0YWxUYXJnZXQgbmFtZT1cInBvY2tldC1yaWdodFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9QYWdlU2V0dXAudnVlOjkxOjEzXCI+PC9Qb3J0YWxUYXJnZXQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9DbGllbnRPbmx5PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8Vmlld2VyRW1iZWRGb290ZXJcclxuICAgICAgOm5hbWU9XCJlbWJlZE5hbWVcIlxyXG4gICAgICA6ZGF0ZT1cImxhc3RVcGRhdGVcIlxyXG4gICAgICA6dXJsPVwicm91dGUucGF0aFwiXHJcbiAgICAgIDpoaWRlLXNwZWNrbGUtYnJhbmRpbmc9XCJoaWRlU3BlY2tsZUxvZ29cIlxyXG4gICAgICA6ZGlzYWJsZS1tb2RlbC1saW5rPVwiZGlzYWJsZU1vZGVsTGlua1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9QYWdlU2V0dXAudnVlOjk2OjVcIlxyXG4gICAgLz5cclxuICAgIDxQb3J0YWwgdG89XCJwcmltYXJ5LWFjdGlvbnNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvUGFnZVNldHVwLnZ1ZToxMDM6NVwiPlxyXG4gICAgICA8SGVhZGVyTmF2U2hhcmVcclxuICAgICAgICB2LWlmPVwicHJvamVjdFwiXHJcbiAgICAgICAgOnJlc291cmNlLWlkLXN0cmluZz1cInJlc291cmNlSWRTdHJpbmdcIlxyXG4gICAgICAgIDpwcm9qZWN0PVwicHJvamVjdFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9QYWdlU2V0dXAudnVlOjEwNDo3XCJcclxuICAgICAgLz5cclxuICAgIDwvUG9ydGFsPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyB1c2VJbmplY3RlZFZpZXdlclN0YXRlIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cCdcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xyXG5pbXBvcnQgeyBncmFwaHFsIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQgeyB1c2VFbWJlZCB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cC9lbWJlZCdcclxuaW1wb3J0IHsgcHJvamVjdHNSb3V0ZSwgd29ya3NwYWNlUm91dGUgfSBmcm9tICd+fi9saWIvY29tbW9uL2hlbHBlcnMvcm91dGUnXHJcbmltcG9ydCB7IHVzZU1peHBhbmVsIH0gZnJvbSAnfi9saWIvY29yZS9jb21wb3NhYmxlcy9tcCdcclxuaW1wb3J0IHsgcGFyc2VVcmxQYXJhbWV0ZXJzLCByZXNvdXJjZUJ1aWxkZXIgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQvdmlld2VyL3JvdXRlJ1xyXG5pbXBvcnQgeyBWaWV3ZXJMaW1pdHNEaWFsb2dUeXBlIH0gZnJvbSAnfi9saWIvcHJvamVjdHMvaGVscGVycy9saW1pdHMnXHJcbmltcG9ydCB7IFRhaWx3aW5kQnJlYWtwb2ludHMgfSBmcm9tICd+fi9saWIvY29tbW9uL2hlbHBlcnMvdGFpbHdpbmQnXHJcbmltcG9ydCB7IHVzZUJyZWFrcG9pbnRzIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5cclxuZ3JhcGhxbChgXHJcbiAgZnJhZ21lbnQgVmlld2VyUGFnZVNldHVwX1NhdmVkVmlldyBvbiBTYXZlZFZpZXcge1xyXG4gICAgaWRcclxuICAgIG5hbWVcclxuICB9XHJcbmApXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBNb2RlbFBhZ2VQcm9qZWN0IG9uIFByb2plY3Qge1xyXG4gICAgaWRcclxuICAgIGNyZWF0ZWRBdFxyXG4gICAgbmFtZVxyXG4gICAgdmlzaWJpbGl0eVxyXG4gICAgbGltaXRlZFdvcmtzcGFjZSB7XHJcbiAgICAgIGlkXHJcbiAgICAgIHNsdWdcclxuICAgICAgbmFtZVxyXG4gICAgfVxyXG4gICAgZW1iZWRPcHRpb25zIHtcclxuICAgICAgaGlkZVNwZWNrbGVCcmFuZGluZ1xyXG4gICAgfVxyXG4gICAgaGFzQWNjZXNzVG9GZWF0dXJlKGZlYXR1cmVOYW1lOiBoaWRlU3BlY2tsZUJyYW5kaW5nKVxyXG4gICAgLi4uVmlld2VyTGltaXRzRGlhbG9nX1Byb2plY3RcclxuICB9XHJcbmApXHJcblxyXG5jb25zdCByb3V0ZSA9IHVzZVJvdXRlKClcclxuY29uc3QgaXNXb3Jrc3BhY2VzRW5hYmxlZCA9IHVzZUlzV29ya3NwYWNlc0VuYWJsZWQoKVxyXG5jb25zdCBicmVha3BvaW50cyA9IHVzZUJyZWFrcG9pbnRzKFRhaWx3aW5kQnJlYWtwb2ludHMpXHJcbmNvbnN0IGlzTW9iaWxlID0gYnJlYWtwb2ludHMuc21hbGxlcignc20nKVxyXG5cclxuY29uc3QgbGVmdENvbnRyb2xzID0gcmVmKClcclxuY29uc3QgYm90dG9tQ29udHJvbHMgPSByZWYoKVxyXG5jb25zdCBzZWxlY3Rpb25TaWRlYmFyID0gcmVmKClcclxuY29uc3QgYW5jaG9yZWRQb2ludHMgPSByZWYoKVxyXG5cclxuY29uc3Qgc3RhdGUgPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuY29uc3QgcmVzb3VyY2VJZFN0cmluZyA9IGNvbXB1dGVkKCgpID0+IHN0YXRlLnJlc291cmNlcy5yZXF1ZXN0LnJlc291cmNlSWRTdHJpbmcudmFsdWUpXHJcblxyXG5jb25zdCB7XHJcbiAgaXNFbmFibGVkOiBpc0VtYmVkRW5hYmxlZCxcclxuICBoaWRlU2VsZWN0aW9uSW5mbyxcclxuICBpc1RyYW5zcGFyZW50LFxyXG4gIHNob3dDb250cm9scyxcclxuICBkaXNhYmxlTW9kZWxMaW5rLFxyXG4gIGhpZGVTcGVja2xlQnJhbmRpbmdcclxufSA9IHVzZUVtYmVkKClcclxuY29uc3QgbXAgPSB1c2VNaXhwYW5lbCgpXHJcblxyXG5jb25zdCB7XHJcbiAgcmVzb3VyY2VzOiB7XHJcbiAgICByZXNwb25zZTogeyBwcm9qZWN0LCBtb2RlbHNBbmRWZXJzaW9uSWRzLCBzYXZlZFZpZXcgfVxyXG4gIH1cclxufSA9IHN0YXRlXHJcblxyXG5jb25zdCBzaG93TGltaXRzRGlhbG9nID0gcmVmKGZhbHNlKVxyXG5jb25zdCBsaW1pdHNEaWFsb2dUeXBlID0gcmVmPFZpZXdlckxpbWl0c0RpYWxvZ1R5cGU+KFZpZXdlckxpbWl0c0RpYWxvZ1R5cGUuVmVyc2lvbilcclxuXHJcbi8vIENoZWNrIGZvciBtaXNzaW5nIHJlZmVyZW5jZWRPYmplY3QgaW4gdXJsIHJlZmVyZW5jZWQgdmVyc2lvbnMgKG91dCBvZiBwbGFuIGxpbWl0cylcclxuY29uc3QgaGFzTWlzc2luZ1JlZmVyZW5jZWRPYmplY3QgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgcmVzb3VyY2VzID0gcGFyc2VVcmxQYXJhbWV0ZXJzKHJlc291cmNlSWRTdHJpbmcudmFsdWUpXHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9IG1vZGVsc0FuZFZlcnNpb25JZHMudmFsdWUuc29tZSgoaXRlbSkgPT4ge1xyXG4gICAgY29uc3QgdmVyc2lvbiA9IGl0ZW0ubW9kZWw/LmxvYWRlZFZlcnNpb24/Lml0ZW1zPy5maW5kKFxyXG4gICAgICAodikgPT4gdi5pZCA9PT0gaXRlbS52ZXJzaW9uSWRcclxuICAgIClcclxuXHJcbiAgICBpZiAoIXZlcnNpb24gfHwgdmVyc2lvbi5yZWZlcmVuY2VkT2JqZWN0ID09PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IG1vZGVsVmVyc2lvblN0cmluZyA9IHJlc291cmNlQnVpbGRlcigpXHJcbiAgICAgICAgLmFkZE1vZGVsKGl0ZW0ubW9kZWwuaWQsIGl0ZW0udmVyc2lvbklkKVxyXG4gICAgICAgIC50b1N0cmluZygpXHJcbiAgICAgIGNvbnN0IGlzSW5VcmwgPSByZXNvdXJjZXMuc29tZShcclxuICAgICAgICAocikgPT4gci50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09IG1vZGVsVmVyc2lvblN0cmluZ1xyXG4gICAgICApXHJcblxyXG4gICAgICByZXR1cm4gaXNJblVybFxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiByZXN1bHRcclxufSlcclxuXHJcbmNvbnN0IGlzRmVkZXJhdGVkID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gc3RhdGUucmVzb3VyY2VzLnJlc3BvbnNlLnJlc291cmNlSXRlbXMudmFsdWUubGVuZ3RoID4gMVxyXG4pXHJcblxyXG5jb25zdCB0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAocHJvamVjdC52YWx1ZT8ubW9kZWxzPy5pdGVtcykge1xyXG4gICAgY29uc3QgbW9kZWxDb3VudCA9IHByb2plY3QudmFsdWUubW9kZWxzLml0ZW1zLmxlbmd0aFxyXG4gICAgY29uc3QgcHJvamVjdE5hbWUgPSBwcm9qZWN0LnZhbHVlLm5hbWUgfHwgJydcclxuXHJcbiAgICBpZiAobW9kZWxDb3VudCA+IDEpIHtcclxuICAgICAgcmV0dXJuIHByb2plY3ROYW1lID8gYE11bHRpcGxlIG1vZGVscyAtICR7cHJvamVjdE5hbWV9YCA6ICdNdWx0aXBsZSBtb2RlbHMnXHJcbiAgICB9IGVsc2UgaWYgKG1vZGVsQ291bnQgPT09IDEpIHtcclxuICAgICAgY29uc3QgbW9kZWxOYW1lID0gcHJvamVjdC52YWx1ZS5tb2RlbHMuaXRlbXNbMF0ubmFtZSB8fCAnJ1xyXG4gICAgICByZXR1cm4gcHJvamVjdE5hbWUgPyBgJHttb2RlbE5hbWV9IC0gJHtwcm9qZWN0TmFtZX1gIDogbW9kZWxOYW1lXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiAnJ1xyXG59KVxyXG5cclxuY29uc3QgbW9kZWxOYW1lID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChwcm9qZWN0LnZhbHVlPy5tb2RlbHM/Lml0ZW1zICYmIHByb2plY3QudmFsdWUubW9kZWxzLml0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgIHJldHVybiBwcm9qZWN0LnZhbHVlLm1vZGVscy5pdGVtc1swXS5uYW1lXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBwcm9qZWN0LnZhbHVlPy5uYW1lXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgZW1iZWROYW1lID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmICghbW9kZWxOYW1lLnZhbHVlKSByZXR1cm4gJ0xvYWRpbmcuLi4nXHJcblxyXG4gIGxldCByZXQgPSAnJ1xyXG4gIGlmIChzYXZlZFZpZXcudmFsdWUpIHtcclxuICAgIHJldCArPSBgJHtzYXZlZFZpZXcudmFsdWUubmFtZX0gfCBgXHJcbiAgfVxyXG5cclxuICByZXQgKz0gbW9kZWxOYW1lLnZhbHVlXHJcbiAgcmV0dXJuIHJldFxyXG59KVxyXG5cclxuY29uc3QgbGFzdFVwZGF0ZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAocHJvamVjdC52YWx1ZT8ubW9kZWxzPy5pdGVtc1swXSAmJiBwcm9qZWN0LnZhbHVlLm1vZGVscy5pdGVtc1swXS51cGRhdGVkQXQpIHtcclxuICAgIHJldHVybiAnVXBkYXRlZCAnICsgZGF5anMocHJvamVjdC52YWx1ZS5tb2RlbHMuaXRlbXNbMF0udXBkYXRlZEF0KS5mcm9tTm93KClcclxuICB9IGVsc2UgaWYgKHByb2plY3QudmFsdWUpIHtcclxuICAgIHJldHVybiAnQ3JlYXRlZCAnICsgZGF5anMocHJvamVjdC52YWx1ZS5jcmVhdGVkQXQpLmZyb21Ob3coKVxyXG4gIH0gZWxzZSByZXR1cm4gdW5kZWZpbmVkXHJcbn0pXHJcblxyXG5jb25zdCBjYW5FZGl0RW1iZWRPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiBwcm9qZWN0LnZhbHVlPy5oYXNBY2Nlc3NUb0ZlYXR1cmVcclxufSlcclxuXHJcbmNvbnN0IGhpZGVTcGVja2xlTG9nbyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoIWNhbkVkaXRFbWJlZE9wdGlvbnMudmFsdWUpIHJldHVybiBmYWxzZVxyXG4gIGlmIChwcm9qZWN0LnZhbHVlPy5lbWJlZE9wdGlvbnM/LmhpZGVTcGVja2xlQnJhbmRpbmcpIHJldHVybiB0cnVlXHJcbiAgZWxzZSByZXR1cm4gaGlkZVNwZWNrbGVCcmFuZGluZy52YWx1ZVxyXG59KVxyXG5cclxudXNlSGVhZCh7IHRpdGxlIH0pXHJcblxyXG5vbk1vdW50ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IHJlZmVycmVyID0gZG9jdW1lbnQucmVmZXJyZXJcclxuICBjb25zdCBzaG91bGRUcmFja0V2ZW50ID0gIXJlZmVycmVyPy5pbmNsdWRlcygnc3BlY2tsZS5zeXN0ZW1zJykgJiYgIWltcG9ydC5tZXRhLmRldlxyXG5cclxuICBpZiAoaXNFbWJlZEVuYWJsZWQudmFsdWUgJiYgc2hvdWxkVHJhY2tFdmVudCkge1xyXG4gICAgbXAudHJhY2soJ0VtYmVkZGVkIE1vZGVsIExvYWQnKVxyXG4gIH1cclxufSlcclxuXHJcbi8vIFdhdGNoIGZvciBwbGFuIGxpbWl0IGNvbmRpdGlvbnMgYW5kIHNob3cgZGlhbG9nIGlmIG5lZWRlZFxyXG53YXRjaChcclxuICBbaGFzTWlzc2luZ1JlZmVyZW5jZWRPYmplY3QsIHN0YXRlLnJlc291cmNlcy5yZXNwb25zZS5yZXNvdXJjZXNMb2FkaW5nXSxcclxuICAoW21pc3NpbmdPYmplY3QsIHJlc291cmNlc0xvYWRpbmddOiBbYm9vbGVhbiwgYm9vbGVhbl0pID0+IHtcclxuICAgIC8vIE9ubHkgc2hvdyBkaWFsb2cgaWYgcmVzb3VyY2VzIGFyZSBub3QgbG9hZGluZyB0byBwcmV2ZW50IGZsYXNoaW5nIGR1cmluZyB2ZXJzaW9uIHN3aXRjaGVzXHJcbiAgICBpZiAobWlzc2luZ09iamVjdCAmJiAhcmVzb3VyY2VzTG9hZGluZykge1xyXG4gICAgICBpZiAoaXNGZWRlcmF0ZWQudmFsdWUpIHtcclxuICAgICAgICBsaW1pdHNEaWFsb2dUeXBlLnZhbHVlID0gJ2ZlZGVyYXRlZCdcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsaW1pdHNEaWFsb2dUeXBlLnZhbHVlID0gJ3ZlcnNpb24nXHJcbiAgICAgIH1cclxuICAgICAgc2hvd0xpbWl0c0RpYWxvZy52YWx1ZSA9IHRydWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNob3dMaW1pdHNEaWFsb2cudmFsdWUgPSBmYWxzZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgeyBpbW1lZGlhdGU6IHRydWUgfVxyXG4pXHJcblxyXG5jb25zdCBjbG9zZUFsbFBhbmVscyA9IChleGNlcHQ/OiAnbGVmdCcgfCAnYm90dG9tJyB8ICd0aHJlYWRzJykgPT4ge1xyXG4gIGlmIChleGNlcHQgIT09ICdsZWZ0JyAmJiBsZWZ0Q29udHJvbHMudmFsdWU/LmZvcmNlQ2xvc2VQYW5lbHMpIHtcclxuICAgIGxlZnRDb250cm9scy52YWx1ZS5mb3JjZUNsb3NlUGFuZWxzKClcclxuICB9XHJcbiAgaWYgKGV4Y2VwdCAhPT0gJ2JvdHRvbScgJiYgYm90dG9tQ29udHJvbHMudmFsdWU/LmZvcmNlQ2xvc2VQYW5lbHMpIHtcclxuICAgIGJvdHRvbUNvbnRyb2xzLnZhbHVlLmZvcmNlQ2xvc2VQYW5lbHMoKVxyXG4gIH1cclxuICBpZiAoZXhjZXB0ICE9PSAndGhyZWFkcycgJiYgYW5jaG9yZWRQb2ludHMudmFsdWU/LmZvcmNlQ2xvc2VUaHJlYWRzKSB7XHJcbiAgICBhbmNob3JlZFBvaW50cy52YWx1ZS5mb3JjZUNsb3NlVGhyZWFkcygpXHJcbiAgfVxyXG5cclxuICBzZWxlY3Rpb25TaWRlYmFyLnZhbHVlLmZvcmNlQ2xvc2UoKVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvUGFnZVNldHVwLnZ1ZSJ9 |