import { SpeckleViewer } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { CameraController, MeasurementsExtension } from "/_nuxt/@fs/D:/speckle-server/packages/viewer/dist/index.js"; import { Box3, Vector3, Matrix3 } from "/_nuxt/node_modules/.cache/vite/client/deps/three.js?v=e4f18c29"; import { OBB } from "/_nuxt/node_modules/.cache/vite/client/deps/three_examples_jsm_math_OBB.js?v=e4f18c29"; import { until } from "/_nuxt/node_modules/@vueuse/shared/index.mjs?v=e4f18c29"; import { useActiveElement } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29"; import { isString, isEqualWith } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29"; import { useEmbedState, useEmbed } from "/_nuxt/lib/viewer/composables/setup/embed.ts"; import { isNonNullable } from "/_nuxt/lib/common/helpers/utils.ts"; import { useInjectedViewer, useInjectedViewerInterfaceState, useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { ViewerRenderPageType } from "/_nuxt/lib/viewer/helpers/state.ts"; import { useDiffBuilderUtilities } from "/_nuxt/lib/viewer/composables/setup/diff.ts"; import { getKeyboardShortcutTitle, onKeyboardShortcut } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { ViewerShortcuts } from "/_nuxt/lib/viewer/helpers/shortcuts/shortcuts.ts"; import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts"; import { defaultMeasurementOptions } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/viewer/helpers/state.js"; import { getTargetObjectIds } from "/_nuxt/lib/object-sidebar/helpers.ts"; import { computed } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { useIsSmallerOrEqualThanBreakpoint } from "/_nuxt/composables/browser.ts"; export function useSectionBoxUtilities() { const { instance } = useInjectedViewer(); const { sectionBox, sectionBoxContext: { visible, edited }, filters: { selectedObjects }, threads: { openThread: { thread } } } = useInjectedViewerInterfaceState(); const isSectionBoxEnabled = computed(() => !!sectionBox.value); const isSectionBoxVisible = computed(() => visible.value); const isSectionBoxEdited = computed(() => edited.value); const box3ToSectionBoxData = (box) => { if (box instanceof Box3) { return { min: box.min.toArray(), max: box.max.toArray() }; } else { const min = box.center.clone().sub(box.halfSize); const max = box.center.clone().add(box.halfSize); return { min: min.toArray(), max: max.toArray(), ...box.rotation && { rotation: box.rotation.toArray() } }; } }; const sectionBoxDataToBox3 = (data) => { let box; if (!data.rotation || !data.rotation.length) { const min = new Vector3().fromArray(data.min); const max = new Vector3().fromArray(data.max); box = new Box3(min, max); } else { box = new OBB(); const min = new Vector3().fromArray(data.min); const max = new Vector3().fromArray(data.max); const _box3 = new Box3(); _box3.set(min, max); _box3.getCenter(box.center); _box3.getSize(box.halfSize); box.halfSize.multiplyScalar(0.5); box.rotation = new Matrix3().fromArray(data.rotation); } return box; }; const sectionBoxDataEquals = (a, b) => { return isEqualWith(a, b, (objValue, othValue) => { if (typeof objValue === "number" && typeof othValue === "number") { return Math.abs(objValue - othValue) < 1e-6; } return void 0; }); }; const resolveSectionBoxFromSelection = () => { const objectIds = selectedObjects.value.map((o) => o.id).filter(isNonNullable); const box = instance.getRenderer().boxFromObjects(objectIds); sectionBox.value = box3ToSectionBoxData(box); }; const closeSectionBox = () => { visible.value = false; }; const toggleSectionBox = () => { if (!isSectionBoxEnabled.value) { resolveSectionBoxFromSelection(); return; } if (isSectionBoxVisible.value) { visible.value = false; } else { visible.value = true; } }; const resetSectionBox = () => { const serializedSectionBox = thread.value?.viewerState?.ui.sectionBox; sectionBox.value = null; if (serializedSectionBox) { sectionBox.value = { min: serializedSectionBox.min, max: serializedSectionBox.max, rotation: serializedSectionBox.rotation }; } }; const resetSectionBoxCompletely = () => { sectionBox.value = null; visible.value = false; }; return { isSectionBoxEnabled, isSectionBoxVisible, isSectionBoxEdited, toggleSectionBox, resetSectionBox, resetSectionBoxCompletely, sectionBox, closeSectionBox, box3ToSectionBoxData, sectionBoxDataToBox3, sectionBoxDataEquals }; } export function useCameraUtilities() { const { instance } = useInjectedViewer(); const { filters: { selectedObjects, isolatedObjectIds }, camera } = useInjectedViewerInterfaceState(); const cameraController = instance.getExtension(CameraController); const setView = (view, transition = true) => { cameraController.setCameraView(view, transition); }; const zoomExtentsOrSelection = () => { const ids = selectedObjects.value.flatMap((o) => getTargetObjectIds(o)).filter(isNonNullable); if (ids.length > 0) { return cameraController.setCameraView(ids, true); } if (isolatedObjectIds.value.length) { return cameraController.setCameraView(isolatedObjectIds.value, true); } cameraController.setCameraView(void 0, true); }; const toggleProjection = () => { camera.isOrthoProjection.value = !camera.isOrthoProjection.value; cameraController.toggleCameras(); }; const forceViewToViewerSync = () => { setView( { position: camera.position.value, target: camera.target.value }, true ); }; const zoom = (objectIds, fit, transition) => { cameraController.setCameraView(objectIds, transition, fit); }; return { zoomExtentsOrSelection, toggleProjection, camera, setView, zoom, forceViewToViewerSync, cameraController }; } export function useSelectionUtilities() { const { filters: { selectedObjects, selectedObjectIds } } = useInjectedViewerInterfaceState(); const { metadata } = useInjectedViewer(); const setSelectionFromObjectIds = (objectIds) => { const objs = []; objectIds.forEach((value) => { objs.push( ...(metadata?.worldTree.value?.findId(value) || []).map( (node) => node.model.raw ) ); }); selectedObjects.value = objs; }; const addToSelectionFromObjectIds = (objectIds) => { const originalObjects = selectedObjects.value.slice(); setSelectionFromObjectIds(objectIds); const newObjects = selectedObjects.value.filter( (newObj) => !originalObjects.some((existingObj) => existingObj.id === newObj.id) ); selectedObjects.value = [...originalObjects, ...newObjects]; }; const removeFromSelectionObjectIds = (objectIds) => { const finalObjects = selectedObjects.value.filter( (o) => !objectIds.includes(o.id || "") ); selectedObjects.value = finalObjects; }; const addToSelection = (object) => { const idx = selectedObjects.value.findIndex((o) => o.id === object.id); if (idx !== -1) return; selectedObjects.value = [...selectedObjects.value, object]; }; const removeFromSelection = (objectOrId) => { const oid = isString(objectOrId) ? objectOrId : objectOrId.id; const idx = selectedObjects.value.findIndex((o) => o.id === oid); if (idx === -1) return; const newObjects = selectedObjects.value.slice(); newObjects.splice(idx, 1); selectedObjects.value = newObjects; }; const clearSelection = () => { selectedObjects.value = []; }; return { addToSelection, removeFromSelection, clearSelection, setSelectionFromObjectIds, addToSelectionFromObjectIds, removeFromSelectionObjectIds, objects: selectedObjects, objectIds: selectedObjectIds }; } export function useDiffUtilities() { const state = useInjectedViewerState(); const { serializeDiffCommand, deserializeDiffCommand, areDiffsEqual } = useDiffBuilderUtilities(); const endDiff = async () => { await state.urlHashState.diff.update(null); }; const diffModelVersions = async (modelId, versionA, versionB) => { await state.urlHashState.diff.update({ diffs: [ { versionA: new SpeckleViewer.ViewerRoute.ViewerVersionResource( modelId, versionA ), versionB: new SpeckleViewer.ViewerRoute.ViewerVersionResource( modelId, versionB ) } ] }); }; return { serializeDiffCommand, deserializeDiffCommand, endDiff, diffModelVersions, areDiffsEqual }; } export function useThreadUtilities() { const { urlHashState: { focusedThreadId }, ui: { threads: { openThread: { thread: openThread } } } } = useInjectedViewerState(); const isOpenThread = (id) => focusedThreadId.value === id; const closeAllThreads = async () => { await focusedThreadId.update(null); }; const open = async (id) => { if (id === focusedThreadId.value) return; await focusedThreadId.update(id); await Promise.all([ until(focusedThreadId).toMatch((tid) => tid === id), until(openThread).toMatch((t) => t?.id === id) ]); }; return { closeAllThreads, open, isOpenThread }; } export function useMeasurementUtilities() { const state = useInjectedViewerState(); const measurementsExtension = state.viewer.instance.getExtension(MeasurementsExtension); const measurementOptions = computed(() => state.ui.measurement.options.value); const hasMeasurements = computed( () => state.ui.measurement.measurements.value.length > 0 ); const enableMeasurements = (enabled) => { state.ui.measurement.enabled.value = enabled; }; const setMeasurementOptions = (options) => { state.ui.measurement.options.value = options; }; const removeActiveMeasurement = () => { measurementsExtension.removeMeasurement(); }; const clearMeasurements = () => { state.ui.measurement.measurements.value = []; }; const reset = () => { state.ui.measurement.enabled.value = false; state.ui.measurement.measurements.value = []; state.ui.measurement.options.value = { ...defaultMeasurementOptions }; }; return { measurementOptions, enableMeasurements, setMeasurementOptions, removeActiveMeasurement, clearMeasurements, hasMeasurements, reset, measurements: state.ui.measurement.measurements }; } export function useConditionalViewerRendering() { const embedMode = useEmbedState(); const showControls = computed(() => { if (embedMode.embedOptions.value?.isEnabled && embedMode.embedOptions.value.hideControls) { return false; } return true; }); const showNavbar = computed(() => { if (!showControls.value) return false; if (embedMode.embedOptions.value?.isEnabled) return false; return true; }); return { showNavbar, showControls }; } export function useHighlightedObjectsUtilities() { const { ui: { highlightedObjectIds }, pageType } = useInjectedViewerState(); const highlightObjects = (ids) => { if (pageType.value === ViewerRenderPageType.Presentation) return; highlightedObjectIds.value = [.../* @__PURE__ */ new Set([...highlightedObjectIds.value, ...ids])]; }; const unhighlightObjects = (ids) => { highlightedObjectIds.value = highlightedObjectIds.value.filter( (id) => !ids.includes(id) ); }; const clearHighlightedObjects = () => { highlightedObjectIds.value = []; }; return { highlightObjects, unhighlightObjects, clearHighlightedObjects }; } export function useViewModeUtilities() { const { viewMode } = useInjectedViewerInterfaceState(); const mp = useMixpanel(); const setViewMode = (mode) => { viewMode.mode.value = mode; mp.track("Viewer Action", { type: "action", name: "set-view-mode", mode }); }; const toggleEdgesEnabled = () => { viewMode.edgesEnabled.value = !viewMode.edgesEnabled.value; mp.track("Viewer Action", { type: "action", name: "toggle-edges", enabled: viewMode.edgesEnabled.value }); }; const setEdgesWeight = (weight) => { viewMode.edgesWeight.value = Number(weight); mp.track("Viewer Action", { type: "action", name: "set-edges-weight", weight: viewMode.edgesWeight.value }); }; const setEdgesColor = (color) => { viewMode.edgesColor.value = color; mp.track("Viewer Action", { type: "action", name: "set-edges-color", color: color.toString(16).padStart(6, "0") }); }; return { viewMode, setViewMode, toggleEdgesEnabled, setEdgesWeight, setEdgesColor, resetViewMode: viewMode.resetViewMode }; } export function useViewerShortcuts() { const { ui } = useInjectedViewerState(); const { isSmallerOrEqualSm } = useIsSmallerOrEqualThanBreakpoint(); const { isEnabled: isEmbedEnabled } = useEmbed(); const activeElement = useActiveElement(); const isTypingComment = computed(() => { if (activeElement.value && (activeElement.value.tagName.toLowerCase() === "input" || activeElement.value.tagName.toLowerCase() === "textarea" || activeElement.value.getAttribute("contenteditable") === "true")) { return true; } const isNewThreadEditorOpen = ui.threads.openThread.newThreadEditor.value; const isExistingThreadEditorOpen = !!ui.threads.openThread.thread.value; return isNewThreadEditorOpen || isExistingThreadEditorOpen; }); const formatKey = (key) => { if (key.startsWith("Digit")) { return key.slice(5); } return key; }; const getShortcutDisplayText = (shortcut, options) => { if (isSmallerOrEqualSm.value) return void 0; if (isEmbedEnabled.value) return void 0; const shortcutText = getKeyboardShortcutTitle([ ...shortcut.modifiers, formatKey(shortcut.key) ]); if (options?.format === "separate") { const modifiersText = shortcut.modifiers.length > 0 ? getKeyboardShortcutTitle([...shortcut.modifiers]) : ""; const keyText = getKeyboardShortcutTitle([formatKey(shortcut.key)]); return { content: `
${shortcut.name}
${modifiersText ? `${modifiersText}` : ""}${keyText}
`, allowHTML: true, theme: "speckleTooltip" }; } if (!options?.hideName) { return `${shortcut.name} (${shortcutText})`; } return shortcutText; }; const disableShortcuts = computed(() => isTypingComment.value || isEmbedEnabled.value); const registerShortcuts = (handlers) => { Object.values(ViewerShortcuts).forEach((shortcut) => { const handler = handlers[shortcut.action]; if (handler) { onKeyboardShortcut([...shortcut.modifiers], shortcut.key, () => { if (!disableShortcuts.value) handler(); }); } }); }; return { shortcuts: ViewerShortcuts, registerShortcuts, getShortcutDisplayText }; } //# sourceMappingURL=data:application/json;base64,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O0FBQUEsSUFDeEIsQ0FBQztBQUVELFFBQUksU0FBUyxXQUFXLFlBQVk7QUFDbEMsWUFBTSxnQkFDSixTQUFTLFVBQVUsU0FBUyxJQUN4Qix5QkFBeUIsQ0FBQyxHQUFHLFNBQVMsU0FBUyxDQUFDLElBQ2hEO0FBQ04sWUFBTSxVQUFVLHlCQUF5QixDQUFDLFVBQVUsU0FBUyxHQUFHLENBQUMsQ0FBQztBQUVsRSxhQUFPO0FBQUEsUUFDTCxTQUFTO0FBQUE7QUFBQSx1REFFc0MsU0FBUyxJQUFJO0FBQUE7QUFBQSxjQUd0RCxnQkFDSSwrRkFBK0YsYUFBYSxXQUM1RyxFQUNOLDZFQUE2RSxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFJeEYsV0FBVztBQUFBLFFBQ1gsT0FBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBRUEsUUFBSSxDQUFDLFNBQVMsVUFBVTtBQUN0QixhQUFPLEdBQUcsU0FBUyxJQUFJLEtBQUssWUFBWTtBQUFBLElBQzFDO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLG1CQUFtQixTQUFTLE1BQU0sZ0JBQWdCLFNBQVMsZUFBZSxLQUFLO0FBRXJGLFFBQU0sb0JBQW9CLENBQ3hCLGFBQ0c7QUFDSCxXQUFPLE9BQU8sZUFBZSxFQUFFLFFBQVEsQ0FBQyxhQUFhO0FBQ25ELFlBQU0sVUFBVSxTQUFTLFNBQVMsTUFBOEI7QUFDaEUsVUFBSSxTQUFTO0FBQ1gsMkJBQW1CLENBQUMsR0FBRyxTQUFTLFNBQVMsR0FBRyxTQUFTLEtBQUssTUFBTTtBQUM5RCxjQUFJLENBQUMsaUJBQWlCLE1BQU8sU0FBUTtBQUFBLFFBQ3ZDLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFNBQU87QUFBQSxJQUNMLFdBQVc7QUFBQSxJQUNYO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsidWkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3BlY2tsZVZpZXdlciB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHtcclxuICBDYW1lcmFDb250cm9sbGVyLFxyXG4gIHR5cGUgVHJlZU5vZGUsXHJcbiAgdHlwZSBWaWV3TW9kZSxcclxuICB0eXBlIENhbm9uaWNhbFZpZXcsXHJcbiAgdHlwZSBJbmxpbmVWaWV3LFxyXG4gIHR5cGUgU3BlY2tsZVZpZXcsXHJcbiAgTWVhc3VyZW1lbnRzRXh0ZW5zaW9uXHJcbn0gZnJvbSAnQHNwZWNrbGUvdmlld2VyJ1xyXG5pbXBvcnQgeyBCb3gzLCBWZWN0b3IzLCBNYXRyaXgzIH0gZnJvbSAndGhyZWUnXHJcbmltcG9ydCB7IE9CQiB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9tYXRoL09CQidcclxuaW1wb3J0IHsgdW50aWwgfSBmcm9tICdAdnVldXNlL3NoYXJlZCdcclxuaW1wb3J0IHsgdXNlQWN0aXZlRWxlbWVudCB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHsgaXNTdHJpbmcsIGlzRXF1YWxXaXRoIH0gZnJvbSAnbG9kYXNoLWVzJ1xyXG5pbXBvcnQgeyB1c2VFbWJlZFN0YXRlLCB1c2VFbWJlZCB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cC9lbWJlZCdcclxuaW1wb3J0IHR5cGUgeyBTcGVja2xlT2JqZWN0IH0gZnJvbSAnfi9saWIvdmlld2VyL2hlbHBlcnMvc2NlbmVFeHBsb3JlcidcclxuaW1wb3J0IHsgaXNOb25OdWxsYWJsZSB9IGZyb20gJ35+L2xpYi9jb21tb24vaGVscGVycy91dGlscydcclxuaW1wb3J0IHtcclxuICB1c2VJbmplY3RlZFZpZXdlcixcclxuICB1c2VJbmplY3RlZFZpZXdlckludGVyZmFjZVN0YXRlLFxyXG4gIHVzZUluamVjdGVkVmlld2VyU3RhdGVcclxufSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQgeyBWaWV3ZXJSZW5kZXJQYWdlVHlwZSB9IGZyb20gJ34vbGliL3ZpZXdlci9oZWxwZXJzL3N0YXRlJ1xyXG5pbXBvcnQgeyB1c2VEaWZmQnVpbGRlclV0aWxpdGllcyB9IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAvZGlmZidcclxuaW1wb3J0IHsgZ2V0S2V5Ym9hcmRTaG9ydGN1dFRpdGxlLCBvbktleWJvYXJkU2hvcnRjdXQgfSBmcm9tICdAc3BlY2tsZS91aS1jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyBWaWV3ZXJTaG9ydGN1dHMgfSBmcm9tICd+L2xpYi92aWV3ZXIvaGVscGVycy9zaG9ydGN1dHMvc2hvcnRjdXRzJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgVmlld2VyU2hvcnRjdXQsXHJcbiAgVmlld2VyU2hvcnRjdXRBY3Rpb25cclxufSBmcm9tICd+L2xpYi92aWV3ZXIvaGVscGVycy9zaG9ydGN1dHMvdHlwZXMnXHJcbmltcG9ydCB7IHVzZU1peHBhbmVsIH0gZnJvbSAnfi9saWIvY29yZS9jb21wb3NhYmxlcy9tcCdcbmltcG9ydCB0eXBlIHsgZGVmYXVsdEVkZ2VDb2xvclZhbHVlIH0gZnJvbSAnfi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwL3ZpZXdNb2RlJ1xuaW1wb3J0IHtcbiAgZGVmYXVsdE1lYXN1cmVtZW50T3B0aW9ucyxcbiAgdHlwZSBNZWFzdXJlbWVudE9wdGlvbnNcbn0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkL3ZpZXdlci9zdGF0ZSdcbmltcG9ydCB7IGdldFRhcmdldE9iamVjdElkcyB9IGZyb20gJ34vbGliL29iamVjdC1zaWRlYmFyL2hlbHBlcnMnXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNlY3Rpb25Cb3hVdGlsaXRpZXMoKSB7XHJcbiAgY29uc3QgeyBpbnN0YW5jZSB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXIoKVxyXG4gIGNvbnN0IHtcclxuICAgIHNlY3Rpb25Cb3gsXHJcbiAgICBzZWN0aW9uQm94Q29udGV4dDogeyB2aXNpYmxlLCBlZGl0ZWQgfSxcclxuICAgIGZpbHRlcnM6IHsgc2VsZWN0ZWRPYmplY3RzIH0sXHJcbiAgICB0aHJlYWRzOiB7XHJcbiAgICAgIG9wZW5UaHJlYWQ6IHsgdGhyZWFkIH1cclxuICAgIH1cclxuICB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJJbnRlcmZhY2VTdGF0ZSgpXHJcblxyXG4gIGNvbnN0IGlzU2VjdGlvbkJveEVuYWJsZWQgPSBjb21wdXRlZCgoKSA9PiAhIXNlY3Rpb25Cb3gudmFsdWUpXHJcbiAgY29uc3QgaXNTZWN0aW9uQm94VmlzaWJsZSA9IGNvbXB1dGVkKCgpID0+IHZpc2libGUudmFsdWUpXHJcbiAgY29uc3QgaXNTZWN0aW9uQm94RWRpdGVkID0gY29tcHV0ZWQoKCkgPT4gZWRpdGVkLnZhbHVlKVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0cyBhIEJveDMgb3IgT0JCIHRvIFNlY3Rpb25Cb3hEYXRhIGZvcm1hdFxyXG4gICAqL1xyXG4gIGNvbnN0IGJveDNUb1NlY3Rpb25Cb3hEYXRhID0gKFxyXG4gICAgYm94OiBCb3gzIHwgT0JCXHJcbiAgKTogU3BlY2tsZVZpZXdlci5WaWV3ZXJTdGF0ZS5TZWN0aW9uQm94RGF0YSA9PiB7XHJcbiAgICBpZiAoYm94IGluc3RhbmNlb2YgQm94Mykge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIG1pbjogYm94Lm1pbi50b0FycmF5KCksXHJcbiAgICAgICAgbWF4OiBib3gubWF4LnRvQXJyYXkoKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBPQkIgY2FzZSAtIGNhbGN1bGF0ZSBtaW4vbWF4IGZyb20gY2VudGVyIGFuZCBoYWxmU2l6ZVxyXG4gICAgICBjb25zdCBtaW4gPSBib3guY2VudGVyLmNsb25lKCkuc3ViKGJveC5oYWxmU2l6ZSlcclxuICAgICAgY29uc3QgbWF4ID0gYm94LmNlbnRlci5jbG9uZSgpLmFkZChib3guaGFsZlNpemUpXHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIG1pbjogbWluLnRvQXJyYXkoKSxcclxuICAgICAgICBtYXg6IG1heC50b0FycmF5KCksXHJcbiAgICAgICAgLi4uKGJveC5yb3RhdGlvbiAmJiB7IHJvdGF0aW9uOiBib3gucm90YXRpb24udG9BcnJheSgpIH0pXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnRzIFNlY3Rpb25Cb3hEYXRhIHRvIEJveDMgb3IgT0JCIGZvcm1hdCAocmV2ZXJzZSBvZiBib3gzVG9TZWN0aW9uQm94RGF0YSlcclxuICAgKi9cclxuICBjb25zdCBzZWN0aW9uQm94RGF0YVRvQm94MyA9IChcclxuICAgIGRhdGE6IFNwZWNrbGVWaWV3ZXIuVmlld2VyU3RhdGUuU2VjdGlvbkJveERhdGFcclxuICApOiBCb3gzIHwgT0JCID0+IHtcclxuICAgIGxldCBib3g6IEJveDMgfCBPQkJcclxuXHJcbiAgICBpZiAoIWRhdGEucm90YXRpb24gfHwgIWRhdGEucm90YXRpb24ubGVuZ3RoKSB7XHJcbiAgICAgIC8vIE5vIHJvdGF0aW9uLCB1c2UgQm94M1xyXG4gICAgICBjb25zdCBtaW4gPSBuZXcgVmVjdG9yMygpLmZyb21BcnJheShkYXRhLm1pbilcclxuICAgICAgY29uc3QgbWF4ID0gbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoZGF0YS5tYXgpXHJcbiAgICAgIGJveCA9IG5ldyBCb3gzKG1pbiwgbWF4KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSGFzIHJvdGF0aW9uLCBjcmVhdGUgT0JCXHJcbiAgICAgIGJveCA9IG5ldyBPQkIoKVxyXG4gICAgICBjb25zdCBtaW4gPSBuZXcgVmVjdG9yMygpLmZyb21BcnJheShkYXRhLm1pbilcclxuICAgICAgY29uc3QgbWF4ID0gbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoZGF0YS5tYXgpXHJcblxyXG4gICAgICBjb25zdCBfYm94MyA9IG5ldyBCb3gzKClcclxuICAgICAgX2JveDMuc2V0KG1pbiwgbWF4KVxyXG4gICAgICBfYm94My5nZXRDZW50ZXIoYm94LmNlbnRlcilcclxuICAgICAgX2JveDMuZ2V0U2l6ZShib3guaGFsZlNpemUpXHJcbiAgICAgIGJveC5oYWxmU2l6ZS5tdWx0aXBseVNjYWxhcigwLjUpXHJcblxyXG4gICAgICBib3gucm90YXRpb24gPSBuZXcgTWF0cml4MygpLmZyb21BcnJheShkYXRhLnJvdGF0aW9uKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBib3hcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbXBhcmVzIHR3byBTZWN0aW9uQm94RGF0YSBvYmplY3RzIGZvciBlcXVhbGl0eSB3aXRoIGZsb2F0aW5nLXBvaW50IHRvbGVyYW5jZVxyXG4gICAqL1xyXG4gIGNvbnN0IHNlY3Rpb25Cb3hEYXRhRXF1YWxzID0gKFxyXG4gICAgYTogU3BlY2tsZVZpZXdlci5WaWV3ZXJTdGF0ZS5TZWN0aW9uQm94RGF0YSxcclxuICAgIGI6IFNwZWNrbGVWaWV3ZXIuVmlld2VyU3RhdGUuU2VjdGlvbkJveERhdGFcclxuICApOiBib29sZWFuID0+IHtcclxuICAgIHJldHVybiBpc0VxdWFsV2l0aChhLCBiLCAob2JqVmFsdWUsIG90aFZhbHVlKSA9PiB7XHJcbiAgICAgIGlmICh0eXBlb2Ygb2JqVmFsdWUgPT09ICdudW1iZXInICYmIHR5cGVvZiBvdGhWYWx1ZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5hYnMob2JqVmFsdWUgLSBvdGhWYWx1ZSkgPCAxZS02XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHJlc29sdmVTZWN0aW9uQm94RnJvbVNlbGVjdGlvbiA9ICgpID0+IHtcclxuICAgIGNvbnN0IG9iamVjdElkcyA9IHNlbGVjdGVkT2JqZWN0cy52YWx1ZS5tYXAoKG8pID0+IG8uaWQpLmZpbHRlcihpc05vbk51bGxhYmxlKVxyXG4gICAgY29uc3QgYm94ID0gaW5zdGFuY2UuZ2V0UmVuZGVyZXIoKS5ib3hGcm9tT2JqZWN0cyhvYmplY3RJZHMpXHJcbiAgICBzZWN0aW9uQm94LnZhbHVlID0gYm94M1RvU2VjdGlvbkJveERhdGEoYm94KVxyXG4gIH1cclxuXHJcbiAgY29uc3QgY2xvc2VTZWN0aW9uQm94ID0gKCkgPT4ge1xyXG4gICAgdmlzaWJsZS52YWx1ZSA9IGZhbHNlXHJcbiAgfVxyXG5cclxuICBjb25zdCB0b2dnbGVTZWN0aW9uQm94ID0gKCkgPT4ge1xyXG4gICAgaWYgKCFpc1NlY3Rpb25Cb3hFbmFibGVkLnZhbHVlKSB7XHJcbiAgICAgIHJlc29sdmVTZWN0aW9uQm94RnJvbVNlbGVjdGlvbigpXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc1NlY3Rpb25Cb3hWaXNpYmxlLnZhbHVlKSB7XHJcbiAgICAgIHZpc2libGUudmFsdWUgPSBmYWxzZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmlzaWJsZS52YWx1ZSA9IHRydWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHJlc2V0U2VjdGlvbkJveCA9ICgpID0+IHtcclxuICAgIGNvbnN0IHNlcmlhbGl6ZWRTZWN0aW9uQm94ID0gdGhyZWFkLnZhbHVlPy52aWV3ZXJTdGF0ZT8udWkuc2VjdGlvbkJveFxyXG4gICAgc2VjdGlvbkJveC52YWx1ZSA9IG51bGxcclxuXHJcbiAgICBpZiAoc2VyaWFsaXplZFNlY3Rpb25Cb3gpIHtcclxuICAgICAgLy8gU2FtZSBsb2dpYyB3ZSBoYXZlIGluIGRlc2VyaWFsaXphdGlvblxyXG4gICAgICBzZWN0aW9uQm94LnZhbHVlID0ge1xyXG4gICAgICAgIG1pbjogc2VyaWFsaXplZFNlY3Rpb25Cb3gubWluLFxyXG4gICAgICAgIG1heDogc2VyaWFsaXplZFNlY3Rpb25Cb3gubWF4LFxyXG4gICAgICAgIHJvdGF0aW9uOiBzZXJpYWxpemVkU2VjdGlvbkJveC5yb3RhdGlvblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCByZXNldFNlY3Rpb25Cb3hDb21wbGV0ZWx5ID0gKCkgPT4ge1xyXG4gICAgc2VjdGlvbkJveC52YWx1ZSA9IG51bGxcclxuICAgIHZpc2libGUudmFsdWUgPSBmYWxzZVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGlzU2VjdGlvbkJveEVuYWJsZWQsXHJcbiAgICBpc1NlY3Rpb25Cb3hWaXNpYmxlLFxyXG4gICAgaXNTZWN0aW9uQm94RWRpdGVkLFxyXG4gICAgdG9nZ2xlU2VjdGlvbkJveCxcclxuICAgIHJlc2V0U2VjdGlvbkJveCxcclxuICAgIHJlc2V0U2VjdGlvbkJveENvbXBsZXRlbHksXHJcbiAgICBzZWN0aW9uQm94LFxyXG4gICAgY2xvc2VTZWN0aW9uQm94LFxyXG4gICAgYm94M1RvU2VjdGlvbkJveERhdGEsXHJcbiAgICBzZWN0aW9uQm94RGF0YVRvQm94MyxcclxuICAgIHNlY3Rpb25Cb3hEYXRhRXF1YWxzXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlQ2FtZXJhVXRpbGl0aWVzKCkge1xyXG4gIGNvbnN0IHsgaW5zdGFuY2UgfSA9IHVzZUluamVjdGVkVmlld2VyKClcclxuICBjb25zdCB7XHJcbiAgICBmaWx0ZXJzOiB7IHNlbGVjdGVkT2JqZWN0cywgaXNvbGF0ZWRPYmplY3RJZHMgfSxcclxuICAgIGNhbWVyYVxyXG4gIH0gPSB1c2VJbmplY3RlZFZpZXdlckludGVyZmFjZVN0YXRlKClcclxuXHJcbiAgY29uc3QgY2FtZXJhQ29udHJvbGxlciA9IGluc3RhbmNlLmdldEV4dGVuc2lvbihDYW1lcmFDb250cm9sbGVyKVxyXG5cclxuICBjb25zdCBzZXRWaWV3ID0gKFxyXG4gICAgdmlldzogQ2Fub25pY2FsVmlldyB8IElubGluZVZpZXcgfCBTcGVja2xlVmlldyxcclxuICAgIHRyYW5zaXRpb24gPSB0cnVlXHJcbiAgKSA9PiB7XHJcbiAgICBjYW1lcmFDb250cm9sbGVyLnNldENhbWVyYVZpZXcodmlldywgdHJhbnNpdGlvbilcclxuICB9XHJcblxyXG4gIGNvbnN0IHpvb21FeHRlbnRzT3JTZWxlY3Rpb24gPSAoKSA9PiB7XHJcbiAgICBjb25zdCBpZHMgPSBzZWxlY3RlZE9iamVjdHMudmFsdWVcbiAgICAgIC5mbGF0TWFwKChvKSA9PiBnZXRUYXJnZXRPYmplY3RJZHMobyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpXG4gICAgICAuZmlsdGVyKGlzTm9uTnVsbGFibGUpXG5cclxuICAgIGlmIChpZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gY2FtZXJhQ29udHJvbGxlci5zZXRDYW1lcmFWaWV3KGlkcywgdHJ1ZSlcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNvbGF0ZWRPYmplY3RJZHMudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBjYW1lcmFDb250cm9sbGVyLnNldENhbWVyYVZpZXcoaXNvbGF0ZWRPYmplY3RJZHMudmFsdWUsIHRydWUpXHJcbiAgICB9XHJcblxyXG4gICAgY2FtZXJhQ29udHJvbGxlci5zZXRDYW1lcmFWaWV3KHVuZGVmaW5lZCwgdHJ1ZSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHRvZ2dsZVByb2plY3Rpb24gPSAoKSA9PiB7XHJcbiAgICBjYW1lcmEuaXNPcnRob1Byb2plY3Rpb24udmFsdWUgPSAhY2FtZXJhLmlzT3J0aG9Qcm9qZWN0aW9uLnZhbHVlXHJcbiAgICBjYW1lcmFDb250cm9sbGVyLnRvZ2dsZUNhbWVyYXMoKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZm9yY2VWaWV3VG9WaWV3ZXJTeW5jID0gKCkgPT4ge1xyXG4gICAgc2V0VmlldyhcclxuICAgICAge1xyXG4gICAgICAgIHBvc2l0aW9uOiBjYW1lcmEucG9zaXRpb24udmFsdWUsXHJcbiAgICAgICAgdGFyZ2V0OiBjYW1lcmEudGFyZ2V0LnZhbHVlXHJcbiAgICAgIH0sXHJcbiAgICAgIHRydWVcclxuICAgIClcclxuICB9XHJcblxyXG4gIGNvbnN0IHpvb20gPSAob2JqZWN0SWRzPzogc3RyaW5nW10sIGZpdD86IG51bWJlciwgdHJhbnNpdGlvbj86IGJvb2xlYW4pID0+IHtcclxuICAgIGNhbWVyYUNvbnRyb2xsZXIuc2V0Q2FtZXJhVmlldyhvYmplY3RJZHMsIHRyYW5zaXRpb24sIGZpdClcclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB6b29tRXh0ZW50c09yU2VsZWN0aW9uLFxyXG4gICAgdG9nZ2xlUHJvamVjdGlvbixcclxuICAgIGNhbWVyYSxcclxuICAgIHNldFZpZXcsXHJcbiAgICB6b29tLFxyXG4gICAgZm9yY2VWaWV3VG9WaWV3ZXJTeW5jLFxyXG4gICAgY2FtZXJhQ29udHJvbGxlclxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNlbGVjdGlvblV0aWxpdGllcygpIHtcclxuICBjb25zdCB7XHJcbiAgICBmaWx0ZXJzOiB7IHNlbGVjdGVkT2JqZWN0cywgc2VsZWN0ZWRPYmplY3RJZHMgfVxyXG4gIH0gPSB1c2VJbmplY3RlZFZpZXdlckludGVyZmFjZVN0YXRlKClcclxuICBjb25zdCB7IG1ldGFkYXRhIH0gPSB1c2VJbmplY3RlZFZpZXdlcigpXHJcblxyXG4gIGNvbnN0IHNldFNlbGVjdGlvbkZyb21PYmplY3RJZHMgPSAob2JqZWN0SWRzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgY29uc3Qgb2JqczogQXJyYXk8U3BlY2tsZU9iamVjdD4gPSBbXVxyXG4gICAgb2JqZWN0SWRzLmZvckVhY2goKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgb2Jqcy5wdXNoKFxyXG4gICAgICAgIC4uLihcclxuICAgICAgICAgIChtZXRhZGF0YT8ud29ybGRUcmVlLnZhbHVlPy5maW5kSWQodmFsdWUpIHx8IFtdKSBhcyB1bmtub3duIGFzIFRyZWVOb2RlW11cclxuICAgICAgICApLm1hcChcclxuICAgICAgICAgIChub2RlOiBUcmVlTm9kZSkgPT5cclxuICAgICAgICAgICAgKG5vZGUubW9kZWwgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnJhdyBhcyBTcGVja2xlT2JqZWN0XHJcbiAgICAgICAgKVxyXG4gICAgICApXHJcbiAgICB9KVxyXG4gICAgc2VsZWN0ZWRPYmplY3RzLnZhbHVlID0gb2Jqc1xyXG4gIH1cclxuXHJcbiAgY29uc3QgYWRkVG9TZWxlY3Rpb25Gcm9tT2JqZWN0SWRzID0gKG9iamVjdElkczogc3RyaW5nW10pID0+IHtcclxuICAgIGNvbnN0IG9yaWdpbmFsT2JqZWN0cyA9IHNlbGVjdGVkT2JqZWN0cy52YWx1ZS5zbGljZSgpXHJcbiAgICBzZXRTZWxlY3Rpb25Gcm9tT2JqZWN0SWRzKG9iamVjdElkcylcclxuXHJcbiAgICAvLyBGaWx0ZXIgb3V0IGR1cGxpY2F0ZXMgYnkgY2hlY2tpbmcgaWYgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIElEIGFscmVhZHkgZXhpc3RcclxuICAgIGNvbnN0IG5ld09iamVjdHMgPSBzZWxlY3RlZE9iamVjdHMudmFsdWUuZmlsdGVyKFxyXG4gICAgICAobmV3T2JqKSA9PiAhb3JpZ2luYWxPYmplY3RzLnNvbWUoKGV4aXN0aW5nT2JqKSA9PiBleGlzdGluZ09iai5pZCA9PT0gbmV3T2JqLmlkKVxyXG4gICAgKVxyXG5cclxuICAgIHNlbGVjdGVkT2JqZWN0cy52YWx1ZSA9IFsuLi5vcmlnaW5hbE9iamVjdHMsIC4uLm5ld09iamVjdHNdXHJcbiAgfVxyXG5cclxuICBjb25zdCByZW1vdmVGcm9tU2VsZWN0aW9uT2JqZWN0SWRzID0gKG9iamVjdElkczogc3RyaW5nW10pID0+IHtcclxuICAgIGNvbnN0IGZpbmFsT2JqZWN0cyA9IHNlbGVjdGVkT2JqZWN0cy52YWx1ZS5maWx0ZXIoXHJcbiAgICAgIChvKSA9PiAhb2JqZWN0SWRzLmluY2x1ZGVzKG8uaWQgfHwgJycpXHJcbiAgICApXHJcbiAgICBzZWxlY3RlZE9iamVjdHMudmFsdWUgPSBmaW5hbE9iamVjdHNcclxuICB9XHJcblxyXG4gIGNvbnN0IGFkZFRvU2VsZWN0aW9uID0gKG9iamVjdDogU3BlY2tsZU9iamVjdCkgPT4ge1xyXG4gICAgY29uc3QgaWR4ID0gc2VsZWN0ZWRPYmplY3RzLnZhbHVlLmZpbmRJbmRleCgobykgPT4gby5pZCA9PT0gb2JqZWN0LmlkKVxyXG4gICAgaWYgKGlkeCAhPT0gLTEpIHJldHVyblxyXG5cclxuICAgIHNlbGVjdGVkT2JqZWN0cy52YWx1ZSA9IFsuLi5zZWxlY3RlZE9iamVjdHMudmFsdWUsIG9iamVjdF1cclxuICB9XHJcblxyXG4gIGNvbnN0IHJlbW92ZUZyb21TZWxlY3Rpb24gPSAob2JqZWN0T3JJZDogU3BlY2tsZU9iamVjdCB8IHN0cmluZykgPT4ge1xyXG4gICAgY29uc3Qgb2lkID0gaXNTdHJpbmcob2JqZWN0T3JJZCkgPyBvYmplY3RPcklkIDogb2JqZWN0T3JJZC5pZFxyXG4gICAgY29uc3QgaWR4ID0gc2VsZWN0ZWRPYmplY3RzLnZhbHVlLmZpbmRJbmRleCgobykgPT4gby5pZCA9PT0gb2lkKVxyXG4gICAgaWYgKGlkeCA9PT0gLTEpIHJldHVyblxyXG5cclxuICAgIGNvbnN0IG5ld09iamVjdHMgPSBzZWxlY3RlZE9iamVjdHMudmFsdWUuc2xpY2UoKVxyXG4gICAgbmV3T2JqZWN0cy5zcGxpY2UoaWR4LCAxKVxyXG4gICAgc2VsZWN0ZWRPYmplY3RzLnZhbHVlID0gbmV3T2JqZWN0c1xyXG4gIH1cclxuXHJcbiAgY29uc3QgY2xlYXJTZWxlY3Rpb24gPSAoKSA9PiB7XHJcbiAgICBzZWxlY3RlZE9iamVjdHMudmFsdWUgPSBbXVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGFkZFRvU2VsZWN0aW9uLFxyXG4gICAgcmVtb3ZlRnJvbVNlbGVjdGlvbixcclxuICAgIGNsZWFyU2VsZWN0aW9uLFxyXG4gICAgc2V0U2VsZWN0aW9uRnJvbU9iamVjdElkcyxcclxuICAgIGFkZFRvU2VsZWN0aW9uRnJvbU9iamVjdElkcyxcclxuICAgIHJlbW92ZUZyb21TZWxlY3Rpb25PYmplY3RJZHMsXHJcbiAgICBvYmplY3RzOiBzZWxlY3RlZE9iamVjdHMsXHJcbiAgICBvYmplY3RJZHM6IHNlbGVjdGVkT2JqZWN0SWRzXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlRGlmZlV0aWxpdGllcygpIHtcclxuICBjb25zdCBzdGF0ZSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG4gIGNvbnN0IHsgc2VyaWFsaXplRGlmZkNvbW1hbmQsIGRlc2VyaWFsaXplRGlmZkNvbW1hbmQsIGFyZURpZmZzRXF1YWwgfSA9XHJcbiAgICB1c2VEaWZmQnVpbGRlclV0aWxpdGllcygpXHJcblxyXG4gIGNvbnN0IGVuZERpZmYgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBhd2FpdCBzdGF0ZS51cmxIYXNoU3RhdGUuZGlmZi51cGRhdGUobnVsbClcclxuICB9XHJcblxyXG4gIGNvbnN0IGRpZmZNb2RlbFZlcnNpb25zID0gYXN5bmMgKFxyXG4gICAgbW9kZWxJZDogc3RyaW5nLFxyXG4gICAgdmVyc2lvbkE6IHN0cmluZyxcclxuICAgIHZlcnNpb25COiBzdHJpbmdcclxuICApID0+IHtcclxuICAgIGF3YWl0IHN0YXRlLnVybEhhc2hTdGF0ZS5kaWZmLnVwZGF0ZSh7XHJcbiAgICAgIGRpZmZzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdmVyc2lvbkE6IG5ldyBTcGVja2xlVmlld2VyLlZpZXdlclJvdXRlLlZpZXdlclZlcnNpb25SZXNvdXJjZShcclxuICAgICAgICAgICAgbW9kZWxJZCxcclxuICAgICAgICAgICAgdmVyc2lvbkFcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICB2ZXJzaW9uQjogbmV3IFNwZWNrbGVWaWV3ZXIuVmlld2VyUm91dGUuVmlld2VyVmVyc2lvblJlc291cmNlKFxyXG4gICAgICAgICAgICBtb2RlbElkLFxyXG4gICAgICAgICAgICB2ZXJzaW9uQlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzZXJpYWxpemVEaWZmQ29tbWFuZCxcclxuICAgIGRlc2VyaWFsaXplRGlmZkNvbW1hbmQsXHJcbiAgICBlbmREaWZmLFxyXG4gICAgZGlmZk1vZGVsVmVyc2lvbnMsXHJcbiAgICBhcmVEaWZmc0VxdWFsXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlVGhyZWFkVXRpbGl0aWVzKCkge1xyXG4gIGNvbnN0IHtcclxuICAgIHVybEhhc2hTdGF0ZTogeyBmb2N1c2VkVGhyZWFkSWQgfSxcclxuICAgIHVpOiB7XHJcbiAgICAgIHRocmVhZHM6IHtcclxuICAgICAgICBvcGVuVGhyZWFkOiB7IHRocmVhZDogb3BlblRocmVhZCB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSgpXHJcblxyXG4gIGNvbnN0IGlzT3BlblRocmVhZCA9IChpZDogc3RyaW5nKSA9PiBmb2N1c2VkVGhyZWFkSWQudmFsdWUgPT09IGlkXHJcblxyXG4gIGNvbnN0IGNsb3NlQWxsVGhyZWFkcyA9IGFzeW5jICgpID0+IHtcclxuICAgIGF3YWl0IGZvY3VzZWRUaHJlYWRJZC51cGRhdGUobnVsbClcclxuICB9XHJcblxyXG4gIGNvbnN0IG9wZW4gPSBhc3luYyAoaWQ6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKGlkID09PSBmb2N1c2VkVGhyZWFkSWQudmFsdWUpIHJldHVyblxyXG4gICAgYXdhaXQgZm9jdXNlZFRocmVhZElkLnVwZGF0ZShpZClcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgdW50aWwoZm9jdXNlZFRocmVhZElkKS50b01hdGNoKCh0aWQpID0+IHRpZCA9PT0gaWQpLFxyXG4gICAgICB1bnRpbChvcGVuVGhyZWFkKS50b01hdGNoKCh0KSA9PiB0Py5pZCA9PT0gaWQpXHJcbiAgICBdKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHsgY2xvc2VBbGxUaHJlYWRzLCBvcGVuLCBpc09wZW5UaHJlYWQgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlTWVhc3VyZW1lbnRVdGlsaXRpZXMoKSB7XHJcbiAgY29uc3Qgc3RhdGUgPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuICBjb25zdCBtZWFzdXJlbWVudHNFeHRlbnNpb24gPVxyXG4gICAgc3RhdGUudmlld2VyLmluc3RhbmNlLmdldEV4dGVuc2lvbihNZWFzdXJlbWVudHNFeHRlbnNpb24pXHJcblxyXG4gIGNvbnN0IG1lYXN1cmVtZW50T3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHN0YXRlLnVpLm1lYXN1cmVtZW50Lm9wdGlvbnMudmFsdWUpXHJcbiAgY29uc3QgaGFzTWVhc3VyZW1lbnRzID0gY29tcHV0ZWQoXHJcbiAgICAoKSA9PiBzdGF0ZS51aS5tZWFzdXJlbWVudC5tZWFzdXJlbWVudHMudmFsdWUubGVuZ3RoID4gMFxyXG4gIClcclxuXHJcbiAgY29uc3QgZW5hYmxlTWVhc3VyZW1lbnRzID0gKGVuYWJsZWQ6IGJvb2xlYW4pID0+IHtcclxuICAgIHN0YXRlLnVpLm1lYXN1cmVtZW50LmVuYWJsZWQudmFsdWUgPSBlbmFibGVkXHJcbiAgfVxyXG5cclxuICBjb25zdCBzZXRNZWFzdXJlbWVudE9wdGlvbnMgPSAob3B0aW9uczogTWVhc3VyZW1lbnRPcHRpb25zKSA9PiB7XHJcbiAgICBzdGF0ZS51aS5tZWFzdXJlbWVudC5vcHRpb25zLnZhbHVlID0gb3B0aW9uc1xyXG4gIH1cclxuXHJcbiAgY29uc3QgcmVtb3ZlQWN0aXZlTWVhc3VyZW1lbnQgPSAoKSA9PiB7XHJcbiAgICBtZWFzdXJlbWVudHNFeHRlbnNpb24ucmVtb3ZlTWVhc3VyZW1lbnQoKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgY2xlYXJNZWFzdXJlbWVudHMgPSAoKSA9PiB7XHJcbiAgICBzdGF0ZS51aS5tZWFzdXJlbWVudC5tZWFzdXJlbWVudHMudmFsdWUgPSBbXVxyXG4gIH1cclxuXHJcbiAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XHJcbiAgICBzdGF0ZS51aS5tZWFzdXJlbWVudC5lbmFibGVkLnZhbHVlID0gZmFsc2VcclxuICAgIHN0YXRlLnVpLm1lYXN1cmVtZW50Lm1lYXN1cmVtZW50cy52YWx1ZSA9IFtdXHJcbiAgICBzdGF0ZS51aS5tZWFzdXJlbWVudC5vcHRpb25zLnZhbHVlID0geyAuLi5kZWZhdWx0TWVhc3VyZW1lbnRPcHRpb25zIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBtZWFzdXJlbWVudE9wdGlvbnMsXHJcbiAgICBlbmFibGVNZWFzdXJlbWVudHMsXHJcbiAgICBzZXRNZWFzdXJlbWVudE9wdGlvbnMsXHJcbiAgICByZW1vdmVBY3RpdmVNZWFzdXJlbWVudCxcclxuICAgIGNsZWFyTWVhc3VyZW1lbnRzLFxyXG4gICAgaGFzTWVhc3VyZW1lbnRzLFxyXG4gICAgcmVzZXQsXHJcbiAgICBtZWFzdXJlbWVudHM6IHN0YXRlLnVpLm1lYXN1cmVtZW50Lm1lYXN1cmVtZW50c1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFNvbWUgY29uZGl0aW9uYWwgcmVuZGVyaW5nIHZhbHVlcyBkZXBlbmQgb24gbXVsdGlwbGUgJiBvdmVybGFwcGluZyBzdGF0ZXMuIFRoaXMgdXRpbGl0eSByZWNvbmNpbGVzIHRoYXQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29uZGl0aW9uYWxWaWV3ZXJSZW5kZXJpbmcoKSB7XHJcbiAgY29uc3QgZW1iZWRNb2RlID0gdXNlRW1iZWRTdGF0ZSgpXHJcblxyXG4gIGNvbnN0IHNob3dDb250cm9scyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGlmIChcclxuICAgICAgZW1iZWRNb2RlLmVtYmVkT3B0aW9ucy52YWx1ZT8uaXNFbmFibGVkICYmXHJcbiAgICAgIGVtYmVkTW9kZS5lbWJlZE9wdGlvbnMudmFsdWUuaGlkZUNvbnRyb2xzXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWVcclxuICB9KVxyXG5cclxuICBjb25zdCBzaG93TmF2YmFyID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYgKCFzaG93Q29udHJvbHMudmFsdWUpIHJldHVybiBmYWxzZVxyXG4gICAgaWYgKGVtYmVkTW9kZS5lbWJlZE9wdGlvbnMudmFsdWU/LmlzRW5hYmxlZCkgcmV0dXJuIGZhbHNlXHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzaG93TmF2YmFyLFxyXG4gICAgc2hvd0NvbnRyb2xzXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlSGlnaGxpZ2h0ZWRPYmplY3RzVXRpbGl0aWVzKCkge1xyXG4gIGNvbnN0IHtcclxuICAgIHVpOiB7IGhpZ2hsaWdodGVkT2JqZWN0SWRzIH0sXHJcbiAgICBwYWdlVHlwZVxyXG4gIH0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuXHJcbiAgY29uc3QgaGlnaGxpZ2h0T2JqZWN0cyA9IChpZHM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBpZiAocGFnZVR5cGUudmFsdWUgPT09IFZpZXdlclJlbmRlclBhZ2VUeXBlLlByZXNlbnRhdGlvbikgcmV0dXJuXHJcblxyXG4gICAgaGlnaGxpZ2h0ZWRPYmplY3RJZHMudmFsdWUgPSBbLi4ubmV3IFNldChbLi4uaGlnaGxpZ2h0ZWRPYmplY3RJZHMudmFsdWUsIC4uLmlkc10pXVxyXG4gIH1cclxuXHJcbiAgY29uc3QgdW5oaWdobGlnaHRPYmplY3RzID0gKGlkczogc3RyaW5nW10pID0+IHtcclxuICAgIGhpZ2hsaWdodGVkT2JqZWN0SWRzLnZhbHVlID0gaGlnaGxpZ2h0ZWRPYmplY3RJZHMudmFsdWUuZmlsdGVyKFxyXG4gICAgICAoaWQpID0+ICFpZHMuaW5jbHVkZXMoaWQpXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBjb25zdCBjbGVhckhpZ2hsaWdodGVkT2JqZWN0cyA9ICgpID0+IHtcclxuICAgIGhpZ2hsaWdodGVkT2JqZWN0SWRzLnZhbHVlID0gW11cclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBoaWdobGlnaHRPYmplY3RzLFxyXG4gICAgdW5oaWdobGlnaHRPYmplY3RzLFxyXG4gICAgY2xlYXJIaWdobGlnaHRlZE9iamVjdHNcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VWaWV3TW9kZVV0aWxpdGllcygpIHtcclxuICBjb25zdCB7IHZpZXdNb2RlIH0gPSB1c2VJbmplY3RlZFZpZXdlckludGVyZmFjZVN0YXRlKClcclxuICBjb25zdCBtcCA9IHVzZU1peHBhbmVsKClcclxuXHJcbiAgY29uc3Qgc2V0Vmlld01vZGUgPSAobW9kZTogVmlld01vZGUpID0+IHtcclxuICAgIHZpZXdNb2RlLm1vZGUudmFsdWUgPSBtb2RlXHJcbiAgICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICAgIG5hbWU6ICdzZXQtdmlldy1tb2RlJyxcclxuICAgICAgbW9kZVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHRvZ2dsZUVkZ2VzRW5hYmxlZCA9ICgpID0+IHtcclxuICAgIHZpZXdNb2RlLmVkZ2VzRW5hYmxlZC52YWx1ZSA9ICF2aWV3TW9kZS5lZGdlc0VuYWJsZWQudmFsdWVcclxuICAgIG1wLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywge1xyXG4gICAgICB0eXBlOiAnYWN0aW9uJyxcclxuICAgICAgbmFtZTogJ3RvZ2dsZS1lZGdlcycsXHJcbiAgICAgIGVuYWJsZWQ6IHZpZXdNb2RlLmVkZ2VzRW5hYmxlZC52YWx1ZVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHNldEVkZ2VzV2VpZ2h0ID0gKHdlaWdodDogbnVtYmVyKSA9PiB7XHJcbiAgICB2aWV3TW9kZS5lZGdlc1dlaWdodC52YWx1ZSA9IE51bWJlcih3ZWlnaHQpXHJcbiAgICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICAgIG5hbWU6ICdzZXQtZWRnZXMtd2VpZ2h0JyxcclxuICAgICAgd2VpZ2h0OiB2aWV3TW9kZS5lZGdlc1dlaWdodC52YWx1ZVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHNldEVkZ2VzQ29sb3IgPSAoY29sb3I6IG51bWJlciB8IHR5cGVvZiBkZWZhdWx0RWRnZUNvbG9yVmFsdWUpID0+IHtcclxuICAgIHZpZXdNb2RlLmVkZ2VzQ29sb3IudmFsdWUgPSBjb2xvclxyXG4gICAgbXAudHJhY2soJ1ZpZXdlciBBY3Rpb24nLCB7XHJcbiAgICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgICBuYW1lOiAnc2V0LWVkZ2VzLWNvbG9yJyxcclxuICAgICAgY29sb3I6IGNvbG9yLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg2LCAnMCcpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHZpZXdNb2RlLFxyXG4gICAgc2V0Vmlld01vZGUsXHJcbiAgICB0b2dnbGVFZGdlc0VuYWJsZWQsXHJcbiAgICBzZXRFZGdlc1dlaWdodCxcclxuICAgIHNldEVkZ2VzQ29sb3IsXHJcbiAgICByZXNldFZpZXdNb2RlOiB2aWV3TW9kZS5yZXNldFZpZXdNb2RlXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlVmlld2VyU2hvcnRjdXRzKCkge1xyXG4gIGNvbnN0IHsgdWkgfSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG4gIGNvbnN0IHsgaXNTbWFsbGVyT3JFcXVhbFNtIH0gPSB1c2VJc1NtYWxsZXJPckVxdWFsVGhhbkJyZWFrcG9pbnQoKVxyXG4gIGNvbnN0IHsgaXNFbmFibGVkOiBpc0VtYmVkRW5hYmxlZCB9ID0gdXNlRW1iZWQoKVxyXG4gIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB1c2VBY3RpdmVFbGVtZW50KClcclxuXHJcbiAgY29uc3QgaXNUeXBpbmdDb21tZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYgKFxyXG4gICAgICBhY3RpdmVFbGVtZW50LnZhbHVlICYmXHJcbiAgICAgIChhY3RpdmVFbGVtZW50LnZhbHVlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyB8fFxyXG4gICAgICAgIGFjdGl2ZUVsZW1lbnQudmFsdWUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGV4dGFyZWEnIHx8XHJcbiAgICAgICAgYWN0aXZlRWxlbWVudC52YWx1ZS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpID09PSAndHJ1ZScpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayB0aHJlYWQgZWRpdG9yIHN0YXRlc1xyXG4gICAgY29uc3QgaXNOZXdUaHJlYWRFZGl0b3JPcGVuID0gdWkudGhyZWFkcy5vcGVuVGhyZWFkLm5ld1RocmVhZEVkaXRvci52YWx1ZVxyXG4gICAgY29uc3QgaXNFeGlzdGluZ1RocmVhZEVkaXRvck9wZW4gPSAhIXVpLnRocmVhZHMub3BlblRocmVhZC50aHJlYWQudmFsdWVcclxuXHJcbiAgICByZXR1cm4gaXNOZXdUaHJlYWRFZGl0b3JPcGVuIHx8IGlzRXhpc3RpbmdUaHJlYWRFZGl0b3JPcGVuXHJcbiAgfSlcclxuXHJcbiAgY29uc3QgZm9ybWF0S2V5ID0gKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ0RpZ2l0JykpIHtcclxuICAgICAgcmV0dXJuIGtleS5zbGljZSg1KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGtleVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZ2V0U2hvcnRjdXREaXNwbGF5VGV4dCA9IChcclxuICAgIHNob3J0Y3V0OiBWaWV3ZXJTaG9ydGN1dCxcclxuICAgIG9wdGlvbnM/OiB7IGhpZGVOYW1lPzogYm9vbGVhbjsgZm9ybWF0PzogJ2RlZmF1bHQnIHwgJ3NlcGFyYXRlJyB9XHJcbiAgKSA9PiB7XHJcbiAgICBpZiAoaXNTbWFsbGVyT3JFcXVhbFNtLnZhbHVlKSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICBpZiAoaXNFbWJlZEVuYWJsZWQudmFsdWUpIHJldHVybiB1bmRlZmluZWRcclxuXHJcbiAgICBjb25zdCBzaG9ydGN1dFRleHQgPSBnZXRLZXlib2FyZFNob3J0Y3V0VGl0bGUoW1xyXG4gICAgICAuLi5zaG9ydGN1dC5tb2RpZmllcnMsXHJcbiAgICAgIGZvcm1hdEtleShzaG9ydGN1dC5rZXkpXHJcbiAgICBdKVxyXG5cclxuICAgIGlmIChvcHRpb25zPy5mb3JtYXQgPT09ICdzZXBhcmF0ZScpIHtcclxuICAgICAgY29uc3QgbW9kaWZpZXJzVGV4dCA9XHJcbiAgICAgICAgc2hvcnRjdXQubW9kaWZpZXJzLmxlbmd0aCA+IDBcclxuICAgICAgICAgID8gZ2V0S2V5Ym9hcmRTaG9ydGN1dFRpdGxlKFsuLi5zaG9ydGN1dC5tb2RpZmllcnNdKVxyXG4gICAgICAgICAgOiAnJ1xyXG4gICAgICBjb25zdCBrZXlUZXh0ID0gZ2V0S2V5Ym9hcmRTaG9ydGN1dFRpdGxlKFtmb3JtYXRLZXkoc2hvcnRjdXQua2V5KV0pXHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGNvbnRlbnQ6IGBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMiBtLTAgcC0wXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ib2R5LTJ4cyB0ZXh0LWZvcmVncm91bmRcIj4ke3Nob3J0Y3V0Lm5hbWV9PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ib2R5LTN4cyB0ZXh0LWZvcmVncm91bmQtM1wiPlxyXG4gICAgICAgICAgICAke1xyXG4gICAgICAgICAgICAgIG1vZGlmaWVyc1RleHRcclxuICAgICAgICAgICAgICAgID8gYDxrYmQgY2xhc3M9XCJwLTAuNSBtaW4tdy00IHRleHQtZm9yZWdyb3VuZC0yIHJvdW5kZWQtbWQgdGV4dC1ib2R5LTN4cyBmb250LW5vcm1hbCBmb250LXNhbnNcIj4ke21vZGlmaWVyc1RleHR9PC9rYmQ+YFxyXG4gICAgICAgICAgICAgICAgOiAnJ1xyXG4gICAgICAgICAgICB9PGtiZCBjbGFzcz1cIm1pbi13LTMgdGV4dC1mb3JlZ3JvdW5kLTIgcm91bmRlZC1zbSB0ZXh0LWJvZHktM3hzIGZvbnQtc2Fuc1wiPiR7a2V5VGV4dH08L2tiZD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICBgLFxyXG4gICAgICAgIGFsbG93SFRNTDogdHJ1ZSxcclxuICAgICAgICB0aGVtZTogJ3NwZWNrbGVUb29sdGlwJ1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFvcHRpb25zPy5oaWRlTmFtZSkge1xyXG4gICAgICByZXR1cm4gYCR7c2hvcnRjdXQubmFtZX0gKCR7c2hvcnRjdXRUZXh0fSlgXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNob3J0Y3V0VGV4dFxyXG4gIH1cclxuXHJcbiAgY29uc3QgZGlzYWJsZVNob3J0Y3V0cyA9IGNvbXB1dGVkKCgpID0+IGlzVHlwaW5nQ29tbWVudC52YWx1ZSB8fCBpc0VtYmVkRW5hYmxlZC52YWx1ZSlcclxuXHJcbiAgY29uc3QgcmVnaXN0ZXJTaG9ydGN1dHMgPSAoXHJcbiAgICBoYW5kbGVyczogUGFydGlhbDxSZWNvcmQ8Vmlld2VyU2hvcnRjdXRBY3Rpb24sICgpID0+IHZvaWQ+PlxyXG4gICkgPT4ge1xyXG4gICAgT2JqZWN0LnZhbHVlcyhWaWV3ZXJTaG9ydGN1dHMpLmZvckVhY2goKHNob3J0Y3V0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyc1tzaG9ydGN1dC5hY3Rpb24gYXMgVmlld2VyU2hvcnRjdXRBY3Rpb25dXHJcbiAgICAgIGlmIChoYW5kbGVyKSB7XHJcbiAgICAgICAgb25LZXlib2FyZFNob3J0Y3V0KFsuLi5zaG9ydGN1dC5tb2RpZmllcnNdLCBzaG9ydGN1dC5rZXksICgpID0+IHtcclxuICAgICAgICAgIGlmICghZGlzYWJsZVNob3J0Y3V0cy52YWx1ZSkgaGFuZGxlcigpXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzaG9ydGN1dHM6IFZpZXdlclNob3J0Y3V0cyxcclxuICAgIHJlZ2lzdGVyU2hvcnRjdXRzLFxyXG4gICAgZ2V0U2hvcnRjdXREaXNwbGF5VGV4dFxyXG4gIH1cclxufVxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvbGliL3ZpZXdlci9jb21wb3NhYmxlcy91aS50cyJ9