@zsviczian/excalidraw 0.10.0-obsidian-36 → 0.10.0-obsidian-37

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.
@@ -2677,7 +2677,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
2677
2677
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2678
2678
 
2679
2679
  "use strict";
2680
- eval("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/* harmony import */ var _actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/actionProperties */ \\\"../../actions/actionProperties.tsx\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst normalizeText = function (text) {\\r\\n return text // replace tabs with spaces so they render and measure correctly\\r\\n .replace(/\\\\t/g, \\\" \\\") // normalize newlines\\r\\n .replace(/\\\\r?\\\\n|\\\\r/g, \\\"\\\\n\\\");\\r\\n};\\r\\nconst getTransform = function (width, height, angle, appState, maxWidth, maxHeight) {\\r\\n const { zoom, offsetTop, offsetLeft } = appState;\\r\\n const degree = 180 * angle / Math.PI; // 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 = function (_ref) {\\r\\n let { id, appState, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, app } = _ref;\\r\\n const textPropertiesUpdated = function (updatedElement, editable) {\\r\\n const currentFont = editable.style.fontFamily.replaceAll('\\\"', \\\"\\\");\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({\\r\\n 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,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element));\\r\\n const updateWysiwygStyle = function () {\\r\\n var _a;\\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 const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updatedElement);\\r\\n let maxWidth = updatedElement.width;\\r\\n let maxHeight = updatedElement.height;\\r\\n let width = updatedElement.width; // Set to element height by default since thats\\r\\n // what is going to be used for unbounded text\\r\\n let height = updatedElement.height;\\r\\n if (container && updatedElement.containerId) {\\r\\n const propertiesUpdated = textPropertiesUpdated(updatedElement, editable); // using editor.style.height to get the accurate height of text editor\\r\\n const editorHeight = Number(editable.style.height.slice(0, -2));\\r\\n if (editorHeight > 0) {\\r\\n height = editorHeight;\\r\\n }\\r\\n if (propertiesUpdated) {\\r\\n approxLineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement));\\r\\n originalContainerHeight = container.height; // update height of the editor after properties updated\\r\\n height = updatedElement.height;\\r\\n }\\r\\n if (!originalContainerHeight) {\\r\\n originalContainerHeight = container.height;\\r\\n }\\r\\n maxWidth = container.width - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\\r\\n maxHeight = container.height - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\\r\\n width = maxWidth; // 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__.BOUND_TEXT_PADDING; // autogrow container height if text exceeds\\r\\n if (height > maxHeight) {\\r\\n const diff = Math.min(height - maxHeight, approxLineHeight);\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\\r\\n height: container.height + diff\\r\\n });\\r\\n return;\\r\\n }\\r\\n else if ( // autoshrink container height until original container height\\r\\n // is reached when text is removed\\r\\n container.height > originalContainerHeight && height < maxHeight) {\\r\\n const diff = Math.min(maxHeight - height, approxLineHeight);\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\\r\\n 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 // vertically center align the text\\r\\n coordY = container.y + container.height / 2 - height / 2;\\r\\n }\\r\\n }\\r\\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\\r\\n const { textAlign } = updatedElement;\\r\\n editable.value = updatedElement.originalText;\\r\\n const lines = updatedElement.originalText.split(\\\"\\\\n\\\");\\r\\n const lineHeight = updatedElement.containerId ? approxLineHeight : updatedElement.height / lines.length;\\r\\n if (!container) {\\r\\n maxWidth = (appState.width - 8 - ((appState.scrollX + updatedElement.x) * appState.zoom.value + appState.zoom.translation.x)) / appState.zoom.value - // 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 } // Make sure text editor height doesn't go beyond viewport\\r\\n const editorMaxHeight = (appState.height - viewportY - ( // 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 ? (appState.zoom.value * 100 - 100) / 10 * 14 : 0)) / appState.zoom.value;\\r\\n const angle = container ? container.angle : updatedElement.angle;\\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 }); // For some reason updating font attribute doesn't set font family\\r\\n // hence updating font family explicitly for test environment\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isTestEnv)()) {\\r\\n editable.style.fontFamily = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)(updatedElement);\\r\\n }\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updatedElement, {\\r\\n x: coordX,\\r\\n y: coordY\\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\\\"; // 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 = function () {\\r\\n // using scrollHeight here since we need to calculate\\r\\n // number of lines so cannot use editable.style.height\\r\\n // as that gets updated below\\r\\n const lines = editable.scrollHeight / approxLineHeight; // 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 let height = \\\"auto\\\";\\r\\n if (lines === 2) {\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\\r\\n const actualLineCount = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element), container.width).split(\\\"\\\\n\\\").length; // This is browser behaviour when setting height to \\\"auto\\\"\\r\\n // It sets the height needed for 2 lines even if actual\\r\\n // line count is 1 as mentioned above as well\\r\\n // hence reducing the height by half if actual line count is 1\\r\\n // so single line aligns vertically when deleting\\r\\n if (actualLineCount === 1) {\\r\\n height = `${editable.scrollHeight / 2}px`;\\r\\n }\\r\\n }\\r\\n editable.style.height = height;\\r\\n editable.style.height = `${editable.scrollHeight}px`;\\r\\n }\\r\\n onChange(normalizeText(editable.value));\\r\\n };\\r\\n }\\r\\n editable.onkeydown = function (event) {\\r\\n event.stopPropagation();\\r\\n if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize.keyTest(event)) {\\r\\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize);\\r\\n }\\r\\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize.keyTest(event)) {\\r\\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize);\\r\\n }\\r\\n else 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 || event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] && (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT || 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 } // 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 = function () {\\r\\n const { selectionStart, selectionEnd } = editable;\\r\\n const linesStartIndices = getSelectedLinesStartIndices();\\r\\n let value = editable.value;\\r\\n linesStartIndices.forEach(function (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 = function () {\\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(function (startIndex) {\\r\\n const tabMatch = value.slice(startIndex, startIndex + TAB_SIZE).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); // 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 = function () {\\r\\n let { selectionStart, selectionEnd, value } = editable; // chars before selectionStart on the same line\\r\\n const startOffset = value.slice(0, selectionStart).match(/[^\\\\n]*$/)[0].length; // 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.split(\\\"\\\\n\\\").reduce(function (startIndices, line, idx, lines) {\\r\\n return startIndices.concat(idx ? // curr line index is prev line's start + prev line's length + \\\\n\\r\\n startIndices[idx - 1] + lines[idx - 1].length + 1 : // first selected line\\r\\n selectionStart);\\r\\n }, []).reverse();\\r\\n };\\r\\n const stopEvent = function (event) {\\r\\n event.preventDefault();\\r\\n event.stopPropagation();\\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 = function () {\\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 text = editable.value;\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updateElement);\\r\\n if (container) {\\r\\n text = updateElement.text;\\r\\n if (editable.value) {\\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(function (ele) {\\r\\n return !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(ele);\\r\\n })\\r\\n });\\r\\n }\\r\\n }\\r\\n onSubmit({\\r\\n text,\\r\\n viaKeyboard: submittedViaKeyboard,\\r\\n originalText: editable.value\\r\\n });\\r\\n };\\r\\n const cleanup = function () {\\r\\n if (isDestroyed) {\\r\\n return;\\r\\n }\\r\\n isDestroyed = true; // 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 = function (event) {\\r\\n window.removeEventListener(\\\"pointerup\\\", bindBlurEvent); // 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 && target.closest(\\\".color-picker-input\\\") && (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\\r\\n setTimeout(function () {\\r\\n editable.onblur = handleSubmit;\\r\\n if (target && isTargetColorPicker) {\\r\\n target.onblur = function () {\\r\\n editable.focus();\\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 }; // prevent blur when changing properties from the menu\\r\\n const onPointerDown = function (event) {\\r\\n const isTargetColorPicker = event.target instanceof HTMLInputElement && event.target.closest(\\\".color-picker-input\\\") && (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\\r\\n if ((event.target instanceof HTMLElement || event.target instanceof SVGElement) && event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) && !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target) || isTargetColorPicker) {\\r\\n editable.onblur = null;\\r\\n window.addEventListener(\\\"pointerup\\\", bindBlurEvent); // 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 }; // handle updates of textElement properties of editing element\\r\\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\\\"default\\\"].getScene(element).addCallback(function () {\\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 let isDestroyed = false; // 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(); // 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(function () {\\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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QUFPLEVBQUUsSUFBSTtLQUNkLENBQUMsQ0FBQztJQUNILG1CQUFtQixhQUFuQixtQkFBbUIsdUJBQW5CLG1CQUFtQixDQUFFLGFBQWEsQ0FBQyxpQ0FBaUMsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDOUYsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvdGV4dFd5c2l3eWcudHN4PzU3ZmQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ09ERVMsIEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHsgaXNXcml0YWJsZUVsZW1lbnQsIGdldEZvbnRTdHJpbmcsIGdldEZvbnRGYW1pbHlTdHJpbmcsIGlzVGVzdEVudiB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgaXNCb3VuZFRvQ29udGFpbmVyLCBpc1RleHRFbGVtZW50IH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgQ0xBU1NFUywgQk9VTkRfVEVYVF9QQURESU5HIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGdldEFwcHJveExpbmVIZWlnaHQsIGdldEJvdW5kVGV4dEVsZW1lbnRJZCwgZ2V0Q29udGFpbmVyRWxlbWVudCwgd3JhcFRleHQgfSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHsgYWN0aW9uRGVjcmVhc2VGb250U2l6ZSwgYWN0aW9uSW5jcmVhc2VGb250U2l6ZSB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvblByb3BlcnRpZXNcIjtcblxuY29uc3Qgbm9ybWFsaXplVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIHJldHVybiB0ZXh0IC8vIHJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcyBzbyB0aGV5IHJlbmRlciBhbmQgbWVhc3VyZSBjb3JyZWN0bHlcbiAgLnJlcGxhY2UoL1xcdC9nLCBcIiAgICAgICAgXCIpIC8vIG5vcm1hbGl6ZSBuZXdsaW5lc1xuICAucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCJcXG5cIik7XG59O1xuXG5jb25zdCBnZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCwgYW5nbGUsIGFwcFN0YXRlLCBtYXhXaWR0aCwgbWF4SGVpZ2h0KSB7XG4gIGNvbnN0IHtcbiAgICB6b29tLFxuICAgIG9mZnNldFRvcCxcbiAgICBvZmZzZXRMZWZ0XG4gIH0gPSBhcHBTdGF0ZTtcbiAgY29uc3QgZGVncmVlID0gMTgwICogYW5nbGUgLyBNYXRoLlBJOyAvLyBvZmZzZXRzIG11c3QgYmUgbXVsdGlwbGllZCBieSAyIHRvIGFjY291bnQgZm9yIHRoZSBkaXZpc2lvbiBieSAyIG9mXG4gIC8vIHRoZSB3aG9sZSBleHByZXNzaW9uIGFmdGVyd2FyZHNcblxuICBsZXQgdHJhbnNsYXRlWCA9ICh3aWR0aCAtIG9mZnNldExlZnQgKiAyKSAqICh6b29tLnZhbHVlIC0gMSkgLyAyO1xuICBsZXQgdHJhbnNsYXRlWSA9IChoZWlnaHQgLSBvZmZzZXRUb3AgKiAyKSAqICh6b29tLnZhbHVlIC0gMSkgLyAyO1xuXG4gIGlmICh3aWR0aCA+IG1heFdpZHRoICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVYID0gKG1heFdpZHRoIC0gb2Zmc2V0TGVmdCAqIDIpICogKHpvb20udmFsdWUgLSAxKSAvIDI7XG4gIH1cblxuICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0ICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVZID0gKG1heEhlaWdodCAtIG9mZnNldFRvcCAqIDIpICogKHpvb20udmFsdWUgLSAxKSAvIDI7XG4gIH1cblxuICByZXR1cm4gYHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVh9cHgsICR7dHJhbnNsYXRlWX1weCkgc2NhbGUoJHt6b29tLnZhbHVlfSkgcm90YXRlKCR7ZGVncmVlfWRlZylgO1xufTtcblxuZXhwb3J0IGNvbnN0IHRleHRXeXNpd3lnID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBpZCxcbiAgICBhcHBTdGF0ZSxcbiAgICBvbkNoYW5nZSxcbiAgICBvblN1Ym1pdCxcbiAgICBnZXRWaWV3cG9ydENvb3JkcyxcbiAgICBlbGVtZW50LFxuICAgIGNhbnZhcyxcbiAgICBleGNhbGlkcmF3Q29udGFpbmVyLFxuICAgIGFwcFxuICB9ID0gX3JlZjtcblxuICBjb25zdCB0ZXh0UHJvcGVydGllc1VwZGF0ZWQgPSBmdW5jdGlvbiAodXBkYXRlZEVsZW1lbnQsIGVkaXRhYmxlKSB7XG4gICAgY29uc3QgY3VycmVudEZvbnQgPSBlZGl0YWJsZS5zdHlsZS5mb250RmFtaWx5LnJlcGxhY2VBbGwoJ1wiJywgXCJcIik7XG5cbiAgICBpZiAoZ2V0Rm9udEZhbWlseVN0cmluZyh7XG4gICAgICBmb250RmFtaWx5OiB1cGRhdGVkRWxlbWVudC5mb250RmFtaWx5XG4gICAgfSkgIT09IGN1cnJlbnRGb250KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoYCR7dXBkYXRlZEVsZW1lbnQuZm9udFNpemV9cHhgICE9PSBlZGl0YWJsZS5zdHlsZS5mb250U2l6ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGxldCBvcmlnaW5hbENvbnRhaW5lckhlaWdodDtcbiAgbGV0IGFwcHJveExpbmVIZWlnaHQgPSBnZXRBcHByb3hMaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcoZWxlbWVudCkpO1xuXG4gIGNvbnN0IHVwZGF0ZVd5c2l3eWdTdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB1cGRhdGVkRWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KGlkKTtcblxuICAgIGlmICh1cGRhdGVkRWxlbWVudCAmJiBpc1RleHRFbGVtZW50KHVwZGF0ZWRFbGVtZW50KSkge1xuICAgICAgbGV0IGNvb3JkWCA9IHVwZGF0ZWRFbGVtZW50Lng7XG4gICAgICBsZXQgY29vcmRZID0gdXBkYXRlZEVsZW1lbnQueTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodXBkYXRlZEVsZW1lbnQpO1xuICAgICAgbGV0IG1heFdpZHRoID0gdXBkYXRlZEVsZW1lbnQud2lkdGg7XG4gICAgICBsZXQgbWF4SGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgbGV0IHdpZHRoID0gdXBkYXRlZEVsZW1lbnQud2lkdGg7IC8vIFNldCB0byBlbGVtZW50IGhlaWdodCBieSBkZWZhdWx0IHNpbmNlIHRoYXRzXG4gICAgICAvLyB3aGF0IGlzIGdvaW5nIHRvIGJlIHVzZWQgZm9yIHVuYm91bmRlZCB0ZXh0XG5cbiAgICAgIGxldCBoZWlnaHQgPSB1cGRhdGVkRWxlbWVudC5oZWlnaHQ7XG5cbiAgICAgIGlmIChjb250YWluZXIgJiYgdXBkYXRlZEVsZW1lbnQuY29udGFpbmVySWQpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydGllc1VwZGF0ZWQgPSB0ZXh0UHJvcGVydGllc1VwZGF0ZWQodXBkYXRlZEVsZW1lbnQsIGVkaXRhYmxlKTsgLy8gdXNpbmcgZWRpdG9yLnN0eWxlLmhlaWdodCB0byBnZXQgdGhlIGFjY3VyYXRlIGhlaWdodCBvZiB0ZXh0IGVkaXRvclxuXG4gICAgICAgIGNvbnN0IGVkaXRvckhlaWdodCA9IE51bWJlcihlZGl0YWJsZS5zdHlsZS5oZWlnaHQuc2xpY2UoMCwgLTIpKTtcblxuICAgICAgICBpZiAoZWRpdG9ySGVpZ2h0ID4gMCkge1xuICAgICAgICAgIGhlaWdodCA9IGVkaXRvckhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0aWVzVXBkYXRlZCkge1xuICAgICAgICAgIGFwcHJveExpbmVIZWlnaHQgPSBnZXRBcHByb3hMaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcodXBkYXRlZEVsZW1lbnQpKTtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQ7IC8vIHVwZGF0ZSBoZWlnaHQgb2YgdGhlIGVkaXRvciBhZnRlciBwcm9wZXJ0aWVzIHVwZGF0ZWRcblxuICAgICAgICAgIGhlaWdodCA9IHVwZGF0ZWRFbGVtZW50LmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3JpZ2luYWxDb250YWluZXJIZWlnaHQpIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBtYXhXaWR0aCA9IGNvbnRhaW5lci53aWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gICAgICAgIG1heEhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICAgICAgICB3aWR0aCA9IG1heFdpZHRoOyAvLyBUaGUgY29vcmRpbmF0ZXMgb2YgdGV4dCBib3ggc2V0IGEgZGlzdGFuY2Ugb2ZcbiAgICAgICAgLy8gMzBweCB0byBwcmVzZXJ2ZSBwYWRkaW5nXG5cbiAgICAgICAgY29vcmRYID0gY29udGFpbmVyLnggKyBCT1VORF9URVhUX1BBRERJTkc7IC8vIGF1dG9ncm93IGNvbnRhaW5lciBoZWlnaHQgaWYgdGV4dCBleGNlZWRzXG5cbiAgICAgICAgaWYgKGhlaWdodCA+IG1heEhlaWdodCkge1xuICAgICAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLm1pbihoZWlnaHQgLSBtYXhIZWlnaHQsIGFwcHJveExpbmVIZWlnaHQpO1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgICAgICBoZWlnaHQ6IGNvbnRhaW5lci5oZWlnaHQgKyBkaWZmXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKCAvLyBhdXRvc2hyaW5rIGNvbnRhaW5lciBoZWlnaHQgdW50aWwgb3JpZ2luYWwgY29udGFpbmVyIGhlaWdodFxuICAgICAgICAvLyBpcyByZWFjaGVkIHdoZW4gdGV4dCBpcyByZW1vdmVkXG4gICAgICAgIGNvbnRhaW5lci5oZWlnaHQgPiBvcmlnaW5hbENvbnRhaW5lckhlaWdodCAmJiBoZWlnaHQgPCBtYXhIZWlnaHQpIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4obWF4SGVpZ2h0IC0gaGVpZ2h0LCBhcHByb3hMaW5lSGVpZ2h0KTtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICAgICAgaGVpZ2h0OiBjb250YWluZXIuaGVpZ2h0IC0gZGlmZlxuICAgICAgICAgIH0pO1xuICAgICAgICB9IC8vIFN0YXJ0IHB1c2hpbmcgdGV4dCB1cHdhcmQgdW50aWwgYSBkaWZmIG9mIDMwcHggKHBhZGRpbmcpXG4gICAgICAgIC8vIGlzIHJlYWNoZWRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gdmVydGljYWxseSBjZW50ZXIgYWxpZ24gdGhlIHRleHRcbiAgICAgICAgICBjb29yZFkgPSBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBbdmlld3BvcnRYLCB2aWV3cG9ydFldID0gZ2V0Vmlld3BvcnRDb29yZHMoY29vcmRYLCBjb29yZFkpO1xuICAgICAgY29uc3Qge1xuICAgICAgICB0ZXh0QWxpZ25cbiAgICAgIH0gPSB1cGRhdGVkRWxlbWVudDtcbiAgICAgIGVkaXRhYmxlLnZhbHVlID0gdXBkYXRlZEVsZW1lbnQub3JpZ2luYWxUZXh0O1xuICAgICAgY29uc3QgbGluZXMgPSB1cGRhdGVkRWxlbWVudC5vcmlnaW5hbFRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuY29udGFpbmVySWQgPyBhcHByb3hMaW5lSGVpZ2h0IDogdXBkYXRlZEVsZW1lbnQuaGVpZ2h0IC8gbGluZXMubGVuZ3RoO1xuXG4gICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICBtYXhXaWR0aCA9IChhcHBTdGF0ZS53aWR0aCAtIDggLSAoKGFwcFN0YXRlLnNjcm9sbFggKyB1cGRhdGVkRWxlbWVudC54KSAqIGFwcFN0YXRlLnpvb20udmFsdWUgKyBhcHBTdGF0ZS56b29tLnRyYW5zbGF0aW9uLngpKSAvIGFwcFN0YXRlLnpvb20udmFsdWUgLSAvLyBtYXJnaW4tcmlnaHQgb2YgcGFyZW50IGlmIGFueVxuICAgICAgICBOdW1iZXIoZ2V0Q29tcHV0ZWRTdHlsZShleGNhbGlkcmF3Q29udGFpbmVyPy5wYXJlbnROb2RlKS5tYXJnaW5SaWdodC5zbGljZSgwLCAtMikpO1xuICAgICAgfSAvLyBNYWtlIHN1cmUgdGV4dCBlZGl0b3IgaGVpZ2h0IGRvZXNuJ3QgZ28gYmV5b25kIHZpZXdwb3J0XG5cblxuICAgICAgY29uc3QgZWRpdG9yTWF4SGVpZ2h0ID0gKGFwcFN0YXRlLmhlaWdodCAtIHZpZXdwb3J0WSAtICggLy8gVGhlcmUgaXMgYSB+MTRweCBkaWZmZXJlbmNlIHdoaWNoIGtlZXBzIG9uIGluY3JlYXNpbmdcbiAgICAgIC8vIHdpdGggZXZlcnkgem9vbSBzdGVwIHdoZW4gb2Zmc2V0IHByZXNlbnQgaGVuY2UgSSBhbSBzdWJ0cmFjdGluZyBpdCBoZXJlXG4gICAgICAvLyBIb3dldmVyIHRoaXMgaXMgbm90IHRoZSBiZXN0IGZpeCBhbmQgYnJlYWtzIGluXG4gICAgICAvLyBmZXcgc2NlbmFyaW9zXG4gICAgICBhcHBTdGF0ZS5vZmZzZXRUb3AgPyAoYXBwU3RhdGUuem9vbS52YWx1ZSAqIDEwMCAtIDEwMCkgLyAxMCAqIDE0IDogMCkpIC8gYXBwU3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIGNvbnN0IGFuZ2xlID0gY29udGFpbmVyID8gY29udGFpbmVyLmFuZ2xlIDogdXBkYXRlZEVsZW1lbnQuYW5nbGU7XG4gICAgICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgICAgIGZvbnQ6IGdldEZvbnRTdHJpbmcodXBkYXRlZEVsZW1lbnQpLFxuICAgICAgICAvLyBtdXN0IGJlIGRlZmluZWQgKmFmdGVyKiBmb250IMKvXFxfKOODhClfL8KvXG4gICAgICAgIGxpbmVIZWlnaHQ6IGAke2xpbmVIZWlnaHR9cHhgLFxuICAgICAgICB3aWR0aDogYCR7d2lkdGh9cHhgLFxuICAgICAgICBoZWlnaHQ6IGAke2hlaWdodH1weGAsXG4gICAgICAgIGxlZnQ6IGAke3ZpZXdwb3J0WH1weGAsXG4gICAgICAgIHRvcDogYCR7dmlld3BvcnRZfXB4YCxcbiAgICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm0od2lkdGgsIGhlaWdodCwgYW5nbGUsIGFwcFN0YXRlLCBtYXhXaWR0aCwgZWRpdG9yTWF4SGVpZ2h0KSxcbiAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICBjb2xvcjogdXBkYXRlZEVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgIG9wYWNpdHk6IHVwZGF0ZWRFbGVtZW50Lm9wYWNpdHkgLyAxMDAsXG4gICAgICAgIGZpbHRlcjogXCJ2YXIoLS10aGVtZS1maWx0ZXIpXCIsXG4gICAgICAgIG1heFdpZHRoOiBgJHttYXhXaWR0aH1weGAsXG4gICAgICAgIG1heEhlaWdodDogYCR7ZWRpdG9yTWF4SGVpZ2h0fXB4YFxuICAgICAgfSk7IC8vIEZvciBzb21lIHJlYXNvbiB1cGRhdGluZyBmb250IGF0dHJpYnV0ZSBkb2Vzbid0IHNldCBmb250IGZhbWlseVxuICAgICAgLy8gaGVuY2UgdXBkYXRpbmcgZm9udCBmYW1pbHkgZXhwbGljaXRseSBmb3IgdGVzdCBlbnZpcm9ubWVudFxuXG4gICAgICBpZiAoaXNUZXN0RW52KCkpIHtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseSA9IGdldEZvbnRGYW1pbHlTdHJpbmcodXBkYXRlZEVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBtdXRhdGVFbGVtZW50KHVwZGF0ZWRFbGVtZW50LCB7XG4gICAgICAgIHg6IGNvb3JkWCxcbiAgICAgICAgeTogY29vcmRZXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZWRpdGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gIGVkaXRhYmxlLmRpciA9IFwiYXV0b1wiO1xuICBlZGl0YWJsZS50YWJJbmRleCA9IDA7XG4gIGVkaXRhYmxlLmRhdGFzZXQudHlwZSA9IFwid3lzaXd5Z1wiOyAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgb24gU2FmYXJpXG5cbiAgZWRpdGFibGUud3JhcCA9IFwib2ZmXCI7XG4gIGVkaXRhYmxlLmNsYXNzTGlzdC5hZGQoXCJleGNhbGlkcmF3LXd5c2l3eWdcIik7XG4gIGxldCB3aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgbGV0IHdvcmRCcmVhayA9IFwibm9ybWFsXCI7XG5cbiAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgIHdoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gICAgd29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gIH1cblxuICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgIG1pbkhlaWdodDogXCIxZW1cIixcbiAgICBiYWNrZmFjZVZpc2liaWxpdHk6IFwiaGlkZGVuXCIsXG4gICAgbWFyZ2luOiAwLFxuICAgIHBhZGRpbmc6IDAsXG4gICAgYm9yZGVyOiAwLFxuICAgIG91dGxpbmU6IDAsXG4gICAgcmVzaXplOiBcIm5vbmVcIixcbiAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgLy8gbXVzdCBiZSBzcGVjaWZpZWQgYmVjYXVzZSBpbiBkYXJrIG1vZGUgY2FudmFzIGNyZWF0ZXMgYSBzdGFja2luZyBjb250ZXh0XG4gICAgekluZGV4OiBcInZhcigtLXpJbmRleC13eXNpd3lnKVwiLFxuICAgIHdvcmRCcmVhayxcbiAgICAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgKGB3aGl0ZXNwYWNlOiBub3dyYXBgIGRvZXNuJ3Qgd29yayBvbiBGRilcbiAgICB3aGl0ZVNwYWNlLFxuICAgIG92ZXJmbG93V3JhcDogXCJicmVhay13b3JkXCJcbiAgfSk7XG4gIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuXG4gIGlmIChvbkNoYW5nZSkge1xuICAgIGVkaXRhYmxlLm9uaW5wdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyB1c2luZyBzY3JvbGxIZWlnaHQgaGVyZSBzaW5jZSB3ZSBuZWVkIHRvIGNhbGN1bGF0ZVxuICAgICAgLy8gbnVtYmVyIG9mIGxpbmVzIHNvIGNhbm5vdCB1c2UgZWRpdGFibGUuc3R5bGUuaGVpZ2h0XG4gICAgICAvLyBhcyB0aGF0IGdldHMgdXBkYXRlZCBiZWxvd1xuICAgICAgY29uc3QgbGluZXMgPSBlZGl0YWJsZS5zY3JvbGxIZWlnaHQgLyBhcHByb3hMaW5lSGVpZ2h0OyAvLyBhdXRvIGluY3JlYXNlIGhlaWdodCBvbmx5IHdoZW4gbGluZXMgID4gMSBzbyBpdHNcbiAgICAgIC8vIG1lYXN1cmVkIGNvcnJlY3RseSBhbmQgdmVydGljYWxseSBhbGlnbmVzIGZvclxuICAgICAgLy8gZmlyc3QgbGluZSBhcyB3ZWxsIGFzIHNldHRpbmcgaGVpZ2h0IHRvIFwiYXV0b1wiXG4gICAgICAvLyBkb3VibGVzIHRoZSBoZWlnaHQgYXMgc29vbiBhcyB1c2VyIHN0YXJ0cyB0eXBpbmdcblxuICAgICAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSAmJiBsaW5lcyA+IDEpIHtcbiAgICAgICAgbGV0IGhlaWdodCA9IFwiYXV0b1wiO1xuXG4gICAgICAgIGlmIChsaW5lcyA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgYWN0dWFsTGluZUNvdW50ID0gd3JhcFRleHQoZWRpdGFibGUudmFsdWUsIGdldEZvbnRTdHJpbmcoZWxlbWVudCksIGNvbnRhaW5lci53aWR0aCkuc3BsaXQoXCJcXG5cIikubGVuZ3RoOyAvLyBUaGlzIGlzIGJyb3dzZXIgYmVoYXZpb3VyIHdoZW4gc2V0dGluZyBoZWlnaHQgdG8gXCJhdXRvXCJcbiAgICAgICAgICAvLyBJdCBzZXRzIHRoZSBoZWlnaHQgbmVlZGVkIGZvciAyIGxpbmVzIGV2ZW4gaWYgYWN0dWFsXG4gICAgICAgICAgLy8gbGluZSBjb3VudCBpcyAxIGFzIG1lbnRpb25lZCBhYm92ZSBhcyB3ZWxsXG4gICAgICAgICAgLy8gaGVuY2UgcmVkdWNpbmcgdGhlIGhlaWdodCBieSBoYWxmIGlmIGFjdHVhbCBsaW5lIGNvdW50IGlzIDFcbiAgICAgICAgICAvLyBzbyBzaW5nbGUgbGluZSBhbGlnbnMgdmVydGljYWxseSB3aGVuIGRlbGV0aW5nXG5cbiAgICAgICAgICBpZiAoYWN0dWFsTGluZUNvdW50ID09PSAxKSB7XG4gICAgICAgICAgICBoZWlnaHQgPSBgJHtlZGl0YWJsZS5zY3JvbGxIZWlnaHQgLyAyfXB4YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlZGl0YWJsZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IGAke2VkaXRhYmxlLnNjcm9sbEhlaWdodH1weGA7XG4gICAgICB9XG5cbiAgICAgIG9uQ2hhbmdlKG5vcm1hbGl6ZVRleHQoZWRpdGFibGUudmFsdWUpKTtcbiAgICB9O1xuICB9XG5cbiAgZWRpdGFibGUub25rZXlkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAoYWN0aW9uRGVjcmVhc2VGb250U2l6ZS5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25EZWNyZWFzZUZvbnRTaXplKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbkluY3JlYXNlRm9udFNpemUua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uSW5jcmVhc2VGb250U2l6ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRVNDQVBFKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgaGFuZGxlU3VibWl0KCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIgJiYgZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGlmIChldmVudC5pc0NvbXBvc2luZyB8fCBldmVudC5rZXlDb2RlID09PSAyMjkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IHRydWU7XG4gICAgICBoYW5kbGVTdWJtaXQoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5UQUIgfHwgZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgKGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCB8fCBldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX1JJR0hUKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCkge1xuICAgICAgICBvdXRkZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRlbnQoKTtcbiAgICAgIH0gLy8gV2UgbXVzdCBzZW5kIGFuIGlucHV0IGV2ZW50IHRvIHJlc2l6ZSB0aGUgZWxlbWVudFxuXG5cbiAgICAgIGVkaXRhYmxlLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIikpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBUQUJfU0laRSA9IDQ7XG4gIGNvbnN0IFRBQiA9IFwiIFwiLnJlcGVhdChUQUJfU0laRSk7XG4gIGNvbnN0IFJFX0xFQURJTkdfVEFCID0gbmV3IFJlZ0V4cChgXiB7MSwke1RBQl9TSVpFfX1gKTtcblxuICBjb25zdCBpbmRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2VsZWN0aW9uU3RhcnQsXG4gICAgICBzZWxlY3Rpb25FbmRcbiAgICB9ID0gZWRpdGFibGU7XG4gICAgY29uc3QgbGluZXNTdGFydEluZGljZXMgPSBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzKCk7XG4gICAgbGV0IHZhbHVlID0gZWRpdGFibGUudmFsdWU7XG4gICAgbGluZXNTdGFydEluZGljZXMuZm9yRWFjaChmdW5jdGlvbiAoc3RhcnRJbmRleCkge1xuICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuICAgICAgY29uc3QgZW5kVmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4KTtcbiAgICAgIHZhbHVlID0gYCR7c3RhcnRWYWx1ZX0ke1RBQn0ke2VuZFZhbHVlfWA7XG4gICAgfSk7XG4gICAgZWRpdGFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0ICsgVEFCX1NJWkU7XG4gICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kICsgVEFCX1NJWkUgKiBsaW5lc1N0YXJ0SW5kaWNlcy5sZW5ndGg7XG4gIH07XG5cbiAgY29uc3Qgb3V0ZGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzZWxlY3Rpb25TdGFydCxcbiAgICAgIHNlbGVjdGlvbkVuZFxuICAgIH0gPSBlZGl0YWJsZTtcbiAgICBjb25zdCBsaW5lc1N0YXJ0SW5kaWNlcyA9IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMoKTtcbiAgICBjb25zdCByZW1vdmVkVGFicyA9IFtdO1xuICAgIGxldCB2YWx1ZSA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGxpbmVzU3RhcnRJbmRpY2VzLmZvckVhY2goZnVuY3Rpb24gKHN0YXJ0SW5kZXgpIHtcbiAgICAgIGNvbnN0IHRhYk1hdGNoID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIFRBQl9TSVpFKS5tYXRjaChSRV9MRUFESU5HX1RBQik7XG5cbiAgICAgIGlmICh0YWJNYXRjaCkge1xuICAgICAgICBjb25zdCBzdGFydFZhbHVlID0gdmFsdWUuc2xpY2UoMCwgc3RhcnRJbmRleCk7XG4gICAgICAgIGNvbnN0IGVuZFZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCArIHRhYk1hdGNoWzBdLmxlbmd0aCk7IC8vIERlbGV0ZSBhIHRhYiBmcm9tIHRoZSBsaW5lXG5cbiAgICAgICAgdmFsdWUgPSBgJHtzdGFydFZhbHVlfSR7ZW5kVmFsdWV9YDtcbiAgICAgICAgcmVtb3ZlZFRhYnMucHVzaChzdGFydEluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZGl0YWJsZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHJlbW92ZWRUYWJzLmxlbmd0aCkge1xuICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID4gcmVtb3ZlZFRhYnNbcmVtb3ZlZFRhYnMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBNYXRoLm1heChzZWxlY3Rpb25TdGFydCAtIFRBQl9TSVpFLCByZW1vdmVkVGFic1tyZW1vdmVkVGFicy5sZW5ndGggLSAxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIGJlZm9yZSB0aGUgZmlyc3QgdGFiIHJlbW92ZWQsIGV4OlxuICAgICAgICAvLyBMaW5lfCAjMVxuICAgICAgICAvLyAgICAgTGluZSAjMlxuICAgICAgICAvLyBMaW58ZSAjM1xuICAgICAgICAvLyB3ZSBzaG91bGQgcmVzZXQgdGhlIHNlbGVjdGlvblN0YXJ0IHRvIGhpcyBpbml0aWFsIHZhbHVlLlxuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0O1xuICAgICAgfVxuXG4gICAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBNYXRoLm1heChlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIC0gVEFCX1NJWkUgKiByZW1vdmVkVGFicy5sZW5ndGgpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIEByZXR1cm5zIGluZGVjZXMgb2Ygc3RhcnQgcG9zaXRpb25zIG9mIHNlbGVjdGVkIGxpbmVzLCBpbiByZXZlcnNlIG9yZGVyXG4gICAqL1xuXG5cbiAgY29uc3QgZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQge1xuICAgICAgc2VsZWN0aW9uU3RhcnQsXG4gICAgICBzZWxlY3Rpb25FbmQsXG4gICAgICB2YWx1ZVxuICAgIH0gPSBlZGl0YWJsZTsgLy8gY2hhcnMgYmVmb3JlIHNlbGVjdGlvblN0YXJ0IG9uIHRoZSBzYW1lIGxpbmVcblxuICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gdmFsdWUuc2xpY2UoMCwgc2VsZWN0aW9uU3RhcnQpLm1hdGNoKC9bXlxcbl0qJC8pWzBdLmxlbmd0aDsgLy8gcHV0IGNhcmV0IGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZVxuXG4gICAgc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydCAtIHN0YXJ0T2Zmc2V0O1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdmFsdWUuc2xpY2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7XG4gICAgcmV0dXJuIHNlbGVjdGVkLnNwbGl0KFwiXFxuXCIpLnJlZHVjZShmdW5jdGlvbiAoc3RhcnRJbmRpY2VzLCBsaW5lLCBpZHgsIGxpbmVzKSB7XG4gICAgICByZXR1cm4gc3RhcnRJbmRpY2VzLmNvbmNhdChpZHggPyAvLyBjdXJyIGxpbmUgaW5kZXggaXMgcHJldiBsaW5lJ3Mgc3RhcnQgKyBwcmV2IGxpbmUncyBsZW5ndGggKyBcXG5cbiAgICAgIHN0YXJ0SW5kaWNlc1tpZHggLSAxXSArIGxpbmVzW2lkeCAtIDFdLmxlbmd0aCArIDEgOiAvLyBmaXJzdCBzZWxlY3RlZCBsaW5lXG4gICAgICBzZWxlY3Rpb25TdGFydCk7XG4gICAgfSwgW10pLnJldmVyc2UoKTtcbiAgfTtcblxuICBjb25zdCBzdG9wRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9OyAvLyB1c2luZyBhIHN0YXRlIHZhcmlhYmxlIGluc3RlYWQgb2YgcGFzc2luZyBpdCB0byB0aGUgaGFuZGxlU3VibWl0IGNhbGxiYWNrXG4gIC8vIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgc2VwYXJhdGUgYSBjYWxsYmFjayBmb3IgZXZlbnQgaGFuZGxlcnNcblxuXG4gIGxldCBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBjbGVhbnVwIG11c3QgYmUgcnVuIGJlZm9yZSBvblN1Ym1pdCBvdGhlcndpc2Ugd2hlbiBhcHAgYmx1cnMgdGhlIHd5c2l3eWdcbiAgICAvLyBpdCdkIGdldCBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wIG9mIGJsdXLihpJvblN1Ym1pdCBhZnRlciB3ZSByZS1mb2N1cyB0aGVcbiAgICAvLyB3eXNpd3lnIG9uIHVwZGF0ZVxuICAgIGNsZWFudXAoKTtcbiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoZWxlbWVudC5pZCk7XG5cbiAgICBpZiAoIXVwZGF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdGV4dCA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodXBkYXRlRWxlbWVudCk7XG5cbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICB0ZXh0ID0gdXBkYXRlRWxlbWVudC50ZXh0O1xuXG4gICAgICBpZiAoZWRpdGFibGUudmFsdWUpIHtcbiAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGNvbnRhaW5lcik7XG5cbiAgICAgICAgaWYgKCFib3VuZFRleHRFbGVtZW50SWQgfHwgYm91bmRUZXh0RWxlbWVudElkICE9PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgIGJvdW5kRWxlbWVudHM6IChjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCBbXSkuY29uY2F0KHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICAgIGJvdW5kRWxlbWVudHM6IGNvbnRhaW5lci5ib3VuZEVsZW1lbnRzPy5maWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgcmV0dXJuICFpc1RleHRFbGVtZW50KGVsZSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb25TdWJtaXQoe1xuICAgICAgdGV4dCxcbiAgICAgIHZpYUtleWJvYXJkOiBzdWJtaXR0ZWRWaWFLZXlib2FyZCxcbiAgICAgIG9yaWdpbmFsVGV4dDogZWRpdGFibGUudmFsdWVcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBjbGVhbnVwID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc0Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlzRGVzdHJveWVkID0gdHJ1ZTsgLy8gcmVtb3ZlIGV2ZW50cyB0byBlbnN1cmUgdGhleSBkb24ndCBsYXRlLWZpcmVcblxuICAgIGVkaXRhYmxlLm9uYmx1ciA9IG51bGw7XG4gICAgZWRpdGFibGUub25pbnB1dCA9IG51bGw7XG4gICAgZWRpdGFibGUub25rZXlkb3duID0gbnVsbDtcblxuICAgIGlmIChvYnNlcnZlcikge1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZVd5c2l3eWdTdHlsZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBzdG9wRXZlbnQsIHRydWUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgb25Qb2ludGVyRG93bik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG4gICAgdW5iaW5kVXBkYXRlKCk7XG4gICAgZWRpdGFibGUucmVtb3ZlKCk7XG4gIH07XG5cbiAgY29uc3QgYmluZEJsdXJFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpOyAvLyBEZWZlcnJlZCBzbyB0aGF0IHRoZSBwb2ludGVyZG93biB0aGF0IGluaXRpYXRlcyB0aGUgd3lzaXd5ZyBkb2Vzbid0XG4gICAgLy8gdHJpZ2dlciB0aGUgYmx1ciBvbiBlbnN1aW5nIHBvaW50ZXJ1cC5cbiAgICAvLyBBbHNvIHRvIGhhbmRsZSBjYXNlcyBzdWNoIGFzIHBpY2tpbmcgYSBjb2xvciB3aGljaCB3b3VsZCB0cmlnZ2VyIGEgYmx1clxuICAgIC8vIGluIHRoYXQgc2FtZSB0aWNrLlxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQ/LnRhcmdldDtcbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID0gdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiB0YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiYgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGVkaXRhYmxlLm9uYmx1ciA9IGhhbmRsZVN1Ym1pdDtcblxuICAgICAgaWYgKHRhcmdldCAmJiBpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIHRhcmdldC5vbmJsdXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICAgICAgfTtcbiAgICAgIH0gLy8gY2FzZTogY2xpY2tpbmcgb24gdGhlIHNhbWUgcHJvcGVydHkg4oaSIG5vIGNoYW5nZSDihpIgbm8gdXBkYXRlIOKGkiBubyBmb2N1c1xuXG5cbiAgICAgIGlmICghaXNUYXJnZXRDb2xvclBpY2tlcikge1xuICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9OyAvLyBwcmV2ZW50IGJsdXIgd2hlbiBjaGFuZ2luZyBwcm9wZXJ0aWVzIGZyb20gdGhlIG1lbnVcblxuXG4gIGNvbnN0IG9uUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID0gZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBldmVudC50YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiYgaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcblxuICAgIGlmICgoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgJiYgZXZlbnQudGFyZ2V0LmNsb3Nlc3QoYC4ke0NMQVNTRVMuU0hBUEVfQUNUSU9OU19NRU5VfWApICYmICFpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpIHx8IGlzVGFyZ2V0Q29sb3JQaWNrZXIpIHtcbiAgICAgIGVkaXRhYmxlLm9uYmx1ciA9IG51bGw7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTsgLy8gaGFuZGxlIGVkZ2UtY2FzZSB3aGVyZSBwb2ludGVydXAgZG9lc24ndCBmaXJlIGUuZy4gZHVlIHRvIHVzZXJcbiAgICAgIC8vIGFsdC10YWJiaW5nIGF3YXlcblxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG4gICAgfVxuICB9OyAvLyBoYW5kbGUgdXBkYXRlcyBvZiB0ZXh0RWxlbWVudCBwcm9wZXJ0aWVzIG9mIGVkaXRpbmcgZWxlbWVudFxuXG5cbiAgY29uc3QgdW5iaW5kVXBkYXRlID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCkuYWRkQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIGNvbnN0IGlzQ29sb3JQaWNrZXJBY3RpdmUgPSAhIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LmNsb3Nlc3QoXCIuY29sb3ItcGlja2VyLWlucHV0XCIpO1xuXG4gICAgaWYgKCFpc0NvbG9yUGlja2VyQWN0aXZlKSB7XG4gICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgIH1cbiAgfSk7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGxldCBpc0Rlc3Ryb3llZCA9IGZhbHNlOyAvLyBzZWxlY3Qgb24gaW5pdCAoZm9jdXNpbmcgaXMgZG9uZSBzZXBhcmF0ZWx5IGluc2lkZSB0aGUgYmluZEJsdXJFdmVudCgpXG4gIC8vIGJlY2F1c2Ugd2UgbmVlZCBpdCB0byBoYXBwZW4gKmFmdGVyKiB0aGUgYmx1ciBldmVudCBmcm9tIGBwb2ludGVyZG93bmApXG5cbiAgZWRpdGFibGUuc2VsZWN0KCk7XG4gIGJpbmRCbHVyRXZlbnQoKTsgLy8gcmVwb3NpdGlvbiB3eXNpd3lnIGluIGNhc2Ugb2YgY2FudmFzIGlzIHJlc2l6ZWQuIFVzaW5nIFJlc2l6ZU9ic2VydmVyXG4gIC8vIGlzIHByZWZlcnJlZCBzbyB3ZSBjYXRjaCBjaGFuZ2VzIGZyb20gaG9zdCwgd2hlcmUgd2luZG93IG1heSBub3QgcmVzaXplLlxuXG4gIGxldCBvYnNlcnZlciA9IG51bGw7XG5cbiAgaWYgKGNhbnZhcyAmJiBcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93KSB7XG4gICAgb2JzZXJ2ZXIgPSBuZXcgd2luZG93LlJlc2l6ZU9ic2VydmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoY2FudmFzKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGVXeXNpd3lnU3R5bGUpO1xuICB9XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBvblBvaW50ZXJEb3duKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBzdG9wRXZlbnQsIHtcbiAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICBjYXB0dXJlOiB0cnVlXG4gIH0pO1xuICBleGNhbGlkcmF3Q29udGFpbmVyPy5xdWVyeVNlbGVjdG9yKFwiLmV4Y2FsaWRyYXctdGV4dEVkaXRvckNvbnRhaW5lclwiKS5hcHBlbmRDaGlsZChlZGl0YWJsZSk7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../element/textWysiwyg.tsx?");
2680
+ eval("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/* harmony import */ var _actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/actionProperties */ \\\"../../actions/actionProperties.tsx\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst normalizeText = function (text) {\\r\\n return text // replace tabs with spaces so they render and measure correctly\\r\\n .replace(/\\\\t/g, \\\" \\\") // normalize newlines\\r\\n .replace(/\\\\r?\\\\n|\\\\r/g, \\\"\\\\n\\\");\\r\\n};\\r\\nconst getTransform = function (width, height, angle, appState, maxWidth, maxHeight) {\\r\\n const { zoom } = appState;\\r\\n const degree = 180 * angle / Math.PI;\\r\\n let translateX = width * (zoom.value - 1) / 2;\\r\\n let translateY = height * (zoom.value - 1) / 2;\\r\\n if (width > maxWidth && zoom.value !== 1) {\\r\\n translateX = maxWidth * (zoom.value - 1) / 2;\\r\\n }\\r\\n if (height > maxHeight && zoom.value !== 1) {\\r\\n translateY = maxHeight * (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 = function (_ref) {\\r\\n let { id, appState, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, app } = _ref;\\r\\n const textPropertiesUpdated = function (updatedElement, editable) {\\r\\n const currentFont = editable.style.fontFamily.replaceAll('\\\"', \\\"\\\");\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({\\r\\n 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,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element));\\r\\n const updateWysiwygStyle = function () {\\r\\n var _a;\\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 const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updatedElement);\\r\\n let maxWidth = updatedElement.width;\\r\\n let maxHeight = updatedElement.height;\\r\\n let width = updatedElement.width; // Set to element height by default since thats\\r\\n // what is going to be used for unbounded text\\r\\n let height = updatedElement.height;\\r\\n if (container && updatedElement.containerId) {\\r\\n const propertiesUpdated = textPropertiesUpdated(updatedElement, editable); // using editor.style.height to get the accurate height of text editor\\r\\n const editorHeight = Number(editable.style.height.slice(0, -2));\\r\\n if (editorHeight > 0) {\\r\\n height = editorHeight;\\r\\n }\\r\\n if (propertiesUpdated) {\\r\\n approxLineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement));\\r\\n originalContainerHeight = container.height; // update height of the editor after properties updated\\r\\n height = updatedElement.height;\\r\\n }\\r\\n if (!originalContainerHeight) {\\r\\n originalContainerHeight = container.height;\\r\\n }\\r\\n maxWidth = container.width - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\\r\\n maxHeight = container.height - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\\r\\n width = maxWidth; // 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__.BOUND_TEXT_PADDING; // autogrow container height if text exceeds\\r\\n if (height > maxHeight) {\\r\\n const diff = Math.min(height - maxHeight, approxLineHeight);\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\\r\\n height: container.height + diff\\r\\n });\\r\\n return;\\r\\n }\\r\\n else if ( // autoshrink container height until original container height\\r\\n // is reached when text is removed\\r\\n container.height > originalContainerHeight && height < maxHeight) {\\r\\n const diff = Math.min(maxHeight - height, approxLineHeight);\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\\r\\n 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 // vertically center align the text\\r\\n coordY = container.y + container.height / 2 - height / 2;\\r\\n }\\r\\n }\\r\\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\\r\\n const { textAlign } = updatedElement;\\r\\n editable.value = updatedElement.originalText;\\r\\n const lines = updatedElement.originalText.split(\\\"\\\\n\\\");\\r\\n const lineHeight = updatedElement.containerId ? approxLineHeight : updatedElement.height / lines.length;\\r\\n if (!container) {\\r\\n maxWidth = (appState.width - 8 - viewportX) / appState.zoom.value;\\r\\n } // Make sure text editor height doesn't go beyond viewport\\r\\n const editorMaxHeight = (appState.height - viewportY) / appState.zoom.value;\\r\\n const angle = container ? container.angle : updatedElement.angle;\\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 }); // For some reason updating font attribute doesn't set font family\\r\\n // hence updating font family explicitly for test environment\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isTestEnv)()) {\\r\\n editable.style.fontFamily = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)(updatedElement);\\r\\n }\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updatedElement, {\\r\\n x: coordX,\\r\\n y: coordY\\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\\\"; // 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 = function () {\\r\\n // using scrollHeight here since we need to calculate\\r\\n // number of lines so cannot use editable.style.height\\r\\n // as that gets updated below\\r\\n const lines = editable.scrollHeight / approxLineHeight; // 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 let height = \\\"auto\\\";\\r\\n if (lines === 2) {\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\\r\\n const actualLineCount = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element), container.width).split(\\\"\\\\n\\\").length; // This is browser behaviour when setting height to \\\"auto\\\"\\r\\n // It sets the height needed for 2 lines even if actual\\r\\n // line count is 1 as mentioned above as well\\r\\n // hence reducing the height by half if actual line count is 1\\r\\n // so single line aligns vertically when deleting\\r\\n if (actualLineCount === 1) {\\r\\n height = `${editable.scrollHeight / 2}px`;\\r\\n }\\r\\n }\\r\\n editable.style.height = height;\\r\\n editable.style.height = `${editable.scrollHeight}px`;\\r\\n }\\r\\n onChange(normalizeText(editable.value));\\r\\n };\\r\\n }\\r\\n editable.onkeydown = function (event) {\\r\\n event.stopPropagation();\\r\\n if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize.keyTest(event)) {\\r\\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize);\\r\\n }\\r\\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize.keyTest(event)) {\\r\\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize);\\r\\n }\\r\\n else 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 || event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] && (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT || 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 } // 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 = function () {\\r\\n const { selectionStart, selectionEnd } = editable;\\r\\n const linesStartIndices = getSelectedLinesStartIndices();\\r\\n let value = editable.value;\\r\\n linesStartIndices.forEach(function (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 = function () {\\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(function (startIndex) {\\r\\n const tabMatch = value.slice(startIndex, startIndex + TAB_SIZE).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); // 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 = function () {\\r\\n let { selectionStart, selectionEnd, value } = editable; // chars before selectionStart on the same line\\r\\n const startOffset = value.slice(0, selectionStart).match(/[^\\\\n]*$/)[0].length; // 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.split(\\\"\\\\n\\\").reduce(function (startIndices, line, idx, lines) {\\r\\n return startIndices.concat(idx ? // curr line index is prev line's start + prev line's length + \\\\n\\r\\n startIndices[idx - 1] + lines[idx - 1].length + 1 : // first selected line\\r\\n selectionStart);\\r\\n }, []).reverse();\\r\\n };\\r\\n const stopEvent = function (event) {\\r\\n event.preventDefault();\\r\\n event.stopPropagation();\\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 = function () {\\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 text = editable.value;\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updateElement);\\r\\n if (container) {\\r\\n text = updateElement.text;\\r\\n if (editable.value) {\\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(function (ele) {\\r\\n return !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(ele);\\r\\n })\\r\\n });\\r\\n }\\r\\n }\\r\\n onSubmit({\\r\\n text,\\r\\n viaKeyboard: submittedViaKeyboard,\\r\\n originalText: editable.value\\r\\n });\\r\\n };\\r\\n const cleanup = function () {\\r\\n if (isDestroyed) {\\r\\n return;\\r\\n }\\r\\n isDestroyed = true; // 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 = function (event) {\\r\\n window.removeEventListener(\\\"pointerup\\\", bindBlurEvent); // 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 && target.closest(\\\".color-picker-input\\\") && (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\\r\\n setTimeout(function () {\\r\\n editable.onblur = handleSubmit;\\r\\n if (target && isTargetColorPicker) {\\r\\n target.onblur = function () {\\r\\n editable.focus();\\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 }; // prevent blur when changing properties from the menu\\r\\n const onPointerDown = function (event) {\\r\\n const isTargetColorPicker = event.target instanceof HTMLInputElement && event.target.closest(\\\".color-picker-input\\\") && (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\\r\\n if ((event.target instanceof HTMLElement || event.target instanceof SVGElement) && event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) && !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target) || isTargetColorPicker) {\\r\\n editable.onblur = null;\\r\\n window.addEventListener(\\\"pointerup\\\", bindBlurEvent); // 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 }; // handle updates of textElement properties of editing element\\r\\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\\\"default\\\"].getScene(element).addCallback(function () {\\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 let isDestroyed = false; // 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(); // 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(function () {\\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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QyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMxQjtTQUFNO1FBQ0wsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0tBQ3ZEO0lBRUQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN0RCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRTtRQUMxQyxPQUFPLEVBQUUsS0FBSztRQUNkLE9BQU8sRUFBRSxJQUFJO0tBQ2QsQ0FBQyxDQUFDO0lBQ0gsbUJBQW1CLGFBQW5CLG1CQUFtQix1QkFBbkIsbUJBQW1CLENBQUUsYUFBYSxDQUFDLGlDQUFpQyxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM5RixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC90ZXh0V3lzaXd5Zy50c3g/NTdmZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT0RFUywgS0VZUyB9IGZyb20gXCIuLi9rZXlzXCI7XG5pbXBvcnQgeyBpc1dyaXRhYmxlRWxlbWVudCwgZ2V0Rm9udFN0cmluZywgZ2V0Rm9udEZhbWlseVN0cmluZywgaXNUZXN0RW52IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQgeyBpc0JvdW5kVG9Db250YWluZXIsIGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBDTEFTU0VTLCBCT1VORF9URVhUX1BBRERJTkcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0QXBwcm94TGluZUhlaWdodCwgZ2V0Qm91bmRUZXh0RWxlbWVudElkLCBnZXRDb250YWluZXJFbGVtZW50LCB3cmFwVGV4dCB9IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBhY3Rpb25EZWNyZWFzZUZvbnRTaXplLCBhY3Rpb25JbmNyZWFzZUZvbnRTaXplIH0gZnJvbSBcIi4uL2FjdGlvbnMvYWN0aW9uUHJvcGVydGllc1wiO1xuXG5jb25zdCBub3JtYWxpemVUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgcmV0dXJuIHRleHQgLy8gcmVwbGFjZSB0YWJzIHdpdGggc3BhY2VzIHNvIHRoZXkgcmVuZGVyIGFuZCBtZWFzdXJlIGNvcnJlY3RseVxuICAucmVwbGFjZSgvXFx0L2csIFwiICAgICAgICBcIikgLy8gbm9ybWFsaXplIG5ld2xpbmVzXG4gIC5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIlxcblwiKTtcbn07XG5cbmNvbnN0IGdldFRyYW5zZm9ybSA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0LCBhbmdsZSwgYXBwU3RhdGUsIG1heFdpZHRoLCBtYXhIZWlnaHQpIHtcbiAgY29uc3Qge1xuICAgIHpvb21cbiAgfSA9IGFwcFN0YXRlO1xuICBjb25zdCBkZWdyZWUgPSAxODAgKiBhbmdsZSAvIE1hdGguUEk7XG4gIGxldCB0cmFuc2xhdGVYID0gd2lkdGggKiAoem9vbS52YWx1ZSAtIDEpIC8gMjtcbiAgbGV0IHRyYW5zbGF0ZVkgPSBoZWlnaHQgKiAoem9vbS52YWx1ZSAtIDEpIC8gMjtcblxuICBpZiAod2lkdGggPiBtYXhXaWR0aCAmJiB6b29tLnZhbHVlICE9PSAxKSB7XG4gICAgdHJhbnNsYXRlWCA9IG1heFdpZHRoICogKHpvb20udmFsdWUgLSAxKSAvIDI7XG4gIH1cblxuICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0ICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVZID0gbWF4SGVpZ2h0ICogKHpvb20udmFsdWUgLSAxKSAvIDI7XG4gIH1cblxuICByZXR1cm4gYHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVh9cHgsICR7dHJhbnNsYXRlWX1weCkgc2NhbGUoJHt6b29tLnZhbHVlfSkgcm90YXRlKCR7ZGVncmVlfWRlZylgO1xufTtcblxuZXhwb3J0IGNvbnN0IHRleHRXeXNpd3lnID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBpZCxcbiAgICBhcHBTdGF0ZSxcbiAgICBvbkNoYW5nZSxcbiAgICBvblN1Ym1pdCxcbiAgICBnZXRWaWV3cG9ydENvb3JkcyxcbiAgICBlbGVtZW50LFxuICAgIGNhbnZhcyxcbiAgICBleGNhbGlkcmF3Q29udGFpbmVyLFxuICAgIGFwcFxuICB9ID0gX3JlZjtcblxuICBjb25zdCB0ZXh0UHJvcGVydGllc1VwZGF0ZWQgPSBmdW5jdGlvbiAodXBkYXRlZEVsZW1lbnQsIGVkaXRhYmxlKSB7XG4gICAgY29uc3QgY3VycmVudEZvbnQgPSBlZGl0YWJsZS5zdHlsZS5mb250RmFtaWx5LnJlcGxhY2VBbGwoJ1wiJywgXCJcIik7XG5cbiAgICBpZiAoZ2V0Rm9udEZhbWlseVN0cmluZyh7XG4gICAgICBmb250RmFtaWx5OiB1cGRhdGVkRWxlbWVudC5mb250RmFtaWx5XG4gICAgfSkgIT09IGN1cnJlbnRGb250KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoYCR7dXBkYXRlZEVsZW1lbnQuZm9udFNpemV9cHhgICE9PSBlZGl0YWJsZS5zdHlsZS5mb250U2l6ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGxldCBvcmlnaW5hbENvbnRhaW5lckhlaWdodDtcbiAgbGV0IGFwcHJveExpbmVIZWlnaHQgPSBnZXRBcHByb3hMaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcoZWxlbWVudCkpO1xuXG4gIGNvbnN0IHVwZGF0ZVd5c2l3eWdTdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB1cGRhdGVkRWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KGlkKTtcblxuICAgIGlmICh1cGRhdGVkRWxlbWVudCAmJiBpc1RleHRFbGVtZW50KHVwZGF0ZWRFbGVtZW50KSkge1xuICAgICAgbGV0IGNvb3JkWCA9IHVwZGF0ZWRFbGVtZW50Lng7XG4gICAgICBsZXQgY29vcmRZID0gdXBkYXRlZEVsZW1lbnQueTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodXBkYXRlZEVsZW1lbnQpO1xuICAgICAgbGV0IG1heFdpZHRoID0gdXBkYXRlZEVsZW1lbnQud2lkdGg7XG4gICAgICBsZXQgbWF4SGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgbGV0IHdpZHRoID0gdXBkYXRlZEVsZW1lbnQud2lkdGg7IC8vIFNldCB0byBlbGVtZW50IGhlaWdodCBieSBkZWZhdWx0IHNpbmNlIHRoYXRzXG4gICAgICAvLyB3aGF0IGlzIGdvaW5nIHRvIGJlIHVzZWQgZm9yIHVuYm91bmRlZCB0ZXh0XG5cbiAgICAgIGxldCBoZWlnaHQgPSB1cGRhdGVkRWxlbWVudC5oZWlnaHQ7XG5cbiAgICAgIGlmIChjb250YWluZXIgJiYgdXBkYXRlZEVsZW1lbnQuY29udGFpbmVySWQpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydGllc1VwZGF0ZWQgPSB0ZXh0UHJvcGVydGllc1VwZGF0ZWQodXBkYXRlZEVsZW1lbnQsIGVkaXRhYmxlKTsgLy8gdXNpbmcgZWRpdG9yLnN0eWxlLmhlaWdodCB0byBnZXQgdGhlIGFjY3VyYXRlIGhlaWdodCBvZiB0ZXh0IGVkaXRvclxuXG4gICAgICAgIGNvbnN0IGVkaXRvckhlaWdodCA9IE51bWJlcihlZGl0YWJsZS5zdHlsZS5oZWlnaHQuc2xpY2UoMCwgLTIpKTtcblxuICAgICAgICBpZiAoZWRpdG9ySGVpZ2h0ID4gMCkge1xuICAgICAgICAgIGhlaWdodCA9IGVkaXRvckhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0aWVzVXBkYXRlZCkge1xuICAgICAgICAgIGFwcHJveExpbmVIZWlnaHQgPSBnZXRBcHByb3hMaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcodXBkYXRlZEVsZW1lbnQpKTtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQ7IC8vIHVwZGF0ZSBoZWlnaHQgb2YgdGhlIGVkaXRvciBhZnRlciBwcm9wZXJ0aWVzIHVwZGF0ZWRcblxuICAgICAgICAgIGhlaWdodCA9IHVwZGF0ZWRFbGVtZW50LmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3JpZ2luYWxDb250YWluZXJIZWlnaHQpIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBtYXhXaWR0aCA9IGNvbnRhaW5lci53aWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gICAgICAgIG1heEhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICAgICAgICB3aWR0aCA9IG1heFdpZHRoOyAvLyBUaGUgY29vcmRpbmF0ZXMgb2YgdGV4dCBib3ggc2V0IGEgZGlzdGFuY2Ugb2ZcbiAgICAgICAgLy8gMzBweCB0byBwcmVzZXJ2ZSBwYWRkaW5nXG5cbiAgICAgICAgY29vcmRYID0gY29udGFpbmVyLnggKyBCT1VORF9URVhUX1BBRERJTkc7IC8vIGF1dG9ncm93IGNvbnRhaW5lciBoZWlnaHQgaWYgdGV4dCBleGNlZWRzXG5cbiAgICAgICAgaWYgKGhlaWdodCA+IG1heEhlaWdodCkge1xuICAgICAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLm1pbihoZWlnaHQgLSBtYXhIZWlnaHQsIGFwcHJveExpbmVIZWlnaHQpO1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgICAgICBoZWlnaHQ6IGNvbnRhaW5lci5oZWlnaHQgKyBkaWZmXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKCAvLyBhdXRvc2hyaW5rIGNvbnRhaW5lciBoZWlnaHQgdW50aWwgb3JpZ2luYWwgY29udGFpbmVyIGhlaWdodFxuICAgICAgICAvLyBpcyByZWFjaGVkIHdoZW4gdGV4dCBpcyByZW1vdmVkXG4gICAgICAgIGNvbnRhaW5lci5oZWlnaHQgPiBvcmlnaW5hbENvbnRhaW5lckhlaWdodCAmJiBoZWlnaHQgPCBtYXhIZWlnaHQpIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4obWF4SGVpZ2h0IC0gaGVpZ2h0LCBhcHByb3hMaW5lSGVpZ2h0KTtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICAgICAgaGVpZ2h0OiBjb250YWluZXIuaGVpZ2h0IC0gZGlmZlxuICAgICAgICAgIH0pO1xuICAgICAgICB9IC8vIFN0YXJ0IHB1c2hpbmcgdGV4dCB1cHdhcmQgdW50aWwgYSBkaWZmIG9mIDMwcHggKHBhZGRpbmcpXG4gICAgICAgIC8vIGlzIHJlYWNoZWRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gdmVydGljYWxseSBjZW50ZXIgYWxpZ24gdGhlIHRleHRcbiAgICAgICAgICBjb29yZFkgPSBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBbdmlld3BvcnRYLCB2aWV3cG9ydFldID0gZ2V0Vmlld3BvcnRDb29yZHMoY29vcmRYLCBjb29yZFkpO1xuICAgICAgY29uc3Qge1xuICAgICAgICB0ZXh0QWxpZ25cbiAgICAgIH0gPSB1cGRhdGVkRWxlbWVudDtcbiAgICAgIGVkaXRhYmxlLnZhbHVlID0gdXBkYXRlZEVsZW1lbnQub3JpZ2luYWxUZXh0O1xuICAgICAgY29uc3QgbGluZXMgPSB1cGRhdGVkRWxlbWVudC5vcmlnaW5hbFRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuY29udGFpbmVySWQgPyBhcHByb3hMaW5lSGVpZ2h0IDogdXBkYXRlZEVsZW1lbnQuaGVpZ2h0IC8gbGluZXMubGVuZ3RoO1xuXG4gICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICBtYXhXaWR0aCA9IChhcHBTdGF0ZS53aWR0aCAtIDggLSB2aWV3cG9ydFgpIC8gYXBwU3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIH0gLy8gTWFrZSBzdXJlIHRleHQgZWRpdG9yIGhlaWdodCBkb2Vzbid0IGdvIGJleW9uZCB2aWV3cG9ydFxuXG5cbiAgICAgIGNvbnN0IGVkaXRvck1heEhlaWdodCA9IChhcHBTdGF0ZS5oZWlnaHQgLSB2aWV3cG9ydFkpIC8gYXBwU3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIGNvbnN0IGFuZ2xlID0gY29udGFpbmVyID8gY29udGFpbmVyLmFuZ2xlIDogdXBkYXRlZEVsZW1lbnQuYW5nbGU7XG4gICAgICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgICAgIGZvbnQ6IGdldEZvbnRTdHJpbmcodXBkYXRlZEVsZW1lbnQpLFxuICAgICAgICAvLyBtdXN0IGJlIGRlZmluZWQgKmFmdGVyKiBmb250IMKvXFxfKOODhClfL8KvXG4gICAgICAgIGxpbmVIZWlnaHQ6IGAke2xpbmVIZWlnaHR9cHhgLFxuICAgICAgICB3aWR0aDogYCR7d2lkdGh9cHhgLFxuICAgICAgICBoZWlnaHQ6IGAke2hlaWdodH1weGAsXG4gICAgICAgIGxlZnQ6IGAke3ZpZXdwb3J0WH1weGAsXG4gICAgICAgIHRvcDogYCR7dmlld3BvcnRZfXB4YCxcbiAgICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm0od2lkdGgsIGhlaWdodCwgYW5nbGUsIGFwcFN0YXRlLCBtYXhXaWR0aCwgZWRpdG9yTWF4SGVpZ2h0KSxcbiAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICBjb2xvcjogdXBkYXRlZEVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgIG9wYWNpdHk6IHVwZGF0ZWRFbGVtZW50Lm9wYWNpdHkgLyAxMDAsXG4gICAgICAgIGZpbHRlcjogXCJ2YXIoLS10aGVtZS1maWx0ZXIpXCIsXG4gICAgICAgIG1heFdpZHRoOiBgJHttYXhXaWR0aH1weGAsXG4gICAgICAgIG1heEhlaWdodDogYCR7ZWRpdG9yTWF4SGVpZ2h0fXB4YFxuICAgICAgfSk7IC8vIEZvciBzb21lIHJlYXNvbiB1cGRhdGluZyBmb250IGF0dHJpYnV0ZSBkb2Vzbid0IHNldCBmb250IGZhbWlseVxuICAgICAgLy8gaGVuY2UgdXBkYXRpbmcgZm9udCBmYW1pbHkgZXhwbGljaXRseSBmb3IgdGVzdCBlbnZpcm9ubWVudFxuXG4gICAgICBpZiAoaXNUZXN0RW52KCkpIHtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseSA9IGdldEZvbnRGYW1pbHlTdHJpbmcodXBkYXRlZEVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBtdXRhdGVFbGVtZW50KHVwZGF0ZWRFbGVtZW50LCB7XG4gICAgICAgIHg6IGNvb3JkWCxcbiAgICAgICAgeTogY29vcmRZXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZWRpdGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gIGVkaXRhYmxlLmRpciA9IFwiYXV0b1wiO1xuICBlZGl0YWJsZS50YWJJbmRleCA9IDA7XG4gIGVkaXRhYmxlLmRhdGFzZXQudHlwZSA9IFwid3lzaXd5Z1wiOyAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgb24gU2FmYXJpXG5cbiAgZWRpdGFibGUud3JhcCA9IFwib2ZmXCI7XG4gIGVkaXRhYmxlLmNsYXNzTGlzdC5hZGQoXCJleGNhbGlkcmF3LXd5c2l3eWdcIik7XG4gIGxldCB3aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgbGV0IHdvcmRCcmVhayA9IFwibm9ybWFsXCI7XG5cbiAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgIHdoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gICAgd29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gIH1cblxuICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgIG1pbkhlaWdodDogXCIxZW1cIixcbiAgICBiYWNrZmFjZVZpc2liaWxpdHk6IFwiaGlkZGVuXCIsXG4gICAgbWFyZ2luOiAwLFxuICAgIHBhZGRpbmc6IDAsXG4gICAgYm9yZGVyOiAwLFxuICAgIG91dGxpbmU6IDAsXG4gICAgcmVzaXplOiBcIm5vbmVcIixcbiAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgLy8gbXVzdCBiZSBzcGVjaWZpZWQgYmVjYXVzZSBpbiBkYXJrIG1vZGUgY2FudmFzIGNyZWF0ZXMgYSBzdGFja2luZyBjb250ZXh0XG4gICAgekluZGV4OiBcInZhcigtLXpJbmRleC13eXNpd3lnKVwiLFxuICAgIHdvcmRCcmVhayxcbiAgICAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgKGB3aGl0ZXNwYWNlOiBub3dyYXBgIGRvZXNuJ3Qgd29yayBvbiBGRilcbiAgICB3aGl0ZVNwYWNlLFxuICAgIG92ZXJmbG93V3JhcDogXCJicmVhay13b3JkXCJcbiAgfSk7XG4gIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuXG4gIGlmIChvbkNoYW5nZSkge1xuICAgIGVkaXRhYmxlLm9uaW5wdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyB1c2luZyBzY3JvbGxIZWlnaHQgaGVyZSBzaW5jZSB3ZSBuZWVkIHRvIGNhbGN1bGF0ZVxuICAgICAgLy8gbnVtYmVyIG9mIGxpbmVzIHNvIGNhbm5vdCB1c2UgZWRpdGFibGUuc3R5bGUuaGVpZ2h0XG4gICAgICAvLyBhcyB0aGF0IGdldHMgdXBkYXRlZCBiZWxvd1xuICAgICAgY29uc3QgbGluZXMgPSBlZGl0YWJsZS5zY3JvbGxIZWlnaHQgLyBhcHByb3hMaW5lSGVpZ2h0OyAvLyBhdXRvIGluY3JlYXNlIGhlaWdodCBvbmx5IHdoZW4gbGluZXMgID4gMSBzbyBpdHNcbiAgICAgIC8vIG1lYXN1cmVkIGNvcnJlY3RseSBhbmQgdmVydGljYWxseSBhbGlnbmVzIGZvclxuICAgICAgLy8gZmlyc3QgbGluZSBhcyB3ZWxsIGFzIHNldHRpbmcgaGVpZ2h0IHRvIFwiYXV0b1wiXG4gICAgICAvLyBkb3VibGVzIHRoZSBoZWlnaHQgYXMgc29vbiBhcyB1c2VyIHN0YXJ0cyB0eXBpbmdcblxuICAgICAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSAmJiBsaW5lcyA+IDEpIHtcbiAgICAgICAgbGV0IGhlaWdodCA9IFwiYXV0b1wiO1xuXG4gICAgICAgIGlmIChsaW5lcyA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgYWN0dWFsTGluZUNvdW50ID0gd3JhcFRleHQoZWRpdGFibGUudmFsdWUsIGdldEZvbnRTdHJpbmcoZWxlbWVudCksIGNvbnRhaW5lci53aWR0aCkuc3BsaXQoXCJcXG5cIikubGVuZ3RoOyAvLyBUaGlzIGlzIGJyb3dzZXIgYmVoYXZpb3VyIHdoZW4gc2V0dGluZyBoZWlnaHQgdG8gXCJhdXRvXCJcbiAgICAgICAgICAvLyBJdCBzZXRzIHRoZSBoZWlnaHQgbmVlZGVkIGZvciAyIGxpbmVzIGV2ZW4gaWYgYWN0dWFsXG4gICAgICAgICAgLy8gbGluZSBjb3VudCBpcyAxIGFzIG1lbnRpb25lZCBhYm92ZSBhcyB3ZWxsXG4gICAgICAgICAgLy8gaGVuY2UgcmVkdWNpbmcgdGhlIGhlaWdodCBieSBoYWxmIGlmIGFjdHVhbCBsaW5lIGNvdW50IGlzIDFcbiAgICAgICAgICAvLyBzbyBzaW5nbGUgbGluZSBhbGlnbnMgdmVydGljYWxseSB3aGVuIGRlbGV0aW5nXG5cbiAgICAgICAgICBpZiAoYWN0dWFsTGluZUNvdW50ID09PSAxKSB7XG4gICAgICAgICAgICBoZWlnaHQgPSBgJHtlZGl0YWJsZS5zY3JvbGxIZWlnaHQgLyAyfXB4YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlZGl0YWJsZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IGAke2VkaXRhYmxlLnNjcm9sbEhlaWdodH1weGA7XG4gICAgICB9XG5cbiAgICAgIG9uQ2hhbmdlKG5vcm1hbGl6ZVRleHQoZWRpdGFibGUudmFsdWUpKTtcbiAgICB9O1xuICB9XG5cbiAgZWRpdGFibGUub25rZXlkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAoYWN0aW9uRGVjcmVhc2VGb250U2l6ZS5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25EZWNyZWFzZUZvbnRTaXplKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbkluY3JlYXNlRm9udFNpemUua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uSW5jcmVhc2VGb250U2l6ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRVNDQVBFKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgaGFuZGxlU3VibWl0KCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIgJiYgZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGlmIChldmVudC5pc0NvbXBvc2luZyB8fCBldmVudC5rZXlDb2RlID09PSAyMjkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IHRydWU7XG4gICAgICBoYW5kbGVTdWJtaXQoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5UQUIgfHwgZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgKGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCB8fCBldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX1JJR0hUKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCkge1xuICAgICAgICBvdXRkZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRlbnQoKTtcbiAgICAgIH0gLy8gV2UgbXVzdCBzZW5kIGFuIGlucHV0IGV2ZW50IHRvIHJlc2l6ZSB0aGUgZWxlbWVudFxuXG5cbiAgICAgIGVkaXRhYmxlLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIikpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBUQUJfU0laRSA9IDQ7XG4gIGNvbnN0IFRBQiA9IFwiIFwiLnJlcGVhdChUQUJfU0laRSk7XG4gIGNvbnN0IFJFX0xFQURJTkdfVEFCID0gbmV3IFJlZ0V4cChgXiB7MSwke1RBQl9TSVpFfX1gKTtcblxuICBjb25zdCBpbmRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2VsZWN0aW9uU3RhcnQsXG4gICAgICBzZWxlY3Rpb25FbmRcbiAgICB9ID0gZWRpdGFibGU7XG4gICAgY29uc3QgbGluZXNTdGFydEluZGljZXMgPSBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzKCk7XG4gICAgbGV0IHZhbHVlID0gZWRpdGFibGUudmFsdWU7XG4gICAgbGluZXNTdGFydEluZGljZXMuZm9yRWFjaChmdW5jdGlvbiAoc3RhcnRJbmRleCkge1xuICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuICAgICAgY29uc3QgZW5kVmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4KTtcbiAgICAgIHZhbHVlID0gYCR7c3RhcnRWYWx1ZX0ke1RBQn0ke2VuZFZhbHVlfWA7XG4gICAgfSk7XG4gICAgZWRpdGFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0ICsgVEFCX1NJWkU7XG4gICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kICsgVEFCX1NJWkUgKiBsaW5lc1N0YXJ0SW5kaWNlcy5sZW5ndGg7XG4gIH07XG5cbiAgY29uc3Qgb3V0ZGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzZWxlY3Rpb25TdGFydCxcbiAgICAgIHNlbGVjdGlvbkVuZFxuICAgIH0gPSBlZGl0YWJsZTtcbiAgICBjb25zdCBsaW5lc1N0YXJ0SW5kaWNlcyA9IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMoKTtcbiAgICBjb25zdCByZW1vdmVkVGFicyA9IFtdO1xuICAgIGxldCB2YWx1ZSA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGxpbmVzU3RhcnRJbmRpY2VzLmZvckVhY2goZnVuY3Rpb24gKHN0YXJ0SW5kZXgpIHtcbiAgICAgIGNvbnN0IHRhYk1hdGNoID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIFRBQl9TSVpFKS5tYXRjaChSRV9MRUFESU5HX1RBQik7XG5cbiAgICAgIGlmICh0YWJNYXRjaCkge1xuICAgICAgICBjb25zdCBzdGFydFZhbHVlID0gdmFsdWUuc2xpY2UoMCwgc3RhcnRJbmRleCk7XG4gICAgICAgIGNvbnN0IGVuZFZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCArIHRhYk1hdGNoWzBdLmxlbmd0aCk7IC8vIERlbGV0ZSBhIHRhYiBmcm9tIHRoZSBsaW5lXG5cbiAgICAgICAgdmFsdWUgPSBgJHtzdGFydFZhbHVlfSR7ZW5kVmFsdWV9YDtcbiAgICAgICAgcmVtb3ZlZFRhYnMucHVzaChzdGFydEluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZGl0YWJsZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHJlbW92ZWRUYWJzLmxlbmd0aCkge1xuICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID4gcmVtb3ZlZFRhYnNbcmVtb3ZlZFRhYnMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBNYXRoLm1heChzZWxlY3Rpb25TdGFydCAtIFRBQl9TSVpFLCByZW1vdmVkVGFic1tyZW1vdmVkVGFicy5sZW5ndGggLSAxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIGJlZm9yZSB0aGUgZmlyc3QgdGFiIHJlbW92ZWQsIGV4OlxuICAgICAgICAvLyBMaW5lfCAjMVxuICAgICAgICAvLyAgICAgTGluZSAjMlxuICAgICAgICAvLyBMaW58ZSAjM1xuICAgICAgICAvLyB3ZSBzaG91bGQgcmVzZXQgdGhlIHNlbGVjdGlvblN0YXJ0IHRvIGhpcyBpbml0aWFsIHZhbHVlLlxuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0O1xuICAgICAgfVxuXG4gICAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBNYXRoLm1heChlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIC0gVEFCX1NJWkUgKiByZW1vdmVkVGFicy5sZW5ndGgpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIEByZXR1cm5zIGluZGVjZXMgb2Ygc3RhcnQgcG9zaXRpb25zIG9mIHNlbGVjdGVkIGxpbmVzLCBpbiByZXZlcnNlIG9yZGVyXG4gICAqL1xuXG5cbiAgY29uc3QgZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQge1xuICAgICAgc2VsZWN0aW9uU3RhcnQsXG4gICAgICBzZWxlY3Rpb25FbmQsXG4gICAgICB2YWx1ZVxuICAgIH0gPSBlZGl0YWJsZTsgLy8gY2hhcnMgYmVmb3JlIHNlbGVjdGlvblN0YXJ0IG9uIHRoZSBzYW1lIGxpbmVcblxuICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gdmFsdWUuc2xpY2UoMCwgc2VsZWN0aW9uU3RhcnQpLm1hdGNoKC9bXlxcbl0qJC8pWzBdLmxlbmd0aDsgLy8gcHV0IGNhcmV0IGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZVxuXG4gICAgc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydCAtIHN0YXJ0T2Zmc2V0O1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdmFsdWUuc2xpY2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7XG4gICAgcmV0dXJuIHNlbGVjdGVkLnNwbGl0KFwiXFxuXCIpLnJlZHVjZShmdW5jdGlvbiAoc3RhcnRJbmRpY2VzLCBsaW5lLCBpZHgsIGxpbmVzKSB7XG4gICAgICByZXR1cm4gc3RhcnRJbmRpY2VzLmNvbmNhdChpZHggPyAvLyBjdXJyIGxpbmUgaW5kZXggaXMgcHJldiBsaW5lJ3Mgc3RhcnQgKyBwcmV2IGxpbmUncyBsZW5ndGggKyBcXG5cbiAgICAgIHN0YXJ0SW5kaWNlc1tpZHggLSAxXSArIGxpbmVzW2lkeCAtIDFdLmxlbmd0aCArIDEgOiAvLyBmaXJzdCBzZWxlY3RlZCBsaW5lXG4gICAgICBzZWxlY3Rpb25TdGFydCk7XG4gICAgfSwgW10pLnJldmVyc2UoKTtcbiAgfTtcblxuICBjb25zdCBzdG9wRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9OyAvLyB1c2luZyBhIHN0YXRlIHZhcmlhYmxlIGluc3RlYWQgb2YgcGFzc2luZyBpdCB0byB0aGUgaGFuZGxlU3VibWl0IGNhbGxiYWNrXG4gIC8vIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgc2VwYXJhdGUgYSBjYWxsYmFjayBmb3IgZXZlbnQgaGFuZGxlcnNcblxuXG4gIGxldCBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBjbGVhbnVwIG11c3QgYmUgcnVuIGJlZm9yZSBvblN1Ym1pdCBvdGhlcndpc2Ugd2hlbiBhcHAgYmx1cnMgdGhlIHd5c2l3eWdcbiAgICAvLyBpdCdkIGdldCBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wIG9mIGJsdXLihpJvblN1Ym1pdCBhZnRlciB3ZSByZS1mb2N1cyB0aGVcbiAgICAvLyB3eXNpd3lnIG9uIHVwZGF0ZVxuICAgIGNsZWFudXAoKTtcbiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoZWxlbWVudC5pZCk7XG5cbiAgICBpZiAoIXVwZGF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdGV4dCA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodXBkYXRlRWxlbWVudCk7XG5cbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICB0ZXh0ID0gdXBkYXRlRWxlbWVudC50ZXh0O1xuXG4gICAgICBpZiAoZWRpdGFibGUudmFsdWUpIHtcbiAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGNvbnRhaW5lcik7XG5cbiAgICAgICAgaWYgKCFib3VuZFRleHRFbGVtZW50SWQgfHwgYm91bmRUZXh0RWxlbWVudElkICE9PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgIGJvdW5kRWxlbWVudHM6IChjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCBbXSkuY29uY2F0KHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICAgIGJvdW5kRWxlbWVudHM6IGNvbnRhaW5lci5ib3VuZEVsZW1lbnRzPy5maWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgcmV0dXJuICFpc1RleHRFbGVtZW50KGVsZSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb25TdWJtaXQoe1xuICAgICAgdGV4dCxcbiAgICAgIHZpYUtleWJvYXJkOiBzdWJtaXR0ZWRWaWFLZXlib2FyZCxcbiAgICAgIG9yaWdpbmFsVGV4dDogZWRpdGFibGUudmFsdWVcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBjbGVhbnVwID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc0Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlzRGVzdHJveWVkID0gdHJ1ZTsgLy8gcmVtb3ZlIGV2ZW50cyB0byBlbnN1cmUgdGhleSBkb24ndCBsYXRlLWZpcmVcblxuICAgIGVkaXRhYmxlLm9uYmx1ciA9IG51bGw7XG4gICAgZWRpdGFibGUub25pbnB1dCA9IG51bGw7XG4gICAgZWRpdGFibGUub25rZXlkb3duID0gbnVsbDtcblxuICAgIGlmIChvYnNlcnZlcikge1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZVd5c2l3eWdTdHlsZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBzdG9wRXZlbnQsIHRydWUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgb25Qb2ludGVyRG93bik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG4gICAgdW5iaW5kVXBkYXRlKCk7XG4gICAgZWRpdGFibGUucmVtb3ZlKCk7XG4gIH07XG5cbiAgY29uc3QgYmluZEJsdXJFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpOyAvLyBEZWZlcnJlZCBzbyB0aGF0IHRoZSBwb2ludGVyZG93biB0aGF0IGluaXRpYXRlcyB0aGUgd3lzaXd5ZyBkb2Vzbid0XG4gICAgLy8gdHJpZ2dlciB0aGUgYmx1ciBvbiBlbnN1aW5nIHBvaW50ZXJ1cC5cbiAgICAvLyBBbHNvIHRvIGhhbmRsZSBjYXNlcyBzdWNoIGFzIHBpY2tpbmcgYSBjb2xvciB3aGljaCB3b3VsZCB0cmlnZ2VyIGEgYmx1clxuICAgIC8vIGluIHRoYXQgc2FtZSB0aWNrLlxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQ/LnRhcmdldDtcbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID0gdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiB0YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiYgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGVkaXRhYmxlLm9uYmx1ciA9IGhhbmRsZVN1Ym1pdDtcblxuICAgICAgaWYgKHRhcmdldCAmJiBpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIHRhcmdldC5vbmJsdXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICAgICAgfTtcbiAgICAgIH0gLy8gY2FzZTogY2xpY2tpbmcgb24gdGhlIHNhbWUgcHJvcGVydHkg4oaSIG5vIGNoYW5nZSDihpIgbm8gdXBkYXRlIOKGkiBubyBmb2N1c1xuXG5cbiAgICAgIGlmICghaXNUYXJnZXRDb2xvclBpY2tlcikge1xuICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9OyAvLyBwcmV2ZW50IGJsdXIgd2hlbiBjaGFuZ2luZyBwcm9wZXJ0aWVzIGZyb20gdGhlIG1lbnVcblxuXG4gIGNvbnN0IG9uUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID0gZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBldmVudC50YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiYgaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcblxuICAgIGlmICgoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgJiYgZXZlbnQudGFyZ2V0LmNsb3Nlc3QoYC4ke0NMQVNTRVMuU0hBUEVfQUNUSU9OU19NRU5VfWApICYmICFpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpIHx8IGlzVGFyZ2V0Q29sb3JQaWNrZXIpIHtcbiAgICAgIGVkaXRhYmxlLm9uYmx1ciA9IG51bGw7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTsgLy8gaGFuZGxlIGVkZ2UtY2FzZSB3aGVyZSBwb2ludGVydXAgZG9lc24ndCBmaXJlIGUuZy4gZHVlIHRvIHVzZXJcbiAgICAgIC8vIGFsdC10YWJiaW5nIGF3YXlcblxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG4gICAgfVxuICB9OyAvLyBoYW5kbGUgdXBkYXRlcyBvZiB0ZXh0RWxlbWVudCBwcm9wZXJ0aWVzIG9mIGVkaXRpbmcgZWxlbWVudFxuXG5cbiAgY29uc3QgdW5iaW5kVXBkYXRlID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCkuYWRkQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIGNvbnN0IGlzQ29sb3JQaWNrZXJBY3RpdmUgPSAhIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LmNsb3Nlc3QoXCIuY29sb3ItcGlja2VyLWlucHV0XCIpO1xuXG4gICAgaWYgKCFpc0NvbG9yUGlja2VyQWN0aXZlKSB7XG4gICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgIH1cbiAgfSk7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGxldCBpc0Rlc3Ryb3llZCA9IGZhbHNlOyAvLyBzZWxlY3Qgb24gaW5pdCAoZm9jdXNpbmcgaXMgZG9uZSBzZXBhcmF0ZWx5IGluc2lkZSB0aGUgYmluZEJsdXJFdmVudCgpXG4gIC8vIGJlY2F1c2Ugd2UgbmVlZCBpdCB0byBoYXBwZW4gKmFmdGVyKiB0aGUgYmx1ciBldmVudCBmcm9tIGBwb2ludGVyZG93bmApXG5cbiAgZWRpdGFibGUuc2VsZWN0KCk7XG4gIGJpbmRCbHVyRXZlbnQoKTsgLy8gcmVwb3NpdGlvbiB3eXNpd3lnIGluIGNhc2Ugb2YgY2FudmFzIGlzIHJlc2l6ZWQuIFVzaW5nIFJlc2l6ZU9ic2VydmVyXG4gIC8vIGlzIHByZWZlcnJlZCBzbyB3ZSBjYXRjaCBjaGFuZ2VzIGZyb20gaG9zdCwgd2hlcmUgd2luZG93IG1heSBub3QgcmVzaXplLlxuXG4gIGxldCBvYnNlcnZlciA9IG51bGw7XG5cbiAgaWYgKGNhbnZhcyAmJiBcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93KSB7XG4gICAgb2JzZXJ2ZXIgPSBuZXcgd2luZG93LlJlc2l6ZU9ic2VydmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoY2FudmFzKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGVXeXNpd3lnU3R5bGUpO1xuICB9XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBvblBvaW50ZXJEb3duKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBzdG9wRXZlbnQsIHtcbiAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICBjYXB0dXJlOiB0cnVlXG4gIH0pO1xuICBleGNhbGlkcmF3Q29udGFpbmVyPy5xdWVyeVNlbGVjdG9yKFwiLmV4Y2FsaWRyYXctdGV4dEVkaXRvckNvbnRhaW5lclwiKS5hcHBlbmRDaGlsZChlZGl0YWJsZSk7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../element/textWysiwyg.tsx?");
2681
2681
 
