@zsviczian/excalidraw 0.12.0-obsidian-3 → 0.12.0-obsidian-4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1861,7 +1861,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
1861
1861
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1862
1862
|
|
|
1863
1863
|
"use strict";
|
|
1864
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"trackEvent\\\": () => (/* binding */ trackEvent)\\n/* harmony export */ });\\nvar _a, _b;\\r\\nconst trackEvent = 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_WS_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_PORTAL_URL\\\":\\\"\\\",\\\"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\\\\\\\"}\\\",\\\"REACT_APP_DEV_ENABLE_SW\\\":\\\"\\\",\\\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\\\":\\\"\\\",\\\"PKG_NAME\\\":\\\"@zsviczian/excalidraw\\\",\\\"PKG_VERSION\\\":\\\"0.12.0-obsidian-
|
|
1864
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"trackEvent\\\": () => (/* binding */ trackEvent)\\n/* harmony export */ });\\nvar _a, _b;\\r\\nconst trackEvent = 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_WS_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_PORTAL_URL\\\":\\\"\\\",\\\"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\\\\\\\"}\\\",\\\"REACT_APP_DEV_ENABLE_SW\\\":\\\"\\\",\\\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\\\":\\\"\\\",\\\"PKG_NAME\\\":\\\"@zsviczian/excalidraw\\\",\\\"PKG_VERSION\\\":\\\"0.12.0-obsidian-4\\\",\\\"IS_EXCALIDRAW_NPM_PACKAGE\\\":true})) === null || _a === void 0 ? void 0 : _a.REACT_APP_GOOGLE_ANALYTICS_ID) && typeof window !== \\\"undefined\\\" && window.gtag ? function (category, action, label, value) {\\r\\n try {\\r\\n window.gtag(\\\"event\\\", action, {\\r\\n event_category: category,\\r\\n event_label: label,\\r\\n value\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(\\\"error logging to ga\\\", error);\\r\\n }\\r\\n} : typeof process !== \\\"undefined\\\" && ((_b = ({\\\"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_WS_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_PORTAL_URL\\\":\\\"\\\",\\\"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\\\\\\\"}\\\",\\\"REACT_APP_DEV_ENABLE_SW\\\":\\\"\\\",\\\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\\\":\\\"\\\",\\\"PKG_NAME\\\":\\\"@zsviczian/excalidraw\\\",\\\"PKG_VERSION\\\":\\\"0.12.0-obsidian-4\\\",\\\"IS_EXCALIDRAW_NPM_PACKAGE\\\":true})) === null || _b === void 0 ? void 0 : _b.JEST_WORKER_ID) ? function (category, action, label, value) { } : function (category, action, label, value) {\\r\\n // console.log(\\\"Track Event\\\", { category, action, label, value });\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQU8sTUFBTSxVQUFVLEdBQUcsT0FBTyxPQUFPLEtBQUssV0FBVyxLQUFJLG00QkFBVywwQ0FBRSw2QkFBNkIsS0FBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLO0lBQy9MLElBQUk7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7WUFDM0IsY0FBYyxFQUFFLFFBQVE7WUFDeEIsV0FBVyxFQUFFLEtBQUs7WUFDbEIsS0FBSztTQUNOLENBQUMsQ0FBQztLQUNKO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzdDO0FBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLEtBQUksbTRCQUFXLDBDQUFFLGNBQWMsRUFBQyxDQUFDLENBQUMsVUFBVSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLElBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUs7SUFDekosa0VBQWtFO0FBQ3BFLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9hbmFseXRpY3MudHM/ZmIxMCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgdHJhY2tFdmVudCA9IHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5SRUFDVF9BUFBfR09PR0xFX0FOQUxZVElDU19JRCAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5ndGFnID8gZnVuY3Rpb24gKGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB2YWx1ZSkge1xuICB0cnkge1xuICAgIHdpbmRvdy5ndGFnKFwiZXZlbnRcIiwgYWN0aW9uLCB7XG4gICAgICBldmVudF9jYXRlZ29yeTogY2F0ZWdvcnksXG4gICAgICBldmVudF9sYWJlbDogbGFiZWwsXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciBsb2dnaW5nIHRvIGdhXCIsIGVycm9yKTtcbiAgfVxufSA6IHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5KRVNUX1dPUktFUl9JRCA/IGZ1bmN0aW9uIChjYXRlZ29yeSwgYWN0aW9uLCBsYWJlbCwgdmFsdWUpIHt9IDogZnVuY3Rpb24gKGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB2YWx1ZSkgey8vIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIHRyYWNrIGxvY2FsbHlcbiAgLy8gY29uc29sZS5sb2coXCJUcmFjayBFdmVudFwiLCB7IGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB2YWx1ZSB9KTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///../../analytics.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../analytics.ts?");
|
|
1865
1865
|
|
|
1866
1866
|
/***/ }),
|
|
1867
1867
|
|
|
@@ -2785,7 +2785,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
2785
2785
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2786
2786
|
|
|
2787
2787
|
"use strict";
|
|
2788
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"OMIT_SIDES_FOR_MULTIPLE_ELEMENTS\\\": () => (/* binding */ OMIT_SIDES_FOR_MULTIPLE_ELEMENTS),\\n/* harmony export */ \\\"getTransformHandles\\\": () => (/* binding */ getTransformHandles),\\n/* harmony export */ \\\"getTransformHandlesFromCoords\\\": () => (/* binding */ getTransformHandlesFromCoords)\\n/* harmony export */ });\\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bounds */ \\\"../../element/bounds.ts\\\");\\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math */ \\\"../../math.ts\\\");\\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! . */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\nconst transformHandleSizes = {\\r\\n mouse: 8,\\r\\n pen: 16,\\r\\n touch: 28\\r\\n};\\r\\nconst ROTATION_RESIZE_HANDLE_GAP = 16;\\r\\nconst OMIT_SIDES_FOR_MULTIPLE_ELEMENTS = {\\r\\n e: true,\\r\\n s: true,\\r\\n n: true,\\r\\n w: true\\r\\n};\\r\\nconst OMIT_SIDES_FOR_TEXT_ELEMENT = {\\r\\n e: true,\\r\\n s: true,\\r\\n n: true,\\r\\n w: true\\r\\n};\\r\\nconst OMIT_SIDES_FOR_LINE_SLASH = {\\r\\n e: true,\\r\\n s: true,\\r\\n n: true,\\r\\n w: true,\\r\\n nw: true,\\r\\n se: true\\r\\n};\\r\\nconst OMIT_SIDES_FOR_LINE_BACKSLASH = {\\r\\n e: true,\\r\\n s: true,\\r\\n n: true,\\r\\n w: true\\r\\n};\\r\\nconst OMIT_SIDES_FOR_LINEAR_ELEMENT = {\\r\\n e: true,\\r\\n s: true,\\r\\n n: true,\\r\\n w: true,\\r\\n nw: true,\\r\\n se: true,\\r\\n ne: true,\\r\\n sw: true,\\r\\n rotation: true\\r\\n};\\r\\nconst generateTransformHandle = function (x, y, width, height, cx, cy, angle) {\\r\\n const [xx, yy] = (0,_math__WEBPACK_IMPORTED_MODULE_1__.rotate)(x + width / 2, y + height / 2, cx, cy, angle);\\r\\n return [xx - width / 2, yy - height / 2, width, height];\\r\\n};\\r\\nconst getTransformHandlesFromCoords = function (_ref, angle, zoom, pointerType) {\\r\\n let [x1, y1, x2, y2] = _ref;\\r\\n let omitSides = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};\\r\\n const size = transformHandleSizes[pointerType];\\r\\n const handleWidth = size / zoom.value;\\r\\n const handleHeight = size / zoom.value;\\r\\n const handleMarginX = size / zoom.value;\\r\\n const handleMarginY = size / zoom.value;\\r\\n const width = x2 - x1;\\r\\n const height = y2 - y1;\\r\\n const cx = (x1 + x2) / 2;\\r\\n const cy = (y1 + y2) / 2;\\r\\n const dashedLineMargin = 4 / zoom.value;\\r\\n const centeringOffset = (size - 8) / (2 * zoom.value);\\r\\n const transformHandles = {\\r\\n nw: omitSides.nw ? undefined : generateTransformHandle(x1 - dashedLineMargin - handleMarginX + centeringOffset, y1 - dashedLineMargin - handleMarginY + centeringOffset, handleWidth, handleHeight, cx, cy, angle),\\r\\n ne: omitSides.ne ? undefined : generateTransformHandle(x2 + dashedLineMargin - centeringOffset, y1 - dashedLineMargin - handleMarginY + centeringOffset, handleWidth, handleHeight, cx, cy, angle),\\r\\n sw: omitSides.sw ? undefined : generateTransformHandle(x1 - dashedLineMargin - handleMarginX + centeringOffset, y2 + dashedLineMargin - centeringOffset, handleWidth, handleHeight, cx, cy, angle),\\r\\n se: omitSides.se ? undefined : generateTransformHandle(x2 + dashedLineMargin - centeringOffset, y2 + dashedLineMargin - centeringOffset, handleWidth, handleHeight, cx, cy, angle),\\r\\n rotation: omitSides.rotation ? undefined : generateTransformHandle(x1 + width / 2 - handleWidth / 2, y1 - dashedLineMargin - handleMarginY + centeringOffset - ROTATION_RESIZE_HANDLE_GAP / zoom.value, handleWidth, handleHeight, cx, cy, angle)\\r\\n }; // We only want to show height handles (all cardinal directions) above a certain size\\r\\n // Note: we render using \\\"mouse\\\" size so we should also use \\\"mouse\\\" size for this check\\r\\n const minimumSizeForEightHandles = 5 * transformHandleSizes.mouse / zoom.value;\\r\\n if (Math.abs(width) > minimumSizeForEightHandles) {\\r\\n if (!omitSides.n) {\\r\\n transformHandles.n = generateTransformHandle(x1 + width / 2 - handleWidth / 2, y1 - dashedLineMargin - handleMarginY + centeringOffset, handleWidth, handleHeight, cx, cy, angle);\\r\\n }\\r\\n if (!omitSides.s) {\\r\\n transformHandles.s = generateTransformHandle(x1 + width / 2 - handleWidth / 2, y2 + dashedLineMargin - centeringOffset, handleWidth, handleHeight, cx, cy, angle);\\r\\n }\\r\\n }\\r\\n if (Math.abs(height) > minimumSizeForEightHandles) {\\r\\n if (!omitSides.w) {\\r\\n transformHandles.w = generateTransformHandle(x1 - dashedLineMargin - handleMarginX + centeringOffset, y1 + height / 2 - handleHeight / 2, handleWidth, handleHeight, cx, cy, angle);\\r\\n }\\r\\n if (!omitSides.e) {\\r\\n transformHandles.e = generateTransformHandle(x2 + dashedLineMargin - centeringOffset, y1 + height / 2 - handleHeight / 2, handleWidth, handleHeight, cx, cy, angle);\\r\\n }\\r\\n }\\r\\n return transformHandles;\\r\\n};\\r\\nconst getTransformHandles = function (element, zoom) {\\r\\n let pointerType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \\\"mouse\\\";\\r\\n // so that when locked element is selected (especially when you toggle lock\\r\\n // via keyboard) the locked element is visually distinct, indicating\\r\\n // you can't move/resize\\r\\n if (element.locked) {\\r\\n return {};\\r\\n }\\r\\n let omitSides = {};\\r\\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\\r\\n omitSides = OMIT_SIDES_FOR_LINEAR_ELEMENT;\\r\\n }\\r\\n else if (element.type === \\\"freedraw\\\") {\\r\\n if (element.points.length === 2) {\\r\\n // only check the last point because starting point is always (0,0)\\r\\n const [, p1] = element.points;\\r\\n if (p1[0] === 0 || p1[1] === 0) {\\r\\n omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\\r\\n }\\r\\n else if (p1[0] > 0 && p1[1] < 0) {\\r\\n omitSides = OMIT_SIDES_FOR_LINE_SLASH;\\r\\n }\\r\\n else if (p1[0] > 0 && p1[1] > 0) {\\r\\n omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\\r\\n }\\r\\n else if (p1[0] < 0 && p1[1] > 0) {\\r\\n omitSides = OMIT_SIDES_FOR_LINE_SLASH;\\r\\n }\\r\\n else if (p1[0] < 0 && p1[1] < 0) {\\r\\n omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\\r\\n }\\r\\n }\\r\\n }\\r\\n else if ((0,___WEBPACK_IMPORTED_MODULE_2__.isTextElement)(element)) {\\r\\n omitSides = OMIT_SIDES_FOR_TEXT_ELEMENT;\\r\\n }\\r\\n return getTransformHandlesFromCoords((0,_bounds__WEBPACK_IMPORTED_MODULE_0__.getElementAbsoluteCoords)(element), element.angle, zoom, pointerType, omitSides);\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Ryx5QkFBeUIsQ0FBQzthQUN2QztpQkFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDakMsU0FBUyxHQUFHLDZCQUE2QixDQUFDO2FBQzNDO1NBQ0Y7S0FDRjtTQUFNLElBQUksZ0RBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNqQyxTQUFTLEdBQUcsMkJBQTJCLENBQUM7S0FDekM7SUFFRCxPQUFPLDZCQUE2QixDQUFDLGlFQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2SCxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC90cmFuc2Zvcm1IYW5kbGVzLnRzPzM0MTUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4vYm91bmRzXCI7XG5pbXBvcnQgeyByb3RhdGUgfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHsgaXNUZXh0RWxlbWVudCB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyBpc0xpbmVhckVsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5jb25zdCB0cmFuc2Zvcm1IYW5kbGVTaXplcyA9IHtcbiAgbW91c2U6IDgsXG4gIHBlbjogMTYsXG4gIHRvdWNoOiAyOFxufTtcbmNvbnN0IFJPVEFUSU9OX1JFU0laRV9IQU5ETEVfR0FQID0gMTY7XG5leHBvcnQgY29uc3QgT01JVF9TSURFU19GT1JfTVVMVElQTEVfRUxFTUVOVFMgPSB7XG4gIGU6IHRydWUsXG4gIHM6IHRydWUsXG4gIG46IHRydWUsXG4gIHc6IHRydWVcbn07XG5jb25zdCBPTUlUX1NJREVTX0ZPUl9URVhUX0VMRU1FTlQgPSB7XG4gIGU6IHRydWUsXG4gIHM6IHRydWUsXG4gIG46IHRydWUsXG4gIHc6IHRydWVcbn07XG5jb25zdCBPTUlUX1NJREVTX0ZPUl9MSU5FX1NMQVNIID0ge1xuICBlOiB0cnVlLFxuICBzOiB0cnVlLFxuICBuOiB0cnVlLFxuICB3OiB0cnVlLFxuICBudzogdHJ1ZSxcbiAgc2U6IHRydWVcbn07XG5jb25zdCBPTUlUX1NJREVTX0ZPUl9MSU5FX0JBQ0tTTEFTSCA9IHtcbiAgZTogdHJ1ZSxcbiAgczogdHJ1ZSxcbiAgbjogdHJ1ZSxcbiAgdzogdHJ1ZVxufTtcbmNvbnN0IE9NSVRfU0lERVNfRk9SX0xJTkVBUl9FTEVNRU5UID0ge1xuICBlOiB0cnVlLFxuICBzOiB0cnVlLFxuICBuOiB0cnVlLFxuICB3OiB0cnVlLFxuICBudzogdHJ1ZSxcbiAgc2U6IHRydWUsXG4gIG5lOiB0cnVlLFxuICBzdzogdHJ1ZSxcbiAgcm90YXRpb246IHRydWVcbn07XG5cbmNvbnN0IGdlbmVyYXRlVHJhbnNmb3JtSGFuZGxlID0gZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIGN4LCBjeSwgYW5nbGUpIHtcbiAgY29uc3QgW3h4LCB5eV0gPSByb3RhdGUoeCArIHdpZHRoIC8gMiwgeSArIGhlaWdodCAvIDIsIGN4LCBjeSwgYW5nbGUpO1xuICByZXR1cm4gW3h4IC0gd2lkdGggLyAyLCB5eSAtIGhlaWdodCAvIDIsIHdpZHRoLCBoZWlnaHRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRyYW5zZm9ybUhhbmRsZXNGcm9tQ29vcmRzID0gZnVuY3Rpb24gKF9yZWYsIGFuZ2xlLCB6b29tLCBwb2ludGVyVHlwZSkge1xuICBsZXQgW3gxLCB5MSwgeDIsIHkyXSA9IF9yZWY7XG4gIGxldCBvbWl0U2lkZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHt9O1xuICBjb25zdCBzaXplID0gdHJhbnNmb3JtSGFuZGxlU2l6ZXNbcG9pbnRlclR5cGVdO1xuICBjb25zdCBoYW5kbGVXaWR0aCA9IHNpemUgLyB6b29tLnZhbHVlO1xuICBjb25zdCBoYW5kbGVIZWlnaHQgPSBzaXplIC8gem9vbS52YWx1ZTtcbiAgY29uc3QgaGFuZGxlTWFyZ2luWCA9IHNpemUgLyB6b29tLnZhbHVlO1xuICBjb25zdCBoYW5kbGVNYXJnaW5ZID0gc2l6ZSAvIHpvb20udmFsdWU7XG4gIGNvbnN0IHdpZHRoID0geDIgLSB4MTtcbiAgY29uc3QgaGVpZ2h0ID0geTIgLSB5MTtcbiAgY29uc3QgY3ggPSAoeDEgKyB4MikgLyAyO1xuICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDI7XG4gIGNvbnN0IGRhc2hlZExpbmVNYXJnaW4gPSA0IC8gem9vbS52YWx1ZTtcbiAgY29uc3QgY2VudGVyaW5nT2Zmc2V0ID0gKHNpemUgLSA4KSAvICgyICogem9vbS52YWx1ZSk7XG4gIGNvbnN0IHRyYW5zZm9ybUhhbmRsZXMgPSB7XG4gICAgbnc6IG9taXRTaWRlcy5udyA/IHVuZGVmaW5lZCA6IGdlbmVyYXRlVHJhbnNmb3JtSGFuZGxlKHgxIC0gZGFzaGVkTGluZU1hcmdpbiAtIGhhbmRsZU1hcmdpblggKyBjZW50ZXJpbmdPZmZzZXQsIHkxIC0gZGFzaGVkTGluZU1hcmdpbiAtIGhhbmRsZU1hcmdpblkgKyBjZW50ZXJpbmdPZmZzZXQsIGhhbmRsZVdpZHRoLCBoYW5kbGVIZWlnaHQsIGN4LCBjeSwgYW5nbGUpLFxuICAgIG5lOiBvbWl0U2lkZXMubmUgPyB1bmRlZmluZWQgOiBnZW5lcmF0ZVRyYW5zZm9ybUhhbmRsZSh4MiArIGRhc2hlZExpbmVNYXJnaW4gLSBjZW50ZXJpbmdPZmZzZXQsIHkxIC0gZGFzaGVkTGluZU1hcmdpbiAtIGhhbmRsZU1hcmdpblkgKyBjZW50ZXJpbmdPZmZzZXQsIGhhbmRsZVdpZHRoLCBoYW5kbGVIZWlnaHQsIGN4LCBjeSwgYW5nbGUpLFxuICAgIHN3OiBvbWl0U2lkZXMuc3cgPyB1bmRlZmluZWQgOiBnZW5lcmF0ZVRyYW5zZm9ybUhhbmRsZSh4MSAtIGRhc2hlZExpbmVNYXJnaW4gLSBoYW5kbGVNYXJnaW5YICsgY2VudGVyaW5nT2Zmc2V0LCB5MiArIGRhc2hlZExpbmVNYXJnaW4gLSBjZW50ZXJpbmdPZmZzZXQsIGhhbmRsZVdpZHRoLCBoYW5kbGVIZWlnaHQsIGN4LCBjeSwgYW5nbGUpLFxuICAgIHNlOiBvbWl0U2lkZXMuc2UgPyB1bmRlZmluZWQgOiBnZW5lcmF0ZVRyYW5zZm9ybUhhbmRsZSh4MiArIGRhc2hlZExpbmVNYXJnaW4gLSBjZW50ZXJpbmdPZmZzZXQsIHkyICsgZGFzaGVkTGluZU1hcmdpbiAtIGNlbnRlcmluZ09mZnNldCwgaGFuZGxlV2lkdGgsIGhhbmRsZUhlaWdodCwgY3gsIGN5LCBhbmdsZSksXG4gICAgcm90YXRpb246IG9taXRTaWRlcy5yb3RhdGlvbiA/IHVuZGVmaW5lZCA6IGdlbmVyYXRlVHJhbnNmb3JtSGFuZGxlKHgxICsgd2lkdGggLyAyIC0gaGFuZGxlV2lkdGggLyAyLCB5MSAtIGRhc2hlZExpbmVNYXJnaW4gLSBoYW5kbGVNYXJnaW5ZICsgY2VudGVyaW5nT2Zmc2V0IC0gUk9UQVRJT05fUkVTSVpFX0hBTkRMRV9HQVAgLyB6b29tLnZhbHVlLCBoYW5kbGVXaWR0aCwgaGFuZGxlSGVpZ2h0LCBjeCwgY3ksIGFuZ2xlKVxuICB9OyAvLyBXZSBvbmx5IHdhbnQgdG8gc2hvdyBoZWlnaHQgaGFuZGxlcyAoYWxsIGNhcmRpbmFsIGRpcmVjdGlvbnMpICBhYm92ZSBhIGNlcnRhaW4gc2l6ZVxuICAvLyBOb3RlOiB3ZSByZW5kZXIgdXNpbmcgXCJtb3VzZVwiIHNpemUgc28gd2Ugc2hvdWxkIGFsc28gdXNlIFwibW91c2VcIiBzaXplIGZvciB0aGlzIGNoZWNrXG5cbiAgY29uc3QgbWluaW11bVNpemVGb3JFaWdodEhhbmRsZXMgPSA1ICogdHJhbnNmb3JtSGFuZGxlU2l6ZXMubW91c2UgLyB6b29tLnZhbHVlO1xuXG4gIGlmIChNYXRoLmFicyh3aWR0aCkgPiBtaW5pbXVtU2l6ZUZvckVpZ2h0SGFuZGxlcykge1xuICAgIGlmICghb21pdFNpZGVzLm4pIHtcbiAgICAgIHRyYW5zZm9ybUhhbmRsZXMubiA9IGdlbmVyYXRlVHJhbnNmb3JtSGFuZGxlKHgxICsgd2lkdGggLyAyIC0gaGFuZGxlV2lkdGggLyAyLCB5MSAtIGRhc2hlZExpbmVNYXJnaW4gLSBoYW5kbGVNYXJnaW5ZICsgY2VudGVyaW5nT2Zmc2V0LCBoYW5kbGVXaWR0aCwgaGFuZGxlSGVpZ2h0LCBjeCwgY3ksIGFuZ2xlKTtcbiAgICB9XG5cbiAgICBpZiAoIW9taXRTaWRlcy5zKSB7XG4gICAgICB0cmFuc2Zvcm1IYW5kbGVzLnMgPSBnZW5lcmF0ZVRyYW5zZm9ybUhhbmRsZSh4MSArIHdpZHRoIC8gMiAtIGhhbmRsZVdpZHRoIC8gMiwgeTIgKyBkYXNoZWRMaW5lTWFyZ2luIC0gY2VudGVyaW5nT2Zmc2V0LCBoYW5kbGVXaWR0aCwgaGFuZGxlSGVpZ2h0LCBjeCwgY3ksIGFuZ2xlKTtcbiAgICB9XG4gIH1cblxuICBpZiAoTWF0aC5hYnMoaGVpZ2h0KSA+IG1pbmltdW1TaXplRm9yRWlnaHRIYW5kbGVzKSB7XG4gICAgaWYgKCFvbWl0U2lkZXMudykge1xuICAgICAgdHJhbnNmb3JtSGFuZGxlcy53ID0gZ2VuZXJhdGVUcmFuc2Zvcm1IYW5kbGUoeDEgLSBkYXNoZWRMaW5lTWFyZ2luIC0gaGFuZGxlTWFyZ2luWCArIGNlbnRlcmluZ09mZnNldCwgeTEgKyBoZWlnaHQgLyAyIC0gaGFuZGxlSGVpZ2h0IC8gMiwgaGFuZGxlV2lkdGgsIGhhbmRsZUhlaWdodCwgY3gsIGN5LCBhbmdsZSk7XG4gICAgfVxuXG4gICAgaWYgKCFvbWl0U2lkZXMuZSkge1xuICAgICAgdHJhbnNmb3JtSGFuZGxlcy5lID0gZ2VuZXJhdGVUcmFuc2Zvcm1IYW5kbGUoeDIgKyBkYXNoZWRMaW5lTWFyZ2luIC0gY2VudGVyaW5nT2Zmc2V0LCB5MSArIGhlaWdodCAvIDIgLSBoYW5kbGVIZWlnaHQgLyAyLCBoYW5kbGVXaWR0aCwgaGFuZGxlSGVpZ2h0LCBjeCwgY3ksIGFuZ2xlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJhbnNmb3JtSGFuZGxlcztcbn07XG5leHBvcnQgY29uc3QgZ2V0VHJhbnNmb3JtSGFuZGxlcyA9IGZ1bmN0aW9uIChlbGVtZW50LCB6b29tKSB7XG4gIGxldCBwb2ludGVyVHlwZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogXCJtb3VzZVwiO1xuXG4gIC8vIHNvIHRoYXQgd2hlbiBsb2NrZWQgZWxlbWVudCBpcyBzZWxlY3RlZCAoZXNwZWNpYWxseSB3aGVuIHlvdSB0b2dnbGUgbG9ja1xuICAvLyB2aWEga2V5Ym9hcmQpIHRoZSBsb2NrZWQgZWxlbWVudCBpcyB2aXN1YWxseSBkaXN0aW5jdCwgaW5kaWNhdGluZ1xuICAvLyB5b3UgY2FuJ3QgbW92ZS9yZXNpemVcbiAgaWYgKGVsZW1lbnQubG9ja2VkKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgbGV0IG9taXRTaWRlcyA9IHt9O1xuXG4gIGlmIChpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBvbWl0U2lkZXMgPSBPTUlUX1NJREVTX0ZPUl9MSU5FQVJfRUxFTUVOVDtcbiAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09IFwiZnJlZWRyYXdcIikge1xuICAgIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIC8vIG9ubHkgY2hlY2sgdGhlIGxhc3QgcG9pbnQgYmVjYXVzZSBzdGFydGluZyBwb2ludCBpcyBhbHdheXMgKDAsMClcbiAgICAgIGNvbnN0IFssIHAxXSA9IGVsZW1lbnQucG9pbnRzO1xuXG4gICAgICBpZiAocDFbMF0gPT09IDAgfHwgcDFbMV0gPT09IDApIHtcbiAgICAgICAgb21pdFNpZGVzID0gT01JVF9TSURFU19GT1JfTElORV9CQUNLU0xBU0g7XG4gICAgICB9IGVsc2UgaWYgKHAxWzBdID4gMCAmJiBwMVsxXSA8IDApIHtcbiAgICAgICAgb21pdFNpZGVzID0gT01JVF9TSURFU19GT1JfTElORV9TTEFTSDtcbiAgICAgIH0gZWxzZSBpZiAocDFbMF0gPiAwICYmIHAxWzFdID4gMCkge1xuICAgICAgICBvbWl0U2lkZXMgPSBPTUlUX1NJREVTX0ZPUl9MSU5FX0JBQ0tTTEFTSDtcbiAgICAgIH0gZWxzZSBpZiAocDFbMF0gPCAwICYmIHAxWzFdID4gMCkge1xuICAgICAgICBvbWl0U2lkZXMgPSBPTUlUX1NJREVTX0ZPUl9MSU5FX1NMQVNIO1xuICAgICAgfSBlbHNlIGlmIChwMVswXSA8IDAgJiYgcDFbMV0gPCAwKSB7XG4gICAgICAgIG9taXRTaWRlcyA9IE9NSVRfU0lERVNfRk9SX0xJTkVfQkFDS1NMQVNIO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgb21pdFNpZGVzID0gT01JVF9TSURFU19GT1JfVEVYVF9FTEVNRU5UO1xuICB9XG5cbiAgcmV0dXJuIGdldFRyYW5zZm9ybUhhbmRsZXNGcm9tQ29vcmRzKGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KSwgZWxlbWVudC5hbmdsZSwgem9vbSwgcG9pbnRlclR5cGUsIG9taXRTaWRlcyk7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../element/transformHandles.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../element/transformHandles.ts?");
|
|
2788
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"OMIT_SIDES_FOR_MULTIPLE_ELEMENTS\\\": () => (/* binding */ OMIT_SIDES_FOR_MULTIPLE_ELEMENTS),\\n/* harmony export */ \\\"getTransformHandles\\\": () => (/* binding */ getTransformHandles),\\n/* harmony export */ \\\"getTransformHandlesFromCoords\\\": () => (/* binding */ getTransformHandlesFromCoords)\\n/* harmony export */ });\\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bounds */ \\\"../../element/bounds.ts\\\");\\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math */ \\\"../../math.ts\\\");\\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! . */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\nconst transformHandleSizes = {\\r\\n mouse: 8,\\r\\n pen: 16,\\r\\n touch: 28\\r\\n};\\r\\nconst ROTATION_RESIZE_HANDLE_GAP = 16;\\r\\nconst OMIT_SIDES_FOR_MULTIPLE_ELEMENTS = {\\r\\n e: true,\\r\\n s: true,\\r\\n n: true,\\r\\n w: true\\r\\n};\\r\\nconst OMIT_SIDES_FOR_TEXT_ELEMENT = {\\r\\n e: true,\\r\\n s: true,\\r\\n n: true,\\r\\n w: true\\r\\n};\\r\\nconst OMIT_SIDES_FOR_LINE_SLASH = {\\r\\n e: true,\\r\\n s: true,\\r\\n n: true,\\r\\n w: true,\\r\\n nw: true,\\r\\n se: true\\r\\n};\\r\\nconst OMIT_SIDES_FOR_LINE_BACKSLASH = {\\r\\n e: true,\\r\\n s: true,\\r\\n n: true,\\r\\n w: true\\r\\n};\\r\\nconst generateTransformHandle = function (x, y, width, height, cx, cy, angle) {\\r\\n const [xx, yy] = (0,_math__WEBPACK_IMPORTED_MODULE_1__.rotate)(x + width / 2, y + height / 2, cx, cy, angle);\\r\\n return [xx - width / 2, yy - height / 2, width, height];\\r\\n};\\r\\nconst getTransformHandlesFromCoords = function (_ref, angle, zoom, pointerType) {\\r\\n let [x1, y1, x2, y2] = _ref;\\r\\n let omitSides = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};\\r\\n const size = transformHandleSizes[pointerType];\\r\\n const handleWidth = size / zoom.value;\\r\\n const handleHeight = size / zoom.value;\\r\\n const handleMarginX = size / zoom.value;\\r\\n const handleMarginY = size / zoom.value;\\r\\n const width = x2 - x1;\\r\\n const height = y2 - y1;\\r\\n const cx = (x1 + x2) / 2;\\r\\n const cy = (y1 + y2) / 2;\\r\\n const dashedLineMargin = 4 / zoom.value;\\r\\n const centeringOffset = (size - 8) / (2 * zoom.value);\\r\\n const transformHandles = {\\r\\n nw: omitSides.nw ? undefined : generateTransformHandle(x1 - dashedLineMargin - handleMarginX + centeringOffset, y1 - dashedLineMargin - handleMarginY + centeringOffset, handleWidth, handleHeight, cx, cy, angle),\\r\\n ne: omitSides.ne ? undefined : generateTransformHandle(x2 + dashedLineMargin - centeringOffset, y1 - dashedLineMargin - handleMarginY + centeringOffset, handleWidth, handleHeight, cx, cy, angle),\\r\\n sw: omitSides.sw ? undefined : generateTransformHandle(x1 - dashedLineMargin - handleMarginX + centeringOffset, y2 + dashedLineMargin - centeringOffset, handleWidth, handleHeight, cx, cy, angle),\\r\\n se: omitSides.se ? undefined : generateTransformHandle(x2 + dashedLineMargin - centeringOffset, y2 + dashedLineMargin - centeringOffset, handleWidth, handleHeight, cx, cy, angle),\\r\\n rotation: omitSides.rotation ? undefined : generateTransformHandle(x1 + width / 2 - handleWidth / 2, y1 - dashedLineMargin - handleMarginY + centeringOffset - ROTATION_RESIZE_HANDLE_GAP / zoom.value, handleWidth, handleHeight, cx, cy, angle)\\r\\n }; // We only want to show height handles (all cardinal directions) above a certain size\\r\\n // Note: we render using \\\"mouse\\\" size so we should also use \\\"mouse\\\" size for this check\\r\\n const minimumSizeForEightHandles = 5 * transformHandleSizes.mouse / zoom.value;\\r\\n if (Math.abs(width) > minimumSizeForEightHandles) {\\r\\n if (!omitSides.n) {\\r\\n transformHandles.n = generateTransformHandle(x1 + width / 2 - handleWidth / 2, y1 - dashedLineMargin - handleMarginY + centeringOffset, handleWidth, handleHeight, cx, cy, angle);\\r\\n }\\r\\n if (!omitSides.s) {\\r\\n transformHandles.s = generateTransformHandle(x1 + width / 2 - handleWidth / 2, y2 + dashedLineMargin - centeringOffset, handleWidth, handleHeight, cx, cy, angle);\\r\\n }\\r\\n }\\r\\n if (Math.abs(height) > minimumSizeForEightHandles) {\\r\\n if (!omitSides.w) {\\r\\n transformHandles.w = generateTransformHandle(x1 - dashedLineMargin - handleMarginX + centeringOffset, y1 + height / 2 - handleHeight / 2, handleWidth, handleHeight, cx, cy, angle);\\r\\n }\\r\\n if (!omitSides.e) {\\r\\n transformHandles.e = generateTransformHandle(x2 + dashedLineMargin - centeringOffset, y1 + height / 2 - handleHeight / 2, handleWidth, handleHeight, cx, cy, angle);\\r\\n }\\r\\n }\\r\\n return transformHandles;\\r\\n};\\r\\nconst getTransformHandles = function (element, zoom) {\\r\\n let pointerType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \\\"mouse\\\";\\r\\n // so that when locked element is selected (especially when you toggle lock\\r\\n // via keyboard) the locked element is visually distinct, indicating\\r\\n // you can't move/resize\\r\\n if (element.locked) {\\r\\n return {};\\r\\n }\\r\\n let omitSides = {};\\r\\n if (element.type === \\\"freedraw\\\" || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\\r\\n if (element.points.length === 2) {\\r\\n // only check the last point because starting point is always (0,0)\\r\\n const [, p1] = element.points;\\r\\n if (p1[0] === 0 || p1[1] === 0) {\\r\\n omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\\r\\n }\\r\\n else if (p1[0] > 0 && p1[1] < 0) {\\r\\n omitSides = OMIT_SIDES_FOR_LINE_SLASH;\\r\\n }\\r\\n else if (p1[0] > 0 && p1[1] > 0) {\\r\\n omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\\r\\n }\\r\\n else if (p1[0] < 0 && p1[1] > 0) {\\r\\n omitSides = OMIT_SIDES_FOR_LINE_SLASH;\\r\\n }\\r\\n else if (p1[0] < 0 && p1[1] < 0) {\\r\\n omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\\r\\n }\\r\\n }\\r\\n }\\r\\n else if ((0,___WEBPACK_IMPORTED_MODULE_2__.isTextElement)(element)) {\\r\\n omitSides = OMIT_SIDES_FOR_TEXT_ELEMENT;\\r\\n }\\r\\n return getTransformHandlesFromCoords((0,_bounds__WEBPACK_IMPORTED_MODULE_0__.getElementAbsoluteCoords)(element), element.angle, zoom, pointerType, omitSides);\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkgsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvdHJhbnNmb3JtSGFuZGxlcy50cz8zNDE1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyB9IGZyb20gXCIuL2JvdW5kc1wiO1xuaW1wb3J0IHsgcm90YXRlIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgaXNMaW5lYXJFbGVtZW50IH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuY29uc3QgdHJhbnNmb3JtSGFuZGxlU2l6ZXMgPSB7XG4gIG1vdXNlOiA4LFxuICBwZW46IDE2LFxuICB0b3VjaDogMjhcbn07XG5jb25zdCBST1RBVElPTl9SRVNJWkVfSEFORExFX0dBUCA9IDE2O1xuZXhwb3J0IGNvbnN0IE9NSVRfU0lERVNfRk9SX01VTFRJUExFX0VMRU1FTlRTID0ge1xuICBlOiB0cnVlLFxuICBzOiB0cnVlLFxuICBuOiB0cnVlLFxuICB3OiB0cnVlXG59O1xuY29uc3QgT01JVF9TSURFU19GT1JfVEVYVF9FTEVNRU5UID0ge1xuICBlOiB0cnVlLFxuICBzOiB0cnVlLFxuICBuOiB0cnVlLFxuICB3OiB0cnVlXG59O1xuY29uc3QgT01JVF9TSURFU19GT1JfTElORV9TTEFTSCA9IHtcbiAgZTogdHJ1ZSxcbiAgczogdHJ1ZSxcbiAgbjogdHJ1ZSxcbiAgdzogdHJ1ZSxcbiAgbnc6IHRydWUsXG4gIHNlOiB0cnVlXG59O1xuY29uc3QgT01JVF9TSURFU19GT1JfTElORV9CQUNLU0xBU0ggPSB7XG4gIGU6IHRydWUsXG4gIHM6IHRydWUsXG4gIG46IHRydWUsXG4gIHc6IHRydWVcbn07XG5cbmNvbnN0IGdlbmVyYXRlVHJhbnNmb3JtSGFuZGxlID0gZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIGN4LCBjeSwgYW5nbGUpIHtcbiAgY29uc3QgW3h4LCB5eV0gPSByb3RhdGUoeCArIHdpZHRoIC8gMiwgeSArIGhlaWdodCAvIDIsIGN4LCBjeSwgYW5nbGUpO1xuICByZXR1cm4gW3h4IC0gd2lkdGggLyAyLCB5eSAtIGhlaWdodCAvIDIsIHdpZHRoLCBoZWlnaHRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRyYW5zZm9ybUhhbmRsZXNGcm9tQ29vcmRzID0gZnVuY3Rpb24gKF9yZWYsIGFuZ2xlLCB6b29tLCBwb2ludGVyVHlwZSkge1xuICBsZXQgW3gxLCB5MSwgeDIsIHkyXSA9IF9yZWY7XG4gIGxldCBvbWl0U2lkZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHt9O1xuICBjb25zdCBzaXplID0gdHJhbnNmb3JtSGFuZGxlU2l6ZXNbcG9pbnRlclR5cGVdO1xuICBjb25zdCBoYW5kbGVXaWR0aCA9IHNpemUgLyB6b29tLnZhbHVlO1xuICBjb25zdCBoYW5kbGVIZWlnaHQgPSBzaXplIC8gem9vbS52YWx1ZTtcbiAgY29uc3QgaGFuZGxlTWFyZ2luWCA9IHNpemUgLyB6b29tLnZhbHVlO1xuICBjb25zdCBoYW5kbGVNYXJnaW5ZID0gc2l6ZSAvIHpvb20udmFsdWU7XG4gIGNvbnN0IHdpZHRoID0geDIgLSB4MTtcbiAgY29uc3QgaGVpZ2h0ID0geTIgLSB5MTtcbiAgY29uc3QgY3ggPSAoeDEgKyB4MikgLyAyO1xuICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDI7XG4gIGNvbnN0IGRhc2hlZExpbmVNYXJnaW4gPSA0IC8gem9vbS52YWx1ZTtcbiAgY29uc3QgY2VudGVyaW5nT2Zmc2V0ID0gKHNpemUgLSA4KSAvICgyICogem9vbS52YWx1ZSk7XG4gIGNvbnN0IHRyYW5zZm9ybUhhbmRsZXMgPSB7XG4gICAgbnc6IG9taXRTaWRlcy5udyA/IHVuZGVmaW5lZCA6IGdlbmVyYXRlVHJhbnNmb3JtSGFuZGxlKHgxIC0gZGFzaGVkTGluZU1hcmdpbiAtIGhhbmRsZU1hcmdpblggKyBjZW50ZXJpbmdPZmZzZXQsIHkxIC0gZGFzaGVkTGluZU1hcmdpbiAtIGhhbmRsZU1hcmdpblkgKyBjZW50ZXJpbmdPZmZzZXQsIGhhbmRsZVdpZHRoLCBoYW5kbGVIZWlnaHQsIGN4LCBjeSwgYW5nbGUpLFxuICAgIG5lOiBvbWl0U2lkZXMubmUgPyB1bmRlZmluZWQgOiBnZW5lcmF0ZVRyYW5zZm9ybUhhbmRsZSh4MiArIGRhc2hlZExpbmVNYXJnaW4gLSBjZW50ZXJpbmdPZmZzZXQsIHkxIC0gZGFzaGVkTGluZU1hcmdpbiAtIGhhbmRsZU1hcmdpblkgKyBjZW50ZXJpbmdPZmZzZXQsIGhhbmRsZVdpZHRoLCBoYW5kbGVIZWlnaHQsIGN4LCBjeSwgYW5nbGUpLFxuICAgIHN3OiBvbWl0U2lkZXMuc3cgPyB1bmRlZmluZWQgOiBnZW5lcmF0ZVRyYW5zZm9ybUhhbmRsZSh4MSAtIGRhc2hlZExpbmVNYXJnaW4gLSBoYW5kbGVNYXJnaW5YICsgY2VudGVyaW5nT2Zmc2V0LCB5MiArIGRhc2hlZExpbmVNYXJnaW4gLSBjZW50ZXJpbmdPZmZzZXQsIGhhbmRsZVdpZHRoLCBoYW5kbGVIZWlnaHQsIGN4LCBjeSwgYW5nbGUpLFxuICAgIHNlOiBvbWl0U2lkZXMuc2UgPyB1bmRlZmluZWQgOiBnZW5lcmF0ZVRyYW5zZm9ybUhhbmRsZSh4MiArIGRhc2hlZExpbmVNYXJnaW4gLSBjZW50ZXJpbmdPZmZzZXQsIHkyICsgZGFzaGVkTGluZU1hcmdpbiAtIGNlbnRlcmluZ09mZnNldCwgaGFuZGxlV2lkdGgsIGhhbmRsZUhlaWdodCwgY3gsIGN5LCBhbmdsZSksXG4gICAgcm90YXRpb246IG9taXRTaWRlcy5yb3RhdGlvbiA/IHVuZGVmaW5lZCA6IGdlbmVyYXRlVHJhbnNmb3JtSGFuZGxlKHgxICsgd2lkdGggLyAyIC0gaGFuZGxlV2lkdGggLyAyLCB5MSAtIGRhc2hlZExpbmVNYXJnaW4gLSBoYW5kbGVNYXJnaW5ZICsgY2VudGVyaW5nT2Zmc2V0IC0gUk9UQVRJT05fUkVTSVpFX0hBTkRMRV9HQVAgLyB6b29tLnZhbHVlLCBoYW5kbGVXaWR0aCwgaGFuZGxlSGVpZ2h0LCBjeCwgY3ksIGFuZ2xlKVxuICB9OyAvLyBXZSBvbmx5IHdhbnQgdG8gc2hvdyBoZWlnaHQgaGFuZGxlcyAoYWxsIGNhcmRpbmFsIGRpcmVjdGlvbnMpICBhYm92ZSBhIGNlcnRhaW4gc2l6ZVxuICAvLyBOb3RlOiB3ZSByZW5kZXIgdXNpbmcgXCJtb3VzZVwiIHNpemUgc28gd2Ugc2hvdWxkIGFsc28gdXNlIFwibW91c2VcIiBzaXplIGZvciB0aGlzIGNoZWNrXG5cbiAgY29uc3QgbWluaW11bVNpemVGb3JFaWdodEhhbmRsZXMgPSA1ICogdHJhbnNmb3JtSGFuZGxlU2l6ZXMubW91c2UgLyB6b29tLnZhbHVlO1xuXG4gIGlmIChNYXRoLmFicyh3aWR0aCkgPiBtaW5pbXVtU2l6ZUZvckVpZ2h0SGFuZGxlcykge1xuICAgIGlmICghb21pdFNpZGVzLm4pIHtcbiAgICAgIHRyYW5zZm9ybUhhbmRsZXMubiA9IGdlbmVyYXRlVHJhbnNmb3JtSGFuZGxlKHgxICsgd2lkdGggLyAyIC0gaGFuZGxlV2lkdGggLyAyLCB5MSAtIGRhc2hlZExpbmVNYXJnaW4gLSBoYW5kbGVNYXJnaW5ZICsgY2VudGVyaW5nT2Zmc2V0LCBoYW5kbGVXaWR0aCwgaGFuZGxlSGVpZ2h0LCBjeCwgY3ksIGFuZ2xlKTtcbiAgICB9XG5cbiAgICBpZiAoIW9taXRTaWRlcy5zKSB7XG4gICAgICB0cmFuc2Zvcm1IYW5kbGVzLnMgPSBnZW5lcmF0ZVRyYW5zZm9ybUhhbmRsZSh4MSArIHdpZHRoIC8gMiAtIGhhbmRsZVdpZHRoIC8gMiwgeTIgKyBkYXNoZWRMaW5lTWFyZ2luIC0gY2VudGVyaW5nT2Zmc2V0LCBoYW5kbGVXaWR0aCwgaGFuZGxlSGVpZ2h0LCBjeCwgY3ksIGFuZ2xlKTtcbiAgICB9XG4gIH1cblxuICBpZiAoTWF0aC5hYnMoaGVpZ2h0KSA+IG1pbmltdW1TaXplRm9yRWlnaHRIYW5kbGVzKSB7XG4gICAgaWYgKCFvbWl0U2lkZXMudykge1xuICAgICAgdHJhbnNmb3JtSGFuZGxlcy53ID0gZ2VuZXJhdGVUcmFuc2Zvcm1IYW5kbGUoeDEgLSBkYXNoZWRMaW5lTWFyZ2luIC0gaGFuZGxlTWFyZ2luWCArIGNlbnRlcmluZ09mZnNldCwgeTEgKyBoZWlnaHQgLyAyIC0gaGFuZGxlSGVpZ2h0IC8gMiwgaGFuZGxlV2lkdGgsIGhhbmRsZUhlaWdodCwgY3gsIGN5LCBhbmdsZSk7XG4gICAgfVxuXG4gICAgaWYgKCFvbWl0U2lkZXMuZSkge1xuICAgICAgdHJhbnNmb3JtSGFuZGxlcy5lID0gZ2VuZXJhdGVUcmFuc2Zvcm1IYW5kbGUoeDIgKyBkYXNoZWRMaW5lTWFyZ2luIC0gY2VudGVyaW5nT2Zmc2V0LCB5MSArIGhlaWdodCAvIDIgLSBoYW5kbGVIZWlnaHQgLyAyLCBoYW5kbGVXaWR0aCwgaGFuZGxlSGVpZ2h0LCBjeCwgY3ksIGFuZ2xlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJhbnNmb3JtSGFuZGxlcztcbn07XG5leHBvcnQgY29uc3QgZ2V0VHJhbnNmb3JtSGFuZGxlcyA9IGZ1bmN0aW9uIChlbGVtZW50LCB6b29tKSB7XG4gIGxldCBwb2ludGVyVHlwZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogXCJtb3VzZVwiO1xuXG4gIC8vIHNvIHRoYXQgd2hlbiBsb2NrZWQgZWxlbWVudCBpcyBzZWxlY3RlZCAoZXNwZWNpYWxseSB3aGVuIHlvdSB0b2dnbGUgbG9ja1xuICAvLyB2aWEga2V5Ym9hcmQpIHRoZSBsb2NrZWQgZWxlbWVudCBpcyB2aXN1YWxseSBkaXN0aW5jdCwgaW5kaWNhdGluZ1xuICAvLyB5b3UgY2FuJ3QgbW92ZS9yZXNpemVcbiAgaWYgKGVsZW1lbnQubG9ja2VkKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgbGV0IG9taXRTaWRlcyA9IHt9O1xuXG4gIGlmIChlbGVtZW50LnR5cGUgPT09IFwiZnJlZWRyYXdcIiB8fCBpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBpZiAoZWxlbWVudC5wb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAvLyBvbmx5IGNoZWNrIHRoZSBsYXN0IHBvaW50IGJlY2F1c2Ugc3RhcnRpbmcgcG9pbnQgaXMgYWx3YXlzICgwLDApXG4gICAgICBjb25zdCBbLCBwMV0gPSBlbGVtZW50LnBvaW50cztcblxuICAgICAgaWYgKHAxWzBdID09PSAwIHx8IHAxWzFdID09PSAwKSB7XG4gICAgICAgIG9taXRTaWRlcyA9IE9NSVRfU0lERVNfRk9SX0xJTkVfQkFDS1NMQVNIO1xuICAgICAgfSBlbHNlIGlmIChwMVswXSA+IDAgJiYgcDFbMV0gPCAwKSB7XG4gICAgICAgIG9taXRTaWRlcyA9IE9NSVRfU0lERVNfRk9SX0xJTkVfU0xBU0g7XG4gICAgICB9IGVsc2UgaWYgKHAxWzBdID4gMCAmJiBwMVsxXSA+IDApIHtcbiAgICAgICAgb21pdFNpZGVzID0gT01JVF9TSURFU19GT1JfTElORV9CQUNLU0xBU0g7XG4gICAgICB9IGVsc2UgaWYgKHAxWzBdIDwgMCAmJiBwMVsxXSA+IDApIHtcbiAgICAgICAgb21pdFNpZGVzID0gT01JVF9TSURFU19GT1JfTElORV9TTEFTSDtcbiAgICAgIH0gZWxzZSBpZiAocDFbMF0gPCAwICYmIHAxWzFdIDwgMCkge1xuICAgICAgICBvbWl0U2lkZXMgPSBPTUlUX1NJREVTX0ZPUl9MSU5FX0JBQ0tTTEFTSDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgIG9taXRTaWRlcyA9IE9NSVRfU0lERVNfRk9SX1RFWFRfRUxFTUVOVDtcbiAgfVxuXG4gIHJldHVybiBnZXRUcmFuc2Zvcm1IYW5kbGVzRnJvbUNvb3JkcyhnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCksIGVsZW1lbnQuYW5nbGUsIHpvb20sIHBvaW50ZXJUeXBlLCBvbWl0U2lkZXMpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///../../element/transformHandles.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../element/transformHandles.ts?");
|
|
2789
2789
|
|
|
2790
2790
|
/***/ }),
|
|
2791
2791
|
|
|
@@ -2983,7 +2983,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
2983
2983
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2984
2984
|
|
|
2985
2985
|
"use strict";
|
|
2986
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \\\"../../constants.ts\\\");\\n\\r\\nif (\\\"development\\\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\\r\\n /* eslint-disable */\\r\\n /* global __webpack_public_path__:writable */\\r\\n __webpack_require__.p = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\\\"@zsviczian/excalidraw\\\"}@${\\\"0.12.0-obsidian-
|
|
2986
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \\\"../../constants.ts\\\");\\n\\r\\nif (\\\"development\\\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\\r\\n /* eslint-disable */\\r\\n /* global __webpack_public_path__:writable */\\r\\n __webpack_require__.p = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\\\"@zsviczian/excalidraw\\\"}@${\\\"0.12.0-obsidian-4\\\"}/dist/`;\\r\\n}\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBRXRDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUVwQiw2Q0FBNkM7SUFDN0MscUJBQXVCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixJQUFJLHFCQUFxQix1QkFBb0IsSUFBSSxtQkFBdUIsUUFBUSxDQUFDO0NBQ3hJIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcHVibGljUGF0aC5qcz8xMTVkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVOViB9IGZyb20gXCIuLi8uLi9jb25zdGFudHNcIjtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuVEVTVCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG4gIC8qIGdsb2JhbCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXzp3cml0YWJsZSAqL1xuICBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyA9IHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHwgYGh0dHBzOi8vdW5wa2cuY29tLyR7cHJvY2Vzcy5lbnYuUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuUEtHX1ZFUlNJT059L2Rpc3QvYDtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///./publicPath.js\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/./publicPath.js?");
|
|
2987
2987
|
|
|
2988
2988
|
/***/ }),
|
|
2989
2989
|
|
|
@@ -3038,7 +3038,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
3038
3038
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3039
3039
|
|
|
3040
3040
|
"use strict";
|
|
3041
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"_renderScene\\\": () => (/* binding */ _renderScene),\\n/* harmony export */ \\\"renderScene\\\": () => (/* binding */ renderScene),\\n/* harmony export */ \\\"renderSceneToSvg\\\": () => (/* binding */ renderSceneToSvg)\\n/* harmony export */ });\\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! open-color */ \\\"../../../node_modules/open-color/open-color.json\\\");\\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _roundRect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./roundRect */ \\\"../../renderer/roundRect.ts\\\");\\n/* harmony import */ var _scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/scrollbars */ \\\"../../scene/scrollbars.ts\\\");\\n/* harmony import */ var _scene_selection__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../scene/selection */ \\\"../../scene/selection.ts\\\");\\n/* harmony import */ var _renderElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./renderElement */ \\\"../../renderer/renderElement.ts\\\");\\n/* harmony import */ var _clients__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../clients */ \\\"../../clients.ts\\\");\\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/linearElementEditor */ \\\"../../element/linearElementEditor.ts\\\");\\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../groups */ \\\"../../groups.ts\\\");\\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../element/collision */ \\\"../../element/collision.ts\\\");\\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../element/binding */ \\\"../../element/binding.ts\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../types */ \\\"../../types.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var _element_Hyperlink__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../element/Hyperlink */ \\\"../../element/Hyperlink.tsx\\\");\\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../element/typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst hasEmojiSupport = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.supportsEmoji)();\\r\\nconst strokeRectWithRotation = function (context, x, y, width, height, cx, cy, angle) {\\r\\n let fill = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : false;\\r\\n context.save();\\r\\n context.translate(cx, cy);\\r\\n context.rotate(angle);\\r\\n if (fill) {\\r\\n context.fillRect(x - cx, y - cy, width, height);\\r\\n }\\r\\n context.strokeRect(x - cx, y - cy, width, height);\\r\\n context.restore();\\r\\n};\\r\\nconst strokeDiamondWithRotation = function (context, width, height, cx, cy, angle) {\\r\\n context.save();\\r\\n context.translate(cx, cy);\\r\\n context.rotate(angle);\\r\\n context.beginPath();\\r\\n context.moveTo(0, height / 2);\\r\\n context.lineTo(width / 2, 0);\\r\\n context.lineTo(0, -height / 2);\\r\\n context.lineTo(-width / 2, 0);\\r\\n context.closePath();\\r\\n context.stroke();\\r\\n context.restore();\\r\\n};\\r\\nconst strokeEllipseWithRotation = function (context, width, height, cx, cy, angle) {\\r\\n context.beginPath();\\r\\n context.ellipse(cx, cy, width / 2, height / 2, angle, 0, Math.PI * 2);\\r\\n context.stroke();\\r\\n};\\r\\nconst fillCircle = function (context, cx, cy, radius) {\\r\\n let stroke = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\\r\\n context.beginPath();\\r\\n context.arc(cx, cy, radius, 0, Math.PI * 2);\\r\\n context.fill();\\r\\n if (stroke) {\\r\\n context.stroke();\\r\\n }\\r\\n};\\r\\nconst strokeGrid = function (context, gridSize, offsetX, offsetY, width, height) {\\r\\n context.save();\\r\\n context.strokeStyle = \\\"rgba(0,0,0,0.1)\\\";\\r\\n context.beginPath();\\r\\n for (let x = offsetX; x < offsetX + width + gridSize * 2; x += gridSize) {\\r\\n context.moveTo(x, offsetY - gridSize);\\r\\n context.lineTo(x, offsetY + height + gridSize * 2);\\r\\n }\\r\\n for (let y = offsetY; y < offsetY + height + gridSize * 2; y += gridSize) {\\r\\n context.moveTo(offsetX - gridSize, y);\\r\\n context.lineTo(offsetX + width + gridSize * 2, y);\\r\\n }\\r\\n context.stroke();\\r\\n context.restore();\\r\\n};\\r\\nconst renderLinearPointHandles = function (context, appState, renderConfig, element) {\\r\\n context.save();\\r\\n context.translate(renderConfig.scrollX, renderConfig.scrollY);\\r\\n context.lineWidth = 1 / renderConfig.zoom.value;\\r\\n _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getPointsGlobalCoordinates(element).forEach(function (point, idx) {\\r\\n var _a, _b;\\r\\n context.strokeStyle = \\\"#5e5ad8\\\";\\r\\n context.setLineDash([]);\\r\\n context.fillStyle = ((_b = (_a = appState.editingLinearElement) === null || _a === void 0 ? void 0 : _a.selectedPointsIndices) === null || _b === void 0 ? void 0 : _b.includes(idx)) ? \\\"rgba(134, 131, 226, 0.9)\\\" : \\\"rgba(255, 255, 255, 0.9)\\\";\\r\\n const { POINT_HANDLE_SIZE } = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor;\\r\\n const radius = appState.editingLinearElement ? POINT_HANDLE_SIZE : POINT_HANDLE_SIZE / 2;\\r\\n fillCircle(context, point[0], point[1], radius / renderConfig.zoom.value);\\r\\n });\\r\\n context.restore();\\r\\n};\\r\\nconst renderLinearElementPointHighlight = function (context, appState, renderConfig) {\\r\\n var _a, _b;\\r\\n const { elementId, hoverPointIndex } = appState.selectedLinearElement;\\r\\n if ((_b = (_a = appState.editingLinearElement) === null || _a === void 0 ? void 0 : _a.selectedPointsIndices) === null || _b === void 0 ? void 0 : _b.includes(hoverPointIndex)) {\\r\\n return;\\r\\n }\\r\\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getElement(elementId);\\r\\n if (!element) {\\r\\n return;\\r\\n }\\r\\n const [x, y] = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getPointAtIndexGlobalCoordinates(element, hoverPointIndex);\\r\\n context.save();\\r\\n context.translate(renderConfig.scrollX, renderConfig.scrollY);\\r\\n context.fillStyle = \\\"rgba(105, 101, 219, 0.4)\\\";\\r\\n fillCircle(context, x, y, _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.POINT_HANDLE_SIZE / renderConfig.zoom.value, false);\\r\\n context.restore();\\r\\n};\\r\\nconst _renderScene = function (elements, appState, selectionElement, scale, rc, canvas, renderConfig // extra options passed to the renderer\\r\\n) {\\r\\n var _a;\\r\\n if (canvas === null) {\\r\\n return {\\r\\n atLeastOneVisibleElement: false\\r\\n };\\r\\n }\\r\\n const { renderScrollbars = true, renderSelection = true, renderGrid = true, isExporting } = renderConfig;\\r\\n const context = canvas.getContext(\\\"2d\\\");\\r\\n context.setTransform(1, 0, 0, 1, 0, 0);\\r\\n context.save();\\r\\n context.scale(scale, scale); // When doing calculations based on canvas width we should used normalized one\\r\\n const normalizedCanvasWidth = canvas.width / scale;\\r\\n const normalizedCanvasHeight = canvas.height / scale;\\r\\n if (isExporting && renderConfig.theme === \\\"dark\\\") {\\r\\n context.filter = _constants__WEBPACK_IMPORTED_MODULE_13__.THEME_FILTER;\\r\\n } // Paint background\\r\\n if (typeof renderConfig.viewBackgroundColor === \\\"string\\\") {\\r\\n const hasTransparence = renderConfig.viewBackgroundColor === \\\"transparent\\\" || renderConfig.viewBackgroundColor.length === 5 || // #RGBA\\r\\n renderConfig.viewBackgroundColor.length === 9 || // #RRGGBBA\\r\\n /(hsla|rgba)\\\\(/.test(renderConfig.viewBackgroundColor);\\r\\n if (hasTransparence) {\\r\\n context.clearRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\\r\\n }\\r\\n context.save();\\r\\n context.fillStyle = renderConfig.viewBackgroundColor;\\r\\n context.fillRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\\r\\n context.restore();\\r\\n }\\r\\n else {\\r\\n context.clearRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\\r\\n } // Apply zoom\\r\\n context.save();\\r\\n context.scale(renderConfig.zoom.value, renderConfig.zoom.value); // Grid\\r\\n if (renderGrid && appState.gridSize) {\\r\\n strokeGrid(context, appState.gridSize, -Math.ceil(renderConfig.zoom.value / appState.gridSize) * appState.gridSize + renderConfig.scrollX % appState.gridSize, -Math.ceil(renderConfig.zoom.value / appState.gridSize) * appState.gridSize + renderConfig.scrollY % appState.gridSize, normalizedCanvasWidth / renderConfig.zoom.value, normalizedCanvasHeight / renderConfig.zoom.value);\\r\\n } // Paint visible elements\\r\\n const visibleElements = elements.filter(function (element) {\\r\\n return isVisibleElement(element, normalizedCanvasWidth, normalizedCanvasHeight, {\\r\\n zoom: renderConfig.zoom,\\r\\n offsetLeft: appState.offsetLeft,\\r\\n offsetTop: appState.offsetTop,\\r\\n scrollX: renderConfig.scrollX,\\r\\n scrollY: renderConfig.scrollY\\r\\n });\\r\\n });\\r\\n visibleElements.forEach(function (element) {\\r\\n try {\\r\\n (0,_renderElement__WEBPACK_IMPORTED_MODULE_5__.renderElement)(element, rc, context, renderConfig);\\r\\n if (!isExporting) {\\r\\n renderLinkIcon(element, context, appState);\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n });\\r\\n if (appState.editingLinearElement) {\\r\\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getElement(appState.editingLinearElement.elementId);\\r\\n if (element) {\\r\\n renderLinearPointHandles(context, appState, renderConfig, element);\\r\\n }\\r\\n } // Paint selection element\\r\\n if (selectionElement) {\\r\\n try {\\r\\n (0,_renderElement__WEBPACK_IMPORTED_MODULE_5__.renderElement)(selectionElement, rc, context, renderConfig);\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n }\\r\\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_10__.isBindingEnabled)(appState)) {\\r\\n appState.suggestedBindings.filter(function (binding) {\\r\\n return binding != null;\\r\\n }).forEach(function (suggestedBinding) {\\r\\n renderBindingHighlight(context, renderConfig, suggestedBinding);\\r\\n });\\r\\n }\\r\\n if (appState.selectedLinearElement && appState.selectedLinearElement.hoverPointIndex !== -1) {\\r\\n renderLinearElementPointHighlight(context, appState, renderConfig);\\r\\n } // Paint selected elements\\r\\n if (renderSelection && !appState.multiElement && !appState.editingLinearElement) {\\r\\n const locallySelectedElements = (0,_scene_selection__WEBPACK_IMPORTED_MODULE_4__.getSelectedElements)(elements, appState);\\r\\n const locallySelectedIds = locallySelectedElements.map(function (element) {\\r\\n return element.id;\\r\\n });\\r\\n const isSingleLinearElementSelected = locallySelectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_15__.isLinearElement)(locallySelectedElements[0]); // render selected linear element points\\r\\n if (isSingleLinearElementSelected && ((_a = appState.selectedLinearElement) === null || _a === void 0 ? void 0 : _a.elementId) === locallySelectedElements[0].id && !locallySelectedElements[0].locked) {\\r\\n renderLinearPointHandles(context, appState, renderConfig, locallySelectedElements[0]); // render bounding box\\r\\n // (unless dragging a single linear element)\\r\\n }\\r\\n else if (!appState.draggingElement || !isSingleLinearElementSelected) {\\r\\n const selections = elements.reduce(function (acc, element) {\\r\\n const selectionColors = []; // local user\\r\\n if (locallySelectedIds.includes(element.id) && !(0,_groups__WEBPACK_IMPORTED_MODULE_8__.isSelectedViaGroup)(appState, element)) {\\r\\n selectionColors.push(open_color__WEBPACK_IMPORTED_MODULE_0__.black);\\r\\n } // remote users\\r\\n if (renderConfig.remoteSelectedElementIds[element.id]) {\\r\\n selectionColors.push(...renderConfig.remoteSelectedElementIds[element.id].map(function (socketId) {\\r\\n const { background } = (0,_clients__WEBPACK_IMPORTED_MODULE_6__.getClientColors)(socketId, appState);\\r\\n return background;\\r\\n }));\\r\\n }\\r\\n if (selectionColors.length) {\\r\\n const [elementX1, elementY1, elementX2, elementY2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\\r\\n acc.push({\\r\\n angle: element.angle,\\r\\n elementX1,\\r\\n elementY1,\\r\\n elementX2,\\r\\n elementY2,\\r\\n selectionColors\\r\\n });\\r\\n }\\r\\n return acc;\\r\\n }, []);\\r\\n const addSelectionForGroupId = function (groupId) {\\r\\n const groupElements = (0,_groups__WEBPACK_IMPORTED_MODULE_8__.getElementsInGroup)(elements, groupId);\\r\\n const [elementX1, elementY1, elementX2, elementY2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(groupElements);\\r\\n selections.push({\\r\\n angle: 0,\\r\\n elementX1,\\r\\n elementX2,\\r\\n elementY1,\\r\\n elementY2,\\r\\n selectionColors: [open_color__WEBPACK_IMPORTED_MODULE_0__.black]\\r\\n });\\r\\n };\\r\\n for (const groupId of (0,_groups__WEBPACK_IMPORTED_MODULE_8__.getSelectedGroupIds)(appState)) {\\r\\n // TODO: support multiplayer selected group IDs\\r\\n addSelectionForGroupId(groupId);\\r\\n }\\r\\n if (appState.editingGroupId) {\\r\\n addSelectionForGroupId(appState.editingGroupId);\\r\\n }\\r\\n selections.forEach(function (selection) {\\r\\n return renderSelectionBorder(context, renderConfig, selection);\\r\\n });\\r\\n } // Paint resize transformHandles\\r\\n context.save();\\r\\n context.translate(renderConfig.scrollX, renderConfig.scrollY);\\r\\n if (locallySelectedElements.length === 1) {\\r\\n context.fillStyle = open_color__WEBPACK_IMPORTED_MODULE_0__.white;\\r\\n const transformHandles = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getTransformHandles)(locallySelectedElements[0], renderConfig.zoom, \\\"mouse\\\" // when we render we don't know which pointer type so use mouse\\r\\n );\\r\\n if (!appState.viewModeEnabled) {\\r\\n renderTransformHandles(context, renderConfig, transformHandles, locallySelectedElements[0].angle);\\r\\n }\\r\\n }\\r\\n else if (locallySelectedElements.length > 1 && !appState.isRotating) {\\r\\n const dashedLinePadding = 4 / renderConfig.zoom.value;\\r\\n context.fillStyle = open_color__WEBPACK_IMPORTED_MODULE_0__.white;\\r\\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(locallySelectedElements);\\r\\n const initialLineDash = context.getLineDash();\\r\\n context.setLineDash([2 / renderConfig.zoom.value]);\\r\\n const lineWidth = context.lineWidth;\\r\\n context.lineWidth = 1 / renderConfig.zoom.value;\\r\\n strokeRectWithRotation(context, x1 - dashedLinePadding, y1 - dashedLinePadding, x2 - x1 + dashedLinePadding * 2, y2 - y1 + dashedLinePadding * 2, (x1 + x2) / 2, (y1 + y2) / 2, 0);\\r\\n context.lineWidth = lineWidth;\\r\\n context.setLineDash(initialLineDash);\\r\\n const transformHandles = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getTransformHandlesFromCoords)([x1, y1, x2, y2], 0, renderConfig.zoom, \\\"mouse\\\", _element__WEBPACK_IMPORTED_MODULE_1__.OMIT_SIDES_FOR_MULTIPLE_ELEMENTS);\\r\\n if (locallySelectedElements.some(function (element) {\\r\\n return !element.locked;\\r\\n })) {\\r\\n renderTransformHandles(context, renderConfig, transformHandles, 0);\\r\\n }\\r\\n }\\r\\n context.restore();\\r\\n } // Reset zoom\\r\\n context.restore(); // Paint remote pointers\\r\\n for (const clientId in renderConfig.remotePointerViewportCoords) {\\r\\n let { x, y } = renderConfig.remotePointerViewportCoords[clientId];\\r\\n x -= appState.offsetLeft;\\r\\n y -= appState.offsetTop;\\r\\n const width = 9;\\r\\n const height = 14;\\r\\n const isOutOfBounds = x < 0 || x > normalizedCanvasWidth - width || y < 0 || y > normalizedCanvasHeight - height;\\r\\n x = Math.max(x, 0);\\r\\n x = Math.min(x, normalizedCanvasWidth - width);\\r\\n y = Math.max(y, 0);\\r\\n y = Math.min(y, normalizedCanvasHeight - height);\\r\\n const { background, stroke } = (0,_clients__WEBPACK_IMPORTED_MODULE_6__.getClientColors)(clientId, appState);\\r\\n context.save();\\r\\n context.strokeStyle = stroke;\\r\\n context.fillStyle = background;\\r\\n const userState = renderConfig.remotePointerUserStates[clientId];\\r\\n if (isOutOfBounds || userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.AWAY) {\\r\\n context.globalAlpha = 0.48;\\r\\n }\\r\\n if (renderConfig.remotePointerButton && renderConfig.remotePointerButton[clientId] === \\\"down\\\") {\\r\\n context.beginPath();\\r\\n context.arc(x, y, 15, 0, 2 * Math.PI, false);\\r\\n context.lineWidth = 3;\\r\\n context.strokeStyle = \\\"#ffffff88\\\";\\r\\n context.stroke();\\r\\n context.closePath();\\r\\n context.beginPath();\\r\\n context.arc(x, y, 15, 0, 2 * Math.PI, false);\\r\\n context.lineWidth = 1;\\r\\n context.strokeStyle = stroke;\\r\\n context.stroke();\\r\\n context.closePath();\\r\\n }\\r\\n context.beginPath();\\r\\n context.moveTo(x, y);\\r\\n context.lineTo(x + 1, y + 14);\\r\\n context.lineTo(x + 4, y + 9);\\r\\n context.lineTo(x + 9, y + 10);\\r\\n context.lineTo(x, y);\\r\\n context.fill();\\r\\n context.stroke();\\r\\n const username = renderConfig.remotePointerUsernames[clientId];\\r\\n let idleState = \\\"\\\";\\r\\n if (userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.AWAY) {\\r\\n idleState = hasEmojiSupport ? \\\"⚫️\\\" : ` (${_types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.AWAY})`;\\r\\n }\\r\\n else if (userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.IDLE) {\\r\\n idleState = hasEmojiSupport ? \\\"💤\\\" : ` (${_types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.IDLE})`;\\r\\n }\\r\\n else if (userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.ACTIVE) {\\r\\n idleState = hasEmojiSupport ? \\\"🟢\\\" : \\\"\\\";\\r\\n }\\r\\n const usernameAndIdleState = `${username ? `${username} ` : \\\"\\\"}${idleState}`;\\r\\n if (!isOutOfBounds && usernameAndIdleState) {\\r\\n const offsetX = x + width;\\r\\n const offsetY = y + height;\\r\\n const paddingHorizontal = 4;\\r\\n const paddingVertical = 4;\\r\\n const measure = context.measureText(usernameAndIdleState);\\r\\n const measureHeight = measure.actualBoundingBoxDescent + measure.actualBoundingBoxAscent; // Border\\r\\n context.fillStyle = stroke;\\r\\n context.fillRect(offsetX - 1, offsetY - 1, measure.width + 2 * paddingHorizontal + 2, measureHeight + 2 * paddingVertical + 2); // Background\\r\\n context.fillStyle = background;\\r\\n context.fillRect(offsetX, offsetY, measure.width + 2 * paddingHorizontal, measureHeight + 2 * paddingVertical);\\r\\n context.fillStyle = open_color__WEBPACK_IMPORTED_MODULE_0__.white;\\r\\n context.fillText(usernameAndIdleState, offsetX + paddingHorizontal, offsetY + paddingVertical + measure.actualBoundingBoxAscent);\\r\\n }\\r\\n context.restore();\\r\\n context.closePath();\\r\\n } // Paint scrollbars\\r\\n let scrollBars;\\r\\n if (renderScrollbars) {\\r\\n scrollBars = (0,_scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__.getScrollBars)(elements, normalizedCanvasWidth, normalizedCanvasHeight, renderConfig);\\r\\n context.save();\\r\\n context.fillStyle = _scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__.SCROLLBAR_COLOR;\\r\\n context.strokeStyle = \\\"rgba(255,255,255,0.8)\\\";\\r\\n [scrollBars.horizontal, scrollBars.vertical].forEach(function (scrollBar) {\\r\\n if (scrollBar) {\\r\\n (0,_roundRect__WEBPACK_IMPORTED_MODULE_2__.roundRect)(context, scrollBar.x, scrollBar.y, scrollBar.width, scrollBar.height, _scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__.SCROLLBAR_WIDTH / 2);\\r\\n }\\r\\n });\\r\\n context.restore();\\r\\n }\\r\\n context.restore();\\r\\n return {\\r\\n atLeastOneVisibleElement: visibleElements.length > 0,\\r\\n scrollBars\\r\\n };\\r\\n};\\r\\nconst renderSceneThrottled = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.throttleRAF)(function (elements, appState, selectionElement, scale, rc, canvas, renderConfig, callback) {\\r\\n const ret = _renderScene(elements, appState, selectionElement, scale, rc, canvas, renderConfig);\\r\\n callback === null || callback === void 0 ? void 0 : callback(ret);\\r\\n}, {\\r\\n trailing: true\\r\\n});\\r\\n/** renderScene throttled to animation framerate */\\r\\nconst renderScene = function (elements, appState, selectionElement, scale, rc, canvas, renderConfig, callback, throttle) {\\r\\n if (throttle) {\\r\\n renderSceneThrottled(elements, appState, selectionElement, scale, rc, canvas, renderConfig, callback);\\r\\n return undefined;\\r\\n }\\r\\n const ret = _renderScene(elements, appState, selectionElement, scale, rc, canvas, renderConfig);\\r\\n callback === null || callback === void 0 ? void 0 : callback(ret);\\r\\n return ret;\\r\\n};\\r\\nconst renderTransformHandles = function (context, renderConfig, transformHandles, angle) {\\r\\n Object.keys(transformHandles).forEach(function (key) {\\r\\n const transformHandle = transformHandles[key];\\r\\n if (transformHandle !== undefined) {\\r\\n context.save();\\r\\n context.lineWidth = 1 / renderConfig.zoom.value;\\r\\n if (key === \\\"rotation\\\") {\\r\\n fillCircle(context, transformHandle[0] + transformHandle[2] / 2, transformHandle[1] + transformHandle[3] / 2, transformHandle[2] / 2);\\r\\n }\\r\\n else {\\r\\n strokeRectWithRotation(context, transformHandle[0], transformHandle[1], transformHandle[2], transformHandle[3], transformHandle[0] + transformHandle[2] / 2, transformHandle[1] + transformHandle[3] / 2, angle, true // fill before stroke\\r\\n );\\r\\n }\\r\\n context.restore();\\r\\n }\\r\\n });\\r\\n};\\r\\nconst renderSelectionBorder = function (context, renderConfig, elementProperties) {\\r\\n const { angle, elementX1, elementY1, elementX2, elementY2, selectionColors } = elementProperties;\\r\\n const elementWidth = elementX2 - elementX1;\\r\\n const elementHeight = elementY2 - elementY1;\\r\\n const dashedLinePadding = 4 / renderConfig.zoom.value;\\r\\n const dashWidth = 8 / renderConfig.zoom.value;\\r\\n const spaceWidth = 4 / renderConfig.zoom.value;\\r\\n context.save();\\r\\n context.translate(renderConfig.scrollX, renderConfig.scrollY);\\r\\n context.lineWidth = 1 / renderConfig.zoom.value;\\r\\n const count = selectionColors.length;\\r\\n for (let index = 0; index < count; ++index) {\\r\\n context.strokeStyle = selectionColors[index];\\r\\n context.setLineDash([dashWidth, spaceWidth + (dashWidth + spaceWidth) * (count - 1)]);\\r\\n context.lineDashOffset = (dashWidth + spaceWidth) * index;\\r\\n strokeRectWithRotation(context, elementX1 - dashedLinePadding, elementY1 - dashedLinePadding, elementWidth + dashedLinePadding * 2, elementHeight + dashedLinePadding * 2, elementX1 + elementWidth / 2, elementY1 + elementHeight / 2, angle);\\r\\n }\\r\\n context.restore();\\r\\n};\\r\\nconst renderBindingHighlight = function (context, renderConfig, suggestedBinding) {\\r\\n const renderHighlight = Array.isArray(suggestedBinding) ? renderBindingHighlightForSuggestedPointBinding : renderBindingHighlightForBindableElement;\\r\\n context.save();\\r\\n context.translate(renderConfig.scrollX, renderConfig.scrollY);\\r\\n renderHighlight(context, suggestedBinding);\\r\\n context.restore();\\r\\n};\\r\\nconst renderBindingHighlightForBindableElement = function (context, element) {\\r\\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\\r\\n const width = x2 - x1;\\r\\n const height = y2 - y1;\\r\\n const threshold = (0,_element_collision__WEBPACK_IMPORTED_MODULE_9__.maxBindingGap)(element, width, height); // So that we don't overlap the element itself\\r\\n const strokeOffset = 4;\\r\\n context.strokeStyle = \\\"rgba(0,0,0,.05)\\\";\\r\\n context.lineWidth = threshold - strokeOffset;\\r\\n const padding = strokeOffset / 2 + threshold / 2;\\r\\n switch (element.type) {\\r\\n case \\\"rectangle\\\":\\r\\n case \\\"text\\\":\\r\\n case \\\"image\\\":\\r\\n strokeRectWithRotation(context, x1 - padding, y1 - padding, width + padding * 2, height + padding * 2, x1 + width / 2, y1 + height / 2, element.angle);\\r\\n break;\\r\\n case \\\"diamond\\\":\\r\\n const side = Math.hypot(width, height);\\r\\n const wPadding = padding * side / height;\\r\\n const hPadding = padding * side / width;\\r\\n strokeDiamondWithRotation(context, width + wPadding * 2, height + hPadding * 2, x1 + width / 2, y1 + height / 2, element.angle);\\r\\n break;\\r\\n case \\\"ellipse\\\":\\r\\n strokeEllipseWithRotation(context, width + padding * 2, height + padding * 2, x1 + width / 2, y1 + height / 2, element.angle);\\r\\n break;\\r\\n }\\r\\n};\\r\\nconst renderBindingHighlightForSuggestedPointBinding = function (context, suggestedBinding) {\\r\\n const [element, startOrEnd, bindableElement] = suggestedBinding;\\r\\n const threshold = (0,_element_collision__WEBPACK_IMPORTED_MODULE_9__.maxBindingGap)(bindableElement, bindableElement.width, bindableElement.height);\\r\\n context.strokeStyle = \\\"rgba(0,0,0,0)\\\";\\r\\n context.fillStyle = \\\"rgba(0,0,0,.05)\\\";\\r\\n const pointIndices = startOrEnd === \\\"both\\\" ? [0, -1] : startOrEnd === \\\"start\\\" ? [0] : [-1];\\r\\n pointIndices.forEach(function (index) {\\r\\n const [x, y] = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getPointAtIndexGlobalCoordinates(element, index);\\r\\n fillCircle(context, x, y, threshold);\\r\\n });\\r\\n};\\r\\nlet linkCanvasCache;\\r\\nconst renderLinkIcon = function (element, context, appState) {\\r\\n if (element.link && !appState.selectedElementIds[element.id]) {\\r\\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\\r\\n const [x, y, width, height] = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_14__.getLinkHandleFromCoords)([x1, y1, x2, y2], element.angle, appState);\\r\\n const centerX = x + width / 2;\\r\\n const centerY = y + height / 2;\\r\\n context.save();\\r\\n context.translate(appState.scrollX + centerX, appState.scrollY + centerY);\\r\\n context.rotate(element.angle);\\r\\n if (!linkCanvasCache || linkCanvasCache.zoom !== appState.zoom.value) {\\r\\n linkCanvasCache = document.createElement(\\\"canvas\\\");\\r\\n linkCanvasCache.zoom = appState.zoom.value;\\r\\n linkCanvasCache.width = width * window.devicePixelRatio * appState.zoom.value;\\r\\n linkCanvasCache.height = height * window.devicePixelRatio * appState.zoom.value;\\r\\n const linkCanvasCacheContext = linkCanvasCache.getContext(\\\"2d\\\");\\r\\n linkCanvasCacheContext.scale(window.devicePixelRatio * appState.zoom.value, window.devicePixelRatio * appState.zoom.value);\\r\\n /*linkCanvasCacheContext.fillStyle = \\\"#fff\\\"; //zsviczian\\r\\n linkCanvasCacheContext.fillRect(0, 0, width, height);*/\\r\\n //zsviczian\\r\\n //linkCanvasCacheContext.globalAlpha = appState.linkOpacity; //zsviczian\\r\\n linkCanvasCacheContext.drawImage(_element_Hyperlink__WEBPACK_IMPORTED_MODULE_14__.EXTERNAL_LINK_IMG, 0, 0, width, height);\\r\\n linkCanvasCacheContext.restore();\\r\\n context.globalAlpha = appState.linkOpacity; //zsviczian\\r\\n context.drawImage(linkCanvasCache, x - centerX, y - centerY, width, height);\\r\\n }\\r\\n else {\\r\\n context.globalAlpha = appState.linkOpacity; //zsviczian\\r\\n context.drawImage(linkCanvasCache, x - centerX, y - centerY, width, height);\\r\\n }\\r\\n context.restore();\\r\\n }\\r\\n};\\r\\nconst isVisibleElement = function (element, canvasWidth, canvasHeight, viewTransformations) {\\r\\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getElementBounds)(element); // scene coordinates\\r\\n const topLeftSceneCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.viewportCoordsToSceneCoords)({\\r\\n clientX: viewTransformations.offsetLeft,\\r\\n clientY: viewTransformations.offsetTop\\r\\n }, viewTransformations);\\r\\n const bottomRightSceneCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.viewportCoordsToSceneCoords)({\\r\\n clientX: viewTransformations.offsetLeft + canvasWidth,\\r\\n clientY: viewTransformations.offsetTop + canvasHeight\\r\\n }, viewTransformations);\\r\\n return topLeftSceneCoords.x <= x2 && topLeftSceneCoords.y <= y2 && bottomRightSceneCoords.x >= x1 && bottomRightSceneCoords.y >= y1;\\r\\n}; // This should be only called for exporting purposes\\r\\nconst renderSceneToSvg = function (elements, rsvg, svgRoot, files) {\\r\\n let { offsetX = 0, offsetY = 0, exportWithDarkMode = false } = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};\\r\\n if (!svgRoot) {\\r\\n return;\\r\\n } // render elements\\r\\n elements.forEach(function (element) {\\r\\n if (!element.isDeleted) {\\r\\n try {\\r\\n (0,_renderElement__WEBPACK_IMPORTED_MODULE_5__.renderElementToSvg)(element, rsvg, svgRoot, files, element.x + offsetX, element.y + offsetY, exportWithDarkMode);\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n }\\r\\n });\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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T0FBTyxHQUFHLENBQUMsRUFDWCxrQkFBa0IsR0FBRyxLQUFLLEVBQzNCLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFM0UsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUNaLE9BQU87S0FDUixDQUFDLGtCQUFrQjtJQUdwQixRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsT0FBTztRQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUN0QixJQUFJO2dCQUNGLGtFQUFrQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2FBQ2pIO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtTQUNGO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vcmVuZGVyZXIvcmVuZGVyU2NlbmUudHM/ZTU5NSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb2MgZnJvbSBcIm9wZW4tY29sb3JcIjtcbmltcG9ydCB7IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcywgT01JVF9TSURFU19GT1JfTVVMVElQTEVfRUxFTUVOVFMsIGdldFRyYW5zZm9ybUhhbmRsZXNGcm9tQ29vcmRzLCBnZXRUcmFuc2Zvcm1IYW5kbGVzLCBnZXRFbGVtZW50Qm91bmRzLCBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgcm91bmRSZWN0IH0gZnJvbSBcIi4vcm91bmRSZWN0XCI7XG5pbXBvcnQgeyBnZXRTY3JvbGxCYXJzLCBTQ1JPTExCQVJfQ09MT1IsIFNDUk9MTEJBUl9XSURUSCB9IGZyb20gXCIuLi9zY2VuZS9zY3JvbGxiYXJzXCI7XG5pbXBvcnQgeyBnZXRTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSBcIi4uL3NjZW5lL3NlbGVjdGlvblwiO1xuaW1wb3J0IHsgcmVuZGVyRWxlbWVudCwgcmVuZGVyRWxlbWVudFRvU3ZnIH0gZnJvbSBcIi4vcmVuZGVyRWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0Q2xpZW50Q29sb3JzIH0gZnJvbSBcIi4uL2NsaWVudHNcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBpc1NlbGVjdGVkVmlhR3JvdXAsIGdldFNlbGVjdGVkR3JvdXBJZHMsIGdldEVsZW1lbnRzSW5Hcm91cCB9IGZyb20gXCIuLi9ncm91cHNcIjtcbmltcG9ydCB7IG1heEJpbmRpbmdHYXAgfSBmcm9tIFwiLi4vZWxlbWVudC9jb2xsaXNpb25cIjtcbmltcG9ydCB7IGlzQmluZGluZ0VuYWJsZWQgfSBmcm9tIFwiLi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMsIHN1cHBvcnRzRW1vamksIHRocm90dGxlUkFGIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBVc2VySWRsZVN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBUSEVNRV9GSUxURVIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBFWFRFUk5BTF9MSU5LX0lNRywgZ2V0TGlua0hhbmRsZUZyb21Db29yZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9IeXBlcmxpbmtcIjtcbmltcG9ydCB7IGlzTGluZWFyRWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmNvbnN0IGhhc0Vtb2ppU3VwcG9ydCA9IHN1cHBvcnRzRW1vamkoKTtcblxuY29uc3Qgc3Ryb2tlUmVjdFdpdGhSb3RhdGlvbiA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjeCwgY3ksIGFuZ2xlKSB7XG4gIGxldCBmaWxsID0gYXJndW1lbnRzLmxlbmd0aCA+IDggJiYgYXJndW1lbnRzWzhdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbOF0gOiBmYWxzZTtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKGN4LCBjeSk7XG4gIGNvbnRleHQucm90YXRlKGFuZ2xlKTtcblxuICBpZiAoZmlsbCkge1xuICAgIGNvbnRleHQuZmlsbFJlY3QoeCAtIGN4LCB5IC0gY3ksIHdpZHRoLCBoZWlnaHQpO1xuICB9XG5cbiAgY29udGV4dC5zdHJva2VSZWN0KHggLSBjeCwgeSAtIGN5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgY29udGV4dC5yZXN0b3JlKCk7XG59O1xuXG5jb25zdCBzdHJva2VEaWFtb25kV2l0aFJvdGF0aW9uID0gZnVuY3Rpb24gKGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGN4LCBjeSwgYW5nbGUpIHtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKGN4LCBjeSk7XG4gIGNvbnRleHQucm90YXRlKGFuZ2xlKTtcbiAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY29udGV4dC5tb3ZlVG8oMCwgaGVpZ2h0IC8gMik7XG4gIGNvbnRleHQubGluZVRvKHdpZHRoIC8gMiwgMCk7XG4gIGNvbnRleHQubGluZVRvKDAsIC1oZWlnaHQgLyAyKTtcbiAgY29udGV4dC5saW5lVG8oLXdpZHRoIC8gMiwgMCk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIGNvbnRleHQuc3Ryb2tlKCk7XG4gIGNvbnRleHQucmVzdG9yZSgpO1xufTtcblxuY29uc3Qgc3Ryb2tlRWxsaXBzZVdpdGhSb3RhdGlvbiA9IGZ1bmN0aW9uIChjb250ZXh0LCB3aWR0aCwgaGVpZ2h0LCBjeCwgY3ksIGFuZ2xlKSB7XG4gIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIGNvbnRleHQuZWxsaXBzZShjeCwgY3ksIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgYW5nbGUsIDAsIE1hdGguUEkgKiAyKTtcbiAgY29udGV4dC5zdHJva2UoKTtcbn07XG5cbmNvbnN0IGZpbGxDaXJjbGUgPSBmdW5jdGlvbiAoY29udGV4dCwgY3gsIGN5LCByYWRpdXMpIHtcbiAgbGV0IHN0cm9rZSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY29udGV4dC5hcmMoY3gsIGN5LCByYWRpdXMsIDAsIE1hdGguUEkgKiAyKTtcbiAgY29udGV4dC5maWxsKCk7XG5cbiAgaWYgKHN0cm9rZSkge1xuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gIH1cbn07XG5cbmNvbnN0IHN0cm9rZUdyaWQgPSBmdW5jdGlvbiAoY29udGV4dCwgZ3JpZFNpemUsIG9mZnNldFgsIG9mZnNldFksIHdpZHRoLCBoZWlnaHQpIHtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYmEoMCwwLDAsMC4xKVwiO1xuICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuXG4gIGZvciAobGV0IHggPSBvZmZzZXRYOyB4IDwgb2Zmc2V0WCArIHdpZHRoICsgZ3JpZFNpemUgKiAyOyB4ICs9IGdyaWRTaXplKSB7XG4gICAgY29udGV4dC5tb3ZlVG8oeCwgb2Zmc2V0WSAtIGdyaWRTaXplKTtcbiAgICBjb250ZXh0LmxpbmVUbyh4LCBvZmZzZXRZICsgaGVpZ2h0ICsgZ3JpZFNpemUgKiAyKTtcbiAgfVxuXG4gIGZvciAobGV0IHkgPSBvZmZzZXRZOyB5IDwgb2Zmc2V0WSArIGhlaWdodCArIGdyaWRTaXplICogMjsgeSArPSBncmlkU2l6ZSkge1xuICAgIGNvbnRleHQubW92ZVRvKG9mZnNldFggLSBncmlkU2l6ZSwgeSk7XG4gICAgY29udGV4dC5saW5lVG8ob2Zmc2V0WCArIHdpZHRoICsgZ3JpZFNpemUgKiAyLCB5KTtcbiAgfVxuXG4gIGNvbnRleHQuc3Ryb2tlKCk7XG4gIGNvbnRleHQucmVzdG9yZSgpO1xufTtcblxuY29uc3QgcmVuZGVyTGluZWFyUG9pbnRIYW5kbGVzID0gZnVuY3Rpb24gKGNvbnRleHQsIGFwcFN0YXRlLCByZW5kZXJDb25maWcsIGVsZW1lbnQpIHtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKHJlbmRlckNvbmZpZy5zY3JvbGxYLCByZW5kZXJDb25maWcuc2Nyb2xsWSk7XG4gIGNvbnRleHQubGluZVdpZHRoID0gMSAvIHJlbmRlckNvbmZpZy56b29tLnZhbHVlO1xuICBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50c0dsb2JhbENvb3JkaW5hdGVzKGVsZW1lbnQpLmZvckVhY2goZnVuY3Rpb24gKHBvaW50LCBpZHgpIHtcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gXCIjNWU1YWQ4XCI7XG4gICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudD8uc2VsZWN0ZWRQb2ludHNJbmRpY2VzPy5pbmNsdWRlcyhpZHgpID8gXCJyZ2JhKDEzNCwgMTMxLCAyMjYsIDAuOSlcIiA6IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpXCI7XG4gICAgY29uc3Qge1xuICAgICAgUE9JTlRfSEFORExFX1NJWkVcbiAgICB9ID0gTGluZWFyRWxlbWVudEVkaXRvcjtcbiAgICBjb25zdCByYWRpdXMgPSBhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCA/IFBPSU5UX0hBTkRMRV9TSVpFIDogUE9JTlRfSEFORExFX1NJWkUgLyAyO1xuICAgIGZpbGxDaXJjbGUoY29udGV4dCwgcG9pbnRbMF0sIHBvaW50WzFdLCByYWRpdXMgLyByZW5kZXJDb25maWcuem9vbS52YWx1ZSk7XG4gIH0pO1xuICBjb250ZXh0LnJlc3RvcmUoKTtcbn07XG5cbmNvbnN0IHJlbmRlckxpbmVhckVsZW1lbnRQb2ludEhpZ2hsaWdodCA9IGZ1bmN0aW9uIChjb250ZXh0LCBhcHBTdGF0ZSwgcmVuZGVyQ29uZmlnKSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgaG92ZXJQb2ludEluZGV4XG4gIH0gPSBhcHBTdGF0ZS5zZWxlY3RlZExpbmVhckVsZW1lbnQ7XG5cbiAgaWYgKGFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50Py5zZWxlY3RlZFBvaW50c0luZGljZXM/LmluY2x1ZGVzKGhvdmVyUG9pbnRJbmRleCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBlbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFbGVtZW50KGVsZW1lbnRJZCk7XG5cbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgW3gsIHldID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEF0SW5kZXhHbG9iYWxDb29yZGluYXRlcyhlbGVtZW50LCBob3ZlclBvaW50SW5kZXgpO1xuICBjb250ZXh0LnNhdmUoKTtcbiAgY29udGV4dC50cmFuc2xhdGUocmVuZGVyQ29uZmlnLnNjcm9sbFgsIHJlbmRlckNvbmZpZy5zY3JvbGxZKTtcbiAgY29udGV4dC5maWxsU3R5bGUgPSBcInJnYmEoMTA1LCAxMDEsIDIxOSwgMC40KVwiO1xuICBmaWxsQ2lyY2xlKGNvbnRleHQsIHgsIHksIExpbmVhckVsZW1lbnRFZGl0b3IuUE9JTlRfSEFORExFX1NJWkUgLyByZW5kZXJDb25maWcuem9vbS52YWx1ZSwgZmFsc2UpO1xuICBjb250ZXh0LnJlc3RvcmUoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBfcmVuZGVyU2NlbmUgPSBmdW5jdGlvbiAoZWxlbWVudHMsIGFwcFN0YXRlLCBzZWxlY3Rpb25FbGVtZW50LCBzY2FsZSwgcmMsIGNhbnZhcywgcmVuZGVyQ29uZmlnIC8vIGV4dHJhIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSByZW5kZXJlclxuKSB7XG4gIGlmIChjYW52YXMgPT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXRMZWFzdE9uZVZpc2libGVFbGVtZW50OiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBjb25zdCB7XG4gICAgcmVuZGVyU2Nyb2xsYmFycyA9IHRydWUsXG4gICAgcmVuZGVyU2VsZWN0aW9uID0gdHJ1ZSxcbiAgICByZW5kZXJHcmlkID0gdHJ1ZSxcbiAgICBpc0V4cG9ydGluZ1xuICB9ID0gcmVuZGVyQ29uZmlnO1xuICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gIGNvbnRleHQuc2F2ZSgpO1xuICBjb250ZXh0LnNjYWxlKHNjYWxlLCBzY2FsZSk7IC8vIFdoZW4gZG9pbmcgY2FsY3VsYXRpb25zIGJhc2VkIG9uIGNhbnZhcyB3aWR0aCB3ZSBzaG91bGQgdXNlZCBub3JtYWxpemVkIG9uZVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRDYW52YXNXaWR0aCA9IGNhbnZhcy53aWR0aCAvIHNjYWxlO1xuICBjb25zdCBub3JtYWxpemVkQ2FudmFzSGVpZ2h0ID0gY2FudmFzLmhlaWdodCAvIHNjYWxlO1xuXG4gIGlmIChpc0V4cG9ydGluZyAmJiByZW5kZXJDb25maWcudGhlbWUgPT09IFwiZGFya1wiKSB7XG4gICAgY29udGV4dC5maWx0ZXIgPSBUSEVNRV9GSUxURVI7XG4gIH0gLy8gUGFpbnQgYmFja2dyb3VuZFxuXG5cbiAgaWYgKHR5cGVvZiByZW5kZXJDb25maWcudmlld0JhY2tncm91bmRDb2xvciA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGhhc1RyYW5zcGFyZW5jZSA9IHJlbmRlckNvbmZpZy52aWV3QmFja2dyb3VuZENvbG9yID09PSBcInRyYW5zcGFyZW50XCIgfHwgcmVuZGVyQ29uZmlnLnZpZXdCYWNrZ3JvdW5kQ29sb3IubGVuZ3RoID09PSA1IHx8IC8vICNSR0JBXG4gICAgcmVuZGVyQ29uZmlnLnZpZXdCYWNrZ3JvdW5kQ29sb3IubGVuZ3RoID09PSA5IHx8IC8vICNSUkdHQkJBXG4gICAgLyhoc2xhfHJnYmEpXFwoLy50ZXN0KHJlbmRlckNvbmZpZy52aWV3QmFja2dyb3VuZENvbG9yKTtcblxuICAgIGlmIChoYXNUcmFuc3BhcmVuY2UpIHtcbiAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIG5vcm1hbGl6ZWRDYW52YXNXaWR0aCwgbm9ybWFsaXplZENhbnZhc0hlaWdodCk7XG4gICAgfVxuXG4gICAgY29udGV4dC5zYXZlKCk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSByZW5kZXJDb25maWcudmlld0JhY2tncm91bmRDb2xvcjtcbiAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIG5vcm1hbGl6ZWRDYW52YXNXaWR0aCwgbm9ybWFsaXplZENhbnZhc0hlaWdodCk7XG4gICAgY29udGV4dC5yZXN0b3JlKCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgbm9ybWFsaXplZENhbnZhc1dpZHRoLCBub3JtYWxpemVkQ2FudmFzSGVpZ2h0KTtcbiAgfSAvLyBBcHBseSB6b29tXG5cblxuICBjb250ZXh0LnNhdmUoKTtcbiAgY29udGV4dC5zY2FsZShyZW5kZXJDb25maWcuem9vbS52YWx1ZSwgcmVuZGVyQ29uZmlnLnpvb20udmFsdWUpOyAvLyBHcmlkXG5cbiAgaWYgKHJlbmRlckdyaWQgJiYgYXBwU3RhdGUuZ3JpZFNpemUpIHtcbiAgICBzdHJva2VHcmlkKGNvbnRleHQsIGFwcFN0YXRlLmdyaWRTaXplLCAtTWF0aC5jZWlsKHJlbmRlckNvbmZpZy56b29tLnZhbHVlIC8gYXBwU3RhdGUuZ3JpZFNpemUpICogYXBwU3RhdGUuZ3JpZFNpemUgKyByZW5kZXJDb25maWcuc2Nyb2xsWCAlIGFwcFN0YXRlLmdyaWRTaXplLCAtTWF0aC5jZWlsKHJlbmRlckNvbmZpZy56b29tLnZhbHVlIC8gYXBwU3RhdGUuZ3JpZFNpemUpICogYXBwU3RhdGUuZ3JpZFNpemUgKyByZW5kZXJDb25maWcuc2Nyb2xsWSAlIGFwcFN0YXRlLmdyaWRTaXplLCBub3JtYWxpemVkQ2FudmFzV2lkdGggLyByZW5kZXJDb25maWcuem9vbS52YWx1ZSwgbm9ybWFsaXplZENhbnZhc0hlaWdodCAvIHJlbmRlckNvbmZpZy56b29tLnZhbHVlKTtcbiAgfSAvLyBQYWludCB2aXNpYmxlIGVsZW1lbnRzXG5cblxuICBjb25zdCB2aXNpYmxlRWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gaXNWaXNpYmxlRWxlbWVudChlbGVtZW50LCBub3JtYWxpemVkQ2FudmFzV2lkdGgsIG5vcm1hbGl6ZWRDYW52YXNIZWlnaHQsIHtcbiAgICAgIHpvb206IHJlbmRlckNvbmZpZy56b29tLFxuICAgICAgb2Zmc2V0TGVmdDogYXBwU3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgIG9mZnNldFRvcDogYXBwU3RhdGUub2Zmc2V0VG9wLFxuICAgICAgc2Nyb2xsWDogcmVuZGVyQ29uZmlnLnNjcm9sbFgsXG4gICAgICBzY3JvbGxZOiByZW5kZXJDb25maWcuc2Nyb2xsWVxuICAgIH0pO1xuICB9KTtcbiAgdmlzaWJsZUVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICB0cnkge1xuICAgICAgcmVuZGVyRWxlbWVudChlbGVtZW50LCByYywgY29udGV4dCwgcmVuZGVyQ29uZmlnKTtcblxuICAgICAgaWYgKCFpc0V4cG9ydGluZykge1xuICAgICAgICByZW5kZXJMaW5rSWNvbihlbGVtZW50LCBjb250ZXh0LCBhcHBTdGF0ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudChhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQpO1xuXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJlbmRlckxpbmVhclBvaW50SGFuZGxlcyhjb250ZXh0LCBhcHBTdGF0ZSwgcmVuZGVyQ29uZmlnLCBlbGVtZW50KTtcbiAgICB9XG4gIH0gLy8gUGFpbnQgc2VsZWN0aW9uIGVsZW1lbnRcblxuXG4gIGlmIChzZWxlY3Rpb25FbGVtZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlbmRlckVsZW1lbnQoc2VsZWN0aW9uRWxlbWVudCwgcmMsIGNvbnRleHQsIHJlbmRlckNvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc0JpbmRpbmdFbmFibGVkKGFwcFN0YXRlKSkge1xuICAgIGFwcFN0YXRlLnN1Z2dlc3RlZEJpbmRpbmdzLmZpbHRlcihmdW5jdGlvbiAoYmluZGluZykge1xuICAgICAgcmV0dXJuIGJpbmRpbmcgIT0gbnVsbDtcbiAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChzdWdnZXN0ZWRCaW5kaW5nKSB7XG4gICAgICByZW5kZXJCaW5kaW5nSGlnaGxpZ2h0KGNvbnRleHQsIHJlbmRlckNvbmZpZywgc3VnZ2VzdGVkQmluZGluZyk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoYXBwU3RhdGUuc2VsZWN0ZWRMaW5lYXJFbGVtZW50ICYmIGFwcFN0YXRlLnNlbGVjdGVkTGluZWFyRWxlbWVudC5ob3ZlclBvaW50SW5kZXggIT09IC0xKSB7XG4gICAgcmVuZGVyTGluZWFyRWxlbWVudFBvaW50SGlnaGxpZ2h0KGNvbnRleHQsIGFwcFN0YXRlLCByZW5kZXJDb25maWcpO1xuICB9IC8vIFBhaW50IHNlbGVjdGVkIGVsZW1lbnRzXG5cblxuICBpZiAocmVuZGVyU2VsZWN0aW9uICYmICFhcHBTdGF0ZS5tdWx0aUVsZW1lbnQgJiYgIWFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgY29uc3QgbG9jYWxseVNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBhcHBTdGF0ZSk7XG4gICAgY29uc3QgbG9jYWxseVNlbGVjdGVkSWRzID0gbG9jYWxseVNlbGVjdGVkRWxlbWVudHMubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5pZDtcbiAgICB9KTtcbiAgICBjb25zdCBpc1NpbmdsZUxpbmVhckVsZW1lbnRTZWxlY3RlZCA9IGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0xpbmVhckVsZW1lbnQobG9jYWxseVNlbGVjdGVkRWxlbWVudHNbMF0pOyAvLyByZW5kZXIgc2VsZWN0ZWQgbGluZWFyIGVsZW1lbnQgcG9pbnRzXG5cbiAgICBpZiAoaXNTaW5nbGVMaW5lYXJFbGVtZW50U2VsZWN0ZWQgJiYgYXBwU3RhdGUuc2VsZWN0ZWRMaW5lYXJFbGVtZW50Py5lbGVtZW50SWQgPT09IGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzWzBdLmlkICYmICFsb2NhbGx5U2VsZWN0ZWRFbGVtZW50c1swXS5sb2NrZWQpIHtcbiAgICAgIHJlbmRlckxpbmVhclBvaW50SGFuZGxlcyhjb250ZXh0LCBhcHBTdGF0ZSwgcmVuZGVyQ29uZmlnLCBsb2NhbGx5U2VsZWN0ZWRFbGVtZW50c1swXSk7IC8vIHJlbmRlciBib3VuZGluZyBib3hcbiAgICAgIC8vICh1bmxlc3MgZHJhZ2dpbmcgYSBzaW5nbGUgbGluZWFyIGVsZW1lbnQpXG4gICAgfSBlbHNlIGlmICghYXBwU3RhdGUuZHJhZ2dpbmdFbGVtZW50IHx8ICFpc1NpbmdsZUxpbmVhckVsZW1lbnRTZWxlY3RlZCkge1xuICAgICAgY29uc3Qgc2VsZWN0aW9ucyA9IGVsZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbG9ycyA9IFtdOyAvLyBsb2NhbCB1c2VyXG5cbiAgICAgICAgaWYgKGxvY2FsbHlTZWxlY3RlZElkcy5pbmNsdWRlcyhlbGVtZW50LmlkKSAmJiAhaXNTZWxlY3RlZFZpYUdyb3VwKGFwcFN0YXRlLCBlbGVtZW50KSkge1xuICAgICAgICAgIHNlbGVjdGlvbkNvbG9ycy5wdXNoKG9jLmJsYWNrKTtcbiAgICAgICAgfSAvLyByZW1vdGUgdXNlcnNcblxuXG4gICAgICAgIGlmIChyZW5kZXJDb25maWcucmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2VsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgc2VsZWN0aW9uQ29sb3JzLnB1c2goLi4ucmVuZGVyQ29uZmlnLnJlbW90ZVNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXS5tYXAoZnVuY3Rpb24gKHNvY2tldElkKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGJhY2tncm91bmRcbiAgICAgICAgICAgIH0gPSBnZXRDbGllbnRDb2xvcnMoc29ja2V0SWQsIGFwcFN0YXRlKTtcbiAgICAgICAgICAgIHJldHVybiBiYWNrZ3JvdW5kO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3Rpb25Db2xvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgW2VsZW1lbnRYMSwgZWxlbWVudFkxLCBlbGVtZW50WDIsIGVsZW1lbnRZMl0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgICAgICAgYWNjLnB1c2goe1xuICAgICAgICAgICAgYW5nbGU6IGVsZW1lbnQuYW5nbGUsXG4gICAgICAgICAgICBlbGVtZW50WDEsXG4gICAgICAgICAgICBlbGVtZW50WTEsXG4gICAgICAgICAgICBlbGVtZW50WDIsXG4gICAgICAgICAgICBlbGVtZW50WTIsXG4gICAgICAgICAgICBzZWxlY3Rpb25Db2xvcnNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSk7XG5cbiAgICAgIGNvbnN0IGFkZFNlbGVjdGlvbkZvckdyb3VwSWQgPSBmdW5jdGlvbiAoZ3JvdXBJZCkge1xuICAgICAgICBjb25zdCBncm91cEVsZW1lbnRzID0gZ2V0RWxlbWVudHNJbkdyb3VwKGVsZW1lbnRzLCBncm91cElkKTtcbiAgICAgICAgY29uc3QgW2VsZW1lbnRYMSwgZWxlbWVudFkxLCBlbGVtZW50WDIsIGVsZW1lbnRZMl0gPSBnZXRDb21tb25Cb3VuZHMoZ3JvdXBFbGVtZW50cyk7XG4gICAgICAgIHNlbGVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgYW5nbGU6IDAsXG4gICAgICAgICAgZWxlbWVudFgxLFxuICAgICAgICAgIGVsZW1lbnRYMixcbiAgICAgICAgICBlbGVtZW50WTEsXG4gICAgICAgICAgZWxlbWVudFkyLFxuICAgICAgICAgIHNlbGVjdGlvbkNvbG9yczogW29jLmJsYWNrXVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgZ3JvdXBJZCBvZiBnZXRTZWxlY3RlZEdyb3VwSWRzKGFwcFN0YXRlKSkge1xuICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG11bHRpcGxheWVyIHNlbGVjdGVkIGdyb3VwIElEc1xuICAgICAgICBhZGRTZWxlY3Rpb25Gb3JHcm91cElkKGdyb3VwSWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXBwU3RhdGUuZWRpdGluZ0dyb3VwSWQpIHtcbiAgICAgICAgYWRkU2VsZWN0aW9uRm9yR3JvdXBJZChhcHBTdGF0ZS5lZGl0aW5nR3JvdXBJZCk7XG4gICAgICB9XG5cbiAgICAgIHNlbGVjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiByZW5kZXJTZWxlY3Rpb25Cb3JkZXIoY29udGV4dCwgcmVuZGVyQ29uZmlnLCBzZWxlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfSAvLyBQYWludCByZXNpemUgdHJhbnNmb3JtSGFuZGxlc1xuXG5cbiAgICBjb250ZXh0LnNhdmUoKTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShyZW5kZXJDb25maWcuc2Nyb2xsWCwgcmVuZGVyQ29uZmlnLnNjcm9sbFkpO1xuXG4gICAgaWYgKGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvYy53aGl0ZTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZXMgPSBnZXRUcmFuc2Zvcm1IYW5kbGVzKGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzWzBdLCByZW5kZXJDb25maWcuem9vbSwgXCJtb3VzZVwiIC8vIHdoZW4gd2UgcmVuZGVyIHdlIGRvbid0IGtub3cgd2hpY2ggcG9pbnRlciB0eXBlIHNvIHVzZSBtb3VzZVxuICAgICAgKTtcblxuICAgICAgaWYgKCFhcHBTdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgcmVuZGVyVHJhbnNmb3JtSGFuZGxlcyhjb250ZXh0LCByZW5kZXJDb25maWcsIHRyYW5zZm9ybUhhbmRsZXMsIGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzWzBdLmFuZ2xlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDEgJiYgIWFwcFN0YXRlLmlzUm90YXRpbmcpIHtcbiAgICAgIGNvbnN0IGRhc2hlZExpbmVQYWRkaW5nID0gNCAvIHJlbmRlckNvbmZpZy56b29tLnZhbHVlO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvYy53aGl0ZTtcbiAgICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRDb21tb25Cb3VuZHMobG9jYWxseVNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgY29uc3QgaW5pdGlhbExpbmVEYXNoID0gY29udGV4dC5nZXRMaW5lRGFzaCgpO1xuICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbMiAvIHJlbmRlckNvbmZpZy56b29tLnZhbHVlXSk7XG4gICAgICBjb25zdCBsaW5lV2lkdGggPSBjb250ZXh0LmxpbmVXaWR0aDtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gMSAvIHJlbmRlckNvbmZpZy56b29tLnZhbHVlO1xuICAgICAgc3Ryb2tlUmVjdFdpdGhSb3RhdGlvbihjb250ZXh0LCB4MSAtIGRhc2hlZExpbmVQYWRkaW5nLCB5MSAtIGRhc2hlZExpbmVQYWRkaW5nLCB4MiAtIHgxICsgZGFzaGVkTGluZVBhZGRpbmcgKiAyLCB5MiAtIHkxICsgZGFzaGVkTGluZVBhZGRpbmcgKiAyLCAoeDEgKyB4MikgLyAyLCAoeTEgKyB5MikgLyAyLCAwKTtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChpbml0aWFsTGluZURhc2gpO1xuICAgICAgY29uc3QgdHJhbnNmb3JtSGFuZGxlcyA9IGdldFRyYW5zZm9ybUhhbmRsZXNGcm9tQ29vcmRzKFt4MSwgeTEsIHgyLCB5Ml0sIDAsIHJlbmRlckNvbmZpZy56b29tLCBcIm1vdXNlXCIsIE9NSVRfU0lERVNfRk9SX01VTFRJUExFX0VMRU1FTlRTKTtcblxuICAgICAgaWYgKGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuICFlbGVtZW50LmxvY2tlZDtcbiAgICAgIH0pKSB7XG4gICAgICAgIHJlbmRlclRyYW5zZm9ybUhhbmRsZXMoY29udGV4dCwgcmVuZGVyQ29uZmlnLCB0cmFuc2Zvcm1IYW5kbGVzLCAwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgfSAvLyBSZXNldCB6b29tXG5cblxuICBjb250ZXh0LnJlc3RvcmUoKTsgLy8gUGFpbnQgcmVtb3RlIHBvaW50ZXJzXG5cbiAgZm9yIChjb25zdCBjbGllbnRJZCBpbiByZW5kZXJDb25maWcucmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzKSB7XG4gICAgbGV0IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHJlbmRlckNvbmZpZy5yZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHNbY2xpZW50SWRdO1xuICAgIHggLT0gYXBwU3RhdGUub2Zmc2V0TGVmdDtcbiAgICB5IC09IGFwcFN0YXRlLm9mZnNldFRvcDtcbiAgICBjb25zdCB3aWR0aCA9IDk7XG4gICAgY29uc3QgaGVpZ2h0ID0gMTQ7XG4gICAgY29uc3QgaXNPdXRPZkJvdW5kcyA9IHggPCAwIHx8IHggPiBub3JtYWxpemVkQ2FudmFzV2lkdGggLSB3aWR0aCB8fCB5IDwgMCB8fCB5ID4gbm9ybWFsaXplZENhbnZhc0hlaWdodCAtIGhlaWdodDtcbiAgICB4ID0gTWF0aC5tYXgoeCwgMCk7XG4gICAgeCA9IE1hdGgubWluKHgsIG5vcm1hbGl6ZWRDYW52YXNXaWR0aCAtIHdpZHRoKTtcbiAgICB5ID0gTWF0aC5tYXgoeSwgMCk7XG4gICAgeSA9IE1hdGgubWluKHksIG5vcm1hbGl6ZWRDYW52YXNIZWlnaHQgLSBoZWlnaHQpO1xuICAgIGNvbnN0IHtcbiAgICAgIGJhY2tncm91bmQsXG4gICAgICBzdHJva2VcbiAgICB9ID0gZ2V0Q2xpZW50Q29sb3JzKGNsaWVudElkLCBhcHBTdGF0ZSk7XG4gICAgY29udGV4dC5zYXZlKCk7XG4gICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0cm9rZTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGJhY2tncm91bmQ7XG4gICAgY29uc3QgdXNlclN0YXRlID0gcmVuZGVyQ29uZmlnLnJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzW2NsaWVudElkXTtcblxuICAgIGlmIChpc091dE9mQm91bmRzIHx8IHVzZXJTdGF0ZSA9PT0gVXNlcklkbGVTdGF0ZS5BV0FZKSB7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gMC40ODtcbiAgICB9XG5cbiAgICBpZiAocmVuZGVyQ29uZmlnLnJlbW90ZVBvaW50ZXJCdXR0b24gJiYgcmVuZGVyQ29uZmlnLnJlbW90ZVBvaW50ZXJCdXR0b25bY2xpZW50SWRdID09PSBcImRvd25cIikge1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgIGNvbnRleHQuYXJjKHgsIHksIDE1LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSAzO1xuICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IFwiI2ZmZmZmZjg4XCI7XG4gICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICBjb250ZXh0LmFyYyh4LCB5LCAxNSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKTtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gMTtcbiAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzdHJva2U7XG4gICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQubW92ZVRvKHgsIHkpO1xuICAgIGNvbnRleHQubGluZVRvKHggKyAxLCB5ICsgMTQpO1xuICAgIGNvbnRleHQubGluZVRvKHggKyA0LCB5ICsgOSk7XG4gICAgY29udGV4dC5saW5lVG8oeCArIDksIHkgKyAxMCk7XG4gICAgY29udGV4dC5saW5lVG8oeCwgeSk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgICBjb25zdCB1c2VybmFtZSA9IHJlbmRlckNvbmZpZy5yZW1vdGVQb2ludGVyVXNlcm5hbWVzW2NsaWVudElkXTtcbiAgICBsZXQgaWRsZVN0YXRlID0gXCJcIjtcblxuICAgIGlmICh1c2VyU3RhdGUgPT09IFVzZXJJZGxlU3RhdGUuQVdBWSkge1xuICAgICAgaWRsZVN0YXRlID0gaGFzRW1vamlTdXBwb3J0ID8gXCLimqvvuI9cIiA6IGAgKCR7VXNlcklkbGVTdGF0ZS5BV0FZfSlgO1xuICAgIH0gZWxzZSBpZiAodXNlclN0YXRlID09PSBVc2VySWRsZVN0YXRlLklETEUpIHtcbiAgICAgIGlkbGVTdGF0ZSA9IGhhc0Vtb2ppU3VwcG9ydCA/IFwi8J+SpFwiIDogYCAoJHtVc2VySWRsZVN0YXRlLklETEV9KWA7XG4gICAgfSBlbHNlIGlmICh1c2VyU3RhdGUgPT09IFVzZXJJZGxlU3RhdGUuQUNUSVZFKSB7XG4gICAgICBpZGxlU3RhdGUgPSBoYXNFbW9qaVN1cHBvcnQgPyBcIvCfn6JcIiA6IFwiXCI7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcm5hbWVBbmRJZGxlU3RhdGUgPSBgJHt1c2VybmFtZSA/IGAke3VzZXJuYW1lfSBgIDogXCJcIn0ke2lkbGVTdGF0ZX1gO1xuXG4gICAgaWYgKCFpc091dE9mQm91bmRzICYmIHVzZXJuYW1lQW5kSWRsZVN0YXRlKSB7XG4gICAgICBjb25zdCBvZmZzZXRYID0geCArIHdpZHRoO1xuICAgICAgY29uc3Qgb2Zmc2V0WSA9IHkgKyBoZWlnaHQ7XG4gICAgICBjb25zdCBwYWRkaW5nSG9yaXpvbnRhbCA9IDQ7XG4gICAgICBjb25zdCBwYWRkaW5nVmVydGljYWwgPSA0O1xuICAgICAgY29uc3QgbWVhc3VyZSA9IGNvbnRleHQubWVhc3VyZVRleHQodXNlcm5hbWVBbmRJZGxlU3RhdGUpO1xuICAgICAgY29uc3QgbWVhc3VyZUhlaWdodCA9IG1lYXN1cmUuYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50ICsgbWVhc3VyZS5hY3R1YWxCb3VuZGluZ0JveEFzY2VudDsgLy8gQm9yZGVyXG5cbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gc3Ryb2tlO1xuICAgICAgY29udGV4dC5maWxsUmVjdChvZmZzZXRYIC0gMSwgb2Zmc2V0WSAtIDEsIG1lYXN1cmUud2lkdGggKyAyICogcGFkZGluZ0hvcml6b250YWwgKyAyLCBtZWFzdXJlSGVpZ2h0ICsgMiAqIHBhZGRpbmdWZXJ0aWNhbCArIDIpOyAvLyBCYWNrZ3JvdW5kXG5cbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gYmFja2dyb3VuZDtcbiAgICAgIGNvbnRleHQuZmlsbFJlY3Qob2Zmc2V0WCwgb2Zmc2V0WSwgbWVhc3VyZS53aWR0aCArIDIgKiBwYWRkaW5nSG9yaXpvbnRhbCwgbWVhc3VyZUhlaWdodCArIDIgKiBwYWRkaW5nVmVydGljYWwpO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvYy53aGl0ZTtcbiAgICAgIGNvbnRleHQuZmlsbFRleHQodXNlcm5hbWVBbmRJZGxlU3RhdGUsIG9mZnNldFggKyBwYWRkaW5nSG9yaXpvbnRhbCwgb2Zmc2V0WSArIHBhZGRpbmdWZXJ0aWNhbCArIG1lYXN1cmUuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQpO1xuICAgIH1cblxuICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH0gLy8gUGFpbnQgc2Nyb2xsYmFyc1xuXG5cbiAgbGV0IHNjcm9sbEJhcnM7XG5cbiAgaWYgKHJlbmRlclNjcm9sbGJhcnMpIHtcbiAgICBzY3JvbGxCYXJzID0gZ2V0U2Nyb2xsQmFycyhlbGVtZW50cywgbm9ybWFsaXplZENhbnZhc1dpZHRoLCBub3JtYWxpemVkQ2FudmFzSGVpZ2h0LCByZW5kZXJDb25maWcpO1xuICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gU0NST0xMQkFSX0NPTE9SO1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYmEoMjU1LDI1NSwyNTUsMC44KVwiO1xuICAgIFtzY3JvbGxCYXJzLmhvcml6b250YWwsIHNjcm9sbEJhcnMudmVydGljYWxdLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbEJhcikge1xuICAgICAgaWYgKHNjcm9sbEJhcikge1xuICAgICAgICByb3VuZFJlY3QoY29udGV4dCwgc2Nyb2xsQmFyLngsIHNjcm9sbEJhci55LCBzY3JvbGxCYXIud2lkdGgsIHNjcm9sbEJhci5oZWlnaHQsIFNDUk9MTEJBUl9XSURUSCAvIDIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICB9XG5cbiAgY29udGV4dC5yZXN0b3JlKCk7XG4gIHJldHVybiB7XG4gICAgYXRMZWFzdE9uZVZpc2libGVFbGVtZW50OiB2aXNpYmxlRWxlbWVudHMubGVuZ3RoID4gMCxcbiAgICBzY3JvbGxCYXJzXG4gIH07XG59O1xuY29uc3QgcmVuZGVyU2NlbmVUaHJvdHRsZWQgPSB0aHJvdHRsZVJBRihmdW5jdGlvbiAoZWxlbWVudHMsIGFwcFN0YXRlLCBzZWxlY3Rpb25FbGVtZW50LCBzY2FsZSwgcmMsIGNhbnZhcywgcmVuZGVyQ29uZmlnLCBjYWxsYmFjaykge1xuICBjb25zdCByZXQgPSBfcmVuZGVyU2NlbmUoZWxlbWVudHMsIGFwcFN0YXRlLCBzZWxlY3Rpb25FbGVtZW50LCBzY2FsZSwgcmMsIGNhbnZhcywgcmVuZGVyQ29uZmlnKTtcblxuICBjYWxsYmFjaz8uKHJldCk7XG59LCB7XG4gIHRyYWlsaW5nOiB0cnVlXG59KTtcbi8qKiByZW5kZXJTY2VuZSB0aHJvdHRsZWQgdG8gYW5pbWF0aW9uIGZyYW1lcmF0ZSAqL1xuXG5leHBvcnQgY29uc3QgcmVuZGVyU2NlbmUgPSBmdW5jdGlvbiAoZWxlbWVudHMsIGFwcFN0YXRlLCBzZWxlY3Rpb25FbGVtZW50LCBzY2FsZSwgcmMsIGNhbnZhcywgcmVuZGVyQ29uZmlnLCBjYWxsYmFjaywgdGhyb3R0bGUpIHtcbiAgaWYgKHRocm90dGxlKSB7XG4gICAgcmVuZGVyU2NlbmVUaHJvdHRsZWQoZWxlbWVudHMsIGFwcFN0YXRlLCBzZWxlY3Rpb25FbGVtZW50LCBzY2FsZSwgcmMsIGNhbnZhcywgcmVuZGVyQ29uZmlnLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IF9yZW5kZXJTY2VuZShlbGVtZW50cywgYXBwU3RhdGUsIHNlbGVjdGlvbkVsZW1lbnQsIHNjYWxlLCByYywgY2FudmFzLCByZW5kZXJDb25maWcpO1xuXG4gIGNhbGxiYWNrPy4ocmV0KTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbmNvbnN0IHJlbmRlclRyYW5zZm9ybUhhbmRsZXMgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVuZGVyQ29uZmlnLCB0cmFuc2Zvcm1IYW5kbGVzLCBhbmdsZSkge1xuICBPYmplY3Qua2V5cyh0cmFuc2Zvcm1IYW5kbGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1IYW5kbGUgPSB0cmFuc2Zvcm1IYW5kbGVzW2tleV07XG5cbiAgICBpZiAodHJhbnNmb3JtSGFuZGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSAxIC8gcmVuZGVyQ29uZmlnLnpvb20udmFsdWU7XG5cbiAgICAgIGlmIChrZXkgPT09IFwicm90YXRpb25cIikge1xuICAgICAgICBmaWxsQ2lyY2xlKGNvbnRleHQsIHRyYW5zZm9ybUhhbmRsZVswXSArIHRyYW5zZm9ybUhhbmRsZVsyXSAvIDIsIHRyYW5zZm9ybUhhbmRsZVsxXSArIHRyYW5zZm9ybUhhbmRsZVszXSAvIDIsIHRyYW5zZm9ybUhhbmRsZVsyXSAvIDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Ryb2tlUmVjdFdpdGhSb3RhdGlvbihjb250ZXh0LCB0cmFuc2Zvcm1IYW5kbGVbMF0sIHRyYW5zZm9ybUhhbmRsZVsxXSwgdHJhbnNmb3JtSGFuZGxlWzJdLCB0cmFuc2Zvcm1IYW5kbGVbM10sIHRyYW5zZm9ybUhhbmRsZVswXSArIHRyYW5zZm9ybUhhbmRsZVsyXSAvIDIsIHRyYW5zZm9ybUhhbmRsZVsxXSArIHRyYW5zZm9ybUhhbmRsZVszXSAvIDIsIGFuZ2xlLCB0cnVlIC8vIGZpbGwgYmVmb3JlIHN0cm9rZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3QgcmVuZGVyU2VsZWN0aW9uQm9yZGVyID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlbmRlckNvbmZpZywgZWxlbWVudFByb3BlcnRpZXMpIHtcbiAgY29uc3Qge1xuICAgIGFuZ2xlLFxuICAgIGVsZW1lbnRYMSxcbiAgICBlbGVtZW50WTEsXG4gICAgZWxlbWVudFgyLFxuICAgIGVsZW1lbnRZMixcbiAgICBzZWxlY3Rpb25Db2xvcnNcbiAgfSA9IGVsZW1lbnRQcm9wZXJ0aWVzO1xuICBjb25zdCBlbGVtZW50V2lkdGggPSBlbGVtZW50WDIgLSBlbGVtZW50WDE7XG4gIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50WTIgLSBlbGVtZW50WTE7XG4gIGNvbnN0IGRhc2hlZExpbmVQYWRkaW5nID0gNCAvIHJlbmRlckNvbmZpZy56b29tLnZhbHVlO1xuICBjb25zdCBkYXNoV2lkdGggPSA4IC8gcmVuZGVyQ29uZmlnLnpvb20udmFsdWU7XG4gIGNvbnN0IHNwYWNlV2lkdGggPSA0IC8gcmVuZGVyQ29uZmlnLnpvb20udmFsdWU7XG4gIGNvbnRleHQuc2F2ZSgpO1xuICBjb250ZXh0LnRyYW5zbGF0ZShyZW5kZXJDb25maWcuc2Nyb2xsWCwgcmVuZGVyQ29uZmlnLnNjcm9sbFkpO1xuICBjb250ZXh0LmxpbmVXaWR0aCA9IDEgLyByZW5kZXJDb25maWcuem9vbS52YWx1ZTtcbiAgY29uc3QgY291bnQgPSBzZWxlY3Rpb25Db2xvcnMubGVuZ3RoO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgKytpbmRleCkge1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzZWxlY3Rpb25Db2xvcnNbaW5kZXhdO1xuICAgIGNvbnRleHQuc2V0TGluZURhc2goW2Rhc2hXaWR0aCwgc3BhY2VXaWR0aCArIChkYXNoV2lkdGggKyBzcGFjZVdpZHRoKSAqIChjb3VudCAtIDEpXSk7XG4gICAgY29udGV4dC5saW5lRGFzaE9mZnNldCA9IChkYXNoV2lkdGggKyBzcGFjZVdpZHRoKSAqIGluZGV4O1xuICAgIHN0cm9rZVJlY3RXaXRoUm90YXRpb24oY29udGV4dCwgZWxlbWVudFgxIC0gZGFzaGVkTGluZVBhZGRpbmcsIGVsZW1lbnRZMSAtIGRhc2hlZExpbmVQYWRkaW5nLCBlbGVtZW50V2lkdGggKyBkYXNoZWRMaW5lUGFkZGluZyAqIDIsIGVsZW1lbnRIZWlnaHQgKyBkYXNoZWRMaW5lUGFkZGluZyAqIDIsIGVsZW1lbnRYMSArIGVsZW1lbnRXaWR0aCAvIDIsIGVsZW1lbnRZMSArIGVsZW1lbnRIZWlnaHQgLyAyLCBhbmdsZSk7XG4gIH1cblxuICBjb250ZXh0LnJlc3RvcmUoKTtcbn07XG5cbmNvbnN0IHJlbmRlckJpbmRpbmdIaWdobGlnaHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVuZGVyQ29uZmlnLCBzdWdnZXN0ZWRCaW5kaW5nKSB7XG4gIGNvbnN0IHJlbmRlckhpZ2hsaWdodCA9IEFycmF5LmlzQXJyYXkoc3VnZ2VzdGVkQmluZGluZykgPyByZW5kZXJCaW5kaW5nSGlnaGxpZ2h0Rm9yU3VnZ2VzdGVkUG9pbnRCaW5kaW5nIDogcmVuZGVyQmluZGluZ0hpZ2hsaWdodEZvckJpbmRhYmxlRWxlbWVudDtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKHJlbmRlckNvbmZpZy5zY3JvbGxYLCByZW5kZXJDb25maWcuc2Nyb2xsWSk7XG4gIHJlbmRlckhpZ2hsaWdodChjb250ZXh0LCBzdWdnZXN0ZWRCaW5kaW5nKTtcbiAgY29udGV4dC5yZXN0b3JlKCk7XG59O1xuXG5jb25zdCByZW5kZXJCaW5kaW5nSGlnaGxpZ2h0Rm9yQmluZGFibGVFbGVtZW50ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZW1lbnQpIHtcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgY29uc3Qgd2lkdGggPSB4MiAtIHgxO1xuICBjb25zdCBoZWlnaHQgPSB5MiAtIHkxO1xuICBjb25zdCB0aHJlc2hvbGQgPSBtYXhCaW5kaW5nR2FwKGVsZW1lbnQsIHdpZHRoLCBoZWlnaHQpOyAvLyBTbyB0aGF0IHdlIGRvbid0IG92ZXJsYXAgdGhlIGVsZW1lbnQgaXRzZWxmXG5cbiAgY29uc3Qgc3Ryb2tlT2Zmc2V0ID0gNDtcbiAgY29udGV4dC5zdHJva2VTdHlsZSA9IFwicmdiYSgwLDAsMCwuMDUpXCI7XG4gIGNvbnRleHQubGluZVdpZHRoID0gdGhyZXNob2xkIC0gc3Ryb2tlT2Zmc2V0O1xuICBjb25zdCBwYWRkaW5nID0gc3Ryb2tlT2Zmc2V0IC8gMiArIHRocmVzaG9sZCAvIDI7XG5cbiAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICBjYXNlIFwicmVjdGFuZ2xlXCI6XG4gICAgY2FzZSBcInRleHRcIjpcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICAgIHN0cm9rZVJlY3RXaXRoUm90YXRpb24oY29udGV4dCwgeDEgLSBwYWRkaW5nLCB5MSAtIHBhZGRpbmcsIHdpZHRoICsgcGFkZGluZyAqIDIsIGhlaWdodCArIHBhZGRpbmcgKiAyLCB4MSArIHdpZHRoIC8gMiwgeTEgKyBoZWlnaHQgLyAyLCBlbGVtZW50LmFuZ2xlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcImRpYW1vbmRcIjpcbiAgICAgIGNvbnN0IHNpZGUgPSBNYXRoLmh5cG90KHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY29uc3Qgd1BhZGRpbmcgPSBwYWRkaW5nICogc2lkZSAvIGhlaWdodDtcbiAgICAgIGNvbnN0IGhQYWRkaW5nID0gcGFkZGluZyAqIHNpZGUgLyB3aWR0aDtcbiAgICAgIHN0cm9rZURpYW1vbmRXaXRoUm90YXRpb24oY29udGV4dCwgd2lkdGggKyB3UGFkZGluZyAqIDIsIGhlaWdodCArIGhQYWRkaW5nICogMiwgeDEgKyB3aWR0aCAvIDIsIHkxICsgaGVpZ2h0IC8gMiwgZWxlbWVudC5hbmdsZSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICBzdHJva2VFbGxpcHNlV2l0aFJvdGF0aW9uKGNvbnRleHQsIHdpZHRoICsgcGFkZGluZyAqIDIsIGhlaWdodCArIHBhZGRpbmcgKiAyLCB4MSArIHdpZHRoIC8gMiwgeTEgKyBoZWlnaHQgLyAyLCBlbGVtZW50LmFuZ2xlKTtcbiAgICAgIGJyZWFrO1xuICB9XG59O1xuXG5jb25zdCByZW5kZXJCaW5kaW5nSGlnaGxpZ2h0Rm9yU3VnZ2VzdGVkUG9pbnRCaW5kaW5nID0gZnVuY3Rpb24gKGNvbnRleHQsIHN1Z2dlc3RlZEJpbmRpbmcpIHtcbiAgY29uc3QgW2VsZW1lbnQsIHN0YXJ0T3JFbmQsIGJpbmRhYmxlRWxlbWVudF0gPSBzdWdnZXN0ZWRCaW5kaW5nO1xuICBjb25zdCB0aHJlc2hvbGQgPSBtYXhCaW5kaW5nR2FwKGJpbmRhYmxlRWxlbWVudCwgYmluZGFibGVFbGVtZW50LndpZHRoLCBiaW5kYWJsZUVsZW1lbnQuaGVpZ2h0KTtcbiAgY29udGV4dC5zdHJva2VTdHlsZSA9IFwicmdiYSgwLDAsMCwwKVwiO1xuICBjb250ZXh0LmZpbGxTdHlsZSA9IFwicmdiYSgwLDAsMCwuMDUpXCI7XG4gIGNvbnN0IHBvaW50SW5kaWNlcyA9IHN0YXJ0T3JFbmQgPT09IFwiYm90aFwiID8gWzAsIC0xXSA6IHN0YXJ0T3JFbmQgPT09IFwic3RhcnRcIiA/IFswXSA6IFstMV07XG4gIHBvaW50SW5kaWNlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgIGNvbnN0IFt4LCB5XSA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRBdEluZGV4R2xvYmFsQ29vcmRpbmF0ZXMoZWxlbWVudCwgaW5kZXgpO1xuICAgIGZpbGxDaXJjbGUoY29udGV4dCwgeCwgeSwgdGhyZXNob2xkKTtcbiAgfSk7XG59O1xuXG5sZXQgbGlua0NhbnZhc0NhY2hlO1xuXG5jb25zdCByZW5kZXJMaW5rSWNvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBjb250ZXh0LCBhcHBTdGF0ZSkge1xuICBpZiAoZWxlbWVudC5saW5rICYmICFhcHBTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbZWxlbWVudC5pZF0pIHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICAgIGNvbnN0IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSA9IGdldExpbmtIYW5kbGVGcm9tQ29vcmRzKFt4MSwgeTEsIHgyLCB5Ml0sIGVsZW1lbnQuYW5nbGUsIGFwcFN0YXRlKTtcbiAgICBjb25zdCBjZW50ZXJYID0geCArIHdpZHRoIC8gMjtcbiAgICBjb25zdCBjZW50ZXJZID0geSArIGhlaWdodCAvIDI7XG4gICAgY29udGV4dC5zYXZlKCk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoYXBwU3RhdGUuc2Nyb2xsWCArIGNlbnRlclgsIGFwcFN0YXRlLnNjcm9sbFkgKyBjZW50ZXJZKTtcbiAgICBjb250ZXh0LnJvdGF0ZShlbGVtZW50LmFuZ2xlKTtcblxuICAgIGlmICghbGlua0NhbnZhc0NhY2hlIHx8IGxpbmtDYW52YXNDYWNoZS56b29tICE9PSBhcHBTdGF0ZS56b29tLnZhbHVlKSB7XG4gICAgICBsaW5rQ2FudmFzQ2FjaGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgbGlua0NhbnZhc0NhY2hlLnpvb20gPSBhcHBTdGF0ZS56b29tLnZhbHVlO1xuICAgICAgbGlua0NhbnZhc0NhY2hlLndpZHRoID0gd2lkdGggKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIGFwcFN0YXRlLnpvb20udmFsdWU7XG4gICAgICBsaW5rQ2FudmFzQ2FjaGUuaGVpZ2h0ID0gaGVpZ2h0ICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiBhcHBTdGF0ZS56b29tLnZhbHVlO1xuICAgICAgY29uc3QgbGlua0NhbnZhc0NhY2hlQ29udGV4dCA9IGxpbmtDYW52YXNDYWNoZS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBsaW5rQ2FudmFzQ2FjaGVDb250ZXh0LnNjYWxlKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogYXBwU3RhdGUuem9vbS52YWx1ZSwgd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiBhcHBTdGF0ZS56b29tLnZhbHVlKTtcbiAgICAgIC8qbGlua0NhbnZhc0NhY2hlQ29udGV4dC5maWxsU3R5bGUgPSBcIiNmZmZcIjsgLy96c3ZpY3ppYW5cbiAgICAgIGxpbmtDYW52YXNDYWNoZUNvbnRleHQuZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ki9cbiAgICAgIC8venN2aWN6aWFuXG4gICAgICAvL2xpbmtDYW52YXNDYWNoZUNvbnRleHQuZ2xvYmFsQWxwaGEgPSBhcHBTdGF0ZS5saW5rT3BhY2l0eTsgLy96c3ZpY3ppYW5cblxuICAgICAgbGlua0NhbnZhc0NhY2hlQ29udGV4dC5kcmF3SW1hZ2UoRVhURVJOQUxfTElOS19JTUcsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgbGlua0NhbnZhc0NhY2hlQ29udGV4dC5yZXN0b3JlKCk7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gYXBwU3RhdGUubGlua09wYWNpdHk7IC8venN2aWN6aWFuXG5cbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGxpbmtDYW52YXNDYWNoZSwgeCAtIGNlbnRlclgsIHkgLSBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IGFwcFN0YXRlLmxpbmtPcGFjaXR5OyAvL3pzdmljemlhblxuXG4gICAgICBjb250ZXh0LmRyYXdJbWFnZShsaW5rQ2FudmFzQ2FjaGUsIHggLSBjZW50ZXJYLCB5IC0gY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfVxuXG4gICAgY29udGV4dC5yZXN0b3JlKCk7XG4gIH1cbn07XG5cbmNvbnN0IGlzVmlzaWJsZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgY2FudmFzV2lkdGgsIGNhbnZhc0hlaWdodCwgdmlld1RyYW5zZm9ybWF0aW9ucykge1xuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEJvdW5kcyhlbGVtZW50KTsgLy8gc2NlbmUgY29vcmRpbmF0ZXNcblxuICBjb25zdCB0b3BMZWZ0U2NlbmVDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgIGNsaWVudFg6IHZpZXdUcmFuc2Zvcm1hdGlvbnMub2Zmc2V0TGVmdCxcbiAgICBjbGllbnRZOiB2aWV3VHJhbnNmb3JtYXRpb25zLm9mZnNldFRvcFxuICB9LCB2aWV3VHJhbnNmb3JtYXRpb25zKTtcbiAgY29uc3QgYm90dG9tUmlnaHRTY2VuZUNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcyh7XG4gICAgY2xpZW50WDogdmlld1RyYW5zZm9ybWF0aW9ucy5vZmZzZXRMZWZ0ICsgY2FudmFzV2lkdGgsXG4gICAgY2xpZW50WTogdmlld1RyYW5zZm9ybWF0aW9ucy5vZmZzZXRUb3AgKyBjYW52YXNIZWlnaHRcbiAgfSwgdmlld1RyYW5zZm9ybWF0aW9ucyk7XG4gIHJldHVybiB0b3BMZWZ0U2NlbmVDb29yZHMueCA8PSB4MiAmJiB0b3BMZWZ0U2NlbmVDb29yZHMueSA8PSB5MiAmJiBib3R0b21SaWdodFNjZW5lQ29vcmRzLnggPj0geDEgJiYgYm90dG9tUmlnaHRTY2VuZUNvb3Jkcy55ID49IHkxO1xufTsgLy8gVGhpcyBzaG91bGQgYmUgb25seSBjYWxsZWQgZm9yIGV4cG9ydGluZyBwdXJwb3Nlc1xuXG5cbmV4cG9ydCBjb25zdCByZW5kZXJTY2VuZVRvU3ZnID0gZnVuY3Rpb24gKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcykge1xuICBsZXQge1xuICAgIG9mZnNldFggPSAwLFxuICAgIG9mZnNldFkgPSAwLFxuICAgIGV4cG9ydFdpdGhEYXJrTW9kZSA9IGZhbHNlXG4gIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHt9O1xuXG4gIGlmICghc3ZnUm9vdCkge1xuICAgIHJldHVybjtcbiAgfSAvLyByZW5kZXIgZWxlbWVudHNcblxuXG4gIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQuaXNEZWxldGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZW5kZXJFbGVtZW50VG9TdmcoZWxlbWVudCwgcnN2Zywgc3ZnUm9vdCwgZmlsZXMsIGVsZW1lbnQueCArIG9mZnNldFgsIGVsZW1lbnQueSArIG9mZnNldFksIGV4cG9ydFdpdGhEYXJrTW9kZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///../../renderer/renderScene.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../renderer/renderScene.ts?");
|
|
3041
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"_renderScene\\\": () => (/* binding */ _renderScene),\\n/* harmony export */ \\\"renderScene\\\": () => (/* binding */ renderScene),\\n/* harmony export */ \\\"renderSceneToSvg\\\": () => (/* binding */ renderSceneToSvg)\\n/* harmony export */ });\\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! open-color */ \\\"../../../node_modules/open-color/open-color.json\\\");\\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _roundRect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./roundRect */ \\\"../../renderer/roundRect.ts\\\");\\n/* harmony import */ var _scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/scrollbars */ \\\"../../scene/scrollbars.ts\\\");\\n/* harmony import */ var _scene_selection__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../scene/selection */ \\\"../../scene/selection.ts\\\");\\n/* harmony import */ var _renderElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./renderElement */ \\\"../../renderer/renderElement.ts\\\");\\n/* harmony import */ var _clients__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../clients */ \\\"../../clients.ts\\\");\\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/linearElementEditor */ \\\"../../element/linearElementEditor.ts\\\");\\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../groups */ \\\"../../groups.ts\\\");\\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../element/collision */ \\\"../../element/collision.ts\\\");\\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../element/binding */ \\\"../../element/binding.ts\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../types */ \\\"../../types.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var _element_Hyperlink__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../element/Hyperlink */ \\\"../../element/Hyperlink.tsx\\\");\\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../element/typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst hasEmojiSupport = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.supportsEmoji)();\\r\\nconst strokeRectWithRotation = function (context, x, y, width, height, cx, cy, angle) {\\r\\n let fill = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : false;\\r\\n context.save();\\r\\n context.translate(cx, cy);\\r\\n context.rotate(angle);\\r\\n if (fill) {\\r\\n context.fillRect(x - cx, y - cy, width, height);\\r\\n }\\r\\n context.strokeRect(x - cx, y - cy, width, height);\\r\\n context.restore();\\r\\n};\\r\\nconst strokeDiamondWithRotation = function (context, width, height, cx, cy, angle) {\\r\\n context.save();\\r\\n context.translate(cx, cy);\\r\\n context.rotate(angle);\\r\\n context.beginPath();\\r\\n context.moveTo(0, height / 2);\\r\\n context.lineTo(width / 2, 0);\\r\\n context.lineTo(0, -height / 2);\\r\\n context.lineTo(-width / 2, 0);\\r\\n context.closePath();\\r\\n context.stroke();\\r\\n context.restore();\\r\\n};\\r\\nconst strokeEllipseWithRotation = function (context, width, height, cx, cy, angle) {\\r\\n context.beginPath();\\r\\n context.ellipse(cx, cy, width / 2, height / 2, angle, 0, Math.PI * 2);\\r\\n context.stroke();\\r\\n};\\r\\nconst fillCircle = function (context, cx, cy, radius) {\\r\\n let stroke = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\\r\\n context.beginPath();\\r\\n context.arc(cx, cy, radius, 0, Math.PI * 2);\\r\\n context.fill();\\r\\n if (stroke) {\\r\\n context.stroke();\\r\\n }\\r\\n};\\r\\nconst strokeGrid = function (context, gridSize, offsetX, offsetY, width, height) {\\r\\n context.save();\\r\\n context.strokeStyle = \\\"rgba(0,0,0,0.1)\\\";\\r\\n context.beginPath();\\r\\n for (let x = offsetX; x < offsetX + width + gridSize * 2; x += gridSize) {\\r\\n context.moveTo(x, offsetY - gridSize);\\r\\n context.lineTo(x, offsetY + height + gridSize * 2);\\r\\n }\\r\\n for (let y = offsetY; y < offsetY + height + gridSize * 2; y += gridSize) {\\r\\n context.moveTo(offsetX - gridSize, y);\\r\\n context.lineTo(offsetX + width + gridSize * 2, y);\\r\\n }\\r\\n context.stroke();\\r\\n context.restore();\\r\\n};\\r\\nconst renderLinearPointHandles = function (context, appState, renderConfig, element) {\\r\\n context.save();\\r\\n context.translate(renderConfig.scrollX, renderConfig.scrollY);\\r\\n context.lineWidth = 1 / renderConfig.zoom.value;\\r\\n _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getPointsGlobalCoordinates(element).forEach(function (point, idx) {\\r\\n var _a, _b;\\r\\n context.strokeStyle = \\\"#5e5ad8\\\";\\r\\n context.setLineDash([]);\\r\\n context.fillStyle = ((_b = (_a = appState.editingLinearElement) === null || _a === void 0 ? void 0 : _a.selectedPointsIndices) === null || _b === void 0 ? void 0 : _b.includes(idx)) ? \\\"rgba(134, 131, 226, 0.9)\\\" : \\\"rgba(255, 255, 255, 0.9)\\\";\\r\\n const { POINT_HANDLE_SIZE } = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor;\\r\\n const radius = appState.editingLinearElement ? POINT_HANDLE_SIZE : POINT_HANDLE_SIZE / 2;\\r\\n fillCircle(context, point[0], point[1], radius / renderConfig.zoom.value);\\r\\n });\\r\\n context.restore();\\r\\n};\\r\\nconst renderLinearElementPointHighlight = function (context, appState, renderConfig) {\\r\\n var _a, _b;\\r\\n const { elementId, hoverPointIndex } = appState.selectedLinearElement;\\r\\n if ((_b = (_a = appState.editingLinearElement) === null || _a === void 0 ? void 0 : _a.selectedPointsIndices) === null || _b === void 0 ? void 0 : _b.includes(hoverPointIndex)) {\\r\\n return;\\r\\n }\\r\\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getElement(elementId);\\r\\n if (!element) {\\r\\n return;\\r\\n }\\r\\n const [x, y] = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getPointAtIndexGlobalCoordinates(element, hoverPointIndex);\\r\\n context.save();\\r\\n context.translate(renderConfig.scrollX, renderConfig.scrollY);\\r\\n context.fillStyle = \\\"rgba(105, 101, 219, 0.4)\\\";\\r\\n fillCircle(context, x, y, _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.POINT_HANDLE_SIZE / renderConfig.zoom.value, false);\\r\\n context.restore();\\r\\n};\\r\\nconst _renderScene = function (elements, appState, selectionElement, scale, rc, canvas, renderConfig // extra options passed to the renderer\\r\\n) {\\r\\n var _a;\\r\\n if (canvas === null) {\\r\\n return {\\r\\n atLeastOneVisibleElement: false\\r\\n };\\r\\n }\\r\\n const { renderScrollbars = true, renderSelection = true, renderGrid = true, isExporting } = renderConfig;\\r\\n const context = canvas.getContext(\\\"2d\\\");\\r\\n context.setTransform(1, 0, 0, 1, 0, 0);\\r\\n context.save();\\r\\n context.scale(scale, scale); // When doing calculations based on canvas width we should used normalized one\\r\\n const normalizedCanvasWidth = canvas.width / scale;\\r\\n const normalizedCanvasHeight = canvas.height / scale;\\r\\n if (isExporting && renderConfig.theme === \\\"dark\\\") {\\r\\n context.filter = _constants__WEBPACK_IMPORTED_MODULE_13__.THEME_FILTER;\\r\\n } // Paint background\\r\\n if (typeof renderConfig.viewBackgroundColor === \\\"string\\\") {\\r\\n const hasTransparence = renderConfig.viewBackgroundColor === \\\"transparent\\\" || renderConfig.viewBackgroundColor.length === 5 || // #RGBA\\r\\n renderConfig.viewBackgroundColor.length === 9 || // #RRGGBBA\\r\\n /(hsla|rgba)\\\\(/.test(renderConfig.viewBackgroundColor);\\r\\n if (hasTransparence) {\\r\\n context.clearRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\\r\\n }\\r\\n context.save();\\r\\n context.fillStyle = renderConfig.viewBackgroundColor;\\r\\n context.fillRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\\r\\n context.restore();\\r\\n }\\r\\n else {\\r\\n context.clearRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\\r\\n } // Apply zoom\\r\\n context.save();\\r\\n context.scale(renderConfig.zoom.value, renderConfig.zoom.value); // Grid\\r\\n if (renderGrid && appState.gridSize) {\\r\\n strokeGrid(context, appState.gridSize, -Math.ceil(renderConfig.zoom.value / appState.gridSize) * appState.gridSize + renderConfig.scrollX % appState.gridSize, -Math.ceil(renderConfig.zoom.value / appState.gridSize) * appState.gridSize + renderConfig.scrollY % appState.gridSize, normalizedCanvasWidth / renderConfig.zoom.value, normalizedCanvasHeight / renderConfig.zoom.value);\\r\\n } // Paint visible elements\\r\\n const visibleElements = elements.filter(function (element) {\\r\\n return isVisibleElement(element, normalizedCanvasWidth, normalizedCanvasHeight, {\\r\\n zoom: renderConfig.zoom,\\r\\n offsetLeft: appState.offsetLeft,\\r\\n offsetTop: appState.offsetTop,\\r\\n scrollX: renderConfig.scrollX,\\r\\n scrollY: renderConfig.scrollY\\r\\n });\\r\\n });\\r\\n visibleElements.forEach(function (element) {\\r\\n try {\\r\\n (0,_renderElement__WEBPACK_IMPORTED_MODULE_5__.renderElement)(element, rc, context, renderConfig);\\r\\n if (!isExporting) {\\r\\n renderLinkIcon(element, context, appState);\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n });\\r\\n if (appState.editingLinearElement) {\\r\\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getElement(appState.editingLinearElement.elementId);\\r\\n if (element) {\\r\\n renderLinearPointHandles(context, appState, renderConfig, element);\\r\\n }\\r\\n } // Paint selection element\\r\\n if (selectionElement) {\\r\\n try {\\r\\n (0,_renderElement__WEBPACK_IMPORTED_MODULE_5__.renderElement)(selectionElement, rc, context, renderConfig);\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n }\\r\\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_10__.isBindingEnabled)(appState)) {\\r\\n appState.suggestedBindings.filter(function (binding) {\\r\\n return binding != null;\\r\\n }).forEach(function (suggestedBinding) {\\r\\n renderBindingHighlight(context, renderConfig, suggestedBinding);\\r\\n });\\r\\n }\\r\\n if (appState.selectedLinearElement && appState.selectedLinearElement.hoverPointIndex !== -1) {\\r\\n renderLinearElementPointHighlight(context, appState, renderConfig);\\r\\n } // Paint selected elements\\r\\n if (renderSelection && !appState.multiElement && !appState.editingLinearElement) {\\r\\n const locallySelectedElements = (0,_scene_selection__WEBPACK_IMPORTED_MODULE_4__.getSelectedElements)(elements, appState);\\r\\n const locallySelectedIds = locallySelectedElements.map(function (element) {\\r\\n return element.id;\\r\\n });\\r\\n const isSingleLinearElementSelected = locallySelectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_15__.isLinearElement)(locallySelectedElements[0]); // render selected linear element points\\r\\n if (isSingleLinearElementSelected && ((_a = appState.selectedLinearElement) === null || _a === void 0 ? void 0 : _a.elementId) === locallySelectedElements[0].id && !locallySelectedElements[0].locked) {\\r\\n renderLinearPointHandles(context, appState, renderConfig, locallySelectedElements[0]); // render bounding box\\r\\n // (unless dragging a single linear element)\\r\\n }\\r\\n else if (!appState.draggingElement || !isSingleLinearElementSelected) {\\r\\n const selections = elements.reduce(function (acc, element) {\\r\\n const selectionColors = []; // local user\\r\\n if (locallySelectedIds.includes(element.id) && !(0,_groups__WEBPACK_IMPORTED_MODULE_8__.isSelectedViaGroup)(appState, element)) {\\r\\n selectionColors.push(open_color__WEBPACK_IMPORTED_MODULE_0__.black);\\r\\n } // remote users\\r\\n if (renderConfig.remoteSelectedElementIds[element.id]) {\\r\\n selectionColors.push(...renderConfig.remoteSelectedElementIds[element.id].map(function (socketId) {\\r\\n const { background } = (0,_clients__WEBPACK_IMPORTED_MODULE_6__.getClientColors)(socketId, appState);\\r\\n return background;\\r\\n }));\\r\\n }\\r\\n if (selectionColors.length) {\\r\\n const [elementX1, elementY1, elementX2, elementY2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\\r\\n acc.push({\\r\\n angle: element.angle,\\r\\n elementX1,\\r\\n elementY1,\\r\\n elementX2,\\r\\n elementY2,\\r\\n selectionColors\\r\\n });\\r\\n }\\r\\n return acc;\\r\\n }, []);\\r\\n const addSelectionForGroupId = function (groupId) {\\r\\n const groupElements = (0,_groups__WEBPACK_IMPORTED_MODULE_8__.getElementsInGroup)(elements, groupId);\\r\\n const [elementX1, elementY1, elementX2, elementY2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(groupElements);\\r\\n selections.push({\\r\\n angle: 0,\\r\\n elementX1,\\r\\n elementX2,\\r\\n elementY1,\\r\\n elementY2,\\r\\n selectionColors: [open_color__WEBPACK_IMPORTED_MODULE_0__.black]\\r\\n });\\r\\n };\\r\\n for (const groupId of (0,_groups__WEBPACK_IMPORTED_MODULE_8__.getSelectedGroupIds)(appState)) {\\r\\n // TODO: support multiplayer selected group IDs\\r\\n addSelectionForGroupId(groupId);\\r\\n }\\r\\n if (appState.editingGroupId) {\\r\\n addSelectionForGroupId(appState.editingGroupId);\\r\\n }\\r\\n selections.forEach(function (selection) {\\r\\n return renderSelectionBorder(context, renderConfig, selection);\\r\\n });\\r\\n } // Paint resize transformHandles\\r\\n context.save();\\r\\n context.translate(renderConfig.scrollX, renderConfig.scrollY);\\r\\n if (locallySelectedElements.length === 1) {\\r\\n context.fillStyle = open_color__WEBPACK_IMPORTED_MODULE_0__.white;\\r\\n const transformHandles = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getTransformHandles)(locallySelectedElements[0], renderConfig.zoom, \\\"mouse\\\" // when we render we don't know which pointer type so use mouse\\r\\n );\\r\\n if (!appState.viewModeEnabled && !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_15__.isLinearElement)(locallySelectedElements[0])) {\\r\\n renderTransformHandles(context, renderConfig, transformHandles, locallySelectedElements[0].angle);\\r\\n }\\r\\n }\\r\\n else if (locallySelectedElements.length > 1 && !appState.isRotating) {\\r\\n const dashedLinePadding = 4 / renderConfig.zoom.value;\\r\\n context.fillStyle = open_color__WEBPACK_IMPORTED_MODULE_0__.white;\\r\\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(locallySelectedElements);\\r\\n const initialLineDash = context.getLineDash();\\r\\n context.setLineDash([2 / renderConfig.zoom.value]);\\r\\n const lineWidth = context.lineWidth;\\r\\n context.lineWidth = 1 / renderConfig.zoom.value;\\r\\n strokeRectWithRotation(context, x1 - dashedLinePadding, y1 - dashedLinePadding, x2 - x1 + dashedLinePadding * 2, y2 - y1 + dashedLinePadding * 2, (x1 + x2) / 2, (y1 + y2) / 2, 0);\\r\\n context.lineWidth = lineWidth;\\r\\n context.setLineDash(initialLineDash);\\r\\n const transformHandles = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getTransformHandlesFromCoords)([x1, y1, x2, y2], 0, renderConfig.zoom, \\\"mouse\\\", _element__WEBPACK_IMPORTED_MODULE_1__.OMIT_SIDES_FOR_MULTIPLE_ELEMENTS);\\r\\n if (locallySelectedElements.some(function (element) {\\r\\n return !element.locked;\\r\\n })) {\\r\\n renderTransformHandles(context, renderConfig, transformHandles, 0);\\r\\n }\\r\\n }\\r\\n context.restore();\\r\\n } // Reset zoom\\r\\n context.restore(); // Paint remote pointers\\r\\n for (const clientId in renderConfig.remotePointerViewportCoords) {\\r\\n let { x, y } = renderConfig.remotePointerViewportCoords[clientId];\\r\\n x -= appState.offsetLeft;\\r\\n y -= appState.offsetTop;\\r\\n const width = 9;\\r\\n const height = 14;\\r\\n const isOutOfBounds = x < 0 || x > normalizedCanvasWidth - width || y < 0 || y > normalizedCanvasHeight - height;\\r\\n x = Math.max(x, 0);\\r\\n x = Math.min(x, normalizedCanvasWidth - width);\\r\\n y = Math.max(y, 0);\\r\\n y = Math.min(y, normalizedCanvasHeight - height);\\r\\n const { background, stroke } = (0,_clients__WEBPACK_IMPORTED_MODULE_6__.getClientColors)(clientId, appState);\\r\\n context.save();\\r\\n context.strokeStyle = stroke;\\r\\n context.fillStyle = background;\\r\\n const userState = renderConfig.remotePointerUserStates[clientId];\\r\\n if (isOutOfBounds || userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.AWAY) {\\r\\n context.globalAlpha = 0.48;\\r\\n }\\r\\n if (renderConfig.remotePointerButton && renderConfig.remotePointerButton[clientId] === \\\"down\\\") {\\r\\n context.beginPath();\\r\\n context.arc(x, y, 15, 0, 2 * Math.PI, false);\\r\\n context.lineWidth = 3;\\r\\n context.strokeStyle = \\\"#ffffff88\\\";\\r\\n context.stroke();\\r\\n context.closePath();\\r\\n context.beginPath();\\r\\n context.arc(x, y, 15, 0, 2 * Math.PI, false);\\r\\n context.lineWidth = 1;\\r\\n context.strokeStyle = stroke;\\r\\n context.stroke();\\r\\n context.closePath();\\r\\n }\\r\\n context.beginPath();\\r\\n context.moveTo(x, y);\\r\\n context.lineTo(x + 1, y + 14);\\r\\n context.lineTo(x + 4, y + 9);\\r\\n context.lineTo(x + 9, y + 10);\\r\\n context.lineTo(x, y);\\r\\n context.fill();\\r\\n context.stroke();\\r\\n const username = renderConfig.remotePointerUsernames[clientId];\\r\\n let idleState = \\\"\\\";\\r\\n if (userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.AWAY) {\\r\\n idleState = hasEmojiSupport ? \\\"⚫️\\\" : ` (${_types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.AWAY})`;\\r\\n }\\r\\n else if (userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.IDLE) {\\r\\n idleState = hasEmojiSupport ? \\\"💤\\\" : ` (${_types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.IDLE})`;\\r\\n }\\r\\n else if (userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.ACTIVE) {\\r\\n idleState = hasEmojiSupport ? \\\"🟢\\\" : \\\"\\\";\\r\\n }\\r\\n const usernameAndIdleState = `${username ? `${username} ` : \\\"\\\"}${idleState}`;\\r\\n if (!isOutOfBounds && usernameAndIdleState) {\\r\\n const offsetX = x + width;\\r\\n const offsetY = y + height;\\r\\n const paddingHorizontal = 4;\\r\\n const paddingVertical = 4;\\r\\n const measure = context.measureText(usernameAndIdleState);\\r\\n const measureHeight = measure.actualBoundingBoxDescent + measure.actualBoundingBoxAscent; // Border\\r\\n context.fillStyle = stroke;\\r\\n context.fillRect(offsetX - 1, offsetY - 1, measure.width + 2 * paddingHorizontal + 2, measureHeight + 2 * paddingVertical + 2); // Background\\r\\n context.fillStyle = background;\\r\\n context.fillRect(offsetX, offsetY, measure.width + 2 * paddingHorizontal, measureHeight + 2 * paddingVertical);\\r\\n context.fillStyle = open_color__WEBPACK_IMPORTED_MODULE_0__.white;\\r\\n context.fillText(usernameAndIdleState, offsetX + paddingHorizontal, offsetY + paddingVertical + measure.actualBoundingBoxAscent);\\r\\n }\\r\\n context.restore();\\r\\n context.closePath();\\r\\n } // Paint scrollbars\\r\\n let scrollBars;\\r\\n if (renderScrollbars) {\\r\\n scrollBars = (0,_scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__.getScrollBars)(elements, normalizedCanvasWidth, normalizedCanvasHeight, renderConfig);\\r\\n context.save();\\r\\n context.fillStyle = _scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__.SCROLLBAR_COLOR;\\r\\n context.strokeStyle = \\\"rgba(255,255,255,0.8)\\\";\\r\\n [scrollBars.horizontal, scrollBars.vertical].forEach(function (scrollBar) {\\r\\n if (scrollBar) {\\r\\n (0,_roundRect__WEBPACK_IMPORTED_MODULE_2__.roundRect)(context, scrollBar.x, scrollBar.y, scrollBar.width, scrollBar.height, _scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__.SCROLLBAR_WIDTH / 2);\\r\\n }\\r\\n });\\r\\n context.restore();\\r\\n }\\r\\n context.restore();\\r\\n return {\\r\\n atLeastOneVisibleElement: visibleElements.length > 0,\\r\\n scrollBars\\r\\n };\\r\\n};\\r\\nconst renderSceneThrottled = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.throttleRAF)(function (elements, appState, selectionElement, scale, rc, canvas, renderConfig, callback) {\\r\\n const ret = _renderScene(elements, appState, selectionElement, scale, rc, canvas, renderConfig);\\r\\n callback === null || callback === void 0 ? void 0 : callback(ret);\\r\\n}, {\\r\\n trailing: true\\r\\n});\\r\\n/** renderScene throttled to animation framerate */\\r\\nconst renderScene = function (elements, appState, selectionElement, scale, rc, canvas, renderConfig, callback, throttle) {\\r\\n if (throttle) {\\r\\n renderSceneThrottled(elements, appState, selectionElement, scale, rc, canvas, renderConfig, callback);\\r\\n return undefined;\\r\\n }\\r\\n const ret = _renderScene(elements, appState, selectionElement, scale, rc, canvas, renderConfig);\\r\\n callback === null || callback === void 0 ? void 0 : callback(ret);\\r\\n return ret;\\r\\n};\\r\\nconst renderTransformHandles = function (context, renderConfig, transformHandles, angle) {\\r\\n Object.keys(transformHandles).forEach(function (key) {\\r\\n const transformHandle = transformHandles[key];\\r\\n if (transformHandle !== undefined) {\\r\\n context.save();\\r\\n context.lineWidth = 1 / renderConfig.zoom.value;\\r\\n if (key === \\\"rotation\\\") {\\r\\n fillCircle(context, transformHandle[0] + transformHandle[2] / 2, transformHandle[1] + transformHandle[3] / 2, transformHandle[2] / 2);\\r\\n }\\r\\n else {\\r\\n strokeRectWithRotation(context, transformHandle[0], transformHandle[1], transformHandle[2], transformHandle[3], transformHandle[0] + transformHandle[2] / 2, transformHandle[1] + transformHandle[3] / 2, angle, true // fill before stroke\\r\\n );\\r\\n }\\r\\n context.restore();\\r\\n }\\r\\n });\\r\\n};\\r\\nconst renderSelectionBorder = function (context, renderConfig, elementProperties) {\\r\\n const { angle, elementX1, elementY1, elementX2, elementY2, selectionColors } = elementProperties;\\r\\n const elementWidth = elementX2 - elementX1;\\r\\n const elementHeight = elementY2 - elementY1;\\r\\n const dashedLinePadding = 4 / renderConfig.zoom.value;\\r\\n const dashWidth = 8 / renderConfig.zoom.value;\\r\\n const spaceWidth = 4 / renderConfig.zoom.value;\\r\\n context.save();\\r\\n context.translate(renderConfig.scrollX, renderConfig.scrollY);\\r\\n context.lineWidth = 1 / renderConfig.zoom.value;\\r\\n const count = selectionColors.length;\\r\\n for (let index = 0; index < count; ++index) {\\r\\n context.strokeStyle = selectionColors[index];\\r\\n context.setLineDash([dashWidth, spaceWidth + (dashWidth + spaceWidth) * (count - 1)]);\\r\\n context.lineDashOffset = (dashWidth + spaceWidth) * index;\\r\\n strokeRectWithRotation(context, elementX1 - dashedLinePadding, elementY1 - dashedLinePadding, elementWidth + dashedLinePadding * 2, elementHeight + dashedLinePadding * 2, elementX1 + elementWidth / 2, elementY1 + elementHeight / 2, angle);\\r\\n }\\r\\n context.restore();\\r\\n};\\r\\nconst renderBindingHighlight = function (context, renderConfig, suggestedBinding) {\\r\\n const renderHighlight = Array.isArray(suggestedBinding) ? renderBindingHighlightForSuggestedPointBinding : renderBindingHighlightForBindableElement;\\r\\n context.save();\\r\\n context.translate(renderConfig.scrollX, renderConfig.scrollY);\\r\\n renderHighlight(context, suggestedBinding);\\r\\n context.restore();\\r\\n};\\r\\nconst renderBindingHighlightForBindableElement = function (context, element) {\\r\\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\\r\\n const width = x2 - x1;\\r\\n const height = y2 - y1;\\r\\n const threshold = (0,_element_collision__WEBPACK_IMPORTED_MODULE_9__.maxBindingGap)(element, width, height); // So that we don't overlap the element itself\\r\\n const strokeOffset = 4;\\r\\n context.strokeStyle = \\\"rgba(0,0,0,.05)\\\";\\r\\n context.lineWidth = threshold - strokeOffset;\\r\\n const padding = strokeOffset / 2 + threshold / 2;\\r\\n switch (element.type) {\\r\\n case \\\"rectangle\\\":\\r\\n case \\\"text\\\":\\r\\n case \\\"image\\\":\\r\\n strokeRectWithRotation(context, x1 - padding, y1 - padding, width + padding * 2, height + padding * 2, x1 + width / 2, y1 + height / 2, element.angle);\\r\\n break;\\r\\n case \\\"diamond\\\":\\r\\n const side = Math.hypot(width, height);\\r\\n const wPadding = padding * side / height;\\r\\n const hPadding = padding * side / width;\\r\\n strokeDiamondWithRotation(context, width + wPadding * 2, height + hPadding * 2, x1 + width / 2, y1 + height / 2, element.angle);\\r\\n break;\\r\\n case \\\"ellipse\\\":\\r\\n strokeEllipseWithRotation(context, width + padding * 2, height + padding * 2, x1 + width / 2, y1 + height / 2, element.angle);\\r\\n break;\\r\\n }\\r\\n};\\r\\nconst renderBindingHighlightForSuggestedPointBinding = function (context, suggestedBinding) {\\r\\n const [element, startOrEnd, bindableElement] = suggestedBinding;\\r\\n const threshold = (0,_element_collision__WEBPACK_IMPORTED_MODULE_9__.maxBindingGap)(bindableElement, bindableElement.width, bindableElement.height);\\r\\n context.strokeStyle = \\\"rgba(0,0,0,0)\\\";\\r\\n context.fillStyle = \\\"rgba(0,0,0,.05)\\\";\\r\\n const pointIndices = startOrEnd === \\\"both\\\" ? [0, -1] : startOrEnd === \\\"start\\\" ? [0] : [-1];\\r\\n pointIndices.forEach(function (index) {\\r\\n const [x, y] = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getPointAtIndexGlobalCoordinates(element, index);\\r\\n fillCircle(context, x, y, threshold);\\r\\n });\\r\\n};\\r\\nlet linkCanvasCache;\\r\\nconst renderLinkIcon = function (element, context, appState) {\\r\\n if (element.link && !appState.selectedElementIds[element.id]) {\\r\\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\\r\\n const [x, y, width, height] = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_14__.getLinkHandleFromCoords)([x1, y1, x2, y2], element.angle, appState);\\r\\n const centerX = x + width / 2;\\r\\n const centerY = y + height / 2;\\r\\n context.save();\\r\\n context.translate(appState.scrollX + centerX, appState.scrollY + centerY);\\r\\n context.rotate(element.angle);\\r\\n if (!linkCanvasCache || linkCanvasCache.zoom !== appState.zoom.value) {\\r\\n linkCanvasCache = document.createElement(\\\"canvas\\\");\\r\\n linkCanvasCache.zoom = appState.zoom.value;\\r\\n linkCanvasCache.width = width * window.devicePixelRatio * appState.zoom.value;\\r\\n linkCanvasCache.height = height * window.devicePixelRatio * appState.zoom.value;\\r\\n const linkCanvasCacheContext = linkCanvasCache.getContext(\\\"2d\\\");\\r\\n linkCanvasCacheContext.scale(window.devicePixelRatio * appState.zoom.value, window.devicePixelRatio * appState.zoom.value);\\r\\n /*linkCanvasCacheContext.fillStyle = \\\"#fff\\\"; //zsviczian\\r\\n linkCanvasCacheContext.fillRect(0, 0, width, height);*/\\r\\n //zsviczian\\r\\n //linkCanvasCacheContext.globalAlpha = appState.linkOpacity; //zsviczian\\r\\n linkCanvasCacheContext.drawImage(_element_Hyperlink__WEBPACK_IMPORTED_MODULE_14__.EXTERNAL_LINK_IMG, 0, 0, width, height);\\r\\n linkCanvasCacheContext.restore();\\r\\n context.globalAlpha = appState.linkOpacity; //zsviczian\\r\\n context.drawImage(linkCanvasCache, x - centerX, y - centerY, width, height);\\r\\n }\\r\\n else {\\r\\n context.globalAlpha = appState.linkOpacity; //zsviczian\\r\\n context.drawImage(linkCanvasCache, x - centerX, y - centerY, width, height);\\r\\n }\\r\\n context.restore();\\r\\n }\\r\\n};\\r\\nconst isVisibleElement = function (element, canvasWidth, canvasHeight, viewTransformations) {\\r\\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getElementBounds)(element); // scene coordinates\\r\\n const topLeftSceneCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.viewportCoordsToSceneCoords)({\\r\\n clientX: viewTransformations.offsetLeft,\\r\\n clientY: viewTransformations.offsetTop\\r\\n }, viewTransformations);\\r\\n const bottomRightSceneCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.viewportCoordsToSceneCoords)({\\r\\n clientX: viewTransformations.offsetLeft + canvasWidth,\\r\\n clientY: viewTransformations.offsetTop + canvasHeight\\r\\n }, viewTransformations);\\r\\n return topLeftSceneCoords.x <= x2 && topLeftSceneCoords.y <= y2 && bottomRightSceneCoords.x >= x1 && bottomRightSceneCoords.y >= y1;\\r\\n}; // This should be only called for exporting purposes\\r\\nconst renderSceneToSvg = function (elements, rsvg, svgRoot, files) {\\r\\n let { offsetX = 0, offsetY = 0, exportWithDarkMode = false } = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};\\r\\n if (!svgRoot) {\\r\\n return;\\r\\n } // render elements\\r\\n elements.forEach(function (element) {\\r\\n if (!element.isDeleted) {\\r\\n try {\\r\\n (0,_renderElement__WEBPACK_IMPORTED_MODULE_5__.renderElementToSvg)(element, rsvg, svgRoot, files, element.x + offsetX, element.y + offsetY, exportWithDarkMode);\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n }\\r\\n });\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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TyxFQUFFLEtBQUs7SUFDdEUsSUFBSSxFQUNGLE9BQU8sR0FBRyxDQUFDLEVBQ1gsT0FBTyxHQUFHLENBQUMsRUFDWCxrQkFBa0IsR0FBRyxLQUFLLEVBQzNCLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFM0UsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUNaLE9BQU87S0FDUixDQUFDLGtCQUFrQjtJQUdwQixRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsT0FBTztRQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUN0QixJQUFJO2dCQUNGLGtFQUFrQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2FBQ2pIO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtTQUNGO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vcmVuZGVyZXIvcmVuZGVyU2NlbmUudHM/ZTU5NSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb2MgZnJvbSBcIm9wZW4tY29sb3JcIjtcbmltcG9ydCB7IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcywgT01JVF9TSURFU19GT1JfTVVMVElQTEVfRUxFTUVOVFMsIGdldFRyYW5zZm9ybUhhbmRsZXNGcm9tQ29vcmRzLCBnZXRUcmFuc2Zvcm1IYW5kbGVzLCBnZXRFbGVtZW50Qm91bmRzLCBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgcm91bmRSZWN0IH0gZnJvbSBcIi4vcm91bmRSZWN0XCI7XG5pbXBvcnQgeyBnZXRTY3JvbGxCYXJzLCBTQ1JPTExCQVJfQ09MT1IsIFNDUk9MTEJBUl9XSURUSCB9IGZyb20gXCIuLi9zY2VuZS9zY3JvbGxiYXJzXCI7XG5pbXBvcnQgeyBnZXRTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSBcIi4uL3NjZW5lL3NlbGVjdGlvblwiO1xuaW1wb3J0IHsgcmVuZGVyRWxlbWVudCwgcmVuZGVyRWxlbWVudFRvU3ZnIH0gZnJvbSBcIi4vcmVuZGVyRWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0Q2xpZW50Q29sb3JzIH0gZnJvbSBcIi4uL2NsaWVudHNcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBpc1NlbGVjdGVkVmlhR3JvdXAsIGdldFNlbGVjdGVkR3JvdXBJZHMsIGdldEVsZW1lbnRzSW5Hcm91cCB9IGZyb20gXCIuLi9ncm91cHNcIjtcbmltcG9ydCB7IG1heEJpbmRpbmdHYXAgfSBmcm9tIFwiLi4vZWxlbWVudC9jb2xsaXNpb25cIjtcbmltcG9ydCB7IGlzQmluZGluZ0VuYWJsZWQgfSBmcm9tIFwiLi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMsIHN1cHBvcnRzRW1vamksIHRocm90dGxlUkFGIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBVc2VySWRsZVN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBUSEVNRV9GSUxURVIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBFWFRFUk5BTF9MSU5LX0lNRywgZ2V0TGlua0hhbmRsZUZyb21Db29yZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9IeXBlcmxpbmtcIjtcbmltcG9ydCB7IGlzTGluZWFyRWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmNvbnN0IGhhc0Vtb2ppU3VwcG9ydCA9IHN1cHBvcnRzRW1vamkoKTtcblxuY29uc3Qgc3Ryb2tlUmVjdFdpdGhSb3RhdGlvbiA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjeCwgY3ksIGFuZ2xlKSB7XG4gIGxldCBmaWxsID0gYXJndW1lbnRzLmxlbmd0aCA+IDggJiYgYXJndW1lbnRzWzhdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbOF0gOiBmYWxzZTtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKGN4LCBjeSk7XG4gIGNvbnRleHQucm90YXRlKGFuZ2xlKTtcblxuICBpZiAoZmlsbCkge1xuICAgIGNvbnRleHQuZmlsbFJlY3QoeCAtIGN4LCB5IC0gY3ksIHdpZHRoLCBoZWlnaHQpO1xuICB9XG5cbiAgY29udGV4dC5zdHJva2VSZWN0KHggLSBjeCwgeSAtIGN5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgY29udGV4dC5yZXN0b3JlKCk7XG59O1xuXG5jb25zdCBzdHJva2VEaWFtb25kV2l0aFJvdGF0aW9uID0gZnVuY3Rpb24gKGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGN4LCBjeSwgYW5nbGUpIHtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKGN4LCBjeSk7XG4gIGNvbnRleHQucm90YXRlKGFuZ2xlKTtcbiAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY29udGV4dC5tb3ZlVG8oMCwgaGVpZ2h0IC8gMik7XG4gIGNvbnRleHQubGluZVRvKHdpZHRoIC8gMiwgMCk7XG4gIGNvbnRleHQubGluZVRvKDAsIC1oZWlnaHQgLyAyKTtcbiAgY29udGV4dC5saW5lVG8oLXdpZHRoIC8gMiwgMCk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIGNvbnRleHQuc3Ryb2tlKCk7XG4gIGNvbnRleHQucmVzdG9yZSgpO1xufTtcblxuY29uc3Qgc3Ryb2tlRWxsaXBzZVdpdGhSb3RhdGlvbiA9IGZ1bmN0aW9uIChjb250ZXh0LCB3aWR0aCwgaGVpZ2h0LCBjeCwgY3ksIGFuZ2xlKSB7XG4gIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIGNvbnRleHQuZWxsaXBzZShjeCwgY3ksIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgYW5nbGUsIDAsIE1hdGguUEkgKiAyKTtcbiAgY29udGV4dC5zdHJva2UoKTtcbn07XG5cbmNvbnN0IGZpbGxDaXJjbGUgPSBmdW5jdGlvbiAoY29udGV4dCwgY3gsIGN5LCByYWRpdXMpIHtcbiAgbGV0IHN0cm9rZSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY29udGV4dC5hcmMoY3gsIGN5LCByYWRpdXMsIDAsIE1hdGguUEkgKiAyKTtcbiAgY29udGV4dC5maWxsKCk7XG5cbiAgaWYgKHN0cm9rZSkge1xuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gIH1cbn07XG5cbmNvbnN0IHN0cm9rZUdyaWQgPSBmdW5jdGlvbiAoY29udGV4dCwgZ3JpZFNpemUsIG9mZnNldFgsIG9mZnNldFksIHdpZHRoLCBoZWlnaHQpIHtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYmEoMCwwLDAsMC4xKVwiO1xuICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuXG4gIGZvciAobGV0IHggPSBvZmZzZXRYOyB4IDwgb2Zmc2V0WCArIHdpZHRoICsgZ3JpZFNpemUgKiAyOyB4ICs9IGdyaWRTaXplKSB7XG4gICAgY29udGV4dC5tb3ZlVG8oeCwgb2Zmc2V0WSAtIGdyaWRTaXplKTtcbiAgICBjb250ZXh0LmxpbmVUbyh4LCBvZmZzZXRZICsgaGVpZ2h0ICsgZ3JpZFNpemUgKiAyKTtcbiAgfVxuXG4gIGZvciAobGV0IHkgPSBvZmZzZXRZOyB5IDwgb2Zmc2V0WSArIGhlaWdodCArIGdyaWRTaXplICogMjsgeSArPSBncmlkU2l6ZSkge1xuICAgIGNvbnRleHQubW92ZVRvKG9mZnNldFggLSBncmlkU2l6ZSwgeSk7XG4gICAgY29udGV4dC5saW5lVG8ob2Zmc2V0WCArIHdpZHRoICsgZ3JpZFNpemUgKiAyLCB5KTtcbiAgfVxuXG4gIGNvbnRleHQuc3Ryb2tlKCk7XG4gIGNvbnRleHQucmVzdG9yZSgpO1xufTtcblxuY29uc3QgcmVuZGVyTGluZWFyUG9pbnRIYW5kbGVzID0gZnVuY3Rpb24gKGNvbnRleHQsIGFwcFN0YXRlLCByZW5kZXJDb25maWcsIGVsZW1lbnQpIHtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKHJlbmRlckNvbmZpZy5zY3JvbGxYLCByZW5kZXJDb25maWcuc2Nyb2xsWSk7XG4gIGNvbnRleHQubGluZVdpZHRoID0gMSAvIHJlbmRlckNvbmZpZy56b29tLnZhbHVlO1xuICBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50c0dsb2JhbENvb3JkaW5hdGVzKGVsZW1lbnQpLmZvckVhY2goZnVuY3Rpb24gKHBvaW50LCBpZHgpIHtcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gXCIjNWU1YWQ4XCI7XG4gICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudD8uc2VsZWN0ZWRQb2ludHNJbmRpY2VzPy5pbmNsdWRlcyhpZHgpID8gXCJyZ2JhKDEzNCwgMTMxLCAyMjYsIDAuOSlcIiA6IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpXCI7XG4gICAgY29uc3Qge1xuICAgICAgUE9JTlRfSEFORExFX1NJWkVcbiAgICB9ID0gTGluZWFyRWxlbWVudEVkaXRvcjtcbiAgICBjb25zdCByYWRpdXMgPSBhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCA/IFBPSU5UX0hBTkRMRV9TSVpFIDogUE9JTlRfSEFORExFX1NJWkUgLyAyO1xuICAgIGZpbGxDaXJjbGUoY29udGV4dCwgcG9pbnRbMF0sIHBvaW50WzFdLCByYWRpdXMgLyByZW5kZXJDb25maWcuem9vbS52YWx1ZSk7XG4gIH0pO1xuICBjb250ZXh0LnJlc3RvcmUoKTtcbn07XG5cbmNvbnN0IHJlbmRlckxpbmVhckVsZW1lbnRQb2ludEhpZ2hsaWdodCA9IGZ1bmN0aW9uIChjb250ZXh0LCBhcHBTdGF0ZSwgcmVuZGVyQ29uZmlnKSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgaG92ZXJQb2ludEluZGV4XG4gIH0gPSBhcHBTdGF0ZS5zZWxlY3RlZExpbmVhckVsZW1lbnQ7XG5cbiAgaWYgKGFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50Py5zZWxlY3RlZFBvaW50c0luZGljZXM/LmluY2x1ZGVzKGhvdmVyUG9pbnRJbmRleCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBlbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFbGVtZW50KGVsZW1lbnRJZCk7XG5cbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgW3gsIHldID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEF0SW5kZXhHbG9iYWxDb29yZGluYXRlcyhlbGVtZW50LCBob3ZlclBvaW50SW5kZXgpO1xuICBjb250ZXh0LnNhdmUoKTtcbiAgY29udGV4dC50cmFuc2xhdGUocmVuZGVyQ29uZmlnLnNjcm9sbFgsIHJlbmRlckNvbmZpZy5zY3JvbGxZKTtcbiAgY29udGV4dC5maWxsU3R5bGUgPSBcInJnYmEoMTA1LCAxMDEsIDIxOSwgMC40KVwiO1xuICBmaWxsQ2lyY2xlKGNvbnRleHQsIHgsIHksIExpbmVhckVsZW1lbnRFZGl0b3IuUE9JTlRfSEFORExFX1NJWkUgLyByZW5kZXJDb25maWcuem9vbS52YWx1ZSwgZmFsc2UpO1xuICBjb250ZXh0LnJlc3RvcmUoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBfcmVuZGVyU2NlbmUgPSBmdW5jdGlvbiAoZWxlbWVudHMsIGFwcFN0YXRlLCBzZWxlY3Rpb25FbGVtZW50LCBzY2FsZSwgcmMsIGNhbnZhcywgcmVuZGVyQ29uZmlnIC8vIGV4dHJhIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSByZW5kZXJlclxuKSB7XG4gIGlmIChjYW52YXMgPT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXRMZWFzdE9uZVZpc2libGVFbGVtZW50OiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBjb25zdCB7XG4gICAgcmVuZGVyU2Nyb2xsYmFycyA9IHRydWUsXG4gICAgcmVuZGVyU2VsZWN0aW9uID0gdHJ1ZSxcbiAgICByZW5kZXJHcmlkID0gdHJ1ZSxcbiAgICBpc0V4cG9ydGluZ1xuICB9ID0gcmVuZGVyQ29uZmlnO1xuICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gIGNvbnRleHQuc2F2ZSgpO1xuICBjb250ZXh0LnNjYWxlKHNjYWxlLCBzY2FsZSk7IC8vIFdoZW4gZG9pbmcgY2FsY3VsYXRpb25zIGJhc2VkIG9uIGNhbnZhcyB3aWR0aCB3ZSBzaG91bGQgdXNlZCBub3JtYWxpemVkIG9uZVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRDYW52YXNXaWR0aCA9IGNhbnZhcy53aWR0aCAvIHNjYWxlO1xuICBjb25zdCBub3JtYWxpemVkQ2FudmFzSGVpZ2h0ID0gY2FudmFzLmhlaWdodCAvIHNjYWxlO1xuXG4gIGlmIChpc0V4cG9ydGluZyAmJiByZW5kZXJDb25maWcudGhlbWUgPT09IFwiZGFya1wiKSB7XG4gICAgY29udGV4dC5maWx0ZXIgPSBUSEVNRV9GSUxURVI7XG4gIH0gLy8gUGFpbnQgYmFja2dyb3VuZFxuXG5cbiAgaWYgKHR5cGVvZiByZW5kZXJDb25maWcudmlld0JhY2tncm91bmRDb2xvciA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGhhc1RyYW5zcGFyZW5jZSA9IHJlbmRlckNvbmZpZy52aWV3QmFja2dyb3VuZENvbG9yID09PSBcInRyYW5zcGFyZW50XCIgfHwgcmVuZGVyQ29uZmlnLnZpZXdCYWNrZ3JvdW5kQ29sb3IubGVuZ3RoID09PSA1IHx8IC8vICNSR0JBXG4gICAgcmVuZGVyQ29uZmlnLnZpZXdCYWNrZ3JvdW5kQ29sb3IubGVuZ3RoID09PSA5IHx8IC8vICNSUkdHQkJBXG4gICAgLyhoc2xhfHJnYmEpXFwoLy50ZXN0KHJlbmRlckNvbmZpZy52aWV3QmFja2dyb3VuZENvbG9yKTtcblxuICAgIGlmIChoYXNUcmFuc3BhcmVuY2UpIHtcbiAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIG5vcm1hbGl6ZWRDYW52YXNXaWR0aCwgbm9ybWFsaXplZENhbnZhc0hlaWdodCk7XG4gICAgfVxuXG4gICAgY29udGV4dC5zYXZlKCk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSByZW5kZXJDb25maWcudmlld0JhY2tncm91bmRDb2xvcjtcbiAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIG5vcm1hbGl6ZWRDYW52YXNXaWR0aCwgbm9ybWFsaXplZENhbnZhc0hlaWdodCk7XG4gICAgY29udGV4dC5yZXN0b3JlKCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgbm9ybWFsaXplZENhbnZhc1dpZHRoLCBub3JtYWxpemVkQ2FudmFzSGVpZ2h0KTtcbiAgfSAvLyBBcHBseSB6b29tXG5cblxuICBjb250ZXh0LnNhdmUoKTtcbiAgY29udGV4dC5zY2FsZShyZW5kZXJDb25maWcuem9vbS52YWx1ZSwgcmVuZGVyQ29uZmlnLnpvb20udmFsdWUpOyAvLyBHcmlkXG5cbiAgaWYgKHJlbmRlckdyaWQgJiYgYXBwU3RhdGUuZ3JpZFNpemUpIHtcbiAgICBzdHJva2VHcmlkKGNvbnRleHQsIGFwcFN0YXRlLmdyaWRTaXplLCAtTWF0aC5jZWlsKHJlbmRlckNvbmZpZy56b29tLnZhbHVlIC8gYXBwU3RhdGUuZ3JpZFNpemUpICogYXBwU3RhdGUuZ3JpZFNpemUgKyByZW5kZXJDb25maWcuc2Nyb2xsWCAlIGFwcFN0YXRlLmdyaWRTaXplLCAtTWF0aC5jZWlsKHJlbmRlckNvbmZpZy56b29tLnZhbHVlIC8gYXBwU3RhdGUuZ3JpZFNpemUpICogYXBwU3RhdGUuZ3JpZFNpemUgKyByZW5kZXJDb25maWcuc2Nyb2xsWSAlIGFwcFN0YXRlLmdyaWRTaXplLCBub3JtYWxpemVkQ2FudmFzV2lkdGggLyByZW5kZXJDb25maWcuem9vbS52YWx1ZSwgbm9ybWFsaXplZENhbnZhc0hlaWdodCAvIHJlbmRlckNvbmZpZy56b29tLnZhbHVlKTtcbiAgfSAvLyBQYWludCB2aXNpYmxlIGVsZW1lbnRzXG5cblxuICBjb25zdCB2aXNpYmxlRWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gaXNWaXNpYmxlRWxlbWVudChlbGVtZW50LCBub3JtYWxpemVkQ2FudmFzV2lkdGgsIG5vcm1hbGl6ZWRDYW52YXNIZWlnaHQsIHtcbiAgICAgIHpvb206IHJlbmRlckNvbmZpZy56b29tLFxuICAgICAgb2Zmc2V0TGVmdDogYXBwU3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgIG9mZnNldFRvcDogYXBwU3RhdGUub2Zmc2V0VG9wLFxuICAgICAgc2Nyb2xsWDogcmVuZGVyQ29uZmlnLnNjcm9sbFgsXG4gICAgICBzY3JvbGxZOiByZW5kZXJDb25maWcuc2Nyb2xsWVxuICAgIH0pO1xuICB9KTtcbiAgdmlzaWJsZUVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICB0cnkge1xuICAgICAgcmVuZGVyRWxlbWVudChlbGVtZW50LCByYywgY29udGV4dCwgcmVuZGVyQ29uZmlnKTtcblxuICAgICAgaWYgKCFpc0V4cG9ydGluZykge1xuICAgICAgICByZW5kZXJMaW5rSWNvbihlbGVtZW50LCBjb250ZXh0LCBhcHBTdGF0ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudChhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQpO1xuXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJlbmRlckxpbmVhclBvaW50SGFuZGxlcyhjb250ZXh0LCBhcHBTdGF0ZSwgcmVuZGVyQ29uZmlnLCBlbGVtZW50KTtcbiAgICB9XG4gIH0gLy8gUGFpbnQgc2VsZWN0aW9uIGVsZW1lbnRcblxuXG4gIGlmIChzZWxlY3Rpb25FbGVtZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlbmRlckVsZW1lbnQoc2VsZWN0aW9uRWxlbWVudCwgcmMsIGNvbnRleHQsIHJlbmRlckNvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc0JpbmRpbmdFbmFibGVkKGFwcFN0YXRlKSkge1xuICAgIGFwcFN0YXRlLnN1Z2dlc3RlZEJpbmRpbmdzLmZpbHRlcihmdW5jdGlvbiAoYmluZGluZykge1xuICAgICAgcmV0dXJuIGJpbmRpbmcgIT0gbnVsbDtcbiAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChzdWdnZXN0ZWRCaW5kaW5nKSB7XG4gICAgICByZW5kZXJCaW5kaW5nSGlnaGxpZ2h0KGNvbnRleHQsIHJlbmRlckNvbmZpZywgc3VnZ2VzdGVkQmluZGluZyk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoYXBwU3RhdGUuc2VsZWN0ZWRMaW5lYXJFbGVtZW50ICYmIGFwcFN0YXRlLnNlbGVjdGVkTGluZWFyRWxlbWVudC5ob3ZlclBvaW50SW5kZXggIT09IC0xKSB7XG4gICAgcmVuZGVyTGluZWFyRWxlbWVudFBvaW50SGlnaGxpZ2h0KGNvbnRleHQsIGFwcFN0YXRlLCByZW5kZXJDb25maWcpO1xuICB9IC8vIFBhaW50IHNlbGVjdGVkIGVsZW1lbnRzXG5cblxuICBpZiAocmVuZGVyU2VsZWN0aW9uICYmICFhcHBTdGF0ZS5tdWx0aUVsZW1lbnQgJiYgIWFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgY29uc3QgbG9jYWxseVNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBhcHBTdGF0ZSk7XG4gICAgY29uc3QgbG9jYWxseVNlbGVjdGVkSWRzID0gbG9jYWxseVNlbGVjdGVkRWxlbWVudHMubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5pZDtcbiAgICB9KTtcbiAgICBjb25zdCBpc1NpbmdsZUxpbmVhckVsZW1lbnRTZWxlY3RlZCA9IGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0xpbmVhckVsZW1lbnQobG9jYWxseVNlbGVjdGVkRWxlbWVudHNbMF0pOyAvLyByZW5kZXIgc2VsZWN0ZWQgbGluZWFyIGVsZW1lbnQgcG9pbnRzXG5cbiAgICBpZiAoaXNTaW5nbGVMaW5lYXJFbGVtZW50U2VsZWN0ZWQgJiYgYXBwU3RhdGUuc2VsZWN0ZWRMaW5lYXJFbGVtZW50Py5lbGVtZW50SWQgPT09IGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzWzBdLmlkICYmICFsb2NhbGx5U2VsZWN0ZWRFbGVtZW50c1swXS5sb2NrZWQpIHtcbiAgICAgIHJlbmRlckxpbmVhclBvaW50SGFuZGxlcyhjb250ZXh0LCBhcHBTdGF0ZSwgcmVuZGVyQ29uZmlnLCBsb2NhbGx5U2VsZWN0ZWRFbGVtZW50c1swXSk7IC8vIHJlbmRlciBib3VuZGluZyBib3hcbiAgICAgIC8vICh1bmxlc3MgZHJhZ2dpbmcgYSBzaW5nbGUgbGluZWFyIGVsZW1lbnQpXG4gICAgfSBlbHNlIGlmICghYXBwU3RhdGUuZHJhZ2dpbmdFbGVtZW50IHx8ICFpc1NpbmdsZUxpbmVhckVsZW1lbnRTZWxlY3RlZCkge1xuICAgICAgY29uc3Qgc2VsZWN0aW9ucyA9IGVsZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbG9ycyA9IFtdOyAvLyBsb2NhbCB1c2VyXG5cbiAgICAgICAgaWYgKGxvY2FsbHlTZWxlY3RlZElkcy5pbmNsdWRlcyhlbGVtZW50LmlkKSAmJiAhaXNTZWxlY3RlZFZpYUdyb3VwKGFwcFN0YXRlLCBlbGVtZW50KSkge1xuICAgICAgICAgIHNlbGVjdGlvbkNvbG9ycy5wdXNoKG9jLmJsYWNrKTtcbiAgICAgICAgfSAvLyByZW1vdGUgdXNlcnNcblxuXG4gICAgICAgIGlmIChyZW5kZXJDb25maWcucmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2VsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgc2VsZWN0aW9uQ29sb3JzLnB1c2goLi4ucmVuZGVyQ29uZmlnLnJlbW90ZVNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXS5tYXAoZnVuY3Rpb24gKHNvY2tldElkKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGJhY2tncm91bmRcbiAgICAgICAgICAgIH0gPSBnZXRDbGllbnRDb2xvcnMoc29ja2V0SWQsIGFwcFN0YXRlKTtcbiAgICAgICAgICAgIHJldHVybiBiYWNrZ3JvdW5kO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3Rpb25Db2xvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgW2VsZW1lbnRYMSwgZWxlbWVudFkxLCBlbGVtZW50WDIsIGVsZW1lbnRZMl0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgICAgICAgYWNjLnB1c2goe1xuICAgICAgICAgICAgYW5nbGU6IGVsZW1lbnQuYW5nbGUsXG4gICAgICAgICAgICBlbGVtZW50WDEsXG4gICAgICAgICAgICBlbGVtZW50WTEsXG4gICAgICAgICAgICBlbGVtZW50WDIsXG4gICAgICAgICAgICBlbGVtZW50WTIsXG4gICAgICAgICAgICBzZWxlY3Rpb25Db2xvcnNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSk7XG5cbiAgICAgIGNvbnN0IGFkZFNlbGVjdGlvbkZvckdyb3VwSWQgPSBmdW5jdGlvbiAoZ3JvdXBJZCkge1xuICAgICAgICBjb25zdCBncm91cEVsZW1lbnRzID0gZ2V0RWxlbWVudHNJbkdyb3VwKGVsZW1lbnRzLCBncm91cElkKTtcbiAgICAgICAgY29uc3QgW2VsZW1lbnRYMSwgZWxlbWVudFkxLCBlbGVtZW50WDIsIGVsZW1lbnRZMl0gPSBnZXRDb21tb25Cb3VuZHMoZ3JvdXBFbGVtZW50cyk7XG4gICAgICAgIHNlbGVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgYW5nbGU6IDAsXG4gICAgICAgICAgZWxlbWVudFgxLFxuICAgICAgICAgIGVsZW1lbnRYMixcbiAgICAgICAgICBlbGVtZW50WTEsXG4gICAgICAgICAgZWxlbWVudFkyLFxuICAgICAgICAgIHNlbGVjdGlvbkNvbG9yczogW29jLmJsYWNrXVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgZ3JvdXBJZCBvZiBnZXRTZWxlY3RlZEdyb3VwSWRzKGFwcFN0YXRlKSkge1xuICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG11bHRpcGxheWVyIHNlbGVjdGVkIGdyb3VwIElEc1xuICAgICAgICBhZGRTZWxlY3Rpb25Gb3JHcm91cElkKGdyb3VwSWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXBwU3RhdGUuZWRpdGluZ0dyb3VwSWQpIHtcbiAgICAgICAgYWRkU2VsZWN0aW9uRm9yR3JvdXBJZChhcHBTdGF0ZS5lZGl0aW5nR3JvdXBJZCk7XG4gICAgICB9XG5cbiAgICAgIHNlbGVjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiByZW5kZXJTZWxlY3Rpb25Cb3JkZXIoY29udGV4dCwgcmVuZGVyQ29uZmlnLCBzZWxlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfSAvLyBQYWludCByZXNpemUgdHJhbnNmb3JtSGFuZGxlc1xuXG5cbiAgICBjb250ZXh0LnNhdmUoKTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShyZW5kZXJDb25maWcuc2Nyb2xsWCwgcmVuZGVyQ29uZmlnLnNjcm9sbFkpO1xuXG4gICAgaWYgKGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvYy53aGl0ZTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZXMgPSBnZXRUcmFuc2Zvcm1IYW5kbGVzKGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzWzBdLCByZW5kZXJDb25maWcuem9vbSwgXCJtb3VzZVwiIC8vIHdoZW4gd2UgcmVuZGVyIHdlIGRvbid0IGtub3cgd2hpY2ggcG9pbnRlciB0eXBlIHNvIHVzZSBtb3VzZVxuICAgICAgKTtcblxuICAgICAgaWYgKCFhcHBTdGF0ZS52aWV3TW9kZUVuYWJsZWQgJiYgIWlzTGluZWFyRWxlbWVudChsb2NhbGx5U2VsZWN0ZWRFbGVtZW50c1swXSkpIHtcbiAgICAgICAgcmVuZGVyVHJhbnNmb3JtSGFuZGxlcyhjb250ZXh0LCByZW5kZXJDb25maWcsIHRyYW5zZm9ybUhhbmRsZXMsIGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzWzBdLmFuZ2xlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDEgJiYgIWFwcFN0YXRlLmlzUm90YXRpbmcpIHtcbiAgICAgIGNvbnN0IGRhc2hlZExpbmVQYWRkaW5nID0gNCAvIHJlbmRlckNvbmZpZy56b29tLnZhbHVlO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvYy53aGl0ZTtcbiAgICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRDb21tb25Cb3VuZHMobG9jYWxseVNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgY29uc3QgaW5pdGlhbExpbmVEYXNoID0gY29udGV4dC5nZXRMaW5lRGFzaCgpO1xuICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbMiAvIHJlbmRlckNvbmZpZy56b29tLnZhbHVlXSk7XG4gICAgICBjb25zdCBsaW5lV2lkdGggPSBjb250ZXh0LmxpbmVXaWR0aDtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gMSAvIHJlbmRlckNvbmZpZy56b29tLnZhbHVlO1xuICAgICAgc3Ryb2tlUmVjdFdpdGhSb3RhdGlvbihjb250ZXh0LCB4MSAtIGRhc2hlZExpbmVQYWRkaW5nLCB5MSAtIGRhc2hlZExpbmVQYWRkaW5nLCB4MiAtIHgxICsgZGFzaGVkTGluZVBhZGRpbmcgKiAyLCB5MiAtIHkxICsgZGFzaGVkTGluZVBhZGRpbmcgKiAyLCAoeDEgKyB4MikgLyAyLCAoeTEgKyB5MikgLyAyLCAwKTtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChpbml0aWFsTGluZURhc2gpO1xuICAgICAgY29uc3QgdHJhbnNmb3JtSGFuZGxlcyA9IGdldFRyYW5zZm9ybUhhbmRsZXNGcm9tQ29vcmRzKFt4MSwgeTEsIHgyLCB5Ml0sIDAsIHJlbmRlckNvbmZpZy56b29tLCBcIm1vdXNlXCIsIE9NSVRfU0lERVNfRk9SX01VTFRJUExFX0VMRU1FTlRTKTtcblxuICAgICAgaWYgKGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuICFlbGVtZW50LmxvY2tlZDtcbiAgICAgIH0pKSB7XG4gICAgICAgIHJlbmRlclRyYW5zZm9ybUhhbmRsZXMoY29udGV4dCwgcmVuZGVyQ29uZmlnLCB0cmFuc2Zvcm1IYW5kbGVzLCAwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgfSAvLyBSZXNldCB6b29tXG5cblxuICBjb250ZXh0LnJlc3RvcmUoKTsgLy8gUGFpbnQgcmVtb3RlIHBvaW50ZXJzXG5cbiAgZm9yIChjb25zdCBjbGllbnRJZCBpbiByZW5kZXJDb25maWcucmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzKSB7XG4gICAgbGV0IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHJlbmRlckNvbmZpZy5yZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHNbY2xpZW50SWRdO1xuICAgIHggLT0gYXBwU3RhdGUub2Zmc2V0TGVmdDtcbiAgICB5IC09IGFwcFN0YXRlLm9mZnNldFRvcDtcbiAgICBjb25zdCB3aWR0aCA9IDk7XG4gICAgY29uc3QgaGVpZ2h0ID0gMTQ7XG4gICAgY29uc3QgaXNPdXRPZkJvdW5kcyA9IHggPCAwIHx8IHggPiBub3JtYWxpemVkQ2FudmFzV2lkdGggLSB3aWR0aCB8fCB5IDwgMCB8fCB5ID4gbm9ybWFsaXplZENhbnZhc0hlaWdodCAtIGhlaWdodDtcbiAgICB4ID0gTWF0aC5tYXgoeCwgMCk7XG4gICAgeCA9IE1hdGgubWluKHgsIG5vcm1hbGl6ZWRDYW52YXNXaWR0aCAtIHdpZHRoKTtcbiAgICB5ID0gTWF0aC5tYXgoeSwgMCk7XG4gICAgeSA9IE1hdGgubWluKHksIG5vcm1hbGl6ZWRDYW52YXNIZWlnaHQgLSBoZWlnaHQpO1xuICAgIGNvbnN0IHtcbiAgICAgIGJhY2tncm91bmQsXG4gICAgICBzdHJva2VcbiAgICB9ID0gZ2V0Q2xpZW50Q29sb3JzKGNsaWVudElkLCBhcHBTdGF0ZSk7XG4gICAgY29udGV4dC5zYXZlKCk7XG4gICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0cm9rZTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGJhY2tncm91bmQ7XG4gICAgY29uc3QgdXNlclN0YXRlID0gcmVuZGVyQ29uZmlnLnJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzW2NsaWVudElkXTtcblxuICAgIGlmIChpc091dE9mQm91bmRzIHx8IHVzZXJTdGF0ZSA9PT0gVXNlcklkbGVTdGF0ZS5BV0FZKSB7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gMC40ODtcbiAgICB9XG5cbiAgICBpZiAocmVuZGVyQ29uZmlnLnJlbW90ZVBvaW50ZXJCdXR0b24gJiYgcmVuZGVyQ29uZmlnLnJlbW90ZVBvaW50ZXJCdXR0b25bY2xpZW50SWRdID09PSBcImRvd25cIikge1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgIGNvbnRleHQuYXJjKHgsIHksIDE1LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSAzO1xuICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IFwiI2ZmZmZmZjg4XCI7XG4gICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICBjb250ZXh0LmFyYyh4LCB5LCAxNSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKTtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gMTtcbiAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzdHJva2U7XG4gICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQubW92ZVRvKHgsIHkpO1xuICAgIGNvbnRleHQubGluZVRvKHggKyAxLCB5ICsgMTQpO1xuICAgIGNvbnRleHQubGluZVRvKHggKyA0LCB5ICsgOSk7XG4gICAgY29udGV4dC5saW5lVG8oeCArIDksIHkgKyAxMCk7XG4gICAgY29udGV4dC5saW5lVG8oeCwgeSk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgICBjb25zdCB1c2VybmFtZSA9IHJlbmRlckNvbmZpZy5yZW1vdGVQb2ludGVyVXNlcm5hbWVzW2NsaWVudElkXTtcbiAgICBsZXQgaWRsZVN0YXRlID0gXCJcIjtcblxuICAgIGlmICh1c2VyU3RhdGUgPT09IFVzZXJJZGxlU3RhdGUuQVdBWSkge1xuICAgICAgaWRsZVN0YXRlID0gaGFzRW1vamlTdXBwb3J0ID8gXCLimqvvuI9cIiA6IGAgKCR7VXNlcklkbGVTdGF0ZS5BV0FZfSlgO1xuICAgIH0gZWxzZSBpZiAodXNlclN0YXRlID09PSBVc2VySWRsZVN0YXRlLklETEUpIHtcbiAgICAgIGlkbGVTdGF0ZSA9IGhhc0Vtb2ppU3VwcG9ydCA/IFwi8J+SpFwiIDogYCAoJHtVc2VySWRsZVN0YXRlLklETEV9KWA7XG4gICAgfSBlbHNlIGlmICh1c2VyU3RhdGUgPT09IFVzZXJJZGxlU3RhdGUuQUNUSVZFKSB7XG4gICAgICBpZGxlU3RhdGUgPSBoYXNFbW9qaVN1cHBvcnQgPyBcIvCfn6JcIiA6IFwiXCI7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcm5hbWVBbmRJZGxlU3RhdGUgPSBgJHt1c2VybmFtZSA/IGAke3VzZXJuYW1lfSBgIDogXCJcIn0ke2lkbGVTdGF0ZX1gO1xuXG4gICAgaWYgKCFpc091dE9mQm91bmRzICYmIHVzZXJuYW1lQW5kSWRsZVN0YXRlKSB7XG4gICAgICBjb25zdCBvZmZzZXRYID0geCArIHdpZHRoO1xuICAgICAgY29uc3Qgb2Zmc2V0WSA9IHkgKyBoZWlnaHQ7XG4gICAgICBjb25zdCBwYWRkaW5nSG9yaXpvbnRhbCA9IDQ7XG4gICAgICBjb25zdCBwYWRkaW5nVmVydGljYWwgPSA0O1xuICAgICAgY29uc3QgbWVhc3VyZSA9IGNvbnRleHQubWVhc3VyZVRleHQodXNlcm5hbWVBbmRJZGxlU3RhdGUpO1xuICAgICAgY29uc3QgbWVhc3VyZUhlaWdodCA9IG1lYXN1cmUuYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50ICsgbWVhc3VyZS5hY3R1YWxCb3VuZGluZ0JveEFzY2VudDsgLy8gQm9yZGVyXG5cbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gc3Ryb2tlO1xuICAgICAgY29udGV4dC5maWxsUmVjdChvZmZzZXRYIC0gMSwgb2Zmc2V0WSAtIDEsIG1lYXN1cmUud2lkdGggKyAyICogcGFkZGluZ0hvcml6b250YWwgKyAyLCBtZWFzdXJlSGVpZ2h0ICsgMiAqIHBhZGRpbmdWZXJ0aWNhbCArIDIpOyAvLyBCYWNrZ3JvdW5kXG5cbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gYmFja2dyb3VuZDtcbiAgICAgIGNvbnRleHQuZmlsbFJlY3Qob2Zmc2V0WCwgb2Zmc2V0WSwgbWVhc3VyZS53aWR0aCArIDIgKiBwYWRkaW5nSG9yaXpvbnRhbCwgbWVhc3VyZUhlaWdodCArIDIgKiBwYWRkaW5nVmVydGljYWwpO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvYy53aGl0ZTtcbiAgICAgIGNvbnRleHQuZmlsbFRleHQodXNlcm5hbWVBbmRJZGxlU3RhdGUsIG9mZnNldFggKyBwYWRkaW5nSG9yaXpvbnRhbCwgb2Zmc2V0WSArIHBhZGRpbmdWZXJ0aWNhbCArIG1lYXN1cmUuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQpO1xuICAgIH1cblxuICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH0gLy8gUGFpbnQgc2Nyb2xsYmFyc1xuXG5cbiAgbGV0IHNjcm9sbEJhcnM7XG5cbiAgaWYgKHJlbmRlclNjcm9sbGJhcnMpIHtcbiAgICBzY3JvbGxCYXJzID0gZ2V0U2Nyb2xsQmFycyhlbGVtZW50cywgbm9ybWFsaXplZENhbnZhc1dpZHRoLCBub3JtYWxpemVkQ2FudmFzSGVpZ2h0LCByZW5kZXJDb25maWcpO1xuICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gU0NST0xMQkFSX0NPTE9SO1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYmEoMjU1LDI1NSwyNTUsMC44KVwiO1xuICAgIFtzY3JvbGxCYXJzLmhvcml6b250YWwsIHNjcm9sbEJhcnMudmVydGljYWxdLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbEJhcikge1xuICAgICAgaWYgKHNjcm9sbEJhcikge1xuICAgICAgICByb3VuZFJlY3QoY29udGV4dCwgc2Nyb2xsQmFyLngsIHNjcm9sbEJhci55LCBzY3JvbGxCYXIud2lkdGgsIHNjcm9sbEJhci5oZWlnaHQsIFNDUk9MTEJBUl9XSURUSCAvIDIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICB9XG5cbiAgY29udGV4dC5yZXN0b3JlKCk7XG4gIHJldHVybiB7XG4gICAgYXRMZWFzdE9uZVZpc2libGVFbGVtZW50OiB2aXNpYmxlRWxlbWVudHMubGVuZ3RoID4gMCxcbiAgICBzY3JvbGxCYXJzXG4gIH07XG59O1xuY29uc3QgcmVuZGVyU2NlbmVUaHJvdHRsZWQgPSB0aHJvdHRsZVJBRihmdW5jdGlvbiAoZWxlbWVudHMsIGFwcFN0YXRlLCBzZWxlY3Rpb25FbGVtZW50LCBzY2FsZSwgcmMsIGNhbnZhcywgcmVuZGVyQ29uZmlnLCBjYWxsYmFjaykge1xuICBjb25zdCByZXQgPSBfcmVuZGVyU2NlbmUoZWxlbWVudHMsIGFwcFN0YXRlLCBzZWxlY3Rpb25FbGVtZW50LCBzY2FsZSwgcmMsIGNhbnZhcywgcmVuZGVyQ29uZmlnKTtcblxuICBjYWxsYmFjaz8uKHJldCk7XG59LCB7XG4gIHRyYWlsaW5nOiB0cnVlXG59KTtcbi8qKiByZW5kZXJTY2VuZSB0aHJvdHRsZWQgdG8gYW5pbWF0aW9uIGZyYW1lcmF0ZSAqL1xuXG5leHBvcnQgY29uc3QgcmVuZGVyU2NlbmUgPSBmdW5jdGlvbiAoZWxlbWVudHMsIGFwcFN0YXRlLCBzZWxlY3Rpb25FbGVtZW50LCBzY2FsZSwgcmMsIGNhbnZhcywgcmVuZGVyQ29uZmlnLCBjYWxsYmFjaywgdGhyb3R0bGUpIHtcbiAgaWYgKHRocm90dGxlKSB7XG4gICAgcmVuZGVyU2NlbmVUaHJvdHRsZWQoZWxlbWVudHMsIGFwcFN0YXRlLCBzZWxlY3Rpb25FbGVtZW50LCBzY2FsZSwgcmMsIGNhbnZhcywgcmVuZGVyQ29uZmlnLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IF9yZW5kZXJTY2VuZShlbGVtZW50cywgYXBwU3RhdGUsIHNlbGVjdGlvbkVsZW1lbnQsIHNjYWxlLCByYywgY2FudmFzLCByZW5kZXJDb25maWcpO1xuXG4gIGNhbGxiYWNrPy4ocmV0KTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbmNvbnN0IHJlbmRlclRyYW5zZm9ybUhhbmRsZXMgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVuZGVyQ29uZmlnLCB0cmFuc2Zvcm1IYW5kbGVzLCBhbmdsZSkge1xuICBPYmplY3Qua2V5cyh0cmFuc2Zvcm1IYW5kbGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1IYW5kbGUgPSB0cmFuc2Zvcm1IYW5kbGVzW2tleV07XG5cbiAgICBpZiAodHJhbnNmb3JtSGFuZGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSAxIC8gcmVuZGVyQ29uZmlnLnpvb20udmFsdWU7XG5cbiAgICAgIGlmIChrZXkgPT09IFwicm90YXRpb25cIikge1xuICAgICAgICBmaWxsQ2lyY2xlKGNvbnRleHQsIHRyYW5zZm9ybUhhbmRsZVswXSArIHRyYW5zZm9ybUhhbmRsZVsyXSAvIDIsIHRyYW5zZm9ybUhhbmRsZVsxXSArIHRyYW5zZm9ybUhhbmRsZVszXSAvIDIsIHRyYW5zZm9ybUhhbmRsZVsyXSAvIDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Ryb2tlUmVjdFdpdGhSb3RhdGlvbihjb250ZXh0LCB0cmFuc2Zvcm1IYW5kbGVbMF0sIHRyYW5zZm9ybUhhbmRsZVsxXSwgdHJhbnNmb3JtSGFuZGxlWzJdLCB0cmFuc2Zvcm1IYW5kbGVbM10sIHRyYW5zZm9ybUhhbmRsZVswXSArIHRyYW5zZm9ybUhhbmRsZVsyXSAvIDIsIHRyYW5zZm9ybUhhbmRsZVsxXSArIHRyYW5zZm9ybUhhbmRsZVszXSAvIDIsIGFuZ2xlLCB0cnVlIC8vIGZpbGwgYmVmb3JlIHN0cm9rZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3QgcmVuZGVyU2VsZWN0aW9uQm9yZGVyID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlbmRlckNvbmZpZywgZWxlbWVudFByb3BlcnRpZXMpIHtcbiAgY29uc3Qge1xuICAgIGFuZ2xlLFxuICAgIGVsZW1lbnRYMSxcbiAgICBlbGVtZW50WTEsXG4gICAgZWxlbWVudFgyLFxuICAgIGVsZW1lbnRZMixcbiAgICBzZWxlY3Rpb25Db2xvcnNcbiAgfSA9IGVsZW1lbnRQcm9wZXJ0aWVzO1xuICBjb25zdCBlbGVtZW50V2lkdGggPSBlbGVtZW50WDIgLSBlbGVtZW50WDE7XG4gIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50WTIgLSBlbGVtZW50WTE7XG4gIGNvbnN0IGRhc2hlZExpbmVQYWRkaW5nID0gNCAvIHJlbmRlckNvbmZpZy56b29tLnZhbHVlO1xuICBjb25zdCBkYXNoV2lkdGggPSA4IC8gcmVuZGVyQ29uZmlnLnpvb20udmFsdWU7XG4gIGNvbnN0IHNwYWNlV2lkdGggPSA0IC8gcmVuZGVyQ29uZmlnLnpvb20udmFsdWU7XG4gIGNvbnRleHQuc2F2ZSgpO1xuICBjb250ZXh0LnRyYW5zbGF0ZShyZW5kZXJDb25maWcuc2Nyb2xsWCwgcmVuZGVyQ29uZmlnLnNjcm9sbFkpO1xuICBjb250ZXh0LmxpbmVXaWR0aCA9IDEgLyByZW5kZXJDb25maWcuem9vbS52YWx1ZTtcbiAgY29uc3QgY291bnQgPSBzZWxlY3Rpb25Db2xvcnMubGVuZ3RoO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgKytpbmRleCkge1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzZWxlY3Rpb25Db2xvcnNbaW5kZXhdO1xuICAgIGNvbnRleHQuc2V0TGluZURhc2goW2Rhc2hXaWR0aCwgc3BhY2VXaWR0aCArIChkYXNoV2lkdGggKyBzcGFjZVdpZHRoKSAqIChjb3VudCAtIDEpXSk7XG4gICAgY29udGV4dC5saW5lRGFzaE9mZnNldCA9IChkYXNoV2lkdGggKyBzcGFjZVdpZHRoKSAqIGluZGV4O1xuICAgIHN0cm9rZVJlY3RXaXRoUm90YXRpb24oY29udGV4dCwgZWxlbWVudFgxIC0gZGFzaGVkTGluZVBhZGRpbmcsIGVsZW1lbnRZMSAtIGRhc2hlZExpbmVQYWRkaW5nLCBlbGVtZW50V2lkdGggKyBkYXNoZWRMaW5lUGFkZGluZyAqIDIsIGVsZW1lbnRIZWlnaHQgKyBkYXNoZWRMaW5lUGFkZGluZyAqIDIsIGVsZW1lbnRYMSArIGVsZW1lbnRXaWR0aCAvIDIsIGVsZW1lbnRZMSArIGVsZW1lbnRIZWlnaHQgLyAyLCBhbmdsZSk7XG4gIH1cblxuICBjb250ZXh0LnJlc3RvcmUoKTtcbn07XG5cbmNvbnN0IHJlbmRlckJpbmRpbmdIaWdobGlnaHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVuZGVyQ29uZmlnLCBzdWdnZXN0ZWRCaW5kaW5nKSB7XG4gIGNvbnN0IHJlbmRlckhpZ2hsaWdodCA9IEFycmF5LmlzQXJyYXkoc3VnZ2VzdGVkQmluZGluZykgPyByZW5kZXJCaW5kaW5nSGlnaGxpZ2h0Rm9yU3VnZ2VzdGVkUG9pbnRCaW5kaW5nIDogcmVuZGVyQmluZGluZ0hpZ2hsaWdodEZvckJpbmRhYmxlRWxlbWVudDtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKHJlbmRlckNvbmZpZy5zY3JvbGxYLCByZW5kZXJDb25maWcuc2Nyb2xsWSk7XG4gIHJlbmRlckhpZ2hsaWdodChjb250ZXh0LCBzdWdnZXN0ZWRCaW5kaW5nKTtcbiAgY29udGV4dC5yZXN0b3JlKCk7XG59O1xuXG5jb25zdCByZW5kZXJCaW5kaW5nSGlnaGxpZ2h0Rm9yQmluZGFibGVFbGVtZW50ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZW1lbnQpIHtcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgY29uc3Qgd2lkdGggPSB4MiAtIHgxO1xuICBjb25zdCBoZWlnaHQgPSB5MiAtIHkxO1xuICBjb25zdCB0aHJlc2hvbGQgPSBtYXhCaW5kaW5nR2FwKGVsZW1lbnQsIHdpZHRoLCBoZWlnaHQpOyAvLyBTbyB0aGF0IHdlIGRvbid0IG92ZXJsYXAgdGhlIGVsZW1lbnQgaXRzZWxmXG5cbiAgY29uc3Qgc3Ryb2tlT2Zmc2V0ID0gNDtcbiAgY29udGV4dC5zdHJva2VTdHlsZSA9IFwicmdiYSgwLDAsMCwuMDUpXCI7XG4gIGNvbnRleHQubGluZVdpZHRoID0gdGhyZXNob2xkIC0gc3Ryb2tlT2Zmc2V0O1xuICBjb25zdCBwYWRkaW5nID0gc3Ryb2tlT2Zmc2V0IC8gMiArIHRocmVzaG9sZCAvIDI7XG5cbiAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICBjYXNlIFwicmVjdGFuZ2xlXCI6XG4gICAgY2FzZSBcInRleHRcIjpcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICAgIHN0cm9rZVJlY3RXaXRoUm90YXRpb24oY29udGV4dCwgeDEgLSBwYWRkaW5nLCB5MSAtIHBhZGRpbmcsIHdpZHRoICsgcGFkZGluZyAqIDIsIGhlaWdodCArIHBhZGRpbmcgKiAyLCB4MSArIHdpZHRoIC8gMiwgeTEgKyBoZWlnaHQgLyAyLCBlbGVtZW50LmFuZ2xlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcImRpYW1vbmRcIjpcbiAgICAgIGNvbnN0IHNpZGUgPSBNYXRoLmh5cG90KHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY29uc3Qgd1BhZGRpbmcgPSBwYWRkaW5nICogc2lkZSAvIGhlaWdodDtcbiAgICAgIGNvbnN0IGhQYWRkaW5nID0gcGFkZGluZyAqIHNpZGUgLyB3aWR0aDtcbiAgICAgIHN0cm9rZURpYW1vbmRXaXRoUm90YXRpb24oY29udGV4dCwgd2lkdGggKyB3UGFkZGluZyAqIDIsIGhlaWdodCArIGhQYWRkaW5nICogMiwgeDEgKyB3aWR0aCAvIDIsIHkxICsgaGVpZ2h0IC8gMiwgZWxlbWVudC5hbmdsZSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICBzdHJva2VFbGxpcHNlV2l0aFJvdGF0aW9uKGNvbnRleHQsIHdpZHRoICsgcGFkZGluZyAqIDIsIGhlaWdodCArIHBhZGRpbmcgKiAyLCB4MSArIHdpZHRoIC8gMiwgeTEgKyBoZWlnaHQgLyAyLCBlbGVtZW50LmFuZ2xlKTtcbiAgICAgIGJyZWFrO1xuICB9XG59O1xuXG5jb25zdCByZW5kZXJCaW5kaW5nSGlnaGxpZ2h0Rm9yU3VnZ2VzdGVkUG9pbnRCaW5kaW5nID0gZnVuY3Rpb24gKGNvbnRleHQsIHN1Z2dlc3RlZEJpbmRpbmcpIHtcbiAgY29uc3QgW2VsZW1lbnQsIHN0YXJ0T3JFbmQsIGJpbmRhYmxlRWxlbWVudF0gPSBzdWdnZXN0ZWRCaW5kaW5nO1xuICBjb25zdCB0aHJlc2hvbGQgPSBtYXhCaW5kaW5nR2FwKGJpbmRhYmxlRWxlbWVudCwgYmluZGFibGVFbGVtZW50LndpZHRoLCBiaW5kYWJsZUVsZW1lbnQuaGVpZ2h0KTtcbiAgY29udGV4dC5zdHJva2VTdHlsZSA9IFwicmdiYSgwLDAsMCwwKVwiO1xuICBjb250ZXh0LmZpbGxTdHlsZSA9IFwicmdiYSgwLDAsMCwuMDUpXCI7XG4gIGNvbnN0IHBvaW50SW5kaWNlcyA9IHN0YXJ0T3JFbmQgPT09IFwiYm90aFwiID8gWzAsIC0xXSA6IHN0YXJ0T3JFbmQgPT09IFwic3RhcnRcIiA/IFswXSA6IFstMV07XG4gIHBvaW50SW5kaWNlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgIGNvbnN0IFt4LCB5XSA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRBdEluZGV4R2xvYmFsQ29vcmRpbmF0ZXMoZWxlbWVudCwgaW5kZXgpO1xuICAgIGZpbGxDaXJjbGUoY29udGV4dCwgeCwgeSwgdGhyZXNob2xkKTtcbiAgfSk7XG59O1xuXG5sZXQgbGlua0NhbnZhc0NhY2hlO1xuXG5jb25zdCByZW5kZXJMaW5rSWNvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBjb250ZXh0LCBhcHBTdGF0ZSkge1xuICBpZiAoZWxlbWVudC5saW5rICYmICFhcHBTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbZWxlbWVudC5pZF0pIHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICAgIGNvbnN0IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSA9IGdldExpbmtIYW5kbGVGcm9tQ29vcmRzKFt4MSwgeTEsIHgyLCB5Ml0sIGVsZW1lbnQuYW5nbGUsIGFwcFN0YXRlKTtcbiAgICBjb25zdCBjZW50ZXJYID0geCArIHdpZHRoIC8gMjtcbiAgICBjb25zdCBjZW50ZXJZID0geSArIGhlaWdodCAvIDI7XG4gICAgY29udGV4dC5zYXZlKCk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoYXBwU3RhdGUuc2Nyb2xsWCArIGNlbnRlclgsIGFwcFN0YXRlLnNjcm9sbFkgKyBjZW50ZXJZKTtcbiAgICBjb250ZXh0LnJvdGF0ZShlbGVtZW50LmFuZ2xlKTtcblxuICAgIGlmICghbGlua0NhbnZhc0NhY2hlIHx8IGxpbmtDYW52YXNDYWNoZS56b29tICE9PSBhcHBTdGF0ZS56b29tLnZhbHVlKSB7XG4gICAgICBsaW5rQ2FudmFzQ2FjaGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgbGlua0NhbnZhc0NhY2hlLnpvb20gPSBhcHBTdGF0ZS56b29tLnZhbHVlO1xuICAgICAgbGlua0NhbnZhc0NhY2hlLndpZHRoID0gd2lkdGggKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIGFwcFN0YXRlLnpvb20udmFsdWU7XG4gICAgICBsaW5rQ2FudmFzQ2FjaGUuaGVpZ2h0ID0gaGVpZ2h0ICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiBhcHBTdGF0ZS56b29tLnZhbHVlO1xuICAgICAgY29uc3QgbGlua0NhbnZhc0NhY2hlQ29udGV4dCA9IGxpbmtDYW52YXNDYWNoZS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBsaW5rQ2FudmFzQ2FjaGVDb250ZXh0LnNjYWxlKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogYXBwU3RhdGUuem9vbS52YWx1ZSwgd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiBhcHBTdGF0ZS56b29tLnZhbHVlKTtcbiAgICAgIC8qbGlua0NhbnZhc0NhY2hlQ29udGV4dC5maWxsU3R5bGUgPSBcIiNmZmZcIjsgLy96c3ZpY3ppYW5cbiAgICAgIGxpbmtDYW52YXNDYWNoZUNvbnRleHQuZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ki9cbiAgICAgIC8venN2aWN6aWFuXG4gICAgICAvL2xpbmtDYW52YXNDYWNoZUNvbnRleHQuZ2xvYmFsQWxwaGEgPSBhcHBTdGF0ZS5saW5rT3BhY2l0eTsgLy96c3ZpY3ppYW5cblxuICAgICAgbGlua0NhbnZhc0NhY2hlQ29udGV4dC5kcmF3SW1hZ2UoRVhURVJOQUxfTElOS19JTUcsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgbGlua0NhbnZhc0NhY2hlQ29udGV4dC5yZXN0b3JlKCk7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gYXBwU3RhdGUubGlua09wYWNpdHk7IC8venN2aWN6aWFuXG5cbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGxpbmtDYW52YXNDYWNoZSwgeCAtIGNlbnRlclgsIHkgLSBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IGFwcFN0YXRlLmxpbmtPcGFjaXR5OyAvL3pzdmljemlhblxuXG4gICAgICBjb250ZXh0LmRyYXdJbWFnZShsaW5rQ2FudmFzQ2FjaGUsIHggLSBjZW50ZXJYLCB5IC0gY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfVxuXG4gICAgY29udGV4dC5yZXN0b3JlKCk7XG4gIH1cbn07XG5cbmNvbnN0IGlzVmlzaWJsZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgY2FudmFzV2lkdGgsIGNhbnZhc0hlaWdodCwgdmlld1RyYW5zZm9ybWF0aW9ucykge1xuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEJvdW5kcyhlbGVtZW50KTsgLy8gc2NlbmUgY29vcmRpbmF0ZXNcblxuICBjb25zdCB0b3BMZWZ0U2NlbmVDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgIGNsaWVudFg6IHZpZXdUcmFuc2Zvcm1hdGlvbnMub2Zmc2V0TGVmdCxcbiAgICBjbGllbnRZOiB2aWV3VHJhbnNmb3JtYXRpb25zLm9mZnNldFRvcFxuICB9LCB2aWV3VHJhbnNmb3JtYXRpb25zKTtcbiAgY29uc3QgYm90dG9tUmlnaHRTY2VuZUNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcyh7XG4gICAgY2xpZW50WDogdmlld1RyYW5zZm9ybWF0aW9ucy5vZmZzZXRMZWZ0ICsgY2FudmFzV2lkdGgsXG4gICAgY2xpZW50WTogdmlld1RyYW5zZm9ybWF0aW9ucy5vZmZzZXRUb3AgKyBjYW52YXNIZWlnaHRcbiAgfSwgdmlld1RyYW5zZm9ybWF0aW9ucyk7XG4gIHJldHVybiB0b3BMZWZ0U2NlbmVDb29yZHMueCA8PSB4MiAmJiB0b3BMZWZ0U2NlbmVDb29yZHMueSA8PSB5MiAmJiBib3R0b21SaWdodFNjZW5lQ29vcmRzLnggPj0geDEgJiYgYm90dG9tUmlnaHRTY2VuZUNvb3Jkcy55ID49IHkxO1xufTsgLy8gVGhpcyBzaG91bGQgYmUgb25seSBjYWxsZWQgZm9yIGV4cG9ydGluZyBwdXJwb3Nlc1xuXG5cbmV4cG9ydCBjb25zdCByZW5kZXJTY2VuZVRvU3ZnID0gZnVuY3Rpb24gKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcykge1xuICBsZXQge1xuICAgIG9mZnNldFggPSAwLFxuICAgIG9mZnNldFkgPSAwLFxuICAgIGV4cG9ydFdpdGhEYXJrTW9kZSA9IGZhbHNlXG4gIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHt9O1xuXG4gIGlmICghc3ZnUm9vdCkge1xuICAgIHJldHVybjtcbiAgfSAvLyByZW5kZXIgZWxlbWVudHNcblxuXG4gIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQuaXNEZWxldGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZW5kZXJFbGVtZW50VG9TdmcoZWxlbWVudCwgcnN2Zywgc3ZnUm9vdCwgZmlsZXMsIGVsZW1lbnQueCArIG9mZnNldFgsIGVsZW1lbnQueSArIG9mZnNldFksIGV4cG9ydFdpdGhEYXJrTW9kZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///../../renderer/renderScene.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../renderer/renderScene.ts?");
|
|
3042
3042
|
|
|
3043
3043
|
/***/ }),
|
|
3044
3044
|
|
|
@@ -3082,7 +3082,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
3082
3082
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3083
3083
|
|
|
3084
3084
|
"use strict";
|
|
3085
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"SVG_EXPORT_TAG\\\": () => (/* binding */ SVG_EXPORT_TAG),\\n/* harmony export */ \\\"exportToCanvas\\\": () => (/* binding */ exportToCanvas),\\n/* harmony export */ \\\"exportToSvg\\\": () => (/* binding */ exportToSvg),\\n/* harmony export */ \\\"getExportSize\\\": () => (/* binding */ getExportSize)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \\\"../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\\\");\\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! roughjs/bin/rough */ \\\"../../../node_modules/roughjs/bin/rough.js\\\");\\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element/bounds */ \\\"../../element/bounds.ts\\\");\\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../renderer/renderScene */ \\\"../../renderer/renderScene.ts\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../appState */ \\\"../../appState.ts\\\");\\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../data/json */ \\\"../../data/json.ts\\\");\\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../element/image */ \\\"../../element/image.ts\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\\r\\nconst exportToCanvas = /*#__PURE__*/ function () {\\r\\n var _ref = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (elements, appState, files, _ref2) {\\r\\n let { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_EXPORT_PADDING, viewBackgroundColor } = _ref2;\\r\\n let createCanvas = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function (width, height) {\\r\\n const canvas = document.createElement(\\\"canvas\\\");\\r\\n canvas.width = width * appState.exportScale;\\r\\n canvas.height = height * appState.exportScale;\\r\\n return {\\r\\n canvas,\\r\\n scale: appState.exportScale\\r\\n };\\r\\n };\\r\\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\\r\\n const { canvas, scale = 1 } = createCanvas(width, height);\\r\\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_6__.getDefaultAppState)();\\r\\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_8__.updateImageCache)({\\r\\n imageCache: new Map(),\\r\\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_8__.getInitializedImageElements)(elements).map(function (element) {\\r\\n return element.fileId;\\r\\n }),\\r\\n files\\r\\n });\\r\\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_3__.renderScene)(elements, appState, null, scale, roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"].canvas(canvas), canvas, {\\r\\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\\r\\n scrollX: -minX + exportPadding,\\r\\n scrollY: -minY + exportPadding,\\r\\n zoom: defaultAppState.zoom,\\r\\n remotePointerViewportCoords: {},\\r\\n remoteSelectedElementIds: {},\\r\\n shouldCacheIgnoreZoom: false,\\r\\n remotePointerUsernames: {},\\r\\n remotePointerUserStates: {},\\r\\n theme: appState.exportWithDarkMode ? \\\"dark\\\" : \\\"light\\\",\\r\\n imageCache,\\r\\n renderScrollbars: false,\\r\\n renderSelection: false,\\r\\n renderGrid: false,\\r\\n isExporting: true\\r\\n });\\r\\n return canvas;\\r\\n });\\r\\n return function exportToCanvas(_x, _x2, _x3, _x4) {\\r\\n return _ref.apply(this, arguments);\\r\\n };\\r\\n}();\\r\\nconst exportToSvg = /*#__PURE__*/ function () {\\r\\n var _ref3 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (elements, appState, files) {\\r\\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene } = appState;\\r\\n let metadata = \\\"\\\";\\r\\n if (exportEmbedScene) {\\r\\n try {\\r\\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \\\"../../data/image.ts\\\"))).encodeSvgMetadata({\\r\\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_7__.serializeAsJSON)(elements, appState, files || {}, \\\"local\\\")\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n }\\r\\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding); // initialize SVG root\\r\\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_5__.SVG_NS, \\\"svg\\\");\\r\\n svgRoot.setAttribute(\\\"version\\\", \\\"1.1\\\");\\r\\n svgRoot.setAttribute(\\\"xmlns\\\", _constants__WEBPACK_IMPORTED_MODULE_5__.SVG_NS);\\r\\n svgRoot.setAttribute(\\\"viewBox\\\", `0 0 ${width} ${height}`);\\r\\n svgRoot.setAttribute(\\\"width\\\", `${width * exportScale}`);\\r\\n svgRoot.setAttribute(\\\"height\\\", `${height * exportScale}`);\\r\\n if (appState.exportWithDarkMode) {\\r\\n svgRoot.setAttribute(\\\"filter\\\", _constants__WEBPACK_IMPORTED_MODULE_5__.THEME_FILTER);\\r\\n }\\r\\n let assetPath = \\\"https://excalidraw.com/\\\"; // Asset path needs to be determined only when using package\\r\\n if (true) {\\r\\n assetPath = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\\\"@zsviczian/excalidraw\\\"}@${\\\"0.12.0-obsidian-3\\\"}`;\\r\\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\\\"/\\\")) {\\r\\n assetPath = assetPath.replace(\\\"/\\\", `${window.location.origin}/`);\\r\\n }\\r\\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\\r\\n }\\r\\n svgRoot.innerHTML = `\\n ${SVG_EXPORT_TAG}\\n ${metadata}\\n <defs>\\n <style>\\n @font-face {\\n font-family: \\\"Virgil\\\";\\n src: url(\\\"${assetPath}Virgil.woff2\\\");\\n }\\n @font-face {\\n font-family: \\\"Cascadia\\\";\\n src: url(\\\"${assetPath}Cascadia.woff2\\\");\\n }\\n </style>\\n </defs>\\n `; // render background rect\\r\\n if (appState.exportBackground && viewBackgroundColor) {\\r\\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_5__.SVG_NS, \\\"rect\\\");\\r\\n rect.setAttribute(\\\"x\\\", \\\"0\\\");\\r\\n rect.setAttribute(\\\"y\\\", \\\"0\\\");\\r\\n rect.setAttribute(\\\"width\\\", `${width}`);\\r\\n rect.setAttribute(\\\"height\\\", `${height}`);\\r\\n rect.setAttribute(\\\"fill\\\", viewBackgroundColor);\\r\\n svgRoot.appendChild(rect);\\r\\n }\\r\\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"].svg(svgRoot);\\r\\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_3__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\\r\\n offsetX: -minX + exportPadding,\\r\\n offsetY: -minY + exportPadding,\\r\\n exportWithDarkMode: appState.exportWithDarkMode\\r\\n });\\r\\n return svgRoot;\\r\\n });\\r\\n return function exportToSvg(_x5, _x6, _x7) {\\r\\n return _ref3.apply(this, arguments);\\r\\n };\\r\\n}(); // calculate smallest area to fit the contents in\\r\\nconst getCanvasSize = function (elements, exportPadding) {\\r\\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_2__.getCommonBounds)(elements);\\r\\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.distance)(minX, maxX) + exportPadding * 2;\\r\\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.distance)(minY, maxY) + exportPadding + exportPadding;\\r\\n return [minX, minY, width, height];\\r\\n};\\r\\nconst getExportSize = function (elements, exportPadding, scale) {\\r\\n const [, , width, height] = getCanvasSize(elements, exportPadding).map(function (dimension) {\\r\\n return Math.trunc(dimension * scale);\\r\\n });\\r\\n return [width, height];\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEVBQUUsSUFBSSxDQUFDLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztJQUN2RCxNQUFNLE1BQU0sR0FBRyxnREFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUM7QUFFSyxNQUFNLGFBQWEsR0FBRyxVQUFVLFFBQVEsRUFBRSxhQUFhLEVBQUUsS0FBSztJQUNuRSxNQUFNLENBQUMsRUFBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLFNBQVM7UUFDdkYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz8yNTM4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9FWFBPUlRfUEFERElORywgU1ZHX05TLCBUSEVNRV9GSUxURVIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7IHNlcmlhbGl6ZUFzSlNPTiB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCB7IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cywgdXBkYXRlSW1hZ2VDYWNoZSB9IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5leHBvcnQgY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDtcbmV4cG9ydCBjb25zdCBleHBvcnRUb0NhbnZhcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzLCBfcmVmMikge1xuICAgIGxldCB7XG4gICAgICBleHBvcnRCYWNrZ3JvdW5kLFxuICAgICAgZXhwb3J0UGFkZGluZyA9IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsXG4gICAgICB2aWV3QmFja2dyb3VuZENvbG9yXG4gICAgfSA9IF9yZWYyO1xuICAgIGxldCBjcmVhdGVDYW52YXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgY2FudmFzLndpZHRoID0gd2lkdGggKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhbnZhcyxcbiAgICAgICAgc2NhbGU6IGFwcFN0YXRlLmV4cG9ydFNjYWxlXG4gICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7XG4gICAgY29uc3Qge1xuICAgICAgY2FudmFzLFxuICAgICAgc2NhbGUgPSAxXG4gICAgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcbiAgICBjb25zdCB7XG4gICAgICBpbWFnZUNhY2hlXG4gICAgfSA9IHlpZWxkIHVwZGF0ZUltYWdlQ2FjaGUoe1xuICAgICAgaW1hZ2VDYWNoZTogbmV3IE1hcCgpLFxuICAgICAgZmlsZUlkczogZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKGVsZW1lbnRzKS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZmlsZUlkO1xuICAgICAgfSksXG4gICAgICBmaWxlc1xuICAgIH0pO1xuICAgIHJlbmRlclNjZW5lKGVsZW1lbnRzLCBhcHBTdGF0ZSwgbnVsbCwgc2NhbGUsIHJvdWdoLmNhbnZhcyhjYW52YXMpLCBjYW52YXMsIHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczoge30sXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogZmFsc2UsXG4gICAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydGluZzogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBjYW52YXM7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiBleHBvcnRUb0NhbnZhcyhfeCwgX3gyLCBfeDMsIF94NCkge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjMgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgZmlsZXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBleHBvcnRTY2FsZSA9IDEsXG4gICAgICBleHBvcnRFbWJlZFNjZW5lXG4gICAgfSA9IGFwcFN0YXRlO1xuICAgIGxldCBtZXRhZGF0YSA9IFwiXCI7XG5cbiAgICBpZiAoZXhwb3J0RW1iZWRTY2VuZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWV0YWRhdGEgPSB5aWVsZCAoeWllbGQgaW1wb3J0KFxuICAgICAgICAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImltYWdlXCIgKi9cbiAgICAgICAgXCIuLi8uLi9zcmMvZGF0YS9pbWFnZVwiKSkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICAgIHRleHQ6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7IC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcblxuICAgIGNvbnN0IHN2Z1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ4bWxuc1wiLCBTVkdfTlMpO1xuICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHQgKiBleHBvcnRTY2FsZX1gKTtcblxuICAgIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiZmlsdGVyXCIsIFRIRU1FX0ZJTFRFUik7XG4gICAgfVxuXG4gICAgbGV0IGFzc2V0UGF0aCA9IFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9cIjsgLy8gQXNzZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIG9ubHkgd2hlbiB1c2luZyBwYWNrYWdlXG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuSVNfRVhDQUxJRFJBV19OUE1fUEFDS0FHRSkge1xuICAgICAgYXNzZXRQYXRoID0gd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fCBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5QS0dfVkVSU0lPTn1gO1xuXG4gICAgICBpZiAoYXNzZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgICB9XG5cbiAgICAgIGFzc2V0UGF0aCA9IGAke2Fzc2V0UGF0aH0vZGlzdC9leGNhbGlkcmF3LWFzc2V0cy9gO1xuICAgIH1cblxuICAgIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGU+XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiVmlyZ2lsXCI7XG4gICAgICAgIHNyYzogdXJsKFwiJHthc3NldFBhdGh9VmlyZ2lsLndvZmYyXCIpO1xuICAgICAgfVxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIkNhc2NhZGlhXCI7XG4gICAgICAgIHNyYzogdXJsKFwiJHthc3NldFBhdGh9Q2FzY2FkaWEud29mZjJcIik7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC9kZWZzPlxuICBgOyAvLyByZW5kZXIgYmFja2dyb3VuZCByZWN0XG5cbiAgICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgICBjb25zdCByZWN0ID0gc3ZnUm9vdC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwicmVjdFwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcInlcIiwgXCIwXCIpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1gKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB2aWV3QmFja2dyb3VuZENvbG9yKTtcbiAgICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQocmVjdCk7XG4gICAgfVxuXG4gICAgY29uc3QgcnN2ZyA9IHJvdWdoLnN2ZyhzdmdSb290KTtcbiAgICByZW5kZXJTY2VuZVRvU3ZnKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcyB8fCB7fSwge1xuICAgICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgICAgb2Zmc2V0WTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgICAgZXhwb3J0V2l0aERhcmtNb2RlOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGVcbiAgICB9KTtcbiAgICByZXR1cm4gc3ZnUm9vdDtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGV4cG9ydFRvU3ZnKF94NSwgX3g2LCBfeDcpIHtcbiAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTsgLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuXG5jb25zdCBnZXRDYW52YXNTaXplID0gZnVuY3Rpb24gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKSB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICsgZXhwb3J0UGFkZGluZztcbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFeHBvcnRTaXplID0gZnVuY3Rpb24gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nLCBzY2FsZSkge1xuICBjb25zdCBbLCwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoZnVuY3Rpb24gKGRpbWVuc2lvbikge1xuICAgIHJldHVybiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKTtcbiAgfSk7XG4gIHJldHVybiBbd2lkdGgsIGhlaWdodF07XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../scene/export.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../scene/export.ts?");
|
|
3085
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"SVG_EXPORT_TAG\\\": () => (/* binding */ SVG_EXPORT_TAG),\\n/* harmony export */ \\\"exportToCanvas\\\": () => (/* binding */ exportToCanvas),\\n/* harmony export */ \\\"exportToSvg\\\": () => (/* binding */ exportToSvg),\\n/* harmony export */ \\\"getExportSize\\\": () => (/* binding */ getExportSize)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \\\"../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\\\");\\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! roughjs/bin/rough */ \\\"../../../node_modules/roughjs/bin/rough.js\\\");\\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element/bounds */ \\\"../../element/bounds.ts\\\");\\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../renderer/renderScene */ \\\"../../renderer/renderScene.ts\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../appState */ \\\"../../appState.ts\\\");\\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../data/json */ \\\"../../data/json.ts\\\");\\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../element/image */ \\\"../../element/image.ts\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\\r\\nconst exportToCanvas = /*#__PURE__*/ function () {\\r\\n var _ref = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (elements, appState, files, _ref2) {\\r\\n let { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_EXPORT_PADDING, viewBackgroundColor } = _ref2;\\r\\n let createCanvas = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function (width, height) {\\r\\n const canvas = document.createElement(\\\"canvas\\\");\\r\\n canvas.width = width * appState.exportScale;\\r\\n canvas.height = height * appState.exportScale;\\r\\n return {\\r\\n canvas,\\r\\n scale: appState.exportScale\\r\\n };\\r\\n };\\r\\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\\r\\n const { canvas, scale = 1 } = createCanvas(width, height);\\r\\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_6__.getDefaultAppState)();\\r\\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_8__.updateImageCache)({\\r\\n imageCache: new Map(),\\r\\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_8__.getInitializedImageElements)(elements).map(function (element) {\\r\\n return element.fileId;\\r\\n }),\\r\\n files\\r\\n });\\r\\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_3__.renderScene)(elements, appState, null, scale, roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"].canvas(canvas), canvas, {\\r\\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\\r\\n scrollX: -minX + exportPadding,\\r\\n scrollY: -minY + exportPadding,\\r\\n zoom: defaultAppState.zoom,\\r\\n remotePointerViewportCoords: {},\\r\\n remoteSelectedElementIds: {},\\r\\n shouldCacheIgnoreZoom: false,\\r\\n remotePointerUsernames: {},\\r\\n remotePointerUserStates: {},\\r\\n theme: appState.exportWithDarkMode ? \\\"dark\\\" : \\\"light\\\",\\r\\n imageCache,\\r\\n renderScrollbars: false,\\r\\n renderSelection: false,\\r\\n renderGrid: false,\\r\\n isExporting: true\\r\\n });\\r\\n return canvas;\\r\\n });\\r\\n return function exportToCanvas(_x, _x2, _x3, _x4) {\\r\\n return _ref.apply(this, arguments);\\r\\n };\\r\\n}();\\r\\nconst exportToSvg = /*#__PURE__*/ function () {\\r\\n var _ref3 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (elements, appState, files) {\\r\\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene } = appState;\\r\\n let metadata = \\\"\\\";\\r\\n if (exportEmbedScene) {\\r\\n try {\\r\\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \\\"../../data/image.ts\\\"))).encodeSvgMetadata({\\r\\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_7__.serializeAsJSON)(elements, appState, files || {}, \\\"local\\\")\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n }\\r\\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding); // initialize SVG root\\r\\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_5__.SVG_NS, \\\"svg\\\");\\r\\n svgRoot.setAttribute(\\\"version\\\", \\\"1.1\\\");\\r\\n svgRoot.setAttribute(\\\"xmlns\\\", _constants__WEBPACK_IMPORTED_MODULE_5__.SVG_NS);\\r\\n svgRoot.setAttribute(\\\"viewBox\\\", `0 0 ${width} ${height}`);\\r\\n svgRoot.setAttribute(\\\"width\\\", `${width * exportScale}`);\\r\\n svgRoot.setAttribute(\\\"height\\\", `${height * exportScale}`);\\r\\n if (appState.exportWithDarkMode) {\\r\\n svgRoot.setAttribute(\\\"filter\\\", _constants__WEBPACK_IMPORTED_MODULE_5__.THEME_FILTER);\\r\\n }\\r\\n let assetPath = \\\"https://excalidraw.com/\\\"; // Asset path needs to be determined only when using package\\r\\n if (true) {\\r\\n assetPath = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\\\"@zsviczian/excalidraw\\\"}@${\\\"0.12.0-obsidian-4\\\"}`;\\r\\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\\\"/\\\")) {\\r\\n assetPath = assetPath.replace(\\\"/\\\", `${window.location.origin}/`);\\r\\n }\\r\\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\\r\\n }\\r\\n svgRoot.innerHTML = `\\n ${SVG_EXPORT_TAG}\\n ${metadata}\\n <defs>\\n <style>\\n @font-face {\\n font-family: \\\"Virgil\\\";\\n src: url(\\\"${assetPath}Virgil.woff2\\\");\\n }\\n @font-face {\\n font-family: \\\"Cascadia\\\";\\n src: url(\\\"${assetPath}Cascadia.woff2\\\");\\n }\\n </style>\\n </defs>\\n `; // render background rect\\r\\n if (appState.exportBackground && viewBackgroundColor) {\\r\\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_5__.SVG_NS, \\\"rect\\\");\\r\\n rect.setAttribute(\\\"x\\\", \\\"0\\\");\\r\\n rect.setAttribute(\\\"y\\\", \\\"0\\\");\\r\\n rect.setAttribute(\\\"width\\\", `${width}`);\\r\\n rect.setAttribute(\\\"height\\\", `${height}`);\\r\\n rect.setAttribute(\\\"fill\\\", viewBackgroundColor);\\r\\n svgRoot.appendChild(rect);\\r\\n }\\r\\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"].svg(svgRoot);\\r\\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_3__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\\r\\n offsetX: -minX + exportPadding,\\r\\n offsetY: -minY + exportPadding,\\r\\n exportWithDarkMode: appState.exportWithDarkMode\\r\\n });\\r\\n return svgRoot;\\r\\n });\\r\\n return function exportToSvg(_x5, _x6, _x7) {\\r\\n return _ref3.apply(this, arguments);\\r\\n };\\r\\n}(); // calculate smallest area to fit the contents in\\r\\nconst getCanvasSize = function (elements, exportPadding) {\\r\\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_2__.getCommonBounds)(elements);\\r\\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.distance)(minX, maxX) + exportPadding * 2;\\r\\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.distance)(minY, maxY) + exportPadding + exportPadding;\\r\\n return [minX, minY, width, height];\\r\\n};\\r\\nconst getExportSize = function (elements, exportPadding, scale) {\\r\\n const [, , width, height] = getCanvasSize(elements, exportPadding).map(function (dimension) {\\r\\n return Math.trunc(dimension * scale);\\r\\n });\\r\\n return [width, height];\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEVBQUUsSUFBSSxDQUFDLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztJQUN2RCxNQUFNLE1BQU0sR0FBRyxnREFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUM7QUFFSyxNQUFNLGFBQWEsR0FBRyxVQUFVLFFBQVEsRUFBRSxhQUFhLEVBQUUsS0FBSztJQUNuRSxNQUFNLENBQUMsRUFBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLFNBQVM7UUFDdkYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz8yNTM4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9FWFBPUlRfUEFERElORywgU1ZHX05TLCBUSEVNRV9GSUxURVIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7IHNlcmlhbGl6ZUFzSlNPTiB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCB7IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cywgdXBkYXRlSW1hZ2VDYWNoZSB9IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5leHBvcnQgY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDtcbmV4cG9ydCBjb25zdCBleHBvcnRUb0NhbnZhcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzLCBfcmVmMikge1xuICAgIGxldCB7XG4gICAgICBleHBvcnRCYWNrZ3JvdW5kLFxuICAgICAgZXhwb3J0UGFkZGluZyA9IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsXG4gICAgICB2aWV3QmFja2dyb3VuZENvbG9yXG4gICAgfSA9IF9yZWYyO1xuICAgIGxldCBjcmVhdGVDYW52YXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgY2FudmFzLndpZHRoID0gd2lkdGggKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhbnZhcyxcbiAgICAgICAgc2NhbGU6IGFwcFN0YXRlLmV4cG9ydFNjYWxlXG4gICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7XG4gICAgY29uc3Qge1xuICAgICAgY2FudmFzLFxuICAgICAgc2NhbGUgPSAxXG4gICAgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcbiAgICBjb25zdCB7XG4gICAgICBpbWFnZUNhY2hlXG4gICAgfSA9IHlpZWxkIHVwZGF0ZUltYWdlQ2FjaGUoe1xuICAgICAgaW1hZ2VDYWNoZTogbmV3IE1hcCgpLFxuICAgICAgZmlsZUlkczogZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKGVsZW1lbnRzKS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZmlsZUlkO1xuICAgICAgfSksXG4gICAgICBmaWxlc1xuICAgIH0pO1xuICAgIHJlbmRlclNjZW5lKGVsZW1lbnRzLCBhcHBTdGF0ZSwgbnVsbCwgc2NhbGUsIHJvdWdoLmNhbnZhcyhjYW52YXMpLCBjYW52YXMsIHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczoge30sXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogZmFsc2UsXG4gICAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydGluZzogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBjYW52YXM7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiBleHBvcnRUb0NhbnZhcyhfeCwgX3gyLCBfeDMsIF94NCkge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjMgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgZmlsZXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBleHBvcnRTY2FsZSA9IDEsXG4gICAgICBleHBvcnRFbWJlZFNjZW5lXG4gICAgfSA9IGFwcFN0YXRlO1xuICAgIGxldCBtZXRhZGF0YSA9IFwiXCI7XG5cbiAgICBpZiAoZXhwb3J0RW1iZWRTY2VuZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWV0YWRhdGEgPSB5aWVsZCAoeWllbGQgaW1wb3J0KFxuICAgICAgICAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImltYWdlXCIgKi9cbiAgICAgICAgXCIuLi8uLi9zcmMvZGF0YS9pbWFnZVwiKSkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICAgIHRleHQ6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7IC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcblxuICAgIGNvbnN0IHN2Z1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ4bWxuc1wiLCBTVkdfTlMpO1xuICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHQgKiBleHBvcnRTY2FsZX1gKTtcblxuICAgIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiZmlsdGVyXCIsIFRIRU1FX0ZJTFRFUik7XG4gICAgfVxuXG4gICAgbGV0IGFzc2V0UGF0aCA9IFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9cIjsgLy8gQXNzZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIG9ubHkgd2hlbiB1c2luZyBwYWNrYWdlXG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuSVNfRVhDQUxJRFJBV19OUE1fUEFDS0FHRSkge1xuICAgICAgYXNzZXRQYXRoID0gd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fCBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5QS0dfVkVSU0lPTn1gO1xuXG4gICAgICBpZiAoYXNzZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgICB9XG5cbiAgICAgIGFzc2V0UGF0aCA9IGAke2Fzc2V0UGF0aH0vZGlzdC9leGNhbGlkcmF3LWFzc2V0cy9gO1xuICAgIH1cblxuICAgIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGU+XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiVmlyZ2lsXCI7XG4gICAgICAgIHNyYzogdXJsKFwiJHthc3NldFBhdGh9VmlyZ2lsLndvZmYyXCIpO1xuICAgICAgfVxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIkNhc2NhZGlhXCI7XG4gICAgICAgIHNyYzogdXJsKFwiJHthc3NldFBhdGh9Q2FzY2FkaWEud29mZjJcIik7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC9kZWZzPlxuICBgOyAvLyByZW5kZXIgYmFja2dyb3VuZCByZWN0XG5cbiAgICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgICBjb25zdCByZWN0ID0gc3ZnUm9vdC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwicmVjdFwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcInlcIiwgXCIwXCIpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1gKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB2aWV3QmFja2dyb3VuZENvbG9yKTtcbiAgICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQocmVjdCk7XG4gICAgfVxuXG4gICAgY29uc3QgcnN2ZyA9IHJvdWdoLnN2ZyhzdmdSb290KTtcbiAgICByZW5kZXJTY2VuZVRvU3ZnKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcyB8fCB7fSwge1xuICAgICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgICAgb2Zmc2V0WTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgICAgZXhwb3J0V2l0aERhcmtNb2RlOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGVcbiAgICB9KTtcbiAgICByZXR1cm4gc3ZnUm9vdDtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGV4cG9ydFRvU3ZnKF94NSwgX3g2LCBfeDcpIHtcbiAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTsgLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuXG5jb25zdCBnZXRDYW52YXNTaXplID0gZnVuY3Rpb24gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKSB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICsgZXhwb3J0UGFkZGluZztcbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFeHBvcnRTaXplID0gZnVuY3Rpb24gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nLCBzY2FsZSkge1xuICBjb25zdCBbLCwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoZnVuY3Rpb24gKGRpbWVuc2lvbikge1xuICAgIHJldHVybiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKTtcbiAgfSk7XG4gIHJldHVybiBbd2lkdGgsIGhlaWdodF07XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../scene/export.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../scene/export.ts?");
|
|
3086
3086
|
|
|
3087
3087
|
/***/ }),
|
|
3088
3088
|
|
|
@@ -3170,7 +3170,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
3170
3170
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3171
3171
|
|
|
3172
3172
|
"use strict";
|
|
3173
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"allowFullScreen\\\": () => (/* binding */ allowFullScreen),\\n/* harmony export */ \\\"arrayToMap\\\": () => (/* binding */ arrayToMap),\\n/* harmony export */ \\\"bytesToHexString\\\": () => (/* binding */ bytesToHexString),\\n/* harmony export */ \\\"capitalizeString\\\": () => (/* binding */ capitalizeString),\\n/* harmony export */ \\\"chunk\\\": () => (/* binding */ chunk),\\n/* harmony export */ \\\"debounce\\\": () => (/* binding */ debounce),\\n/* harmony export */ \\\"distance\\\": () => (/* binding */ distance),\\n/* harmony export */ \\\"exitFullScreen\\\": () => (/* binding */ exitFullScreen),\\n/* harmony export */ \\\"findIndex\\\": () => (/* binding */ findIndex),\\n/* harmony export */ \\\"findLastIndex\\\": () => (/* binding */ findLastIndex),\\n/* harmony export */ \\\"focusNearestParent\\\": () => (/* binding */ focusNearestParent),\\n/* harmony export */ \\\"getDateTime\\\": () => (/* binding */ getDateTime),\\n/* harmony export */ \\\"getFontFamilyString\\\": () => (/* binding */ getFontFamilyString),\\n/* harmony export */ \\\"getFontString\\\": () => (/* binding */ getFontString),\\n/* harmony export */ \\\"getFrame\\\": () => (/* binding */ getFrame),\\n/* harmony export */ \\\"getGlobalCSSVariable\\\": () => (/* binding */ getGlobalCSSVariable),\\n/* harmony export */ \\\"getNearestScrollableContainer\\\": () => (/* binding */ getNearestScrollableContainer),\\n/* harmony export */ \\\"getShortcutKey\\\": () => (/* binding */ getShortcutKey),\\n/* harmony export */ \\\"getUpdatedTimestamp\\\": () => (/* binding */ getUpdatedTimestamp),\\n/* harmony export */ \\\"getVersion\\\": () => (/* binding */ getVersion),\\n/* harmony export */ \\\"isFullScreen\\\": () => (/* binding */ isFullScreen),\\n/* harmony export */ \\\"isInputLike\\\": () => (/* binding */ isInputLike),\\n/* harmony export */ \\\"isPrimitive\\\": () => (/* binding */ isPrimitive),\\n/* harmony export */ \\\"isProdEnv\\\": () => (/* binding */ isProdEnv),\\n/* harmony export */ \\\"isPromiseLike\\\": () => (/* binding */ isPromiseLike),\\n/* harmony export */ \\\"isRTL\\\": () => (/* binding */ isRTL),\\n/* harmony export */ \\\"isTestEnv\\\": () => (/* binding */ isTestEnv),\\n/* harmony export */ \\\"isToolIcon\\\": () => (/* binding */ isToolIcon),\\n/* harmony export */ \\\"isTransparent\\\": () => (/* binding */ isTransparent),\\n/* harmony export */ \\\"isWritableElement\\\": () => (/* binding */ isWritableElement),\\n/* harmony export */ \\\"muteFSAbortError\\\": () => (/* binding */ muteFSAbortError),\\n/* harmony export */ \\\"nFormatter\\\": () => (/* binding */ nFormatter),\\n/* harmony export */ \\\"preventUnload\\\": () => (/* binding */ preventUnload),\\n/* harmony export */ \\\"queryFocusableElements\\\": () => (/* binding */ queryFocusableElements),\\n/* harmony export */ \\\"removeSelection\\\": () => (/* binding */ removeSelection),\\n/* harmony export */ \\\"resetCursor\\\": () => (/* binding */ resetCursor),\\n/* harmony export */ \\\"resolvablePromise\\\": () => (/* binding */ resolvablePromise),\\n/* harmony export */ \\\"sceneCoordsToViewportCoords\\\": () => (/* binding */ sceneCoordsToViewportCoords),\\n/* harmony export */ \\\"selectNode\\\": () => (/* binding */ selectNode),\\n/* harmony export */ \\\"setCursor\\\": () => (/* binding */ setCursor),\\n/* harmony export */ \\\"setCursorForShape\\\": () => (/* binding */ setCursorForShape),\\n/* harmony export */ \\\"setDateTimeForTests\\\": () => (/* binding */ setDateTimeForTests),\\n/* harmony export */ \\\"setEraserCursor\\\": () => (/* binding */ setEraserCursor),\\n/* harmony export */ \\\"supportsEmoji\\\": () => (/* binding */ supportsEmoji),\\n/* harmony export */ \\\"throttleRAF\\\": () => (/* binding */ throttleRAF),\\n/* harmony export */ \\\"tupleToCoors\\\": () => (/* binding */ tupleToCoors),\\n/* harmony export */ \\\"updateActiveTool\\\": () => (/* binding */ updateActiveTool),\\n/* harmony export */ \\\"updateObject\\\": () => (/* binding */ updateObject),\\n/* harmony export */ \\\"viewportCoordsToSceneCoords\\\": () => (/* binding */ viewportCoordsToSceneCoords),\\n/* harmony export */ \\\"withBatchedUpdates\\\": () => (/* binding */ withBatchedUpdates),\\n/* harmony export */ \\\"withBatchedUpdatesThrottled\\\": () => (/* binding */ withBatchedUpdatesThrottled),\\n/* harmony export */ \\\"wrapEvent\\\": () => (/* binding */ wrapEvent)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\\\");\\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! open-color */ \\\"../../../node_modules/open-color/open-color.json\\\");\\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./colors */ \\\"../../colors.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \\\"react-dom\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./keys */ \\\"../../keys.ts\\\");\\n\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\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_3__.FONT_FAMILY)) {\\r\\n if (id === fontFamily) {\\r\\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_3__.WINDOWS_EMOJI_FALLBACK_FONT}`;\\r\\n }\\r\\n }\\r\\n return _constants__WEBPACK_IMPORTED_MODULE_3__.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}; // throttle callback to execute once per animation frame\\r\\nconst throttleRAF = function (fn, opts) {\\r\\n let timerId = null;\\r\\n let lastArgs = null;\\r\\n let lastArgsTrailing = null;\\r\\n const scheduleFunc = function (args) {\\r\\n timerId = window.requestAnimationFrame(function () {\\r\\n timerId = null;\\r\\n fn(...args);\\r\\n lastArgs = null;\\r\\n if (lastArgsTrailing) {\\r\\n lastArgs = lastArgsTrailing;\\r\\n lastArgsTrailing = null;\\r\\n scheduleFunc(lastArgs);\\r\\n }\\r\\n });\\r\\n };\\r\\n const ret = function () {\\r\\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\\r\\n args[_key2] = arguments[_key2];\\r\\n }\\r\\n if (false) {}\\r\\n lastArgs = args;\\r\\n if (timerId === null) {\\r\\n scheduleFunc(lastArgs);\\r\\n }\\r\\n else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\\r\\n lastArgsTrailing = args;\\r\\n }\\r\\n };\\r\\n ret.flush = function () {\\r\\n if (timerId !== null) {\\r\\n cancelAnimationFrame(timerId);\\r\\n timerId = null;\\r\\n }\\r\\n if (lastArgs) {\\r\\n fn(...(lastArgsTrailing || lastArgs));\\r\\n lastArgs = lastArgsTrailing = null;\\r\\n }\\r\\n };\\r\\n ret.cancel = function () {\\r\\n lastArgs = lastArgsTrailing = null;\\r\\n if (timerId !== null) {\\r\\n cancelAnimationFrame(timerId);\\r\\n timerId = null;\\r\\n }\\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 updateActiveTool = function (appState, data) {\\r\\n if (data.type === \\\"custom\\\") {\\r\\n return _objectSpread(_objectSpread({}, appState.activeTool), {}, {\\r\\n type: \\\"custom\\\",\\r\\n customType: data.customType\\r\\n });\\r\\n }\\r\\n return _objectSpread(_objectSpread({}, appState.activeTool), {}, {\\r\\n lastActiveToolBeforeEraser: data.lastActiveToolBeforeEraser === undefined ? appState.activeTool.lastActiveToolBeforeEraser : data.lastActiveToolBeforeEraser,\\r\\n type: data.type,\\r\\n customType: null\\r\\n });\\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\\nlet eraserCanvasCache;\\r\\nlet previewDataURL;\\r\\nconst setEraserCursor = function (canvas, theme) {\\r\\n const cursorImageSizePx = 20;\\r\\n const drawCanvas = function () {\\r\\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_3__.THEME.DARK;\\r\\n eraserCanvasCache = document.createElement(\\\"canvas\\\");\\r\\n eraserCanvasCache.theme = theme;\\r\\n eraserCanvasCache.height = cursorImageSizePx;\\r\\n eraserCanvasCache.width = cursorImageSizePx;\\r\\n const context = eraserCanvasCache.getContext(\\\"2d\\\");\\r\\n context.lineWidth = 1;\\r\\n context.beginPath();\\r\\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\\r\\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_1__.black : open_color__WEBPACK_IMPORTED_MODULE_1__.white;\\r\\n context.fill();\\r\\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_1__.white : open_color__WEBPACK_IMPORTED_MODULE_1__.black;\\r\\n context.stroke();\\r\\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_3__.MIME_TYPES.svg);\\r\\n };\\r\\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\\r\\n drawCanvas();\\r\\n }\\r\\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\\r\\n};\\r\\nconst setCursorForShape = function (canvas, appState) {\\r\\n if (!canvas) {\\r\\n return;\\r\\n }\\r\\n if (appState.activeTool.type === \\\"selection\\\") {\\r\\n resetCursor(canvas);\\r\\n }\\r\\n else if (appState.activeTool.type === \\\"eraser\\\") {\\r\\n setEraserCursor(canvas, appState.theme); // do nothing if image tool is selected which suggests there's\\r\\n // a image-preview set as the cursor\\r\\n // Ignore custom type as well and let host decide\\r\\n }\\r\\n else if (![\\\"image\\\", \\\"custom\\\"].includes(appState.activeTool.type)) {\\r\\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_3__.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_5__.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 - offsetLeft) * invScale - scrollX;\\r\\n const y = (clientY - 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 + offsetLeft;\\r\\n const y = (sceneY + scrollY) * zoom.value + 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_2__[\\\"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_4__.unstable_batchedUpdates)(func, event);\\r\\n };\\r\\n};\\r\\n/**\\r\\n * barches React state updates and throttles the calls to a single call per\\r\\n * animation frame\\r\\n */\\r\\nconst withBatchedUpdatesThrottled = function (func) {\\r\\n // @ts-ignore\\r\\n return throttleRAF(function (event) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_4__.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_3__.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\\\" || overflowY === \\\"overlay\\\")) {\\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_WS_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_PORTAL_URL\\\":\\\"\\\",\\\"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\\\\\\\"}\\\",\\\"REACT_APP_DEV_ENABLE_SW\\\":\\\"\\\",\\\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\\\":\\\"\\\",\\\"PKG_NAME\\\":\\\"@zsviczian/excalidraw\\\",\\\"PKG_VERSION\\\":\\\"0.12.0-obsidian-3\\\",\\\"IS_EXCALIDRAW_NPM_PACKAGE\\\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \\\"test\\\";\\r\\n};\\r\\nconst isProdEnv = 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_WS_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_PORTAL_URL\\\":\\\"\\\",\\\"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\\\\\\\"}\\\",\\\"REACT_APP_DEV_ENABLE_SW\\\":\\\"\\\",\\\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\\\":\\\"\\\",\\\"PKG_NAME\\\":\\\"@zsviczian/excalidraw\\\",\\\"PKG_VERSION\\\":\\\"0.12.0-obsidian-3\\\",\\\"IS_EXCALIDRAW_NPM_PACKAGE\\\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \\\"production\\\";\\r\\n};\\r\\nconst wrapEvent = function (name, nativeEvent) {\\r\\n return new CustomEvent(name, {\\r\\n detail: {\\r\\n nativeEvent\\r\\n },\\r\\n cancelable: true\\r\\n });\\r\\n};\\r\\nconst updateObject = function (obj, updates) {\\r\\n let didChange = false;\\r\\n for (const key in updates) {\\r\\n const value = updates[key];\\r\\n if (typeof value !== \\\"undefined\\\") {\\r\\n if (obj[key] === value && ( // if object, always update because its attrs could have changed\\r\\n typeof value !== \\\"object\\\" || value === null)) {\\r\\n continue;\\r\\n }\\r\\n didChange = true;\\r\\n }\\r\\n }\\r\\n if (!didChange) {\\r\\n return obj;\\r\\n }\\r\\n return _objectSpread(_objectSpread({}, obj), updates);\\r\\n};\\r\\nconst isPrimitive = function (val) {\\r\\n const type = typeof val;\\r\\n return val == null || type !== \\\"object\\\" && type !== \\\"function\\\";\\r\\n};\\r\\nconst getFrame = function () {\\r\\n try {\\r\\n return window.self === window.top ? \\\"top\\\" : \\\"iframe\\\";\\r\\n }\\r\\n catch (error) {\\r\\n return \\\"iframe\\\";\\r\\n }\\r\\n};\\r\\nconst isPromiseLike = function (value) {\\r\\n return !!value && typeof value === \\\"object\\\" && \\\"then\\\" in value && \\\"catch\\\" in value && \\\"finally\\\" in value;\\r\\n};\\r\\nconst queryFocusableElements = function (container) {\\r\\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\\\"button, a, input, select, textarea, div[tabindex], label[tabindex]\\\");\\r\\n return focusableElements ? Array.from(focusableElements).filter(function (element) {\\r\\n return element.tabIndex > -1 && !element.disabled;\\r\\n }) : [];\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vdXRpbHMudHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBb0U7QUFFcEUsU0FBUyxPQUFPLENBQUMsTUFBTSxFQUFFLGNBQWMsSUFBSSxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMscUJBQXFCLEVBQUU7SUFBRSxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFBQyxjQUFjLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxPQUFPLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7Q0FBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQztBQUVyVixTQUFTLGFBQWEsQ0FBQyxNQUFNLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLElBQUksaUZBQWUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FBRSxDQUFDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQztBQUU5ZDtBQUNFO0FBQzBGO0FBQ3BFO0FBQ2xCO0FBQ2xDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQztBQUNqQixNQUFNLG1CQUFtQixHQUFHLFVBQVUsUUFBUTtJQUNuRCxZQUFZLEdBQUcsUUFBUSxDQUFDO0FBQzFCLENBQUMsQ0FBQztBQUNLLE1BQU0sV0FBVyxHQUFHO0lBQ3pCLElBQUksWUFBWSxFQUFFO1FBQ2hCLE9BQU8sWUFBWSxDQUFDO0tBQ3JCO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDaEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN4RCxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakQsTUFBTSxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNwRCxPQUFPLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQy9DLENBQUMsQ0FBQztBQUNLLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxHQUFHO0lBQzNDLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUMsQ0FBQztBQUNLLE1BQU0sVUFBVSxHQUFHLFVBQVUsTUFBTTtJQUN4QyxPQUFPLE1BQU0sWUFBWSxXQUFXLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDaEYsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxXQUFXLEdBQUcsVUFBVSxNQUFNO0lBQ3pDLE9BQU8sTUFBTSxZQUFZLFdBQVcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksTUFBTSxZQUFZLGFBQWEsSUFBSSxxQkFBcUI7UUFDckksTUFBTSxZQUFZLGdCQUFnQixJQUFJLE1BQU0sWUFBWSxtQkFBbUIsSUFBSSxNQUFNLFlBQVksaUJBQWlCLENBQUM7QUFDckgsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxpQkFBaUIsR0FBRyxVQUFVLE1BQU07SUFDL0MsT0FBTyxNQUFNLFlBQVksV0FBVyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxNQUFNLFlBQVksYUFBYSxJQUFJLHFCQUFxQjtRQUNySSxNQUFNLFlBQVksbUJBQW1CLElBQUksTUFBTSxZQUFZLGdCQUFnQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQztBQUN0SSxDQUFDLENBQUM7QUFDSyxNQUFNLG1CQUFtQixHQUFHLFVBQVUsSUFBSTtJQUMvQyxJQUFJLEVBQ0YsVUFBVSxFQUNYLEdBQUcsSUFBSSxDQUFDO0lBRVQsS0FBSyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxtREFBVyxDQUFDLEVBQUU7UUFDaEUsSUFBSSxFQUFFLEtBQUssVUFBVSxFQUFFO1lBQ3JCLE9BQU8sR0FBRyxnQkFBZ0IsS0FBSyxtRUFBMkIsRUFBRSxDQUFDO1NBQzlEO0tBQ0Y7SUFFRCxPQUFPLG1FQUEyQixDQUFDO0FBQ3JDLENBQUMsQ0FBQztBQUNGLHdFQUF3RTtBQUVqRSxNQUFNLGFBQWEsR0FBRyxVQUFVLEtBQUs7SUFDMUMsSUFBSSxFQUNGLFFBQVEsRUFDUixVQUFVLEVBQ1gsR0FBRyxLQUFLLENBQUM7SUFDVixPQUFPLEdBQUcsUUFBUSxNQUFNLG1CQUFtQixDQUFDO1FBQzFDLFVBQVU7S0FDWCxDQUFDLEVBQUUsQ0FBQztBQUNQLENBQUMsQ0FBQztBQUNLLE1BQU0sUUFBUSxHQUFHLFVBQVUsRUFBRSxFQUFFLE9BQU87SUFDM0MsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBRXBCLE1BQU0sR0FBRyxHQUFHO1FBQ1YsS0FBSyxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDdkYsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjtRQUVELFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDaEIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQ3pCLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDaEIsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDZCxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFRixHQUFHLENBQUMsS0FBSyxHQUFHO1FBQ1YsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJCLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDO1lBQzNCLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDaEIsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7U0FDbEI7SUFDSCxDQUFDLENBQUM7SUFFRixHQUFHLENBQUMsTUFBTSxHQUFHO1FBQ1gsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQixZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkIsQ0FBQyxDQUFDO0lBRUYsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDLENBQUMsQ0FBQyx3REFBd0Q7QUFFcEQsTUFBTSxXQUFXLEdBQUcsVUFBVSxFQUFFLEVBQUUsSUFBSTtJQUMzQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDbkIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBRTVCLE1BQU0sWUFBWSxHQUFHLFVBQVUsSUFBSTtRQUNqQyxPQUFPLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDO1lBQ3JDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUNaLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFFaEIsSUFBSSxnQkFBZ0IsRUFBRTtnQkFDcEIsUUFBUSxHQUFHLGdCQUFnQixDQUFDO2dCQUM1QixnQkFBZ0IsR0FBRyxJQUFJLENBQUM7Z0JBQ3hCLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN4QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBRUYsTUFBTSxHQUFHLEdBQUc7UUFDVixLQUFLLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM3RixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxLQUErQixFQUFFLEVBR3BDO1FBRUQsUUFBUSxHQUFHLElBQUksQ0FBQztRQUVoQixJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDcEIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3hCO2FBQU0sSUFBSSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsUUFBUSxFQUFFO1lBQ3pCLGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUN6QjtJQUNILENBQUMsQ0FBQztJQUVGLEdBQUcsQ0FBQyxLQUFLLEdBQUc7UUFDVixJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDcEIsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUIsT0FBTyxHQUFHLElBQUksQ0FBQztTQUNoQjtRQUVELElBQUksUUFBUSxFQUFFO1lBQ1osRUFBRSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLFFBQVEsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7U0FDcEM7SUFDSCxDQUFDLENBQUM7SUFFRixHQUFHLENBQUMsTUFBTSxHQUFHO1FBQ1gsUUFBUSxHQUFHLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUVuQyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDcEIsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUIsT0FBTyxHQUFHLElBQUksQ0FBQztTQUNoQjtJQUNILENBQUMsQ0FBQztJQUVGLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxDQUFDLENBQUMsb0RBQW9EO0FBRWhELE1BQU0sS0FBSyxHQUFHLFVBQVUsS0FBSyxFQUFFLElBQUk7SUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtRQUM3QixPQUFPLEVBQUUsQ0FBQztLQUNYO0lBRUQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUVyRCxPQUFPLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFO1FBQzNCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQztLQUN4RDtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUNLLE1BQU0sVUFBVSxHQUFHLFVBQVUsSUFBSTtJQUN0QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFeEMsSUFBSSxTQUFTLEVBQUU7UUFDYixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QixTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzNCO0FBQ0gsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxlQUFlLEdBQUc7SUFDN0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRXhDLElBQUksU0FBUyxFQUFFO1FBQ2IsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO0tBQzdCO0FBQ0gsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQztJQUNwQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQztBQUNLLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxRQUFRLEVBQUUsSUFBSTtJQUN0RCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzFCLE9BQU8sYUFBYSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUMvRCxJQUFJLEVBQUUsUUFBUTtZQUNkLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtTQUM1QixDQUFDLENBQUM7S0FDSjtJQUVELE9BQU8sYUFBYSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtRQUMvRCwwQkFBMEIsRUFBRSxJQUFJLENBQUMsMEJBQTBCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCO1FBQzVKLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLFVBQVUsRUFBRSxJQUFJO0tBQ2pCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUNLLE1BQU0sV0FBVyxHQUFHLFVBQVUsTUFBTTtJQUN6QyxJQUFJLE1BQU0sRUFBRTtRQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztLQUMxQjtBQUNILENBQUMsQ0FBQztBQUNLLE1BQU0sU0FBUyxHQUFHLFVBQVUsTUFBTSxFQUFFLE1BQU07SUFDL0MsSUFBSSxNQUFNLEVBQUU7UUFDVixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7S0FDOUI7QUFDSCxDQUFDLENBQUM7QUFDRixJQUFJLGlCQUFpQixDQUFDO0FBQ3RCLElBQUksY0FBYyxDQUFDO0FBQ1osTUFBTSxlQUFlLEdBQUcsVUFBVSxNQUFNLEVBQUUsS0FBSztJQUNwRCxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUU3QixNQUFNLFVBQVUsR0FBRztRQUNqQixNQUFNLFdBQVcsR0FBRyxLQUFLLEtBQUssa0RBQVUsQ0FBQztRQUN6QyxpQkFBaUIsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELGlCQUFpQixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDaEMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLGlCQUFpQixDQUFDO1FBQzdDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxpQkFBaUIsQ0FBQztRQUM1QyxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsT0FBTyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDdEIsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRixPQUFPLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsNkNBQVEsQ0FBQyxDQUFDLENBQUMsNkNBQVEsQ0FBQztRQUN0RCxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsNkNBQVEsQ0FBQyxDQUFDLENBQUMsNkNBQVEsQ0FBQztRQUN4RCxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDakIsY0FBYyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxzREFBYyxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDO0lBRUYsSUFBSSxDQUFDLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUU7UUFDM0QsVUFBVSxFQUFFLENBQUM7S0FDZDtJQUVELFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxjQUFjLEtBQUssaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQixHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdEcsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxpQkFBaUIsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3pELElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDWCxPQUFPO0tBQ1I7SUFFRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtRQUM1QyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDckI7U0FBTSxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUNoRCxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLDhEQUE4RDtRQUN2RyxvQ0FBb0M7UUFDcEMsaURBQWlEO0tBQ2xEO1NBQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2xFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLDZEQUFxQixDQUFDO0tBQzdDO0FBQ0gsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxZQUFZLEdBQUc7O0lBQzFCLE9BQU8sZUFBUSxDQUFDLGlCQUFpQiwwQ0FBRSxRQUFRLE1BQUssTUFBTSxDQUFDO0FBQ3pELENBQUMsQ0FBQztBQUNLLE1BQU0sZUFBZSxHQUFHO0lBQzdCLE9BQU8sUUFBUSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0FBQ3RELENBQUMsQ0FBQztBQUNLLE1BQU0sY0FBYyxHQUFHO0lBQzVCLE9BQU8sUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ25DLENBQUMsQ0FBQztBQUNLLE1BQU0sY0FBYyxHQUFHLFVBQVUsUUFBUTtJQUM5QyxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVwSixJQUFJLDJDQUFRLEVBQUU7UUFDWixPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztLQUNoRjtJQUVELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNwRCxDQUFDLENBQUM7QUFDSyxNQUFNLDJCQUEyQixHQUFHLFVBQVUsS0FBSyxFQUFFLEtBQUs7SUFDL0QsSUFBSSxFQUNGLE9BQU8sRUFDUCxPQUFPLEVBQ1IsR0FBRyxLQUFLLENBQUM7SUFDVixJQUFJLEVBQ0YsSUFBSSxFQUNKLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLE9BQU8sRUFDUixHQUFHLEtBQUssQ0FBQztJQUNWLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDdEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLEdBQUcsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUNyRCxPQUFPO1FBQ0wsQ0FBQztRQUNELENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBQ0ssTUFBTSwyQkFBMkIsR0FBRyxVQUFVLEtBQUssRUFBRSxLQUFLO0lBQy9ELElBQUksRUFDRixNQUFNLEVBQ04sTUFBTSxFQUNQLEdBQUcsS0FBSyxDQUFDO0lBQ1YsSUFBSSxFQUNGLElBQUksRUFDSixVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sRUFDUCxPQUFPLEVBQ1IsR0FBRyxLQUFLLENBQUM7SUFDVixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQztJQUN2RCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztJQUN0RCxPQUFPO1FBQ0wsQ0FBQztRQUNELENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBQ0ssTUFBTSxvQkFBb0IsR0FBRyxVQUFVLElBQUk7SUFDaEQsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2xGLENBQUMsQ0FBQztBQUNGLE1BQU0sWUFBWSxHQUFHLHlFQUF5RSxHQUFHLHlDQUF5QyxDQUFDO0FBQzNJLE1BQU0sWUFBWSxHQUFHLHlDQUF5QyxDQUFDO0FBQy9ELE1BQU0sWUFBWSxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sWUFBWSxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDekU7Ozs7O0dBS0c7QUFFSSxNQUFNLEtBQUssR0FBRyxVQUFVLElBQUk7SUFDakMsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQztBQUNLLE1BQU0sWUFBWSxHQUFHLFVBQVUsT0FBTztJQUMzQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUN2QixPQUFPO1FBQ0wsQ0FBQztRQUNELENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBQ0YsZ0VBQWdFO0FBRXpELE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxLQUFLO0lBQzdDLElBQUksTUFBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLElBQUksTUFBSyxZQUFZLEVBQUU7UUFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixPQUFPO0tBQ1I7SUFFRCxNQUFNLEtBQUssQ0FBQztBQUNkLENBQUMsQ0FBQztBQUNLLE1BQU0sU0FBUyxHQUFHLFVBQVUsS0FBSyxFQUFFLEVBQUU7SUFDMUMsSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdEYsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO1FBQ2pCLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztLQUN0QztJQUVELFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRCxJQUFJLEtBQUssR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRTFCLE9BQU8sRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRTtRQUM3QixJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7S0FDRjtJQUVELE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDWixDQUFDLENBQUM7QUFDSyxNQUFNLGFBQWEsR0FBRyxVQUFVLEtBQUssRUFBRSxFQUFFO0lBQzlDLElBQUksU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFckcsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO1FBQ2pCLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztLQUN0QztJQUVELFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsSUFBSSxLQUFLLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUUxQixPQUFPLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO1FBQ25CLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDbEMsT0FBTyxLQUFLLENBQUM7U0FDZDtLQUNGO0lBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNaLENBQUMsQ0FBQztBQUNLLE1BQU0sYUFBYSxHQUFHLFVBQVUsS0FBSztJQUMxQyxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQztJQUMxRSxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQztJQUM5RSxPQUFPLGdCQUFnQixJQUFJLG1CQUFtQixJQUFJLEtBQUssS0FBSyxvRUFBMkIsQ0FBQztBQUMxRixDQUFDLENBQUM7QUFDSyxNQUFNLGlCQUFpQixHQUFHO0lBQy9CLElBQUksT0FBTyxDQUFDO0lBQ1osSUFBSSxNQUFNLENBQUM7SUFDWCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLFFBQVEsRUFBRSxPQUFPO1FBQ3JELE9BQU8sR0FBRyxRQUFRLENBQUM7UUFDbkIsTUFBTSxHQUFHLE9BQU8sQ0FBQztJQUNuQixDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQzFCLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUNGOztHQUVHO0FBRUksTUFBTSxrQkFBa0IsR0FBRyxVQUFVLElBQUk7SUFDOUMsT0FBTyxVQUFVLEtBQUs7UUFDcEIsa0VBQXVCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUNGOzs7R0FHRztBQUVJLE1BQU0sMkJBQTJCLEdBQUcsVUFBVSxJQUFJO0lBQ3ZELGFBQWE7SUFDYixPQUFPLFdBQVcsQ0FBQyxVQUFVLEtBQUs7UUFDaEMsa0VBQXVCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMsMENBQTBDO0FBRXRDLE1BQU0sVUFBVSxHQUFHLFVBQVUsR0FBRyxFQUFFLE1BQU07SUFDN0MsTUFBTSxFQUFFLEdBQUcsQ0FBQztZQUNWLEtBQUssRUFBRSxDQUFDO1lBQ1IsTUFBTSxFQUFFLEdBQUc7U0FDWixFQUFFO1lBQ0QsS0FBSyxFQUFFLEdBQUc7WUFDVixNQUFNLEVBQUUsR0FBRztTQUNaLEVBQUU7WUFDRCxLQUFLLEVBQUUsR0FBRztZQUNWLE1BQU0sRUFBRSxHQUFHO1NBQ1osRUFBRTtZQUNELEtBQUssRUFBRSxHQUFHO1lBQ1YsTUFBTSxFQUFFLEdBQUc7U0FDWixDQUFDLENBQUM7SUFDSCxNQUFNLEVBQUUsR0FBRywwQkFBMEIsQ0FBQztJQUN0QyxJQUFJLEtBQUssQ0FBQztJQUVWLEtBQUssS0FBSyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDOUMsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRTtZQUMxQixNQUFNO1NBQ1A7S0FDRjtJQUVELE9BQU8sQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDdEYsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxVQUFVLEdBQUc7O0lBQ3hCLE9BQU8sZUFBUSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQywwQ0FBRSxPQUFPLEtBQUksdURBQWUsQ0FBQztBQUNwRixDQUFDLENBQUMsQ0FBQywyRkFBMkY7QUFFdkYsTUFBTSxhQUFhLEdBQUc7SUFDM0IsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXBDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDUixPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLEdBQUcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLEdBQUcsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUMsK0RBQStEO0lBQ3hGLDhCQUE4QjtJQUU5QixHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekIsT0FBTyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUQsQ0FBQyxDQUFDO0FBQ0ssTUFBTSw2QkFBNkIsR0FBRyxVQUFVLE9BQU87SUFDNUQsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUVuQyxPQUFPLE1BQU0sRUFBRTtRQUNiLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDNUIsT0FBTyxRQUFRLENBQUM7U0FDakI7UUFFRCxNQUFNLEVBQ0osU0FBUyxFQUNWLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBRXZFLElBQUksb0JBQW9CLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTSxJQUFJLFNBQVMsS0FBSyxRQUFRLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxFQUFFO1lBQ3ZHLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFFRCxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztLQUMvQjtJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMsQ0FBQztBQUNLLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxPQUFPO0lBQ2pELElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7SUFFbkMsT0FBTyxNQUFNLEVBQUU7UUFDYixJQUFJLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDeEIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTztTQUNSO1FBRUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7S0FDL0I7QUFDSCxDQUFDLENBQUM7QUFDSyxNQUFNLGFBQWEsR0FBRyxVQUFVLEtBQUs7SUFDMUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsc0VBQXNFO0lBRTlGLEtBQUssQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLENBQUMsQ0FBQztBQUNLLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxLQUFLO0lBQzdDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJO1FBQ3pDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxtQkFBbUIsR0FBRztJQUNqQyxPQUFPLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFDRjs7O0dBR0c7QUFFSSxNQUFNLFVBQVUsR0FBRyxVQUFVLEtBQUs7SUFDdkMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxFQUFFLE9BQU87UUFDeEMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRSxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxTQUFTLEdBQUc7O0lBQ3ZCLE9BQU8sT0FBTyxPQUFPLEtBQUssV0FBVyxJQUFJLG80QkFBVywwQ0FBRSxRQUFRLE1BQUssTUFBTSxDQUFDO0FBQzVFLENBQUMsQ0FBQztBQUNLLE1BQU0sU0FBUyxHQUFHOztJQUN2QixPQUFPLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxvNEJBQVcsMENBQUUsUUFBUSxNQUFLLFlBQVksQ0FBQztBQUNsRixDQUFDLENBQUM7QUFDSyxNQUFNLFNBQVMsR0FBRyxVQUFVLElBQUksRUFBRSxXQUFXO0lBQ2xELE9BQU8sSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFO1FBQzNCLE1BQU0sRUFBRTtZQUNOLFdBQVc7U0FDWjtRQUNELFVBQVUsRUFBRSxJQUFJO0tBQ2pCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUNLLE1BQU0sWUFBWSxHQUFHLFVBQVUsR0FBRyxFQUFFLE9BQU87SUFDaEQsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRXRCLEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUzQixJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVcsRUFBRTtZQUNoQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRSxnRUFBZ0U7WUFDNUYsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsRUFBRTtnQkFDNUMsU0FBUzthQUNWO1lBRUQsU0FBUyxHQUFHLElBQUksQ0FBQztTQUNsQjtLQUNGO0lBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNkLE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFFRCxPQUFPLGFBQWEsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3hELENBQUMsQ0FBQztBQUNLLE1BQU0sV0FBVyxHQUFHLFVBQVUsR0FBRztJQUN0QyxNQUFNLElBQUksR0FBRyxPQUFPLEdBQUcsQ0FBQztJQUN4QixPQUFPLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssVUFBVSxDQUFDO0FBQ2pFLENBQUMsQ0FBQztBQUNLLE1BQU0sUUFBUSxHQUFHO0lBQ3RCLElBQUk7UUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7S0FDdEQ7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLE9BQU8sUUFBUSxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxhQUFhLEdBQUcsVUFBVSxLQUFLO0lBQzFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLEtBQUssSUFBSSxPQUFPLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxLQUFLLENBQUM7QUFDM0csQ0FBQyxDQUFDO0FBQ0ssTUFBTSxzQkFBc0IsR0FBRyxVQUFVLFNBQVM7SUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsZ0JBQWdCLENBQUMsb0VBQW9FLENBQUMsQ0FBQztJQUM1SCxPQUFPLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsT0FBTztRQUMvRSxPQUFPLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDVixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vdXRpbHMudHM/YjFkYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBvYyBmcm9tIFwib3Blbi1jb2xvclwiO1xuaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi9jb2xvcnNcIjtcbmltcG9ydCB7IENVUlNPUl9UWVBFLCBERUZBVUxUX1ZFUlNJT04sIEZPTlRfRkFNSUxZLCBNSU1FX1RZUEVTLCBUSEVNRSwgV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IGlzRGFyd2luIH0gZnJvbSBcIi4va2V5c1wiO1xubGV0IG1vY2tEYXRlVGltZSA9IG51bGw7XG5leHBvcnQgY29uc3Qgc2V0RGF0ZVRpbWVGb3JUZXN0cyA9IGZ1bmN0aW9uIChkYXRlVGltZSkge1xuICBtb2NrRGF0ZVRpbWUgPSBkYXRlVGltZTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RGF0ZVRpbWUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChtb2NrRGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gbW9ja0RhdGVUaW1lO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IG1vbnRoID0gYCR7ZGF0ZS5nZXRNb250aCgpICsgMX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgZGF5ID0gYCR7ZGF0ZS5nZXREYXRlKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IGhyID0gYCR7ZGF0ZS5nZXRIb3VycygpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBtaW4gPSBgJHtkYXRlLmdldE1pbnV0ZXMoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fS0ke2hyfSR7bWlufWA7XG59O1xuZXhwb3J0IGNvbnN0IGNhcGl0YWxpemVTdHJpbmcgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG59O1xuZXhwb3J0IGNvbnN0IGlzVG9vbEljb24gPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY2xhc3NOYW1lLmluY2x1ZGVzKFwiVG9vbEljb25cIik7XG59O1xuZXhwb3J0IGNvbnN0IGlzSW5wdXRMaWtlID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8IHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50O1xufTtcbmV4cG9ydCBjb25zdCBpc1dyaXRhYmxlRWxlbWVudCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5kYXRhc2V0LnR5cGUgPT09IFwid3lzaXd5Z1wiIHx8IHRhcmdldCBpbnN0YW5jZW9mIEhUTUxCUkVsZW1lbnQgfHwgLy8gbmV3bGluZSBpbiB3eXNpd3lnXG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiAodGFyZ2V0LnR5cGUgPT09IFwidGV4dFwiIHx8IHRhcmdldC50eXBlID09PSBcIm51bWJlclwiKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0Rm9udEZhbWlseVN0cmluZyA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gIGxldCB7XG4gICAgZm9udEZhbWlseVxuICB9ID0gX3JlZjtcblxuICBmb3IgKGNvbnN0IFtmb250RmFtaWx5U3RyaW5nLCBpZF0gb2YgT2JqZWN0LmVudHJpZXMoRk9OVF9GQU1JTFkpKSB7XG4gICAgaWYgKGlkID09PSBmb250RmFtaWx5KSB7XG4gICAgICByZXR1cm4gYCR7Zm9udEZhbWlseVN0cmluZ30sICR7V0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UfWA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFdJTkRPV1NfRU1PSklfRkFMTEJBQ0tfRk9OVDtcbn07XG4vKiogcmV0dXJucyBmb250U2l6ZStmb250RmFtaWx5IHN0cmluZyBmb3IgYXNzaWdubWVudCB0byBET00gZWxlbWVudHMgKi9cblxuZXhwb3J0IGNvbnN0IGdldEZvbnRTdHJpbmcgPSBmdW5jdGlvbiAoX3JlZjIpIHtcbiAgbGV0IHtcbiAgICBmb250U2l6ZSxcbiAgICBmb250RmFtaWx5XG4gIH0gPSBfcmVmMjtcbiAgcmV0dXJuIGAke2ZvbnRTaXplfXB4ICR7Z2V0Rm9udEZhbWlseVN0cmluZyh7XG4gICAgZm9udEZhbWlseVxuICB9KX1gO1xufTtcbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IGZ1bmN0aW9uIChmbiwgdGltZW91dCkge1xuICBsZXQgaGFuZGxlID0gMDtcbiAgbGV0IGxhc3RBcmdzID0gbnVsbDtcblxuICBjb25zdCByZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGxhc3RBcmdzID0gYXJncztcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBoYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfTtcblxuICByZXQuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG5cbiAgICBpZiAobGFzdEFyZ3MpIHtcbiAgICAgIGNvbnN0IF9sYXN0QXJncyA9IGxhc3RBcmdzO1xuICAgICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgICAgZm4oLi4uX2xhc3RBcmdzKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0LmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gIH07XG5cbiAgcmV0dXJuIHJldDtcbn07IC8vIHRocm90dGxlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgb25jZSBwZXIgYW5pbWF0aW9uIGZyYW1lXG5cbmV4cG9ydCBjb25zdCB0aHJvdHRsZVJBRiA9IGZ1bmN0aW9uIChmbiwgb3B0cykge1xuICBsZXQgdGltZXJJZCA9IG51bGw7XG4gIGxldCBsYXN0QXJncyA9IG51bGw7XG4gIGxldCBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcblxuICBjb25zdCBzY2hlZHVsZUZ1bmMgPSBmdW5jdGlvbiAoYXJncykge1xuICAgIHRpbWVySWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG5cbiAgICAgIGlmIChsYXN0QXJnc1RyYWlsaW5nKSB7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdEFyZ3NUcmFpbGluZztcbiAgICAgICAgbGFzdEFyZ3NUcmFpbGluZyA9IG51bGw7XG4gICAgICAgIHNjaGVkdWxlRnVuYyhsYXN0QXJncyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcmV0ID0gZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxhc3RBcmdzID0gYXJncztcblxuICAgIGlmICh0aW1lcklkID09PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgIH0gZWxzZSBpZiAob3B0cz8udHJhaWxpbmcpIHtcbiAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBhcmdzO1xuICAgIH1cbiAgfTtcblxuICByZXQuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRpbWVySWQpO1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBmbiguLi4obGFzdEFyZ3NUcmFpbGluZyB8fCBsYXN0QXJncykpO1xuICAgICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgcmV0LmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuXG4gICAgaWYgKHRpbWVySWQgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRpbWVySWQpO1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiByZXQ7XG59OyAvLyBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL2VzL2NodW5rLmpzXG5cbmV4cG9ydCBjb25zdCBjaHVuayA9IGZ1bmN0aW9uIChhcnJheSwgc2l6ZSkge1xuICBpZiAoIWFycmF5Lmxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCByZXNJbmRleCA9IDA7XG4gIGNvbnN0IHJlc3VsdCA9IEFycmF5KE1hdGguY2VpbChhcnJheS5sZW5ndGggLyBzaXplKSk7XG5cbiAgd2hpbGUgKGluZGV4IDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYXJyYXkuc2xpY2UoaW5kZXgsIGluZGV4ICs9IHNpemUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnQgY29uc3Qgc2VsZWN0Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCByZW1vdmVTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IGRpc3RhbmNlID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHggLSB5KTtcbn07XG5leHBvcnQgY29uc3QgdXBkYXRlQWN0aXZlVG9vbCA9IGZ1bmN0aW9uIChhcHBTdGF0ZSwgZGF0YSkge1xuICBpZiAoZGF0YS50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYXBwU3RhdGUuYWN0aXZlVG9vbCksIHt9LCB7XG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgY3VzdG9tVHlwZTogZGF0YS5jdXN0b21UeXBlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBhcHBTdGF0ZS5hY3RpdmVUb29sKSwge30sIHtcbiAgICBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcjogZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciA9PT0gdW5kZWZpbmVkID8gYXBwU3RhdGUuYWN0aXZlVG9vbC5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciA6IGRhdGEubGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXIsXG4gICAgdHlwZTogZGF0YS50eXBlLFxuICAgIGN1c3RvbVR5cGU6IG51bGxcbiAgfSk7XG59O1xuZXhwb3J0IGNvbnN0IHJlc2V0Q3Vyc29yID0gZnVuY3Rpb24gKGNhbnZhcykge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yID0gZnVuY3Rpb24gKGNhbnZhcywgY3Vyc29yKSB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xubGV0IGVyYXNlckNhbnZhc0NhY2hlO1xubGV0IHByZXZpZXdEYXRhVVJMO1xuZXhwb3J0IGNvbnN0IHNldEVyYXNlckN1cnNvciA9IGZ1bmN0aW9uIChjYW52YXMsIHRoZW1lKSB7XG4gIGNvbnN0IGN1cnNvckltYWdlU2l6ZVB4ID0gMjA7XG5cbiAgY29uc3QgZHJhd0NhbnZhcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpc0RhcmtUaGVtZSA9IHRoZW1lID09PSBUSEVNRS5EQVJLO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSA9IHRoZW1lO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgY29uc3QgY29udGV4dCA9IGVyYXNlckNhbnZhc0NhY2hlLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDE7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0LmFyYyhlcmFzZXJDYW52YXNDYWNoZS53aWR0aCAvIDIsIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCAvIDIsIDUsIDAsIDIgKiBNYXRoLlBJKTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGlzRGFya1RoZW1lID8gb2MuYmxhY2sgOiBvYy53aGl0ZTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy53aGl0ZSA6IG9jLmJsYWNrO1xuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgcHJldmlld0RhdGFVUkwgPSBlcmFzZXJDYW52YXNDYWNoZS50b0RhdGFVUkwoTUlNRV9UWVBFUy5zdmcpO1xuICB9O1xuXG4gIGlmICghZXJhc2VyQ2FudmFzQ2FjaGUgfHwgZXJhc2VyQ2FudmFzQ2FjaGUudGhlbWUgIT09IHRoZW1lKSB7XG4gICAgZHJhd0NhbnZhcygpO1xuICB9XG5cbiAgc2V0Q3Vyc29yKGNhbnZhcywgYHVybCgke3ByZXZpZXdEYXRhVVJMfSkgJHtjdXJzb3JJbWFnZVNpemVQeCAvIDJ9ICR7Y3Vyc29ySW1hZ2VTaXplUHggLyAyfSwgYXV0b2ApO1xufTtcbmV4cG9ydCBjb25zdCBzZXRDdXJzb3JGb3JTaGFwZSA9IGZ1bmN0aW9uIChjYW52YXMsIGFwcFN0YXRlKSB7XG4gIGlmICghY2FudmFzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gIH0gZWxzZSBpZiAoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImVyYXNlclwiKSB7XG4gICAgc2V0RXJhc2VyQ3Vyc29yKGNhbnZhcywgYXBwU3RhdGUudGhlbWUpOyAvLyBkbyBub3RoaW5nIGlmIGltYWdlIHRvb2wgaXMgc2VsZWN0ZWQgd2hpY2ggc3VnZ2VzdHMgdGhlcmUnc1xuICAgIC8vIGEgaW1hZ2UtcHJldmlldyBzZXQgYXMgdGhlIGN1cnNvclxuICAgIC8vIElnbm9yZSBjdXN0b20gdHlwZSBhcyB3ZWxsIGFuZCBsZXQgaG9zdCBkZWNpZGVcbiAgfSBlbHNlIGlmICghW1wiaW1hZ2VcIiwgXCJjdXN0b21cIl0uaW5jbHVkZXMoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlKSkge1xuICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSBDVVJTT1JfVFlQRS5DUk9TU0hBSVI7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgaXNGdWxsU2NyZWVuID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQ/Lm5vZGVOYW1lID09PSBcIkhUTUxcIjtcbn07XG5leHBvcnQgY29uc3QgYWxsb3dGdWxsU2NyZWVuID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKCk7XG59O1xuZXhwb3J0IGNvbnN0IGV4aXRGdWxsU2NyZWVuID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0U2hvcnRjdXRLZXkgPSBmdW5jdGlvbiAoc2hvcnRjdXQpIHtcbiAgc2hvcnRjdXQgPSBzaG9ydGN1dC5yZXBsYWNlKC9cXGJBbHRcXGIvaSwgXCJBbHRcIikucmVwbGFjZSgvXFxiU2hpZnRcXGIvaSwgXCJTaGlmdFwiKS5yZXBsYWNlKC9cXGIoRW50ZXJ8UmV0dXJuKVxcYi9pLCBcIkVudGVyXCIpLnJlcGxhY2UoL1xcYkRlbFxcYi9pLCBcIkRlbGV0ZVwiKTtcblxuICBpZiAoaXNEYXJ3aW4pIHtcbiAgICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2ksIFwiQ21kXCIpLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIk9wdGlvblwiKTtcbiAgfVxuXG4gIHJldHVybiBzaG9ydGN1dC5yZXBsYWNlKC9cXGJDdHJsT3JDbWRcXGIvaSwgXCJDdHJsXCIpO1xufTtcbmV4cG9ydCBjb25zdCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMgPSBmdW5jdGlvbiAoX3JlZjMsIF9yZWY0KSB7XG4gIGxldCB7XG4gICAgY2xpZW50WCxcbiAgICBjbGllbnRZXG4gIH0gPSBfcmVmMztcbiAgbGV0IHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWVxuICB9ID0gX3JlZjQ7XG4gIGNvbnN0IGludlNjYWxlID0gMSAvIHpvb20udmFsdWU7XG4gIGNvbnN0IHggPSAoY2xpZW50WCAtIG9mZnNldExlZnQpICogaW52U2NhbGUgLSBzY3JvbGxYO1xuICBjb25zdCB5ID0gKGNsaWVudFkgLSBvZmZzZXRUb3ApICogaW52U2NhbGUgLSBzY3JvbGxZO1xuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMgPSBmdW5jdGlvbiAoX3JlZjUsIF9yZWY2KSB7XG4gIGxldCB7XG4gICAgc2NlbmVYLFxuICAgIHNjZW5lWVxuICB9ID0gX3JlZjU7XG4gIGxldCB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFlcbiAgfSA9IF9yZWY2O1xuICBjb25zdCB4ID0gKHNjZW5lWCArIHNjcm9sbFgpICogem9vbS52YWx1ZSArIG9mZnNldExlZnQ7XG4gIGNvbnN0IHkgPSAoc2NlbmVZICsgc2Nyb2xsWSkgKiB6b29tLnZhbHVlICsgb2Zmc2V0VG9wO1xuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBnZXRHbG9iYWxDU1NWYXJpYWJsZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShgLS0ke25hbWV9YCk7XG59O1xuY29uc3QgUlNfTFRSX0NIQVJTID0gXCJBLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyQjhcXHUwMzAwLVxcdTA1OTBcXHUwODAwLVxcdTFGRkZcIiArIFwiXFx1MkMwMC1cXHVGQjFDXFx1RkRGRS1cXHVGRTZGXFx1RkVGRC1cXHVGRkZGXCI7XG5jb25zdCBSU19SVExfQ0hBUlMgPSBcIlxcdTA1OTEtXFx1MDdGRlxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ1wiO1xuY29uc3QgUkVfUlRMX0NIRUNLID0gbmV3IFJlZ0V4cChgXlteJHtSU19MVFJfQ0hBUlN9XSpbJHtSU19SVExfQ0hBUlN9XWApO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBmaXJzdCBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIgaXMgUlRMLiBNZWFuaW5nIHdoZXRoZXIgaXQgc3RhcnRzXG4gKiAgd2l0aCBSVEwgY2hhcmFjdGVycywgb3IgaW5kZXRlcm1pbmF0ZSAobnVtYmVycyBldGMuKSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5XG4gKiAgUlRMLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC8xNzIyI2Rpc2N1c3Npb25fcjQzNjM0MDE3MVxuICovXG5cbmV4cG9ydCBjb25zdCBpc1JUTCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIHJldHVybiBSRV9SVExfQ0hFQ0sudGVzdCh0ZXh0KTtcbn07XG5leHBvcnQgY29uc3QgdHVwbGVUb0Nvb3JzID0gZnVuY3Rpb24gKHh5VHVwbGUpIHtcbiAgY29uc3QgW3gsIHldID0geHlUdXBsZTtcbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHlcbiAgfTtcbn07XG4vKiogdXNlIGFzIGEgcmVqZWN0aW9uSGFuZGxlciB0byBtdXRlIGZpbGVzeXN0ZW0gQWJvcnQgZXJyb3JzICovXG5cbmV4cG9ydCBjb25zdCBtdXRlRlNBYm9ydEVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gIGlmIChlcnJvcj8ubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHtcbiAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IGVycm9yO1xufTtcbmV4cG9ydCBjb25zdCBmaW5kSW5kZXggPSBmdW5jdGlvbiAoYXJyYXksIGNiKSB7XG4gIGxldCBmcm9tSW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7XG5cbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cblxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGgsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggLSAxO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgaWYgKGNiKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn07XG5leHBvcnQgY29uc3QgZmluZExhc3RJbmRleCA9IGZ1bmN0aW9uIChhcnJheSwgY2IpIHtcbiAgbGV0IGZyb21JbmRleCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyYXkubGVuZ3RoIC0gMTtcblxuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuXG4gIGZyb21JbmRleCA9IE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuXG4gIHdoaWxlICgtLWluZGV4ID4gLTEpIHtcbiAgICBpZiAoY2IoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufTtcbmV4cG9ydCBjb25zdCBpc1RyYW5zcGFyZW50ID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gIGNvbnN0IGlzUkdCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDUgJiYgY29sb3Iuc3Vic3RyKDQsIDEpID09PSBcIjBcIjtcbiAgY29uc3QgaXNSUkdHQkJUcmFuc3BhcmVudCA9IGNvbG9yLmxlbmd0aCA9PT0gOSAmJiBjb2xvci5zdWJzdHIoNywgMikgPT09IFwiMDBcIjtcbiAgcmV0dXJuIGlzUkdCVHJhbnNwYXJlbnQgfHwgaXNSUkdHQkJUcmFuc3BhcmVudCB8fCBjb2xvciA9PT0gY29sb3JzLmVsZW1lbnRCYWNrZ3JvdW5kWzBdO1xufTtcbmV4cG9ydCBjb25zdCByZXNvbHZhYmxlUHJvbWlzZSA9IGZ1bmN0aW9uICgpIHtcbiAgbGV0IHJlc29sdmU7XG4gIGxldCByZWplY3Q7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAoX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIHByb21pc2UucmVzb2x2ZSA9IHJlc29sdmU7XG4gIHByb21pc2UucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZTtcbn07XG4vKipcbiAqIEBwYXJhbSBmdW5jIGhhbmRsZXIgdGFraW5nIGF0IG1vc3Qgc2luZ2xlIHBhcmFtZXRlciAoZXZlbnQpLlxuICovXG5cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXMgPSBmdW5jdGlvbiAoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYywgZXZlbnQpO1xuICB9O1xufTtcbi8qKlxuICogYmFyY2hlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIGFuZCB0aHJvdHRsZXMgdGhlIGNhbGxzIHRvIGEgc2luZ2xlIGNhbGwgcGVyXG4gKiBhbmltYXRpb24gZnJhbWVcbiAqL1xuXG5leHBvcnQgY29uc3Qgd2l0aEJhdGNoZWRVcGRhdGVzVGhyb3R0bGVkID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gdGhyb3R0bGVSQUYoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYywgZXZlbnQpO1xuICB9KTtcbn07IC8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuXG5leHBvcnQgY29uc3QgbkZvcm1hdHRlciA9IGZ1bmN0aW9uIChudW0sIGRpZ2l0cykge1xuICBjb25zdCBzaSA9IFt7XG4gICAgdmFsdWU6IDEsXG4gICAgc3ltYm9sOiBcImJcIlxuICB9LCB7XG4gICAgdmFsdWU6IDFlMyxcbiAgICBzeW1ib2w6IFwia1wiXG4gIH0sIHtcbiAgICB2YWx1ZTogMWU2LFxuICAgIHN5bWJvbDogXCJNXCJcbiAgfSwge1xuICAgIHZhbHVlOiAxZTksXG4gICAgc3ltYm9sOiBcIkdcIlxuICB9XTtcbiAgY29uc3QgcnggPSAvXFwuMCskfChcXC5bMC05XSpbMS05XSkwKyQvO1xuICBsZXQgaW5kZXg7XG5cbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKG51bSAvIHNpW2luZGV4XS52YWx1ZSkudG9GaXhlZChkaWdpdHMpLnJlcGxhY2UocngsIFwiJDFcIikgKyBzaVtpbmRleF0uc3ltYm9sO1xufTtcbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8IERFRkFVTFRfVkVSU0lPTjtcbn07IC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvZW1vamkuanNcblxuZXhwb3J0IGNvbnN0IHN1cHBvcnRzRW1vamkgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSAxMjtcbiAgY3R4LmZpbGxTdHlsZSA9IFwiI2YwMFwiO1xuICBjdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcbiAgY3R4LmZvbnQgPSBcIjMycHggQXJpYWxcIjsgLy8gTW9kZXJuaXpyIHVzZWQg8J+QqCwgYnV0IGl0IGlzIHNvcnQgb2Ygc3VwcG9ydGVkIG9uIFdpbmRvd3MgNy5cbiAgLy8gTHVja2lseSDwn5iAIGlzbid0IHN1cHBvcnRlZC5cblxuICBjdHguZmlsbFRleHQoXCLwn5iAXCIsIDAsIDApO1xuICByZXR1cm4gY3R4LmdldEltYWdlRGF0YShvZmZzZXQsIG9mZnNldCwgMSwgMSkuZGF0YVswXSAhPT0gMDtcbn07XG5leHBvcnQgY29uc3QgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgb3ZlcmZsb3dZXG4gICAgfSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudCk7XG4gICAgY29uc3QgaGFzU2Nyb2xsYWJsZUNvbnRlbnQgPSBwYXJlbnQuc2Nyb2xsSGVpZ2h0ID4gcGFyZW50LmNsaWVudEhlaWdodDtcblxuICAgIGlmIChoYXNTY3JvbGxhYmxlQ29udGVudCAmJiAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fCBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHwgb3ZlcmZsb3dZID09PSBcIm92ZXJsYXlcIikpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gZG9jdW1lbnQ7XG59O1xuZXhwb3J0IGNvbnN0IGZvY3VzTmVhcmVzdFBhcmVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGlmIChwYXJlbnQudGFiSW5kZXggPiAtMSkge1xuICAgICAgcGFyZW50LmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgcHJldmVudFVubG9hZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBOT1RFOiBtb2Rlcm4gYnJvd3NlcnMgbm8gbG9uZ2VyIGFsbG93IHNob3dpbmcgYSBjdXN0b20gbWVzc2FnZSBoZXJlXG5cbiAgZXZlbnQucmV0dXJuVmFsdWUgPSBcIlwiO1xufTtcbmV4cG9ydCBjb25zdCBieXRlc1RvSGV4U3RyaW5nID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKS5tYXAoZnVuY3Rpb24gKGJ5dGUpIHtcbiAgICByZXR1cm4gYDAke2J5dGUudG9TdHJpbmcoMTYpfWAuc2xpY2UoLTIpO1xuICB9KS5qb2luKFwiXCIpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRVcGRhdGVkVGltZXN0YW1wID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaXNUZXN0RW52KCkgPyAxIDogRGF0ZS5ub3coKTtcbn07XG4vKipcbiAqIFRyYW5zZm9ybXMgYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGBpZGAgYXR0cmlidXRlLFxuICogb3IgYXJyYXkgb2YgaWRzIChzdHJpbmdzKSwgaW50byBhIE1hcCwga2V5ZCBieSBgaWRgLlxuICovXG5cbmV4cG9ydCBjb25zdCBhcnJheVRvTWFwID0gZnVuY3Rpb24gKGl0ZW1zKSB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZWxlbWVudCkge1xuICAgIGFjYy5zZXQodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIgPyBlbGVtZW50IDogZWxlbWVudC5pZCwgZWxlbWVudCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgbmV3IE1hcCgpKTtcbn07XG5leHBvcnQgY29uc3QgaXNUZXN0RW52ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInRlc3RcIjtcbn07XG5leHBvcnQgY29uc3QgaXNQcm9kRW52ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIjtcbn07XG5leHBvcnQgY29uc3Qgd3JhcEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBuZXcgQ3VzdG9tRXZlbnQobmFtZSwge1xuICAgIGRldGFpbDoge1xuICAgICAgbmF0aXZlRXZlbnRcbiAgICB9LFxuICAgIGNhbmNlbGFibGU6IHRydWVcbiAgfSk7XG59O1xuZXhwb3J0IGNvbnN0IHVwZGF0ZU9iamVjdCA9IGZ1bmN0aW9uIChvYmosIHVwZGF0ZXMpIHtcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHVwZGF0ZXNba2V5XTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChvYmpba2V5XSA9PT0gdmFsdWUgJiYgKCAvLyBpZiBvYmplY3QsIGFsd2F5cyB1cGRhdGUgYmVjYXVzZSBpdHMgYXR0cnMgY291bGQgaGF2ZSBjaGFuZ2VkXG4gICAgICB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9iaiksIHVwZGF0ZXMpO1xufTtcbmV4cG9ydCBjb25zdCBpc1ByaW1pdGl2ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCB0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwiZnVuY3Rpb25cIjtcbn07XG5leHBvcnQgY29uc3QgZ2V0RnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5zZWxmID09PSB3aW5kb3cudG9wID8gXCJ0b3BcIiA6IFwiaWZyYW1lXCI7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFwiaWZyYW1lXCI7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgaXNQcm9taXNlTGlrZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJ0aGVuXCIgaW4gdmFsdWUgJiYgXCJjYXRjaFwiIGluIHZhbHVlICYmIFwiZmluYWxseVwiIGluIHZhbHVlO1xufTtcbmV4cG9ydCBjb25zdCBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbChcImJ1dHRvbiwgYSwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGRpdlt0YWJpbmRleF0sIGxhYmVsW3RhYmluZGV4XVwiKTtcbiAgcmV0dXJuIGZvY3VzYWJsZUVsZW1lbnRzID8gQXJyYXkuZnJvbShmb2N1c2FibGVFbGVtZW50cykuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQudGFiSW5kZXggPiAtMSAmJiAhZWxlbWVudC5kaXNhYmxlZDtcbiAgfSkgOiBbXTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///../../utils.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../utils.ts?");
|
|
3173
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"allowFullScreen\\\": () => (/* binding */ allowFullScreen),\\n/* harmony export */ \\\"arrayToMap\\\": () => (/* binding */ arrayToMap),\\n/* harmony export */ \\\"bytesToHexString\\\": () => (/* binding */ bytesToHexString),\\n/* harmony export */ \\\"capitalizeString\\\": () => (/* binding */ capitalizeString),\\n/* harmony export */ \\\"chunk\\\": () => (/* binding */ chunk),\\n/* harmony export */ \\\"debounce\\\": () => (/* binding */ debounce),\\n/* harmony export */ \\\"distance\\\": () => (/* binding */ distance),\\n/* harmony export */ \\\"exitFullScreen\\\": () => (/* binding */ exitFullScreen),\\n/* harmony export */ \\\"findIndex\\\": () => (/* binding */ findIndex),\\n/* harmony export */ \\\"findLastIndex\\\": () => (/* binding */ findLastIndex),\\n/* harmony export */ \\\"focusNearestParent\\\": () => (/* binding */ focusNearestParent),\\n/* harmony export */ \\\"getDateTime\\\": () => (/* binding */ getDateTime),\\n/* harmony export */ \\\"getFontFamilyString\\\": () => (/* binding */ getFontFamilyString),\\n/* harmony export */ \\\"getFontString\\\": () => (/* binding */ getFontString),\\n/* harmony export */ \\\"getFrame\\\": () => (/* binding */ getFrame),\\n/* harmony export */ \\\"getGlobalCSSVariable\\\": () => (/* binding */ getGlobalCSSVariable),\\n/* harmony export */ \\\"getNearestScrollableContainer\\\": () => (/* binding */ getNearestScrollableContainer),\\n/* harmony export */ \\\"getShortcutKey\\\": () => (/* binding */ getShortcutKey),\\n/* harmony export */ \\\"getUpdatedTimestamp\\\": () => (/* binding */ getUpdatedTimestamp),\\n/* harmony export */ \\\"getVersion\\\": () => (/* binding */ getVersion),\\n/* harmony export */ \\\"isFullScreen\\\": () => (/* binding */ isFullScreen),\\n/* harmony export */ \\\"isInputLike\\\": () => (/* binding */ isInputLike),\\n/* harmony export */ \\\"isPrimitive\\\": () => (/* binding */ isPrimitive),\\n/* harmony export */ \\\"isProdEnv\\\": () => (/* binding */ isProdEnv),\\n/* harmony export */ \\\"isPromiseLike\\\": () => (/* binding */ isPromiseLike),\\n/* harmony export */ \\\"isRTL\\\": () => (/* binding */ isRTL),\\n/* harmony export */ \\\"isTestEnv\\\": () => (/* binding */ isTestEnv),\\n/* harmony export */ \\\"isToolIcon\\\": () => (/* binding */ isToolIcon),\\n/* harmony export */ \\\"isTransparent\\\": () => (/* binding */ isTransparent),\\n/* harmony export */ \\\"isWritableElement\\\": () => (/* binding */ isWritableElement),\\n/* harmony export */ \\\"muteFSAbortError\\\": () => (/* binding */ muteFSAbortError),\\n/* harmony export */ \\\"nFormatter\\\": () => (/* binding */ nFormatter),\\n/* harmony export */ \\\"preventUnload\\\": () => (/* binding */ preventUnload),\\n/* harmony export */ \\\"queryFocusableElements\\\": () => (/* binding */ queryFocusableElements),\\n/* harmony export */ \\\"removeSelection\\\": () => (/* binding */ removeSelection),\\n/* harmony export */ \\\"resetCursor\\\": () => (/* binding */ resetCursor),\\n/* harmony export */ \\\"resolvablePromise\\\": () => (/* binding */ resolvablePromise),\\n/* harmony export */ \\\"sceneCoordsToViewportCoords\\\": () => (/* binding */ sceneCoordsToViewportCoords),\\n/* harmony export */ \\\"selectNode\\\": () => (/* binding */ selectNode),\\n/* harmony export */ \\\"setCursor\\\": () => (/* binding */ setCursor),\\n/* harmony export */ \\\"setCursorForShape\\\": () => (/* binding */ setCursorForShape),\\n/* harmony export */ \\\"setDateTimeForTests\\\": () => (/* binding */ setDateTimeForTests),\\n/* harmony export */ \\\"setEraserCursor\\\": () => (/* binding */ setEraserCursor),\\n/* harmony export */ \\\"supportsEmoji\\\": () => (/* binding */ supportsEmoji),\\n/* harmony export */ \\\"throttleRAF\\\": () => (/* binding */ throttleRAF),\\n/* harmony export */ \\\"tupleToCoors\\\": () => (/* binding */ tupleToCoors),\\n/* harmony export */ \\\"updateActiveTool\\\": () => (/* binding */ updateActiveTool),\\n/* harmony export */ \\\"updateObject\\\": () => (/* binding */ updateObject),\\n/* harmony export */ \\\"viewportCoordsToSceneCoords\\\": () => (/* binding */ viewportCoordsToSceneCoords),\\n/* harmony export */ \\\"withBatchedUpdates\\\": () => (/* binding */ withBatchedUpdates),\\n/* harmony export */ \\\"withBatchedUpdatesThrottled\\\": () => (/* binding */ withBatchedUpdatesThrottled),\\n/* harmony export */ \\\"wrapEvent\\\": () => (/* binding */ wrapEvent)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\\\");\\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! open-color */ \\\"../../../node_modules/open-color/open-color.json\\\");\\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./colors */ \\\"../../colors.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \\\"react-dom\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./keys */ \\\"../../keys.ts\\\");\\n\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\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_3__.FONT_FAMILY)) {\\r\\n if (id === fontFamily) {\\r\\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_3__.WINDOWS_EMOJI_FALLBACK_FONT}`;\\r\\n }\\r\\n }\\r\\n return _constants__WEBPACK_IMPORTED_MODULE_3__.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}; // throttle callback to execute once per animation frame\\r\\nconst throttleRAF = function (fn, opts) {\\r\\n let timerId = null;\\r\\n let lastArgs = null;\\r\\n let lastArgsTrailing = null;\\r\\n const scheduleFunc = function (args) {\\r\\n timerId = window.requestAnimationFrame(function () {\\r\\n timerId = null;\\r\\n fn(...args);\\r\\n lastArgs = null;\\r\\n if (lastArgsTrailing) {\\r\\n lastArgs = lastArgsTrailing;\\r\\n lastArgsTrailing = null;\\r\\n scheduleFunc(lastArgs);\\r\\n }\\r\\n });\\r\\n };\\r\\n const ret = function () {\\r\\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\\r\\n args[_key2] = arguments[_key2];\\r\\n }\\r\\n if (false) {}\\r\\n lastArgs = args;\\r\\n if (timerId === null) {\\r\\n scheduleFunc(lastArgs);\\r\\n }\\r\\n else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\\r\\n lastArgsTrailing = args;\\r\\n }\\r\\n };\\r\\n ret.flush = function () {\\r\\n if (timerId !== null) {\\r\\n cancelAnimationFrame(timerId);\\r\\n timerId = null;\\r\\n }\\r\\n if (lastArgs) {\\r\\n fn(...(lastArgsTrailing || lastArgs));\\r\\n lastArgs = lastArgsTrailing = null;\\r\\n }\\r\\n };\\r\\n ret.cancel = function () {\\r\\n lastArgs = lastArgsTrailing = null;\\r\\n if (timerId !== null) {\\r\\n cancelAnimationFrame(timerId);\\r\\n timerId = null;\\r\\n }\\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 updateActiveTool = function (appState, data) {\\r\\n if (data.type === \\\"custom\\\") {\\r\\n return _objectSpread(_objectSpread({}, appState.activeTool), {}, {\\r\\n type: \\\"custom\\\",\\r\\n customType: data.customType\\r\\n });\\r\\n }\\r\\n return _objectSpread(_objectSpread({}, appState.activeTool), {}, {\\r\\n lastActiveToolBeforeEraser: data.lastActiveToolBeforeEraser === undefined ? appState.activeTool.lastActiveToolBeforeEraser : data.lastActiveToolBeforeEraser,\\r\\n type: data.type,\\r\\n customType: null\\r\\n });\\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\\nlet eraserCanvasCache;\\r\\nlet previewDataURL;\\r\\nconst setEraserCursor = function (canvas, theme) {\\r\\n const cursorImageSizePx = 20;\\r\\n const drawCanvas = function () {\\r\\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_3__.THEME.DARK;\\r\\n eraserCanvasCache = document.createElement(\\\"canvas\\\");\\r\\n eraserCanvasCache.theme = theme;\\r\\n eraserCanvasCache.height = cursorImageSizePx;\\r\\n eraserCanvasCache.width = cursorImageSizePx;\\r\\n const context = eraserCanvasCache.getContext(\\\"2d\\\");\\r\\n context.lineWidth = 1;\\r\\n context.beginPath();\\r\\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\\r\\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_1__.black : open_color__WEBPACK_IMPORTED_MODULE_1__.white;\\r\\n context.fill();\\r\\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_1__.white : open_color__WEBPACK_IMPORTED_MODULE_1__.black;\\r\\n context.stroke();\\r\\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_3__.MIME_TYPES.svg);\\r\\n };\\r\\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\\r\\n drawCanvas();\\r\\n }\\r\\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\\r\\n};\\r\\nconst setCursorForShape = function (canvas, appState) {\\r\\n if (!canvas) {\\r\\n return;\\r\\n }\\r\\n if (appState.activeTool.type === \\\"selection\\\") {\\r\\n resetCursor(canvas);\\r\\n }\\r\\n else if (appState.activeTool.type === \\\"eraser\\\") {\\r\\n setEraserCursor(canvas, appState.theme); // do nothing if image tool is selected which suggests there's\\r\\n // a image-preview set as the cursor\\r\\n // Ignore custom type as well and let host decide\\r\\n }\\r\\n else if (![\\\"image\\\", \\\"custom\\\"].includes(appState.activeTool.type)) {\\r\\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_3__.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_5__.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 - offsetLeft) * invScale - scrollX;\\r\\n const y = (clientY - 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 + offsetLeft;\\r\\n const y = (sceneY + scrollY) * zoom.value + 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_2__[\\\"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_4__.unstable_batchedUpdates)(func, event);\\r\\n };\\r\\n};\\r\\n/**\\r\\n * barches React state updates and throttles the calls to a single call per\\r\\n * animation frame\\r\\n */\\r\\nconst withBatchedUpdatesThrottled = function (func) {\\r\\n // @ts-ignore\\r\\n return throttleRAF(function (event) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_4__.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_3__.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\\\" || overflowY === \\\"overlay\\\")) {\\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_WS_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_PORTAL_URL\\\":\\\"\\\",\\\"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\\\\\\\"}\\\",\\\"REACT_APP_DEV_ENABLE_SW\\\":\\\"\\\",\\\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\\\":\\\"\\\",\\\"PKG_NAME\\\":\\\"@zsviczian/excalidraw\\\",\\\"PKG_VERSION\\\":\\\"0.12.0-obsidian-4\\\",\\\"IS_EXCALIDRAW_NPM_PACKAGE\\\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \\\"test\\\";\\r\\n};\\r\\nconst isProdEnv = 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_WS_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_PORTAL_URL\\\":\\\"\\\",\\\"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\\\\\\\"}\\\",\\\"REACT_APP_DEV_ENABLE_SW\\\":\\\"\\\",\\\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\\\":\\\"\\\",\\\"PKG_NAME\\\":\\\"@zsviczian/excalidraw\\\",\\\"PKG_VERSION\\\":\\\"0.12.0-obsidian-4\\\",\\\"IS_EXCALIDRAW_NPM_PACKAGE\\\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \\\"production\\\";\\r\\n};\\r\\nconst wrapEvent = function (name, nativeEvent) {\\r\\n return new CustomEvent(name, {\\r\\n detail: {\\r\\n nativeEvent\\r\\n },\\r\\n cancelable: true\\r\\n });\\r\\n};\\r\\nconst updateObject = function (obj, updates) {\\r\\n let didChange = false;\\r\\n for (const key in updates) {\\r\\n const value = updates[key];\\r\\n if (typeof value !== \\\"undefined\\\") {\\r\\n if (obj[key] === value && ( // if object, always update because its attrs could have changed\\r\\n typeof value !== \\\"object\\\" || value === null)) {\\r\\n continue;\\r\\n }\\r\\n didChange = true;\\r\\n }\\r\\n }\\r\\n if (!didChange) {\\r\\n return obj;\\r\\n }\\r\\n return _objectSpread(_objectSpread({}, obj), updates);\\r\\n};\\r\\nconst isPrimitive = function (val) {\\r\\n const type = typeof val;\\r\\n return val == null || type !== \\\"object\\\" && type !== \\\"function\\\";\\r\\n};\\r\\nconst getFrame = function () {\\r\\n try {\\r\\n return window.self === window.top ? \\\"top\\\" : \\\"iframe\\\";\\r\\n }\\r\\n catch (error) {\\r\\n return \\\"iframe\\\";\\r\\n }\\r\\n};\\r\\nconst isPromiseLike = function (value) {\\r\\n return !!value && typeof value === \\\"object\\\" && \\\"then\\\" in value && \\\"catch\\\" in value && \\\"finally\\\" in value;\\r\\n};\\r\\nconst queryFocusableElements = function (container) {\\r\\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\\\"button, a, input, select, textarea, div[tabindex], label[tabindex]\\\");\\r\\n return focusableElements ? Array.from(focusableElements).filter(function (element) {\\r\\n return element.tabIndex > -1 && !element.disabled;\\r\\n }) : [];\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q2pCO0FBQ0gsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxhQUFhLEdBQUcsVUFBVSxLQUFLO0lBQzFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLEtBQUssSUFBSSxPQUFPLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxLQUFLLENBQUM7QUFDM0csQ0FBQyxDQUFDO0FBQ0ssTUFBTSxzQkFBc0IsR0FBRyxVQUFVLFNBQVM7SUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsZ0JBQWdCLENBQUMsb0VBQW9FLENBQUMsQ0FBQztJQUM1SCxPQUFPLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsT0FBTztRQUMvRSxPQUFPLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDVixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vdXRpbHMudHM/YjFkYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBvYyBmcm9tIFwib3Blbi1jb2xvclwiO1xuaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi9jb2xvcnNcIjtcbmltcG9ydCB7IENVUlNPUl9UWVBFLCBERUZBVUxUX1ZFUlNJT04sIEZPTlRfRkFNSUxZLCBNSU1FX1RZUEVTLCBUSEVNRSwgV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IGlzRGFyd2luIH0gZnJvbSBcIi4va2V5c1wiO1xubGV0IG1vY2tEYXRlVGltZSA9IG51bGw7XG5leHBvcnQgY29uc3Qgc2V0RGF0ZVRpbWVGb3JUZXN0cyA9IGZ1bmN0aW9uIChkYXRlVGltZSkge1xuICBtb2NrRGF0ZVRpbWUgPSBkYXRlVGltZTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RGF0ZVRpbWUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChtb2NrRGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gbW9ja0RhdGVUaW1lO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IG1vbnRoID0gYCR7ZGF0ZS5nZXRNb250aCgpICsgMX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgZGF5ID0gYCR7ZGF0ZS5nZXREYXRlKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IGhyID0gYCR7ZGF0ZS5nZXRIb3VycygpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBtaW4gPSBgJHtkYXRlLmdldE1pbnV0ZXMoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fS0ke2hyfSR7bWlufWA7XG59O1xuZXhwb3J0IGNvbnN0IGNhcGl0YWxpemVTdHJpbmcgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG59O1xuZXhwb3J0IGNvbnN0IGlzVG9vbEljb24gPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY2xhc3NOYW1lLmluY2x1ZGVzKFwiVG9vbEljb25cIik7XG59O1xuZXhwb3J0IGNvbnN0IGlzSW5wdXRMaWtlID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8IHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50O1xufTtcbmV4cG9ydCBjb25zdCBpc1dyaXRhYmxlRWxlbWVudCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5kYXRhc2V0LnR5cGUgPT09IFwid3lzaXd5Z1wiIHx8IHRhcmdldCBpbnN0YW5jZW9mIEhUTUxCUkVsZW1lbnQgfHwgLy8gbmV3bGluZSBpbiB3eXNpd3lnXG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiAodGFyZ2V0LnR5cGUgPT09IFwidGV4dFwiIHx8IHRhcmdldC50eXBlID09PSBcIm51bWJlclwiKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0Rm9udEZhbWlseVN0cmluZyA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gIGxldCB7XG4gICAgZm9udEZhbWlseVxuICB9ID0gX3JlZjtcblxuICBmb3IgKGNvbnN0IFtmb250RmFtaWx5U3RyaW5nLCBpZF0gb2YgT2JqZWN0LmVudHJpZXMoRk9OVF9GQU1JTFkpKSB7XG4gICAgaWYgKGlkID09PSBmb250RmFtaWx5KSB7XG4gICAgICByZXR1cm4gYCR7Zm9udEZhbWlseVN0cmluZ30sICR7V0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UfWA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFdJTkRPV1NfRU1PSklfRkFMTEJBQ0tfRk9OVDtcbn07XG4vKiogcmV0dXJucyBmb250U2l6ZStmb250RmFtaWx5IHN0cmluZyBmb3IgYXNzaWdubWVudCB0byBET00gZWxlbWVudHMgKi9cblxuZXhwb3J0IGNvbnN0IGdldEZvbnRTdHJpbmcgPSBmdW5jdGlvbiAoX3JlZjIpIHtcbiAgbGV0IHtcbiAgICBmb250U2l6ZSxcbiAgICBmb250RmFtaWx5XG4gIH0gPSBfcmVmMjtcbiAgcmV0dXJuIGAke2ZvbnRTaXplfXB4ICR7Z2V0Rm9udEZhbWlseVN0cmluZyh7XG4gICAgZm9udEZhbWlseVxuICB9KX1gO1xufTtcbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IGZ1bmN0aW9uIChmbiwgdGltZW91dCkge1xuICBsZXQgaGFuZGxlID0gMDtcbiAgbGV0IGxhc3RBcmdzID0gbnVsbDtcblxuICBjb25zdCByZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGxhc3RBcmdzID0gYXJncztcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBoYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfTtcblxuICByZXQuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG5cbiAgICBpZiAobGFzdEFyZ3MpIHtcbiAgICAgIGNvbnN0IF9sYXN0QXJncyA9IGxhc3RBcmdzO1xuICAgICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgICAgZm4oLi4uX2xhc3RBcmdzKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0LmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gIH07XG5cbiAgcmV0dXJuIHJldDtcbn07IC8vIHRocm90dGxlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgb25jZSBwZXIgYW5pbWF0aW9uIGZyYW1lXG5cbmV4cG9ydCBjb25zdCB0aHJvdHRsZVJBRiA9IGZ1bmN0aW9uIChmbiwgb3B0cykge1xuICBsZXQgdGltZXJJZCA9IG51bGw7XG4gIGxldCBsYXN0QXJncyA9IG51bGw7XG4gIGxldCBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcblxuICBjb25zdCBzY2hlZHVsZUZ1bmMgPSBmdW5jdGlvbiAoYXJncykge1xuICAgIHRpbWVySWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG5cbiAgICAgIGlmIChsYXN0QXJnc1RyYWlsaW5nKSB7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdEFyZ3NUcmFpbGluZztcbiAgICAgICAgbGFzdEFyZ3NUcmFpbGluZyA9IG51bGw7XG4gICAgICAgIHNjaGVkdWxlRnVuYyhsYXN0QXJncyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcmV0ID0gZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxhc3RBcmdzID0gYXJncztcblxuICAgIGlmICh0aW1lcklkID09PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgIH0gZWxzZSBpZiAob3B0cz8udHJhaWxpbmcpIHtcbiAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBhcmdzO1xuICAgIH1cbiAgfTtcblxuICByZXQuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRpbWVySWQpO1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBmbiguLi4obGFzdEFyZ3NUcmFpbGluZyB8fCBsYXN0QXJncykpO1xuICAgICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgcmV0LmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuXG4gICAgaWYgKHRpbWVySWQgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRpbWVySWQpO1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiByZXQ7XG59OyAvLyBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL2VzL2NodW5rLmpzXG5cbmV4cG9ydCBjb25zdCBjaHVuayA9IGZ1bmN0aW9uIChhcnJheSwgc2l6ZSkge1xuICBpZiAoIWFycmF5Lmxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCByZXNJbmRleCA9IDA7XG4gIGNvbnN0IHJlc3VsdCA9IEFycmF5KE1hdGguY2VpbChhcnJheS5sZW5ndGggLyBzaXplKSk7XG5cbiAgd2hpbGUgKGluZGV4IDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYXJyYXkuc2xpY2UoaW5kZXgsIGluZGV4ICs9IHNpemUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnQgY29uc3Qgc2VsZWN0Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCByZW1vdmVTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IGRpc3RhbmNlID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHggLSB5KTtcbn07XG5leHBvcnQgY29uc3QgdXBkYXRlQWN0aXZlVG9vbCA9IGZ1bmN0aW9uIChhcHBTdGF0ZSwgZGF0YSkge1xuICBpZiAoZGF0YS50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYXBwU3RhdGUuYWN0aXZlVG9vbCksIHt9LCB7XG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgY3VzdG9tVHlwZTogZGF0YS5jdXN0b21UeXBlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBhcHBTdGF0ZS5hY3RpdmVUb29sKSwge30sIHtcbiAgICBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcjogZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciA9PT0gdW5kZWZpbmVkID8gYXBwU3RhdGUuYWN0aXZlVG9vbC5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciA6IGRhdGEubGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXIsXG4gICAgdHlwZTogZGF0YS50eXBlLFxuICAgIGN1c3RvbVR5cGU6IG51bGxcbiAgfSk7XG59O1xuZXhwb3J0IGNvbnN0IHJlc2V0Q3Vyc29yID0gZnVuY3Rpb24gKGNhbnZhcykge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yID0gZnVuY3Rpb24gKGNhbnZhcywgY3Vyc29yKSB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xubGV0IGVyYXNlckNhbnZhc0NhY2hlO1xubGV0IHByZXZpZXdEYXRhVVJMO1xuZXhwb3J0IGNvbnN0IHNldEVyYXNlckN1cnNvciA9IGZ1bmN0aW9uIChjYW52YXMsIHRoZW1lKSB7XG4gIGNvbnN0IGN1cnNvckltYWdlU2l6ZVB4ID0gMjA7XG5cbiAgY29uc3QgZHJhd0NhbnZhcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpc0RhcmtUaGVtZSA9IHRoZW1lID09PSBUSEVNRS5EQVJLO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSA9IHRoZW1lO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgY29uc3QgY29udGV4dCA9IGVyYXNlckNhbnZhc0NhY2hlLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDE7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0LmFyYyhlcmFzZXJDYW52YXNDYWNoZS53aWR0aCAvIDIsIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCAvIDIsIDUsIDAsIDIgKiBNYXRoLlBJKTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGlzRGFya1RoZW1lID8gb2MuYmxhY2sgOiBvYy53aGl0ZTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy53aGl0ZSA6IG9jLmJsYWNrO1xuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgcHJldmlld0RhdGFVUkwgPSBlcmFzZXJDYW52YXNDYWNoZS50b0RhdGFVUkwoTUlNRV9UWVBFUy5zdmcpO1xuICB9O1xuXG4gIGlmICghZXJhc2VyQ2FudmFzQ2FjaGUgfHwgZXJhc2VyQ2FudmFzQ2FjaGUudGhlbWUgIT09IHRoZW1lKSB7XG4gICAgZHJhd0NhbnZhcygpO1xuICB9XG5cbiAgc2V0Q3Vyc29yKGNhbnZhcywgYHVybCgke3ByZXZpZXdEYXRhVVJMfSkgJHtjdXJzb3JJbWFnZVNpemVQeCAvIDJ9ICR7Y3Vyc29ySW1hZ2VTaXplUHggLyAyfSwgYXV0b2ApO1xufTtcbmV4cG9ydCBjb25zdCBzZXRDdXJzb3JGb3JTaGFwZSA9IGZ1bmN0aW9uIChjYW52YXMsIGFwcFN0YXRlKSB7XG4gIGlmICghY2FudmFzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gIH0gZWxzZSBpZiAoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImVyYXNlclwiKSB7XG4gICAgc2V0RXJhc2VyQ3Vyc29yKGNhbnZhcywgYXBwU3RhdGUudGhlbWUpOyAvLyBkbyBub3RoaW5nIGlmIGltYWdlIHRvb2wgaXMgc2VsZWN0ZWQgd2hpY2ggc3VnZ2VzdHMgdGhlcmUnc1xuICAgIC8vIGEgaW1hZ2UtcHJldmlldyBzZXQgYXMgdGhlIGN1cnNvclxuICAgIC8vIElnbm9yZSBjdXN0b20gdHlwZSBhcyB3ZWxsIGFuZCBsZXQgaG9zdCBkZWNpZGVcbiAgfSBlbHNlIGlmICghW1wiaW1hZ2VcIiwgXCJjdXN0b21cIl0uaW5jbHVkZXMoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlKSkge1xuICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSBDVVJTT1JfVFlQRS5DUk9TU0hBSVI7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgaXNGdWxsU2NyZWVuID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQ/Lm5vZGVOYW1lID09PSBcIkhUTUxcIjtcbn07XG5leHBvcnQgY29uc3QgYWxsb3dGdWxsU2NyZWVuID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKCk7XG59O1xuZXhwb3J0IGNvbnN0IGV4aXRGdWxsU2NyZWVuID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0U2hvcnRjdXRLZXkgPSBmdW5jdGlvbiAoc2hvcnRjdXQpIHtcbiAgc2hvcnRjdXQgPSBzaG9ydGN1dC5yZXBsYWNlKC9cXGJBbHRcXGIvaSwgXCJBbHRcIikucmVwbGFjZSgvXFxiU2hpZnRcXGIvaSwgXCJTaGlmdFwiKS5yZXBsYWNlKC9cXGIoRW50ZXJ8UmV0dXJuKVxcYi9pLCBcIkVudGVyXCIpLnJlcGxhY2UoL1xcYkRlbFxcYi9pLCBcIkRlbGV0ZVwiKTtcblxuICBpZiAoaXNEYXJ3aW4pIHtcbiAgICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2ksIFwiQ21kXCIpLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIk9wdGlvblwiKTtcbiAgfVxuXG4gIHJldHVybiBzaG9ydGN1dC5yZXBsYWNlKC9cXGJDdHJsT3JDbWRcXGIvaSwgXCJDdHJsXCIpO1xufTtcbmV4cG9ydCBjb25zdCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMgPSBmdW5jdGlvbiAoX3JlZjMsIF9yZWY0KSB7XG4gIGxldCB7XG4gICAgY2xpZW50WCxcbiAgICBjbGllbnRZXG4gIH0gPSBfcmVmMztcbiAgbGV0IHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWVxuICB9ID0gX3JlZjQ7XG4gIGNvbnN0IGludlNjYWxlID0gMSAvIHpvb20udmFsdWU7XG4gIGNvbnN0IHggPSAoY2xpZW50WCAtIG9mZnNldExlZnQpICogaW52U2NhbGUgLSBzY3JvbGxYO1xuICBjb25zdCB5ID0gKGNsaWVudFkgLSBvZmZzZXRUb3ApICogaW52U2NhbGUgLSBzY3JvbGxZO1xuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMgPSBmdW5jdGlvbiAoX3JlZjUsIF9yZWY2KSB7XG4gIGxldCB7XG4gICAgc2NlbmVYLFxuICAgIHNjZW5lWVxuICB9ID0gX3JlZjU7XG4gIGxldCB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFlcbiAgfSA9IF9yZWY2O1xuICBjb25zdCB4ID0gKHNjZW5lWCArIHNjcm9sbFgpICogem9vbS52YWx1ZSArIG9mZnNldExlZnQ7XG4gIGNvbnN0IHkgPSAoc2NlbmVZICsgc2Nyb2xsWSkgKiB6b29tLnZhbHVlICsgb2Zmc2V0VG9wO1xuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBnZXRHbG9iYWxDU1NWYXJpYWJsZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShgLS0ke25hbWV9YCk7XG59O1xuY29uc3QgUlNfTFRSX0NIQVJTID0gXCJBLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyQjhcXHUwMzAwLVxcdTA1OTBcXHUwODAwLVxcdTFGRkZcIiArIFwiXFx1MkMwMC1cXHVGQjFDXFx1RkRGRS1cXHVGRTZGXFx1RkVGRC1cXHVGRkZGXCI7XG5jb25zdCBSU19SVExfQ0hBUlMgPSBcIlxcdTA1OTEtXFx1MDdGRlxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ1wiO1xuY29uc3QgUkVfUlRMX0NIRUNLID0gbmV3IFJlZ0V4cChgXlteJHtSU19MVFJfQ0hBUlN9XSpbJHtSU19SVExfQ0hBUlN9XWApO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBmaXJzdCBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIgaXMgUlRMLiBNZWFuaW5nIHdoZXRoZXIgaXQgc3RhcnRzXG4gKiAgd2l0aCBSVEwgY2hhcmFjdGVycywgb3IgaW5kZXRlcm1pbmF0ZSAobnVtYmVycyBldGMuKSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5XG4gKiAgUlRMLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC8xNzIyI2Rpc2N1c3Npb25fcjQzNjM0MDE3MVxuICovXG5cbmV4cG9ydCBjb25zdCBpc1JUTCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIHJldHVybiBSRV9SVExfQ0hFQ0sudGVzdCh0ZXh0KTtcbn07XG5leHBvcnQgY29uc3QgdHVwbGVUb0Nvb3JzID0gZnVuY3Rpb24gKHh5VHVwbGUpIHtcbiAgY29uc3QgW3gsIHldID0geHlUdXBsZTtcbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHlcbiAgfTtcbn07XG4vKiogdXNlIGFzIGEgcmVqZWN0aW9uSGFuZGxlciB0byBtdXRlIGZpbGVzeXN0ZW0gQWJvcnQgZXJyb3JzICovXG5cbmV4cG9ydCBjb25zdCBtdXRlRlNBYm9ydEVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gIGlmIChlcnJvcj8ubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHtcbiAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IGVycm9yO1xufTtcbmV4cG9ydCBjb25zdCBmaW5kSW5kZXggPSBmdW5jdGlvbiAoYXJyYXksIGNiKSB7XG4gIGxldCBmcm9tSW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7XG5cbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cblxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGgsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggLSAxO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgaWYgKGNiKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn07XG5leHBvcnQgY29uc3QgZmluZExhc3RJbmRleCA9IGZ1bmN0aW9uIChhcnJheSwgY2IpIHtcbiAgbGV0IGZyb21JbmRleCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyYXkubGVuZ3RoIC0gMTtcblxuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuXG4gIGZyb21JbmRleCA9IE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuXG4gIHdoaWxlICgtLWluZGV4ID4gLTEpIHtcbiAgICBpZiAoY2IoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufTtcbmV4cG9ydCBjb25zdCBpc1RyYW5zcGFyZW50ID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gIGNvbnN0IGlzUkdCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDUgJiYgY29sb3Iuc3Vic3RyKDQsIDEpID09PSBcIjBcIjtcbiAgY29uc3QgaXNSUkdHQkJUcmFuc3BhcmVudCA9IGNvbG9yLmxlbmd0aCA9PT0gOSAmJiBjb2xvci5zdWJzdHIoNywgMikgPT09IFwiMDBcIjtcbiAgcmV0dXJuIGlzUkdCVHJhbnNwYXJlbnQgfHwgaXNSUkdHQkJUcmFuc3BhcmVudCB8fCBjb2xvciA9PT0gY29sb3JzLmVsZW1lbnRCYWNrZ3JvdW5kWzBdO1xufTtcbmV4cG9ydCBjb25zdCByZXNvbHZhYmxlUHJvbWlzZSA9IGZ1bmN0aW9uICgpIHtcbiAgbGV0IHJlc29sdmU7XG4gIGxldCByZWplY3Q7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAoX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIHByb21pc2UucmVzb2x2ZSA9IHJlc29sdmU7XG4gIHByb21pc2UucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZTtcbn07XG4vKipcbiAqIEBwYXJhbSBmdW5jIGhhbmRsZXIgdGFraW5nIGF0IG1vc3Qgc2luZ2xlIHBhcmFtZXRlciAoZXZlbnQpLlxuICovXG5cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXMgPSBmdW5jdGlvbiAoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYywgZXZlbnQpO1xuICB9O1xufTtcbi8qKlxuICogYmFyY2hlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIGFuZCB0aHJvdHRsZXMgdGhlIGNhbGxzIHRvIGEgc2luZ2xlIGNhbGwgcGVyXG4gKiBhbmltYXRpb24gZnJhbWVcbiAqL1xuXG5leHBvcnQgY29uc3Qgd2l0aEJhdGNoZWRVcGRhdGVzVGhyb3R0bGVkID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gdGhyb3R0bGVSQUYoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYywgZXZlbnQpO1xuICB9KTtcbn07IC8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuXG5leHBvcnQgY29uc3QgbkZvcm1hdHRlciA9IGZ1bmN0aW9uIChudW0sIGRpZ2l0cykge1xuICBjb25zdCBzaSA9IFt7XG4gICAgdmFsdWU6IDEsXG4gICAgc3ltYm9sOiBcImJcIlxuICB9LCB7XG4gICAgdmFsdWU6IDFlMyxcbiAgICBzeW1ib2w6IFwia1wiXG4gIH0sIHtcbiAgICB2YWx1ZTogMWU2LFxuICAgIHN5bWJvbDogXCJNXCJcbiAgfSwge1xuICAgIHZhbHVlOiAxZTksXG4gICAgc3ltYm9sOiBcIkdcIlxuICB9XTtcbiAgY29uc3QgcnggPSAvXFwuMCskfChcXC5bMC05XSpbMS05XSkwKyQvO1xuICBsZXQgaW5kZXg7XG5cbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKG51bSAvIHNpW2luZGV4XS52YWx1ZSkudG9GaXhlZChkaWdpdHMpLnJlcGxhY2UocngsIFwiJDFcIikgKyBzaVtpbmRleF0uc3ltYm9sO1xufTtcbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8IERFRkFVTFRfVkVSU0lPTjtcbn07IC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvZW1vamkuanNcblxuZXhwb3J0IGNvbnN0IHN1cHBvcnRzRW1vamkgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSAxMjtcbiAgY3R4LmZpbGxTdHlsZSA9IFwiI2YwMFwiO1xuICBjdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcbiAgY3R4LmZvbnQgPSBcIjMycHggQXJpYWxcIjsgLy8gTW9kZXJuaXpyIHVzZWQg8J+QqCwgYnV0IGl0IGlzIHNvcnQgb2Ygc3VwcG9ydGVkIG9uIFdpbmRvd3MgNy5cbiAgLy8gTHVja2lseSDwn5iAIGlzbid0IHN1cHBvcnRlZC5cblxuICBjdHguZmlsbFRleHQoXCLwn5iAXCIsIDAsIDApO1xuICByZXR1cm4gY3R4LmdldEltYWdlRGF0YShvZmZzZXQsIG9mZnNldCwgMSwgMSkuZGF0YVswXSAhPT0gMDtcbn07XG5leHBvcnQgY29uc3QgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgb3ZlcmZsb3dZXG4gICAgfSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudCk7XG4gICAgY29uc3QgaGFzU2Nyb2xsYWJsZUNvbnRlbnQgPSBwYXJlbnQuc2Nyb2xsSGVpZ2h0ID4gcGFyZW50LmNsaWVudEhlaWdodDtcblxuICAgIGlmIChoYXNTY3JvbGxhYmxlQ29udGVudCAmJiAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fCBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHwgb3ZlcmZsb3dZID09PSBcIm92ZXJsYXlcIikpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gZG9jdW1lbnQ7XG59O1xuZXhwb3J0IGNvbnN0IGZvY3VzTmVhcmVzdFBhcmVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGlmIChwYXJlbnQudGFiSW5kZXggPiAtMSkge1xuICAgICAgcGFyZW50LmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgcHJldmVudFVubG9hZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBOT1RFOiBtb2Rlcm4gYnJvd3NlcnMgbm8gbG9uZ2VyIGFsbG93IHNob3dpbmcgYSBjdXN0b20gbWVzc2FnZSBoZXJlXG5cbiAgZXZlbnQucmV0dXJuVmFsdWUgPSBcIlwiO1xufTtcbmV4cG9ydCBjb25zdCBieXRlc1RvSGV4U3RyaW5nID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKS5tYXAoZnVuY3Rpb24gKGJ5dGUpIHtcbiAgICByZXR1cm4gYDAke2J5dGUudG9TdHJpbmcoMTYpfWAuc2xpY2UoLTIpO1xuICB9KS5qb2luKFwiXCIpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRVcGRhdGVkVGltZXN0YW1wID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaXNUZXN0RW52KCkgPyAxIDogRGF0ZS5ub3coKTtcbn07XG4vKipcbiAqIFRyYW5zZm9ybXMgYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGBpZGAgYXR0cmlidXRlLFxuICogb3IgYXJyYXkgb2YgaWRzIChzdHJpbmdzKSwgaW50byBhIE1hcCwga2V5ZCBieSBgaWRgLlxuICovXG5cbmV4cG9ydCBjb25zdCBhcnJheVRvTWFwID0gZnVuY3Rpb24gKGl0ZW1zKSB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZWxlbWVudCkge1xuICAgIGFjYy5zZXQodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIgPyBlbGVtZW50IDogZWxlbWVudC5pZCwgZWxlbWVudCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgbmV3IE1hcCgpKTtcbn07XG5leHBvcnQgY29uc3QgaXNUZXN0RW52ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInRlc3RcIjtcbn07XG5leHBvcnQgY29uc3QgaXNQcm9kRW52ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIjtcbn07XG5leHBvcnQgY29uc3Qgd3JhcEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBuZXcgQ3VzdG9tRXZlbnQobmFtZSwge1xuICAgIGRldGFpbDoge1xuICAgICAgbmF0aXZlRXZlbnRcbiAgICB9LFxuICAgIGNhbmNlbGFibGU6IHRydWVcbiAgfSk7XG59O1xuZXhwb3J0IGNvbnN0IHVwZGF0ZU9iamVjdCA9IGZ1bmN0aW9uIChvYmosIHVwZGF0ZXMpIHtcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHVwZGF0ZXNba2V5XTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChvYmpba2V5XSA9PT0gdmFsdWUgJiYgKCAvLyBpZiBvYmplY3QsIGFsd2F5cyB1cGRhdGUgYmVjYXVzZSBpdHMgYXR0cnMgY291bGQgaGF2ZSBjaGFuZ2VkXG4gICAgICB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9iaiksIHVwZGF0ZXMpO1xufTtcbmV4cG9ydCBjb25zdCBpc1ByaW1pdGl2ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCB0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwiZnVuY3Rpb25cIjtcbn07XG5leHBvcnQgY29uc3QgZ2V0RnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5zZWxmID09PSB3aW5kb3cudG9wID8gXCJ0b3BcIiA6IFwiaWZyYW1lXCI7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFwiaWZyYW1lXCI7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgaXNQcm9taXNlTGlrZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJ0aGVuXCIgaW4gdmFsdWUgJiYgXCJjYXRjaFwiIGluIHZhbHVlICYmIFwiZmluYWxseVwiIGluIHZhbHVlO1xufTtcbmV4cG9ydCBjb25zdCBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbChcImJ1dHRvbiwgYSwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGRpdlt0YWJpbmRleF0sIGxhYmVsW3RhYmluZGV4XVwiKTtcbiAgcmV0dXJuIGZvY3VzYWJsZUVsZW1lbnRzID8gQXJyYXkuZnJvbShmb2N1c2FibGVFbGVtZW50cykuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQudGFiSW5kZXggPiAtMSAmJiAhZWxlbWVudC5kaXNhYmxlZDtcbiAgfSkgOiBbXTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///../../utils.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../utils.ts?");
|
|
3174
3174
|
|
|
3175
3175
|
/***/ }),
|
|
3176
3176
|
|