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

484 lines
44 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/project/CardImportFileArea.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/global/illustration/emptystate/Project.vue";
import { default as __nuxt_component_1 } from "/_nuxt/components/global/illustration/emptystate/ProjectTab.vue";
import { default as __nuxt_component_2 } from "/_nuxt/node_modules/nuxt/dist/app/components/nuxt-link.js?v=e4f18c29";
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/page/models/NewDialog.vue";
import { FormFileUploadZone as __nuxt_component_5 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
/* Injection by vite-plugin-vue-inspector Start */
import { createElementVNode as __createElementVNode,createVNode as __createVNode,createElementBlock as __createElementBlock,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 _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
function _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...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 {
useFileImport,
useGlobalFileImportManager
} from "/_nuxt/lib/core/composables/fileImport.ts";
import { useFileUploadProgressCore } from "/_nuxt/lib/form/composables/fileUpload.ts";
import { ExclamationTriangleIcon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_solid.js?v=e4f18c29";
import { connectorsRoute } from "/_nuxt/lib/common/helpers/route.ts";
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
import { rhinoImporterSupportedFileExtensions } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/blobs/index.js";
import { useIsRhinoFileImporterEnabled } from "/_nuxt/composables/globals.ts";
import { toRefs, ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "ProjectCardImportFileArea",
props: {
project: { type: Object, required: true },
model: { type: Object, required: false },
modelName: { type: String, required: false },
emptyStateVariant: { type: String, required: false }
},
emits: ["uploading"],
setup(__props, { expose: __expose, emit: __emit }) {
graphql(`
fragment ProjectCardImportFileArea_Project on Project {
id
permissions {
canCreateModel {
...FullPermissionCheckResult
}
}
...UseFileImport_Project
}
`);
graphql(`
fragment ProjectCardImportFileArea_Model on Model {
id
name
permissions {
canCreateVersion {
...FullPermissionCheckResult
}
}
...UseFileImport_Model
}
`);
const emit = __emit;
const props = __props;
const isRhinoFileImporterEnabled = useIsRhinoFileImporterEnabled();
const { addFailedJob } = useGlobalFileImportManager();
const {
maxSizeInBytes,
onFilesSelected,
accept,
upload: fileUpload,
isUploading,
uploadSelected,
resetSelected,
isUploadable: isFileUploadUploadable
} = useFileImport({
...toRefs(props),
manuallyTriggerUpload: true,
fileSelectedCallback: () => {
if (props.model) {
uploadSelected();
} else {
if (!fileUpload.value?.error) {
showNewModelDialog.value = true;
}
}
},
errorCallback: ({ failedJob }) => {
addFailedJob(failedJob);
resetSelected();
}
});
const { errorMessage, progressBarClasses, progressBarStyle } = useFileUploadProgressCore({
item: fileUpload
});
const uploadZone = ref(
null
);
const showNewModelDialog = ref(false);
const modelName = computed(() => props.modelName || props.model?.name);
const accessCheck = computed(() => {
return props.model ? props.model.permissions.canCreateVersion : props.project.permissions.canCreateModel;
});
const isDisabled = computed(() => !accessCheck.value.authorized);
const showEmptyState = computed(
() => props.emptyStateVariant !== "modelGrid" && props.emptyStateVariant !== "modelList"
);
const emptyStateHeading = computed(() => {
if (showEmptyState.value) {
return props.emptyStateVariant === "modelsSection" ? "The project has no models, yet." : "No models, yet.";
}
if (isDisabled.value) {
return modelName.value ? "The model has no versions, yet." : "The project has no models, yet.";
}
return void 0;
});
const emptyStateHeadingClasses = computed(() => {
const classParts = ["text-foreground-2 text-heading-sm p-0 m-0 "];
if (isDisabled.value) {
classParts.push("text-balance text-center");
}
return classParts.join(" ");
});
const containerClasses = computed(() => {
const classParts = ["w-full flex justify-center items-center"];
if (props.emptyStateVariant === "modelGrid") {
classParts.push("p-4 gap-4");
} else if (props.emptyStateVariant === "modelList") {
classParts.push("gap-4 text-center");
} else if (props.emptyStateVariant === "modelsSection") {
classParts.push("p-4 gap-4 text-balance");
} else {
classParts.push("p-20 gap-8 text-balance flex-col text-center");
}
return classParts.join(" ");
});
const illustrationClasses = computed(() => {
const classParts = ["max-w-lg"];
if (props.emptyStateVariant === "modelGrid") {
classParts.push("hidden");
} else if (props.emptyStateVariant === "modelList") {
classParts.push("hidden");
} else if (props.emptyStateVariant === "modelsSection") {
classParts.push("hidden min-[1350px]:block");
} else {
classParts.push("");
}
return classParts.join(" ");
});
const paragraphClasses = computed(() => {
const classParts = ["text-body-xs text-foreground-2 mt-2 p-0"];
if (props.emptyStateVariant === "modelGrid") {
classParts.push("");
} else if (props.emptyStateVariant === "modelList") {
classParts.push("");
} else if (props.emptyStateVariant === "modelsSection") {
classParts.push("max-w-sm");
} else {
classParts.push("max-w-sm");
}
return classParts.join(" ");
});
const buttonsClasses = computed(() => {
const classParts = ["w-full flex flex-row gap-2 flex-wrap"];
if (props.emptyStateVariant === "modelGrid") {
classParts.push("mt-3");
} else if (props.emptyStateVariant === "modelList") {
classParts.push("mt-3");
} else if (props.emptyStateVariant === "modelsSection") {
classParts.push("mt-3");
} else {
classParts.push("justify-center mt-6");
}
return classParts.join(" ");
});
const getDashedBorderClasses = (isDraggingFiles) => {
if (isDraggingFiles) return "border-primary";
if (errorMessage.value) return "border-danger";
return "border-outline-2";
};
const onModelCreate = (params) => {
if (!isFileUploadUploadable.value) return;
uploadSelected({
model: params.model
});
};
const triggerPicker = () => {
uploadZone.value?.triggerPicker();
};
watch(showNewModelDialog, (newVal, oldVal) => {
if (oldVal && !newVal) {
if (!isUploading.value) {
resetSelected();
}
}
});
watch(isUploading, (newVal, oldVal) => {
emit("uploading", {
isUploading: newVal,
upload: fileUpload.value,
error: errorMessage.value
});
if (!newVal && oldVal) {
resetSelected();
}
});
__expose({
triggerPicker
});
const __returned__ = { emit, props, isRhinoFileImporterEnabled, addFailedJob, maxSizeInBytes, onFilesSelected, accept, fileUpload, isUploading, uploadSelected, resetSelected, isFileUploadUploadable, errorMessage, progressBarClasses, progressBarStyle, uploadZone, showNewModelDialog, modelName, accessCheck, isDisabled, showEmptyState, emptyStateHeading, emptyStateHeadingClasses, containerClasses, illustrationClasses, paragraphClasses, buttonsClasses, getDashedBorderClasses, onModelCreate, triggerPicker, get ExclamationTriangleIcon() {
return ExclamationTriangleIcon;
}, get connectorsRoute() {
return connectorsRoute;
}, get rhinoImporterSupportedFileExtensions() {
return rhinoImporterSupportedFileExtensions;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { toDisplayString as _toDisplayString, openBlock as _openBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, resolveComponent as _resolveComponent, withCtx as _withCtx, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = {
key: 0,
class: "max-w-sm p-2 flex flex-col justify-center space-y-1 text-foreground-2",
"data-v-inspector": "components/project/CardImportFileArea.vue:17:7"
};
const _hoisted_2 = {
class: "text-center",
"data-v-inspector": "components/project/CardImportFileArea.vue:21:9"
};
const _hoisted_3 = {
key: 0,
class: "text-danger inline-flex space-x-1 items-center text-center",
"data-v-inspector": "components/project/CardImportFileArea.vue:24:9"
};
const _hoisted_4 = { "data-v-inspector": "components/project/CardImportFileArea.vue:29:11" };
const _hoisted_5 = { "data-v-inspector": "components/project/CardImportFileArea.vue:43:9" };
const _hoisted_6 = {
key: 0,
class: "underline",
"data-v-inspector": "components/project/CardImportFileArea.vue:54:13"
};
const _hoisted_7 = {
key: 1,
"data-v-inspector": "components/project/CardImportFileArea.vue:63:13"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_IllustrationEmptystateProject = __nuxt_component_0;
const _component_IllustrationEmptystateProjectTab = __nuxt_component_1;
const _component_NuxtLink = __nuxt_component_2;
const _component_FormButton = __nuxt_component_3;
const _component_ProjectPageModelsNewDialog = __nuxt_component_4;
const _component_FormFileUploadZone = __nuxt_component_5;
const _directive_tippy = _resolveDirective("tippy");
return _openBlock(), _createBlock(_component_FormFileUploadZone, {
ref: "uploadZone",
disabled: $setup.isUploading || $setup.isDisabled,
"size-limit": $setup.maxSizeInBytes,
accept: $setup.accept,
class: "flex items-center h-full",
onFilesSelected: $setup.onFilesSelected,
"data-v-inspector": "components/project/CardImportFileArea.vue:4:3"
}, {
default: _withCtx(({ isDraggingFiles, openFilePicker }) => [
_createElementVNode(
"div",
{
class: _normalizeClass(["w-full h-full border-dashed border rounded-md p-4 flex items-center justify-center text-sm", [$setup.getDashedBorderClasses(isDraggingFiles)]]),
"data-v-inspector": "components/project/CardImportFileArea.vue:13:5"
},
[
$setup.fileUpload ? (_openBlock(), _createElementBlock("div", _hoisted_1, [
_createElementVNode(
"span",
_hoisted_2,
_toDisplayString($setup.fileUpload.file.name),
1
/* TEXT */
),
$setup.errorMessage ? (_openBlock(), _createElementBlock("span", _hoisted_3, [
_createVNode($setup["ExclamationTriangleIcon"], {
class: "h-4 w-4 shrink-0",
"data-v-inspector": "components/project/CardImportFileArea.vue:28:11"
}),
_createElementVNode(
"span",
_hoisted_4,
_toDisplayString($setup.errorMessage),
1
/* TEXT */
)
])) : (_openBlock(), _createElementBlock(
"div",
{
key: 1,
class: _normalizeClass(["w-full mt-2", $setup.progressBarClasses]),
style: _normalizeStyle($setup.progressBarStyle),
"data-v-inspector": "components/project/CardImportFileArea.vue:31:9"
},
null,
6
/* CLASS, STYLE */
))
])) : (_openBlock(), _createElementBlock(
"div",
{
key: 1,
class: _normalizeClass($setup.containerClasses),
"data-v-inspector": "components/project/CardImportFileArea.vue:37:7"
},
[
_createElementVNode(
"div",
{
class: _normalizeClass($setup.illustrationClasses),
"data-v-inspector": "components/project/CardImportFileArea.vue:38:9"
},
[
$props.emptyStateVariant === "modelsSection" ? (_openBlock(), _createBlock(_component_IllustrationEmptystateProject, {
key: 0,
"data-v-inspector": "components/project/CardImportFileArea.vue:39:11"
})) : (_openBlock(), _createBlock(_component_IllustrationEmptystateProjectTab, {
key: 1,
"data-v-inspector": "components/project/CardImportFileArea.vue:40:11"
}))
],
2
/* CLASS */
),
_createElementVNode("div", _hoisted_5, [
$setup.emptyStateHeading ? (_openBlock(), _createElementBlock(
"p",
{
key: 0,
class: _normalizeClass($setup.emptyStateHeadingClasses),
"data-v-inspector": "components/project/CardImportFileArea.vue:44:11"
},
_toDisplayString($setup.emptyStateHeading),
3
/* TEXT, CLASS */
)) : _createCommentVNode("v-if", true),
!$setup.isDisabled ? (_openBlock(), _createElementBlock(
"p",
{
key: 1,
class: _normalizeClass($setup.paragraphClasses),
"data-v-inspector": "components/project/CardImportFileArea.vue:47:11"
},
[
_cache[3] || (_cache[3] = _createTextVNode(
" Use ",
-1
/* CACHED */
)),
_createVNode(_component_NuxtLink, {
to: $setup.connectorsRoute,
class: "font-medium",
"data-v-inspector": "components/project/CardImportFileArea.vue:49:13"
}, {
default: _withCtx(() => [..._cache[1] || (_cache[1] = [
_createElementVNode(
"span",
{
class: "underline",
"data-v-inspector": "components/project/CardImportFileArea.vue:50:15"
},
"connectors",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
}, 8, ["to"]),
_createTextVNode(
" to publish a " + _toDisplayString($setup.modelName ? "" : "new model") + " version to " + _toDisplayString($setup.modelName ? "this model" : "this project") + ", or drag and drop ",
1
/* TEXT */
),
$setup.isRhinoFileImporterEnabled ? _withDirectives((_openBlock(), _createElementBlock("span", _hoisted_6, [..._cache[2] || (_cache[2] = [
_createTextVNode(
" a supported file here. ",
-1
/* CACHED */
)
])])), [
[
_directive_tippy,
["ifc", ...Array.from($setup.rhinoImporterSupportedFileExtensions)].join(", ")
]
]) : (_openBlock(), _createElementBlock("span", _hoisted_7, "an IFC file."))
],
2
/* CLASS */
)) : _createCommentVNode("v-if", true),
$setup.showEmptyState && !$setup.isDisabled ? (_openBlock(), _createElementBlock(
"div",
{
key: 2,
class: _normalizeClass($setup.buttonsClasses),
"data-v-inspector": "components/project/CardImportFileArea.vue:65:11"
},
[
_createVNode(_component_FormButton, {
to: $setup.connectorsRoute,
size: "sm",
color: "outline",
"data-v-inspector": "components/project/CardImportFileArea.vue:66:13"
}, {
default: _withCtx(() => [..._cache[4] || (_cache[4] = [
_createTextVNode(
" Install connectors ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
}, 8, ["to"]),
_createVNode(_component_FormButton, {
size: "sm",
color: "outline",
onClick: openFilePicker,
"data-v-inspector": "components/project/CardImportFileArea.vue:69:13"
}, {
default: _withCtx(() => [..._cache[5] || (_cache[5] = [
_createTextVNode(
" Upload a file ",
-1
/* CACHED */
)
])]),
_: 2
/* DYNAMIC */
}, 1032, ["onClick"])
],
2
/* CLASS */
)) : _createCommentVNode("v-if", true)
])
],
2
/* CLASS */
))
],
2
/* CLASS */
),
_createVNode(_component_ProjectPageModelsNewDialog, {
open: $setup.showNewModelDialog,
"onUpdate:open": _cache[0] || (_cache[0] = ($event) => $setup.showNewModelDialog = $event),
"project-id": $props.project.id,
"model-name": $setup.fileUpload?.file.name,
onSubmit: $setup.onModelCreate,
"data-v-inspector": "components/project/CardImportFileArea.vue:76:5"
}, null, 8, ["open", "project-id", "model-name"])
]),
_: 1
/* STABLE */
}, 8, ["disabled", "size-limit", "accept", "onFilesSelected"]);
}
_sfc_main.__hmrId = "8a3d960b";
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/project/CardImportFileArea.vue"]]);
//# sourceMappingURL=data:application/json;base64,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Q0EsYUFFYTtBQUFBLHNCQUZELE1BQUs7QUFBQSxzQkFBSyxPQUFNO0FBQUEsc0JBQVcsU0FBTztBQUFBLHNCQUFnQixvQkFBaUI7QUFBQTt3Q0FBa0QsTUFFakk7QUFBQTswQkFGaUk7QUFBQSwwQkFFakk7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O01BS1IsYUFLRTtBQUFBLFFBSlEsTUFBTTtBQUFBLDJGQUFrQjtBQUFBLFFBQy9CLGNBQVksZUFBUTtBQUFBLFFBQ3BCLGNBQVksbUJBQVksS0FBSztBQUFBLFFBQzdCLFVBQVE7QUFBQSxRQUFlLG9CQUFpQjtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJDYXJkSW1wb3J0RmlsZUFyZWEudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlanMtYWNjZXNzaWJpbGl0eS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgLS0+XHJcbjwhLS0gZXNsaW50LWRpc2FibGUgdnVlanMtYWNjZXNzaWJpbGl0eS9jbGljay1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPEZvcm1GaWxlVXBsb2FkWm9uZVxyXG4gICAgcmVmPVwidXBsb2FkWm9uZVwiXHJcbiAgICB2LXNsb3Q9XCJ7IGlzRHJhZ2dpbmdGaWxlcywgb3BlbkZpbGVQaWNrZXIgfVwiXHJcbiAgICA6ZGlzYWJsZWQ9XCJpc1VwbG9hZGluZyB8fCBpc0Rpc2FibGVkXCJcclxuICAgIDpzaXplLWxpbWl0PVwibWF4U2l6ZUluQnl0ZXNcIlxyXG4gICAgOmFjY2VwdD1cImFjY2VwdFwiXHJcbiAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGgtZnVsbFwiXHJcbiAgICBAZmlsZXMtc2VsZWN0ZWQ9XCJvbkZpbGVzU2VsZWN0ZWRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L0NhcmRJbXBvcnRGaWxlQXJlYS52dWU6NDozXCJcclxuICA+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwidy1mdWxsIGgtZnVsbCBib3JkZXItZGFzaGVkIGJvcmRlciByb3VuZGVkLW1kIHAtNCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LXNtXCJcclxuICAgICAgOmNsYXNzPVwiW2dldERhc2hlZEJvcmRlckNsYXNzZXMoaXNEcmFnZ2luZ0ZpbGVzKV1cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L0NhcmRJbXBvcnRGaWxlQXJlYS52dWU6MTM6NVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICB2LWlmPVwiZmlsZVVwbG9hZFwiXHJcbiAgICAgICAgY2xhc3M9XCJtYXgtdy1zbSBwLTIgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBzcGFjZS15LTEgdGV4dC1mb3JlZ3JvdW5kLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L0NhcmRJbXBvcnRGaWxlQXJlYS52dWU6MTc6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtY2VudGVyXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9DYXJkSW1wb3J0RmlsZUFyZWEudnVlOjIxOjlcIj5cclxuICAgICAgICAgIHt7IGZpbGVVcGxvYWQuZmlsZS5uYW1lIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICB2LWlmPVwiZXJyb3JNZXNzYWdlXCJcclxuICAgICAgICAgIGNsYXNzPVwidGV4dC1kYW5nZXIgaW5saW5lLWZsZXggc3BhY2UteC0xIGl0ZW1zLWNlbnRlciB0ZXh0LWNlbnRlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvQ2FyZEltcG9ydEZpbGVBcmVhLnZ1ZToyNDo5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8RXhjbGFtYXRpb25UcmlhbmdsZUljb24gY2xhc3M9XCJoLTQgdy00IHNocmluay0wXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9DYXJkSW1wb3J0RmlsZUFyZWEudnVlOjI4OjExXCIgLz5cclxuICAgICAgICAgIDxzcGFuIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvQ2FyZEltcG9ydEZpbGVBcmVhLnZ1ZToyOToxMVwiPnt7IGVycm9yTWVzc2FnZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgdi1lbHNlXHJcbiAgICAgICAgICA6Y2xhc3M9XCJbJ3ctZnVsbCBtdC0yJywgcHJvZ3Jlc3NCYXJDbGFzc2VzXVwiXHJcbiAgICAgICAgICA6c3R5bGU9XCJwcm9ncmVzc0JhclN0eWxlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9DYXJkSW1wb3J0RmlsZUFyZWEudnVlOjMxOjlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IHYtZWxzZSA6Y2xhc3M9XCJjb250YWluZXJDbGFzc2VzXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9DYXJkSW1wb3J0RmlsZUFyZWEudnVlOjM3OjdcIj5cclxuICAgICAgICA8ZGl2IDpjbGFzcz1cImlsbHVzdHJhdGlvbkNsYXNzZXNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L0NhcmRJbXBvcnRGaWxlQXJlYS52dWU6Mzg6OVwiPlxyXG4gICAgICAgICAgPElsbHVzdHJhdGlvbkVtcHR5c3RhdGVQcm9qZWN0IHYtaWY9XCJlbXB0eVN0YXRlVmFyaWFudCA9PT0gJ21vZGVsc1NlY3Rpb24nXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9DYXJkSW1wb3J0RmlsZUFyZWEudnVlOjM5OjExXCIgLz5cclxuICAgICAgICAgIDxJbGx1c3RyYXRpb25FbXB0eXN0YXRlUHJvamVjdFRhYiB2LWVsc2UgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9DYXJkSW1wb3J0RmlsZUFyZWEudnVlOjQwOjExXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L0NhcmRJbXBvcnRGaWxlQXJlYS52dWU6NDM6OVwiPlxyXG4gICAgICAgICAgPHAgdi1pZj1cImVtcHR5U3RhdGVIZWFkaW5nXCIgOmNsYXNzPVwiZW1wdHlTdGF0ZUhlYWRpbmdDbGFzc2VzXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9DYXJkSW1wb3J0RmlsZUFyZWEudnVlOjQ0OjExXCI+XHJcbiAgICAgICAgICAgIHt7IGVtcHR5U3RhdGVIZWFkaW5nIH19XHJcbiAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICA8cCB2LWlmPVwiIWlzRGlzYWJsZWRcIiA6Y2xhc3M9XCJwYXJhZ3JhcGhDbGFzc2VzXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9DYXJkSW1wb3J0RmlsZUFyZWEudnVlOjQ3OjExXCI+XHJcbiAgICAgICAgICAgIFVzZVxyXG4gICAgICAgICAgICA8TnV4dExpbmsgOnRvPVwiY29ubmVjdG9yc1JvdXRlXCIgY2xhc3M9XCJmb250LW1lZGl1bVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvQ2FyZEltcG9ydEZpbGVBcmVhLnZ1ZTo0OToxM1wiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidW5kZXJsaW5lXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9DYXJkSW1wb3J0RmlsZUFyZWEudnVlOjUwOjE1XCI+Y29ubmVjdG9yczwvc3Bhbj5cclxuICAgICAgICAgICAgPC9OdXh0TGluaz5cclxuICAgICAgICAgICAgdG8gcHVibGlzaCBhIHt7IG1vZGVsTmFtZSA/ICcnIDogJ25ldyBtb2RlbCcgfX0gdmVyc2lvbiB0b1xyXG4gICAgICAgICAgICB7eyBtb2RlbE5hbWUgPyAndGhpcyBtb2RlbCcgOiAndGhpcyBwcm9qZWN0JyB9fSwgb3IgZHJhZyBhbmQgZHJvcFxyXG4gICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgIHYtaWY9XCJpc1JoaW5vRmlsZUltcG9ydGVyRW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgdi10aXBweT1cIlxyXG4gICAgICAgICAgICAgICAgWydpZmMnLCAuLi5BcnJheS5mcm9tKHJoaW5vSW1wb3J0ZXJTdXBwb3J0ZWRGaWxlRXh0ZW5zaW9ucyldLmpvaW4oJywgJylcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidW5kZXJsaW5lXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9DYXJkSW1wb3J0RmlsZUFyZWEudnVlOjU0OjEzXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIGEgc3VwcG9ydGVkIGZpbGUgaGVyZS5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiB2LWVsc2UgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9DYXJkSW1wb3J0RmlsZUFyZWEudnVlOjYzOjEzXCI+YW4gSUZDIGZpbGUuPC9zcGFuPlxyXG4gICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgPGRpdiB2LWlmPVwic2hvd0VtcHR5U3RhdGUgJiYgIWlzRGlzYWJsZWRcIiA6Y2xhc3M9XCJidXR0b25zQ2xhc3Nlc1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvQ2FyZEltcG9ydEZpbGVBcmVhLnZ1ZTo2NToxMVwiPlxyXG4gICAgICAgICAgICA8Rm9ybUJ1dHRvbiA6dG89XCJjb25uZWN0b3JzUm91dGVcIiBzaXplPVwic21cIiBjb2xvcj1cIm91dGxpbmVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L0NhcmRJbXBvcnRGaWxlQXJlYS52dWU6NjY6MTNcIj5cclxuICAgICAgICAgICAgICBJbnN0YWxsIGNvbm5lY3RvcnNcclxuICAgICAgICAgICAgPC9Gb3JtQnV0dG9uPlxyXG4gICAgICAgICAgICA8Rm9ybUJ1dHRvbiBzaXplPVwic21cIiBjb2xvcj1cIm91dGxpbmVcIiBAY2xpY2s9XCJvcGVuRmlsZVBpY2tlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvQ2FyZEltcG9ydEZpbGVBcmVhLnZ1ZTo2OToxM1wiPlxyXG4gICAgICAgICAgICAgIFVwbG9hZCBhIGZpbGVcclxuICAgICAgICAgICAgPC9Gb3JtQnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8UHJvamVjdFBhZ2VNb2RlbHNOZXdEaWFsb2dcclxuICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd05ld01vZGVsRGlhbG9nXCJcclxuICAgICAgOnByb2plY3QtaWQ9XCJwcm9qZWN0LmlkXCJcclxuICAgICAgOm1vZGVsLW5hbWU9XCJmaWxlVXBsb2FkPy5maWxlLm5hbWVcIlxyXG4gICAgICBAc3VibWl0PVwib25Nb2RlbENyZWF0ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvQ2FyZEltcG9ydEZpbGVBcmVhLnZ1ZTo3Njo1XCJcclxuICAgIC8+XHJcbiAgPC9Gb3JtRmlsZVVwbG9hZFpvbmU+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7XHJcbiAgdXNlRmlsZUltcG9ydCxcclxuICB1c2VHbG9iYWxGaWxlSW1wb3J0TWFuYWdlclxyXG59IGZyb20gJ35+L2xpYi9jb3JlL2NvbXBvc2FibGVzL2ZpbGVJbXBvcnQnXHJcbmltcG9ydCB7IHVzZUZpbGVVcGxvYWRQcm9ncmVzc0NvcmUgfSBmcm9tICd+fi9saWIvZm9ybS9jb21wb3NhYmxlcy9maWxlVXBsb2FkJ1xyXG5pbXBvcnQgeyBFeGNsYW1hdGlvblRyaWFuZ2xlSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzI0L3NvbGlkJ1xyXG5pbXBvcnQgeyBjb25uZWN0b3JzUm91dGUgfSBmcm9tICd+L2xpYi9jb21tb24vaGVscGVycy9yb3V0ZSdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgUHJvamVjdENhcmRJbXBvcnRGaWxlQXJlYV9Nb2RlbEZyYWdtZW50LFxyXG4gIFByb2plY3RDYXJkSW1wb3J0RmlsZUFyZWFfUHJvamVjdEZyYWdtZW50LFxyXG4gIFByb2plY3RQYWdlTGF0ZXN0SXRlbXNNb2RlbEl0ZW1GcmFnbWVudFxyXG59IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB0eXBlIHsgRmlsZUFyZWFVcGxvYWRpbmdQYXlsb2FkIH0gZnJvbSAnfi9saWIvZm9ybS9oZWxwZXJzL2ZpbGVVcGxvYWQnXHJcbmltcG9ydCB7IHJoaW5vSW1wb3J0ZXJTdXBwb3J0ZWRGaWxlRXh0ZW5zaW9ucyB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZC9ibG9icydcclxuXHJcbnR5cGUgRW1wdHlTdGF0ZVZhcmlhbnRzID0gJ21vZGVsR3JpZCcgfCAnbW9kZWxMaXN0JyB8ICdtb2RlbHNTZWN0aW9uJ1xyXG5cclxuZ3JhcGhxbChgXHJcbiAgZnJhZ21lbnQgUHJvamVjdENhcmRJbXBvcnRGaWxlQXJlYV9Qcm9qZWN0IG9uIFByb2plY3Qge1xyXG4gICAgaWRcclxuICAgIHBlcm1pc3Npb25zIHtcclxuICAgICAgY2FuQ3JlYXRlTW9kZWwge1xyXG4gICAgICAgIC4uLkZ1bGxQZXJtaXNzaW9uQ2hlY2tSZXN1bHRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLi4uVXNlRmlsZUltcG9ydF9Qcm9qZWN0XHJcbiAgfVxyXG5gKVxyXG5cclxuZ3JhcGhxbChgXHJcbiAgZnJhZ21lbnQgUHJvamVjdENhcmRJbXBvcnRGaWxlQXJlYV9Nb2RlbCBvbiBNb2RlbCB7XHJcbiAgICBpZFxyXG4gICAgbmFtZVxyXG4gICAgcGVybWlzc2lvbnMge1xyXG4gICAgICBjYW5DcmVhdGVWZXJzaW9uIHtcclxuICAgICAgICAuLi5GdWxsUGVybWlzc2lvbkNoZWNrUmVzdWx0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC4uLlVzZUZpbGVJbXBvcnRfTW9kZWxcclxuICB9XHJcbmApXHJcblxyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHM8e1xyXG4gIC8qKlxyXG4gICAqIEVtaXRzIHdoZW4gZmlsZXMgc3RhcnQvZmluaXNoIHVwbG9hZGluZ1xyXG4gICAqL1xyXG4gIHVwbG9hZGluZzogW3BheWxvYWQ6IEZpbGVBcmVhVXBsb2FkaW5nUGF5bG9hZF1cclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgcHJvamVjdDogUHJvamVjdENhcmRJbXBvcnRGaWxlQXJlYV9Qcm9qZWN0RnJhZ21lbnRcclxuICBtb2RlbD86IFByb2plY3RDYXJkSW1wb3J0RmlsZUFyZWFfTW9kZWxGcmFnbWVudFxyXG4gIG1vZGVsTmFtZT86IHN0cmluZ1xyXG4gIGVtcHR5U3RhdGVWYXJpYW50PzogRW1wdHlTdGF0ZVZhcmlhbnRzXHJcbn0+KClcclxuXHJcbmNvbnN0IGlzUmhpbm9GaWxlSW1wb3J0ZXJFbmFibGVkID0gdXNlSXNSaGlub0ZpbGVJbXBvcnRlckVuYWJsZWQoKVxyXG5jb25zdCB7IGFkZEZhaWxlZEpvYiB9ID0gdXNlR2xvYmFsRmlsZUltcG9ydE1hbmFnZXIoKVxyXG5jb25zdCB7XHJcbiAgbWF4U2l6ZUluQnl0ZXMsXHJcbiAgb25GaWxlc1NlbGVjdGVkLFxyXG4gIGFjY2VwdCxcclxuICB1cGxvYWQ6IGZpbGVVcGxvYWQsXHJcbiAgaXNVcGxvYWRpbmcsXHJcbiAgdXBsb2FkU2VsZWN0ZWQsXHJcbiAgcmVzZXRTZWxlY3RlZCxcclxuICBpc1VwbG9hZGFibGU6IGlzRmlsZVVwbG9hZFVwbG9hZGFibGVcclxufSA9IHVzZUZpbGVJbXBvcnQoe1xyXG4gIC4uLnRvUmVmcyhwcm9wcyksXHJcbiAgbWFudWFsbHlUcmlnZ2VyVXBsb2FkOiB0cnVlLFxyXG4gIGZpbGVTZWxlY3RlZENhbGxiYWNrOiAoKSA9PiB7XHJcbiAgICBpZiAocHJvcHMubW9kZWwpIHtcclxuICAgICAgLy8gVXBsb2FkaW5nIGluc2lkZSBhbiBleGlzdGluZyBtb2RlbCAtIHRyaWdnZXIgdXBsb2FkIGltbWVkaWF0ZWx5XHJcbiAgICAgIHVwbG9hZFNlbGVjdGVkKClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghZmlsZVVwbG9hZC52YWx1ZT8uZXJyb3IpIHtcclxuICAgICAgICAvLyBPbmx5IGlmIHVwbG9hZCBpcyB2YWxpZCwgdHJpZ2dlciBtb2RlbCBjcmVhdGlvbiBkaWFsb2dcclxuICAgICAgICBzaG93TmV3TW9kZWxEaWFsb2cudmFsdWUgPSB0cnVlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG4gIGVycm9yQ2FsbGJhY2s6ICh7IGZhaWxlZEpvYiB9KSA9PiB7XHJcbiAgICAvLyBSZWdpc3RlciBnbG9iYWwgZmlsZSB1cGxvYWQgZXJyb3IgYW5kIHJlc2V0IHVwbG9hZFxyXG4gICAgYWRkRmFpbGVkSm9iKGZhaWxlZEpvYilcclxuICAgIHJlc2V0U2VsZWN0ZWQoKVxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IHsgZXJyb3JNZXNzYWdlLCBwcm9ncmVzc0JhckNsYXNzZXMsIHByb2dyZXNzQmFyU3R5bGUgfSA9XHJcbiAgdXNlRmlsZVVwbG9hZFByb2dyZXNzQ29yZSh7XHJcbiAgICBpdGVtOiBmaWxlVXBsb2FkXHJcbiAgfSlcclxuXHJcbmNvbnN0IHVwbG9hZFpvbmUgPSByZWYoXHJcbiAgbnVsbCBhcyBOdWxsYWJsZTx7XHJcbiAgICB0cmlnZ2VyUGlja2VyOiAoKSA9PiB2b2lkXHJcbiAgfT5cclxuKVxyXG5jb25zdCBzaG93TmV3TW9kZWxEaWFsb2cgPSByZWYoZmFsc2UpXHJcblxyXG5jb25zdCBtb2RlbE5hbWUgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5tb2RlbE5hbWUgfHwgcHJvcHMubW9kZWw/Lm5hbWUpXHJcbmNvbnN0IGFjY2Vzc0NoZWNrID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiBwcm9wcy5tb2RlbFxyXG4gICAgPyBwcm9wcy5tb2RlbC5wZXJtaXNzaW9ucy5jYW5DcmVhdGVWZXJzaW9uXHJcbiAgICA6IHByb3BzLnByb2plY3QucGVybWlzc2lvbnMuY2FuQ3JlYXRlTW9kZWxcclxufSlcclxuY29uc3QgaXNEaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+ICFhY2Nlc3NDaGVjay52YWx1ZS5hdXRob3JpemVkKVxyXG5cclxuY29uc3Qgc2hvd0VtcHR5U3RhdGUgPSBjb21wdXRlZChcclxuICAoKSA9PlxyXG4gICAgcHJvcHMuZW1wdHlTdGF0ZVZhcmlhbnQgIT09ICdtb2RlbEdyaWQnICYmIHByb3BzLmVtcHR5U3RhdGVWYXJpYW50ICE9PSAnbW9kZWxMaXN0J1xyXG4pXHJcbmNvbnN0IGVtcHR5U3RhdGVIZWFkaW5nID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChzaG93RW1wdHlTdGF0ZS52YWx1ZSkge1xyXG4gICAgcmV0dXJuIHByb3BzLmVtcHR5U3RhdGVWYXJpYW50ID09PSAnbW9kZWxzU2VjdGlvbidcclxuICAgICAgPyAnVGhlIHByb2plY3QgaGFzIG5vIG1vZGVscywgeWV0LidcclxuICAgICAgOiAnTm8gbW9kZWxzLCB5ZXQuJ1xyXG4gIH1cclxuXHJcbiAgaWYgKGlzRGlzYWJsZWQudmFsdWUpIHtcclxuICAgIHJldHVybiBtb2RlbE5hbWUudmFsdWVcclxuICAgICAgPyAnVGhlIG1vZGVsIGhhcyBubyB2ZXJzaW9ucywgeWV0LidcclxuICAgICAgOiAnVGhlIHByb2plY3QgaGFzIG5vIG1vZGVscywgeWV0LidcclxuICB9XHJcblxyXG4gIHJldHVybiB1bmRlZmluZWRcclxufSlcclxuXHJcbmNvbnN0IGVtcHR5U3RhdGVIZWFkaW5nQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gWyd0ZXh0LWZvcmVncm91bmQtMiB0ZXh0LWhlYWRpbmctc20gcC0wIG0tMCAnXVxyXG5cclxuICBpZiAoaXNEaXNhYmxlZC52YWx1ZSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWJhbGFuY2UgdGV4dC1jZW50ZXInKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBjb250YWluZXJDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHMgPSBbJ3ctZnVsbCBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciddXHJcblxyXG4gIGlmIChwcm9wcy5lbXB0eVN0YXRlVmFyaWFudCA9PT0gJ21vZGVsR3JpZCcpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncC00IGdhcC00JylcclxuICB9IGVsc2UgaWYgKHByb3BzLmVtcHR5U3RhdGVWYXJpYW50ID09PSAnbW9kZWxMaXN0Jykge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdnYXAtNCB0ZXh0LWNlbnRlcicpXHJcbiAgfSBlbHNlIGlmIChwcm9wcy5lbXB0eVN0YXRlVmFyaWFudCA9PT0gJ21vZGVsc1NlY3Rpb24nKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3AtNCBnYXAtNCB0ZXh0LWJhbGFuY2UnKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3AtMjAgZ2FwLTggdGV4dC1iYWxhbmNlIGZsZXgtY29sIHRleHQtY2VudGVyJylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgaWxsdXN0cmF0aW9uQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gWydtYXgtdy1sZyddXHJcblxyXG4gIGlmIChwcm9wcy5lbXB0eVN0YXRlVmFyaWFudCA9PT0gJ21vZGVsR3JpZCcpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnaGlkZGVuJylcclxuICB9IGVsc2UgaWYgKHByb3BzLmVtcHR5U3RhdGVWYXJpYW50ID09PSAnbW9kZWxMaXN0Jykge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdoaWRkZW4nKVxyXG4gIH0gZWxzZSBpZiAocHJvcHMuZW1wdHlTdGF0ZVZhcmlhbnQgPT09ICdtb2RlbHNTZWN0aW9uJykge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdoaWRkZW4gbWluLVsxMzUwcHhdOmJsb2NrJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCcnKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBwYXJhZ3JhcGhDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHMgPSBbJ3RleHQtYm9keS14cyB0ZXh0LWZvcmVncm91bmQtMiBtdC0yIHAtMCddXHJcblxyXG4gIGlmIChwcm9wcy5lbXB0eVN0YXRlVmFyaWFudCA9PT0gJ21vZGVsR3JpZCcpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnJylcclxuICB9IGVsc2UgaWYgKHByb3BzLmVtcHR5U3RhdGVWYXJpYW50ID09PSAnbW9kZWxMaXN0Jykge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCcnKVxyXG4gIH0gZWxzZSBpZiAocHJvcHMuZW1wdHlTdGF0ZVZhcmlhbnQgPT09ICdtb2RlbHNTZWN0aW9uJykge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdtYXgtdy1zbScpXHJcbiAgfSBlbHNlIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnbWF4LXctc20nKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBidXR0b25zQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gWyd3LWZ1bGwgZmxleCBmbGV4LXJvdyBnYXAtMiBmbGV4LXdyYXAnXVxyXG5cclxuICBpZiAocHJvcHMuZW1wdHlTdGF0ZVZhcmlhbnQgPT09ICdtb2RlbEdyaWQnKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ210LTMnKVxyXG4gIH0gZWxzZSBpZiAocHJvcHMuZW1wdHlTdGF0ZVZhcmlhbnQgPT09ICdtb2RlbExpc3QnKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ210LTMnKVxyXG4gIH0gZWxzZSBpZiAocHJvcHMuZW1wdHlTdGF0ZVZhcmlhbnQgPT09ICdtb2RlbHNTZWN0aW9uJykge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdtdC0zJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdqdXN0aWZ5LWNlbnRlciBtdC02JylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgZ2V0RGFzaGVkQm9yZGVyQ2xhc3NlcyA9IChpc0RyYWdnaW5nRmlsZXM6IGJvb2xlYW4pID0+IHtcclxuICBpZiAoaXNEcmFnZ2luZ0ZpbGVzKSByZXR1cm4gJ2JvcmRlci1wcmltYXJ5J1xyXG4gIGlmIChlcnJvck1lc3NhZ2UudmFsdWUpIHJldHVybiAnYm9yZGVyLWRhbmdlcidcclxuXHJcbiAgcmV0dXJuICdib3JkZXItb3V0bGluZS0yJ1xyXG59XHJcblxyXG5jb25zdCBvbk1vZGVsQ3JlYXRlID0gKHBhcmFtczogeyBtb2RlbDogUHJvamVjdFBhZ2VMYXRlc3RJdGVtc01vZGVsSXRlbUZyYWdtZW50IH0pID0+IHtcclxuICBpZiAoIWlzRmlsZVVwbG9hZFVwbG9hZGFibGUudmFsdWUpIHJldHVyblxyXG5cclxuICB1cGxvYWRTZWxlY3RlZCh7XHJcbiAgICBtb2RlbDogcGFyYW1zLm1vZGVsXHJcbiAgfSlcclxufVxyXG5cclxuY29uc3QgdHJpZ2dlclBpY2tlciA9ICgpID0+IHtcclxuICB1cGxvYWRab25lLnZhbHVlPy50cmlnZ2VyUGlja2VyKClcclxufVxyXG5cclxud2F0Y2goc2hvd05ld01vZGVsRGlhbG9nLCAobmV3VmFsLCBvbGRWYWwpID0+IHtcclxuICBpZiAob2xkVmFsICYmICFuZXdWYWwpIHtcclxuICAgIC8vIFNob3VsZCB3ZSB1bnNlbGVjdCBmaWxlPyBPbmx5IGlmIG1vZGVsIHdhcyBub3QgY3JlYXRlZFxyXG4gICAgaWYgKCFpc1VwbG9hZGluZy52YWx1ZSkge1xyXG4gICAgICByZXNldFNlbGVjdGVkKClcclxuICAgIH1cclxuICB9XHJcbn0pXHJcblxyXG53YXRjaChpc1VwbG9hZGluZywgKG5ld1ZhbCwgb2xkVmFsKSA9PiB7XHJcbiAgLy8gZmlsZVVwbG9hZCBpcyBhbHdheXMgZ29ubmEgYmUgbm9uLW51bGwgd2hlbiBpc1VwbG9hZGluZyBjaGFuZ2VzXHJcbiAgZW1pdCgndXBsb2FkaW5nJywge1xyXG4gICAgaXNVcGxvYWRpbmc6IG5ld1ZhbCxcclxuICAgIHVwbG9hZDogZmlsZVVwbG9hZC52YWx1ZSEsXHJcbiAgICBlcnJvcjogZXJyb3JNZXNzYWdlLnZhbHVlXHJcbiAgfSlcclxuXHJcbiAgaWYgKCFuZXdWYWwgJiYgb2xkVmFsKSB7XHJcbiAgICAvLyBSZXNldCBmaWxlIHVwbG9hZCBzdGF0ZSB3aGVuIHVwbG9hZCBmaW5pc2hlc1xyXG4gICAgcmVzZXRTZWxlY3RlZCgpXHJcbiAgfVxyXG59KVxyXG5cclxuZGVmaW5lRXhwb3NlKHtcclxuICB0cmlnZ2VyUGlja2VyXHJcbn0pXHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy9wcm9qZWN0L0NhcmRJbXBvcnRGaWxlQXJlYS52dWUifQ==