2682
2682
  /***/ }),
2683
2683
 
@@ -3073,7 +3073,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
3073
3073
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3074
3074
 
3075
3075
  "use strict";
3076
- eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"setDateTimeForTests\\\": () => (/* binding */ setDateTimeForTests),\\n/* harmony export */ \\\"getDateTime\\\": () => (/* binding */ getDateTime),\\n/* harmony export */ \\\"capitalizeString\\\": () => (/* binding */ capitalizeString),\\n/* harmony export */ \\\"isToolIcon\\\": () => (/* binding */ isToolIcon),\\n/* harmony export */ \\\"isInputLike\\\": () => (/* binding */ isInputLike),\\n/* harmony export */ \\\"isWritableElement\\\": () => (/* binding */ isWritableElement),\\n/* harmony export */ \\\"getFontFamilyString\\\": () => (/* binding */ getFontFamilyString),\\n/* harmony export */ \\\"getFontString\\\": () => (/* binding */ getFontString),\\n/* harmony export */ \\\"debounce\\\": () => (/* binding */ debounce),\\n/* harmony export */ \\\"chunk\\\": () => (/* binding */ chunk),\\n/* harmony export */ \\\"selectNode\\\": () => (/* binding */ selectNode),\\n/* harmony export */ \\\"removeSelection\\\": () => (/* binding */ removeSelection),\\n/* harmony export */ \\\"distance\\\": () => (/* binding */ distance),\\n/* harmony export */ \\\"resetCursor\\\": () => (/* binding */ resetCursor),\\n/* harmony export */ \\\"setCursor\\\": () => (/* binding */ setCursor),\\n/* harmony export */ \\\"setCursorForShape\\\": () => (/* binding */ setCursorForShape),\\n/* harmony export */ \\\"isFullScreen\\\": () => (/* binding */ isFullScreen),\\n/* harmony export */ \\\"allowFullScreen\\\": () => (/* binding */ allowFullScreen),\\n/* harmony export */ \\\"exitFullScreen\\\": () => (/* binding */ exitFullScreen),\\n/* harmony export */ \\\"getShortcutKey\\\": () => (/* binding */ getShortcutKey),\\n/* harmony export */ \\\"viewportCoordsToSceneCoords\\\": () => (/* binding */ viewportCoordsToSceneCoords),\\n/* harmony export */ \\\"sceneCoordsToViewportCoords\\\": () => (/* binding */ sceneCoordsToViewportCoords),\\n/* harmony export */ \\\"getGlobalCSSVariable\\\": () => (/* binding */ getGlobalCSSVariable),\\n/* harmony export */ \\\"isRTL\\\": () => (/* binding */ isRTL),\\n/* harmony export */ \\\"tupleToCoors\\\": () => (/* binding */ tupleToCoors),\\n/* harmony export */ \\\"muteFSAbortError\\\": () => (/* binding */ muteFSAbortError),\\n/* harmony export */ \\\"findIndex\\\": () => (/* binding */ findIndex),\\n/* harmony export */ \\\"findLastIndex\\\": () => (/* binding */ findLastIndex),\\n/* harmony export */ \\\"isTransparent\\\": () => (/* binding */ isTransparent),\\n/* harmony export */ \\\"resolvablePromise\\\": () => (/* binding */ resolvablePromise),\\n/* harmony export */ \\\"withBatchedUpdates\\\": () => (/* binding */ withBatchedUpdates),\\n/* harmony export */ \\\"nFormatter\\\": () => (/* binding */ nFormatter),\\n/* harmony export */ \\\"getVersion\\\": () => (/* binding */ getVersion),\\n/* harmony export */ \\\"supportsEmoji\\\": () => (/* binding */ supportsEmoji),\\n/* harmony export */ \\\"getNearestScrollableContainer\\\": () => (/* binding */ getNearestScrollableContainer),\\n/* harmony export */ \\\"focusNearestParent\\\": () => (/* binding */ focusNearestParent),\\n/* harmony export */ \\\"preventUnload\\\": () => (/* binding */ preventUnload),\\n/* harmony export */ \\\"bytesToHexString\\\": () => (/* binding */ bytesToHexString),\\n/* harmony export */ \\\"getUpdatedTimestamp\\\": () => (/* binding */ getUpdatedTimestamp),\\n/* harmony export */ \\\"arrayToMap\\\": () => (/* binding */ arrayToMap),\\n/* harmony export */ \\\"isTestEnv\\\": () => (/* binding */ isTestEnv)\\n/* harmony export */ });\\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./colors */ \\\"../../colors.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-dom */ \\\"react-dom\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./keys */ \\\"../../keys.ts\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\nlet mockDateTime = null;\\r\\nconst setDateTimeForTests = function (dateTime) {\\r\\n mockDateTime = dateTime;\\r\\n};\\r\\nconst getDateTime = function () {\\r\\n if (mockDateTime) {\\r\\n return mockDateTime;\\r\\n }\\r\\n const date = new Date();\\r\\n const year = date.getFullYear();\\r\\n const month = `${date.getMonth() + 1}`.padStart(2, \\\"0\\\");\\r\\n const day = `${date.getDate()}`.padStart(2, \\\"0\\\");\\r\\n const hr = `${date.getHours()}`.padStart(2, \\\"0\\\");\\r\\n const min = `${date.getMinutes()}`.padStart(2, \\\"0\\\");\\r\\n return `${year}-${month}-${day}-${hr}${min}`;\\r\\n};\\r\\nconst capitalizeString = function (str) {\\r\\n return str.charAt(0).toUpperCase() + str.slice(1);\\r\\n};\\r\\nconst isToolIcon = function (target) {\\r\\n return target instanceof HTMLElement && target.className.includes(\\\"ToolIcon\\\");\\r\\n};\\r\\nconst isInputLike = function (target) {\\r\\n return target instanceof HTMLElement && target.dataset.type === \\\"wysiwyg\\\" || target instanceof HTMLBRElement || // newline in wysiwyg\\r\\n target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement;\\r\\n};\\r\\nconst isWritableElement = function (target) {\\r\\n return target instanceof HTMLElement && target.dataset.type === \\\"wysiwyg\\\" || target instanceof HTMLBRElement || // newline in wysiwyg\\r\\n target instanceof HTMLTextAreaElement || target instanceof HTMLInputElement && (target.type === \\\"text\\\" || target.type === \\\"number\\\");\\r\\n};\\r\\nconst getFontFamilyString = function (_ref) {\\r\\n let { fontFamily } = _ref;\\r\\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_1__.FONT_FAMILY)) {\\r\\n if (id === fontFamily) {\\r\\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_1__.WINDOWS_EMOJI_FALLBACK_FONT}`;\\r\\n }\\r\\n }\\r\\n return _constants__WEBPACK_IMPORTED_MODULE_1__.WINDOWS_EMOJI_FALLBACK_FONT;\\r\\n};\\r\\n/** returns fontSize+fontFamily string for assignment to DOM elements */\\r\\nconst getFontString = function (_ref2) {\\r\\n let { fontSize, fontFamily } = _ref2;\\r\\n return `${fontSize}px ${getFontFamilyString({\\r\\n fontFamily\\r\\n })}`;\\r\\n};\\r\\nconst debounce = function (fn, timeout) {\\r\\n let handle = 0;\\r\\n let lastArgs = null;\\r\\n const ret = function () {\\r\\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\\r\\n args[_key] = arguments[_key];\\r\\n }\\r\\n lastArgs = args;\\r\\n clearTimeout(handle);\\r\\n handle = window.setTimeout(function () {\\r\\n lastArgs = null;\\r\\n fn(...args);\\r\\n }, timeout);\\r\\n };\\r\\n ret.flush = function () {\\r\\n clearTimeout(handle);\\r\\n if (lastArgs) {\\r\\n const _lastArgs = lastArgs;\\r\\n lastArgs = null;\\r\\n fn(..._lastArgs);\\r\\n }\\r\\n };\\r\\n ret.cancel = function () {\\r\\n lastArgs = null;\\r\\n clearTimeout(handle);\\r\\n };\\r\\n return ret;\\r\\n}; // https://github.com/lodash/lodash/blob/es/chunk.js\\r\\nconst chunk = function (array, size) {\\r\\n if (!array.length || size < 1) {\\r\\n return [];\\r\\n }\\r\\n let index = 0;\\r\\n let resIndex = 0;\\r\\n const result = Array(Math.ceil(array.length / size));\\r\\n while (index < array.length) {\\r\\n result[resIndex++] = array.slice(index, index += size);\\r\\n }\\r\\n return result;\\r\\n};\\r\\nconst selectNode = function (node) {\\r\\n const selection = window.getSelection();\\r\\n if (selection) {\\r\\n const range = document.createRange();\\r\\n range.selectNodeContents(node);\\r\\n selection.removeAllRanges();\\r\\n selection.addRange(range);\\r\\n }\\r\\n};\\r\\nconst removeSelection = function () {\\r\\n const selection = window.getSelection();\\r\\n if (selection) {\\r\\n selection.removeAllRanges();\\r\\n }\\r\\n};\\r\\nconst distance = function (x, y) {\\r\\n return Math.abs(x - y);\\r\\n};\\r\\nconst resetCursor = function (canvas) {\\r\\n if (canvas) {\\r\\n canvas.style.cursor = \\\"\\\";\\r\\n }\\r\\n};\\r\\nconst setCursor = function (canvas, cursor) {\\r\\n if (canvas) {\\r\\n canvas.style.cursor = cursor;\\r\\n }\\r\\n};\\r\\nconst setCursorForShape = function (canvas, shape) {\\r\\n if (!canvas) {\\r\\n return;\\r\\n }\\r\\n if (shape === \\\"selection\\\") {\\r\\n resetCursor(canvas); // do nothing if image tool is selected which suggests there's\\r\\n // a image-preview set as the cursor\\r\\n }\\r\\n else if (shape !== \\\"image\\\") {\\r\\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_1__.CURSOR_TYPE.CROSSHAIR;\\r\\n }\\r\\n};\\r\\nconst isFullScreen = function () {\\r\\n var _a;\\r\\n return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \\\"HTML\\\";\\r\\n};\\r\\nconst allowFullScreen = function () {\\r\\n return document.documentElement.requestFullscreen();\\r\\n};\\r\\nconst exitFullScreen = function () {\\r\\n return document.exitFullscreen();\\r\\n};\\r\\nconst getShortcutKey = function (shortcut) {\\r\\n shortcut = shortcut.replace(/\\\\bAlt\\\\b/i, \\\"Alt\\\").replace(/\\\\bShift\\\\b/i, \\\"Shift\\\").replace(/\\\\b(Enter|Return)\\\\b/i, \\\"Enter\\\").replace(/\\\\bDel\\\\b/i, \\\"Delete\\\");\\r\\n if (_keys__WEBPACK_IMPORTED_MODULE_3__.isDarwin) {\\r\\n return shortcut.replace(/\\\\bCtrlOrCmd\\\\b/i, \\\"Cmd\\\").replace(/\\\\bAlt\\\\b/i, \\\"Option\\\");\\r\\n }\\r\\n return shortcut.replace(/\\\\bCtrlOrCmd\\\\b/i, \\\"Ctrl\\\");\\r\\n};\\r\\nconst viewportCoordsToSceneCoords = function (_ref3, _ref4) {\\r\\n let { clientX, clientY } = _ref3;\\r\\n let { zoom, offsetLeft, offsetTop, scrollX, scrollY } = _ref4;\\r\\n const invScale = 1 / zoom.value;\\r\\n const x = (clientX - zoom.translation.x - offsetLeft) * invScale - scrollX;\\r\\n const y = (clientY - zoom.translation.y - offsetTop) * invScale - scrollY;\\r\\n return {\\r\\n x,\\r\\n y\\r\\n };\\r\\n};\\r\\nconst sceneCoordsToViewportCoords = function (_ref5, _ref6) {\\r\\n let { sceneX, sceneY } = _ref5;\\r\\n let { zoom, offsetLeft, offsetTop, scrollX, scrollY } = _ref6;\\r\\n const x = (sceneX + scrollX + offsetLeft) * zoom.value + zoom.translation.x;\\r\\n const y = (sceneY + scrollY + offsetTop) * zoom.value + zoom.translation.y;\\r\\n return {\\r\\n x,\\r\\n y\\r\\n };\\r\\n};\\r\\nconst getGlobalCSSVariable = function (name) {\\r\\n return getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\\r\\n};\\r\\nconst RS_LTR_CHARS = \\\"A-Za-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02B8\\\\u0300-\\\\u0590\\\\u0800-\\\\u1FFF\\\" + \\\"\\\\u2C00-\\\\uFB1C\\\\uFDFE-\\\\uFE6F\\\\uFEFD-\\\\uFFFF\\\";\\r\\nconst RS_RTL_CHARS = \\\"\\\\u0591-\\\\u07FF\\\\uFB1D-\\\\uFDFD\\\\uFE70-\\\\uFEFC\\\";\\r\\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\\r\\n/**\\r\\n * Checks whether first directional character is RTL. Meaning whether it starts\\r\\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\\r\\n * RTL.\\r\\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\\r\\n */\\r\\nconst isRTL = function (text) {\\r\\n return RE_RTL_CHECK.test(text);\\r\\n};\\r\\nconst tupleToCoors = function (xyTuple) {\\r\\n const [x, y] = xyTuple;\\r\\n return {\\r\\n x,\\r\\n y\\r\\n };\\r\\n};\\r\\n/** use as a rejectionHandler to mute filesystem Abort errors */\\r\\nconst muteFSAbortError = function (error) {\\r\\n if ((error === null || error === void 0 ? void 0 : error.name) === \\\"AbortError\\\") {\\r\\n console.warn(error);\\r\\n return;\\r\\n }\\r\\n throw error;\\r\\n};\\r\\nconst findIndex = function (array, cb) {\\r\\n let fromIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\\r\\n if (fromIndex < 0) {\\r\\n fromIndex = array.length + fromIndex;\\r\\n }\\r\\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\\r\\n let index = fromIndex - 1;\\r\\n while (++index < array.length) {\\r\\n if (cb(array[index], index, array)) {\\r\\n return index;\\r\\n }\\r\\n }\\r\\n return -1;\\r\\n};\\r\\nconst findLastIndex = function (array, cb) {\\r\\n let fromIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : array.length - 1;\\r\\n if (fromIndex < 0) {\\r\\n fromIndex = array.length + fromIndex;\\r\\n }\\r\\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\\r\\n let index = fromIndex + 1;\\r\\n while (--index > -1) {\\r\\n if (cb(array[index], index, array)) {\\r\\n return index;\\r\\n }\\r\\n }\\r\\n return -1;\\r\\n};\\r\\nconst isTransparent = function (color) {\\r\\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \\\"0\\\";\\r\\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \\\"00\\\";\\r\\n return isRGBTransparent || isRRGGBBTransparent || color === _colors__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"].elementBackground[0];\\r\\n};\\r\\nconst resolvablePromise = function () {\\r\\n let resolve;\\r\\n let reject;\\r\\n const promise = new Promise(function (_resolve, _reject) {\\r\\n resolve = _resolve;\\r\\n reject = _reject;\\r\\n });\\r\\n promise.resolve = resolve;\\r\\n promise.reject = reject;\\r\\n return promise;\\r\\n};\\r\\n/**\\r\\n * @param func handler taking at most single parameter (event).\\r\\n */\\r\\nconst withBatchedUpdates = function (func) {\\r\\n return function (event) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_2__.unstable_batchedUpdates)(func, event);\\r\\n };\\r\\n}; //https://stackoverflow.com/a/9462382/8418\\r\\nconst nFormatter = function (num, digits) {\\r\\n const si = [{\\r\\n value: 1,\\r\\n symbol: \\\"b\\\"\\r\\n }, {\\r\\n value: 1e3,\\r\\n symbol: \\\"k\\\"\\r\\n }, {\\r\\n value: 1e6,\\r\\n symbol: \\\"M\\\"\\r\\n }, {\\r\\n value: 1e9,\\r\\n symbol: \\\"G\\\"\\r\\n }];\\r\\n const rx = /\\\\.0+$|(\\\\.[0-9]*[1-9])0+$/;\\r\\n let index;\\r\\n for (index = si.length - 1; index > 0; index--) {\\r\\n if (num >= si[index].value) {\\r\\n break;\\r\\n }\\r\\n }\\r\\n return (num / si[index].value).toFixed(digits).replace(rx, \\\"$1\\\") + si[index].symbol;\\r\\n};\\r\\nconst getVersion = function () {\\r\\n var _a;\\r\\n return ((_a = document.querySelector('meta[name=\\\"version\\\"]')) === null || _a === void 0 ? void 0 : _a.content) || _constants__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_VERSION;\\r\\n}; // Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\\r\\nconst supportsEmoji = function () {\\r\\n const canvas = document.createElement(\\\"canvas\\\");\\r\\n const ctx = canvas.getContext(\\\"2d\\\");\\r\\n if (!ctx) {\\r\\n return false;\\r\\n }\\r\\n const offset = 12;\\r\\n ctx.fillStyle = \\\"#f00\\\";\\r\\n ctx.textBaseline = \\\"top\\\";\\r\\n ctx.font = \\\"32px Arial\\\"; // Modernizr used 🐨, but it is sort of supported on Windows 7.\\r\\n // Luckily 😀 isn't supported.\\r\\n ctx.fillText(\\\"😀\\\", 0, 0);\\r\\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\\r\\n};\\r\\nconst getNearestScrollableContainer = function (element) {\\r\\n let parent = element.parentElement;\\r\\n while (parent) {\\r\\n if (parent === document.body) {\\r\\n return document;\\r\\n }\\r\\n const { overflowY } = window.getComputedStyle(parent);\\r\\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\\r\\n if (hasScrollableContent && (overflowY === \\\"auto\\\" || overflowY === \\\"scroll\\\")) {\\r\\n return parent;\\r\\n }\\r\\n parent = parent.parentElement;\\r\\n }\\r\\n return document;\\r\\n};\\r\\nconst focusNearestParent = function (element) {\\r\\n let parent = element.parentElement;\\r\\n while (parent) {\\r\\n if (parent.tabIndex > -1) {\\r\\n parent.focus();\\r\\n return;\\r\\n }\\r\\n parent = parent.parentElement;\\r\\n }\\r\\n};\\r\\nconst preventUnload = function (event) {\\r\\n event.preventDefault(); // NOTE: modern browsers no longer allow showing a custom message here\\r\\n event.returnValue = \\\"\\\";\\r\\n};\\r\\nconst bytesToHexString = function (bytes) {\\r\\n return Array.from(bytes).map(function (byte) {\\r\\n return `0${byte.toString(16)}`.slice(-2);\\r\\n }).join(\\\"\\\");\\r\\n};\\r\\nconst getUpdatedTimestamp = function () {\\r\\n return isTestEnv() ? 1 : Date.now();\\r\\n};\\r\\n/**\\r\\n * Transforms array of objects containing `id` attribute,\\r\\n * or array of ids (strings), into a Map, keyd by `id`.\\r\\n */\\r\\nconst arrayToMap = function (items) {\\r\\n return items.reduce(function (acc, element) {\\r\\n acc.set(typeof element === \\\"string\\\" ? element : element.id, element);\\r\\n return acc;\\r\\n }, new Map());\\r\\n};\\r\\nconst isTestEnv = function () {\\r\\n var _a;\\r\\n return typeof process !== \\\"undefined\\\" && ((_a = ({\\\"REACT_APP_BACKEND_V2_GET_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/\\\",\\\"REACT_APP_BACKEND_V2_POST_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/post/\\\",\\\"REACT_APP_LIBRARY_URL\\\":\\\"https://libraries.excalidraw.com\\\",\\\"REACT_APP_LIBRARY_BACKEND\\\":\\\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\\\",\\\"REACT_APP_SOCKET_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_FIREBASE_CONFIG\\\":\\\"{\\\\\\\"apiKey\\\\\\\":\\\\\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\\\\\",\\\\\\\"authDomain\\\\\\\":\\\\\\\"excalidraw-oss-dev.firebaseapp.com\\\\\\\",\\\\\\\"projectId\\\\\\\":\\\\\\\"excalidraw-oss-dev\\\\\\\",\\\\\\\"storageBucket\\\\\\\":\\\\\\\"excalidraw-oss-dev.appspot.com\\\\\\\",\\\\\\\"messagingSenderId\\\\\\\":\\\\\\\"664559512677\\\\\\\",\\\\\\\"appId\\\\\\\":\\\\\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\\\\\"}\\\"})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \\\"test\\\";\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QVcsR0FBRyxFQUFFLENBQUM7QUFDekIsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLEtBQUs7SUFDN0MsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUk7UUFDekMsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZCxDQUFDLENBQUM7QUFDSyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLE9BQU8sU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3RDLENBQUMsQ0FBQztBQUNGOzs7R0FHRztBQUVJLE1BQU0sVUFBVSxHQUFHLFVBQVUsS0FBSztJQUN2QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLEVBQUUsT0FBTztRQUN4QyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQixDQUFDLENBQUM7QUFDSyxNQUFNLFNBQVMsR0FBRzs7SUFDdkIsT0FBTyxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksb3NCQUFXLDBDQUFFLFFBQVEsTUFBSyxNQUFNLENBQUM7QUFDNUUsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3V0aWxzLnRzP2IxZGMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi9jb2xvcnNcIjtcbmltcG9ydCB7IENVUlNPUl9UWVBFLCBERUZBVUxUX1ZFUlNJT04sIEZPTlRfRkFNSUxZLCBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIH0gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgaXNEYXJ3aW4gfSBmcm9tIFwiLi9rZXlzXCI7XG5sZXQgbW9ja0RhdGVUaW1lID0gbnVsbDtcbmV4cG9ydCBjb25zdCBzZXREYXRlVGltZUZvclRlc3RzID0gZnVuY3Rpb24gKGRhdGVUaW1lKSB7XG4gIG1vY2tEYXRlVGltZSA9IGRhdGVUaW1lO1xufTtcbmV4cG9ydCBjb25zdCBnZXREYXRlVGltZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKG1vY2tEYXRlVGltZSkge1xuICAgIHJldHVybiBtb2NrRGF0ZVRpbWU7XG4gIH1cblxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGggPSBgJHtkYXRlLmdldE1vbnRoKCkgKyAxfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBkYXkgPSBgJHtkYXRlLmdldERhdGUoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgaHIgPSBgJHtkYXRlLmdldEhvdXJzKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IG1pbiA9IGAke2RhdGUuZ2V0TWludXRlcygpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9LSR7aHJ9JHttaW59YDtcbn07XG5leHBvcnQgY29uc3QgY2FwaXRhbGl6ZVN0cmluZyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbn07XG5leHBvcnQgY29uc3QgaXNUb29sSWNvbiA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5jbGFzc05hbWUuaW5jbHVkZXMoXCJUb29sSWNvblwiKTtcbn07XG5leHBvcnQgY29uc3QgaXNJbnB1dExpa2UgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuZGF0YXNldC50eXBlID09PSBcInd5c2l3eWdcIiB8fCB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MQlJFbGVtZW50IHx8IC8vIG5ld2xpbmUgaW4gd3lzaXd5Z1xuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8IHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQ7XG59O1xuZXhwb3J0IGNvbnN0IGlzV3JpdGFibGVFbGVtZW50ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fCB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmICh0YXJnZXQudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgdGFyZ2V0LnR5cGUgPT09IFwibnVtYmVyXCIpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRGb250RmFtaWx5U3RyaW5nID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBmb250RmFtaWx5XG4gIH0gPSBfcmVmO1xuXG4gIGZvciAoY29uc3QgW2ZvbnRGYW1pbHlTdHJpbmcsIGlkXSBvZiBPYmplY3QuZW50cmllcyhGT05UX0ZBTUlMWSkpIHtcbiAgICBpZiAoaWQgPT09IGZvbnRGYW1pbHkpIHtcbiAgICAgIHJldHVybiBgJHtmb250RmFtaWx5U3RyaW5nfSwgJHtXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlR9YDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UO1xufTtcbi8qKiByZXR1cm5zIGZvbnRTaXplK2ZvbnRGYW1pbHkgc3RyaW5nIGZvciBhc3NpZ25tZW50IHRvIERPTSBlbGVtZW50cyAqL1xuXG5leHBvcnQgY29uc3QgZ2V0Rm9udFN0cmluZyA9IGZ1bmN0aW9uIChfcmVmMikge1xuICBsZXQge1xuICAgIGZvbnRTaXplLFxuICAgIGZvbnRGYW1pbHlcbiAgfSA9IF9yZWYyO1xuICByZXR1cm4gYCR7Zm9udFNpemV9cHggJHtnZXRGb250RmFtaWx5U3RyaW5nKHtcbiAgICBmb250RmFtaWx5XG4gIH0pfWA7XG59O1xuZXhwb3J0IGNvbnN0IGRlYm91bmNlID0gZnVuY3Rpb24gKGZuLCB0aW1lb3V0KSB7XG4gIGxldCBoYW5kbGUgPSAwO1xuICBsZXQgbGFzdEFyZ3MgPSBudWxsO1xuXG4gIGNvbnN0IHJldCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIGhhbmRsZSA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgIH0sIHRpbWVvdXQpO1xuICB9O1xuXG4gIHJldC5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcblxuICAgIGlmIChsYXN0QXJncykge1xuICAgICAgY29uc3QgX2xhc3RBcmdzID0gbGFzdEFyZ3M7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5fbGFzdEFyZ3MpO1xuICAgIH1cbiAgfTtcblxuICByZXQuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgfTtcblxuICByZXR1cm4gcmV0O1xufTsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9lcy9jaHVuay5qc1xuXG5leHBvcnQgY29uc3QgY2h1bmsgPSBmdW5jdGlvbiAoYXJyYXksIHNpemUpIHtcbiAgaWYgKCFhcnJheS5sZW5ndGggfHwgc2l6ZSA8IDEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgcmVzSW5kZXggPSAwO1xuICBjb25zdCByZXN1bHQgPSBBcnJheShNYXRoLmNlaWwoYXJyYXkubGVuZ3RoIC8gc2l6ZSkpO1xuXG4gIHdoaWxlIChpbmRleCA8IGFycmF5Lmxlbmd0aCkge1xuICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGFycmF5LnNsaWNlKGluZGV4LCBpbmRleCArPSBzaXplKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0IGNvbnN0IHNlbGVjdE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKHNlbGVjdGlvbikge1xuICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobm9kZSk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgcmVtb3ZlU2VsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCBkaXN0YW5jZSA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gIHJldHVybiBNYXRoLmFicyh4IC0geSk7XG59O1xuZXhwb3J0IGNvbnN0IHJlc2V0Q3Vyc29yID0gZnVuY3Rpb24gKGNhbnZhcykge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yID0gZnVuY3Rpb24gKGNhbnZhcywgY3Vyc29yKSB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IHNldEN1cnNvckZvclNoYXBlID0gZnVuY3Rpb24gKGNhbnZhcywgc2hhcGUpIHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2hhcGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICByZXNldEN1cnNvcihjYW52YXMpOyAvLyBkbyBub3RoaW5nIGlmIGltYWdlIHRvb2wgaXMgc2VsZWN0ZWQgd2hpY2ggc3VnZ2VzdHMgdGhlcmUnc1xuICAgIC8vIGEgaW1hZ2UtcHJldmlldyBzZXQgYXMgdGhlIGN1cnNvclxuICB9IGVsc2UgaWYgKHNoYXBlICE9PSBcImltYWdlXCIpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gQ1VSU09SX1RZUEUuQ1JPU1NIQUlSO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IGlzRnVsbFNjcmVlbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50Py5ub2RlTmFtZSA9PT0gXCJIVE1MXCI7XG59O1xuZXhwb3J0IGNvbnN0IGFsbG93RnVsbFNjcmVlbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpO1xufTtcbmV4cG9ydCBjb25zdCBleGl0RnVsbFNjcmVlbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCk7XG59O1xuZXhwb3J0IGNvbnN0IGdldFNob3J0Y3V0S2V5ID0gZnVuY3Rpb24gKHNob3J0Y3V0KSB7XG4gIHNob3J0Y3V0ID0gc2hvcnRjdXQucmVwbGFjZSgvXFxiQWx0XFxiL2ksIFwiQWx0XCIpLnJlcGxhY2UoL1xcYlNoaWZ0XFxiL2ksIFwiU2hpZnRcIikucmVwbGFjZSgvXFxiKEVudGVyfFJldHVybilcXGIvaSwgXCJFbnRlclwiKS5yZXBsYWNlKC9cXGJEZWxcXGIvaSwgXCJEZWxldGVcIik7XG5cbiAgaWYgKGlzRGFyd2luKSB7XG4gICAgcmV0dXJuIHNob3J0Y3V0LnJlcGxhY2UoL1xcYkN0cmxPckNtZFxcYi9pLCBcIkNtZFwiKS5yZXBsYWNlKC9cXGJBbHRcXGIvaSwgXCJPcHRpb25cIik7XG4gIH1cblxuICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2ksIFwiQ3RybFwiKTtcbn07XG5leHBvcnQgY29uc3Qgdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzID0gZnVuY3Rpb24gKF9yZWYzLCBfcmVmNCkge1xuICBsZXQge1xuICAgIGNsaWVudFgsXG4gICAgY2xpZW50WVxuICB9ID0gX3JlZjM7XG4gIGxldCB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFlcbiAgfSA9IF9yZWY0O1xuICBjb25zdCBpbnZTY2FsZSA9IDEgLyB6b29tLnZhbHVlO1xuICBjb25zdCB4ID0gKGNsaWVudFggLSB6b29tLnRyYW5zbGF0aW9uLnggLSBvZmZzZXRMZWZ0KSAqIGludlNjYWxlIC0gc2Nyb2xsWDtcbiAgY29uc3QgeSA9IChjbGllbnRZIC0gem9vbS50cmFuc2xhdGlvbi55IC0gb2Zmc2V0VG9wKSAqIGludlNjYWxlIC0gc2Nyb2xsWTtcbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHlcbiAgfTtcbn07XG5leHBvcnQgY29uc3Qgc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzID0gZnVuY3Rpb24gKF9yZWY1LCBfcmVmNikge1xuICBsZXQge1xuICAgIHNjZW5lWCxcbiAgICBzY2VuZVlcbiAgfSA9IF9yZWY1O1xuICBsZXQge1xuICAgIHpvb20sXG4gICAgb2Zmc2V0TGVmdCxcbiAgICBvZmZzZXRUb3AsXG4gICAgc2Nyb2xsWCxcbiAgICBzY3JvbGxZXG4gIH0gPSBfcmVmNjtcbiAgY29uc3QgeCA9IChzY2VuZVggKyBzY3JvbGxYICsgb2Zmc2V0TGVmdCkgKiB6b29tLnZhbHVlICsgem9vbS50cmFuc2xhdGlvbi54O1xuICBjb25zdCB5ID0gKHNjZW5lWSArIHNjcm9sbFkgKyBvZmZzZXRUb3ApICogem9vbS52YWx1ZSArIHpvb20udHJhbnNsYXRpb24ueTtcbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHlcbiAgfTtcbn07XG5leHBvcnQgY29uc3QgZ2V0R2xvYmFsQ1NTVmFyaWFibGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoYC0tJHtuYW1lfWApO1xufTtcbmNvbnN0IFJTX0xUUl9DSEFSUyA9IFwiQS1aYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkI4XFx1MDMwMC1cXHUwNTkwXFx1MDgwMC1cXHUxRkZGXCIgKyBcIlxcdTJDMDAtXFx1RkIxQ1xcdUZERkUtXFx1RkU2RlxcdUZFRkQtXFx1RkZGRlwiO1xuY29uc3QgUlNfUlRMX0NIQVJTID0gXCJcXHUwNTkxLVxcdTA3RkZcXHVGQjFELVxcdUZERkRcXHVGRTcwLVxcdUZFRkNcIjtcbmNvbnN0IFJFX1JUTF9DSEVDSyA9IG5ldyBSZWdFeHAoYF5bXiR7UlNfTFRSX0NIQVJTfV0qWyR7UlNfUlRMX0NIQVJTfV1gKTtcbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZmlyc3QgZGlyZWN0aW9uYWwgY2hhcmFjdGVyIGlzIFJUTC4gTWVhbmluZyB3aGV0aGVyIGl0IHN0YXJ0c1xuICogIHdpdGggUlRMIGNoYXJhY3RlcnMsIG9yIGluZGV0ZXJtaW5hdGUgKG51bWJlcnMgZXRjLikgY2hhcmFjdGVycyBmb2xsb3dlZCBieVxuICogIFJUTC5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvMTcyMiNkaXNjdXNzaW9uX3I0MzYzNDAxNzFcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNSVEwgPSBmdW5jdGlvbiAodGV4dCkge1xuICByZXR1cm4gUkVfUlRMX0NIRUNLLnRlc3QodGV4dCk7XG59O1xuZXhwb3J0IGNvbnN0IHR1cGxlVG9Db29ycyA9IGZ1bmN0aW9uICh4eVR1cGxlKSB7XG4gIGNvbnN0IFt4LCB5XSA9IHh5VHVwbGU7XG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5XG4gIH07XG59O1xuLyoqIHVzZSBhcyBhIHJlamVjdGlvbkhhbmRsZXIgdG8gbXV0ZSBmaWxlc3lzdGVtIEFib3J0IGVycm9ycyAqL1xuXG5leHBvcnQgY29uc3QgbXV0ZUZTQWJvcnRFcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuICBpZiAoZXJyb3I/Lm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBlcnJvcjtcbn07XG5leHBvcnQgY29uc3QgZmluZEluZGV4ID0gZnVuY3Rpb24gKGFycmF5LCBjYikge1xuICBsZXQgZnJvbUluZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwO1xuXG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gYXJyYXkubGVuZ3RoICsgZnJvbUluZGV4O1xuICB9XG5cbiAgZnJvbUluZGV4ID0gTWF0aC5taW4oYXJyYXkubGVuZ3RoLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4IC0gMTtcblxuICB3aGlsZSAoKytpbmRleCA8IGFycmF5Lmxlbmd0aCkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTE7XG59O1xuZXhwb3J0IGNvbnN0IGZpbmRMYXN0SW5kZXggPSBmdW5jdGlvbiAoYXJyYXksIGNiKSB7XG4gIGxldCBmcm9tSW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGFycmF5Lmxlbmd0aCAtIDE7XG5cbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cblxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4ICsgMTtcblxuICB3aGlsZSAoLS1pbmRleCA+IC0xKSB7XG4gICAgaWYgKGNiKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn07XG5leHBvcnQgY29uc3QgaXNUcmFuc3BhcmVudCA9IGZ1bmN0aW9uIChjb2xvcikge1xuICBjb25zdCBpc1JHQlRyYW5zcGFyZW50ID0gY29sb3IubGVuZ3RoID09PSA1ICYmIGNvbG9yLnN1YnN0cig0LCAxKSA9PT0gXCIwXCI7XG4gIGNvbnN0IGlzUlJHR0JCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDkgJiYgY29sb3Iuc3Vic3RyKDcsIDIpID09PSBcIjAwXCI7XG4gIHJldHVybiBpc1JHQlRyYW5zcGFyZW50IHx8IGlzUlJHR0JCVHJhbnNwYXJlbnQgfHwgY29sb3IgPT09IGNvbG9ycy5lbGVtZW50QmFja2dyb3VuZFswXTtcbn07XG5leHBvcnQgY29uc3QgcmVzb2x2YWJsZVByb21pc2UgPSBmdW5jdGlvbiAoKSB7XG4gIGxldCByZXNvbHZlO1xuICBsZXQgcmVqZWN0O1xuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgcmVzb2x2ZSA9IF9yZXNvbHZlO1xuICAgIHJlamVjdCA9IF9yZWplY3Q7XG4gIH0pO1xuICBwcm9taXNlLnJlc29sdmUgPSByZXNvbHZlO1xuICBwcm9taXNlLnJlamVjdCA9IHJlamVjdDtcbiAgcmV0dXJuIHByb21pc2U7XG59O1xuLyoqXG4gKiBAcGFyYW0gZnVuYyBoYW5kbGVyIHRha2luZyBhdCBtb3N0IHNpbmdsZSBwYXJhbWV0ZXIgKGV2ZW50KS5cbiAqL1xuXG5leHBvcnQgY29uc3Qgd2l0aEJhdGNoZWRVcGRhdGVzID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmMsIGV2ZW50KTtcbiAgfTtcbn07IC8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuXG5leHBvcnQgY29uc3QgbkZvcm1hdHRlciA9IGZ1bmN0aW9uIChudW0sIGRpZ2l0cykge1xuICBjb25zdCBzaSA9IFt7XG4gICAgdmFsdWU6IDEsXG4gICAgc3ltYm9sOiBcImJcIlxuICB9LCB7XG4gICAgdmFsdWU6IDFlMyxcbiAgICBzeW1ib2w6IFwia1wiXG4gIH0sIHtcbiAgICB2YWx1ZTogMWU2LFxuICAgIHN5bWJvbDogXCJNXCJcbiAgfSwge1xuICAgIHZhbHVlOiAxZTksXG4gICAgc3ltYm9sOiBcIkdcIlxuICB9XTtcbiAgY29uc3QgcnggPSAvXFwuMCskfChcXC5bMC05XSpbMS05XSkwKyQvO1xuICBsZXQgaW5kZXg7XG5cbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKG51bSAvIHNpW2luZGV4XS52YWx1ZSkudG9GaXhlZChkaWdpdHMpLnJlcGxhY2UocngsIFwiJDFcIikgKyBzaVtpbmRleF0uc3ltYm9sO1xufTtcbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8IERFRkFVTFRfVkVSU0lPTjtcbn07IC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvZW1vamkuanNcblxuZXhwb3J0IGNvbnN0IHN1cHBvcnRzRW1vamkgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSAxMjtcbiAgY3R4LmZpbGxTdHlsZSA9IFwiI2YwMFwiO1xuICBjdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcbiAgY3R4LmZvbnQgPSBcIjMycHggQXJpYWxcIjsgLy8gTW9kZXJuaXpyIHVzZWQg8J+QqCwgYnV0IGl0IGlzIHNvcnQgb2Ygc3VwcG9ydGVkIG9uIFdpbmRvd3MgNy5cbiAgLy8gTHVja2lseSDwn5iAIGlzbid0IHN1cHBvcnRlZC5cblxuICBjdHguZmlsbFRleHQoXCLwn5iAXCIsIDAsIDApO1xuICByZXR1cm4gY3R4LmdldEltYWdlRGF0YShvZmZzZXQsIG9mZnNldCwgMSwgMSkuZGF0YVswXSAhPT0gMDtcbn07XG5leHBvcnQgY29uc3QgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgb3ZlcmZsb3dZXG4gICAgfSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudCk7XG4gICAgY29uc3QgaGFzU2Nyb2xsYWJsZUNvbnRlbnQgPSBwYXJlbnQuc2Nyb2xsSGVpZ2h0ID4gcGFyZW50LmNsaWVudEhlaWdodDtcblxuICAgIGlmIChoYXNTY3JvbGxhYmxlQ29udGVudCAmJiAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fCBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIpKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG5cbiAgcmV0dXJuIGRvY3VtZW50O1xufTtcbmV4cG9ydCBjb25zdCBmb2N1c05lYXJlc3RQYXJlbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50LnRhYkluZGV4ID4gLTEpIHtcbiAgICAgIHBhcmVudC5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IHByZXZlbnRVbmxvYWQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gTk9URTogbW9kZXJuIGJyb3dzZXJzIG5vIGxvbmdlciBhbGxvdyBzaG93aW5nIGEgY3VzdG9tIG1lc3NhZ2UgaGVyZVxuXG4gIGV2ZW50LnJldHVyblZhbHVlID0gXCJcIjtcbn07XG5leHBvcnQgY29uc3QgYnl0ZXNUb0hleFN0cmluZyA9IGZ1bmN0aW9uIChieXRlcykge1xuICByZXR1cm4gQXJyYXkuZnJvbShieXRlcykubWFwKGZ1bmN0aW9uIChieXRlKSB7XG4gICAgcmV0dXJuIGAwJHtieXRlLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC0yKTtcbiAgfSkuam9pbihcIlwiKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0VXBkYXRlZFRpbWVzdGFtcCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzVGVzdEVudigpID8gMSA6IERhdGUubm93KCk7XG59O1xuLyoqXG4gKiBUcmFuc2Zvcm1zIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyBgaWRgIGF0dHJpYnV0ZSxcbiAqIG9yIGFycmF5IG9mIGlkcyAoc3RyaW5ncyksIGludG8gYSBNYXAsIGtleWQgYnkgYGlkYC5cbiAqL1xuXG5leHBvcnQgY29uc3QgYXJyYXlUb01hcCA9IGZ1bmN0aW9uIChpdGVtcykge1xuICByZXR1cm4gaXRlbXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGVsZW1lbnQpIHtcbiAgICBhY2Muc2V0KHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiID8gZWxlbWVudCA6IGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIG5ldyBNYXAoKSk7XG59O1xuZXhwb3J0IGNvbnN0IGlzVGVzdEVudiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5OT0RFX0VOViA9PT0gXCJ0ZXN0XCI7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../utils.ts\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../utils.ts?");
3076
+ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"setDateTimeForTests\\\": () => (/* binding */ setDateTimeForTests),\\n/* harmony export */ \\\"getDateTime\\\": () => (/* binding */ getDateTime),\\n/* harmony export */ \\\"capitalizeString\\\": () => (/* binding */ capitalizeString),\\n/* harmony export */ \\\"isToolIcon\\\": () => (/* binding */ isToolIcon),\\n/* harmony export */ \\\"isInputLike\\\": () => (/* binding */ isInputLike),\\n/* harmony export */ \\\"isWritableElement\\\": () => (/* binding */ isWritableElement),\\n/* harmony export */ \\\"getFontFamilyString\\\": () => (/* binding */ getFontFamilyString),\\n/* harmony export */ \\\"getFontString\\\": () => (/* binding */ getFontString),\\n/* harmony export */ \\\"debounce\\\": () => (/* binding */ debounce),\\n/* harmony export */ \\\"chunk\\\": () => (/* binding */ chunk),\\n/* harmony export */ \\\"selectNode\\\": () => (/* binding */ selectNode),\\n/* harmony export */ \\\"removeSelection\\\": () => (/* binding */ removeSelection),\\n/* harmony export */ \\\"distance\\\": () => (/* binding */ distance),\\n/* harmony export */ \\\"resetCursor\\\": () => (/* binding */ resetCursor),\\n/* harmony export */ \\\"setCursor\\\": () => (/* binding */ setCursor),\\n/* harmony export */ \\\"setCursorForShape\\\": () => (/* binding */ setCursorForShape),\\n/* harmony export */ \\\"isFullScreen\\\": () => (/* binding */ isFullScreen),\\n/* harmony export */ \\\"allowFullScreen\\\": () => (/* binding */ allowFullScreen),\\n/* harmony export */ \\\"exitFullScreen\\\": () => (/* binding */ exitFullScreen),\\n/* harmony export */ \\\"getShortcutKey\\\": () => (/* binding */ getShortcutKey),\\n/* harmony export */ \\\"viewportCoordsToSceneCoords\\\": () => (/* binding */ viewportCoordsToSceneCoords),\\n/* harmony export */ \\\"sceneCoordsToViewportCoords\\\": () => (/* binding */ sceneCoordsToViewportCoords),\\n/* harmony export */ \\\"getGlobalCSSVariable\\\": () => (/* binding */ getGlobalCSSVariable),\\n/* harmony export */ \\\"isRTL\\\": () => (/* binding */ isRTL),\\n/* harmony export */ \\\"tupleToCoors\\\": () => (/* binding */ tupleToCoors),\\n/* harmony export */ \\\"muteFSAbortError\\\": () => (/* binding */ muteFSAbortError),\\n/* harmony export */ \\\"findIndex\\\": () => (/* binding */ findIndex),\\n/* harmony export */ \\\"findLastIndex\\\": () => (/* binding */ findLastIndex),\\n/* harmony export */ \\\"isTransparent\\\": () => (/* binding */ isTransparent),\\n/* harmony export */ \\\"resolvablePromise\\\": () => (/* binding */ resolvablePromise),\\n/* harmony export */ \\\"withBatchedUpdates\\\": () => (/* binding */ withBatchedUpdates),\\n/* harmony export */ \\\"nFormatter\\\": () => (/* binding */ nFormatter),\\n/* harmony export */ \\\"getVersion\\\": () => (/* binding */ getVersion),\\n/* harmony export */ \\\"supportsEmoji\\\": () => (/* binding */ supportsEmoji),\\n/* harmony export */ \\\"getNearestScrollableContainer\\\": () => (/* binding */ getNearestScrollableContainer),\\n/* harmony export */ \\\"focusNearestParent\\\": () => (/* binding */ focusNearestParent),\\n/* harmony export */ \\\"preventUnload\\\": () => (/* binding */ preventUnload),\\n/* harmony export */ \\\"bytesToHexString\\\": () => (/* binding */ bytesToHexString),\\n/* harmony export */ \\\"getUpdatedTimestamp\\\": () => (/* binding */ getUpdatedTimestamp),\\n/* harmony export */ \\\"arrayToMap\\\": () => (/* binding */ arrayToMap),\\n/* harmony export */ \\\"isTestEnv\\\": () => (/* binding */ isTestEnv)\\n/* harmony export */ });\\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./colors */ \\\"../../colors.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-dom */ \\\"react-dom\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./keys */ \\\"../../keys.ts\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\nlet mockDateTime = null;\\r\\nconst setDateTimeForTests = function (dateTime) {\\r\\n mockDateTime = dateTime;\\r\\n};\\r\\nconst getDateTime = function () {\\r\\n if (mockDateTime) {\\r\\n return mockDateTime;\\r\\n }\\r\\n const date = new Date();\\r\\n const year = date.getFullYear();\\r\\n const month = `${date.getMonth() + 1}`.padStart(2, \\\"0\\\");\\r\\n const day = `${date.getDate()}`.padStart(2, \\\"0\\\");\\r\\n const hr = `${date.getHours()}`.padStart(2, \\\"0\\\");\\r\\n const min = `${date.getMinutes()}`.padStart(2, \\\"0\\\");\\r\\n return `${year}-${month}-${day}-${hr}${min}`;\\r\\n};\\r\\nconst capitalizeString = function (str) {\\r\\n return str.charAt(0).toUpperCase() + str.slice(1);\\r\\n};\\r\\nconst isToolIcon = function (target) {\\r\\n return target instanceof HTMLElement && target.className.includes(\\\"ToolIcon\\\");\\r\\n};\\r\\nconst isInputLike = function (target) {\\r\\n return target instanceof HTMLElement && target.dataset.type === \\\"wysiwyg\\\" || target instanceof HTMLBRElement || // newline in wysiwyg\\r\\n target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement;\\r\\n};\\r\\nconst isWritableElement = function (target) {\\r\\n return target instanceof HTMLElement && target.dataset.type === \\\"wysiwyg\\\" || target instanceof HTMLBRElement || // newline in wysiwyg\\r\\n target instanceof HTMLTextAreaElement || target instanceof HTMLInputElement && (target.type === \\\"text\\\" || target.type === \\\"number\\\");\\r\\n};\\r\\nconst getFontFamilyString = function (_ref) {\\r\\n let { fontFamily } = _ref;\\r\\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_1__.FONT_FAMILY)) {\\r\\n if (id === fontFamily) {\\r\\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_1__.WINDOWS_EMOJI_FALLBACK_FONT}`;\\r\\n }\\r\\n }\\r\\n return _constants__WEBPACK_IMPORTED_MODULE_1__.WINDOWS_EMOJI_FALLBACK_FONT;\\r\\n};\\r\\n/** returns fontSize+fontFamily string for assignment to DOM elements */\\r\\nconst getFontString = function (_ref2) {\\r\\n let { fontSize, fontFamily } = _ref2;\\r\\n return `${fontSize}px ${getFontFamilyString({\\r\\n fontFamily\\r\\n })}`;\\r\\n};\\r\\nconst debounce = function (fn, timeout) {\\r\\n let handle = 0;\\r\\n let lastArgs = null;\\r\\n const ret = function () {\\r\\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\\r\\n args[_key] = arguments[_key];\\r\\n }\\r\\n lastArgs = args;\\r\\n clearTimeout(handle);\\r\\n handle = window.setTimeout(function () {\\r\\n lastArgs = null;\\r\\n fn(...args);\\r\\n }, timeout);\\r\\n };\\r\\n ret.flush = function () {\\r\\n clearTimeout(handle);\\r\\n if (lastArgs) {\\r\\n const _lastArgs = lastArgs;\\r\\n lastArgs = null;\\r\\n fn(..._lastArgs);\\r\\n }\\r\\n };\\r\\n ret.cancel = function () {\\r\\n lastArgs = null;\\r\\n clearTimeout(handle);\\r\\n };\\r\\n return ret;\\r\\n}; // https://github.com/lodash/lodash/blob/es/chunk.js\\r\\nconst chunk = function (array, size) {\\r\\n if (!array.length || size < 1) {\\r\\n return [];\\r\\n }\\r\\n let index = 0;\\r\\n let resIndex = 0;\\r\\n const result = Array(Math.ceil(array.length / size));\\r\\n while (index < array.length) {\\r\\n result[resIndex++] = array.slice(index, index += size);\\r\\n }\\r\\n return result;\\r\\n};\\r\\nconst selectNode = function (node) {\\r\\n const selection = window.getSelection();\\r\\n if (selection) {\\r\\n const range = document.createRange();\\r\\n range.selectNodeContents(node);\\r\\n selection.removeAllRanges();\\r\\n selection.addRange(range);\\r\\n }\\r\\n};\\r\\nconst removeSelection = function () {\\r\\n const selection = window.getSelection();\\r\\n if (selection) {\\r\\n selection.removeAllRanges();\\r\\n }\\r\\n};\\r\\nconst distance = function (x, y) {\\r\\n return Math.abs(x - y);\\r\\n};\\r\\nconst resetCursor = function (canvas) {\\r\\n if (canvas) {\\r\\n canvas.style.cursor = \\\"\\\";\\r\\n }\\r\\n};\\r\\nconst setCursor = function (canvas, cursor) {\\r\\n if (canvas) {\\r\\n canvas.style.cursor = cursor;\\r\\n }\\r\\n};\\r\\nconst setCursorForShape = function (canvas, shape) {\\r\\n if (!canvas) {\\r\\n return;\\r\\n }\\r\\n if (shape === \\\"selection\\\") {\\r\\n resetCursor(canvas); // do nothing if image tool is selected which suggests there's\\r\\n // a image-preview set as the cursor\\r\\n }\\r\\n else if (shape !== \\\"image\\\") {\\r\\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_1__.CURSOR_TYPE.CROSSHAIR;\\r\\n }\\r\\n};\\r\\nconst isFullScreen = function () {\\r\\n var _a;\\r\\n return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \\\"HTML\\\";\\r\\n};\\r\\nconst allowFullScreen = function () {\\r\\n return document.documentElement.requestFullscreen();\\r\\n};\\r\\nconst exitFullScreen = function () {\\r\\n return document.exitFullscreen();\\r\\n};\\r\\nconst getShortcutKey = function (shortcut) {\\r\\n shortcut = shortcut.replace(/\\\\bAlt\\\\b/i, \\\"Alt\\\").replace(/\\\\bShift\\\\b/i, \\\"Shift\\\").replace(/\\\\b(Enter|Return)\\\\b/i, \\\"Enter\\\").replace(/\\\\bDel\\\\b/i, \\\"Delete\\\");\\r\\n if (_keys__WEBPACK_IMPORTED_MODULE_3__.isDarwin) {\\r\\n return shortcut.replace(/\\\\bCtrlOrCmd\\\\b/i, \\\"Cmd\\\").replace(/\\\\bAlt\\\\b/i, \\\"Option\\\");\\r\\n }\\r\\n return shortcut.replace(/\\\\bCtrlOrCmd\\\\b/i, \\\"Ctrl\\\");\\r\\n};\\r\\nconst viewportCoordsToSceneCoords = function (_ref3, _ref4) {\\r\\n let { clientX, clientY } = _ref3;\\r\\n let { zoom, offsetLeft, offsetTop, scrollX, scrollY } = _ref4;\\r\\n const invScale = 1 / zoom.value;\\r\\n const x = (clientX - zoom.translation.x - offsetLeft) * invScale - scrollX;\\r\\n const y = (clientY - zoom.translation.y - offsetTop) * invScale - scrollY;\\r\\n return {\\r\\n x,\\r\\n y\\r\\n };\\r\\n};\\r\\nconst sceneCoordsToViewportCoords = function (_ref5, _ref6) {\\r\\n let { sceneX, sceneY } = _ref5;\\r\\n let { zoom, offsetLeft, offsetTop, scrollX, scrollY } = _ref6;\\r\\n const x = (sceneX + scrollX) * zoom.value + zoom.translation.x + offsetLeft;\\r\\n const y = (sceneY + scrollY) * zoom.value + zoom.translation.y + offsetTop;\\r\\n return {\\r\\n x,\\r\\n y\\r\\n };\\r\\n};\\r\\nconst getGlobalCSSVariable = function (name) {\\r\\n return getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\\r\\n};\\r\\nconst RS_LTR_CHARS = \\\"A-Za-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02B8\\\\u0300-\\\\u0590\\\\u0800-\\\\u1FFF\\\" + \\\"\\\\u2C00-\\\\uFB1C\\\\uFDFE-\\\\uFE6F\\\\uFEFD-\\\\uFFFF\\\";\\r\\nconst RS_RTL_CHARS = \\\"\\\\u0591-\\\\u07FF\\\\uFB1D-\\\\uFDFD\\\\uFE70-\\\\uFEFC\\\";\\r\\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\\r\\n/**\\r\\n * Checks whether first directional character is RTL. Meaning whether it starts\\r\\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\\r\\n * RTL.\\r\\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\\r\\n */\\r\\nconst isRTL = function (text) {\\r\\n return RE_RTL_CHECK.test(text);\\r\\n};\\r\\nconst tupleToCoors = function (xyTuple) {\\r\\n const [x, y] = xyTuple;\\r\\n return {\\r\\n x,\\r\\n y\\r\\n };\\r\\n};\\r\\n/** use as a rejectionHandler to mute filesystem Abort errors */\\r\\nconst muteFSAbortError = function (error) {\\r\\n if ((error === null || error === void 0 ? void 0 : error.name) === \\\"AbortError\\\") {\\r\\n console.warn(error);\\r\\n return;\\r\\n }\\r\\n throw error;\\r\\n};\\r\\nconst findIndex = function (array, cb) {\\r\\n let fromIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\\r\\n if (fromIndex < 0) {\\r\\n fromIndex = array.length + fromIndex;\\r\\n }\\r\\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\\r\\n let index = fromIndex - 1;\\r\\n while (++index < array.length) {\\r\\n if (cb(array[index], index, array)) {\\r\\n return index;\\r\\n }\\r\\n }\\r\\n return -1;\\r\\n};\\r\\nconst findLastIndex = function (array, cb) {\\r\\n let fromIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : array.length - 1;\\r\\n if (fromIndex < 0) {\\r\\n fromIndex = array.length + fromIndex;\\r\\n }\\r\\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\\r\\n let index = fromIndex + 1;\\r\\n while (--index > -1) {\\r\\n if (cb(array[index], index, array)) {\\r\\n return index;\\r\\n }\\r\\n }\\r\\n return -1;\\r\\n};\\r\\nconst isTransparent = function (color) {\\r\\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \\\"0\\\";\\r\\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \\\"00\\\";\\r\\n return isRGBTransparent || isRRGGBBTransparent || color === _colors__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"].elementBackground[0];\\r\\n};\\r\\nconst resolvablePromise = function () {\\r\\n let resolve;\\r\\n let reject;\\r\\n const promise = new Promise(function (_resolve, _reject) {\\r\\n resolve = _resolve;\\r\\n reject = _reject;\\r\\n });\\r\\n promise.resolve = resolve;\\r\\n promise.reject = reject;\\r\\n return promise;\\r\\n};\\r\\n/**\\r\\n * @param func handler taking at most single parameter (event).\\r\\n */\\r\\nconst withBatchedUpdates = function (func) {\\r\\n return function (event) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_2__.unstable_batchedUpdates)(func, event);\\r\\n };\\r\\n}; //https://stackoverflow.com/a/9462382/8418\\r\\nconst nFormatter = function (num, digits) {\\r\\n const si = [{\\r\\n value: 1,\\r\\n symbol: \\\"b\\\"\\r\\n }, {\\r\\n value: 1e3,\\r\\n symbol: \\\"k\\\"\\r\\n }, {\\r\\n value: 1e6,\\r\\n symbol: \\\"M\\\"\\r\\n }, {\\r\\n value: 1e9,\\r\\n symbol: \\\"G\\\"\\r\\n }];\\r\\n const rx = /\\\\.0+$|(\\\\.[0-9]*[1-9])0+$/;\\r\\n let index;\\r\\n for (index = si.length - 1; index > 0; index--) {\\r\\n if (num >= si[index].value) {\\r\\n break;\\r\\n }\\r\\n }\\r\\n return (num / si[index].value).toFixed(digits).replace(rx, \\\"$1\\\") + si[index].symbol;\\r\\n};\\r\\nconst getVersion = function () {\\r\\n var _a;\\r\\n return ((_a = document.querySelector('meta[name=\\\"version\\\"]')) === null || _a === void 0 ? void 0 : _a.content) || _constants__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_VERSION;\\r\\n}; // Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\\r\\nconst supportsEmoji = function () {\\r\\n const canvas = document.createElement(\\\"canvas\\\");\\r\\n const ctx = canvas.getContext(\\\"2d\\\");\\r\\n if (!ctx) {\\r\\n return false;\\r\\n }\\r\\n const offset = 12;\\r\\n ctx.fillStyle = \\\"#f00\\\";\\r\\n ctx.textBaseline = \\\"top\\\";\\r\\n ctx.font = \\\"32px Arial\\\"; // Modernizr used 🐨, but it is sort of supported on Windows 7.\\r\\n // Luckily 😀 isn't supported.\\r\\n ctx.fillText(\\\"😀\\\", 0, 0);\\r\\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\\r\\n};\\r\\nconst getNearestScrollableContainer = function (element) {\\r\\n let parent = element.parentElement;\\r\\n while (parent) {\\r\\n if (parent === document.body) {\\r\\n return document;\\r\\n }\\r\\n const { overflowY } = window.getComputedStyle(parent);\\r\\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\\r\\n if (hasScrollableContent && (overflowY === \\\"auto\\\" || overflowY === \\\"scroll\\\")) {\\r\\n return parent;\\r\\n }\\r\\n parent = parent.parentElement;\\r\\n }\\r\\n return document;\\r\\n};\\r\\nconst focusNearestParent = function (element) {\\r\\n let parent = element.parentElement;\\r\\n while (parent) {\\r\\n if (parent.tabIndex > -1) {\\r\\n parent.focus();\\r\\n return;\\r\\n }\\r\\n parent = parent.parentElement;\\r\\n }\\r\\n};\\r\\nconst preventUnload = function (event) {\\r\\n event.preventDefault(); // NOTE: modern browsers no longer allow showing a custom message here\\r\\n event.returnValue = \\\"\\\";\\r\\n};\\r\\nconst bytesToHexString = function (bytes) {\\r\\n return Array.from(bytes).map(function (byte) {\\r\\n return `0${byte.toString(16)}`.slice(-2);\\r\\n }).join(\\\"\\\");\\r\\n};\\r\\nconst getUpdatedTimestamp = function () {\\r\\n return isTestEnv() ? 1 : Date.now();\\r\\n};\\r\\n/**\\r\\n * Transforms array of objects containing `id` attribute,\\r\\n * or array of ids (strings), into a Map, keyd by `id`.\\r\\n */\\r\\nconst arrayToMap = function (items) {\\r\\n return items.reduce(function (acc, element) {\\r\\n acc.set(typeof element === \\\"string\\\" ? element : element.id, element);\\r\\n return acc;\\r\\n }, new Map());\\r\\n};\\r\\nconst isTestEnv = function () {\\r\\n var _a;\\r\\n return typeof process !== \\\"undefined\\\" && ((_a = ({\\\"REACT_APP_BACKEND_V2_GET_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/\\\",\\\"REACT_APP_BACKEND_V2_POST_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/post/\\\",\\\"REACT_APP_LIBRARY_URL\\\":\\\"https://libraries.excalidraw.com\\\",\\\"REACT_APP_LIBRARY_BACKEND\\\":\\\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\\\",\\\"REACT_APP_SOCKET_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_FIREBASE_CONFIG\\\":\\\"{\\\\\\\"apiKey\\\\\\\":\\\\\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\\\\\",\\\\\\\"authDomain\\\\\\\":\\\\\\\"excalidraw-oss-dev.firebaseapp.com\\\\\\\",\\\\\\\"projectId\\\\\\\":\\\\\\\"excalidraw-oss-dev\\\\\\\",\\\\\\\"storageBucket\\\\\\\":\\\\\\\"excalidraw-oss-dev.appspot.com\\\\\\\",\\\\\\\"messagingSenderId\\\\\\\":\\\\\\\"664559512677\\\\\\\",\\\\\\\"appId\\\\\\\":\\\\\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\\\\\"}\\\"})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \\\"test\\\";\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QVcsR0FBRyxFQUFFLENBQUM7QUFDekIsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLEtBQUs7SUFDN0MsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUk7UUFDekMsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZCxDQUFDLENBQUM7QUFDSyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLE9BQU8sU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3RDLENBQUMsQ0FBQztBQUNGOzs7R0FHRztBQUVJLE1BQU0sVUFBVSxHQUFHLFVBQVUsS0FBSztJQUN2QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLEVBQUUsT0FBTztRQUN4QyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQixDQUFDLENBQUM7QUFDSyxNQUFNLFNBQVMsR0FBRzs7SUFDdkIsT0FBTyxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksb3NCQUFXLDBDQUFFLFFBQVEsTUFBSyxNQUFNLENBQUM7QUFDNUUsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3V0aWxzLnRzP2IxZGMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi9jb2xvcnNcIjtcbmltcG9ydCB7IENVUlNPUl9UWVBFLCBERUZBVUxUX1ZFUlNJT04sIEZPTlRfRkFNSUxZLCBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIH0gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgaXNEYXJ3aW4gfSBmcm9tIFwiLi9rZXlzXCI7XG5sZXQgbW9ja0RhdGVUaW1lID0gbnVsbDtcbmV4cG9ydCBjb25zdCBzZXREYXRlVGltZUZvclRlc3RzID0gZnVuY3Rpb24gKGRhdGVUaW1lKSB7XG4gIG1vY2tEYXRlVGltZSA9IGRhdGVUaW1lO1xufTtcbmV4cG9ydCBjb25zdCBnZXREYXRlVGltZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKG1vY2tEYXRlVGltZSkge1xuICAgIHJldHVybiBtb2NrRGF0ZVRpbWU7XG4gIH1cblxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGggPSBgJHtkYXRlLmdldE1vbnRoKCkgKyAxfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBkYXkgPSBgJHtkYXRlLmdldERhdGUoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgaHIgPSBgJHtkYXRlLmdldEhvdXJzKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IG1pbiA9IGAke2RhdGUuZ2V0TWludXRlcygpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9LSR7aHJ9JHttaW59YDtcbn07XG5leHBvcnQgY29uc3QgY2FwaXRhbGl6ZVN0cmluZyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbn07XG5leHBvcnQgY29uc3QgaXNUb29sSWNvbiA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5jbGFzc05hbWUuaW5jbHVkZXMoXCJUb29sSWNvblwiKTtcbn07XG5leHBvcnQgY29uc3QgaXNJbnB1dExpa2UgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuZGF0YXNldC50eXBlID09PSBcInd5c2l3eWdcIiB8fCB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MQlJFbGVtZW50IHx8IC8vIG5ld2xpbmUgaW4gd3lzaXd5Z1xuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8IHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQ7XG59O1xuZXhwb3J0IGNvbnN0IGlzV3JpdGFibGVFbGVtZW50ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fCB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmICh0YXJnZXQudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgdGFyZ2V0LnR5cGUgPT09IFwibnVtYmVyXCIpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRGb250RmFtaWx5U3RyaW5nID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBmb250RmFtaWx5XG4gIH0gPSBfcmVmO1xuXG4gIGZvciAoY29uc3QgW2ZvbnRGYW1pbHlTdHJpbmcsIGlkXSBvZiBPYmplY3QuZW50cmllcyhGT05UX0ZBTUlMWSkpIHtcbiAgICBpZiAoaWQgPT09IGZvbnRGYW1pbHkpIHtcbiAgICAgIHJldHVybiBgJHtmb250RmFtaWx5U3RyaW5nfSwgJHtXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlR9YDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UO1xufTtcbi8qKiByZXR1cm5zIGZvbnRTaXplK2ZvbnRGYW1pbHkgc3RyaW5nIGZvciBhc3NpZ25tZW50IHRvIERPTSBlbGVtZW50cyAqL1xuXG5leHBvcnQgY29uc3QgZ2V0Rm9udFN0cmluZyA9IGZ1bmN0aW9uIChfcmVmMikge1xuICBsZXQge1xuICAgIGZvbnRTaXplLFxuICAgIGZvbnRGYW1pbHlcbiAgfSA9IF9yZWYyO1xuICByZXR1cm4gYCR7Zm9udFNpemV9cHggJHtnZXRGb250RmFtaWx5U3RyaW5nKHtcbiAgICBmb250RmFtaWx5XG4gIH0pfWA7XG59O1xuZXhwb3J0IGNvbnN0IGRlYm91bmNlID0gZnVuY3Rpb24gKGZuLCB0aW1lb3V0KSB7XG4gIGxldCBoYW5kbGUgPSAwO1xuICBsZXQgbGFzdEFyZ3MgPSBudWxsO1xuXG4gIGNvbnN0IHJldCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIGhhbmRsZSA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgIH0sIHRpbWVvdXQpO1xuICB9O1xuXG4gIHJldC5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcblxuICAgIGlmIChsYXN0QXJncykge1xuICAgICAgY29uc3QgX2xhc3RBcmdzID0gbGFzdEFyZ3M7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5fbGFzdEFyZ3MpO1xuICAgIH1cbiAgfTtcblxuICByZXQuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgfTtcblxuICByZXR1cm4gcmV0O1xufTsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9lcy9jaHVuay5qc1xuXG5leHBvcnQgY29uc3QgY2h1bmsgPSBmdW5jdGlvbiAoYXJyYXksIHNpemUpIHtcbiAgaWYgKCFhcnJheS5sZW5ndGggfHwgc2l6ZSA8IDEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgcmVzSW5kZXggPSAwO1xuICBjb25zdCByZXN1bHQgPSBBcnJheShNYXRoLmNlaWwoYXJyYXkubGVuZ3RoIC8gc2l6ZSkpO1xuXG4gIHdoaWxlIChpbmRleCA8IGFycmF5Lmxlbmd0aCkge1xuICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGFycmF5LnNsaWNlKGluZGV4LCBpbmRleCArPSBzaXplKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0IGNvbnN0IHNlbGVjdE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKHNlbGVjdGlvbikge1xuICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobm9kZSk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgcmVtb3ZlU2VsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCBkaXN0YW5jZSA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gIHJldHVybiBNYXRoLmFicyh4IC0geSk7XG59O1xuZXhwb3J0IGNvbnN0IHJlc2V0Q3Vyc29yID0gZnVuY3Rpb24gKGNhbnZhcykge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yID0gZnVuY3Rpb24gKGNhbnZhcywgY3Vyc29yKSB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IHNldEN1cnNvckZvclNoYXBlID0gZnVuY3Rpb24gKGNhbnZhcywgc2hhcGUpIHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2hhcGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICByZXNldEN1cnNvcihjYW52YXMpOyAvLyBkbyBub3RoaW5nIGlmIGltYWdlIHRvb2wgaXMgc2VsZWN0ZWQgd2hpY2ggc3VnZ2VzdHMgdGhlcmUnc1xuICAgIC8vIGEgaW1hZ2UtcHJldmlldyBzZXQgYXMgdGhlIGN1cnNvclxuICB9IGVsc2UgaWYgKHNoYXBlICE9PSBcImltYWdlXCIpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gQ1VSU09SX1RZUEUuQ1JPU1NIQUlSO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IGlzRnVsbFNjcmVlbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50Py5ub2RlTmFtZSA9PT0gXCJIVE1MXCI7XG59O1xuZXhwb3J0IGNvbnN0IGFsbG93RnVsbFNjcmVlbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpO1xufTtcbmV4cG9ydCBjb25zdCBleGl0RnVsbFNjcmVlbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCk7XG59O1xuZXhwb3J0IGNvbnN0IGdldFNob3J0Y3V0S2V5ID0gZnVuY3Rpb24gKHNob3J0Y3V0KSB7XG4gIHNob3J0Y3V0ID0gc2hvcnRjdXQucmVwbGFjZSgvXFxiQWx0XFxiL2ksIFwiQWx0XCIpLnJlcGxhY2UoL1xcYlNoaWZ0XFxiL2ksIFwiU2hpZnRcIikucmVwbGFjZSgvXFxiKEVudGVyfFJldHVybilcXGIvaSwgXCJFbnRlclwiKS5yZXBsYWNlKC9cXGJEZWxcXGIvaSwgXCJEZWxldGVcIik7XG5cbiAgaWYgKGlzRGFyd2luKSB7XG4gICAgcmV0dXJuIHNob3J0Y3V0LnJlcGxhY2UoL1xcYkN0cmxPckNtZFxcYi9pLCBcIkNtZFwiKS5yZXBsYWNlKC9cXGJBbHRcXGIvaSwgXCJPcHRpb25cIik7XG4gIH1cblxuICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2ksIFwiQ3RybFwiKTtcbn07XG5leHBvcnQgY29uc3Qgdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzID0gZnVuY3Rpb24gKF9yZWYzLCBfcmVmNCkge1xuICBsZXQge1xuICAgIGNsaWVudFgsXG4gICAgY2xpZW50WVxuICB9ID0gX3JlZjM7XG4gIGxldCB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFlcbiAgfSA9IF9yZWY0O1xuICBjb25zdCBpbnZTY2FsZSA9IDEgLyB6b29tLnZhbHVlO1xuICBjb25zdCB4ID0gKGNsaWVudFggLSB6b29tLnRyYW5zbGF0aW9uLnggLSBvZmZzZXRMZWZ0KSAqIGludlNjYWxlIC0gc2Nyb2xsWDtcbiAgY29uc3QgeSA9IChjbGllbnRZIC0gem9vbS50cmFuc2xhdGlvbi55IC0gb2Zmc2V0VG9wKSAqIGludlNjYWxlIC0gc2Nyb2xsWTtcbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHlcbiAgfTtcbn07XG5leHBvcnQgY29uc3Qgc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzID0gZnVuY3Rpb24gKF9yZWY1LCBfcmVmNikge1xuICBsZXQge1xuICAgIHNjZW5lWCxcbiAgICBzY2VuZVlcbiAgfSA9IF9yZWY1O1xuICBsZXQge1xuICAgIHpvb20sXG4gICAgb2Zmc2V0TGVmdCxcbiAgICBvZmZzZXRUb3AsXG4gICAgc2Nyb2xsWCxcbiAgICBzY3JvbGxZXG4gIH0gPSBfcmVmNjtcbiAgY29uc3QgeCA9IChzY2VuZVggKyBzY3JvbGxYKSAqIHpvb20udmFsdWUgKyB6b29tLnRyYW5zbGF0aW9uLnggKyBvZmZzZXRMZWZ0O1xuICBjb25zdCB5ID0gKHNjZW5lWSArIHNjcm9sbFkpICogem9vbS52YWx1ZSArIHpvb20udHJhbnNsYXRpb24ueSArIG9mZnNldFRvcDtcbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHlcbiAgfTtcbn07XG5leHBvcnQgY29uc3QgZ2V0R2xvYmFsQ1NTVmFyaWFibGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoYC0tJHtuYW1lfWApO1xufTtcbmNvbnN0IFJTX0xUUl9DSEFSUyA9IFwiQS1aYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkI4XFx1MDMwMC1cXHUwNTkwXFx1MDgwMC1cXHUxRkZGXCIgKyBcIlxcdTJDMDAtXFx1RkIxQ1xcdUZERkUtXFx1RkU2RlxcdUZFRkQtXFx1RkZGRlwiO1xuY29uc3QgUlNfUlRMX0NIQVJTID0gXCJcXHUwNTkxLVxcdTA3RkZcXHVGQjFELVxcdUZERkRcXHVGRTcwLVxcdUZFRkNcIjtcbmNvbnN0IFJFX1JUTF9DSEVDSyA9IG5ldyBSZWdFeHAoYF5bXiR7UlNfTFRSX0NIQVJTfV0qWyR7UlNfUlRMX0NIQVJTfV1gKTtcbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZmlyc3QgZGlyZWN0aW9uYWwgY2hhcmFjdGVyIGlzIFJUTC4gTWVhbmluZyB3aGV0aGVyIGl0IHN0YXJ0c1xuICogIHdpdGggUlRMIGNoYXJhY3RlcnMsIG9yIGluZGV0ZXJtaW5hdGUgKG51bWJlcnMgZXRjLikgY2hhcmFjdGVycyBmb2xsb3dlZCBieVxuICogIFJUTC5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvMTcyMiNkaXNjdXNzaW9uX3I0MzYzNDAxNzFcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNSVEwgPSBmdW5jdGlvbiAodGV4dCkge1xuICByZXR1cm4gUkVfUlRMX0NIRUNLLnRlc3QodGV4dCk7XG59O1xuZXhwb3J0IGNvbnN0IHR1cGxlVG9Db29ycyA9IGZ1bmN0aW9uICh4eVR1cGxlKSB7XG4gIGNvbnN0IFt4LCB5XSA9IHh5VHVwbGU7XG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5XG4gIH07XG59O1xuLyoqIHVzZSBhcyBhIHJlamVjdGlvbkhhbmRsZXIgdG8gbXV0ZSBmaWxlc3lzdGVtIEFib3J0IGVycm9ycyAqL1xuXG5leHBvcnQgY29uc3QgbXV0ZUZTQWJvcnRFcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuICBpZiAoZXJyb3I/Lm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBlcnJvcjtcbn07XG5leHBvcnQgY29uc3QgZmluZEluZGV4ID0gZnVuY3Rpb24gKGFycmF5LCBjYikge1xuICBsZXQgZnJvbUluZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwO1xuXG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gYXJyYXkubGVuZ3RoICsgZnJvbUluZGV4O1xuICB9XG5cbiAgZnJvbUluZGV4ID0gTWF0aC5taW4oYXJyYXkubGVuZ3RoLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4IC0gMTtcblxuICB3aGlsZSAoKytpbmRleCA8IGFycmF5Lmxlbmd0aCkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTE7XG59O1xuZXhwb3J0IGNvbnN0IGZpbmRMYXN0SW5kZXggPSBmdW5jdGlvbiAoYXJyYXksIGNiKSB7XG4gIGxldCBmcm9tSW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGFycmF5Lmxlbmd0aCAtIDE7XG5cbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cblxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4ICsgMTtcblxuICB3aGlsZSAoLS1pbmRleCA+IC0xKSB7XG4gICAgaWYgKGNiKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn07XG5leHBvcnQgY29uc3QgaXNUcmFuc3BhcmVudCA9IGZ1bmN0aW9uIChjb2xvcikge1xuICBjb25zdCBpc1JHQlRyYW5zcGFyZW50ID0gY29sb3IubGVuZ3RoID09PSA1ICYmIGNvbG9yLnN1YnN0cig0LCAxKSA9PT0gXCIwXCI7XG4gIGNvbnN0IGlzUlJHR0JCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDkgJiYgY29sb3Iuc3Vic3RyKDcsIDIpID09PSBcIjAwXCI7XG4gIHJldHVybiBpc1JHQlRyYW5zcGFyZW50IHx8IGlzUlJHR0JCVHJhbnNwYXJlbnQgfHwgY29sb3IgPT09IGNvbG9ycy5lbGVtZW50QmFja2dyb3VuZFswXTtcbn07XG5leHBvcnQgY29uc3QgcmVzb2x2YWJsZVByb21pc2UgPSBmdW5jdGlvbiAoKSB7XG4gIGxldCByZXNvbHZlO1xuICBsZXQgcmVqZWN0O1xuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgcmVzb2x2ZSA9IF9yZXNvbHZlO1xuICAgIHJlamVjdCA9IF9yZWplY3Q7XG4gIH0pO1xuICBwcm9taXNlLnJlc29sdmUgPSByZXNvbHZlO1xuICBwcm9taXNlLnJlamVjdCA9IHJlamVjdDtcbiAgcmV0dXJuIHByb21pc2U7XG59O1xuLyoqXG4gKiBAcGFyYW0gZnVuYyBoYW5kbGVyIHRha2luZyBhdCBtb3N0IHNpbmdsZSBwYXJhbWV0ZXIgKGV2ZW50KS5cbiAqL1xuXG5leHBvcnQgY29uc3Qgd2l0aEJhdGNoZWRVcGRhdGVzID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmMsIGV2ZW50KTtcbiAgfTtcbn07IC8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuXG5leHBvcnQgY29uc3QgbkZvcm1hdHRlciA9IGZ1bmN0aW9uIChudW0sIGRpZ2l0cykge1xuICBjb25zdCBzaSA9IFt7XG4gICAgdmFsdWU6IDEsXG4gICAgc3ltYm9sOiBcImJcIlxuICB9LCB7XG4gICAgdmFsdWU6IDFlMyxcbiAgICBzeW1ib2w6IFwia1wiXG4gIH0sIHtcbiAgICB2YWx1ZTogMWU2LFxuICAgIHN5bWJvbDogXCJNXCJcbiAgfSwge1xuICAgIHZhbHVlOiAxZTksXG4gICAgc3ltYm9sOiBcIkdcIlxuICB9XTtcbiAgY29uc3QgcnggPSAvXFwuMCskfChcXC5bMC05XSpbMS05XSkwKyQvO1xuICBsZXQgaW5kZXg7XG5cbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKG51bSAvIHNpW2luZGV4XS52YWx1ZSkudG9GaXhlZChkaWdpdHMpLnJlcGxhY2UocngsIFwiJDFcIikgKyBzaVtpbmRleF0uc3ltYm9sO1xufTtcbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8IERFRkFVTFRfVkVSU0lPTjtcbn07IC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvZW1vamkuanNcblxuZXhwb3J0IGNvbnN0IHN1cHBvcnRzRW1vamkgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSAxMjtcbiAgY3R4LmZpbGxTdHlsZSA9IFwiI2YwMFwiO1xuICBjdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcbiAgY3R4LmZvbnQgPSBcIjMycHggQXJpYWxcIjsgLy8gTW9kZXJuaXpyIHVzZWQg8J+QqCwgYnV0IGl0IGlzIHNvcnQgb2Ygc3VwcG9ydGVkIG9uIFdpbmRvd3MgNy5cbiAgLy8gTHVja2lseSDwn5iAIGlzbid0IHN1cHBvcnRlZC5cblxuICBjdHguZmlsbFRleHQoXCLwn5iAXCIsIDAsIDApO1xuICByZXR1cm4gY3R4LmdldEltYWdlRGF0YShvZmZzZXQsIG9mZnNldCwgMSwgMSkuZGF0YVswXSAhPT0gMDtcbn07XG5leHBvcnQgY29uc3QgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgb3ZlcmZsb3dZXG4gICAgfSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudCk7XG4gICAgY29uc3QgaGFzU2Nyb2xsYWJsZUNvbnRlbnQgPSBwYXJlbnQuc2Nyb2xsSGVpZ2h0ID4gcGFyZW50LmNsaWVudEhlaWdodDtcblxuICAgIGlmIChoYXNTY3JvbGxhYmxlQ29udGVudCAmJiAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fCBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIpKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG5cbiAgcmV0dXJuIGRvY3VtZW50O1xufTtcbmV4cG9ydCBjb25zdCBmb2N1c05lYXJlc3RQYXJlbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50LnRhYkluZGV4ID4gLTEpIHtcbiAgICAgIHBhcmVudC5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IHByZXZlbnRVbmxvYWQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gTk9URTogbW9kZXJuIGJyb3dzZXJzIG5vIGxvbmdlciBhbGxvdyBzaG93aW5nIGEgY3VzdG9tIG1lc3NhZ2UgaGVyZVxuXG4gIGV2ZW50LnJldHVyblZhbHVlID0gXCJcIjtcbn07XG5leHBvcnQgY29uc3QgYnl0ZXNUb0hleFN0cmluZyA9IGZ1bmN0aW9uIChieXRlcykge1xuICByZXR1cm4gQXJyYXkuZnJvbShieXRlcykubWFwKGZ1bmN0aW9uIChieXRlKSB7XG4gICAgcmV0dXJuIGAwJHtieXRlLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC0yKTtcbiAgfSkuam9pbihcIlwiKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0VXBkYXRlZFRpbWVzdGFtcCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzVGVzdEVudigpID8gMSA6IERhdGUubm93KCk7XG59O1xuLyoqXG4gKiBUcmFuc2Zvcm1zIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyBgaWRgIGF0dHJpYnV0ZSxcbiAqIG9yIGFycmF5IG9mIGlkcyAoc3RyaW5ncyksIGludG8gYSBNYXAsIGtleWQgYnkgYGlkYC5cbiAqL1xuXG5leHBvcnQgY29uc3QgYXJyYXlUb01hcCA9IGZ1bmN0aW9uIChpdGVtcykge1xuICByZXR1cm4gaXRlbXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGVsZW1lbnQpIHtcbiAgICBhY2Muc2V0KHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiID8gZWxlbWVudCA6IGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIG5ldyBNYXAoKSk7XG59O1xuZXhwb3J0IGNvbnN0IGlzVGVzdEVudiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5OT0RFX0VOViA9PT0gXCJ0ZXN0XCI7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../utils.ts\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../utils.ts?");
3077
3077
 
