@zsviczian/excalidraw 0.10.0-textfix-3 → 0.10.0-textfix-4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -2542,7 +2542,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2542
2542
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2543
2543
|
|
|
2544
2544
|
"use strict";
|
|
2545
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"textWysiwyg\": () => (/* binding */ textWysiwyg)\n/* harmony export */ });\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst normalizeText = (text) => {\r\n return (text\r\n // replace tabs with spaces so they render and measure correctly\r\n .replace(/\\t/g, \" \")\r\n // normalize newlines\r\n .replace(/\\r?\\n|\\r/g, \"\\n\"));\r\n};\r\nconst getTransform = (width, height, angle, appState, maxWidth, maxHeight) => {\r\n const { zoom, offsetTop, offsetLeft } = appState;\r\n const degree = (180 * angle) / Math.PI;\r\n // offsets must be multiplied by 2 to account for the division by 2 of\r\n // the whole expression afterwards\r\n let translateX = ((width - offsetLeft * 2) * (zoom.value - 1)) / 2;\r\n let translateY = ((height - offsetTop * 2) * (zoom.value - 1)) / 2;\r\n if (width > maxWidth && zoom.value !== 1) {\r\n translateX = ((maxWidth - offsetLeft * 2) * (zoom.value - 1)) / 2;\r\n }\r\n if (height > maxHeight && zoom.value !== 1) {\r\n translateY = ((maxHeight - offsetTop * 2) * (zoom.value - 1)) / 2;\r\n }\r\n return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\r\n};\r\nconst textWysiwyg = ({ id, appState, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, }) => {\r\n const textPropertiesUpdated = (updatedElement, editable) => {\r\n const currentFont = editable.style.fontFamily.replaceAll('\"', \"\");\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({ fontFamily: updatedElement.fontFamily }) !==\r\n currentFont) {\r\n return true;\r\n }\r\n if (`${updatedElement.fontSize}px` !== editable.style.fontSize) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n let originalContainerHeight;\r\n let approxLineHeight = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(element)\r\n ? (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element))\r\n : 0;\r\n const updateWysiwygStyle = () => {\r\n var _a, _b;\r\n const updatedElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\r\n if (updatedElement && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedElement)) {\r\n let coordX = updatedElement.x;\r\n let coordY = updatedElement.y;\r\n let container = (updatedElement === null || updatedElement === void 0 ? void 0 : updatedElement.containerId)\r\n ? _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(updatedElement).getElement(updatedElement.containerId)\r\n : null;\r\n let maxWidth = updatedElement.width;\r\n let maxHeight = updatedElement.height;\r\n let width = updatedElement.width;\r\n const height = editable.scrollHeight === 0\r\n ? updatedElement.height\r\n : editable.scrollHeight;\r\n if (container && updatedElement.containerId) {\r\n const propertiesUpdated = textPropertiesUpdated(updatedElement, editable);\r\n if (propertiesUpdated) {\r\n const currentContainer = (_b = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(updatedElement)) === null || _b === void 0 ? void 0 : _b.getElement(updatedElement.containerId);\r\n approxLineHeight = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedElement)\r\n ? (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement))\r\n : 0;\r\n if (updatedElement.height > currentContainer.height - _constants__WEBPACK_IMPORTED_MODULE_4__.PADDING * 2) {\r\n const nextHeight = updatedElement.height + _constants__WEBPACK_IMPORTED_MODULE_4__.PADDING * 2;\r\n originalContainerHeight = nextHeight;\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: nextHeight });\r\n container = Object.assign(Object.assign({}, container), { height: nextHeight });\r\n }\r\n editable.style.height = `${updatedElement.height}px`;\r\n }\r\n if (!originalContainerHeight) {\r\n originalContainerHeight = container.height;\r\n }\r\n maxWidth = container.width - _constants__WEBPACK_IMPORTED_MODULE_4__.PADDING * 2;\r\n maxHeight = container.height - _constants__WEBPACK_IMPORTED_MODULE_4__.PADDING * 2;\r\n width = maxWidth;\r\n // The coordinates of text box set a distance of\r\n // 30px to preserve padding\r\n coordX = container.x + _constants__WEBPACK_IMPORTED_MODULE_4__.PADDING;\r\n // autogrow container height if text exceeds\r\n if (editable.scrollHeight > maxHeight) {\r\n const diff = Math.min(editable.scrollHeight - maxHeight, approxLineHeight);\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: container.height + diff });\r\n return;\r\n }\r\n else if (\r\n // autoshrink container height until original container height\r\n // is reached when text is removed\r\n container.height > originalContainerHeight &&\r\n editable.scrollHeight < maxHeight) {\r\n const diff = Math.min(maxHeight - editable.scrollHeight, approxLineHeight);\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: container.height - diff });\r\n }\r\n // Start pushing text upward until a diff of 30px (padding)\r\n // is reached\r\n else {\r\n const lines = editable.scrollHeight / approxLineHeight;\r\n if (lines > 1 || propertiesUpdated) {\r\n // vertically center align the text\r\n coordY =\r\n container.y + container.height / 2 - editable.scrollHeight / 2;\r\n }\r\n }\r\n }\r\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\r\n const { textAlign, angle } = updatedElement;\r\n editable.value = updatedElement.originalText || updatedElement.text;\r\n const lines = updatedElement.originalText.split(\"\\n\");\r\n const lineHeight = updatedElement.containerId\r\n ? approxLineHeight\r\n : updatedElement.height / lines.length;\r\n if (!container) {\r\n maxWidth =\r\n (appState.width -\r\n 8 -\r\n ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.sceneCoordsToViewportCoords)({ sceneX: coordX, sceneY: coordY }, appState).x\r\n - appState.offsetLeft)) /\r\n appState.zoom.value -\r\n // margin-right of parent if any\r\n Number(getComputedStyle(excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.parentNode).marginRight.slice(0, -2));\r\n /*\r\n (appState.offsetLeft + appState.width - viewportX - 8) /\r\n appState.zoom.value -\r\n // margin-right of parent if any\r\n Number(\r\n getComputedStyle(\r\n excalidrawContainer?.parentNode as Element,\r\n ).marginRight.slice(0, -2),\r\n );*/\r\n }\r\n // Make sure text editor height doesn't go beyond viewport\r\n const editorMaxHeight = (appState.height -\r\n viewportY -\r\n // There is a ~14px difference which keeps on increasing\r\n // with every zoom step when offset present hence I am subtracting it here\r\n // However this is not the best fix and breaks in\r\n // few scenarios\r\n (appState.offsetTop\r\n ? ((appState.zoom.value * 100 - 100) / 10) * 14\r\n : 0)) /\r\n appState.zoom.value;\r\n Object.assign(editable.style, {\r\n font: (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement),\r\n // must be defined *after* font ¯\\_(ツ)_/¯\r\n lineHeight: `${lineHeight}px`,\r\n width: `${width}px`,\r\n height: `${height}px`,\r\n left: `${viewportX}px`,\r\n top: `${viewportY}px`,\r\n transform: getTransform(width, height, angle, appState, maxWidth, editorMaxHeight),\r\n textAlign,\r\n color: updatedElement.strokeColor,\r\n opacity: updatedElement.opacity / 100,\r\n filter: \"var(--theme-filter)\",\r\n maxWidth: `${maxWidth}px`,\r\n maxHeight: `${editorMaxHeight}px`,\r\n });\r\n }\r\n };\r\n const editable = document.createElement(\"textarea\");\r\n editable.dir = \"auto\";\r\n editable.tabIndex = 0;\r\n editable.dataset.type = \"wysiwyg\";\r\n // prevent line wrapping on Safari\r\n editable.wrap = \"off\";\r\n editable.classList.add(\"excalidraw-wysiwyg\");\r\n let whiteSpace = \"pre\";\r\n let wordBreak = \"normal\";\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\r\n whiteSpace = \"pre-wrap\";\r\n wordBreak = \"break-word\";\r\n }\r\n Object.assign(editable.style, {\r\n position: \"absolute\",\r\n display: \"inline-block\",\r\n minHeight: \"1em\",\r\n backfaceVisibility: \"hidden\",\r\n margin: 0,\r\n padding: 0,\r\n border: 0,\r\n outline: 0,\r\n resize: \"none\",\r\n background: \"transparent\",\r\n overflow: \"hidden\",\r\n // must be specified because in dark mode canvas creates a stacking context\r\n zIndex: \"var(--zIndex-wysiwyg)\",\r\n wordBreak,\r\n // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\r\n whiteSpace,\r\n overflowWrap: \"break-word\",\r\n });\r\n updateWysiwygStyle();\r\n if (onChange) {\r\n editable.oninput = () => {\r\n const lines = editable.scrollHeight / approxLineHeight;\r\n // auto increase height only when lines > 1 so its\r\n // measured correctly and vertically alignes for\r\n // first line as well as setting height to \"auto\"\r\n // doubles the height as soon as user starts typing\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element) && lines > 1) {\r\n editable.style.height = \"auto\";\r\n editable.style.height = `${editable.scrollHeight}px`;\r\n }\r\n onChange(normalizeText(editable.value));\r\n };\r\n }\r\n editable.onkeydown = (event) => {\r\n event.stopPropagation();\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ESCAPE) {\r\n event.preventDefault();\r\n submittedViaKeyboard = true;\r\n handleSubmit();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ENTER && event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD]) {\r\n event.preventDefault();\r\n if (event.isComposing || event.keyCode === 229) {\r\n return;\r\n }\r\n submittedViaKeyboard = true;\r\n handleSubmit();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.TAB ||\r\n (event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] &&\r\n (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT ||\r\n event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_RIGHT))) {\r\n event.preventDefault();\r\n if (event.shiftKey || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT) {\r\n outdent();\r\n }\r\n else {\r\n indent();\r\n }\r\n // We must send an input event to resize the element\r\n editable.dispatchEvent(new Event(\"input\"));\r\n }\r\n };\r\n const TAB_SIZE = 4;\r\n const TAB = \" \".repeat(TAB_SIZE);\r\n const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\r\n const indent = () => {\r\n const { selectionStart, selectionEnd } = editable;\r\n const linesStartIndices = getSelectedLinesStartIndices();\r\n let value = editable.value;\r\n linesStartIndices.forEach((startIndex) => {\r\n const startValue = value.slice(0, startIndex);\r\n const endValue = value.slice(startIndex);\r\n value = `${startValue}${TAB}${endValue}`;\r\n });\r\n editable.value = value;\r\n editable.selectionStart = selectionStart + TAB_SIZE;\r\n editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\r\n };\r\n const outdent = () => {\r\n const { selectionStart, selectionEnd } = editable;\r\n const linesStartIndices = getSelectedLinesStartIndices();\r\n const removedTabs = [];\r\n let value = editable.value;\r\n linesStartIndices.forEach((startIndex) => {\r\n const tabMatch = value\r\n .slice(startIndex, startIndex + TAB_SIZE)\r\n .match(RE_LEADING_TAB);\r\n if (tabMatch) {\r\n const startValue = value.slice(0, startIndex);\r\n const endValue = value.slice(startIndex + tabMatch[0].length);\r\n // Delete a tab from the line\r\n value = `${startValue}${endValue}`;\r\n removedTabs.push(startIndex);\r\n }\r\n });\r\n editable.value = value;\r\n if (removedTabs.length) {\r\n if (selectionStart > removedTabs[removedTabs.length - 1]) {\r\n editable.selectionStart = Math.max(selectionStart - TAB_SIZE, removedTabs[removedTabs.length - 1]);\r\n }\r\n else {\r\n // If the cursor is before the first tab removed, ex:\r\n // Line| #1\r\n // Line #2\r\n // Lin|e #3\r\n // we should reset the selectionStart to his initial value.\r\n editable.selectionStart = selectionStart;\r\n }\r\n editable.selectionEnd = Math.max(editable.selectionStart, selectionEnd - TAB_SIZE * removedTabs.length);\r\n }\r\n };\r\n /**\r\n * @returns indeces of start positions of selected lines, in reverse order\r\n */\r\n const getSelectedLinesStartIndices = () => {\r\n let { selectionStart, selectionEnd, value } = editable;\r\n // chars before selectionStart on the same line\r\n const startOffset = value.slice(0, selectionStart).match(/[^\\n]*$/)[0]\r\n .length;\r\n // put caret at the start of the line\r\n selectionStart = selectionStart - startOffset;\r\n const selected = value.slice(selectionStart, selectionEnd);\r\n return selected\r\n .split(\"\\n\")\r\n .reduce((startIndices, line, idx, lines) => startIndices.concat(idx\r\n ? // curr line index is prev line's start + prev line's length + \\n\r\n startIndices[idx - 1] + lines[idx - 1].length + 1\r\n : // first selected line\r\n selectionStart), [])\r\n .reverse();\r\n };\r\n const stopEvent = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n };\r\n // using a state variable instead of passing it to the handleSubmit callback\r\n // so that we don't need to create separate a callback for event handlers\r\n let submittedViaKeyboard = false;\r\n const handleSubmit = () => {\r\n var _a, _b;\r\n // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\r\n // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\r\n // wysiwyg on update\r\n cleanup();\r\n const updateElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.id);\r\n if (!updateElement) {\r\n return;\r\n }\r\n let wrappedText = \"\";\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updateElement) && (updateElement === null || updateElement === void 0 ? void 0 : updateElement.containerId)) {\r\n const container = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(updateElement).getElement(updateElement.containerId);\r\n if (container) {\r\n wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updateElement), container.width);\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updateElement) && updateElement.containerId) {\r\n const editorHeight = Number(editable.style.height.slice(0, -2));\r\n if (editable.value) {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updateElement, {\r\n // vertically center align\r\n y: container.y + container.height / 2 - editorHeight / 2,\r\n height: editorHeight,\r\n width: Number(editable.style.width.slice(0, -2)),\r\n // preserve padding\r\n x: container.x + _constants__WEBPACK_IMPORTED_MODULE_4__.PADDING,\r\n });\r\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementId)(container);\r\n if (!boundTextElementId || boundTextElementId !== element.id) {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\r\n boundElements: (container.boundElements || []).concat({\r\n type: \"text\",\r\n id: element.id,\r\n }),\r\n });\r\n }\r\n }\r\n else {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\r\n boundElements: (_b = container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => ele.type !== \"text\"),\r\n });\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n wrappedText = editable.value;\r\n }\r\n onSubmit({\r\n text: normalizeText(wrappedText),\r\n viaKeyboard: submittedViaKeyboard,\r\n originalText: editable.value,\r\n });\r\n };\r\n const cleanup = () => {\r\n if (isDestroyed) {\r\n return;\r\n }\r\n isDestroyed = true;\r\n // remove events to ensure they don't late-fire\r\n editable.onblur = null;\r\n editable.oninput = null;\r\n editable.onkeydown = null;\r\n if (observer) {\r\n observer.disconnect();\r\n }\r\n window.removeEventListener(\"resize\", updateWysiwygStyle);\r\n window.removeEventListener(\"wheel\", stopEvent, true);\r\n window.removeEventListener(\"pointerdown\", onPointerDown);\r\n window.removeEventListener(\"pointerup\", bindBlurEvent);\r\n window.removeEventListener(\"blur\", handleSubmit);\r\n unbindUpdate();\r\n editable.remove();\r\n };\r\n const bindBlurEvent = (event) => {\r\n window.removeEventListener(\"pointerup\", bindBlurEvent);\r\n // Deferred so that the pointerdown that initiates the wysiwyg doesn't\r\n // trigger the blur on ensuing pointerup.\r\n // Also to handle cases such as picking a color which would trigger a blur\r\n // in that same tick.\r\n const target = event === null || event === void 0 ? void 0 : event.target;\r\n const isTargetColorPicker = target instanceof HTMLInputElement &&\r\n target.closest(\".color-picker-input\") &&\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\r\n setTimeout(() => {\r\n editable.onblur = handleSubmit;\r\n if (target && isTargetColorPicker) {\r\n target.onblur = () => {\r\n editable.focus();\r\n };\r\n }\r\n // case: clicking on the same property → no change → no update → no focus\r\n if (!isTargetColorPicker) {\r\n editable.focus();\r\n }\r\n });\r\n };\r\n // prevent blur when changing properties from the menu\r\n const onPointerDown = (event) => {\r\n const isTargetColorPicker = event.target instanceof HTMLInputElement &&\r\n event.target.closest(\".color-picker-input\") &&\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\r\n if (((event.target instanceof HTMLElement ||\r\n event.target instanceof SVGElement) &&\r\n event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) &&\r\n !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target)) ||\r\n isTargetColorPicker) {\r\n editable.onblur = null;\r\n window.addEventListener(\"pointerup\", bindBlurEvent);\r\n // handle edge-case where pointerup doesn't fire e.g. due to user\r\n // alt-tabbing away\r\n window.addEventListener(\"blur\", handleSubmit);\r\n }\r\n };\r\n // handle updates of textElement properties of editing element\r\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element).addCallback(() => {\r\n var _a;\r\n updateWysiwygStyle();\r\n const isColorPickerActive = !!((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(\".color-picker-input\"));\r\n if (!isColorPickerActive) {\r\n editable.focus();\r\n }\r\n });\r\n // ---------------------------------------------------------------------------\r\n let isDestroyed = false;\r\n // select on init (focusing is done separately inside the bindBlurEvent()\r\n // because we need it to happen *after* the blur event from `pointerdown`)\r\n editable.select();\r\n bindBlurEvent();\r\n // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\r\n // is preferred so we catch changes from host, where window may not resize.\r\n let observer = null;\r\n if (canvas && \"ResizeObserver\" in window) {\r\n observer = new window.ResizeObserver(() => {\r\n updateWysiwygStyle();\r\n });\r\n observer.observe(canvas);\r\n }\r\n else {\r\n window.addEventListener(\"resize\", updateWysiwygStyle);\r\n }\r\n window.addEventListener(\"pointerdown\", onPointerDown);\r\n window.addEventListener(\"wheel\", stopEvent, {\r\n passive: false,\r\n capture: true,\r\n });\r\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.querySelector(\".excalidraw-textEditorContainer\").appendChild(editable);\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Li8uLi9lbGVtZW50L3RleHRXeXNpd3lnLnRzeD84ZjRkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENPREVTLCBLRVlTIH0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCB7XG4gIGlzV3JpdGFibGVFbGVtZW50LFxuICBnZXRGb250U3RyaW5nLFxuICBnZXRGb250RmFtaWx5U3RyaW5nLFxuICBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMsXG59IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgaXNCb3VuZFRvQ29udGFpbmVyLCBpc1RleHRFbGVtZW50IH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgQ0xBU1NFUywgUEFERElORyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGdldEFwcHJveExpbmVIZWlnaHQsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgd3JhcFRleHQsXG59IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5cbmNvbnN0IG5vcm1hbGl6ZVRleHQgPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gIHJldHVybiAoXG4gICAgdGV4dFxuICAgICAgLy8gcmVwbGFjZSB0YWJzIHdpdGggc3BhY2VzIHNvIHRoZXkgcmVuZGVyIGFuZCBtZWFzdXJlIGNvcnJlY3RseVxuICAgICAgLnJlcGxhY2UoL1xcdC9nLCBcIiAgICAgICAgXCIpXG4gICAgICAvLyBub3JtYWxpemUgbmV3bGluZXNcbiAgICAgIC5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIlxcblwiKVxuICApO1xufTtcblxuY29uc3QgZ2V0VHJhbnNmb3JtID0gKFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgYW5nbGU6IG51bWJlcixcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBtYXhXaWR0aDogbnVtYmVyLFxuICBtYXhIZWlnaHQ6IG51bWJlcixcbikgPT4ge1xuICBjb25zdCB7IHpvb20sIG9mZnNldFRvcCwgb2Zmc2V0TGVmdCB9ID0gYXBwU3RhdGU7XG4gIGNvbnN0IGRlZ3JlZSA9ICgxODAgKiBhbmdsZSkgLyBNYXRoLlBJO1xuICAvLyBvZmZzZXRzIG11c3QgYmUgbXVsdGlwbGllZCBieSAyIHRvIGFjY291bnQgZm9yIHRoZSBkaXZpc2lvbiBieSAyIG9mXG4gIC8vIHRoZSB3aG9sZSBleHByZXNzaW9uIGFmdGVyd2FyZHNcbiAgbGV0IHRyYW5zbGF0ZVggPSAoKHdpZHRoIC0gb2Zmc2V0TGVmdCAqIDIpICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICBsZXQgdHJhbnNsYXRlWSA9ICgoaGVpZ2h0IC0gb2Zmc2V0VG9wICogMikgKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIGlmICh3aWR0aCA+IG1heFdpZHRoICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVYID0gKChtYXhXaWR0aCAtIG9mZnNldExlZnQgKiAyKSAqICh6b29tLnZhbHVlIC0gMSkpIC8gMlxuICB9XG4gIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQgJiYgem9vbS52YWx1ZSAhPT0gMSkge1xuICAgIHRyYW5zbGF0ZVkgPSAoKG1heEhlaWdodCAtIG9mZnNldFRvcCAqIDIpICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICB9XG4gIHJldHVybiBgdHJhbnNsYXRlKCR7dHJhbnNsYXRlWH1weCwgJHt0cmFuc2xhdGVZfXB4KSBzY2FsZSgke3pvb20udmFsdWV9KSByb3RhdGUoJHtkZWdyZWV9ZGVnKWA7XG59O1xuXG5leHBvcnQgY29uc3QgdGV4dFd5c2l3eWcgPSAoe1xuICBpZCxcbiAgYXBwU3RhdGUsXG4gIG9uQ2hhbmdlLFxuICBvblN1Ym1pdCxcbiAgZ2V0Vmlld3BvcnRDb29yZHMsXG4gIGVsZW1lbnQsXG4gIGNhbnZhcyxcbiAgZXhjYWxpZHJhd0NvbnRhaW5lcixcbn06IHtcbiAgaWQ6IEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl07XG4gIGFwcFN0YXRlOiBBcHBTdGF0ZTtcbiAgb25DaGFuZ2U/OiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBvblN1Ym1pdDogKGRhdGE6IHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgdmlhS2V5Ym9hcmQ6IGJvb2xlYW47XG4gICAgb3JpZ2luYWxUZXh0OiBzdHJpbmc7XG4gIH0pID0+IHZvaWQ7XG4gIGdldFZpZXdwb3J0Q29vcmRzOiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IFtudW1iZXIsIG51bWJlcl07XG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50O1xuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbDtcbiAgZXhjYWxpZHJhd0NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsO1xufSkgPT4ge1xuICBjb25zdCB0ZXh0UHJvcGVydGllc1VwZGF0ZWQgPSAoXG4gICAgdXBkYXRlZEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgICBlZGl0YWJsZTogSFRNTFRleHRBcmVhRWxlbWVudCxcbiAgKSA9PiB7XG4gICAgY29uc3QgY3VycmVudEZvbnQgPSBlZGl0YWJsZS5zdHlsZS5mb250RmFtaWx5LnJlcGxhY2VBbGwoJ1wiJywgXCJcIik7XG4gICAgaWYgKFxuICAgICAgZ2V0Rm9udEZhbWlseVN0cmluZyh7IGZvbnRGYW1pbHk6IHVwZGF0ZWRFbGVtZW50LmZvbnRGYW1pbHkgfSkgIT09XG4gICAgICBjdXJyZW50Rm9udFxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChgJHt1cGRhdGVkRWxlbWVudC5mb250U2l6ZX1weGAgIT09IGVkaXRhYmxlLnN0eWxlLmZvbnRTaXplKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICBsZXQgb3JpZ2luYWxDb250YWluZXJIZWlnaHQ6IG51bWJlcjtcbiAgbGV0IGFwcHJveExpbmVIZWlnaHQgPSBpc1RleHRFbGVtZW50KGVsZW1lbnQpXG4gICAgPyBnZXRBcHByb3hMaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcoZWxlbWVudCkpXG4gICAgOiAwO1xuXG4gIGNvbnN0IHVwZGF0ZVd5c2l3eWdTdHlsZSA9ICgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVkRWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KGlkKTtcbiAgICBpZiAodXBkYXRlZEVsZW1lbnQgJiYgaXNUZXh0RWxlbWVudCh1cGRhdGVkRWxlbWVudCkpIHtcbiAgICAgIGxldCBjb29yZFggPSB1cGRhdGVkRWxlbWVudC54O1xuICAgICAgbGV0IGNvb3JkWSA9IHVwZGF0ZWRFbGVtZW50Lnk7XG4gICAgICBsZXQgY29udGFpbmVyID0gdXBkYXRlZEVsZW1lbnQ/LmNvbnRhaW5lcklkXG4gICAgICAgID8gU2NlbmUuZ2V0U2NlbmUodXBkYXRlZEVsZW1lbnQpIS5nZXRFbGVtZW50KHVwZGF0ZWRFbGVtZW50LmNvbnRhaW5lcklkKVxuICAgICAgICA6IG51bGw7XG4gICAgICBsZXQgbWF4V2lkdGggPSB1cGRhdGVkRWxlbWVudC53aWR0aDtcblxuICAgICAgbGV0IG1heEhlaWdodCA9IHVwZGF0ZWRFbGVtZW50LmhlaWdodDtcbiAgICAgIGxldCB3aWR0aCA9IHVwZGF0ZWRFbGVtZW50LndpZHRoO1xuICAgICAgY29uc3QgaGVpZ2h0ID1cbiAgICAgICAgZWRpdGFibGUuc2Nyb2xsSGVpZ2h0ID09PSAwXG4gICAgICAgICAgPyB1cGRhdGVkRWxlbWVudC5oZWlnaHRcbiAgICAgICAgICA6IGVkaXRhYmxlLnNjcm9sbEhlaWdodDtcbiAgICAgIGlmIChjb250YWluZXIgJiYgdXBkYXRlZEVsZW1lbnQuY29udGFpbmVySWQpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydGllc1VwZGF0ZWQgPSB0ZXh0UHJvcGVydGllc1VwZGF0ZWQoXG4gICAgICAgICAgdXBkYXRlZEVsZW1lbnQsXG4gICAgICAgICAgZWRpdGFibGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHByb3BlcnRpZXNVcGRhdGVkKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudENvbnRhaW5lciA9IFNjZW5lLmdldFNjZW5lKHVwZGF0ZWRFbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgICAgICAgIHVwZGF0ZWRFbGVtZW50LmNvbnRhaW5lcklkLFxuICAgICAgICAgICkgYXMgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudDtcbiAgICAgICAgICBhcHByb3hMaW5lSGVpZ2h0ID0gaXNUZXh0RWxlbWVudCh1cGRhdGVkRWxlbWVudClcbiAgICAgICAgICAgID8gZ2V0QXBwcm94TGluZUhlaWdodChnZXRGb250U3RyaW5nKHVwZGF0ZWRFbGVtZW50KSlcbiAgICAgICAgICAgIDogMDtcbiAgICAgICAgICBpZiAodXBkYXRlZEVsZW1lbnQuaGVpZ2h0ID4gY3VycmVudENvbnRhaW5lci5oZWlnaHQgLSBQQURESU5HICogMikge1xuICAgICAgICAgICAgY29uc3QgbmV4dEhlaWdodCA9IHVwZGF0ZWRFbGVtZW50LmhlaWdodCArIFBBRERJTkcgKiAyO1xuICAgICAgICAgICAgb3JpZ2luYWxDb250YWluZXJIZWlnaHQgPSBuZXh0SGVpZ2h0O1xuICAgICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBuZXh0SGVpZ2h0IH0pO1xuICAgICAgICAgICAgY29udGFpbmVyID0geyAuLi5jb250YWluZXIsIGhlaWdodDogbmV4dEhlaWdodCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlZGl0YWJsZS5zdHlsZS5oZWlnaHQgPSBgJHt1cGRhdGVkRWxlbWVudC5oZWlnaHR9cHhgO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3JpZ2luYWxDb250YWluZXJIZWlnaHQpIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgbWF4V2lkdGggPSBjb250YWluZXIud2lkdGggLSBQQURESU5HICogMjtcbiAgICAgICAgbWF4SGVpZ2h0ID0gY29udGFpbmVyLmhlaWdodCAtIFBBRERJTkcgKiAyO1xuICAgICAgICB3aWR0aCA9IG1heFdpZHRoO1xuICAgICAgICAvLyBUaGUgY29vcmRpbmF0ZXMgb2YgdGV4dCBib3ggc2V0IGEgZGlzdGFuY2Ugb2ZcbiAgICAgICAgLy8gMzBweCB0byBwcmVzZXJ2ZSBwYWRkaW5nXG4gICAgICAgIGNvb3JkWCA9IGNvbnRhaW5lci54ICsgUEFERElORztcblxuICAgICAgICAvLyBhdXRvZ3JvdyBjb250YWluZXIgaGVpZ2h0IGlmIHRleHQgZXhjZWVkc1xuICAgICAgICBpZiAoZWRpdGFibGUuc2Nyb2xsSGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGgubWluKFxuICAgICAgICAgICAgZWRpdGFibGUuc2Nyb2xsSGVpZ2h0IC0gbWF4SGVpZ2h0LFxuICAgICAgICAgICAgYXBwcm94TGluZUhlaWdodCxcbiAgICAgICAgICApO1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7IGhlaWdodDogY29udGFpbmVyLmhlaWdodCArIGRpZmYgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vIGF1dG9zaHJpbmsgY29udGFpbmVyIGhlaWdodCB1bnRpbCBvcmlnaW5hbCBjb250YWluZXIgaGVpZ2h0XG4gICAgICAgICAgLy8gaXMgcmVhY2hlZCB3aGVuIHRleHQgaXMgcmVtb3ZlZFxuICAgICAgICAgIGNvbnRhaW5lci5oZWlnaHQgPiBvcmlnaW5hbENvbnRhaW5lckhlaWdodCAmJlxuICAgICAgICAgIGVkaXRhYmxlLnNjcm9sbEhlaWdodCA8IG1heEhlaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4oXG4gICAgICAgICAgICBtYXhIZWlnaHQgLSBlZGl0YWJsZS5zY3JvbGxIZWlnaHQsXG4gICAgICAgICAgICBhcHByb3hMaW5lSGVpZ2h0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBjb250YWluZXIuaGVpZ2h0IC0gZGlmZiB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGFydCBwdXNoaW5nIHRleHQgdXB3YXJkIHVudGlsIGEgZGlmZiBvZiAzMHB4IChwYWRkaW5nKVxuICAgICAgICAvLyBpcyByZWFjaGVkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGxpbmVzID0gZWRpdGFibGUuc2Nyb2xsSGVpZ2h0IC8gYXBwcm94TGluZUhlaWdodDtcblxuICAgICAgICAgIGlmIChsaW5lcyA+IDEgfHwgcHJvcGVydGllc1VwZGF0ZWQpIHtcbiAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgY2VudGVyIGFsaWduIHRoZSB0ZXh0XG4gICAgICAgICAgICBjb29yZFkgPVxuICAgICAgICAgICAgICBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyIC0gZWRpdGFibGUuc2Nyb2xsSGVpZ2h0IC8gMjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IFt2aWV3cG9ydFgsIHZpZXdwb3J0WV0gPSBnZXRWaWV3cG9ydENvb3Jkcyhjb29yZFgsIGNvb3JkWSk7XG4gICAgICBjb25zdCB7IHRleHRBbGlnbiwgYW5nbGUgfSA9IHVwZGF0ZWRFbGVtZW50O1xuXG4gICAgICBlZGl0YWJsZS52YWx1ZSA9IHVwZGF0ZWRFbGVtZW50Lm9yaWdpbmFsVGV4dCB8fCB1cGRhdGVkRWxlbWVudC50ZXh0O1xuICAgICAgY29uc3QgbGluZXMgPSB1cGRhdGVkRWxlbWVudC5vcmlnaW5hbFRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuY29udGFpbmVySWRcbiAgICAgICAgPyBhcHByb3hMaW5lSGVpZ2h0XG4gICAgICAgIDogdXBkYXRlZEVsZW1lbnQuaGVpZ2h0IC8gbGluZXMubGVuZ3RoO1xuICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgbWF4V2lkdGggPVxuICAgICAgICAgIChhcHBTdGF0ZS53aWR0aCAtXG4gICAgICAgICAgICA4IC1cbiAgICAgICAgICAgIChzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMoe3NjZW5lWDpjb29yZFgsc2NlbmVZOmNvb3JkWX0sYXBwU3RhdGUpLnggXG4gICAgICAgICAgICAtIGFwcFN0YXRlLm9mZnNldExlZnQpKSAvXG4gICAgICAgICAgICBhcHBTdGF0ZS56b29tLnZhbHVlIC1cbiAgICAgICAgICAvLyBtYXJnaW4tcmlnaHQgb2YgcGFyZW50IGlmIGFueVxuICAgICAgICAgIE51bWJlcihcbiAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoXG4gICAgICAgICAgICAgIGV4Y2FsaWRyYXdDb250YWluZXI/LnBhcmVudE5vZGUgYXMgRWxlbWVudCxcbiAgICAgICAgICAgICkubWFyZ2luUmlnaHQuc2xpY2UoMCwgLTIpLFxuICAgICAgICAgICk7XG5cbi8qXG4gICAgICAgICAgKGFwcFN0YXRlLm9mZnNldExlZnQgKyBhcHBTdGF0ZS53aWR0aCAtIHZpZXdwb3J0WCAtIDgpIC9cbiAgICAgICAgICAgIGFwcFN0YXRlLnpvb20udmFsdWUgLVxuICAgICAgICAgIC8vIG1hcmdpbi1yaWdodCBvZiBwYXJlbnQgaWYgYW55XG4gICAgICAgICAgTnVtYmVyKFxuICAgICAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShcbiAgICAgICAgICAgICAgZXhjYWxpZHJhd0NvbnRhaW5lcj8ucGFyZW50Tm9kZSBhcyBFbGVtZW50LFxuICAgICAgICAgICAgKS5tYXJnaW5SaWdodC5zbGljZSgwLCAtMiksXG4gICAgICAgICAgKTsqL1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgdGV4dCBlZGl0b3IgaGVpZ2h0IGRvZXNuJ3QgZ28gYmV5b25kIHZpZXdwb3J0XG4gICAgICBjb25zdCBlZGl0b3JNYXhIZWlnaHQgPVxuICAgICAgICAoYXBwU3RhdGUuaGVpZ2h0IC1cbiAgICAgICAgICB2aWV3cG9ydFkgLVxuICAgICAgICAgIC8vIFRoZXJlIGlzIGEgfjE0cHggZGlmZmVyZW5jZSB3aGljaCBrZWVwcyBvbiBpbmNyZWFzaW5nXG4gICAgICAgICAgLy8gd2l0aCBldmVyeSB6b29tIHN0ZXAgd2hlbiBvZmZzZXQgcHJlc2VudCBoZW5jZSBJIGFtIHN1YnRyYWN0aW5nIGl0IGhlcmVcbiAgICAgICAgICAvLyBIb3dldmVyIHRoaXMgaXMgbm90IHRoZSBiZXN0IGZpeCBhbmQgYnJlYWtzIGluXG4gICAgICAgICAgLy8gZmV3IHNjZW5hcmlvc1xuICAgICAgICAgIChhcHBTdGF0ZS5vZmZzZXRUb3BcbiAgICAgICAgICAgID8gKChhcHBTdGF0ZS56b29tLnZhbHVlICogMTAwIC0gMTAwKSAvIDEwKSAqIDE0XG4gICAgICAgICAgICA6IDApKSAvXG4gICAgICAgIGFwcFN0YXRlLnpvb20udmFsdWU7XG4gICAgICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgICAgIGZvbnQ6IGdldEZvbnRTdHJpbmcodXBkYXRlZEVsZW1lbnQpLFxuICAgICAgICAvLyBtdXN0IGJlIGRlZmluZWQgKmFmdGVyKiBmb250IMKvXFxfKOODhClfL8KvXG4gICAgICAgIGxpbmVIZWlnaHQ6IGAke2xpbmVIZWlnaHR9cHhgLFxuICAgICAgICB3aWR0aDogYCR7d2lkdGh9cHhgLFxuICAgICAgICBoZWlnaHQ6IGAke2hlaWdodH1weGAsXG4gICAgICAgIGxlZnQ6IGAke3ZpZXdwb3J0WH1weGAsXG4gICAgICAgIHRvcDogYCR7dmlld3BvcnRZfXB4YCxcbiAgICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm0oXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGFuZ2xlLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIG1heFdpZHRoLFxuICAgICAgICAgIGVkaXRvck1heEhlaWdodCxcbiAgICAgICAgKSxcbiAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICBjb2xvcjogdXBkYXRlZEVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgIG9wYWNpdHk6IHVwZGF0ZWRFbGVtZW50Lm9wYWNpdHkgLyAxMDAsXG4gICAgICAgIGZpbHRlcjogXCJ2YXIoLS10aGVtZS1maWx0ZXIpXCIsXG4gICAgICAgIG1heFdpZHRoOiBgJHttYXhXaWR0aH1weGAsXG4gICAgICAgIG1heEhlaWdodDogYCR7ZWRpdG9yTWF4SGVpZ2h0fXB4YCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBlZGl0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcblxuICBlZGl0YWJsZS5kaXIgPSBcImF1dG9cIjtcbiAgZWRpdGFibGUudGFiSW5kZXggPSAwO1xuICBlZGl0YWJsZS5kYXRhc2V0LnR5cGUgPSBcInd5c2l3eWdcIjtcbiAgLy8gcHJldmVudCBsaW5lIHdyYXBwaW5nIG9uIFNhZmFyaVxuICBlZGl0YWJsZS53cmFwID0gXCJvZmZcIjtcbiAgZWRpdGFibGUuY2xhc3NMaXN0LmFkZChcImV4Y2FsaWRyYXctd3lzaXd5Z1wiKTtcblxuICBsZXQgd2hpdGVTcGFjZSA9IFwicHJlXCI7XG4gIGxldCB3b3JkQnJlYWsgPSBcIm5vcm1hbFwiO1xuXG4gIGlmIChpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkpIHtcbiAgICB3aGl0ZVNwYWNlID0gXCJwcmUtd3JhcFwiO1xuICAgIHdvcmRCcmVhayA9IFwiYnJlYWstd29yZFwiO1xuICB9XG4gIE9iamVjdC5hc3NpZ24oZWRpdGFibGUuc3R5bGUsIHtcbiAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgbWluSGVpZ2h0OiBcIjFlbVwiLFxuICAgIGJhY2tmYWNlVmlzaWJpbGl0eTogXCJoaWRkZW5cIixcbiAgICBtYXJnaW46IDAsXG4gICAgcGFkZGluZzogMCxcbiAgICBib3JkZXI6IDAsXG4gICAgb3V0bGluZTogMCxcbiAgICByZXNpemU6IFwibm9uZVwiLFxuICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAvLyBtdXN0IGJlIHNwZWNpZmllZCBiZWNhdXNlIGluIGRhcmsgbW9kZSBjYW52YXMgY3JlYXRlcyBhIHN0YWNraW5nIGNvbnRleHRcbiAgICB6SW5kZXg6IFwidmFyKC0tekluZGV4LXd5c2l3eWcpXCIsXG4gICAgd29yZEJyZWFrLFxuICAgIC8vIHByZXZlbnQgbGluZSB3cmFwcGluZyAoYHdoaXRlc3BhY2U6IG5vd3JhcGAgZG9lc24ndCB3b3JrIG9uIEZGKVxuICAgIHdoaXRlU3BhY2UsXG4gICAgb3ZlcmZsb3dXcmFwOiBcImJyZWFrLXdvcmRcIixcbiAgfSk7XG4gIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuXG4gIGlmIChvbkNoYW5nZSkge1xuICAgIGVkaXRhYmxlLm9uaW5wdXQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBsaW5lcyA9IGVkaXRhYmxlLnNjcm9sbEhlaWdodCAvIGFwcHJveExpbmVIZWlnaHQ7XG4gICAgICAvLyBhdXRvIGluY3JlYXNlIGhlaWdodCBvbmx5IHdoZW4gbGluZXMgID4gMSBzbyBpdHNcbiAgICAgIC8vIG1lYXN1cmVkIGNvcnJlY3RseSBhbmQgdmVydGljYWxseSBhbGlnbmVzIGZvclxuICAgICAgLy8gZmlyc3QgbGluZSBhcyB3ZWxsIGFzIHNldHRpbmcgaGVpZ2h0IHRvIFwiYXV0b1wiXG4gICAgICAvLyBkb3VibGVzIHRoZSBoZWlnaHQgYXMgc29vbiBhcyB1c2VyIHN0YXJ0cyB0eXBpbmdcbiAgICAgIGlmIChpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkgJiYgbGluZXMgPiAxKSB7XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IFwiYXV0b1wiO1xuICAgICAgICBlZGl0YWJsZS5zdHlsZS5oZWlnaHQgPSBgJHtlZGl0YWJsZS5zY3JvbGxIZWlnaHR9cHhgO1xuICAgICAgfVxuICAgICAgb25DaGFuZ2Uobm9ybWFsaXplVGV4dChlZGl0YWJsZS52YWx1ZSkpO1xuICAgIH07XG4gIH1cblxuICBlZGl0YWJsZS5vbmtleWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkVTQ0FQRSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gdHJ1ZTtcbiAgICAgIGhhbmRsZVN1Ym1pdCgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkVOVEVSICYmIGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGV2ZW50LmlzQ29tcG9zaW5nIHx8IGV2ZW50LmtleUNvZGUgPT09IDIyOSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IHRydWU7XG4gICAgICBoYW5kbGVTdWJtaXQoKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZXZlbnQua2V5ID09PSBLRVlTLlRBQiB8fFxuICAgICAgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmXG4gICAgICAgIChldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX0xFRlQgfHxcbiAgICAgICAgICBldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX1JJR0hUKSlcbiAgICApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9MRUZUKSB7XG4gICAgICAgIG91dGRlbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGVudCgpO1xuICAgICAgfVxuICAgICAgLy8gV2UgbXVzdCBzZW5kIGFuIGlucHV0IGV2ZW50IHRvIHJlc2l6ZSB0aGUgZWxlbWVudFxuICAgICAgZWRpdGFibGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IFRBQl9TSVpFID0gNDtcbiAgY29uc3QgVEFCID0gXCIgXCIucmVwZWF0KFRBQl9TSVpFKTtcbiAgY29uc3QgUkVfTEVBRElOR19UQUIgPSBuZXcgUmVnRXhwKGBeIHsxLCR7VEFCX1NJWkV9fWApO1xuICBjb25zdCBpbmRlbnQgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIH0gPSBlZGl0YWJsZTtcbiAgICBjb25zdCBsaW5lc1N0YXJ0SW5kaWNlcyA9IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMoKTtcblxuICAgIGxldCB2YWx1ZSA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGxpbmVzU3RhcnRJbmRpY2VzLmZvckVhY2goKHN0YXJ0SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuICAgICAgY29uc3QgZW5kVmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4KTtcblxuICAgICAgdmFsdWUgPSBgJHtzdGFydFZhbHVlfSR7VEFCfSR7ZW5kVmFsdWV9YDtcbiAgICB9KTtcblxuICAgIGVkaXRhYmxlLnZhbHVlID0gdmFsdWU7XG5cbiAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0ICsgVEFCX1NJWkU7XG4gICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kICsgVEFCX1NJWkUgKiBsaW5lc1N0YXJ0SW5kaWNlcy5sZW5ndGg7XG4gIH07XG5cbiAgY29uc3Qgb3V0ZGVudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9IGVkaXRhYmxlO1xuICAgIGNvbnN0IGxpbmVzU3RhcnRJbmRpY2VzID0gZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcygpO1xuICAgIGNvbnN0IHJlbW92ZWRUYWJzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgbGV0IHZhbHVlID0gZWRpdGFibGUudmFsdWU7XG4gICAgbGluZXNTdGFydEluZGljZXMuZm9yRWFjaCgoc3RhcnRJbmRleCkgPT4ge1xuICAgICAgY29uc3QgdGFiTWF0Y2ggPSB2YWx1ZVxuICAgICAgICAuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIFRBQl9TSVpFKVxuICAgICAgICAubWF0Y2goUkVfTEVBRElOR19UQUIpO1xuXG4gICAgICBpZiAodGFiTWF0Y2gpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuICAgICAgICBjb25zdCBlbmRWYWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0SW5kZXggKyB0YWJNYXRjaFswXS5sZW5ndGgpO1xuXG4gICAgICAgIC8vIERlbGV0ZSBhIHRhYiBmcm9tIHRoZSBsaW5lXG4gICAgICAgIHZhbHVlID0gYCR7c3RhcnRWYWx1ZX0ke2VuZFZhbHVlfWA7XG4gICAgICAgIHJlbW92ZWRUYWJzLnB1c2goc3RhcnRJbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZGl0YWJsZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHJlbW92ZWRUYWJzLmxlbmd0aCkge1xuICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID4gcmVtb3ZlZFRhYnNbcmVtb3ZlZFRhYnMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBNYXRoLm1heChcbiAgICAgICAgICBzZWxlY3Rpb25TdGFydCAtIFRBQl9TSVpFLFxuICAgICAgICAgIHJlbW92ZWRUYWJzW3JlbW92ZWRUYWJzLmxlbmd0aCAtIDFdLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhlIGN1cnNvciBpcyBiZWZvcmUgdGhlIGZpcnN0IHRhYiByZW1vdmVkLCBleDpcbiAgICAgICAgLy8gTGluZXwgIzFcbiAgICAgICAgLy8gICAgIExpbmUgIzJcbiAgICAgICAgLy8gTGlufGUgIzNcbiAgICAgICAgLy8gd2Ugc2hvdWxkIHJlc2V0IHRoZSBzZWxlY3Rpb25TdGFydCB0byBoaXMgaW5pdGlhbCB2YWx1ZS5cbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydDtcbiAgICAgIH1cbiAgICAgIGVkaXRhYmxlLnNlbGVjdGlvbkVuZCA9IE1hdGgubWF4KFxuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgc2VsZWN0aW9uRW5kIC0gVEFCX1NJWkUgKiByZW1vdmVkVGFicy5sZW5ndGgsXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybnMgaW5kZWNlcyBvZiBzdGFydCBwb3NpdGlvbnMgb2Ygc2VsZWN0ZWQgbGluZXMsIGluIHJldmVyc2Ugb3JkZXJcbiAgICovXG4gIGNvbnN0IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMgPSAoKSA9PiB7XG4gICAgbGV0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCwgdmFsdWUgfSA9IGVkaXRhYmxlO1xuXG4gICAgLy8gY2hhcnMgYmVmb3JlIHNlbGVjdGlvblN0YXJ0IG9uIHRoZSBzYW1lIGxpbmVcbiAgICBjb25zdCBzdGFydE9mZnNldCA9IHZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvblN0YXJ0KS5tYXRjaCgvW15cXG5dKiQvKSFbMF1cbiAgICAgIC5sZW5ndGg7XG4gICAgLy8gcHV0IGNhcmV0IGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZVxuICAgIHNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQgLSBzdGFydE9mZnNldDtcblxuICAgIGNvbnN0IHNlbGVjdGVkID0gdmFsdWUuc2xpY2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRcbiAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKHN0YXJ0SW5kaWNlcywgbGluZSwgaWR4LCBsaW5lcykgPT5cbiAgICAgICAgICBzdGFydEluZGljZXMuY29uY2F0KFxuICAgICAgICAgICAgaWR4XG4gICAgICAgICAgICAgID8gLy8gY3VyciBsaW5lIGluZGV4IGlzIHByZXYgbGluZSdzIHN0YXJ0ICsgcHJldiBsaW5lJ3MgbGVuZ3RoICsgXFxuXG4gICAgICAgICAgICAgICAgc3RhcnRJbmRpY2VzW2lkeCAtIDFdICsgbGluZXNbaWR4IC0gMV0ubGVuZ3RoICsgMVxuICAgICAgICAgICAgICA6IC8vIGZpcnN0IHNlbGVjdGVkIGxpbmVcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICApLFxuICAgICAgICBbXSBhcyBudW1iZXJbXSxcbiAgICAgIClcbiAgICAgIC5yZXZlcnNlKCk7XG4gIH07XG5cbiAgY29uc3Qgc3RvcEV2ZW50ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH07XG5cbiAgLy8gdXNpbmcgYSBzdGF0ZSB2YXJpYWJsZSBpbnN0ZWFkIG9mIHBhc3NpbmcgaXQgdG8gdGhlIGhhbmRsZVN1Ym1pdCBjYWxsYmFja1xuICAvLyBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIHNlcGFyYXRlIGEgY2FsbGJhY2sgZm9yIGV2ZW50IGhhbmRsZXJzXG4gIGxldCBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IGZhbHNlO1xuICBjb25zdCBoYW5kbGVTdWJtaXQgPSAoKSA9PiB7XG4gICAgLy8gY2xlYW51cCBtdXN0IGJlIHJ1biBiZWZvcmUgb25TdWJtaXQgb3RoZXJ3aXNlIHdoZW4gYXBwIGJsdXJzIHRoZSB3eXNpd3lnXG4gICAgLy8gaXQnZCBnZXQgc3R1Y2sgaW4gYW4gaW5maW5pdGUgbG9vcCBvZiBibHVy4oaSb25TdWJtaXQgYWZ0ZXIgd2UgcmUtZm9jdXMgdGhlXG4gICAgLy8gd3lzaXd5ZyBvbiB1cGRhdGVcbiAgICBjbGVhbnVwKCk7XG4gICAgY29uc3QgdXBkYXRlRWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KGVsZW1lbnQuaWQpO1xuICAgIGlmICghdXBkYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgd3JhcHBlZFRleHQgPSBcIlwiO1xuICAgIGlmIChpc1RleHRFbGVtZW50KHVwZGF0ZUVsZW1lbnQpICYmIHVwZGF0ZUVsZW1lbnQ/LmNvbnRhaW5lcklkKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBTY2VuZS5nZXRTY2VuZSh1cGRhdGVFbGVtZW50KSEuZ2V0RWxlbWVudChcbiAgICAgICAgdXBkYXRlRWxlbWVudC5jb250YWluZXJJZCxcbiAgICAgICkgYXMgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudDtcblxuICAgICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgICB3cmFwcGVkVGV4dCA9IHdyYXBUZXh0KFxuICAgICAgICAgIGVkaXRhYmxlLnZhbHVlLFxuICAgICAgICAgIGdldEZvbnRTdHJpbmcodXBkYXRlRWxlbWVudCksXG4gICAgICAgICAgY29udGFpbmVyLndpZHRoLFxuICAgICAgICApO1xuICAgICAgICBpZiAoaXNUZXh0RWxlbWVudCh1cGRhdGVFbGVtZW50KSAmJiB1cGRhdGVFbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgICAgICAgY29uc3QgZWRpdG9ySGVpZ2h0ID0gTnVtYmVyKGVkaXRhYmxlLnN0eWxlLmhlaWdodC5zbGljZSgwLCAtMikpO1xuICAgICAgICAgIGlmIChlZGl0YWJsZS52YWx1ZSkge1xuICAgICAgICAgICAgbXV0YXRlRWxlbWVudCh1cGRhdGVFbGVtZW50LCB7XG4gICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgY2VudGVyIGFsaWduXG4gICAgICAgICAgICAgIHk6IGNvbnRhaW5lci55ICsgY29udGFpbmVyLmhlaWdodCAvIDIgLSBlZGl0b3JIZWlnaHQgLyAyLFxuICAgICAgICAgICAgICBoZWlnaHQ6IGVkaXRvckhlaWdodCxcbiAgICAgICAgICAgICAgd2lkdGg6IE51bWJlcihlZGl0YWJsZS5zdHlsZS53aWR0aC5zbGljZSgwLCAtMikpLFxuICAgICAgICAgICAgICAvLyBwcmVzZXJ2ZSBwYWRkaW5nXG4gICAgICAgICAgICAgIHg6IGNvbnRhaW5lci54ICsgUEFERElORyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGNvbnRhaW5lcik7XG4gICAgICAgICAgICBpZiAoIWJvdW5kVGV4dEVsZW1lbnRJZCB8fCBib3VuZFRleHRFbGVtZW50SWQgIT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnRzOiAoY29udGFpbmVyLmJvdW5kRWxlbWVudHMgfHwgW10pLmNvbmNhdCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgICAgYm91bmRFbGVtZW50czogY29udGFpbmVyLmJvdW5kRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgICAgICAoZWxlKSA9PiBlbGUudHlwZSAhPT0gXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd3JhcHBlZFRleHQgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICB9XG5cbiAgICBvblN1Ym1pdCh7XG4gICAgICB0ZXh0OiBub3JtYWxpemVUZXh0KHdyYXBwZWRUZXh0KSxcbiAgICAgIHZpYUtleWJvYXJkOiBzdWJtaXR0ZWRWaWFLZXlib2FyZCxcbiAgICAgIG9yaWdpbmFsVGV4dDogZWRpdGFibGUudmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIHJlbW92ZSBldmVudHMgdG8gZW5zdXJlIHRoZXkgZG9uJ3QgbGF0ZS1maXJlXG4gICAgZWRpdGFibGUub25ibHVyID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmlucHV0ID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmtleWRvd24gPSBudWxsO1xuXG4gICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlV3lzaXd5Z1N0eWxlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwgdHJ1ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBvblBvaW50ZXJEb3duKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlU3VibWl0KTtcblxuICAgIHVuYmluZFVwZGF0ZSgpO1xuXG4gICAgZWRpdGFibGUucmVtb3ZlKCk7XG4gIH07XG5cbiAgY29uc3QgYmluZEJsdXJFdmVudCA9IChldmVudD86IE1vdXNlRXZlbnQpID0+IHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICAvLyBEZWZlcnJlZCBzbyB0aGF0IHRoZSBwb2ludGVyZG93biB0aGF0IGluaXRpYXRlcyB0aGUgd3lzaXd5ZyBkb2Vzbid0XG4gICAgLy8gdHJpZ2dlciB0aGUgYmx1ciBvbiBlbnN1aW5nIHBvaW50ZXJ1cC5cbiAgICAvLyBBbHNvIHRvIGhhbmRsZSBjYXNlcyBzdWNoIGFzIHBpY2tpbmcgYSBjb2xvciB3aGljaCB3b3VsZCB0cmlnZ2VyIGEgYmx1clxuICAgIC8vIGluIHRoYXQgc2FtZSB0aWNrLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50Py50YXJnZXQ7XG5cbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID1cbiAgICAgIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAgIHRhcmdldC5jbG9zZXN0KFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiKSAmJlxuICAgICAgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZWRpdGFibGUub25ibHVyID0gaGFuZGxlU3VibWl0O1xuICAgICAgaWYgKHRhcmdldCAmJiBpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIHRhcmdldC5vbmJsdXIgPSAoKSA9PiB7XG4gICAgICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIGNhc2U6IGNsaWNraW5nIG9uIHRoZSBzYW1lIHByb3BlcnR5IOKGkiBubyBjaGFuZ2Ug4oaSIG5vIHVwZGF0ZSDihpIgbm8gZm9jdXNcbiAgICAgIGlmICghaXNUYXJnZXRDb2xvclBpY2tlcikge1xuICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8vIHByZXZlbnQgYmx1ciB3aGVuIGNoYW5naW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgbWVudVxuICBjb25zdCBvblBvaW50ZXJEb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNUYXJnZXRDb2xvclBpY2tlciA9XG4gICAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICBldmVudC50YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiZcbiAgICAgIGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKFxuICAgICAgKChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fFxuICAgICAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSAmJlxuICAgICAgICBldmVudC50YXJnZXQuY2xvc2VzdChgLiR7Q0xBU1NFUy5TSEFQRV9BQ1RJT05TX01FTlV9YCkgJiZcbiAgICAgICAgIWlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHx8XG4gICAgICBpc1RhcmdldENvbG9yUGlja2VyXG4gICAgKSB7XG4gICAgICBlZGl0YWJsZS5vbmJsdXIgPSBudWxsO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgICAvLyBoYW5kbGUgZWRnZS1jYXNlIHdoZXJlIHBvaW50ZXJ1cCBkb2Vzbid0IGZpcmUgZS5nLiBkdWUgdG8gdXNlclxuICAgICAgLy8gYWx0LXRhYmJpbmcgYXdheVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGhhbmRsZSB1cGRhdGVzIG9mIHRleHRFbGVtZW50IHByb3BlcnRpZXMgb2YgZWRpdGluZyBlbGVtZW50XG4gIGNvbnN0IHVuYmluZFVwZGF0ZSA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpIS5hZGRDYWxsYmFjaygoKSA9PiB7XG4gICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgY29uc3QgaXNDb2xvclBpY2tlckFjdGl2ZSA9ICEhZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8uY2xvc2VzdChcbiAgICAgIFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiLFxuICAgICk7XG4gICAgaWYgKCFpc0NvbG9yUGlja2VyQWN0aXZlKSB7XG4gICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgbGV0IGlzRGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2VsZWN0IG9uIGluaXQgKGZvY3VzaW5nIGlzIGRvbmUgc2VwYXJhdGVseSBpbnNpZGUgdGhlIGJpbmRCbHVyRXZlbnQoKVxuICAvLyBiZWNhdXNlIHdlIG5lZWQgaXQgdG8gaGFwcGVuICphZnRlciogdGhlIGJsdXIgZXZlbnQgZnJvbSBgcG9pbnRlcmRvd25gKVxuICBlZGl0YWJsZS5zZWxlY3QoKTtcbiAgYmluZEJsdXJFdmVudCgpO1xuXG4gIC8vIHJlcG9zaXRpb24gd3lzaXd5ZyBpbiBjYXNlIG9mIGNhbnZhcyBpcyByZXNpemVkLiBVc2luZyBSZXNpemVPYnNlcnZlclxuICAvLyBpcyBwcmVmZXJyZWQgc28gd2UgY2F0Y2ggY2hhbmdlcyBmcm9tIGhvc3QsIHdoZXJlIHdpbmRvdyBtYXkgbm90IHJlc2l6ZS5cbiAgbGV0IG9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICBpZiAoY2FudmFzICYmIFwiUmVzaXplT2JzZXJ2ZXJcIiBpbiB3aW5kb3cpIHtcbiAgICBvYnNlcnZlciA9IG5ldyB3aW5kb3cuUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShjYW52YXMpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZVd5c2l3eWdTdHlsZSk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIG9uUG9pbnRlckRvd24pO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwge1xuICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgIGNhcHR1cmU6IHRydWUsXG4gIH0pO1xuICBleGNhbGlkcmF3Q29udGFpbmVyXG4gICAgPy5xdWVyeVNlbGVjdG9yKFwiLmV4Y2FsaWRyYXctdGV4dEVkaXRvckNvbnRhaW5lclwiKSFcbiAgICAuYXBwZW5kQ2hpbGQoZWRpdGFibGUpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\n");
|
|
2545
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"textWysiwyg\": () => (/* binding */ textWysiwyg)\n/* harmony export */ });\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst normalizeText = (text) => {\r\n return (text\r\n // replace tabs with spaces so they render and measure correctly\r\n .replace(/\\t/g, \" \")\r\n // normalize newlines\r\n .replace(/\\r?\\n|\\r/g, \"\\n\"));\r\n};\r\nconst getTransform = (width, height, angle, appState, maxWidth, maxHeight) => {\r\n const { zoom, offsetTop, offsetLeft } = appState;\r\n const degree = (180 * angle) / Math.PI;\r\n // offsets must be multiplied by 2 to account for the division by 2 of\r\n // the whole expression afterwards\r\n let translateX = ((width - offsetLeft * 2) * (zoom.value - 1)) / 2;\r\n let translateY = ((height - offsetTop * 2) * (zoom.value - 1)) / 2;\r\n if (width > maxWidth && zoom.value !== 1) {\r\n translateX = ((maxWidth - offsetLeft * 2) * (zoom.value - 1)) / 2;\r\n }\r\n if (height > maxHeight && zoom.value !== 1) {\r\n translateY = ((maxHeight - offsetTop * 2) * (zoom.value - 1)) / 2;\r\n }\r\n return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\r\n};\r\nconst textWysiwyg = ({ id, appState, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, }) => {\r\n const textPropertiesUpdated = (updatedElement, editable) => {\r\n const currentFont = editable.style.fontFamily.replaceAll('\"', \"\");\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({ fontFamily: updatedElement.fontFamily }) !==\r\n currentFont) {\r\n return true;\r\n }\r\n if (`${updatedElement.fontSize}px` !== editable.style.fontSize) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n let originalContainerHeight;\r\n let approxLineHeight = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(element)\r\n ? (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element))\r\n : 0;\r\n const updateWysiwygStyle = () => {\r\n var _a, _b;\r\n const updatedElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\r\n if (updatedElement && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedElement)) {\r\n let coordX = updatedElement.x;\r\n let coordY = updatedElement.y;\r\n let container = (updatedElement === null || updatedElement === void 0 ? void 0 : updatedElement.containerId)\r\n ? _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(updatedElement).getElement(updatedElement.containerId)\r\n : null;\r\n let maxWidth = updatedElement.width;\r\n let maxHeight = updatedElement.height;\r\n let width = updatedElement.width;\r\n const height = editable.scrollHeight === 0\r\n ? updatedElement.height\r\n : editable.scrollHeight;\r\n if (container && updatedElement.containerId) {\r\n const propertiesUpdated = textPropertiesUpdated(updatedElement, editable);\r\n if (propertiesUpdated) {\r\n const currentContainer = (_b = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(updatedElement)) === null || _b === void 0 ? void 0 : _b.getElement(updatedElement.containerId);\r\n approxLineHeight = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedElement)\r\n ? (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement))\r\n : 0;\r\n if (updatedElement.height > currentContainer.height - _constants__WEBPACK_IMPORTED_MODULE_4__.PADDING * 2) {\r\n const nextHeight = updatedElement.height + _constants__WEBPACK_IMPORTED_MODULE_4__.PADDING * 2;\r\n originalContainerHeight = nextHeight;\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: nextHeight });\r\n container = Object.assign(Object.assign({}, container), { height: nextHeight });\r\n }\r\n editable.style.height = `${updatedElement.height}px`;\r\n }\r\n if (!originalContainerHeight) {\r\n originalContainerHeight = container.height;\r\n }\r\n maxWidth = container.width - _constants__WEBPACK_IMPORTED_MODULE_4__.PADDING * 2;\r\n maxHeight = container.height - _constants__WEBPACK_IMPORTED_MODULE_4__.PADDING * 2;\r\n width = maxWidth;\r\n // The coordinates of text box set a distance of\r\n // 30px to preserve padding\r\n coordX = container.x + _constants__WEBPACK_IMPORTED_MODULE_4__.PADDING;\r\n // autogrow container height if text exceeds\r\n if (editable.scrollHeight > maxHeight) {\r\n const diff = Math.min(editable.scrollHeight - maxHeight, approxLineHeight);\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: container.height + diff });\r\n return;\r\n }\r\n else if (\r\n // autoshrink container height until original container height\r\n // is reached when text is removed\r\n container.height > originalContainerHeight &&\r\n editable.scrollHeight < maxHeight) {\r\n const diff = Math.min(maxHeight - editable.scrollHeight, approxLineHeight);\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: container.height - diff });\r\n }\r\n // Start pushing text upward until a diff of 30px (padding)\r\n // is reached\r\n else {\r\n const lines = editable.scrollHeight / approxLineHeight;\r\n if (lines > 1 || propertiesUpdated) {\r\n // vertically center align the text\r\n coordY =\r\n container.y + container.height / 2 - editable.scrollHeight / 2;\r\n }\r\n }\r\n }\r\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\r\n const { textAlign, angle } = updatedElement;\r\n editable.value = updatedElement.originalText || updatedElement.text;\r\n const lines = updatedElement.originalText.split(\"\\n\");\r\n const lineHeight = updatedElement.containerId\r\n ? approxLineHeight\r\n : updatedElement.height / lines.length;\r\n if (!container) {\r\n maxWidth =\r\n (appState.width +\r\n appState.offsetLeft -\r\n 8 -\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.sceneCoordsToViewportCoords)({ sceneX: coordX, sceneY: coordY }, appState).x) /\r\n appState.zoom.value -\r\n // margin-right of parent if any\r\n Number(getComputedStyle(excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.parentNode).marginRight.slice(0, -2));\r\n /*\r\n (appState.offsetLeft + appState.width - viewportX - 8) /\r\n appState.zoom.value -\r\n // margin-right of parent if any\r\n Number(\r\n getComputedStyle(\r\n excalidrawContainer?.parentNode as Element,\r\n ).marginRight.slice(0, -2),\r\n );*/\r\n }\r\n // Make sure text editor height doesn't go beyond viewport\r\n const editorMaxHeight = (appState.height -\r\n viewportY -\r\n // There is a ~14px difference which keeps on increasing\r\n // with every zoom step when offset present hence I am subtracting it here\r\n // However this is not the best fix and breaks in\r\n // few scenarios\r\n (appState.offsetTop\r\n ? ((appState.zoom.value * 100 - 100) / 10) * 14\r\n : 0)) /\r\n appState.zoom.value;\r\n Object.assign(editable.style, {\r\n font: (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement),\r\n // must be defined *after* font ¯\\_(ツ)_/¯\r\n lineHeight: `${lineHeight}px`,\r\n width: `${width}px`,\r\n height: `${height}px`,\r\n left: `${viewportX}px`,\r\n top: `${viewportY}px`,\r\n transform: getTransform(width, height, angle, appState, maxWidth, editorMaxHeight),\r\n textAlign,\r\n color: updatedElement.strokeColor,\r\n opacity: updatedElement.opacity / 100,\r\n filter: \"var(--theme-filter)\",\r\n maxWidth: `${maxWidth}px`,\r\n maxHeight: `${editorMaxHeight}px`,\r\n });\r\n }\r\n };\r\n const editable = document.createElement(\"textarea\");\r\n editable.dir = \"auto\";\r\n editable.tabIndex = 0;\r\n editable.dataset.type = \"wysiwyg\";\r\n // prevent line wrapping on Safari\r\n editable.wrap = \"off\";\r\n editable.classList.add(\"excalidraw-wysiwyg\");\r\n let whiteSpace = \"pre\";\r\n let wordBreak = \"normal\";\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\r\n whiteSpace = \"pre-wrap\";\r\n wordBreak = \"break-word\";\r\n }\r\n Object.assign(editable.style, {\r\n position: \"absolute\",\r\n display: \"inline-block\",\r\n minHeight: \"1em\",\r\n backfaceVisibility: \"hidden\",\r\n margin: 0,\r\n padding: 0,\r\n border: 0,\r\n outline: 0,\r\n resize: \"none\",\r\n background: \"transparent\",\r\n overflow: \"hidden\",\r\n // must be specified because in dark mode canvas creates a stacking context\r\n zIndex: \"var(--zIndex-wysiwyg)\",\r\n wordBreak,\r\n // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\r\n whiteSpace,\r\n overflowWrap: \"break-word\",\r\n });\r\n updateWysiwygStyle();\r\n if (onChange) {\r\n editable.oninput = () => {\r\n const lines = editable.scrollHeight / approxLineHeight;\r\n // auto increase height only when lines > 1 so its\r\n // measured correctly and vertically alignes for\r\n // first line as well as setting height to \"auto\"\r\n // doubles the height as soon as user starts typing\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element) && lines > 1) {\r\n editable.style.height = \"auto\";\r\n editable.style.height = `${editable.scrollHeight}px`;\r\n }\r\n onChange(normalizeText(editable.value));\r\n };\r\n }\r\n editable.onkeydown = (event) => {\r\n event.stopPropagation();\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ESCAPE) {\r\n event.preventDefault();\r\n submittedViaKeyboard = true;\r\n handleSubmit();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ENTER && event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD]) {\r\n event.preventDefault();\r\n if (event.isComposing || event.keyCode === 229) {\r\n return;\r\n }\r\n submittedViaKeyboard = true;\r\n handleSubmit();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.TAB ||\r\n (event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] &&\r\n (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT ||\r\n event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_RIGHT))) {\r\n event.preventDefault();\r\n if (event.shiftKey || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT) {\r\n outdent();\r\n }\r\n else {\r\n indent();\r\n }\r\n // We must send an input event to resize the element\r\n editable.dispatchEvent(new Event(\"input\"));\r\n }\r\n };\r\n const TAB_SIZE = 4;\r\n const TAB = \" \".repeat(TAB_SIZE);\r\n const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\r\n const indent = () => {\r\n const { selectionStart, selectionEnd } = editable;\r\n const linesStartIndices = getSelectedLinesStartIndices();\r\n let value = editable.value;\r\n linesStartIndices.forEach((startIndex) => {\r\n const startValue = value.slice(0, startIndex);\r\n const endValue = value.slice(startIndex);\r\n value = `${startValue}${TAB}${endValue}`;\r\n });\r\n editable.value = value;\r\n editable.selectionStart = selectionStart + TAB_SIZE;\r\n editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\r\n };\r\n const outdent = () => {\r\n const { selectionStart, selectionEnd } = editable;\r\n const linesStartIndices = getSelectedLinesStartIndices();\r\n const removedTabs = [];\r\n let value = editable.value;\r\n linesStartIndices.forEach((startIndex) => {\r\n const tabMatch = value\r\n .slice(startIndex, startIndex + TAB_SIZE)\r\n .match(RE_LEADING_TAB);\r\n if (tabMatch) {\r\n const startValue = value.slice(0, startIndex);\r\n const endValue = value.slice(startIndex + tabMatch[0].length);\r\n // Delete a tab from the line\r\n value = `${startValue}${endValue}`;\r\n removedTabs.push(startIndex);\r\n }\r\n });\r\n editable.value = value;\r\n if (removedTabs.length) {\r\n if (selectionStart > removedTabs[removedTabs.length - 1]) {\r\n editable.selectionStart = Math.max(selectionStart - TAB_SIZE, removedTabs[removedTabs.length - 1]);\r\n }\r\n else {\r\n // If the cursor is before the first tab removed, ex:\r\n // Line| #1\r\n // Line #2\r\n // Lin|e #3\r\n // we should reset the selectionStart to his initial value.\r\n editable.selectionStart = selectionStart;\r\n }\r\n editable.selectionEnd = Math.max(editable.selectionStart, selectionEnd - TAB_SIZE * removedTabs.length);\r\n }\r\n };\r\n /**\r\n * @returns indeces of start positions of selected lines, in reverse order\r\n */\r\n const getSelectedLinesStartIndices = () => {\r\n let { selectionStart, selectionEnd, value } = editable;\r\n // chars before selectionStart on the same line\r\n const startOffset = value.slice(0, selectionStart).match(/[^\\n]*$/)[0]\r\n .length;\r\n // put caret at the start of the line\r\n selectionStart = selectionStart - startOffset;\r\n const selected = value.slice(selectionStart, selectionEnd);\r\n return selected\r\n .split(\"\\n\")\r\n .reduce((startIndices, line, idx, lines) => startIndices.concat(idx\r\n ? // curr line index is prev line's start + prev line's length + \\n\r\n startIndices[idx - 1] + lines[idx - 1].length + 1\r\n : // first selected line\r\n selectionStart), [])\r\n .reverse();\r\n };\r\n const stopEvent = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n };\r\n // using a state variable instead of passing it to the handleSubmit callback\r\n // so that we don't need to create separate a callback for event handlers\r\n let submittedViaKeyboard = false;\r\n const handleSubmit = () => {\r\n var _a, _b;\r\n // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\r\n // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\r\n // wysiwyg on update\r\n cleanup();\r\n const updateElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.id);\r\n if (!updateElement) {\r\n return;\r\n }\r\n let wrappedText = \"\";\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updateElement) && (updateElement === null || updateElement === void 0 ? void 0 : updateElement.containerId)) {\r\n const container = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(updateElement).getElement(updateElement.containerId);\r\n if (container) {\r\n wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updateElement), container.width);\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updateElement) && updateElement.containerId) {\r\n const editorHeight = Number(editable.style.height.slice(0, -2));\r\n if (editable.value) {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updateElement, {\r\n // vertically center align\r\n y: container.y + container.height / 2 - editorHeight / 2,\r\n height: editorHeight,\r\n width: Number(editable.style.width.slice(0, -2)),\r\n // preserve padding\r\n x: container.x + _constants__WEBPACK_IMPORTED_MODULE_4__.PADDING,\r\n });\r\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementId)(container);\r\n if (!boundTextElementId || boundTextElementId !== element.id) {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\r\n boundElements: (container.boundElements || []).concat({\r\n type: \"text\",\r\n id: element.id,\r\n }),\r\n });\r\n }\r\n }\r\n else {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\r\n boundElements: (_b = container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => ele.type !== \"text\"),\r\n });\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n wrappedText = editable.value;\r\n }\r\n onSubmit({\r\n text: normalizeText(wrappedText),\r\n viaKeyboard: submittedViaKeyboard,\r\n originalText: editable.value,\r\n });\r\n };\r\n const cleanup = () => {\r\n if (isDestroyed) {\r\n return;\r\n }\r\n isDestroyed = true;\r\n // remove events to ensure they don't late-fire\r\n editable.onblur = null;\r\n editable.oninput = null;\r\n editable.onkeydown = null;\r\n if (observer) {\r\n observer.disconnect();\r\n }\r\n window.removeEventListener(\"resize\", updateWysiwygStyle);\r\n window.removeEventListener(\"wheel\", stopEvent, true);\r\n window.removeEventListener(\"pointerdown\", onPointerDown);\r\n window.removeEventListener(\"pointerup\", bindBlurEvent);\r\n window.removeEventListener(\"blur\", handleSubmit);\r\n unbindUpdate();\r\n editable.remove();\r\n };\r\n const bindBlurEvent = (event) => {\r\n window.removeEventListener(\"pointerup\", bindBlurEvent);\r\n // Deferred so that the pointerdown that initiates the wysiwyg doesn't\r\n // trigger the blur on ensuing pointerup.\r\n // Also to handle cases such as picking a color which would trigger a blur\r\n // in that same tick.\r\n const target = event === null || event === void 0 ? void 0 : event.target;\r\n const isTargetColorPicker = target instanceof HTMLInputElement &&\r\n target.closest(\".color-picker-input\") &&\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\r\n setTimeout(() => {\r\n editable.onblur = handleSubmit;\r\n if (target && isTargetColorPicker) {\r\n target.onblur = () => {\r\n editable.focus();\r\n };\r\n }\r\n // case: clicking on the same property → no change → no update → no focus\r\n if (!isTargetColorPicker) {\r\n editable.focus();\r\n }\r\n });\r\n };\r\n // prevent blur when changing properties from the menu\r\n const onPointerDown = (event) => {\r\n const isTargetColorPicker = event.target instanceof HTMLInputElement &&\r\n event.target.closest(\".color-picker-input\") &&\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\r\n if (((event.target instanceof HTMLElement ||\r\n event.target instanceof SVGElement) &&\r\n event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) &&\r\n !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target)) ||\r\n isTargetColorPicker) {\r\n editable.onblur = null;\r\n window.addEventListener(\"pointerup\", bindBlurEvent);\r\n // handle edge-case where pointerup doesn't fire e.g. due to user\r\n // alt-tabbing away\r\n window.addEventListener(\"blur\", handleSubmit);\r\n }\r\n };\r\n // handle updates of textElement properties of editing element\r\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element).addCallback(() => {\r\n var _a;\r\n updateWysiwygStyle();\r\n const isColorPickerActive = !!((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(\".color-picker-input\"));\r\n if (!isColorPickerActive) {\r\n editable.focus();\r\n }\r\n });\r\n // ---------------------------------------------------------------------------\r\n let isDestroyed = false;\r\n // select on init (focusing is done separately inside the bindBlurEvent()\r\n // because we need it to happen *after* the blur event from `pointerdown`)\r\n editable.select();\r\n bindBlurEvent();\r\n // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\r\n // is preferred so we catch changes from host, where window may not resize.\r\n let observer = null;\r\n if (canvas && \"ResizeObserver\" in window) {\r\n observer = new window.ResizeObserver(() => {\r\n updateWysiwygStyle();\r\n });\r\n observer.observe(canvas);\r\n }\r\n else {\r\n window.addEventListener(\"resize\", updateWysiwygStyle);\r\n }\r\n window.addEventListener(\"pointerdown\", onPointerDown);\r\n window.addEventListener(\"wheel\", stopEvent, {\r\n passive: false,\r\n capture: true,\r\n });\r\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.querySelector(\".excalidraw-textEditorContainer\").appendChild(editable);\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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bnQvdGV4dFd5c2l3eWcudHN4PzhmNGQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ09ERVMsIEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHtcbiAgaXNXcml0YWJsZUVsZW1lbnQsXG4gIGdldEZvbnRTdHJpbmcsXG4gIGdldEZvbnRGYW1pbHlTdHJpbmcsXG4gIHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3Jkcyxcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQgeyBpc0JvdW5kVG9Db250YWluZXIsIGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBDTEFTU0VTLCBQQURESU5HIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgZ2V0QXBwcm94TGluZUhlaWdodCxcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudElkLFxuICB3cmFwVGV4dCxcbn0gZnJvbSBcIi4vdGV4dEVsZW1lbnRcIjtcblxuY29uc3Qgbm9ybWFsaXplVGV4dCA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIChcbiAgICB0ZXh0XG4gICAgICAvLyByZXBsYWNlIHRhYnMgd2l0aCBzcGFjZXMgc28gdGhleSByZW5kZXIgYW5kIG1lYXN1cmUgY29ycmVjdGx5XG4gICAgICAucmVwbGFjZSgvXFx0L2csIFwiICAgICAgICBcIilcbiAgICAgIC8vIG5vcm1hbGl6ZSBuZXdsaW5lc1xuICAgICAgLnJlcGxhY2UoL1xccj9cXG58XFxyL2csIFwiXFxuXCIpXG4gICk7XG59O1xuXG5jb25zdCBnZXRUcmFuc2Zvcm0gPSAoXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBhbmdsZTogbnVtYmVyLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIG1heFdpZHRoOiBudW1iZXIsXG4gIG1heEhlaWdodDogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IHsgem9vbSwgb2Zmc2V0VG9wLCBvZmZzZXRMZWZ0IH0gPSBhcHBTdGF0ZTtcbiAgY29uc3QgZGVncmVlID0gKDE4MCAqIGFuZ2xlKSAvIE1hdGguUEk7XG4gIC8vIG9mZnNldHMgbXVzdCBiZSBtdWx0aXBsaWVkIGJ5IDIgdG8gYWNjb3VudCBmb3IgdGhlIGRpdmlzaW9uIGJ5IDIgb2ZcbiAgLy8gdGhlIHdob2xlIGV4cHJlc3Npb24gYWZ0ZXJ3YXJkc1xuICBsZXQgdHJhbnNsYXRlWCA9ICgod2lkdGggLSBvZmZzZXRMZWZ0ICogMikgKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIGxldCB0cmFuc2xhdGVZID0gKChoZWlnaHQgLSBvZmZzZXRUb3AgKiAyKSAqICh6b29tLnZhbHVlIC0gMSkpIC8gMjtcbiAgaWYgKHdpZHRoID4gbWF4V2lkdGggJiYgem9vbS52YWx1ZSAhPT0gMSkge1xuICAgIHRyYW5zbGF0ZVggPSAoKG1heFdpZHRoIC0gb2Zmc2V0TGVmdCAqIDIpICogKHpvb20udmFsdWUgLSAxKSkgLyAyXG4gIH1cbiAgaWYgKGhlaWdodCA+IG1heEhlaWdodCAmJiB6b29tLnZhbHVlICE9PSAxKSB7XG4gICAgdHJhbnNsYXRlWSA9ICgobWF4SGVpZ2h0IC0gb2Zmc2V0VG9wICogMikgKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIH1cbiAgcmV0dXJuIGB0cmFuc2xhdGUoJHt0cmFuc2xhdGVYfXB4LCAke3RyYW5zbGF0ZVl9cHgpIHNjYWxlKCR7em9vbS52YWx1ZX0pIHJvdGF0ZSgke2RlZ3JlZX1kZWcpYDtcbn07XG5cbmV4cG9ydCBjb25zdCB0ZXh0V3lzaXd5ZyA9ICh7XG4gIGlkLFxuICBhcHBTdGF0ZSxcbiAgb25DaGFuZ2UsXG4gIG9uU3VibWl0LFxuICBnZXRWaWV3cG9ydENvb3JkcyxcbiAgZWxlbWVudCxcbiAgY2FudmFzLFxuICBleGNhbGlkcmF3Q29udGFpbmVyLFxufToge1xuICBpZDogRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXTtcbiAgYXBwU3RhdGU6IEFwcFN0YXRlO1xuICBvbkNoYW5nZT86ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uU3VibWl0OiAoZGF0YToge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICB2aWFLZXlib2FyZDogYm9vbGVhbjtcbiAgICBvcmlnaW5hbFRleHQ6IHN0cmluZztcbiAgfSkgPT4gdm9pZDtcbiAgZ2V0Vmlld3BvcnRDb29yZHM6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gW251bWJlciwgbnVtYmVyXTtcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQ7XG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsO1xuICBleGNhbGlkcmF3Q29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGw7XG59KSA9PiB7XG4gIGNvbnN0IHRleHRQcm9wZXJ0aWVzVXBkYXRlZCA9IChcbiAgICB1cGRhdGVkRWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICAgIGVkaXRhYmxlOiBIVE1MVGV4dEFyZWFFbGVtZW50LFxuICApID0+IHtcbiAgICBjb25zdCBjdXJyZW50Rm9udCA9IGVkaXRhYmxlLnN0eWxlLmZvbnRGYW1pbHkucmVwbGFjZUFsbCgnXCInLCBcIlwiKTtcbiAgICBpZiAoXG4gICAgICBnZXRGb250RmFtaWx5U3RyaW5nKHsgZm9udEZhbWlseTogdXBkYXRlZEVsZW1lbnQuZm9udEZhbWlseSB9KSAhPT1cbiAgICAgIGN1cnJlbnRGb250XG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGAke3VwZGF0ZWRFbGVtZW50LmZvbnRTaXplfXB4YCAhPT0gZWRpdGFibGUuc3R5bGUuZm9udFNpemUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIGxldCBvcmlnaW5hbENvbnRhaW5lckhlaWdodDogbnVtYmVyO1xuICBsZXQgYXBwcm94TGluZUhlaWdodCA9IGlzVGV4dEVsZW1lbnQoZWxlbWVudClcbiAgICA/IGdldEFwcHJveExpbmVIZWlnaHQoZ2V0Rm9udFN0cmluZyhlbGVtZW50KSlcbiAgICA6IDA7XG5cbiAgY29uc3QgdXBkYXRlV3lzaXd5Z1N0eWxlID0gKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoaWQpO1xuICAgIGlmICh1cGRhdGVkRWxlbWVudCAmJiBpc1RleHRFbGVtZW50KHVwZGF0ZWRFbGVtZW50KSkge1xuICAgICAgbGV0IGNvb3JkWCA9IHVwZGF0ZWRFbGVtZW50Lng7XG4gICAgICBsZXQgY29vcmRZID0gdXBkYXRlZEVsZW1lbnQueTtcbiAgICAgIGxldCBjb250YWluZXIgPSB1cGRhdGVkRWxlbWVudD8uY29udGFpbmVySWRcbiAgICAgICAgPyBTY2VuZS5nZXRTY2VuZSh1cGRhdGVkRWxlbWVudCkhLmdldEVsZW1lbnQodXBkYXRlZEVsZW1lbnQuY29udGFpbmVySWQpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGxldCBtYXhXaWR0aCA9IHVwZGF0ZWRFbGVtZW50LndpZHRoO1xuXG4gICAgICBsZXQgbWF4SGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgbGV0IHdpZHRoID0gdXBkYXRlZEVsZW1lbnQud2lkdGg7XG4gICAgICBjb25zdCBoZWlnaHQgPVxuICAgICAgICBlZGl0YWJsZS5zY3JvbGxIZWlnaHQgPT09IDBcbiAgICAgICAgICA/IHVwZGF0ZWRFbGVtZW50LmhlaWdodFxuICAgICAgICAgIDogZWRpdGFibGUuc2Nyb2xsSGVpZ2h0O1xuICAgICAgaWYgKGNvbnRhaW5lciAmJiB1cGRhdGVkRWxlbWVudC5jb250YWluZXJJZCkge1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRleHRQcm9wZXJ0aWVzVXBkYXRlZChcbiAgICAgICAgICB1cGRhdGVkRWxlbWVudCxcbiAgICAgICAgICBlZGl0YWJsZSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocHJvcGVydGllc1VwZGF0ZWQpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q29udGFpbmVyID0gU2NlbmUuZ2V0U2NlbmUodXBkYXRlZEVsZW1lbnQpPy5nZXRFbGVtZW50KFxuICAgICAgICAgICAgdXBkYXRlZEVsZW1lbnQuY29udGFpbmVySWQsXG4gICAgICAgICAgKSBhcyBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50O1xuICAgICAgICAgIGFwcHJveExpbmVIZWlnaHQgPSBpc1RleHRFbGVtZW50KHVwZGF0ZWRFbGVtZW50KVxuICAgICAgICAgICAgPyBnZXRBcHByb3hMaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcodXBkYXRlZEVsZW1lbnQpKVxuICAgICAgICAgICAgOiAwO1xuICAgICAgICAgIGlmICh1cGRhdGVkRWxlbWVudC5oZWlnaHQgPiBjdXJyZW50Q29udGFpbmVyLmhlaWdodCAtIFBBRERJTkcgKiAyKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0SGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuaGVpZ2h0ICsgUEFERElORyAqIDI7XG4gICAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IG5leHRIZWlnaHQ7XG4gICAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IG5leHRIZWlnaHQgfSk7XG4gICAgICAgICAgICBjb250YWluZXIgPSB7IC4uLmNvbnRhaW5lciwgaGVpZ2h0OiBuZXh0SGVpZ2h0IH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IGAke3VwZGF0ZWRFbGVtZW50LmhlaWdodH1weGA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcmlnaW5hbENvbnRhaW5lckhlaWdodCkge1xuICAgICAgICAgIG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBtYXhXaWR0aCA9IGNvbnRhaW5lci53aWR0aCAtIFBBRERJTkcgKiAyO1xuICAgICAgICBtYXhIZWlnaHQgPSBjb250YWluZXIuaGVpZ2h0IC0gUEFERElORyAqIDI7XG4gICAgICAgIHdpZHRoID0gbWF4V2lkdGg7XG4gICAgICAgIC8vIFRoZSBjb29yZGluYXRlcyBvZiB0ZXh0IGJveCBzZXQgYSBkaXN0YW5jZSBvZlxuICAgICAgICAvLyAzMHB4IHRvIHByZXNlcnZlIHBhZGRpbmdcbiAgICAgICAgY29vcmRYID0gY29udGFpbmVyLnggKyBQQURESU5HO1xuXG4gICAgICAgIC8vIGF1dG9ncm93IGNvbnRhaW5lciBoZWlnaHQgaWYgdGV4dCBleGNlZWRzXG4gICAgICAgIGlmIChlZGl0YWJsZS5zY3JvbGxIZWlnaHQgPiBtYXhIZWlnaHQpIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4oXG4gICAgICAgICAgICBlZGl0YWJsZS5zY3JvbGxIZWlnaHQgLSBtYXhIZWlnaHQsXG4gICAgICAgICAgICBhcHByb3hMaW5lSGVpZ2h0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBjb250YWluZXIuaGVpZ2h0ICsgZGlmZiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gYXV0b3NocmluayBjb250YWluZXIgaGVpZ2h0IHVudGlsIG9yaWdpbmFsIGNvbnRhaW5lciBoZWlnaHRcbiAgICAgICAgICAvLyBpcyByZWFjaGVkIHdoZW4gdGV4dCBpcyByZW1vdmVkXG4gICAgICAgICAgY29udGFpbmVyLmhlaWdodCA+IG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0ICYmXG4gICAgICAgICAgZWRpdGFibGUuc2Nyb2xsSGVpZ2h0IDwgbWF4SGVpZ2h0XG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIG1heEhlaWdodCAtIGVkaXRhYmxlLnNjcm9sbEhlaWdodCxcbiAgICAgICAgICAgIGFwcHJveExpbmVIZWlnaHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IGNvbnRhaW5lci5oZWlnaHQgLSBkaWZmIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0YXJ0IHB1c2hpbmcgdGV4dCB1cHdhcmQgdW50aWwgYSBkaWZmIG9mIDMwcHggKHBhZGRpbmcpXG4gICAgICAgIC8vIGlzIHJlYWNoZWRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc3QgbGluZXMgPSBlZGl0YWJsZS5zY3JvbGxIZWlnaHQgLyBhcHByb3hMaW5lSGVpZ2h0O1xuXG4gICAgICAgICAgaWYgKGxpbmVzID4gMSB8fCBwcm9wZXJ0aWVzVXBkYXRlZCkge1xuICAgICAgICAgICAgLy8gdmVydGljYWxseSBjZW50ZXIgYWxpZ24gdGhlIHRleHRcbiAgICAgICAgICAgIGNvb3JkWSA9XG4gICAgICAgICAgICAgIGNvbnRhaW5lci55ICsgY29udGFpbmVyLmhlaWdodCAvIDIgLSBlZGl0YWJsZS5zY3JvbGxIZWlnaHQgLyAyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgW3ZpZXdwb3J0WCwgdmlld3BvcnRZXSA9IGdldFZpZXdwb3J0Q29vcmRzKGNvb3JkWCwgY29vcmRZKTtcbiAgICAgIGNvbnN0IHsgdGV4dEFsaWduLCBhbmdsZSB9ID0gdXBkYXRlZEVsZW1lbnQ7XG5cbiAgICAgIGVkaXRhYmxlLnZhbHVlID0gdXBkYXRlZEVsZW1lbnQub3JpZ2luYWxUZXh0IHx8IHVwZGF0ZWRFbGVtZW50LnRleHQ7XG4gICAgICBjb25zdCBsaW5lcyA9IHVwZGF0ZWRFbGVtZW50Lm9yaWdpbmFsVGV4dC5zcGxpdChcIlxcblwiKTtcbiAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSB1cGRhdGVkRWxlbWVudC5jb250YWluZXJJZFxuICAgICAgICA/IGFwcHJveExpbmVIZWlnaHRcbiAgICAgICAgOiB1cGRhdGVkRWxlbWVudC5oZWlnaHQgLyBsaW5lcy5sZW5ndGg7XG4gICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICBtYXhXaWR0aCA9XG4gICAgICAgICAgKGFwcFN0YXRlLndpZHRoICsgXG4gICAgICAgICAgICBhcHBTdGF0ZS5vZmZzZXRMZWZ0IC1cbiAgICAgICAgICAgIDggLVxuICAgICAgICAgICAgc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKHtzY2VuZVg6Y29vcmRYLHNjZW5lWTpjb29yZFl9LGFwcFN0YXRlKS54KSAvXG4gICAgICAgICAgICBhcHBTdGF0ZS56b29tLnZhbHVlIC1cbiAgICAgICAgICAvLyBtYXJnaW4tcmlnaHQgb2YgcGFyZW50IGlmIGFueVxuICAgICAgICAgIE51bWJlcihcbiAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoXG4gICAgICAgICAgICAgIGV4Y2FsaWRyYXdDb250YWluZXI/LnBhcmVudE5vZGUgYXMgRWxlbWVudCxcbiAgICAgICAgICAgICkubWFyZ2luUmlnaHQuc2xpY2UoMCwgLTIpLFxuICAgICAgICAgICk7XG5cbi8qXG4gICAgICAgICAgKGFwcFN0YXRlLm9mZnNldExlZnQgKyBhcHBTdGF0ZS53aWR0aCAtIHZpZXdwb3J0WCAtIDgpIC9cbiAgICAgICAgICAgIGFwcFN0YXRlLnpvb20udmFsdWUgLVxuICAgICAgICAgIC8vIG1hcmdpbi1yaWdodCBvZiBwYXJlbnQgaWYgYW55XG4gICAgICAgICAgTnVtYmVyKFxuICAgICAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShcbiAgICAgICAgICAgICAgZXhjYWxpZHJhd0NvbnRhaW5lcj8ucGFyZW50Tm9kZSBhcyBFbGVtZW50LFxuICAgICAgICAgICAgKS5tYXJnaW5SaWdodC5zbGljZSgwLCAtMiksXG4gICAgICAgICAgKTsqL1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgdGV4dCBlZGl0b3IgaGVpZ2h0IGRvZXNuJ3QgZ28gYmV5b25kIHZpZXdwb3J0XG4gICAgICBjb25zdCBlZGl0b3JNYXhIZWlnaHQgPVxuICAgICAgICAoYXBwU3RhdGUuaGVpZ2h0IC1cbiAgICAgICAgICB2aWV3cG9ydFkgLVxuICAgICAgICAgIC8vIFRoZXJlIGlzIGEgfjE0cHggZGlmZmVyZW5jZSB3aGljaCBrZWVwcyBvbiBpbmNyZWFzaW5nXG4gICAgICAgICAgLy8gd2l0aCBldmVyeSB6b29tIHN0ZXAgd2hlbiBvZmZzZXQgcHJlc2VudCBoZW5jZSBJIGFtIHN1YnRyYWN0aW5nIGl0IGhlcmVcbiAgICAgICAgICAvLyBIb3dldmVyIHRoaXMgaXMgbm90IHRoZSBiZXN0IGZpeCBhbmQgYnJlYWtzIGluXG4gICAgICAgICAgLy8gZmV3IHNjZW5hcmlvc1xuICAgICAgICAgIChhcHBTdGF0ZS5vZmZzZXRUb3BcbiAgICAgICAgICAgID8gKChhcHBTdGF0ZS56b29tLnZhbHVlICogMTAwIC0gMTAwKSAvIDEwKSAqIDE0XG4gICAgICAgICAgICA6IDApKSAvXG4gICAgICAgIGFwcFN0YXRlLnpvb20udmFsdWU7XG4gICAgICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgICAgIGZvbnQ6IGdldEZvbnRTdHJpbmcodXBkYXRlZEVsZW1lbnQpLFxuICAgICAgICAvLyBtdXN0IGJlIGRlZmluZWQgKmFmdGVyKiBmb250IMKvXFxfKOODhClfL8KvXG4gICAgICAgIGxpbmVIZWlnaHQ6IGAke2xpbmVIZWlnaHR9cHhgLFxuICAgICAgICB3aWR0aDogYCR7d2lkdGh9cHhgLFxuICAgICAgICBoZWlnaHQ6IGAke2hlaWdodH1weGAsXG4gICAgICAgIGxlZnQ6IGAke3ZpZXdwb3J0WH1weGAsXG4gICAgICAgIHRvcDogYCR7dmlld3BvcnRZfXB4YCxcbiAgICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm0oXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGFuZ2xlLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIG1heFdpZHRoLFxuICAgICAgICAgIGVkaXRvck1heEhlaWdodCxcbiAgICAgICAgKSxcbiAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICBjb2xvcjogdXBkYXRlZEVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgIG9wYWNpdHk6IHVwZGF0ZWRFbGVtZW50Lm9wYWNpdHkgLyAxMDAsXG4gICAgICAgIGZpbHRlcjogXCJ2YXIoLS10aGVtZS1maWx0ZXIpXCIsXG4gICAgICAgIG1heFdpZHRoOiBgJHttYXhXaWR0aH1weGAsXG4gICAgICAgIG1heEhlaWdodDogYCR7ZWRpdG9yTWF4SGVpZ2h0fXB4YCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBlZGl0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcblxuICBlZGl0YWJsZS5kaXIgPSBcImF1dG9cIjtcbiAgZWRpdGFibGUudGFiSW5kZXggPSAwO1xuICBlZGl0YWJsZS5kYXRhc2V0LnR5cGUgPSBcInd5c2l3eWdcIjtcbiAgLy8gcHJldmVudCBsaW5lIHdyYXBwaW5nIG9uIFNhZmFyaVxuICBlZGl0YWJsZS53cmFwID0gXCJvZmZcIjtcbiAgZWRpdGFibGUuY2xhc3NMaXN0LmFkZChcImV4Y2FsaWRyYXctd3lzaXd5Z1wiKTtcblxuICBsZXQgd2hpdGVTcGFjZSA9IFwicHJlXCI7XG4gIGxldCB3b3JkQnJlYWsgPSBcIm5vcm1hbFwiO1xuXG4gIGlmIChpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkpIHtcbiAgICB3aGl0ZVNwYWNlID0gXCJwcmUtd3JhcFwiO1xuICAgIHdvcmRCcmVhayA9IFwiYnJlYWstd29yZFwiO1xuICB9XG4gIE9iamVjdC5hc3NpZ24oZWRpdGFibGUuc3R5bGUsIHtcbiAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgbWluSGVpZ2h0OiBcIjFlbVwiLFxuICAgIGJhY2tmYWNlVmlzaWJpbGl0eTogXCJoaWRkZW5cIixcbiAgICBtYXJnaW46IDAsXG4gICAgcGFkZGluZzogMCxcbiAgICBib3JkZXI6IDAsXG4gICAgb3V0bGluZTogMCxcbiAgICByZXNpemU6IFwibm9uZVwiLFxuICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAvLyBtdXN0IGJlIHNwZWNpZmllZCBiZWNhdXNlIGluIGRhcmsgbW9kZSBjYW52YXMgY3JlYXRlcyBhIHN0YWNraW5nIGNvbnRleHRcbiAgICB6SW5kZXg6IFwidmFyKC0tekluZGV4LXd5c2l3eWcpXCIsXG4gICAgd29yZEJyZWFrLFxuICAgIC8vIHByZXZlbnQgbGluZSB3cmFwcGluZyAoYHdoaXRlc3BhY2U6IG5vd3JhcGAgZG9lc24ndCB3b3JrIG9uIEZGKVxuICAgIHdoaXRlU3BhY2UsXG4gICAgb3ZlcmZsb3dXcmFwOiBcImJyZWFrLXdvcmRcIixcbiAgfSk7XG4gIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuXG4gIGlmIChvbkNoYW5nZSkge1xuICAgIGVkaXRhYmxlLm9uaW5wdXQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBsaW5lcyA9IGVkaXRhYmxlLnNjcm9sbEhlaWdodCAvIGFwcHJveExpbmVIZWlnaHQ7XG4gICAgICAvLyBhdXRvIGluY3JlYXNlIGhlaWdodCBvbmx5IHdoZW4gbGluZXMgID4gMSBzbyBpdHNcbiAgICAgIC8vIG1lYXN1cmVkIGNvcnJlY3RseSBhbmQgdmVydGljYWxseSBhbGlnbmVzIGZvclxuICAgICAgLy8gZmlyc3QgbGluZSBhcyB3ZWxsIGFzIHNldHRpbmcgaGVpZ2h0IHRvIFwiYXV0b1wiXG4gICAgICAvLyBkb3VibGVzIHRoZSBoZWlnaHQgYXMgc29vbiBhcyB1c2VyIHN0YXJ0cyB0eXBpbmdcbiAgICAgIGlmIChpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkgJiYgbGluZXMgPiAxKSB7XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IFwiYXV0b1wiO1xuICAgICAgICBlZGl0YWJsZS5zdHlsZS5oZWlnaHQgPSBgJHtlZGl0YWJsZS5zY3JvbGxIZWlnaHR9cHhgO1xuICAgICAgfVxuICAgICAgb25DaGFuZ2Uobm9ybWFsaXplVGV4dChlZGl0YWJsZS52YWx1ZSkpO1xuICAgIH07XG4gIH1cblxuICBlZGl0YWJsZS5vbmtleWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkVTQ0FQRSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gdHJ1ZTtcbiAgICAgIGhhbmRsZVN1Ym1pdCgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkVOVEVSICYmIGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGV2ZW50LmlzQ29tcG9zaW5nIHx8IGV2ZW50LmtleUNvZGUgPT09IDIyOSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IHRydWU7XG4gICAgICBoYW5kbGVTdWJtaXQoKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZXZlbnQua2V5ID09PSBLRVlTLlRBQiB8fFxuICAgICAgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmXG4gICAgICAgIChldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX0xFRlQgfHxcbiAgICAgICAgICBldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX1JJR0hUKSlcbiAgICApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9MRUZUKSB7XG4gICAgICAgIG91dGRlbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGVudCgpO1xuICAgICAgfVxuICAgICAgLy8gV2UgbXVzdCBzZW5kIGFuIGlucHV0IGV2ZW50IHRvIHJlc2l6ZSB0aGUgZWxlbWVudFxuICAgICAgZWRpdGFibGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IFRBQl9TSVpFID0gNDtcbiAgY29uc3QgVEFCID0gXCIgXCIucmVwZWF0KFRBQl9TSVpFKTtcbiAgY29uc3QgUkVfTEVBRElOR19UQUIgPSBuZXcgUmVnRXhwKGBeIHsxLCR7VEFCX1NJWkV9fWApO1xuICBjb25zdCBpbmRlbnQgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIH0gPSBlZGl0YWJsZTtcbiAgICBjb25zdCBsaW5lc1N0YXJ0SW5kaWNlcyA9IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMoKTtcblxuICAgIGxldCB2YWx1ZSA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGxpbmVzU3RhcnRJbmRpY2VzLmZvckVhY2goKHN0YXJ0SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuICAgICAgY29uc3QgZW5kVmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4KTtcblxuICAgICAgdmFsdWUgPSBgJHtzdGFydFZhbHVlfSR7VEFCfSR7ZW5kVmFsdWV9YDtcbiAgICB9KTtcblxuICAgIGVkaXRhYmxlLnZhbHVlID0gdmFsdWU7XG5cbiAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0ICsgVEFCX1NJWkU7XG4gICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kICsgVEFCX1NJWkUgKiBsaW5lc1N0YXJ0SW5kaWNlcy5sZW5ndGg7XG4gIH07XG5cbiAgY29uc3Qgb3V0ZGVudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9IGVkaXRhYmxlO1xuICAgIGNvbnN0IGxpbmVzU3RhcnRJbmRpY2VzID0gZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcygpO1xuICAgIGNvbnN0IHJlbW92ZWRUYWJzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgbGV0IHZhbHVlID0gZWRpdGFibGUudmFsdWU7XG4gICAgbGluZXNTdGFydEluZGljZXMuZm9yRWFjaCgoc3RhcnRJbmRleCkgPT4ge1xuICAgICAgY29uc3QgdGFiTWF0Y2ggPSB2YWx1ZVxuICAgICAgICAuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIFRBQl9TSVpFKVxuICAgICAgICAubWF0Y2goUkVfTEVBRElOR19UQUIpO1xuXG4gICAgICBpZiAodGFiTWF0Y2gpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuICAgICAgICBjb25zdCBlbmRWYWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0SW5kZXggKyB0YWJNYXRjaFswXS5sZW5ndGgpO1xuXG4gICAgICAgIC8vIERlbGV0ZSBhIHRhYiBmcm9tIHRoZSBsaW5lXG4gICAgICAgIHZhbHVlID0gYCR7c3RhcnRWYWx1ZX0ke2VuZFZhbHVlfWA7XG4gICAgICAgIHJlbW92ZWRUYWJzLnB1c2goc3RhcnRJbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZGl0YWJsZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHJlbW92ZWRUYWJzLmxlbmd0aCkge1xuICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID4gcmVtb3ZlZFRhYnNbcmVtb3ZlZFRhYnMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBNYXRoLm1heChcbiAgICAgICAgICBzZWxlY3Rpb25TdGFydCAtIFRBQl9TSVpFLFxuICAgICAgICAgIHJlbW92ZWRUYWJzW3JlbW92ZWRUYWJzLmxlbmd0aCAtIDFdLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhlIGN1cnNvciBpcyBiZWZvcmUgdGhlIGZpcnN0IHRhYiByZW1vdmVkLCBleDpcbiAgICAgICAgLy8gTGluZXwgIzFcbiAgICAgICAgLy8gICAgIExpbmUgIzJcbiAgICAgICAgLy8gTGlufGUgIzNcbiAgICAgICAgLy8gd2Ugc2hvdWxkIHJlc2V0IHRoZSBzZWxlY3Rpb25TdGFydCB0byBoaXMgaW5pdGlhbCB2YWx1ZS5cbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydDtcbiAgICAgIH1cbiAgICAgIGVkaXRhYmxlLnNlbGVjdGlvbkVuZCA9IE1hdGgubWF4KFxuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgc2VsZWN0aW9uRW5kIC0gVEFCX1NJWkUgKiByZW1vdmVkVGFicy5sZW5ndGgsXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybnMgaW5kZWNlcyBvZiBzdGFydCBwb3NpdGlvbnMgb2Ygc2VsZWN0ZWQgbGluZXMsIGluIHJldmVyc2Ugb3JkZXJcbiAgICovXG4gIGNvbnN0IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMgPSAoKSA9PiB7XG4gICAgbGV0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCwgdmFsdWUgfSA9IGVkaXRhYmxlO1xuXG4gICAgLy8gY2hhcnMgYmVmb3JlIHNlbGVjdGlvblN0YXJ0IG9uIHRoZSBzYW1lIGxpbmVcbiAgICBjb25zdCBzdGFydE9mZnNldCA9IHZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvblN0YXJ0KS5tYXRjaCgvW15cXG5dKiQvKSFbMF1cbiAgICAgIC5sZW5ndGg7XG4gICAgLy8gcHV0IGNhcmV0IGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZVxuICAgIHNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQgLSBzdGFydE9mZnNldDtcblxuICAgIGNvbnN0IHNlbGVjdGVkID0gdmFsdWUuc2xpY2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRcbiAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKHN0YXJ0SW5kaWNlcywgbGluZSwgaWR4LCBsaW5lcykgPT5cbiAgICAgICAgICBzdGFydEluZGljZXMuY29uY2F0KFxuICAgICAgICAgICAgaWR4XG4gICAgICAgICAgICAgID8gLy8gY3VyciBsaW5lIGluZGV4IGlzIHByZXYgbGluZSdzIHN0YXJ0ICsgcHJldiBsaW5lJ3MgbGVuZ3RoICsgXFxuXG4gICAgICAgICAgICAgICAgc3RhcnRJbmRpY2VzW2lkeCAtIDFdICsgbGluZXNbaWR4IC0gMV0ubGVuZ3RoICsgMVxuICAgICAgICAgICAgICA6IC8vIGZpcnN0IHNlbGVjdGVkIGxpbmVcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICApLFxuICAgICAgICBbXSBhcyBudW1iZXJbXSxcbiAgICAgIClcbiAgICAgIC5yZXZlcnNlKCk7XG4gIH07XG5cbiAgY29uc3Qgc3RvcEV2ZW50ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH07XG5cbiAgLy8gdXNpbmcgYSBzdGF0ZSB2YXJpYWJsZSBpbnN0ZWFkIG9mIHBhc3NpbmcgaXQgdG8gdGhlIGhhbmRsZVN1Ym1pdCBjYWxsYmFja1xuICAvLyBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIHNlcGFyYXRlIGEgY2FsbGJhY2sgZm9yIGV2ZW50IGhhbmRsZXJzXG4gIGxldCBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IGZhbHNlO1xuICBjb25zdCBoYW5kbGVTdWJtaXQgPSAoKSA9PiB7XG4gICAgLy8gY2xlYW51cCBtdXN0IGJlIHJ1biBiZWZvcmUgb25TdWJtaXQgb3RoZXJ3aXNlIHdoZW4gYXBwIGJsdXJzIHRoZSB3eXNpd3lnXG4gICAgLy8gaXQnZCBnZXQgc3R1Y2sgaW4gYW4gaW5maW5pdGUgbG9vcCBvZiBibHVy4oaSb25TdWJtaXQgYWZ0ZXIgd2UgcmUtZm9jdXMgdGhlXG4gICAgLy8gd3lzaXd5ZyBvbiB1cGRhdGVcbiAgICBjbGVhbnVwKCk7XG4gICAgY29uc3QgdXBkYXRlRWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KGVsZW1lbnQuaWQpO1xuICAgIGlmICghdXBkYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgd3JhcHBlZFRleHQgPSBcIlwiO1xuICAgIGlmIChpc1RleHRFbGVtZW50KHVwZGF0ZUVsZW1lbnQpICYmIHVwZGF0ZUVsZW1lbnQ/LmNvbnRhaW5lcklkKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBTY2VuZS5nZXRTY2VuZSh1cGRhdGVFbGVtZW50KSEuZ2V0RWxlbWVudChcbiAgICAgICAgdXBkYXRlRWxlbWVudC5jb250YWluZXJJZCxcbiAgICAgICkgYXMgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudDtcblxuICAgICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgICB3cmFwcGVkVGV4dCA9IHdyYXBUZXh0KFxuICAgICAgICAgIGVkaXRhYmxlLnZhbHVlLFxuICAgICAgICAgIGdldEZvbnRTdHJpbmcodXBkYXRlRWxlbWVudCksXG4gICAgICAgICAgY29udGFpbmVyLndpZHRoLFxuICAgICAgICApO1xuICAgICAgICBpZiAoaXNUZXh0RWxlbWVudCh1cGRhdGVFbGVtZW50KSAmJiB1cGRhdGVFbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgICAgICAgY29uc3QgZWRpdG9ySGVpZ2h0ID0gTnVtYmVyKGVkaXRhYmxlLnN0eWxlLmhlaWdodC5zbGljZSgwLCAtMikpO1xuICAgICAgICAgIGlmIChlZGl0YWJsZS52YWx1ZSkge1xuICAgICAgICAgICAgbXV0YXRlRWxlbWVudCh1cGRhdGVFbGVtZW50LCB7XG4gICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgY2VudGVyIGFsaWduXG4gICAgICAgICAgICAgIHk6IGNvbnRhaW5lci55ICsgY29udGFpbmVyLmhlaWdodCAvIDIgLSBlZGl0b3JIZWlnaHQgLyAyLFxuICAgICAgICAgICAgICBoZWlnaHQ6IGVkaXRvckhlaWdodCxcbiAgICAgICAgICAgICAgd2lkdGg6IE51bWJlcihlZGl0YWJsZS5zdHlsZS53aWR0aC5zbGljZSgwLCAtMikpLFxuICAgICAgICAgICAgICAvLyBwcmVzZXJ2ZSBwYWRkaW5nXG4gICAgICAgICAgICAgIHg6IGNvbnRhaW5lci54ICsgUEFERElORyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGNvbnRhaW5lcik7XG4gICAgICAgICAgICBpZiAoIWJvdW5kVGV4dEVsZW1lbnRJZCB8fCBib3VuZFRleHRFbGVtZW50SWQgIT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnRzOiAoY29udGFpbmVyLmJvdW5kRWxlbWVudHMgfHwgW10pLmNvbmNhdCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgICAgYm91bmRFbGVtZW50czogY29udGFpbmVyLmJvdW5kRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgICAgICAoZWxlKSA9PiBlbGUudHlwZSAhPT0gXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd3JhcHBlZFRleHQgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICB9XG5cbiAgICBvblN1Ym1pdCh7XG4gICAgICB0ZXh0OiBub3JtYWxpemVUZXh0KHdyYXBwZWRUZXh0KSxcbiAgICAgIHZpYUtleWJvYXJkOiBzdWJtaXR0ZWRWaWFLZXlib2FyZCxcbiAgICAgIG9yaWdpbmFsVGV4dDogZWRpdGFibGUudmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIHJlbW92ZSBldmVudHMgdG8gZW5zdXJlIHRoZXkgZG9uJ3QgbGF0ZS1maXJlXG4gICAgZWRpdGFibGUub25ibHVyID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmlucHV0ID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmtleWRvd24gPSBudWxsO1xuXG4gICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlV3lzaXd5Z1N0eWxlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwgdHJ1ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBvblBvaW50ZXJEb3duKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlU3VibWl0KTtcblxuICAgIHVuYmluZFVwZGF0ZSgpO1xuXG4gICAgZWRpdGFibGUucmVtb3ZlKCk7XG4gIH07XG5cbiAgY29uc3QgYmluZEJsdXJFdmVudCA9IChldmVudD86IE1vdXNlRXZlbnQpID0+IHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICAvLyBEZWZlcnJlZCBzbyB0aGF0IHRoZSBwb2ludGVyZG93biB0aGF0IGluaXRpYXRlcyB0aGUgd3lzaXd5ZyBkb2Vzbid0XG4gICAgLy8gdHJpZ2dlciB0aGUgYmx1ciBvbiBlbnN1aW5nIHBvaW50ZXJ1cC5cbiAgICAvLyBBbHNvIHRvIGhhbmRsZSBjYXNlcyBzdWNoIGFzIHBpY2tpbmcgYSBjb2xvciB3aGljaCB3b3VsZCB0cmlnZ2VyIGEgYmx1clxuICAgIC8vIGluIHRoYXQgc2FtZSB0aWNrLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50Py50YXJnZXQ7XG5cbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID1cbiAgICAgIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAgIHRhcmdldC5jbG9zZXN0KFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiKSAmJlxuICAgICAgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZWRpdGFibGUub25ibHVyID0gaGFuZGxlU3VibWl0O1xuICAgICAgaWYgKHRhcmdldCAmJiBpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIHRhcmdldC5vbmJsdXIgPSAoKSA9PiB7XG4gICAgICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIGNhc2U6IGNsaWNraW5nIG9uIHRoZSBzYW1lIHByb3BlcnR5IOKGkiBubyBjaGFuZ2Ug4oaSIG5vIHVwZGF0ZSDihpIgbm8gZm9jdXNcbiAgICAgIGlmICghaXNUYXJnZXRDb2xvclBpY2tlcikge1xuICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8vIHByZXZlbnQgYmx1ciB3aGVuIGNoYW5naW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgbWVudVxuICBjb25zdCBvblBvaW50ZXJEb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNUYXJnZXRDb2xvclBpY2tlciA9XG4gICAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICBldmVudC50YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiZcbiAgICAgIGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKFxuICAgICAgKChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fFxuICAgICAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSAmJlxuICAgICAgICBldmVudC50YXJnZXQuY2xvc2VzdChgLiR7Q0xBU1NFUy5TSEFQRV9BQ1RJT05TX01FTlV9YCkgJiZcbiAgICAgICAgIWlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHx8XG4gICAgICBpc1RhcmdldENvbG9yUGlja2VyXG4gICAgKSB7XG4gICAgICBlZGl0YWJsZS5vbmJsdXIgPSBudWxsO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgICAvLyBoYW5kbGUgZWRnZS1jYXNlIHdoZXJlIHBvaW50ZXJ1cCBkb2Vzbid0IGZpcmUgZS5nLiBkdWUgdG8gdXNlclxuICAgICAgLy8gYWx0LXRhYmJpbmcgYXdheVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGhhbmRsZSB1cGRhdGVzIG9mIHRleHRFbGVtZW50IHByb3BlcnRpZXMgb2YgZWRpdGluZyBlbGVtZW50XG4gIGNvbnN0IHVuYmluZFVwZGF0ZSA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpIS5hZGRDYWxsYmFjaygoKSA9PiB7XG4gICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgY29uc3QgaXNDb2xvclBpY2tlckFjdGl2ZSA9ICEhZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8uY2xvc2VzdChcbiAgICAgIFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiLFxuICAgICk7XG4gICAgaWYgKCFpc0NvbG9yUGlja2VyQWN0aXZlKSB7XG4gICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgbGV0IGlzRGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2VsZWN0IG9uIGluaXQgKGZvY3VzaW5nIGlzIGRvbmUgc2VwYXJhdGVseSBpbnNpZGUgdGhlIGJpbmRCbHVyRXZlbnQoKVxuICAvLyBiZWNhdXNlIHdlIG5lZWQgaXQgdG8gaGFwcGVuICphZnRlciogdGhlIGJsdXIgZXZlbnQgZnJvbSBgcG9pbnRlcmRvd25gKVxuICBlZGl0YWJsZS5zZWxlY3QoKTtcbiAgYmluZEJsdXJFdmVudCgpO1xuXG4gIC8vIHJlcG9zaXRpb24gd3lzaXd5ZyBpbiBjYXNlIG9mIGNhbnZhcyBpcyByZXNpemVkLiBVc2luZyBSZXNpemVPYnNlcnZlclxuICAvLyBpcyBwcmVmZXJyZWQgc28gd2UgY2F0Y2ggY2hhbmdlcyBmcm9tIGhvc3QsIHdoZXJlIHdpbmRvdyBtYXkgbm90IHJlc2l6ZS5cbiAgbGV0IG9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICBpZiAoY2FudmFzICYmIFwiUmVzaXplT2JzZXJ2ZXJcIiBpbiB3aW5kb3cpIHtcbiAgICBvYnNlcnZlciA9IG5ldyB3aW5kb3cuUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShjYW52YXMpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZVd5c2l3eWdTdHlsZSk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIG9uUG9pbnRlckRvd24pO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwge1xuICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgIGNhcHR1cmU6IHRydWUsXG4gIH0pO1xuICBleGNhbGlkcmF3Q29udGFpbmVyXG4gICAgPy5xdWVyeVNlbGVjdG9yKFwiLmV4Y2FsaWRyYXctdGV4dEVkaXRvckNvbnRhaW5lclwiKSFcbiAgICAuYXBwZW5kQ2hpbGQoZWRpdGFibGUpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\n");
|
|
2546
2546
|
|
|
2547
2547
|
/***/ }),
|
|
2548
2548
|
|
|
@@ -3103,7 +3103,7 @@ module.exports = JSON.parse('{"ar-SA":86,"bg-BG":59,"bn-BD":0,"ca-ES":78,"cs-CZ"
|
|
|
3103
3103
|
/***/ ((module) => {
|
|
3104
3104
|
|
|
3105
3105
|
"use strict";
|
|
3106
|
-
module.exports = JSON.parse('{"name":"@zsviczian/excalidraw","version":"0.10.0-textfix-
|
|
3106
|
+
module.exports = JSON.parse('{"name":"@zsviczian/excalidraw","version":"0.10.0-textfix-4","main":"main.js","types":"types/packages/excalidraw/index.d.ts","files":["dist/*","types/*"],"publishConfig":{"access":"public"},"description":"Excalidraw as a React component","repository":"https://github.com/excalidraw/excalidraw","license":"MIT","keywords":["excalidraw","excalidraw-embed","react","npm","npm excalidraw"],"browserslist":{"production":[">0.2%","not dead","not ie <= 11","not op_mini all","not safari < 12","not kaios <= 2.5","not edge < 79","not chrome < 70","not and_uc < 13","not samsung < 10"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"peerDependencies":{"react":"^17.0.2","react-dom":"^17.0.2"},"devDependencies":{"@babel/core":"7.16.0","@babel/plugin-transform-arrow-functions":"7.16.0","@babel/plugin-transform-async-to-generator":"7.16.0","@babel/plugin-transform-runtime":"7.16.4","@babel/plugin-transform-typescript":"7.16.1","@babel/preset-env":"7.16.4","@babel/preset-react":"7.16.0","@babel/preset-typescript":"7.16.0","autoprefixer":"10.4.0","babel-loader":"8.2.3","babel-plugin-transform-class-properties":"6.24.1","cross-env":"7.0.3","css-loader":"6.5.1","mini-css-extract-plugin":"2.4.5","postcss-loader":"6.2.1","sass-loader":"12.4.0","terser-webpack-plugin":"5.2.5","ts-loader":"9.2.6","typescript":"4.5.3","webpack":"5.65.0","webpack-bundle-analyzer":"4.5.0","webpack-cli":"4.9.1"},"bugs":"https://github.com/excalidraw/excalidraw/issues","homepage":"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw","scripts":{"gen:types":"tsc --project ../../../tsconfig-types.json","build:umd":"cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types","build:umd:withAnalyzer":"cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js","pack":"yarn build:umd && yarn pack"},"dependencies":{"dotenv":"10.0.0"}}');
|
|
3107
3107
|
|
|
3108
3108
|
/***/ })
|
|
3109
3109
|
|