import { MeasurementType } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/viewer/helpers/state.js"; import { CameraController, SelectionExtension, SelectionExtensionEvent } from "/_nuxt/@fs/D:/speckle-server/packages/viewer/dist/index.js"; import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts"; import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { useCameraUtilities, useSelectionUtilities } from "/_nuxt/lib/viewer/composables/ui.ts"; import { useSelectionEvents } from "/_nuxt/lib/viewer/composables/viewer.ts"; import { ViewerRenderPageType } from "/_nuxt/lib/viewer/helpers/state.ts"; import { getTargetObjectIds } from "/_nuxt/lib/object-sidebar/helpers.ts"; import { useLogger } from "/_nuxt/composables/logging.ts"; import { watch, onBeforeUnmount } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const getRecord = (value) => value && typeof value === "object" ? value : {}; const getString = (value) => typeof value === "string" && value.length > 0 ? value : void 0; const getIfcValue = (raw, userData, key) => getString(raw[key]) || getString(userData[key]); const setTargetObjectIds = (object, targetObjectIds) => { Object.defineProperty(object, "targetObjectIds", { value: targetObjectIds, enumerable: false, configurable: true }); }; const toIfcElementSelectionObject = (rawObject) => { const raw = rawObject; const userData = getRecord(raw.userData); const ifcElementSourceGuid = getIfcValue(raw, userData, "ifcElementSourceGuid") || getIfcValue(raw, userData, "ifcElementAssemblySourceGuid") || getIfcValue(raw, userData, "sourceGuid"); const ifcElementGuid = getIfcValue(raw, userData, "ifcElementGuid") || getIfcValue(raw, userData, "ifcElementAssemblyGuid"); const elementGuid = ifcElementSourceGuid || ifcElementGuid; if (!elementGuid) return rawObject; const partType = getIfcValue(raw, userData, "ifcType"); const partName = getIfcValue(raw, userData, "ifcName"); const elementType = getIfcValue(raw, userData, "ifcElementType") || partType; const elementName = getIfcValue(raw, userData, "ifcElementName") || partName; const displayType = partType || elementType || "IFC.Element"; const displayName = partName || elementName || elementGuid; const targetObjectIds = getTargetObjectIds(raw); const elementObject = { id: elementGuid, speckle_type: "IFC.Element", name: displayName ? `${displayType} ${displayName}` : displayType, applicationId: elementGuid, guid: elementGuid, sourceGuid: ifcElementSourceGuid, ifcGuid: ifcElementGuid, ifcGlobalId: ifcElementGuid, ifcType: displayType, ifcName: displayName, ifcElementGuid, ifcElementSourceGuid, ifcElementType: elementType, ifcElementName: elementName, ifcElementAssemblyGuid: getIfcValue(raw, userData, "ifcElementAssemblyGuid"), ifcElementAssemblyType: getIfcValue(raw, userData, "ifcElementAssemblyType"), ifcElementAssemblyName: getIfcValue(raw, userData, "ifcElementAssemblyName"), ifcElementAssemblySourceGuid: getIfcValue( raw, userData, "ifcElementAssemblySourceGuid" ), ifcPartGuid: getIfcValue(raw, userData, "ifcGuid"), ifcPartSourceGuid: getIfcValue(raw, userData, "sourceGuid"), ifcPartType: partType, ifcPartName: partName, selectedPartId: getString(raw.uuid) || getIfcValue(raw, userData, "id") }; setTargetObjectIds(elementObject, targetObjectIds); return elementObject; }; function useCollectSelection() { const { ui: { selection, windowSelection } } = useInjectedViewerState(); const selectionCallback = (_event, { firstVisibleSelectionHit }) => { if (windowSelection.enabled.value) return; if (!firstVisibleSelectionHit) return selection.value = null; selection.value = firstVisibleSelectionHit.point; }; useSelectionEvents({ singleClickCallback: selectionCallback, doubleClickCallback: selectionCallback }); } function useSelectOrZoomOnSelection() { const state = useInjectedViewerState(); const { clearSelection, addToSelection } = useSelectionUtilities(); const { zoom } = useCameraUtilities(); const mp = useMixpanel(); const logger = useLogger(); const trackAndClearSelection = () => { clearSelection(); mp.track("Viewer Action", { type: "action", name: "selection", action: "clear", source: "viewer" }); }; useSelectionEvents( { singleClickCallback: (args, { firstVisibleSelectionHit }) => { if (state.ui.windowSelection.enabled.value) return; if (!args) return trackAndClearSelection(); if (args.hits.length === 0) return trackAndClearSelection(); if (!args.multiple) clearSelection(); if (!state.viewer.instance.getExtension(SelectionExtension).enabled || state.pageType.value === ViewerRenderPageType.Presentation) { return; } if (!firstVisibleSelectionHit) return clearSelection(); const selectedObject = toIfcElementSelectionObject( firstVisibleSelectionHit.node.model.raw ); addToSelection(selectedObject); if (state.ui.diff.enabled.value && state.ui.diff.result.value && selectedObject.applicationId) { const modifiedObjectPairs = state.ui.diff.result.value.modified; const obj = selectedObject; const pairedItems = modifiedObjectPairs.find((item) => { if (item[0].model.raw.id === obj.id || item[1].model.raw.id === obj.id) { return true; } }); if (!pairedItems) return; const pair = pairedItems[0].model.raw.id === obj.id ? pairedItems[1].model.raw : pairedItems[0].model.raw; if (!pair) return; addToSelection(pair); } mp.track("Viewer Action", { type: "action", name: "selection", action: "select", multiple: args.multiple }); }, doubleClickCallback: (args, { firstVisibleSelectionHit }) => { if (state.ui.windowSelection.enabled.value) return; const isMeasureMode = state.ui.measurement.enabled.value; const measurementType = state.ui.measurement.options.value.type; if (isMeasureMode && (measurementType === MeasurementType.PERPENDICULAR || measurementType === MeasurementType.AREA)) { return; } if (!args) return zoom(); if (!args.hits) return zoom(); if (args.hits.length === 0) return zoom(); const firstVisHit = firstVisibleSelectionHit; if (!firstVisHit) return clearSelection(); if (state.ui.filters.selectedObjects.value.length !== 0) { const ids = Array.from( new Set( state.ui.filters.selectedObjects.value.flatMap( (o) => getTargetObjectIds(o) ) ) ); zoom(ids); } else { logger.warn( "Got a double click event but there's no selected object in the state - this should be impossible :)" ); } mp.track("Viewer Action", { type: "action", name: "zoom", source: "object-double-click" }); } }, { state } ); } function useWindowSelectionIntegration() { const state = useInjectedViewerState(); const { viewer: { instance, init: { promise: viewerInitialized } }, ui: { windowSelection, filters: { selectedObjects } } } = state; const selectionExtension = () => instance.getExtension(SelectionExtension); const cameraController = () => instance.getExtension(CameraController); const applyWindowSelectionOptions = () => { const extension = selectionExtension(); extension.options = { ...extension.options, windowSelection: { ...extension.options.windowSelection, enabled: windowSelection.enabled.value, modifierKey: "none", selectionMode: "contains" } }; cameraController().enabled = !windowSelection.enabled.value; }; watch(windowSelection.enabled, applyWindowSelectionOptions, { immediate: true }); const toCompactSelectionObject = (objectId) => ({ id: objectId, speckle_type: "Base", name: objectId }); const onSelectionChanged = ({ objects, objectIds }) => { if (!windowSelection.enabled.value) return; selectedObjects.value = objects.length ? objects.map((obj) => toIfcElementSelectionObject(obj)) : objectIds.map(toCompactSelectionObject); }; viewerInitialized.then(() => { applyWindowSelectionOptions(); selectionExtension().on( SelectionExtensionEvent.SelectionChanged, onSelectionChanged ); }); onBeforeUnmount(() => { selectionExtension().removeListener( SelectionExtensionEvent.SelectionChanged, onSelectionChanged ); windowSelection.enabled.value = false; applyWindowSelectionOptions(); }); } export function useViewerSelectionEventHandler() { useCollectSelection(); useSelectOrZoomOnSelection(); useWindowSelectionIntegration(); } //# sourceMappingURL=data:application/json;base64,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UyxnQkFBZ0IsUUFBUTtBQUFBLFFBQ2pDLGFBQWE7QUFBQSxRQUNiLGVBQWU7QUFBQSxNQUNqQjtBQUFBLElBQ0Y7QUFDQSxxQkFBaUIsRUFBRSxVQUFVLENBQUMsZ0JBQWdCLFFBQVE7QUFBQSxFQUN4RDtBQUVBLFFBQU0sZ0JBQWdCLFNBQVMsNkJBQTZCLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFFL0UsUUFBTSwyQkFBMkIsQ0FBQyxjQUFxQztBQUFBLElBQ3JFLElBQUk7QUFBQSxJQUNKLGNBQWM7QUFBQSxJQUNkLE1BQU07QUFBQSxFQUNSO0FBRUEsUUFBTSxxQkFBcUIsQ0FBQztBQUFBLElBQzFCO0FBQUEsSUFDQTtBQUFBLEVBQ0YsTUFHTTtBQUNKLFFBQUksQ0FBQyxnQkFBZ0IsUUFBUSxNQUFPO0FBQ3BDLG9CQUFnQixRQUFRLFFBQVEsU0FDNUIsUUFBUSxJQUFJLENBQUMsUUFBUSw0QkFBNEIsR0FBb0IsQ0FBQyxJQUN0RSxVQUFVLElBQUksd0JBQXdCO0FBQUEsRUFDNUM7QUFFQSxvQkFBa0IsS0FBSyxNQUFNO0FBQzNCLGdDQUE0QjtBQUM1Qix1QkFBbUIsRUFBRTtBQUFBLE1BQ25CLHdCQUF3QjtBQUFBLE1BQ3hCO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUVELGtCQUFnQixNQUFNO0FBQ3BCLHVCQUFtQixFQUFFO0FBQUEsTUFDbkIsd0JBQXdCO0FBQUEsTUFDeEI7QUFBQSxJQUNGO0FBQ0Esb0JBQWdCLFFBQVEsUUFBUTtBQUNoQyxnQ0FBNEI7QUFBQSxFQUM5QixDQUFDO0FBQ0g7QUFFTyxnQkFBUyxpQ0FBaUM7QUFDL0Msc0JBQW9CO0FBQ3BCLDZCQUEyQjtBQUMzQixnQ0FBOEI7QUFDaEMiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbInNlbGVjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNZWFzdXJlbWVudFR5cGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQvdmlld2VyL3N0YXRlJ1xyXG5pbXBvcnQge1xyXG4gIENhbWVyYUNvbnRyb2xsZXIsXHJcbiAgU2VsZWN0aW9uRXh0ZW5zaW9uLFxyXG4gIFNlbGVjdGlvbkV4dGVuc2lvbkV2ZW50XHJcbn0gZnJvbSAnQHNwZWNrbGUvdmlld2VyJ1xyXG5pbXBvcnQgdHlwZSB7IFNwZWNrbGVPYmplY3QgfSBmcm9tICd+L2xpYi92aWV3ZXIvaGVscGVycy9zY2VuZUV4cGxvcmVyJ1xyXG5pbXBvcnQgeyB1c2VNaXhwYW5lbCB9IGZyb20gJ35+L2xpYi9jb3JlL2NvbXBvc2FibGVzL21wJ1xyXG5pbXBvcnQgeyB1c2VJbmplY3RlZFZpZXdlclN0YXRlIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cCdcclxuaW1wb3J0IHsgdXNlQ2FtZXJhVXRpbGl0aWVzLCB1c2VTZWxlY3Rpb25VdGlsaXRpZXMgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3VpJ1xyXG5pbXBvcnQgeyB1c2VTZWxlY3Rpb25FdmVudHMgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3ZpZXdlcidcclxuaW1wb3J0IHsgVmlld2VyUmVuZGVyUGFnZVR5cGUgfSBmcm9tICd+L2xpYi92aWV3ZXIvaGVscGVycy9zdGF0ZSdcclxuaW1wb3J0IHsgZ2V0VGFyZ2V0T2JqZWN0SWRzIH0gZnJvbSAnfi9saWIvb2JqZWN0LXNpZGViYXIvaGVscGVycydcclxuXHJcbmNvbnN0IGdldFJlY29yZCA9ICh2YWx1ZTogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XHJcbiAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/ICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiB7fVxyXG5cclxuY29uc3QgZ2V0U3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+XHJcbiAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUgOiB1bmRlZmluZWRcclxuXHJcbmNvbnN0IGdldElmY1ZhbHVlID0gKFxyXG4gIHJhdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXHJcbiAgdXNlckRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxyXG4gIGtleTogc3RyaW5nXHJcbikgPT4gZ2V0U3RyaW5nKHJhd1trZXldKSB8fCBnZXRTdHJpbmcodXNlckRhdGFba2V5XSlcclxuXHJcbmNvbnN0IHNldFRhcmdldE9iamVjdElkcyA9IChvYmplY3Q6IFNwZWNrbGVPYmplY3QsIHRhcmdldE9iamVjdElkczogc3RyaW5nW10pID0+IHtcclxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCAndGFyZ2V0T2JqZWN0SWRzJywge1xyXG4gICAgdmFsdWU6IHRhcmdldE9iamVjdElkcyxcclxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgfSlcclxufVxyXG5cclxuY29uc3QgdG9JZmNFbGVtZW50U2VsZWN0aW9uT2JqZWN0ID0gKHJhd09iamVjdDogU3BlY2tsZU9iamVjdCk6IFNwZWNrbGVPYmplY3QgPT4ge1xyXG4gIGNvbnN0IHJhdyA9IHJhd09iamVjdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxyXG4gIGNvbnN0IHVzZXJEYXRhID0gZ2V0UmVjb3JkKHJhdy51c2VyRGF0YSlcclxuICBjb25zdCBpZmNFbGVtZW50U291cmNlR3VpZCA9XHJcbiAgICBnZXRJZmNWYWx1ZShyYXcsIHVzZXJEYXRhLCAnaWZjRWxlbWVudFNvdXJjZUd1aWQnKSB8fFxyXG4gICAgZ2V0SWZjVmFsdWUocmF3LCB1c2VyRGF0YSwgJ2lmY0VsZW1lbnRBc3NlbWJseVNvdXJjZUd1aWQnKSB8fFxyXG4gICAgZ2V0SWZjVmFsdWUocmF3LCB1c2VyRGF0YSwgJ3NvdXJjZUd1aWQnKVxyXG4gIGNvbnN0IGlmY0VsZW1lbnRHdWlkID1cclxuICAgIGdldElmY1ZhbHVlKHJhdywgdXNlckRhdGEsICdpZmNFbGVtZW50R3VpZCcpIHx8XHJcbiAgICBnZXRJZmNWYWx1ZShyYXcsIHVzZXJEYXRhLCAnaWZjRWxlbWVudEFzc2VtYmx5R3VpZCcpXHJcbiAgY29uc3QgZWxlbWVudEd1aWQgPSBpZmNFbGVtZW50U291cmNlR3VpZCB8fCBpZmNFbGVtZW50R3VpZFxyXG5cclxuICBpZiAoIWVsZW1lbnRHdWlkKSByZXR1cm4gcmF3T2JqZWN0XHJcblxyXG4gIGNvbnN0IHBhcnRUeXBlID0gZ2V0SWZjVmFsdWUocmF3LCB1c2VyRGF0YSwgJ2lmY1R5cGUnKVxyXG4gIGNvbnN0IHBhcnROYW1lID0gZ2V0SWZjVmFsdWUocmF3LCB1c2VyRGF0YSwgJ2lmY05hbWUnKVxyXG4gIGNvbnN0IGVsZW1lbnRUeXBlID0gZ2V0SWZjVmFsdWUocmF3LCB1c2VyRGF0YSwgJ2lmY0VsZW1lbnRUeXBlJykgfHwgcGFydFR5cGVcclxuICBjb25zdCBlbGVtZW50TmFtZSA9IGdldElmY1ZhbHVlKHJhdywgdXNlckRhdGEsICdpZmNFbGVtZW50TmFtZScpIHx8IHBhcnROYW1lXHJcbiAgY29uc3QgZGlzcGxheVR5cGUgPSBwYXJ0VHlwZSB8fCBlbGVtZW50VHlwZSB8fCAnSUZDLkVsZW1lbnQnXHJcbiAgY29uc3QgZGlzcGxheU5hbWUgPSBwYXJ0TmFtZSB8fCBlbGVtZW50TmFtZSB8fCBlbGVtZW50R3VpZFxyXG4gIGNvbnN0IHRhcmdldE9iamVjdElkcyA9IGdldFRhcmdldE9iamVjdElkcyhyYXcpXHJcblxyXG4gIGNvbnN0IGVsZW1lbnRPYmplY3Q6IFNwZWNrbGVPYmplY3QgPSB7XHJcbiAgICBpZDogZWxlbWVudEd1aWQsXHJcbiAgICBzcGVja2xlX3R5cGU6ICdJRkMuRWxlbWVudCcsXHJcbiAgICBuYW1lOiBkaXNwbGF5TmFtZSA/IGAke2Rpc3BsYXlUeXBlfSAke2Rpc3BsYXlOYW1lfWAgOiBkaXNwbGF5VHlwZSxcclxuICAgIGFwcGxpY2F0aW9uSWQ6IGVsZW1lbnRHdWlkLFxyXG4gICAgZ3VpZDogZWxlbWVudEd1aWQsXHJcbiAgICBzb3VyY2VHdWlkOiBpZmNFbGVtZW50U291cmNlR3VpZCxcclxuICAgIGlmY0d1aWQ6IGlmY0VsZW1lbnRHdWlkLFxyXG4gICAgaWZjR2xvYmFsSWQ6IGlmY0VsZW1lbnRHdWlkLFxyXG4gICAgaWZjVHlwZTogZGlzcGxheVR5cGUsXHJcbiAgICBpZmNOYW1lOiBkaXNwbGF5TmFtZSxcclxuICAgIGlmY0VsZW1lbnRHdWlkLFxyXG4gICAgaWZjRWxlbWVudFNvdXJjZUd1aWQsXHJcbiAgICBpZmNFbGVtZW50VHlwZTogZWxlbWVudFR5cGUsXHJcbiAgICBpZmNFbGVtZW50TmFtZTogZWxlbWVudE5hbWUsXHJcbiAgICBpZmNFbGVtZW50QXNzZW1ibHlHdWlkOiBnZXRJZmNWYWx1ZShyYXcsIHVzZXJEYXRhLCAnaWZjRWxlbWVudEFzc2VtYmx5R3VpZCcpLFxyXG4gICAgaWZjRWxlbWVudEFzc2VtYmx5VHlwZTogZ2V0SWZjVmFsdWUocmF3LCB1c2VyRGF0YSwgJ2lmY0VsZW1lbnRBc3NlbWJseVR5cGUnKSxcclxuICAgIGlmY0VsZW1lbnRBc3NlbWJseU5hbWU6IGdldElmY1ZhbHVlKHJhdywgdXNlckRhdGEsICdpZmNFbGVtZW50QXNzZW1ibHlOYW1lJyksXHJcbiAgICBpZmNFbGVtZW50QXNzZW1ibHlTb3VyY2VHdWlkOiBnZXRJZmNWYWx1ZShcclxuICAgICAgcmF3LFxyXG4gICAgICB1c2VyRGF0YSxcclxuICAgICAgJ2lmY0VsZW1lbnRBc3NlbWJseVNvdXJjZUd1aWQnXHJcbiAgICApLFxyXG4gICAgaWZjUGFydEd1aWQ6IGdldElmY1ZhbHVlKHJhdywgdXNlckRhdGEsICdpZmNHdWlkJyksXHJcbiAgICBpZmNQYXJ0U291cmNlR3VpZDogZ2V0SWZjVmFsdWUocmF3LCB1c2VyRGF0YSwgJ3NvdXJjZUd1aWQnKSxcclxuICAgIGlmY1BhcnRUeXBlOiBwYXJ0VHlwZSxcclxuICAgIGlmY1BhcnROYW1lOiBwYXJ0TmFtZSxcclxuICAgIHNlbGVjdGVkUGFydElkOiBnZXRTdHJpbmcocmF3LnV1aWQpIHx8IGdldElmY1ZhbHVlKHJhdywgdXNlckRhdGEsICdpZCcpXHJcbiAgfVxyXG4gIHNldFRhcmdldE9iamVjdElkcyhlbGVtZW50T2JqZWN0LCB0YXJnZXRPYmplY3RJZHMpXHJcbiAgcmV0dXJuIGVsZW1lbnRPYmplY3RcclxufVxyXG5cclxuZnVuY3Rpb24gdXNlQ29sbGVjdFNlbGVjdGlvbigpIHtcclxuICBjb25zdCB7XHJcbiAgICB1aTogeyBzZWxlY3Rpb24sIHdpbmRvd1NlbGVjdGlvbiB9XHJcbiAgfSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG5cclxuICBjb25zdCBzZWxlY3Rpb25DYWxsYmFjazogUGFyYW1ldGVyczxcclxuICAgIHR5cGVvZiB1c2VTZWxlY3Rpb25FdmVudHNcclxuICA+WzBdWydzaW5nbGVDbGlja0NhbGxiYWNrJ10gPSAoX2V2ZW50LCB7IGZpcnN0VmlzaWJsZVNlbGVjdGlvbkhpdCB9KSA9PiB7XHJcbiAgICBpZiAod2luZG93U2VsZWN0aW9uLmVuYWJsZWQudmFsdWUpIHJldHVyblxyXG4gICAgaWYgKCFmaXJzdFZpc2libGVTZWxlY3Rpb25IaXQpIHJldHVybiAoc2VsZWN0aW9uLnZhbHVlID0gbnVsbCkgLy8gcmVzZXQgc2VsZWN0aW9uIGxvY2F0aW9uXHJcbiAgICBzZWxlY3Rpb24udmFsdWUgPSBmaXJzdFZpc2libGVTZWxlY3Rpb25IaXQucG9pbnRcclxuICB9XHJcbiAgdXNlU2VsZWN0aW9uRXZlbnRzKHtcclxuICAgIHNpbmdsZUNsaWNrQ2FsbGJhY2s6IHNlbGVjdGlvbkNhbGxiYWNrLFxyXG4gICAgZG91YmxlQ2xpY2tDYWxsYmFjazogc2VsZWN0aW9uQ2FsbGJhY2tcclxuICB9KVxyXG59XHJcblxyXG5mdW5jdGlvbiB1c2VTZWxlY3RPclpvb21PblNlbGVjdGlvbigpIHtcclxuICBjb25zdCBzdGF0ZSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG4gIGNvbnN0IHsgY2xlYXJTZWxlY3Rpb24sIGFkZFRvU2VsZWN0aW9uIH0gPSB1c2VTZWxlY3Rpb25VdGlsaXRpZXMoKVxyXG4gIGNvbnN0IHsgem9vbSB9ID0gdXNlQ2FtZXJhVXRpbGl0aWVzKClcclxuICBjb25zdCBtcCA9IHVzZU1peHBhbmVsKClcclxuICBjb25zdCBsb2dnZXIgPSB1c2VMb2dnZXIoKVxyXG5cclxuICBjb25zdCB0cmFja0FuZENsZWFyU2VsZWN0aW9uID0gKCkgPT4ge1xyXG4gICAgY2xlYXJTZWxlY3Rpb24oKVxyXG4gICAgbXAudHJhY2soJ1ZpZXdlciBBY3Rpb24nLCB7XHJcbiAgICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgICBuYW1lOiAnc2VsZWN0aW9uJyxcclxuICAgICAgYWN0aW9uOiAnY2xlYXInLFxyXG4gICAgICBzb3VyY2U6ICd2aWV3ZXInXHJcbiAgICB9KVxyXG4gIH1cclxuICB1c2VTZWxlY3Rpb25FdmVudHMoXHJcbiAgICB7XHJcbiAgICAgIHNpbmdsZUNsaWNrQ2FsbGJhY2s6IChhcmdzLCB7IGZpcnN0VmlzaWJsZVNlbGVjdGlvbkhpdCB9KSA9PiB7XHJcbiAgICAgICAgaWYgKHN0YXRlLnVpLndpbmRvd1NlbGVjdGlvbi5lbmFibGVkLnZhbHVlKSByZXR1cm5cclxuICAgICAgICBpZiAoIWFyZ3MpIHJldHVybiB0cmFja0FuZENsZWFyU2VsZWN0aW9uKClcclxuICAgICAgICBpZiAoYXJncy5oaXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRyYWNrQW5kQ2xlYXJTZWxlY3Rpb24oKVxyXG4gICAgICAgIGlmICghYXJncy5tdWx0aXBsZSkgY2xlYXJTZWxlY3Rpb24oKSAvLyBub3RlIHdlJ3JlIG5vdCB0cmFja2luZyBzZWxlY3Rpbm8gY2xlYXJpbmcgaGVyZVxyXG5cclxuICAgICAgICAvLyBTa2lwIGlmIHNlbGVjdGlvbiBkaXNhYmxlZCBvciBpbiBwcmVzZW50YXRpb24gbW9kZVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICFzdGF0ZS52aWV3ZXIuaW5zdGFuY2UuZ2V0RXh0ZW5zaW9uKFNlbGVjdGlvbkV4dGVuc2lvbikuZW5hYmxlZCB8fFxyXG4gICAgICAgICAgc3RhdGUucGFnZVR5cGUudmFsdWUgPT09IFZpZXdlclJlbmRlclBhZ2VUeXBlLlByZXNlbnRhdGlvblxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWZpcnN0VmlzaWJsZVNlbGVjdGlvbkhpdCkgcmV0dXJuIGNsZWFyU2VsZWN0aW9uKClcclxuICAgICAgICBjb25zdCBzZWxlY3RlZE9iamVjdCA9IHRvSWZjRWxlbWVudFNlbGVjdGlvbk9iamVjdChcclxuICAgICAgICAgIGZpcnN0VmlzaWJsZVNlbGVjdGlvbkhpdC5ub2RlLm1vZGVsLnJhdyBhcyBTcGVja2xlT2JqZWN0XHJcbiAgICAgICAgKVxyXG4gICAgICAgIGFkZFRvU2VsZWN0aW9uKHNlbGVjdGVkT2JqZWN0KVxyXG4gICAgICAgIC8vIEV4cGFuZHMgZGVmYXVsdCB2aWV3ZXIgc2VsZWN0aW9uIGJlaGF2aW91ciB3aXRoIGEgc3BlY2lhbCBjYXNlIGluIGRpZmYgbW9kZS5cclxuICAgICAgICAvLyBJbiBkaWZmIG1vZGUsIGlmIHdlIHNlbGVjdCB2aWEgYSBtb3VzZSBjbGljayBhbiBvYmplY3QsIGFuZCB0aGF0IG9iamVjdCBpc1xyXG4gICAgICAgIC8vIFwibW9kaWZpZWRcIiwgd2Ugd2FudCB0byBzZWxlY3QgaXRzIHBhaXIgYXMgd2VsbC5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBzdGF0ZS51aS5kaWZmLmVuYWJsZWQudmFsdWUgJiZcclxuICAgICAgICAgIHN0YXRlLnVpLmRpZmYucmVzdWx0LnZhbHVlICYmXHJcbiAgICAgICAgICBzZWxlY3RlZE9iamVjdC5hcHBsaWNhdGlvbklkXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBjb25zdCBtb2RpZmllZE9iamVjdFBhaXJzID0gc3RhdGUudWkuZGlmZi5yZXN1bHQudmFsdWUubW9kaWZpZWRcclxuICAgICAgICAgIGNvbnN0IG9iaiA9IHNlbGVjdGVkT2JqZWN0XHJcbiAgICAgICAgICBjb25zdCBwYWlyZWRJdGVtcyA9IG1vZGlmaWVkT2JqZWN0UGFpcnMuZmluZCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgKGl0ZW1bMF0ubW9kZWwucmF3IGFzIFNwZWNrbGVPYmplY3QpLmlkID09PSBvYmouaWQgfHxcclxuICAgICAgICAgICAgICAoaXRlbVsxXS5tb2RlbC5yYXcgYXMgU3BlY2tsZU9iamVjdCkuaWQgPT09IG9iai5pZFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgaWYgKCFwYWlyZWRJdGVtcykgcmV0dXJuXHJcblxyXG4gICAgICAgICAgY29uc3QgcGFpciA9XHJcbiAgICAgICAgICAgIChwYWlyZWRJdGVtc1swXS5tb2RlbC5yYXcgYXMgU3BlY2tsZU9iamVjdCkuaWQgPT09IG9iai5pZFxyXG4gICAgICAgICAgICAgID8gKHBhaXJlZEl0ZW1zWzFdLm1vZGVsLnJhdyBhcyBTcGVja2xlT2JqZWN0KVxyXG4gICAgICAgICAgICAgIDogKHBhaXJlZEl0ZW1zWzBdLm1vZGVsLnJhdyBhcyBTcGVja2xlT2JqZWN0KVxyXG4gICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm5cclxuICAgICAgICAgIGFkZFRvU2VsZWN0aW9uKHBhaXIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1wLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywge1xyXG4gICAgICAgICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICAgICAgICBuYW1lOiAnc2VsZWN0aW9uJyxcclxuICAgICAgICAgIGFjdGlvbjogJ3NlbGVjdCcsXHJcbiAgICAgICAgICBtdWx0aXBsZTogYXJncy5tdWx0aXBsZVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0sXHJcbiAgICAgIGRvdWJsZUNsaWNrQ2FsbGJhY2s6IChhcmdzLCB7IGZpcnN0VmlzaWJsZVNlbGVjdGlvbkhpdCB9KSA9PiB7XHJcbiAgICAgICAgaWYgKHN0YXRlLnVpLndpbmRvd1NlbGVjdGlvbi5lbmFibGVkLnZhbHVlKSByZXR1cm5cclxuICAgICAgICBjb25zdCBpc01lYXN1cmVNb2RlID0gc3RhdGUudWkubWVhc3VyZW1lbnQuZW5hYmxlZC52YWx1ZVxyXG4gICAgICAgIGNvbnN0IG1lYXN1cmVtZW50VHlwZSA9IHN0YXRlLnVpLm1lYXN1cmVtZW50Lm9wdGlvbnMudmFsdWUudHlwZVxyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBpc01lYXN1cmVNb2RlICYmXHJcbiAgICAgICAgICAobWVhc3VyZW1lbnRUeXBlID09PSBNZWFzdXJlbWVudFR5cGUuUEVSUEVORElDVUxBUiB8fFxyXG4gICAgICAgICAgICBtZWFzdXJlbWVudFR5cGUgPT09IE1lYXN1cmVtZW50VHlwZS5BUkVBKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghYXJncykgcmV0dXJuIHpvb20oKVxyXG4gICAgICAgIGlmICghYXJncy5oaXRzKSByZXR1cm4gem9vbSgpXHJcbiAgICAgICAgaWYgKGFyZ3MuaGl0cy5sZW5ndGggPT09IDApIHJldHVybiB6b29tKClcclxuXHJcbiAgICAgICAgY29uc3QgZmlyc3RWaXNIaXQgPSBmaXJzdFZpc2libGVTZWxlY3Rpb25IaXRcclxuICAgICAgICBpZiAoIWZpcnN0VmlzSGl0KSByZXR1cm4gY2xlYXJTZWxlY3Rpb24oKVxyXG5cclxuICAgICAgICBpZiAoc3RhdGUudWkuZmlsdGVycy5zZWxlY3RlZE9iamVjdHMudmFsdWUubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5mcm9tKFxyXG4gICAgICAgICAgICBuZXcgU2V0KFxyXG4gICAgICAgICAgICAgIHN0YXRlLnVpLmZpbHRlcnMuc2VsZWN0ZWRPYmplY3RzLnZhbHVlLmZsYXRNYXAoKG8pID0+XHJcbiAgICAgICAgICAgICAgICBnZXRUYXJnZXRPYmplY3RJZHMobyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIClcclxuICAgICAgICAgIHpvb20oaWRzKVxyXG4gICAgICAgIH0gLy8gZWxzZSBzb21ldGhpbmduIGlzIHdlaXJkLlxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbG9nZ2VyLndhcm4oXHJcbiAgICAgICAgICAgIFwiR290IGEgZG91YmxlIGNsaWNrIGV2ZW50IGJ1dCB0aGVyZSdzIG5vIHNlbGVjdGVkIG9iamVjdCBpbiB0aGUgc3RhdGUgLSB0aGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlIDopXCJcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgbXAudHJhY2soJ1ZpZXdlciBBY3Rpb24nLCB7XHJcbiAgICAgICAgICB0eXBlOiAnYWN0aW9uJyxcclxuICAgICAgICAgIG5hbWU6ICd6b29tJyxcclxuICAgICAgICAgIHNvdXJjZTogJ29iamVjdC1kb3VibGUtY2xpY2snXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHsgc3RhdGUgfVxyXG4gIClcclxufVxyXG5cclxuZnVuY3Rpb24gdXNlV2luZG93U2VsZWN0aW9uSW50ZWdyYXRpb24oKSB7XHJcbiAgY29uc3Qgc3RhdGUgPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuICBjb25zdCB7XHJcbiAgICB2aWV3ZXI6IHtcclxuICAgICAgaW5zdGFuY2UsXHJcbiAgICAgIGluaXQ6IHsgcHJvbWlzZTogdmlld2VySW5pdGlhbGl6ZWQgfVxyXG4gICAgfSxcclxuICAgIHVpOiB7XHJcbiAgICAgIHdpbmRvd1NlbGVjdGlvbixcclxuICAgICAgZmlsdGVyczogeyBzZWxlY3RlZE9iamVjdHMgfVxyXG4gICAgfVxyXG4gIH0gPSBzdGF0ZVxyXG5cclxuICBjb25zdCBzZWxlY3Rpb25FeHRlbnNpb24gPSAoKSA9PiBpbnN0YW5jZS5nZXRFeHRlbnNpb24oU2VsZWN0aW9uRXh0ZW5zaW9uKVxyXG4gIGNvbnN0IGNhbWVyYUNvbnRyb2xsZXIgPSAoKSA9PiBpbnN0YW5jZS5nZXRFeHRlbnNpb24oQ2FtZXJhQ29udHJvbGxlcilcclxuXHJcbiAgY29uc3QgYXBwbHlXaW5kb3dTZWxlY3Rpb25PcHRpb25zID0gKCkgPT4ge1xyXG4gICAgY29uc3QgZXh0ZW5zaW9uID0gc2VsZWN0aW9uRXh0ZW5zaW9uKClcclxuICAgIGV4dGVuc2lvbi5vcHRpb25zID0ge1xyXG4gICAgICAuLi5leHRlbnNpb24ub3B0aW9ucyxcclxuICAgICAgd2luZG93U2VsZWN0aW9uOiB7XHJcbiAgICAgICAgLi4uZXh0ZW5zaW9uLm9wdGlvbnMud2luZG93U2VsZWN0aW9uLFxyXG4gICAgICAgIGVuYWJsZWQ6IHdpbmRvd1NlbGVjdGlvbi5lbmFibGVkLnZhbHVlLFxyXG4gICAgICAgIG1vZGlmaWVyS2V5OiAnbm9uZScsXHJcbiAgICAgICAgc2VsZWN0aW9uTW9kZTogJ2NvbnRhaW5zJ1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYW1lcmFDb250cm9sbGVyKCkuZW5hYmxlZCA9ICF3aW5kb3dTZWxlY3Rpb24uZW5hYmxlZC52YWx1ZVxyXG4gIH1cclxuXHJcbiAgd2F0Y2god2luZG93U2VsZWN0aW9uLmVuYWJsZWQsIGFwcGx5V2luZG93U2VsZWN0aW9uT3B0aW9ucywgeyBpbW1lZGlhdGU6IHRydWUgfSlcclxuXHJcbiAgY29uc3QgdG9Db21wYWN0U2VsZWN0aW9uT2JqZWN0ID0gKG9iamVjdElkOiBzdHJpbmcpOiBTcGVja2xlT2JqZWN0ID0+ICh7XHJcbiAgICBpZDogb2JqZWN0SWQsXHJcbiAgICBzcGVja2xlX3R5cGU6ICdCYXNlJyxcclxuICAgIG5hbWU6IG9iamVjdElkXHJcbiAgfSlcclxuXHJcbiAgY29uc3Qgb25TZWxlY3Rpb25DaGFuZ2VkID0gKHtcclxuICAgIG9iamVjdHMsXHJcbiAgICBvYmplY3RJZHNcclxuICB9OiB7XHJcbiAgICBvYmplY3RzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cclxuICAgIG9iamVjdElkczogc3RyaW5nW11cclxuICB9KSA9PiB7XHJcbiAgICBpZiAoIXdpbmRvd1NlbGVjdGlvbi5lbmFibGVkLnZhbHVlKSByZXR1cm5cclxuICAgIHNlbGVjdGVkT2JqZWN0cy52YWx1ZSA9IG9iamVjdHMubGVuZ3RoXHJcbiAgICAgID8gb2JqZWN0cy5tYXAoKG9iaikgPT4gdG9JZmNFbGVtZW50U2VsZWN0aW9uT2JqZWN0KG9iaiBhcyBTcGVja2xlT2JqZWN0KSlcclxuICAgICAgOiBvYmplY3RJZHMubWFwKHRvQ29tcGFjdFNlbGVjdGlvbk9iamVjdClcclxuICB9XHJcblxyXG4gIHZpZXdlckluaXRpYWxpemVkLnRoZW4oKCkgPT4ge1xyXG4gICAgYXBwbHlXaW5kb3dTZWxlY3Rpb25PcHRpb25zKClcclxuICAgIHNlbGVjdGlvbkV4dGVuc2lvbigpLm9uKFxyXG4gICAgICBTZWxlY3Rpb25FeHRlbnNpb25FdmVudC5TZWxlY3Rpb25DaGFuZ2VkLFxyXG4gICAgICBvblNlbGVjdGlvbkNoYW5nZWRcclxuICAgIClcclxuICB9KVxyXG5cclxuICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xyXG4gICAgc2VsZWN0aW9uRXh0ZW5zaW9uKCkucmVtb3ZlTGlzdGVuZXIoXHJcbiAgICAgIFNlbGVjdGlvbkV4dGVuc2lvbkV2ZW50LlNlbGVjdGlvbkNoYW5nZWQsXHJcbiAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlZFxyXG4gICAgKVxyXG4gICAgd2luZG93U2VsZWN0aW9uLmVuYWJsZWQudmFsdWUgPSBmYWxzZVxyXG4gICAgYXBwbHlXaW5kb3dTZWxlY3Rpb25PcHRpb25zKClcclxuICB9KVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlVmlld2VyU2VsZWN0aW9uRXZlbnRIYW5kbGVyKCkge1xyXG4gIHVzZUNvbGxlY3RTZWxlY3Rpb24oKVxyXG4gIHVzZVNlbGVjdE9yWm9vbU9uU2VsZWN0aW9uKClcclxuICB1c2VXaW5kb3dTZWxlY3Rpb25JbnRlZ3JhdGlvbigpXHJcbn1cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAvc2VsZWN0aW9uLnRzIn0=