3078
3078
  /***/ }),
3079
3079
 
@@ -3777,7 +3777,7 @@ eval("module.exports = JSON.parse('{\"labels\":{\"paste\":\"貼上\",\"pasteChar
3777
3777
  /***/ ((module) => {
3778
3778
 
3779
3779
  "use strict";
3780
- eval("module.exports = JSON.parse('{\"name\":\"@zsviczian/excalidraw\",\"version\":\"0.10.0-obsidian-36\",\"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.7\",\"@babel/plugin-transform-arrow-functions\":\"7.16.7\",\"@babel/plugin-transform-async-to-generator\":\"7.16.0\",\"@babel/plugin-transform-runtime\":\"7.16.8\",\"@babel/plugin-transform-typescript\":\"7.16.1\",\"@babel/preset-env\":\"7.16.7\",\"@babel/preset-react\":\"7.16.7\",\"@babel/preset-typescript\":\"7.16.7\",\"autoprefixer\":\"10.4.2\",\"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.6\",\"postcss-loader\":\"6.2.1\",\"sass-loader\":\"12.4.0\",\"terser-webpack-plugin\":\"5.3.0\",\"ts-loader\":\"9.2.6\",\"typescript\":\"4.5.4\",\"webpack\":\"5.65.0\",\"webpack-bundle-analyzer\":\"4.5.0\",\"webpack-cli\":\"4.9.1\",\"webpack-dev-server\":\"4.7.3\",\"webpack-merge\":\"5.8.0\"},\"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\",\"start\":\"webpack serve --config webpack.dev-server.config.js \"},\"dependencies\":{\"dotenv\":\"10.0.0\"}}');\n\n//# sourceURL=webpack://Excalidraw/./package.json?");
3780
+ eval("module.exports = JSON.parse('{\"name\":\"@zsviczian/excalidraw\",\"version\":\"0.10.0-obsidian-37\",\"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.7\",\"@babel/plugin-transform-arrow-functions\":\"7.16.7\",\"@babel/plugin-transform-async-to-generator\":\"7.16.0\",\"@babel/plugin-transform-runtime\":\"7.16.8\",\"@babel/plugin-transform-typescript\":\"7.16.1\",\"@babel/preset-env\":\"7.16.7\",\"@babel/preset-react\":\"7.16.7\",\"@babel/preset-typescript\":\"7.16.7\",\"autoprefixer\":\"10.4.2\",\"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.6\",\"postcss-loader\":\"6.2.1\",\"sass-loader\":\"12.4.0\",\"terser-webpack-plugin\":\"5.3.0\",\"ts-loader\":\"9.2.6\",\"typescript\":\"4.5.4\",\"webpack\":\"5.65.0\",\"webpack-bundle-analyzer\":\"4.5.0\",\"webpack-cli\":\"4.9.1\",\"webpack-dev-server\":\"4.7.3\",\"webpack-merge\":\"5.8.0\"},\"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\",\"start\":\"webpack serve --config webpack.dev-server.config.js \"},\"dependencies\":{\"dotenv\":\"10.0.0\"}}');\n\n//# sourceURL=webpack://Excalidraw/./package.json?");
3781
3781
 
3782
3782
  /***/ })
3783
3783