@excalidraw/excalidraw 0.13.0-c8f6e3f → 0.13.0-f5379d1
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.
|
@@ -2034,7 +2034,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2034
2034
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2035
2035
|
|
|
2036
2036
|
"use strict";
|
|
2037
|
-
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;\nconst trackEvent = typeof process !== \"undefined\" &&\n ((_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\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.13.0-
|
|
2037
|
+
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;\nconst trackEvent = typeof process !== \"undefined\" &&\n ((_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\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.13.0-f5379d1\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.REACT_APP_GOOGLE_ANALYTICS_ID) &&\n typeof window !== \"undefined\" &&\n window.gtag\n ? (category, action, label, value) => {\n try {\n window.gtag(\"event\", action, {\n event_category: category,\n event_label: label,\n value,\n });\n }\n catch (error) {\n console.error(\"error logging to ga\", error);\n }\n }\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\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.13.0-f5379d1\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _b === void 0 ? void 0 : _b.JEST_WORKER_ID)\n ? (category, action, label, value) => { }\n : (category, action, label, value) => {\n // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQU8sTUFBTSxVQUFVLEdBQ3JCLE9BQU8sT0FBTyxLQUFLLFdBQVc7S0FDOUIsaTRCQUFXLDBDQUFFLDZCQUE2QjtJQUMxQyxPQUFPLE1BQU0sS0FBSyxXQUFXO0lBQzdCLE1BQU0sQ0FBQyxJQUFJO0lBQ1QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFO1FBQ25FLElBQUk7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQzNCLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixXQUFXLEVBQUUsS0FBSztnQkFDbEIsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLEtBQUksaTRCQUFXLDBDQUFFLGNBQWM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFLEdBQUUsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxLQUFjLEVBQUUsS0FBYyxFQUFFLEVBQUU7WUFDbkUsMkNBQTJDO1lBQzNDLGtFQUFrRTtRQUNwRSxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYW5hbHl0aWNzLnRzPzVmMGMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHRyYWNrRXZlbnQgPVxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICBwcm9jZXNzLmVudj8uUkVBQ1RfQVBQX0dPT0dMRV9BTkFMWVRJQ1NfSUQgJiZcbiAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICB3aW5kb3cuZ3RhZ1xuICAgID8gKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3aW5kb3cuZ3RhZyhcImV2ZW50XCIsIGFjdGlvbiwge1xuICAgICAgICAgICAgZXZlbnRfY2F0ZWdvcnk6IGNhdGVnb3J5LFxuICAgICAgICAgICAgZXZlbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIGxvZ2dpbmcgdG8gZ2FcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgOiB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uSkVTVF9XT1JLRVJfSURcbiAgICA/IChjYXRlZ29yeTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHZhbHVlPzogbnVtYmVyKSA9PiB7fVxuICAgIDogKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gdHJhY2sgbG9jYWxseVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRyYWNrIEV2ZW50XCIsIHsgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwsIHZhbHVlIH0pO1xuICAgICAgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
|
|
2038
2038
|
|
|
2039
2039
|
/***/ }),
|
|
2040
2040
|
|
|
@@ -2859,7 +2859,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2859
2859
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2860
2860
|
|
|
2861
2861
|
"use strict";
|
|
2862
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getArrowheadPoints\": () => (/* binding */ getArrowheadPoints),\n/* harmony export */ \"getClosestElementBounds\": () => (/* binding */ getClosestElementBounds),\n/* harmony export */ \"getCommonBoundingBox\": () => (/* binding */ getCommonBoundingBox),\n/* harmony export */ \"getCommonBounds\": () => (/* binding */ getCommonBounds),\n/* harmony export */ \"getCurvePathOps\": () => (/* binding */ getCurvePathOps),\n/* harmony export */ \"getDiamondPoints\": () => (/* binding */ getDiamondPoints),\n/* harmony export */ \"getElementAbsoluteCoords\": () => (/* binding */ getElementAbsoluteCoords),\n/* harmony export */ \"getElementBounds\": () => (/* binding */ getElementBounds),\n/* harmony export */ \"getElementPointsCoords\": () => (/* binding */ getElementPointsCoords),\n/* harmony export */ \"getResizedElementAbsoluteCoords\": () => (/* binding */ getResizedElementAbsoluteCoords),\n/* harmony export */ \"pointRelativeTo\": () => (/* binding */ pointRelativeTo)\n/* harmony export */ });\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\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 _renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../points */ \"../../points.ts\");\n\n\n\n\n\n// If the element is created from right to left, the width is going to be negative\n// This set of functions retrieves the absolute position of the 4 points.\nconst getElementAbsoluteCoords = (element) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n return getFreeDrawElementAbsoluteCoords(element);\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n return getLinearElementAbsoluteCoords(element);\n }\n return [\n element.x,\n element.y,\n element.x + element.width,\n element.y + element.height,\n ];\n};\nconst pointRelativeTo = (element, absoluteCoords) => {\n return [absoluteCoords[0] - element.x, absoluteCoords[1] - element.y];\n};\nconst getDiamondPoints = (element) => {\n // Here we add +1 to avoid these numbers to be 0\n // otherwise rough.js will throw an error complaining about it\n const topX = Math.floor(element.width / 2) + 1;\n const topY = 0;\n const rightX = element.width;\n const rightY = Math.floor(element.height / 2) + 1;\n const bottomX = topX;\n const bottomY = element.height;\n const leftX = 0;\n const leftY = rightY;\n return [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY];\n};\nconst getCurvePathOps = (shape) => {\n for (const set of shape.sets) {\n if (set.type === \"path\") {\n return set.ops;\n }\n }\n return shape.sets[0].ops;\n};\n// reference: https://eliot-jones.com/2019/12/cubic-bezier-curve-bounding-boxes\nconst getBezierValueForT = (t, p0, p1, p2, p3) => {\n const oneMinusT = 1 - t;\n return (Math.pow(oneMinusT, 3) * p0 +\n 3 * Math.pow(oneMinusT, 2) * t * p1 +\n 3 * oneMinusT * Math.pow(t, 2) * p2 +\n Math.pow(t, 3) * p3);\n};\nconst solveQuadratic = (p0, p1, p2, p3) => {\n const i = p1 - p0;\n const j = p2 - p1;\n const k = p3 - p2;\n const a = 3 * i - 6 * j + 3 * k;\n const b = 6 * j - 6 * i;\n const c = 3 * i;\n const sqrtPart = b * b - 4 * a * c;\n const hasSolution = sqrtPart >= 0;\n if (!hasSolution) {\n return false;\n }\n let s1 = null;\n let s2 = null;\n let t1 = Infinity;\n let t2 = Infinity;\n if (a === 0) {\n t1 = t2 = -c / b;\n }\n else {\n t1 = (-b + Math.sqrt(sqrtPart)) / (2 * a);\n t2 = (-b - Math.sqrt(sqrtPart)) / (2 * a);\n }\n if (t1 >= 0 && t1 <= 1) {\n s1 = getBezierValueForT(t1, p0, p1, p2, p3);\n }\n if (t2 >= 0 && t2 <= 1) {\n s2 = getBezierValueForT(t2, p0, p1, p2, p3);\n }\n return [s1, s2];\n};\nconst getCubicBezierCurveBound = (p0, p1, p2, p3) => {\n const solX = solveQuadratic(p0[0], p1[0], p2[0], p3[0]);\n const solY = solveQuadratic(p0[1], p1[1], p2[1], p3[1]);\n let minX = Math.min(p0[0], p3[0]);\n let maxX = Math.max(p0[0], p3[0]);\n if (solX) {\n const xs = solX.filter((x) => x !== null);\n minX = Math.min(minX, ...xs);\n maxX = Math.max(maxX, ...xs);\n }\n let minY = Math.min(p0[1], p3[1]);\n let maxY = Math.max(p0[1], p3[1]);\n if (solY) {\n const ys = solY.filter((y) => y !== null);\n minY = Math.min(minY, ...ys);\n maxY = Math.max(maxY, ...ys);\n }\n return [minX, minY, maxX, maxY];\n};\nconst getMinMaxXYFromCurvePathOps = (ops, transformXY) => {\n let currentP = [0, 0];\n const { minX, minY, maxX, maxY } = ops.reduce((limits, { op, data }) => {\n // There are only four operation types:\n // move, bcurveTo, lineTo, and curveTo\n if (op === \"move\") {\n // change starting point\n currentP = data;\n // move operation does not draw anything; so, it always\n // returns false\n }\n else if (op === \"bcurveTo\") {\n const _p1 = [data[0], data[1]];\n const _p2 = [data[2], data[3]];\n const _p3 = [data[4], data[5]];\n const p1 = transformXY ? transformXY(..._p1) : _p1;\n const p2 = transformXY ? transformXY(..._p2) : _p2;\n const p3 = transformXY ? transformXY(..._p3) : _p3;\n const p0 = transformXY ? transformXY(...currentP) : currentP;\n currentP = _p3;\n const [minX, minY, maxX, maxY] = getCubicBezierCurveBound(p0, p1, p2, p3);\n limits.minX = Math.min(limits.minX, minX);\n limits.minY = Math.min(limits.minY, minY);\n limits.maxX = Math.max(limits.maxX, maxX);\n limits.maxY = Math.max(limits.maxY, maxY);\n }\n else if (op === \"lineTo\") {\n // TODO: Implement this\n }\n else if (op === \"qcurveTo\") {\n // TODO: Implement this\n }\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n return [minX, minY, maxX, maxY];\n};\nconst getBoundsFromPoints = (points) => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const [x, y] of points) {\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n return [minX, minY, maxX, maxY];\n};\nconst getFreeDrawElementAbsoluteCoords = (element) => {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points);\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getLinearElementAbsoluteCoords = (element) => {\n let coords;\n if (element.points.length < 2 || !(0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element)) {\n // XXX this is just a poor estimate and not very useful\n const { minX, minY, maxX, maxY } = element.points.reduce((limits, [x, y]) => {\n limits.minY = Math.min(limits.minY, y);\n limits.minX = Math.min(limits.minX, x);\n limits.maxX = Math.max(limits.maxX, x);\n limits.maxY = Math.max(limits.maxY, y);\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n coords = [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n else {\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element);\n // first element is always the curve\n const ops = getCurvePathOps(shape[0]);\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n coords = [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n return coords;\n};\nconst getArrowheadPoints = (element, shape, position, arrowhead) => {\n const ops = getCurvePathOps(shape[0]);\n if (ops.length < 1) {\n return null;\n }\n // The index of the bCurve operation to examine.\n const index = position === \"start\" ? 1 : ops.length - 1;\n const data = ops[index].data;\n const p3 = [data[4], data[5]];\n const p2 = [data[2], data[3]];\n const p1 = [data[0], data[1]];\n // We need to find p0 of the bezier curve.\n // It is typically the last point of the previous\n // curve; it can also be the position of moveTo operation.\n const prevOp = ops[index - 1];\n let p0 = [0, 0];\n if (prevOp.op === \"move\") {\n p0 = prevOp.data;\n }\n else if (prevOp.op === \"bcurveTo\") {\n p0 = [prevOp.data[4], prevOp.data[5]];\n }\n // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3\n const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n // Ee know the last point of the arrow (or the first, if start arrowhead).\n const [x2, y2] = position === \"start\" ? p0 : p3;\n // By using cubic bezier equation (B(t)) and the given parameters,\n // we calculate a point that is closer to the last point.\n // The value 0.3 is chosen arbitrarily and it works best for all\n // the tested cases.\n const [x1, y1] = [equation(0.3, 0), equation(0.3, 1)];\n // Find the normalized direction vector based on the\n // previously calculated points.\n const distance = Math.hypot(x2 - x1, y2 - y1);\n const nx = (x2 - x1) / distance;\n const ny = (y2 - y1) / distance;\n const size = {\n arrow: 30,\n bar: 15,\n dot: 15,\n triangle: 15,\n }[arrowhead]; // pixels (will differ for each arrowhead)\n let length = 0;\n if (arrowhead === \"arrow\") {\n // Length for -> arrows is based on the length of the last section\n const [cx, cy] = element.points[element.points.length - 1];\n const [px, py] = element.points.length > 1\n ? element.points[element.points.length - 2]\n : [0, 0];\n length = Math.hypot(cx - px, cy - py);\n }\n else {\n // Length for other arrowhead types is based on the total length of the line\n for (let i = 0; i < element.points.length; i++) {\n const [px, py] = element.points[i - 1] || [0, 0];\n const [cx, cy] = element.points[i];\n length += Math.hypot(cx - px, cy - py);\n }\n }\n // Scale down the arrowhead until we hit a certain size so that it doesn't look weird.\n // This value is selected by minimizing a minimum size with the last segment of the arrowhead\n const minSize = Math.min(size, length / 2);\n const xs = x2 - nx * minSize;\n const ys = y2 - ny * minSize;\n if (arrowhead === \"dot\") {\n const r = Math.hypot(ys - y2, xs - x2) + element.strokeWidth;\n return [x2, y2, r];\n }\n const angle = {\n arrow: 20,\n bar: 90,\n triangle: 25,\n }[arrowhead]; // degrees\n // Return points\n const [x3, y3] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, (-angle * Math.PI) / 180);\n const [x4, y4] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, (angle * Math.PI) / 180);\n return [x2, y2, x3, y3, x4, y4];\n};\nconst getLinearElementRotatedBounds = (element, cx, cy) => {\n if (element.points.length < 2 || !(0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element)) {\n // XXX this is just a poor estimate and not very useful\n const { minX, minY, maxX, maxY } = element.points.reduce((limits, [x, y]) => {\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + x, element.y + y, cx, cy, element.angle);\n limits.minY = Math.min(limits.minY, y);\n limits.minX = Math.min(limits.minX, x);\n limits.maxX = Math.max(limits.maxX, x);\n limits.maxY = Math.max(limits.maxY, y);\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n return [minX, minY, maxX, maxY];\n }\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element);\n // first element is always the curve\n const ops = getCurvePathOps(shape[0]);\n const transformXY = (x, y) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + x, element.y + y, cx, cy, element.angle);\n return getMinMaxXYFromCurvePathOps(ops, transformXY);\n};\n// We could cache this stuff\nconst getElementBounds = (element) => {\n let bounds;\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points.map(([x, y]) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x, y, cx - element.x, cy - element.y, element.angle)));\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n bounds = getLinearElementRotatedBounds(element, cx, cy);\n }\n else if (element.type === \"diamond\") {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, cy, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, cy, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n else if (element.type === \"ellipse\") {\n const w = (x2 - x1) / 2;\n const h = (y2 - y1) / 2;\n const cos = Math.cos(element.angle);\n const sin = Math.sin(element.angle);\n const ww = Math.hypot(w * cos, h * sin);\n const hh = Math.hypot(h * cos, w * sin);\n bounds = [cx - ww, cy - hh, cx + ww, cy + hh];\n }\n else {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y2, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y1, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n return bounds;\n};\nconst getCommonBounds = (elements) => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n minX = Math.min(minX, x1);\n minY = Math.min(minY, y1);\n maxX = Math.max(maxX, x2);\n maxY = Math.max(maxY, y2);\n });\n return [minX, minY, maxX, maxY];\n};\nconst getResizedElementAbsoluteCoords = (element, nextWidth, nextHeight, normalizePoints) => {\n if (!((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element))) {\n return [\n element.x,\n element.y,\n element.x + nextWidth,\n element.y + nextHeight,\n ];\n }\n const points = (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(0, nextWidth, (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(1, nextHeight, element.points, normalizePoints), normalizePoints);\n let bounds;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n // Free Draw\n bounds = getBoundsFromPoints(points);\n }\n else {\n // Line\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = element.strokeSharpness === \"sharp\"\n ? gen.linearPath(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element))\n : gen.curve(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n bounds = getMinMaxXYFromCurvePathOps(ops);\n }\n const [minX, minY, maxX, maxY] = bounds;\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getElementPointsCoords = (element, points, sharpness) => {\n // This might be computationally heavey\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = sharpness === \"sharp\"\n ? gen.linearPath(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element))\n : gen.curve(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getClosestElementBounds = (elements, from) => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n let minDistance = Infinity;\n let closestElement = elements[0];\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)((x1 + x2) / 2, (y1 + y2) / 2, from.x, from.y);\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element;\n }\n });\n return getElementBounds(closestElement);\n};\nconst getCommonBoundingBox = (elements) => {\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n return {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n midX: (minX + maxX) / 2,\n midY: (minY + maxY) / 2,\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsQyxJQUFJLElBQUksRUFBRTtRQUNSLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQWEsQ0FBQztRQUN0RCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM3QixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztLQUM5QjtJQUVELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLElBQUksSUFBSSxFQUFFO1FBQ1IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBYSxDQUFDO1FBQ3RELElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQzlCO0lBQ0QsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FB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RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ25DO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUssTUFBTSxlQUFlLEdBQUcsQ0FDN0IsUUFBc0MsRUFDSixFQUFFO0lBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1FBQ3BCLE9BQU8sQ0FBQyxDQUFDLEVB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QUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELE1BQU0sUUFBUSxHQUFHLGlEQUFVLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUxRSxJQUFJLFFBQVEsR0FBRyxXQUFXLEVBQUU7WUFDMUIsV0FBVyxHQUFHLFFBQVEsQ0FBQztZQUN2QixjQUFjLEdBQUcsT0FBTyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQzFDLENBQUMsQ0FBQztBQWFLLE1BQU0sb0JBQW9CLEdBQUcsQ0FDbEMsUUFBd0UsRUFDbkUsRUFBRTtJQUNQLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0QsT0FBTztRQUNMLElBQUk7UUFDSixJQUFJO1FBQ0osSUFBSTtRQUNKLElBQUk7UUFDSixLQUFLLEVBQUUsSUFBSSxHQUFHLElBQUk7UUFDbEIsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJO1FBQ25CLElBQUksRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3ZCLElBQUksRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0tBQ3hCLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC9ib3VuZHMudHM/OGJlMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEFycm93aGVhZCxcbiAgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGRpc3RhbmNlMmQsIHJvdGF0ZSB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgeyBEcmF3YWJsZSwgT3AgfSBmcm9tIFwicm91Z2hqcy9iaW4vY29yZVwiO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldFNoYXBlRm9yRWxlbWVudCxcbiAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMsXG59IGZyb20gXCIuLi9yZW5kZXJlci9yZW5kZXJFbGVtZW50XCI7XG5pbXBvcnQgeyBpc0ZyZWVEcmF3RWxlbWVudCwgaXNMaW5lYXJFbGVtZW50IH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgcmVzY2FsZVBvaW50cyB9IGZyb20gXCIuLi9wb2ludHNcIjtcblxuLy8geCBhbmQgeSBwb3NpdGlvbiBvZiB0b3AgbGVmdCBjb3JuZXIsIHggYW5kIHkgcG9zaXRpb24gb2YgYm90dG9tIHJpZ2h0IGNvcm5lclxuZXhwb3J0IHR5cGUgQm91bmRzID0gcmVhZG9ubHkgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG50eXBlIE1heWJlUXVhZHJhdGljU29sdXRpb24gPSBbbnVtYmVyIHwgbnVsbCwgbnVtYmVyIHwgbnVsbF0gfCBmYWxzZTtcblxuLy8gSWYgdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBmcm9tIHJpZ2h0IHRvIGxlZnQsIHRoZSB3aWR0aCBpcyBnb2luZyB0byBiZSBuZWdhdGl2ZVxuLy8gVGhpcyBzZXQgb2YgZnVuY3Rpb25zIHJldHJpZXZlcyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIDQgcG9pbnRzLlxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQsXG4pOiBCb3VuZHMgPT4ge1xuICBpZiAoaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gZ2V0RnJlZURyYXdFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIH0gZWxzZSBpZiAoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGdldExpbmVhckVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgfVxuICByZXR1cm4gW1xuICAgIGVsZW1lbnQueCxcbiAgICBlbGVtZW50LnksXG4gICAgZWxlbWVudC54ICsgZWxlbWVudC53aWR0aCxcbiAgICBlbGVtZW50LnkgKyBlbGVtZW50LmhlaWdodCxcbiAgXTtcbn07XG5cbmV4cG9ydCBjb25zdCBwb2ludFJlbGF0aXZlVG8gPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBhYnNvbHV0ZUNvb3JkczogUG9pbnQsXG4pOiBQb2ludCA9PiB7XG4gIHJldHVybiBbYWJzb2x1dGVDb29yZHNbMF0gLSBlbGVtZW50LngsIGFic29sdXRlQ29vcmRzWzFdIC0gZWxlbWVudC55XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREaWFtb25kUG9pbnRzID0gKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gIC8vIEhlcmUgd2UgYWRkICsxIHRvIGF2b2lkIHRoZXNlIG51bWJlcnMgdG8gYmUgMFxuICAvLyBvdGhlcndpc2Ugcm91Z2guanMgd2lsbCB0aHJvdyBhbiBlcnJvciBjb21wbGFpbmluZyBhYm91dCBpdFxuICBjb25zdCB0b3BYID0gTWF0aC5mbG9vcihlbGVtZW50LndpZHRoIC8gMikgKyAxO1xuICBjb25zdCB0b3BZID0gMDtcbiAgY29uc3QgcmlnaHRYID0gZWxlbWVudC53aWR0aDtcbiAgY29uc3QgcmlnaHRZID0gTWF0aC5mbG9vcihlbGVtZW50LmhlaWdodCAvIDIpICsgMTtcbiAgY29uc3QgYm90dG9tWCA9IHRvcFg7XG4gIGNvbnN0IGJvdHRvbVkgPSBlbGVtZW50LmhlaWdodDtcbiAgY29uc3QgbGVmdFggPSAwO1xuICBjb25zdCBsZWZ0WSA9IHJpZ2h0WTtcblxuICByZXR1cm4gW3RvcFgsIHRvcFksIHJpZ2h0WCwgcmlnaHRZLCBib3R0b21YLCBib3R0b21ZLCBsZWZ0WCwgbGVmdFldO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1cnZlUGF0aE9wcyA9IChzaGFwZTogRHJhd2FibGUpOiBPcFtdID0+IHtcbiAgZm9yIChjb25zdCBzZXQgb2Ygc2hhcGUuc2V0cykge1xuICAgIGlmIChzZXQudHlwZSA9PT0gXCJwYXRoXCIpIHtcbiAgICAgIHJldHVybiBzZXQub3BzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2hhcGUuc2V0c1swXS5vcHM7XG59O1xuXG4vLyByZWZlcmVuY2U6IGh0dHBzOi8vZWxpb3Qtam9uZXMuY29tLzIwMTkvMTIvY3ViaWMtYmV6aWVyLWN1cnZlLWJvdW5kaW5nLWJveGVzXG5jb25zdCBnZXRCZXppZXJWYWx1ZUZvclQgPSAoXG4gIHQ6IG51bWJlcixcbiAgcDA6IG51bWJlcixcbiAgcDE6IG51bWJlcixcbiAgcDI6IG51bWJlcixcbiAgcDM6IG51bWJlcixcbikgPT4ge1xuICBjb25zdCBvbmVNaW51c1QgPSAxIC0gdDtcbiAgcmV0dXJuIChcbiAgICBNYXRoLnBvdyhvbmVNaW51c1QsIDMpICogcDAgK1xuICAgIDMgKiBNYXRoLnBvdyhvbmVNaW51c1QsIDIpICogdCAqIHAxICtcbiAgICAzICogb25lTWludXNUICogTWF0aC5wb3codCwgMikgKiBwMiArXG4gICAgTWF0aC5wb3codCwgMykgKiBwM1xuICApO1xufTtcblxuY29uc3Qgc29sdmVRdWFkcmF0aWMgPSAoXG4gIHAwOiBudW1iZXIsXG4gIHAxOiBudW1iZXIsXG4gIHAyOiBudW1iZXIsXG4gIHAzOiBudW1iZXIsXG4pOiBNYXliZVF1YWRyYXRpY1NvbHV0aW9uID0+IHtcbiAgY29uc3QgaSA9IHAxIC0gcDA7XG4gIGNvbnN0IGogPSBwMiAtIHAxO1xuICBjb25zdCBrID0gcDMgLSBwMjtcblxuICBjb25zdCBhID0gMyAqIGkgLSA2ICogaiArIDMgKiBrO1xuICBjb25zdCBiID0gNiAqIGogLSA2ICogaTtcbiAgY29uc3QgYyA9IDMgKiBpO1xuXG4gIGNvbnN0IHNxcnRQYXJ0ID0gYiAqIGIgLSA0ICogYSAqIGM7XG4gIGNvbnN0IGhhc1NvbHV0aW9uID0gc3FydFBhcnQgPj0gMDtcblxuICBpZiAoIWhhc1NvbHV0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IHMxID0gbnVsbDtcbiAgbGV0IHMyID0gbnVsbDtcblxuICBsZXQgdDEgPSBJbmZpbml0eTtcbiAgbGV0IHQyID0gSW5maW5pdHk7XG5cbiAgaWYgKGEgPT09IDApIHtcbiAgICB0MSA9IHQyID0gLWMgLyBiO1xuICB9IGVsc2Uge1xuICAgIHQxID0gKC1iICsgTWF0aC5zcXJ0KHNxcnRQYXJ0KSkgLyAoMiAqIGEpO1xuICAgIHQyID0gKC1iIC0gTWF0aC5zcXJ0KHNxcnRQYXJ0KSkgLyAoMiAqIGEpO1xuICB9XG5cbiAgaWYgKHQxID49IDAgJiYgdDEgPD0gMSkge1xuICAgIHMxID0gZ2V0QmV6aWVyVmFsdWVGb3JUKHQxLCBwMCwgcDEsIHAyLCBwMyk7XG4gIH1cblxuICBpZiAodDIgPj0gMCAmJiB0MiA8PSAxKSB7XG4gICAgczIgPSBnZXRCZXppZXJWYWx1ZUZvclQodDIsIHAwLCBwMSwgcDIsIHAzKTtcbiAgfVxuXG4gIHJldHVybiBbczEsIHMyXTtcbn07XG5cbmNvbnN0IGdldEN1YmljQmV6aWVyQ3VydmVCb3VuZCA9IChcbiAgcDA6IFBvaW50LFxuICBwMTogUG9pbnQsXG4gIHAyOiBQb2ludCxcbiAgcDM6IFBvaW50LFxuKTogQm91bmRzID0+IHtcbiAgY29uc3Qgc29sWCA9IHNvbHZlUXVhZHJhdGljKHAwWzBdLCBwMVswXSwgcDJbMF0sIHAzWzBdKTtcbiAgY29uc3Qgc29sWSA9IHNvbHZlUXVhZHJhdGljKHAwWzFdLCBwMVsxXSwgcDJbMV0sIHAzWzFdKTtcblxuICBsZXQgbWluWCA9IE1hdGgubWluKHAwWzBdLCBwM1swXSk7XG4gIGxldCBtYXhYID0gTWF0aC5tYXgocDBbMF0sIHAzWzBdKTtcblxuICBpZiAoc29sWCkge1xuICAgIGNvbnN0IHhzID0gc29sWC5maWx0ZXIoKHgpID0+IHggIT09IG51bGwpIGFzIG51bWJlcltdO1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCAuLi54cyk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIC4uLnhzKTtcbiAgfVxuXG4gIGxldCBtaW5ZID0gTWF0aC5taW4ocDBbMV0sIHAzWzFdKTtcbiAgbGV0IG1heFkgPSBNYXRoLm1heChwMFsxXSwgcDNbMV0pO1xuICBpZiAoc29sWSkge1xuICAgIGNvbnN0IHlzID0gc29sWS5maWx0ZXIoKHkpID0+IHkgIT09IG51bGwpIGFzIG51bWJlcltdO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCAuLi55cyk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIC4uLnlzKTtcbiAgfVxuICByZXR1cm4gW21pblgsIG1pblksIG1heFgsIG1heFldO1xufTtcblxuY29uc3QgZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzID0gKFxuICBvcHM6IE9wW10sXG4gIHRyYW5zZm9ybVhZPzogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBbbnVtYmVyLCBudW1iZXJdLFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBsZXQgY3VycmVudFA6IFBvaW50ID0gWzAsIDBdO1xuXG4gIGNvbnN0IHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSB9ID0gb3BzLnJlZHVjZShcbiAgICAobGltaXRzLCB7IG9wLCBkYXRhIH0pID0+IHtcbiAgICAgIC8vIFRoZXJlIGFyZSBvbmx5IGZvdXIgb3BlcmF0aW9uIHR5cGVzOlxuICAgICAgLy8gbW92ZSwgYmN1cnZlVG8sIGxpbmVUbywgYW5kIGN1cnZlVG9cbiAgICAgIGlmIChvcCA9PT0gXCJtb3ZlXCIpIHtcbiAgICAgICAgLy8gY2hhbmdlIHN0YXJ0aW5nIHBvaW50XG4gICAgICAgIGN1cnJlbnRQID0gZGF0YSBhcyB1bmtub3duIGFzIFBvaW50O1xuICAgICAgICAvLyBtb3ZlIG9wZXJhdGlvbiBkb2VzIG5vdCBkcmF3IGFueXRoaW5nOyBzbywgaXQgYWx3YXlzXG4gICAgICAgIC8vIHJldHVybnMgZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAob3AgPT09IFwiYmN1cnZlVG9cIikge1xuICAgICAgICBjb25zdCBfcDEgPSBbZGF0YVswXSwgZGF0YVsxXV0gYXMgUG9pbnQ7XG4gICAgICAgIGNvbnN0IF9wMiA9IFtkYXRhWzJdLCBkYXRhWzNdXSBhcyBQb2ludDtcbiAgICAgICAgY29uc3QgX3AzID0gW2RhdGFbNF0sIGRhdGFbNV1dIGFzIFBvaW50O1xuXG4gICAgICAgIGNvbnN0IHAxID0gdHJhbnNmb3JtWFkgPyB0cmFuc2Zvcm1YWSguLi5fcDEpIDogX3AxO1xuICAgICAgICBjb25zdCBwMiA9IHRyYW5zZm9ybVhZID8gdHJhbnNmb3JtWFkoLi4uX3AyKSA6IF9wMjtcbiAgICAgICAgY29uc3QgcDMgPSB0cmFuc2Zvcm1YWSA/IHRyYW5zZm9ybVhZKC4uLl9wMykgOiBfcDM7XG5cbiAgICAgICAgY29uc3QgcDAgPSB0cmFuc2Zvcm1YWSA/IHRyYW5zZm9ybVhZKC4uLmN1cnJlbnRQKSA6IGN1cnJlbnRQO1xuICAgICAgICBjdXJyZW50UCA9IF9wMztcblxuICAgICAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRDdWJpY0JlemllckN1cnZlQm91bmQoXG4gICAgICAgICAgcDAsXG4gICAgICAgICAgcDEsXG4gICAgICAgICAgcDIsXG4gICAgICAgICAgcDMsXG4gICAgICAgICk7XG5cbiAgICAgICAgbGltaXRzLm1pblggPSBNYXRoLm1pbihsaW1pdHMubWluWCwgbWluWCk7XG4gICAgICAgIGxpbWl0cy5taW5ZID0gTWF0aC5taW4obGltaXRzLm1pblksIG1pblkpO1xuXG4gICAgICAgIGxpbWl0cy5tYXhYID0gTWF0aC5tYXgobGltaXRzLm1heFgsIG1heFgpO1xuICAgICAgICBsaW1pdHMubWF4WSA9IE1hdGgubWF4KGxpbWl0cy5tYXhZLCBtYXhZKTtcbiAgICAgIH0gZWxzZSBpZiAob3AgPT09IFwibGluZVRvXCIpIHtcbiAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXNcbiAgICAgIH0gZWxzZSBpZiAob3AgPT09IFwicWN1cnZlVG9cIikge1xuICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpc1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxpbWl0cztcbiAgICB9LFxuICAgIHsgbWluWDogSW5maW5pdHksIG1pblk6IEluZmluaXR5LCBtYXhYOiAtSW5maW5pdHksIG1heFk6IC1JbmZpbml0eSB9LFxuICApO1xuICByZXR1cm4gW21pblgsIG1pblksIG1heFgsIG1heFldO1xufTtcblxuY29uc3QgZ2V0Qm91bmRzRnJvbVBvaW50cyA9IChcbiAgcG9pbnRzOiBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50W1wicG9pbnRzXCJdLFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBsZXQgbWluWCA9IEluZmluaXR5O1xuICBsZXQgbWluWSA9IEluZmluaXR5O1xuICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG5cbiAgZm9yIChjb25zdCBbeCwgeV0gb2YgcG9pbnRzKSB7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIHgpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHkpO1xuICB9XG5cbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbn07XG5cbmNvbnN0IGdldEZyZWVEcmF3RWxlbWVudEFic29sdXRlQ29vcmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRCb3VuZHNGcm9tUG9pbnRzKGVsZW1lbnQucG9pbnRzKTtcblxuICByZXR1cm4gW1xuICAgIG1pblggKyBlbGVtZW50LngsXG4gICAgbWluWSArIGVsZW1lbnQueSxcbiAgICBtYXhYICsgZWxlbWVudC54LFxuICAgIG1heFkgKyBlbGVtZW50LnksXG4gIF07XG59O1xuXG5jb25zdCBnZXRMaW5lYXJFbGVtZW50QWJzb2x1dGVDb29yZHMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBsZXQgY29vcmRzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICBpZiAoZWxlbWVudC5wb2ludHMubGVuZ3RoIDwgMiB8fCAhZ2V0U2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgLy8gWFhYIHRoaXMgaXMganVzdCBhIHBvb3IgZXN0aW1hdGUgYW5kIG5vdCB2ZXJ5IHVzZWZ1bFxuICAgIGNvbnN0IHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSB9ID0gZWxlbWVudC5wb2ludHMucmVkdWNlKFxuICAgICAgKGxpbWl0cywgW3gsIHldKSA9PiB7XG4gICAgICAgIGxpbWl0cy5taW5ZID0gTWF0aC5taW4obGltaXRzLm1pblksIHkpO1xuICAgICAgICBsaW1pdHMubWluWCA9IE1hdGgubWluKGxpbWl0cy5taW5YLCB4KTtcblxuICAgICAgICBsaW1pdHMubWF4WCA9IE1hdGgubWF4KGxpbWl0cy5tYXhYLCB4KTtcbiAgICAgICAgbGltaXRzLm1heFkgPSBNYXRoLm1heChsaW1pdHMubWF4WSwgeSk7XG5cbiAgICAgICAgcmV0dXJuIGxpbWl0cztcbiAgICAgIH0sXG4gICAgICB7IG1pblg6IEluZmluaXR5LCBtaW5ZOiBJbmZpbml0eSwgbWF4WDogLUluZmluaXR5LCBtYXhZOiAtSW5maW5pdHkgfSxcbiAgICApO1xuICAgIGNvb3JkcyA9IFtcbiAgICAgIG1pblggKyBlbGVtZW50LngsXG4gICAgICBtaW5ZICsgZWxlbWVudC55LFxuICAgICAgbWF4WCArIGVsZW1lbnQueCxcbiAgICAgIG1heFkgKyBlbGVtZW50LnksXG4gICAgXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBzaGFwZSA9IGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KSE7XG5cbiAgICAvLyBmaXJzdCBlbGVtZW50IGlzIGFsd2F5cyB0aGUgY3VydmVcbiAgICBjb25zdCBvcHMgPSBnZXRDdXJ2ZVBhdGhPcHMoc2hhcGVbMF0pO1xuXG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzKG9wcyk7XG5cbiAgICBjb29yZHMgPSBbXG4gICAgICBtaW5YICsgZWxlbWVudC54LFxuICAgICAgbWluWSArIGVsZW1lbnQueSxcbiAgICAgIG1heFggKyBlbGVtZW50LngsXG4gICAgICBtYXhZICsgZWxlbWVudC55LFxuICAgIF07XG4gIH1cblxuICByZXR1cm4gY29vcmRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFycm93aGVhZFBvaW50cyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIHNoYXBlOiBEcmF3YWJsZVtdLFxuICBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJlbmRcIixcbiAgYXJyb3doZWFkOiBBcnJvd2hlYWQsXG4pID0+IHtcbiAgY29uc3Qgb3BzID0gZ2V0Q3VydmVQYXRoT3BzKHNoYXBlWzBdKTtcbiAgaWYgKG9wcy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBUaGUgaW5kZXggb2YgdGhlIGJDdXJ2ZSBvcGVyYXRpb24gdG8gZXhhbWluZS5cbiAgY29uc3QgaW5kZXggPSBwb3NpdGlvbiA9PT0gXCJzdGFydFwiID8gMSA6IG9wcy5sZW5ndGggLSAxO1xuXG4gIGNvbnN0IGRhdGEgPSBvcHNbaW5kZXhdLmRhdGE7XG4gIGNvbnN0IHAzID0gW2RhdGFbNF0sIGRhdGFbNV1dIGFzIFBvaW50O1xuICBjb25zdCBwMiA9IFtkYXRhWzJdLCBkYXRhWzNdXSBhcyBQb2ludDtcbiAgY29uc3QgcDEgPSBbZGF0YVswXSwgZGF0YVsxXV0gYXMgUG9pbnQ7XG5cbiAgLy8gV2UgbmVlZCB0byBmaW5kIHAwIG9mIHRoZSBiZXppZXIgY3VydmUuXG4gIC8vIEl0IGlzIHR5cGljYWxseSB0aGUgbGFzdCBwb2ludCBvZiB0aGUgcHJldmlvdXNcbiAgLy8gY3VydmU7IGl0IGNhbiBhbHNvIGJlIHRoZSBwb3NpdGlvbiBvZiBtb3ZlVG8gb3BlcmF0aW9uLlxuICBjb25zdCBwcmV2T3AgPSBvcHNbaW5kZXggLSAxXTtcbiAgbGV0IHAwOiBQb2ludCA9IFswLCAwXTtcbiAgaWYgKHByZXZPcC5vcCA9PT0gXCJtb3ZlXCIpIHtcbiAgICBwMCA9IHByZXZPcC5kYXRhIGFzIHVua25vd24gYXMgUG9pbnQ7XG4gIH0gZWxzZSBpZiAocHJldk9wLm9wID09PSBcImJjdXJ2ZVRvXCIpIHtcbiAgICBwMCA9IFtwcmV2T3AuZGF0YVs0XSwgcHJldk9wLmRhdGFbNV1dO1xuICB9XG5cbiAgLy8gQih0KSA9IHAwICogKDEtdCleMyArIDNwMSAqIHQgKiAoMS10KV4yICsgM3AyICogdF4yICogKDEtdCkgKyBwMyAqIHReM1xuICBjb25zdCBlcXVhdGlvbiA9ICh0OiBudW1iZXIsIGlkeDogbnVtYmVyKSA9PlxuICAgIE1hdGgucG93KDEgLSB0LCAzKSAqIHAzW2lkeF0gK1xuICAgIDMgKiB0ICogTWF0aC5wb3coMSAtIHQsIDIpICogcDJbaWR4XSArXG4gICAgMyAqIE1hdGgucG93KHQsIDIpICogKDEgLSB0KSAqIHAxW2lkeF0gK1xuICAgIHAwW2lkeF0gKiBNYXRoLnBvdyh0LCAzKTtcblxuICAvLyBFZSBrbm93IHRoZSBsYXN0IHBvaW50IG9mIHRoZSBhcnJvdyAob3IgdGhlIGZpcnN0LCBpZiBzdGFydCBhcnJvd2hlYWQpLlxuICBjb25zdCBbeDIsIHkyXSA9IHBvc2l0aW9uID09PSBcInN0YXJ0XCIgPyBwMCA6IHAzO1xuXG4gIC8vIEJ5IHVzaW5nIGN1YmljIGJlemllciBlcXVhdGlvbiAoQih0KSkgYW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLFxuICAvLyB3ZSBjYWxjdWxhdGUgYSBwb2ludCB0aGF0IGlzIGNsb3NlciB0byB0aGUgbGFzdCBwb2ludC5cbiAgLy8gVGhlIHZhbHVlIDAuMyBpcyBjaG9zZW4gYXJiaXRyYXJpbHkgYW5kIGl0IHdvcmtzIGJlc3QgZm9yIGFsbFxuICAvLyB0aGUgdGVzdGVkIGNhc2VzLlxuICBjb25zdCBbeDEsIHkxXSA9IFtlcXVhdGlvbigwLjMsIDApLCBlcXVhdGlvbigwLjMsIDEpXTtcblxuICAvLyBGaW5kIHRoZSBub3JtYWxpemVkIGRpcmVjdGlvbiB2ZWN0b3IgYmFzZWQgb24gdGhlXG4gIC8vIHByZXZpb3VzbHkgY2FsY3VsYXRlZCBwb2ludHMuXG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5oeXBvdCh4MiAtIHgxLCB5MiAtIHkxKTtcbiAgY29uc3QgbnggPSAoeDIgLSB4MSkgLyBkaXN0YW5jZTtcbiAgY29uc3QgbnkgPSAoeTIgLSB5MSkgLyBkaXN0YW5jZTtcblxuICBjb25zdCBzaXplID0ge1xuICAgIGFycm93OiAzMCxcbiAgICBiYXI6IDE1LFxuICAgIGRvdDogMTUsXG4gICAgdHJpYW5nbGU6IDE1LFxuICB9W2Fycm93aGVhZF07IC8vIHBpeGVscyAod2lsbCBkaWZmZXIgZm9yIGVhY2ggYXJyb3doZWFkKVxuXG4gIGxldCBsZW5ndGggPSAwO1xuXG4gIGlmIChhcnJvd2hlYWQgPT09IFwiYXJyb3dcIikge1xuICAgIC8vIExlbmd0aCBmb3IgLT4gYXJyb3dzIGlzIGJhc2VkIG9uIHRoZSBsZW5ndGggb2YgdGhlIGxhc3Qgc2VjdGlvblxuICAgIGNvbnN0IFtjeCwgY3ldID0gZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgW3B4LCBweV0gPVxuICAgICAgZWxlbWVudC5wb2ludHMubGVuZ3RoID4gMVxuICAgICAgICA/IGVsZW1lbnQucG9pbnRzW2VsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDJdXG4gICAgICAgIDogWzAsIDBdO1xuXG4gICAgbGVuZ3RoID0gTWF0aC5oeXBvdChjeCAtIHB4LCBjeSAtIHB5KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMZW5ndGggZm9yIG90aGVyIGFycm93aGVhZCB0eXBlcyBpcyBiYXNlZCBvbiB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBsaW5lXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50LnBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgW3B4LCBweV0gPSBlbGVtZW50LnBvaW50c1tpIC0gMV0gfHwgWzAsIDBdO1xuICAgICAgY29uc3QgW2N4LCBjeV0gPSBlbGVtZW50LnBvaW50c1tpXTtcbiAgICAgIGxlbmd0aCArPSBNYXRoLmh5cG90KGN4IC0gcHgsIGN5IC0gcHkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNjYWxlIGRvd24gdGhlIGFycm93aGVhZCB1bnRpbCB3ZSBoaXQgYSBjZXJ0YWluIHNpemUgc28gdGhhdCBpdCBkb2Vzbid0IGxvb2sgd2VpcmQuXG4gIC8vIFRoaXMgdmFsdWUgaXMgc2VsZWN0ZWQgYnkgbWluaW1pemluZyBhIG1pbmltdW0gc2l6ZSB3aXRoIHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGFycm93aGVhZFxuICBjb25zdCBtaW5TaXplID0gTWF0aC5taW4oc2l6ZSwgbGVuZ3RoIC8gMik7XG4gIGNvbnN0IHhzID0geDIgLSBueCAqIG1pblNpemU7XG4gIGNvbnN0IHlzID0geTIgLSBueSAqIG1pblNpemU7XG5cbiAgaWYgKGFycm93aGVhZCA9PT0gXCJkb3RcIikge1xuICAgIGNvbnN0IHIgPSBNYXRoLmh5cG90KHlzIC0geTIsIHhzIC0geDIpICsgZWxlbWVudC5zdHJva2VXaWR0aDtcbiAgICByZXR1cm4gW3gyLCB5Miwgcl07XG4gIH1cblxuICBjb25zdCBhbmdsZSA9IHtcbiAgICBhcnJvdzogMjAsXG4gICAgYmFyOiA5MCxcbiAgICB0cmlhbmdsZTogMjUsXG4gIH1bYXJyb3doZWFkXTsgLy8gZGVncmVlc1xuXG4gIC8vIFJldHVybiBwb2ludHNcbiAgY29uc3QgW3gzLCB5M10gPSByb3RhdGUoeHMsIHlzLCB4MiwgeTIsICgtYW5nbGUgKiBNYXRoLlBJKSAvIDE4MCk7XG4gIGNvbnN0IFt4NCwgeTRdID0gcm90YXRlKHhzLCB5cywgeDIsIHkyLCAoYW5nbGUgKiBNYXRoLlBJKSAvIDE4MCk7XG4gIHJldHVybiBbeDIsIHkyLCB4MywgeTMsIHg0LCB5NF07XG59O1xuXG5jb25zdCBnZXRMaW5lYXJFbGVtZW50Um90YXRlZEJvdW5kcyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIGN4OiBudW1iZXIsXG4gIGN5OiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggPCAyIHx8ICFnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBYWFggdGhpcyBpcyBqdXN0IGEgcG9vciBlc3RpbWF0ZSBhbmQgbm90IHZlcnkgdXNlZnVsXG4gICAgY29uc3QgeyBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZIH0gPSBlbGVtZW50LnBvaW50cy5yZWR1Y2UoXG4gICAgICAobGltaXRzLCBbeCwgeV0pID0+IHtcbiAgICAgICAgW3gsIHldID0gcm90YXRlKGVsZW1lbnQueCArIHgsIGVsZW1lbnQueSArIHksIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgICAgIGxpbWl0cy5taW5ZID0gTWF0aC5taW4obGltaXRzLm1pblksIHkpO1xuICAgICAgICBsaW1pdHMubWluWCA9IE1hdGgubWluKGxpbWl0cy5taW5YLCB4KTtcbiAgICAgICAgbGltaXRzLm1heFggPSBNYXRoLm1heChsaW1pdHMubWF4WCwgeCk7XG4gICAgICAgIGxpbWl0cy5tYXhZID0gTWF0aC5tYXgobGltaXRzLm1heFksIHkpO1xuICAgICAgICByZXR1cm4gbGltaXRzO1xuICAgICAgfSxcbiAgICAgIHsgbWluWDogSW5maW5pdHksIG1pblk6IEluZmluaXR5LCBtYXhYOiAtSW5maW5pdHksIG1heFk6IC1JbmZpbml0eSB9LFxuICAgICk7XG4gICAgcmV0dXJuIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbiAgfVxuXG4gIGNvbnN0IHNoYXBlID0gZ2V0U2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpITtcblxuICAvLyBmaXJzdCBlbGVtZW50IGlzIGFsd2F5cyB0aGUgY3VydmVcbiAgY29uc3Qgb3BzID0gZ2V0Q3VydmVQYXRoT3BzKHNoYXBlWzBdKTtcblxuICBjb25zdCB0cmFuc2Zvcm1YWSA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT5cbiAgICByb3RhdGUoZWxlbWVudC54ICsgeCwgZWxlbWVudC55ICsgeSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgcmV0dXJuIGdldE1pbk1heFhZRnJvbUN1cnZlUGF0aE9wcyhvcHMsIHRyYW5zZm9ybVhZKTtcbn07XG5cbi8vIFdlIGNvdWxkIGNhY2hlIHRoaXMgc3R1ZmZcbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50Qm91bmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgbGV0IGJvdW5kczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgY29uc3QgY3ggPSAoeDEgKyB4MikgLyAyO1xuICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDI7XG4gIGlmIChpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KSkge1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldEJvdW5kc0Zyb21Qb2ludHMoXG4gICAgICBlbGVtZW50LnBvaW50cy5tYXAoKFt4LCB5XSkgPT5cbiAgICAgICAgcm90YXRlKHgsIHksIGN4IC0gZWxlbWVudC54LCBjeSAtIGVsZW1lbnQueSwgZWxlbWVudC5hbmdsZSksXG4gICAgICApLFxuICAgICk7XG5cbiAgICByZXR1cm4gW1xuICAgICAgbWluWCArIGVsZW1lbnQueCxcbiAgICAgIG1pblkgKyBlbGVtZW50LnksXG4gICAgICBtYXhYICsgZWxlbWVudC54LFxuICAgICAgbWF4WSArIGVsZW1lbnQueSxcbiAgICBdO1xuICB9IGVsc2UgaWYgKGlzTGluZWFyRWxlbWVudChlbGVtZW50KSkge1xuICAgIGJvdW5kcyA9IGdldExpbmVhckVsZW1lbnRSb3RhdGVkQm91bmRzKGVsZW1lbnQsIGN4LCBjeSk7XG4gIH0gZWxzZSBpZiAoZWxlbWVudC50eXBlID09PSBcImRpYW1vbmRcIikge1xuICAgIGNvbnN0IFt4MTEsIHkxMV0gPSByb3RhdGUoY3gsIHkxLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IFt4MTIsIHkxMl0gPSByb3RhdGUoY3gsIHkyLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IFt4MjIsIHkyMl0gPSByb3RhdGUoeDEsIGN5LCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IFt4MjEsIHkyMV0gPSByb3RhdGUoeDIsIGN5LCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IG1pblggPSBNYXRoLm1pbih4MTEsIHgxMiwgeDIyLCB4MjEpO1xuICAgIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5MTEsIHkxMiwgeTIyLCB5MjEpO1xuICAgIGNvbnN0IG1heFggPSBNYXRoLm1heCh4MTEsIHgxMiwgeDIyLCB4MjEpO1xuICAgIGNvbnN0IG1heFkgPSBNYXRoLm1heCh5MTEsIHkxMiwgeTIyLCB5MjEpO1xuICAgIGJvdW5kcyA9IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbiAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09IFwiZWxsaXBzZVwiKSB7XG4gICAgY29uc3QgdyA9ICh4MiAtIHgxKSAvIDI7XG4gICAgY29uc3QgaCA9ICh5MiAtIHkxKSAvIDI7XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MoZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4oZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3Qgd3cgPSBNYXRoLmh5cG90KHcgKiBjb3MsIGggKiBzaW4pO1xuICAgIGNvbnN0IGhoID0gTWF0aC5oeXBvdChoICogY29zLCB3ICogc2luKTtcbiAgICBib3VuZHMgPSBbY3ggLSB3dywgY3kgLSBoaCwgY3ggKyB3dywgY3kgKyBoaF07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW3gxMSwgeTExXSA9IHJvdGF0ZSh4MSwgeTEsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gxMiwgeTEyXSA9IHJvdGF0ZSh4MSwgeTIsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gyMiwgeTIyXSA9IHJvdGF0ZSh4MiwgeTIsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gyMSwgeTIxXSA9IHJvdGF0ZSh4MiwgeTEsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgbWluWCA9IE1hdGgubWluKHgxMSwgeDEyLCB4MjIsIHgyMSk7XG4gICAgY29uc3QgbWluWSA9IE1hdGgubWluKHkxMSwgeTEyLCB5MjIsIHkyMSk7XG4gICAgY29uc3QgbWF4WCA9IE1hdGgubWF4KHgxMSwgeDEyLCB4MjIsIHgyMSk7XG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHkxMSwgeTEyLCB5MjIsIHkyMSk7XG4gICAgYm91bmRzID0gW21pblgsIG1pblksIG1heFgsIG1heFldO1xuICB9XG5cbiAgcmV0dXJuIGJvdW5kcztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb21tb25Cb3VuZHMgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBbMCwgMCwgMCwgMF07XG4gIH1cblxuICBsZXQgbWluWCA9IEluZmluaXR5O1xuICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG5cbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50Qm91bmRzKGVsZW1lbnQpO1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCB4MSk7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkxKTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeDIpO1xuICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5Mik7XG4gIH0pO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIG5leHRXaWR0aDogbnVtYmVyLFxuICBuZXh0SGVpZ2h0OiBudW1iZXIsXG4gIG5vcm1hbGl6ZVBvaW50czogYm9vbGVhbixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgaWYgKCEoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpIHx8IGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSkge1xuICAgIHJldHVybiBbXG4gICAgICBlbGVtZW50LngsXG4gICAgICBlbGVtZW50LnksXG4gICAgICBlbGVtZW50LnggKyBuZXh0V2lkdGgsXG4gICAgICBlbGVtZW50LnkgKyBuZXh0SGVpZ2h0LFxuICAgIF07XG4gIH1cblxuICBjb25zdCBwb2ludHMgPSByZXNjYWxlUG9pbnRzKFxuICAgIDAsXG4gICAgbmV4dFdpZHRoLFxuICAgIHJlc2NhbGVQb2ludHMoMSwgbmV4dEhlaWdodCwgZWxlbWVudC5wb2ludHMsIG5vcm1hbGl6ZVBvaW50cyksXG4gICAgbm9ybWFsaXplUG9pbnRzLFxuICApO1xuXG4gIGxldCBib3VuZHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gIGlmIChpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIEZyZWUgRHJhd1xuICAgIGJvdW5kcyA9IGdldEJvdW5kc0Zyb21Qb2ludHMocG9pbnRzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMaW5lXG4gICAgY29uc3QgZ2VuID0gcm91Z2guZ2VuZXJhdG9yKCk7XG4gICAgY29uc3QgY3VydmUgPVxuICAgICAgZWxlbWVudC5zdHJva2VTaGFycG5lc3MgPT09IFwic2hhcnBcIlxuICAgICAgICA/IGdlbi5saW5lYXJQYXRoKFxuICAgICAgICAgICAgcG9pbnRzIGFzIFtudW1iZXIsIG51bWJlcl1bXSxcbiAgICAgICAgICAgIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpLFxuICAgICAgICAgIClcbiAgICAgICAgOiBnZW4uY3VydmUoXG4gICAgICAgICAgICBwb2ludHMgYXMgW251bWJlciwgbnVtYmVyXVtdLFxuICAgICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgICAgKTtcbiAgICBjb25zdCBvcHMgPSBnZXRDdXJ2ZVBhdGhPcHMoY3VydmUpO1xuICAgIGJvdW5kcyA9IGdldE1pbk1heFhZRnJvbUN1cnZlUGF0aE9wcyhvcHMpO1xuICB9XG5cbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gYm91bmRzO1xuICByZXR1cm4gW1xuICAgIG1pblggKyBlbGVtZW50LngsXG4gICAgbWluWSArIGVsZW1lbnQueSxcbiAgICBtYXhYICsgZWxlbWVudC54LFxuICAgIG1heFkgKyBlbGVtZW50LnksXG4gIF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudFBvaW50c0Nvb3JkcyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIHBvaW50czogcmVhZG9ubHkgKHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0pW10sXG4gIHNoYXJwbmVzczogRXhjYWxpZHJhd0VsZW1lbnRbXCJzdHJva2VTaGFycG5lc3NcIl0sXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIC8vIFRoaXMgbWlnaHQgYmUgY29tcHV0YXRpb25hbGx5IGhlYXZleVxuICBjb25zdCBnZW4gPSByb3VnaC5nZW5lcmF0b3IoKTtcbiAgY29uc3QgY3VydmUgPVxuICAgIHNoYXJwbmVzcyA9PT0gXCJzaGFycFwiXG4gICAgICA/IGdlbi5saW5lYXJQYXRoKFxuICAgICAgICAgIHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sXG4gICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgIClcbiAgICAgIDogZ2VuLmN1cnZlKHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpKTtcbiAgY29uc3Qgb3BzID0gZ2V0Q3VydmVQYXRoT3BzKGN1cnZlKTtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzKG9wcyk7XG4gIHJldHVybiBbXG4gICAgbWluWCArIGVsZW1lbnQueCxcbiAgICBtaW5ZICsgZWxlbWVudC55LFxuICAgIG1heFggKyBlbGVtZW50LngsXG4gICAgbWF4WSArIGVsZW1lbnQueSxcbiAgXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDbG9zZXN0RWxlbWVudEJvdW5kcyA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGZyb206IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSxcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgaWYgKCFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gWzAsIDAsIDAsIDBdO1xuICB9XG5cbiAgbGV0IG1pbkRpc3RhbmNlID0gSW5maW5pdHk7XG4gIGxldCBjbG9zZXN0RWxlbWVudCA9IGVsZW1lbnRzWzBdO1xuXG4gIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEJvdW5kcyhlbGVtZW50KTtcbiAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlMmQoKHgxICsgeDIpIC8gMiwgKHkxICsgeTIpIC8gMiwgZnJvbS54LCBmcm9tLnkpO1xuXG4gICAgaWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHtcbiAgICAgIG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICBjbG9zZXN0RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZ2V0RWxlbWVudEJvdW5kcyhjbG9zZXN0RWxlbWVudCk7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJveCB7XG4gIG1pblg6IG51bWJlcjtcbiAgbWluWTogbnVtYmVyO1xuICBtYXhYOiBudW1iZXI7XG4gIG1heFk6IG51bWJlcjtcbiAgbWlkWDogbnVtYmVyO1xuICBtaWRZOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0Q29tbW9uQm91bmRpbmdCb3ggPSAoXG4gIGVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdIHwgcmVhZG9ubHkgTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD5bXSxcbik6IEJveCA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIHJldHVybiB7XG4gICAgbWluWCxcbiAgICBtaW5ZLFxuICAgIG1heFgsXG4gICAgbWF4WSxcbiAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgaGVpZ2h0OiBtYXhZIC0gbWluWSxcbiAgICBtaWRYOiAobWluWCArIG1heFgpIC8gMixcbiAgICBtaWRZOiAobWluWSArIG1heFkpIC8gMixcbiAgfTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/bounds.ts\n");
|
|
2862
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getArrowheadPoints\": () => (/* binding */ getArrowheadPoints),\n/* harmony export */ \"getClosestElementBounds\": () => (/* binding */ getClosestElementBounds),\n/* harmony export */ \"getCommonBoundingBox\": () => (/* binding */ getCommonBoundingBox),\n/* harmony export */ \"getCommonBounds\": () => (/* binding */ getCommonBounds),\n/* harmony export */ \"getCurvePathOps\": () => (/* binding */ getCurvePathOps),\n/* harmony export */ \"getDiamondPoints\": () => (/* binding */ getDiamondPoints),\n/* harmony export */ \"getElementAbsoluteCoords\": () => (/* binding */ getElementAbsoluteCoords),\n/* harmony export */ \"getElementBounds\": () => (/* binding */ getElementBounds),\n/* harmony export */ \"getElementPointsCoords\": () => (/* binding */ getElementPointsCoords),\n/* harmony export */ \"getResizedElementAbsoluteCoords\": () => (/* binding */ getResizedElementAbsoluteCoords),\n/* harmony export */ \"pointRelativeTo\": () => (/* binding */ pointRelativeTo)\n/* harmony export */ });\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\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 _renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../points */ \"../../points.ts\");\n\n\n\n\n\n// If the element is created from right to left, the width is going to be negative\n// This set of functions retrieves the absolute position of the 4 points.\nconst getElementAbsoluteCoords = (element) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n return getFreeDrawElementAbsoluteCoords(element);\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n return getLinearElementAbsoluteCoords(element);\n }\n return [\n element.x,\n element.y,\n element.x + element.width,\n element.y + element.height,\n ];\n};\nconst pointRelativeTo = (element, absoluteCoords) => {\n return [absoluteCoords[0] - element.x, absoluteCoords[1] - element.y];\n};\nconst getDiamondPoints = (element) => {\n // Here we add +1 to avoid these numbers to be 0\n // otherwise rough.js will throw an error complaining about it\n const topX = Math.floor(element.width / 2) + 1;\n const topY = 0;\n const rightX = element.width;\n const rightY = Math.floor(element.height / 2) + 1;\n const bottomX = topX;\n const bottomY = element.height;\n const leftX = 0;\n const leftY = rightY;\n return [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY];\n};\nconst getCurvePathOps = (shape) => {\n for (const set of shape.sets) {\n if (set.type === \"path\") {\n return set.ops;\n }\n }\n return shape.sets[0].ops;\n};\n// reference: https://eliot-jones.com/2019/12/cubic-bezier-curve-bounding-boxes\nconst getBezierValueForT = (t, p0, p1, p2, p3) => {\n const oneMinusT = 1 - t;\n return (Math.pow(oneMinusT, 3) * p0 +\n 3 * Math.pow(oneMinusT, 2) * t * p1 +\n 3 * oneMinusT * Math.pow(t, 2) * p2 +\n Math.pow(t, 3) * p3);\n};\nconst solveQuadratic = (p0, p1, p2, p3) => {\n const i = p1 - p0;\n const j = p2 - p1;\n const k = p3 - p2;\n const a = 3 * i - 6 * j + 3 * k;\n const b = 6 * j - 6 * i;\n const c = 3 * i;\n const sqrtPart = b * b - 4 * a * c;\n const hasSolution = sqrtPart >= 0;\n if (!hasSolution) {\n return false;\n }\n let s1 = null;\n let s2 = null;\n let t1 = Infinity;\n let t2 = Infinity;\n if (a === 0) {\n t1 = t2 = -c / b;\n }\n else {\n t1 = (-b + Math.sqrt(sqrtPart)) / (2 * a);\n t2 = (-b - Math.sqrt(sqrtPart)) / (2 * a);\n }\n if (t1 >= 0 && t1 <= 1) {\n s1 = getBezierValueForT(t1, p0, p1, p2, p3);\n }\n if (t2 >= 0 && t2 <= 1) {\n s2 = getBezierValueForT(t2, p0, p1, p2, p3);\n }\n return [s1, s2];\n};\nconst getCubicBezierCurveBound = (p0, p1, p2, p3) => {\n const solX = solveQuadratic(p0[0], p1[0], p2[0], p3[0]);\n const solY = solveQuadratic(p0[1], p1[1], p2[1], p3[1]);\n let minX = Math.min(p0[0], p3[0]);\n let maxX = Math.max(p0[0], p3[0]);\n if (solX) {\n const xs = solX.filter((x) => x !== null);\n minX = Math.min(minX, ...xs);\n maxX = Math.max(maxX, ...xs);\n }\n let minY = Math.min(p0[1], p3[1]);\n let maxY = Math.max(p0[1], p3[1]);\n if (solY) {\n const ys = solY.filter((y) => y !== null);\n minY = Math.min(minY, ...ys);\n maxY = Math.max(maxY, ...ys);\n }\n return [minX, minY, maxX, maxY];\n};\nconst getMinMaxXYFromCurvePathOps = (ops, transformXY) => {\n let currentP = [0, 0];\n const { minX, minY, maxX, maxY } = ops.reduce((limits, { op, data }) => {\n // There are only four operation types:\n // move, bcurveTo, lineTo, and curveTo\n if (op === \"move\") {\n // change starting point\n currentP = data;\n // move operation does not draw anything; so, it always\n // returns false\n }\n else if (op === \"bcurveTo\") {\n const _p1 = [data[0], data[1]];\n const _p2 = [data[2], data[3]];\n const _p3 = [data[4], data[5]];\n const p1 = transformXY ? transformXY(..._p1) : _p1;\n const p2 = transformXY ? transformXY(..._p2) : _p2;\n const p3 = transformXY ? transformXY(..._p3) : _p3;\n const p0 = transformXY ? transformXY(...currentP) : currentP;\n currentP = _p3;\n const [minX, minY, maxX, maxY] = getCubicBezierCurveBound(p0, p1, p2, p3);\n limits.minX = Math.min(limits.minX, minX);\n limits.minY = Math.min(limits.minY, minY);\n limits.maxX = Math.max(limits.maxX, maxX);\n limits.maxY = Math.max(limits.maxY, maxY);\n }\n else if (op === \"lineTo\") {\n // TODO: Implement this\n }\n else if (op === \"qcurveTo\") {\n // TODO: Implement this\n }\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n return [minX, minY, maxX, maxY];\n};\nconst getBoundsFromPoints = (points) => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const [x, y] of points) {\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n return [minX, minY, maxX, maxY];\n};\nconst getFreeDrawElementAbsoluteCoords = (element) => {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points);\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getLinearElementAbsoluteCoords = (element) => {\n let coords;\n if (element.points.length < 2 || !(0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element)) {\n // XXX this is just a poor estimate and not very useful\n const { minX, minY, maxX, maxY } = element.points.reduce((limits, [x, y]) => {\n limits.minY = Math.min(limits.minY, y);\n limits.minX = Math.min(limits.minX, x);\n limits.maxX = Math.max(limits.maxX, x);\n limits.maxY = Math.max(limits.maxY, y);\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n coords = [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n else {\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element);\n // first element is always the curve\n const ops = getCurvePathOps(shape[0]);\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n coords = [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n return coords;\n};\nconst getArrowheadPoints = (element, shape, position, arrowhead) => {\n const ops = getCurvePathOps(shape[0]);\n if (ops.length < 1) {\n return null;\n }\n // The index of the bCurve operation to examine.\n const index = position === \"start\" ? 1 : ops.length - 1;\n const data = ops[index].data;\n const p3 = [data[4], data[5]];\n const p2 = [data[2], data[3]];\n const p1 = [data[0], data[1]];\n // We need to find p0 of the bezier curve.\n // It is typically the last point of the previous\n // curve; it can also be the position of moveTo operation.\n const prevOp = ops[index - 1];\n let p0 = [0, 0];\n if (prevOp.op === \"move\") {\n p0 = prevOp.data;\n }\n else if (prevOp.op === \"bcurveTo\") {\n p0 = [prevOp.data[4], prevOp.data[5]];\n }\n // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3\n const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n // Ee know the last point of the arrow (or the first, if start arrowhead).\n const [x2, y2] = position === \"start\" ? p0 : p3;\n // By using cubic bezier equation (B(t)) and the given parameters,\n // we calculate a point that is closer to the last point.\n // The value 0.3 is chosen arbitrarily and it works best for all\n // the tested cases.\n const [x1, y1] = [equation(0.3, 0), equation(0.3, 1)];\n // Find the normalized direction vector based on the\n // previously calculated points.\n const distance = Math.hypot(x2 - x1, y2 - y1);\n const nx = (x2 - x1) / distance;\n const ny = (y2 - y1) / distance;\n const size = {\n arrow: 30,\n bar: 15,\n dot: 15,\n triangle: 15,\n }[arrowhead]; // pixels (will differ for each arrowhead)\n let length = 0;\n if (arrowhead === \"arrow\") {\n // Length for -> arrows is based on the length of the last section\n const [cx, cy] = element.points[element.points.length - 1];\n const [px, py] = element.points.length > 1\n ? element.points[element.points.length - 2]\n : [0, 0];\n length = Math.hypot(cx - px, cy - py);\n }\n else {\n // Length for other arrowhead types is based on the total length of the line\n for (let i = 0; i < element.points.length; i++) {\n const [px, py] = element.points[i - 1] || [0, 0];\n const [cx, cy] = element.points[i];\n length += Math.hypot(cx - px, cy - py);\n }\n }\n // Scale down the arrowhead until we hit a certain size so that it doesn't look weird.\n // This value is selected by minimizing a minimum size with the last segment of the arrowhead\n const minSize = Math.min(size, length / 2);\n const xs = x2 - nx * minSize;\n const ys = y2 - ny * minSize;\n if (arrowhead === \"dot\") {\n const r = Math.hypot(ys - y2, xs - x2) + element.strokeWidth;\n return [x2, y2, r];\n }\n const angle = {\n arrow: 20,\n bar: 90,\n triangle: 25,\n }[arrowhead]; // degrees\n // Return points\n const [x3, y3] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, (-angle * Math.PI) / 180);\n const [x4, y4] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, (angle * Math.PI) / 180);\n return [x2, y2, x3, y3, x4, y4];\n};\nconst generateLinearElementShape = (element) => {\n const generator = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const options = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element);\n const method = (() => {\n if (element.strokeSharpness !== \"sharp\") {\n return \"curve\";\n }\n if (options.fill) {\n return \"polygon\";\n }\n return \"linearPath\";\n })();\n return generator[method](element.points, options);\n};\nconst getLinearElementRotatedBounds = (element, cx, cy) => {\n var _a;\n if (element.points.length < 2) {\n const [pointX, pointY] = element.points[0];\n const [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + pointX, element.y + pointY, cx, cy, element.angle);\n return [x, y, x, y];\n }\n // first element is always the curve\n const cachedShape = (_a = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element)) === null || _a === void 0 ? void 0 : _a[0];\n const shape = cachedShape !== null && cachedShape !== void 0 ? cachedShape : generateLinearElementShape(element);\n const ops = getCurvePathOps(shape);\n const transformXY = (x, y) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + x, element.y + y, cx, cy, element.angle);\n return getMinMaxXYFromCurvePathOps(ops, transformXY);\n};\n// We could cache this stuff\nconst getElementBounds = (element) => {\n let bounds;\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points.map(([x, y]) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x, y, cx - element.x, cy - element.y, element.angle)));\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n bounds = getLinearElementRotatedBounds(element, cx, cy);\n }\n else if (element.type === \"diamond\") {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, cy, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, cy, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n else if (element.type === \"ellipse\") {\n const w = (x2 - x1) / 2;\n const h = (y2 - y1) / 2;\n const cos = Math.cos(element.angle);\n const sin = Math.sin(element.angle);\n const ww = Math.hypot(w * cos, h * sin);\n const hh = Math.hypot(h * cos, w * sin);\n bounds = [cx - ww, cy - hh, cx + ww, cy + hh];\n }\n else {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y2, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y1, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n return bounds;\n};\nconst getCommonBounds = (elements) => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n minX = Math.min(minX, x1);\n minY = Math.min(minY, y1);\n maxX = Math.max(maxX, x2);\n maxY = Math.max(maxY, y2);\n });\n return [minX, minY, maxX, maxY];\n};\nconst getResizedElementAbsoluteCoords = (element, nextWidth, nextHeight, normalizePoints) => {\n if (!((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element))) {\n return [\n element.x,\n element.y,\n element.x + nextWidth,\n element.y + nextHeight,\n ];\n }\n const points = (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(0, nextWidth, (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(1, nextHeight, element.points, normalizePoints), normalizePoints);\n let bounds;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n // Free Draw\n bounds = getBoundsFromPoints(points);\n }\n else {\n // Line\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = element.strokeSharpness === \"sharp\"\n ? gen.linearPath(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element))\n : gen.curve(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n bounds = getMinMaxXYFromCurvePathOps(ops);\n }\n const [minX, minY, maxX, maxY] = bounds;\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getElementPointsCoords = (element, points, sharpness) => {\n // This might be computationally heavey\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = sharpness === \"sharp\"\n ? gen.linearPath(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element))\n : gen.curve(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getClosestElementBounds = (elements, from) => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n let minDistance = Infinity;\n let closestElement = elements[0];\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)((x1 + x2) / 2, (y1 + y2) / 2, from.x, from.y);\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element;\n }\n });\n return getElementBounds(closestElement);\n};\nconst getCommonBoundingBox = (elements) => {\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n return {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n midX: (minX + maxX) / 2,\n midY: (minY + maxY) / 2,\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsQyxJQUFJLElBQUksRUFBRTtRQUNSLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQWEsQ0FBQztRQUN0RCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM3QixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztLQUM5QjtJQUVELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLElBQUksSUFBSSxFQUFFO1FBQ1IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBYSxDQUFDO1FBQ3RELElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQzlCO0lBQ0QsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FB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QUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ25DO1NBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtRQUNyQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDeEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN4QyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7S0FDL0M7U0FBTTtRQUNMLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsNkNBQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsNkNBQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsNkNBQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsNkNBQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDbkM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFSyxNQUFNLGVBQWUsR0FBRyxDQUM3QixRQUFzQyxFQUNKLEVBQUU7SUFDcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7UUFDcEIsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3JCO0lBRUQsSUFBSSxJQUFJLEdBQUcsUUFB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Q0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFFLElBQUksUUFBUSxHQUFHLFdBQVcsRUFBRTtZQUMxQixXQUFXLEdBQUcsUUFBUSxDQUFDO1lBQ3ZCLGNBQWMsR0FBRyxPQUFPLENBQUM7U0FDMUI7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDMUMsQ0FBQyxDQUFDO0FBYUssTUFBTSxvQkFBb0IsR0FBRyxDQUNsQyxRQUF3RSxFQUNuRSxFQUFFO0lBQ1AsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRCxPQUFPO1FBQ0wsSUFBSTtRQUNKLElBQUk7UUFDSixJQUFJO1FBQ0osSUFBSTtRQUNKLEtBQUssRUFBRSxJQUFJLEdBQUcsSUFBSTtRQUNsQixNQUFNLEVBQUUsSUFBSSxHQUFHLElBQUk7UUFDbkIsSUFBSSxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDdkIsSUFBSSxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7S0FDeEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L2JvdW5kcy50cz84YmUyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgQXJyb3doZWFkLFxuICBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LFxuICBOb25EZWxldGVkLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgZGlzdGFuY2UyZCwgcm90YXRlIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IERyYXdhYmxlLCBPcCB9IGZyb20gXCJyb3VnaGpzL2Jpbi9jb3JlXCI7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0U2hhcGVGb3JFbGVtZW50LFxuICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlckVsZW1lbnRcIjtcbmltcG9ydCB7IGlzRnJlZURyYXdFbGVtZW50LCBpc0xpbmVhckVsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyByZXNjYWxlUG9pbnRzIH0gZnJvbSBcIi4uL3BvaW50c1wiO1xuXG4vLyB4IGFuZCB5IHBvc2l0aW9uIG9mIHRvcCBsZWZ0IGNvcm5lciwgeCBhbmQgeSBwb3NpdGlvbiBvZiBib3R0b20gcmlnaHQgY29ybmVyXG5leHBvcnQgdHlwZSBCb3VuZHMgPSByZWFkb25seSBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbnR5cGUgTWF5YmVRdWFkcmF0aWNTb2x1dGlvbiA9IFtudW1iZXIgfCBudWxsLCBudW1iZXIgfCBudWxsXSB8IGZhbHNlO1xuXG4vLyBJZiB0aGUgZWxlbWVudCBpcyBjcmVhdGVkIGZyb20gcmlnaHQgdG8gbGVmdCwgdGhlIHdpZHRoIGlzIGdvaW5nIHRvIGJlIG5lZ2F0aXZlXG4vLyBUaGlzIHNldCBvZiBmdW5jdGlvbnMgcmV0cmlldmVzIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgNCBwb2ludHMuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbik6IEJvdW5kcyA9PiB7XG4gIGlmIChpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KSkge1xuICAgIHJldHVybiBnZXRGcmVlRHJhd0VsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgfSBlbHNlIGlmIChpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gZ2V0TGluZWFyRWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICB9XG4gIHJldHVybiBbXG4gICAgZWxlbWVudC54LFxuICAgIGVsZW1lbnQueSxcbiAgICBlbGVtZW50LnggKyBlbGVtZW50LndpZHRoLFxuICAgIGVsZW1lbnQueSArIGVsZW1lbnQuaGVpZ2h0LFxuICBdO1xufTtcblxuZXhwb3J0IGNvbnN0IHBvaW50UmVsYXRpdmVUbyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGFic29sdXRlQ29vcmRzOiBQb2ludCxcbik6IFBvaW50ID0+IHtcbiAgcmV0dXJuIFthYnNvbHV0ZUNvb3Jkc1swXSAtIGVsZW1lbnQueCwgYWJzb2x1dGVDb29yZHNbMV0gLSBlbGVtZW50LnldO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERpYW1vbmRQb2ludHMgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgLy8gSGVyZSB3ZSBhZGQgKzEgdG8gYXZvaWQgdGhlc2UgbnVtYmVycyB0byBiZSAwXG4gIC8vIG90aGVyd2lzZSByb3VnaC5qcyB3aWxsIHRocm93IGFuIGVycm9yIGNvbXBsYWluaW5nIGFib3V0IGl0XG4gIGNvbnN0IHRvcFggPSBNYXRoLmZsb29yKGVsZW1lbnQud2lkdGggLyAyKSArIDE7XG4gIGNvbnN0IHRvcFkgPSAwO1xuICBjb25zdCByaWdodFggPSBlbGVtZW50LndpZHRoO1xuICBjb25zdCByaWdodFkgPSBNYXRoLmZsb29yKGVsZW1lbnQuaGVpZ2h0IC8gMikgKyAxO1xuICBjb25zdCBib3R0b21YID0gdG9wWDtcbiAgY29uc3QgYm90dG9tWSA9IGVsZW1lbnQuaGVpZ2h0O1xuICBjb25zdCBsZWZ0WCA9IDA7XG4gIGNvbnN0IGxlZnRZID0gcmlnaHRZO1xuXG4gIHJldHVybiBbdG9wWCwgdG9wWSwgcmlnaHRYLCByaWdodFksIGJvdHRvbVgsIGJvdHRvbVksIGxlZnRYLCBsZWZ0WV07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VydmVQYXRoT3BzID0gKHNoYXBlOiBEcmF3YWJsZSk6IE9wW10gPT4ge1xuICBmb3IgKGNvbnN0IHNldCBvZiBzaGFwZS5zZXRzKSB7XG4gICAgaWYgKHNldC50eXBlID09PSBcInBhdGhcIikge1xuICAgICAgcmV0dXJuIHNldC5vcHM7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaGFwZS5zZXRzWzBdLm9wcztcbn07XG5cbi8vIHJlZmVyZW5jZTogaHR0cHM6Ly9lbGlvdC1qb25lcy5jb20vMjAxOS8xMi9jdWJpYy1iZXppZXItY3VydmUtYm91bmRpbmctYm94ZXNcbmNvbnN0IGdldEJlemllclZhbHVlRm9yVCA9IChcbiAgdDogbnVtYmVyLFxuICBwMDogbnVtYmVyLFxuICBwMTogbnVtYmVyLFxuICBwMjogbnVtYmVyLFxuICBwMzogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IG9uZU1pbnVzVCA9IDEgLSB0O1xuICByZXR1cm4gKFxuICAgIE1hdGgucG93KG9uZU1pbnVzVCwgMykgKiBwMCArXG4gICAgMyAqIE1hdGgucG93KG9uZU1pbnVzVCwgMikgKiB0ICogcDEgK1xuICAgIDMgKiBvbmVNaW51c1QgKiBNYXRoLnBvdyh0LCAyKSAqIHAyICtcbiAgICBNYXRoLnBvdyh0LCAzKSAqIHAzXG4gICk7XG59O1xuXG5jb25zdCBzb2x2ZVF1YWRyYXRpYyA9IChcbiAgcDA6IG51bWJlcixcbiAgcDE6IG51bWJlcixcbiAgcDI6IG51bWJlcixcbiAgcDM6IG51bWJlcixcbik6IE1heWJlUXVhZHJhdGljU29sdXRpb24gPT4ge1xuICBjb25zdCBpID0gcDEgLSBwMDtcbiAgY29uc3QgaiA9IHAyIC0gcDE7XG4gIGNvbnN0IGsgPSBwMyAtIHAyO1xuXG4gIGNvbnN0IGEgPSAzICogaSAtIDYgKiBqICsgMyAqIGs7XG4gIGNvbnN0IGIgPSA2ICogaiAtIDYgKiBpO1xuICBjb25zdCBjID0gMyAqIGk7XG5cbiAgY29uc3Qgc3FydFBhcnQgPSBiICogYiAtIDQgKiBhICogYztcbiAgY29uc3QgaGFzU29sdXRpb24gPSBzcXJ0UGFydCA+PSAwO1xuXG4gIGlmICghaGFzU29sdXRpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgczEgPSBudWxsO1xuICBsZXQgczIgPSBudWxsO1xuXG4gIGxldCB0MSA9IEluZmluaXR5O1xuICBsZXQgdDIgPSBJbmZpbml0eTtcblxuICBpZiAoYSA9PT0gMCkge1xuICAgIHQxID0gdDIgPSAtYyAvIGI7XG4gIH0gZWxzZSB7XG4gICAgdDEgPSAoLWIgKyBNYXRoLnNxcnQoc3FydFBhcnQpKSAvICgyICogYSk7XG4gICAgdDIgPSAoLWIgLSBNYXRoLnNxcnQoc3FydFBhcnQpKSAvICgyICogYSk7XG4gIH1cblxuICBpZiAodDEgPj0gMCAmJiB0MSA8PSAxKSB7XG4gICAgczEgPSBnZXRCZXppZXJWYWx1ZUZvclQodDEsIHAwLCBwMSwgcDIsIHAzKTtcbiAgfVxuXG4gIGlmICh0MiA+PSAwICYmIHQyIDw9IDEpIHtcbiAgICBzMiA9IGdldEJlemllclZhbHVlRm9yVCh0MiwgcDAsIHAxLCBwMiwgcDMpO1xuICB9XG5cbiAgcmV0dXJuIFtzMSwgczJdO1xufTtcblxuY29uc3QgZ2V0Q3ViaWNCZXppZXJDdXJ2ZUJvdW5kID0gKFxuICBwMDogUG9pbnQsXG4gIHAxOiBQb2ludCxcbiAgcDI6IFBvaW50LFxuICBwMzogUG9pbnQsXG4pOiBCb3VuZHMgPT4ge1xuICBjb25zdCBzb2xYID0gc29sdmVRdWFkcmF0aWMocDBbMF0sIHAxWzBdLCBwMlswXSwgcDNbMF0pO1xuICBjb25zdCBzb2xZID0gc29sdmVRdWFkcmF0aWMocDBbMV0sIHAxWzFdLCBwMlsxXSwgcDNbMV0pO1xuXG4gIGxldCBtaW5YID0gTWF0aC5taW4ocDBbMF0sIHAzWzBdKTtcbiAgbGV0IG1heFggPSBNYXRoLm1heChwMFswXSwgcDNbMF0pO1xuXG4gIGlmIChzb2xYKSB7XG4gICAgY29uc3QgeHMgPSBzb2xYLmZpbHRlcigoeCkgPT4geCAhPT0gbnVsbCkgYXMgbnVtYmVyW107XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIC4uLnhzKTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgLi4ueHMpO1xuICB9XG5cbiAgbGV0IG1pblkgPSBNYXRoLm1pbihwMFsxXSwgcDNbMV0pO1xuICBsZXQgbWF4WSA9IE1hdGgubWF4KHAwWzFdLCBwM1sxXSk7XG4gIGlmIChzb2xZKSB7XG4gICAgY29uc3QgeXMgPSBzb2xZLmZpbHRlcigoeSkgPT4geSAhPT0gbnVsbCkgYXMgbnVtYmVyW107XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIC4uLnlzKTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgLi4ueXMpO1xuICB9XG4gIHJldHVybiBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG59O1xuXG5jb25zdCBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMgPSAoXG4gIG9wczogT3BbXSxcbiAgdHJhbnNmb3JtWFk/OiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IFtudW1iZXIsIG51bWJlcl0sXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGxldCBjdXJyZW50UDogUG9pbnQgPSBbMCwgMF07XG5cbiAgY29uc3QgeyBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZIH0gPSBvcHMucmVkdWNlKFxuICAgIChsaW1pdHMsIHsgb3AsIGRhdGEgfSkgPT4ge1xuICAgICAgLy8gVGhlcmUgYXJlIG9ubHkgZm91ciBvcGVyYXRpb24gdHlwZXM6XG4gICAgICAvLyBtb3ZlLCBiY3VydmVUbywgbGluZVRvLCBhbmQgY3VydmVUb1xuICAgICAgaWYgKG9wID09PSBcIm1vdmVcIikge1xuICAgICAgICAvLyBjaGFuZ2Ugc3RhcnRpbmcgcG9pbnRcbiAgICAgICAgY3VycmVudFAgPSBkYXRhIGFzIHVua25vd24gYXMgUG9pbnQ7XG4gICAgICAgIC8vIG1vdmUgb3BlcmF0aW9uIGRvZXMgbm90IGRyYXcgYW55dGhpbmc7IHNvLCBpdCBhbHdheXNcbiAgICAgICAgLy8gcmV0dXJucyBmYWxzZVxuICAgICAgfSBlbHNlIGlmIChvcCA9PT0gXCJiY3VydmVUb1wiKSB7XG4gICAgICAgIGNvbnN0IF9wMSA9IFtkYXRhWzBdLCBkYXRhWzFdXSBhcyBQb2ludDtcbiAgICAgICAgY29uc3QgX3AyID0gW2RhdGFbMl0sIGRhdGFbM11dIGFzIFBvaW50O1xuICAgICAgICBjb25zdCBfcDMgPSBbZGF0YVs0XSwgZGF0YVs1XV0gYXMgUG9pbnQ7XG5cbiAgICAgICAgY29uc3QgcDEgPSB0cmFuc2Zvcm1YWSA/IHRyYW5zZm9ybVhZKC4uLl9wMSkgOiBfcDE7XG4gICAgICAgIGNvbnN0IHAyID0gdHJhbnNmb3JtWFkgPyB0cmFuc2Zvcm1YWSguLi5fcDIpIDogX3AyO1xuICAgICAgICBjb25zdCBwMyA9IHRyYW5zZm9ybVhZID8gdHJhbnNmb3JtWFkoLi4uX3AzKSA6IF9wMztcblxuICAgICAgICBjb25zdCBwMCA9IHRyYW5zZm9ybVhZID8gdHJhbnNmb3JtWFkoLi4uY3VycmVudFApIDogY3VycmVudFA7XG4gICAgICAgIGN1cnJlbnRQID0gX3AzO1xuXG4gICAgICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldEN1YmljQmV6aWVyQ3VydmVCb3VuZChcbiAgICAgICAgICBwMCxcbiAgICAgICAgICBwMSxcbiAgICAgICAgICBwMixcbiAgICAgICAgICBwMyxcbiAgICAgICAgKTtcblxuICAgICAgICBsaW1pdHMubWluWCA9IE1hdGgubWluKGxpbWl0cy5taW5YLCBtaW5YKTtcbiAgICAgICAgbGltaXRzLm1pblkgPSBNYXRoLm1pbihsaW1pdHMubWluWSwgbWluWSk7XG5cbiAgICAgICAgbGltaXRzLm1heFggPSBNYXRoLm1heChsaW1pdHMubWF4WCwgbWF4WCk7XG4gICAgICAgIGxpbWl0cy5tYXhZID0gTWF0aC5tYXgobGltaXRzLm1heFksIG1heFkpO1xuICAgICAgfSBlbHNlIGlmIChvcCA9PT0gXCJsaW5lVG9cIikge1xuICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpc1xuICAgICAgfSBlbHNlIGlmIChvcCA9PT0gXCJxY3VydmVUb1wiKSB7XG4gICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzXG4gICAgICB9XG4gICAgICByZXR1cm4gbGltaXRzO1xuICAgIH0sXG4gICAgeyBtaW5YOiBJbmZpbml0eSwgbWluWTogSW5maW5pdHksIG1heFg6IC1JbmZpbml0eSwgbWF4WTogLUluZmluaXR5IH0sXG4gICk7XG4gIHJldHVybiBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG59O1xuXG5jb25zdCBnZXRCb3VuZHNGcm9tUG9pbnRzID0gKFxuICBwb2ludHM6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnRbXCJwb2ludHNcIl0sXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGxldCBtaW5YID0gSW5maW5pdHk7XG4gIGxldCBtaW5ZID0gSW5maW5pdHk7XG4gIGxldCBtYXhYID0gLUluZmluaXR5O1xuICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcblxuICBmb3IgKGNvbnN0IFt4LCB5XSBvZiBwb2ludHMpIHtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCk7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkpO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4KTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG4gIH1cblxuICByZXR1cm4gW21pblgsIG1pblksIG1heFgsIG1heFldO1xufTtcblxuY29uc3QgZ2V0RnJlZURyYXdFbGVtZW50QWJzb2x1dGVDb29yZHMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldEJvdW5kc0Zyb21Qb2ludHMoZWxlbWVudC5wb2ludHMpO1xuXG4gIHJldHVybiBbXG4gICAgbWluWCArIGVsZW1lbnQueCxcbiAgICBtaW5ZICsgZWxlbWVudC55LFxuICAgIG1heFggKyBlbGVtZW50LngsXG4gICAgbWF4WSArIGVsZW1lbnQueSxcbiAgXTtcbn07XG5cbmNvbnN0IGdldExpbmVhckVsZW1lbnRBYnNvbHV0ZUNvb3JkcyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGxldCBjb29yZHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggPCAyIHx8ICFnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBYWFggdGhpcyBpcyBqdXN0IGEgcG9vciBlc3RpbWF0ZSBhbmQgbm90IHZlcnkgdXNlZnVsXG4gICAgY29uc3QgeyBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZIH0gPSBlbGVtZW50LnBvaW50cy5yZWR1Y2UoXG4gICAgICAobGltaXRzLCBbeCwgeV0pID0+IHtcbiAgICAgICAgbGltaXRzLm1pblkgPSBNYXRoLm1pbihsaW1pdHMubWluWSwgeSk7XG4gICAgICAgIGxpbWl0cy5taW5YID0gTWF0aC5taW4obGltaXRzLm1pblgsIHgpO1xuXG4gICAgICAgIGxpbWl0cy5tYXhYID0gTWF0aC5tYXgobGltaXRzLm1heFgsIHgpO1xuICAgICAgICBsaW1pdHMubWF4WSA9IE1hdGgubWF4KGxpbWl0cy5tYXhZLCB5KTtcblxuICAgICAgICByZXR1cm4gbGltaXRzO1xuICAgICAgfSxcbiAgICAgIHsgbWluWDogSW5maW5pdHksIG1pblk6IEluZmluaXR5LCBtYXhYOiAtSW5maW5pdHksIG1heFk6IC1JbmZpbml0eSB9LFxuICAgICk7XG4gICAgY29vcmRzID0gW1xuICAgICAgbWluWCArIGVsZW1lbnQueCxcbiAgICAgIG1pblkgKyBlbGVtZW50LnksXG4gICAgICBtYXhYICsgZWxlbWVudC54LFxuICAgICAgbWF4WSArIGVsZW1lbnQueSxcbiAgICBdO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNoYXBlID0gZ2V0U2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpITtcblxuICAgIC8vIGZpcnN0IGVsZW1lbnQgaXMgYWx3YXlzIHRoZSBjdXJ2ZVxuICAgIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhzaGFwZVswXSk7XG5cbiAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMob3BzKTtcblxuICAgIGNvb3JkcyA9IFtcbiAgICAgIG1pblggKyBlbGVtZW50LngsXG4gICAgICBtaW5ZICsgZWxlbWVudC55LFxuICAgICAgbWF4WCArIGVsZW1lbnQueCxcbiAgICAgIG1heFkgKyBlbGVtZW50LnksXG4gICAgXTtcbiAgfVxuXG4gIHJldHVybiBjb29yZHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXJyb3doZWFkUG9pbnRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgc2hhcGU6IERyYXdhYmxlW10sXG4gIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiLFxuICBhcnJvd2hlYWQ6IEFycm93aGVhZCxcbikgPT4ge1xuICBjb25zdCBvcHMgPSBnZXRDdXJ2ZVBhdGhPcHMoc2hhcGVbMF0pO1xuICBpZiAob3BzLmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSBpbmRleCBvZiB0aGUgYkN1cnZlIG9wZXJhdGlvbiB0byBleGFtaW5lLlxuICBjb25zdCBpbmRleCA9IHBvc2l0aW9uID09PSBcInN0YXJ0XCIgPyAxIDogb3BzLmxlbmd0aCAtIDE7XG5cbiAgY29uc3QgZGF0YSA9IG9wc1tpbmRleF0uZGF0YTtcbiAgY29uc3QgcDMgPSBbZGF0YVs0XSwgZGF0YVs1XV0gYXMgUG9pbnQ7XG4gIGNvbnN0IHAyID0gW2RhdGFbMl0sIGRhdGFbM11dIGFzIFBvaW50O1xuICBjb25zdCBwMSA9IFtkYXRhWzBdLCBkYXRhWzFdXSBhcyBQb2ludDtcblxuICAvLyBXZSBuZWVkIHRvIGZpbmQgcDAgb2YgdGhlIGJlemllciBjdXJ2ZS5cbiAgLy8gSXQgaXMgdHlwaWNhbGx5IHRoZSBsYXN0IHBvaW50IG9mIHRoZSBwcmV2aW91c1xuICAvLyBjdXJ2ZTsgaXQgY2FuIGFsc28gYmUgdGhlIHBvc2l0aW9uIG9mIG1vdmVUbyBvcGVyYXRpb24uXG4gIGNvbnN0IHByZXZPcCA9IG9wc1tpbmRleCAtIDFdO1xuICBsZXQgcDA6IFBvaW50ID0gWzAsIDBdO1xuICBpZiAocHJldk9wLm9wID09PSBcIm1vdmVcIikge1xuICAgIHAwID0gcHJldk9wLmRhdGEgYXMgdW5rbm93biBhcyBQb2ludDtcbiAgfSBlbHNlIGlmIChwcmV2T3Aub3AgPT09IFwiYmN1cnZlVG9cIikge1xuICAgIHAwID0gW3ByZXZPcC5kYXRhWzRdLCBwcmV2T3AuZGF0YVs1XV07XG4gIH1cblxuICAvLyBCKHQpID0gcDAgKiAoMS10KV4zICsgM3AxICogdCAqICgxLXQpXjIgKyAzcDIgKiB0XjIgKiAoMS10KSArIHAzICogdF4zXG4gIGNvbnN0IGVxdWF0aW9uID0gKHQ6IG51bWJlciwgaWR4OiBudW1iZXIpID0+XG4gICAgTWF0aC5wb3coMSAtIHQsIDMpICogcDNbaWR4XSArXG4gICAgMyAqIHQgKiBNYXRoLnBvdygxIC0gdCwgMikgKiBwMltpZHhdICtcbiAgICAzICogTWF0aC5wb3codCwgMikgKiAoMSAtIHQpICogcDFbaWR4XSArXG4gICAgcDBbaWR4XSAqIE1hdGgucG93KHQsIDMpO1xuXG4gIC8vIEVlIGtub3cgdGhlIGxhc3QgcG9pbnQgb2YgdGhlIGFycm93IChvciB0aGUgZmlyc3QsIGlmIHN0YXJ0IGFycm93aGVhZCkuXG4gIGNvbnN0IFt4MiwgeTJdID0gcG9zaXRpb24gPT09IFwic3RhcnRcIiA/IHAwIDogcDM7XG5cbiAgLy8gQnkgdXNpbmcgY3ViaWMgYmV6aWVyIGVxdWF0aW9uIChCKHQpKSBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMsXG4gIC8vIHdlIGNhbGN1bGF0ZSBhIHBvaW50IHRoYXQgaXMgY2xvc2VyIHRvIHRoZSBsYXN0IHBvaW50LlxuICAvLyBUaGUgdmFsdWUgMC4zIGlzIGNob3NlbiBhcmJpdHJhcmlseSBhbmQgaXQgd29ya3MgYmVzdCBmb3IgYWxsXG4gIC8vIHRoZSB0ZXN0ZWQgY2FzZXMuXG4gIGNvbnN0IFt4MSwgeTFdID0gW2VxdWF0aW9uKDAuMywgMCksIGVxdWF0aW9uKDAuMywgMSldO1xuXG4gIC8vIEZpbmQgdGhlIG5vcm1hbGl6ZWQgZGlyZWN0aW9uIHZlY3RvciBiYXNlZCBvbiB0aGVcbiAgLy8gcHJldmlvdXNseSBjYWxjdWxhdGVkIHBvaW50cy5cbiAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmh5cG90KHgyIC0geDEsIHkyIC0geTEpO1xuICBjb25zdCBueCA9ICh4MiAtIHgxKSAvIGRpc3RhbmNlO1xuICBjb25zdCBueSA9ICh5MiAtIHkxKSAvIGRpc3RhbmNlO1xuXG4gIGNvbnN0IHNpemUgPSB7XG4gICAgYXJyb3c6IDMwLFxuICAgIGJhcjogMTUsXG4gICAgZG90OiAxNSxcbiAgICB0cmlhbmdsZTogMTUsXG4gIH1bYXJyb3doZWFkXTsgLy8gcGl4ZWxzICh3aWxsIGRpZmZlciBmb3IgZWFjaCBhcnJvd2hlYWQpXG5cbiAgbGV0IGxlbmd0aCA9IDA7XG5cbiAgaWYgKGFycm93aGVhZCA9PT0gXCJhcnJvd1wiKSB7XG4gICAgLy8gTGVuZ3RoIGZvciAtPiBhcnJvd3MgaXMgYmFzZWQgb24gdGhlIGxlbmd0aCBvZiB0aGUgbGFzdCBzZWN0aW9uXG4gICAgY29uc3QgW2N4LCBjeV0gPSBlbGVtZW50LnBvaW50c1tlbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBbcHgsIHB5XSA9XG4gICAgICBlbGVtZW50LnBvaW50cy5sZW5ndGggPiAxXG4gICAgICAgID8gZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMl1cbiAgICAgICAgOiBbMCwgMF07XG5cbiAgICBsZW5ndGggPSBNYXRoLmh5cG90KGN4IC0gcHgsIGN5IC0gcHkpO1xuICB9IGVsc2Uge1xuICAgIC8vIExlbmd0aCBmb3Igb3RoZXIgYXJyb3doZWFkIHR5cGVzIGlzIGJhc2VkIG9uIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGxpbmVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQucG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBbcHgsIHB5XSA9IGVsZW1lbnQucG9pbnRzW2kgLSAxXSB8fCBbMCwgMF07XG4gICAgICBjb25zdCBbY3gsIGN5XSA9IGVsZW1lbnQucG9pbnRzW2ldO1xuICAgICAgbGVuZ3RoICs9IE1hdGguaHlwb3QoY3ggLSBweCwgY3kgLSBweSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2NhbGUgZG93biB0aGUgYXJyb3doZWFkIHVudGlsIHdlIGhpdCBhIGNlcnRhaW4gc2l6ZSBzbyB0aGF0IGl0IGRvZXNuJ3QgbG9vayB3ZWlyZC5cbiAgLy8gVGhpcyB2YWx1ZSBpcyBzZWxlY3RlZCBieSBtaW5pbWl6aW5nIGEgbWluaW11bSBzaXplIHdpdGggdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgYXJyb3doZWFkXG4gIGNvbnN0IG1pblNpemUgPSBNYXRoLm1pbihzaXplLCBsZW5ndGggLyAyKTtcbiAgY29uc3QgeHMgPSB4MiAtIG54ICogbWluU2l6ZTtcbiAgY29uc3QgeXMgPSB5MiAtIG55ICogbWluU2l6ZTtcblxuICBpZiAoYXJyb3doZWFkID09PSBcImRvdFwiKSB7XG4gICAgY29uc3QgciA9IE1hdGguaHlwb3QoeXMgLSB5MiwgeHMgLSB4MikgKyBlbGVtZW50LnN0cm9rZVdpZHRoO1xuICAgIHJldHVybiBbeDIsIHkyLCByXTtcbiAgfVxuXG4gIGNvbnN0IGFuZ2xlID0ge1xuICAgIGFycm93OiAyMCxcbiAgICBiYXI6IDkwLFxuICAgIHRyaWFuZ2xlOiAyNSxcbiAgfVthcnJvd2hlYWRdOyAvLyBkZWdyZWVzXG5cbiAgLy8gUmV0dXJuIHBvaW50c1xuICBjb25zdCBbeDMsIHkzXSA9IHJvdGF0ZSh4cywgeXMsIHgyLCB5MiwgKC1hbmdsZSAqIE1hdGguUEkpIC8gMTgwKTtcbiAgY29uc3QgW3g0LCB5NF0gPSByb3RhdGUoeHMsIHlzLCB4MiwgeTIsIChhbmdsZSAqIE1hdGguUEkpIC8gMTgwKTtcbiAgcmV0dXJuIFt4MiwgeTIsIHgzLCB5MywgeDQsIHk0XTtcbn07XG5cbmNvbnN0IGdlbmVyYXRlTGluZWFyRWxlbWVudFNoYXBlID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbik6IERyYXdhYmxlID0+IHtcbiAgY29uc3QgZ2VuZXJhdG9yID0gcm91Z2guZ2VuZXJhdG9yKCk7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KTtcblxuICBjb25zdCBtZXRob2QgPSAoKCkgPT4ge1xuICAgIGlmIChlbGVtZW50LnN0cm9rZVNoYXJwbmVzcyAhPT0gXCJzaGFycFwiKSB7XG4gICAgICByZXR1cm4gXCJjdXJ2ZVwiO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5maWxsKSB7XG4gICAgICByZXR1cm4gXCJwb2x5Z29uXCI7XG4gICAgfVxuICAgIHJldHVybiBcImxpbmVhclBhdGhcIjtcbiAgfSkoKTtcblxuICByZXR1cm4gZ2VuZXJhdG9yW21ldGhvZF0oZWxlbWVudC5wb2ludHMgYXMgTXV0YWJsZTxQb2ludD5bXSwgb3B0aW9ucyk7XG59O1xuXG5jb25zdCBnZXRMaW5lYXJFbGVtZW50Um90YXRlZEJvdW5kcyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIGN4OiBudW1iZXIsXG4gIGN5OiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggPCAyKSB7XG4gICAgY29uc3QgW3BvaW50WCwgcG9pbnRZXSA9IGVsZW1lbnQucG9pbnRzWzBdO1xuICAgIGNvbnN0IFt4LCB5XSA9IHJvdGF0ZShcbiAgICAgIGVsZW1lbnQueCArIHBvaW50WCxcbiAgICAgIGVsZW1lbnQueSArIHBvaW50WSxcbiAgICAgIGN4LFxuICAgICAgY3ksXG4gICAgICBlbGVtZW50LmFuZ2xlLFxuICAgICk7XG4gICAgcmV0dXJuIFt4LCB5LCB4LCB5XTtcbiAgfVxuXG4gIC8vIGZpcnN0IGVsZW1lbnQgaXMgYWx3YXlzIHRoZSBjdXJ2ZVxuICBjb25zdCBjYWNoZWRTaGFwZSA9IGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KT8uWzBdO1xuICBjb25zdCBzaGFwZSA9IGNhY2hlZFNoYXBlID8/IGdlbmVyYXRlTGluZWFyRWxlbWVudFNoYXBlKGVsZW1lbnQpO1xuICBjb25zdCBvcHMgPSBnZXRDdXJ2ZVBhdGhPcHMoc2hhcGUpO1xuICBjb25zdCB0cmFuc2Zvcm1YWSA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT5cbiAgICByb3RhdGUoZWxlbWVudC54ICsgeCwgZWxlbWVudC55ICsgeSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcblxuICByZXR1cm4gZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzKG9wcywgdHJhbnNmb3JtWFkpO1xufTtcblxuLy8gV2UgY291bGQgY2FjaGUgdGhpcyBzdHVmZlxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRCb3VuZHMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBsZXQgYm91bmRzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcbiAgaWYgKGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Qm91bmRzRnJvbVBvaW50cyhcbiAgICAgIGVsZW1lbnQucG9pbnRzLm1hcCgoW3gsIHldKSA9PlxuICAgICAgICByb3RhdGUoeCwgeSwgY3ggLSBlbGVtZW50LngsIGN5IC0gZWxlbWVudC55LCBlbGVtZW50LmFuZ2xlKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJldHVybiBbXG4gICAgICBtaW5YICsgZWxlbWVudC54LFxuICAgICAgbWluWSArIGVsZW1lbnQueSxcbiAgICAgIG1heFggKyBlbGVtZW50LngsXG4gICAgICBtYXhZICsgZWxlbWVudC55LFxuICAgIF07XG4gIH0gZWxzZSBpZiAoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgYm91bmRzID0gZ2V0TGluZWFyRWxlbWVudFJvdGF0ZWRCb3VuZHMoZWxlbWVudCwgY3gsIGN5KTtcbiAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09IFwiZGlhbW9uZFwiKSB7XG4gICAgY29uc3QgW3gxMSwgeTExXSA9IHJvdGF0ZShjeCwgeTEsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gxMiwgeTEyXSA9IHJvdGF0ZShjeCwgeTIsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gyMiwgeTIyXSA9IHJvdGF0ZSh4MSwgY3ksIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gyMSwgeTIxXSA9IHJvdGF0ZSh4MiwgY3ksIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgbWluWCA9IE1hdGgubWluKHgxMSwgeDEyLCB4MjIsIHgyMSk7XG4gICAgY29uc3QgbWluWSA9IE1hdGgubWluKHkxMSwgeTEyLCB5MjIsIHkyMSk7XG4gICAgY29uc3QgbWF4WCA9IE1hdGgubWF4KHgxMSwgeDEyLCB4MjIsIHgyMSk7XG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHkxMSwgeTEyLCB5MjIsIHkyMSk7XG4gICAgYm91bmRzID0gW21pblgsIG1pblksIG1heFgsIG1heFldO1xuICB9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICBjb25zdCB3ID0gKHgyIC0geDEpIC8gMjtcbiAgICBjb25zdCBoID0gKHkyIC0geTEpIC8gMjtcbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCB3dyA9IE1hdGguaHlwb3QodyAqIGNvcywgaCAqIHNpbik7XG4gICAgY29uc3QgaGggPSBNYXRoLmh5cG90KGggKiBjb3MsIHcgKiBzaW4pO1xuICAgIGJvdW5kcyA9IFtjeCAtIHd3LCBjeSAtIGhoLCBjeCArIHd3LCBjeSArIGhoXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbeDExLCB5MTFdID0gcm90YXRlKHgxLCB5MSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBbeDEyLCB5MTJdID0gcm90YXRlKHgxLCB5MiwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBbeDIyLCB5MjJdID0gcm90YXRlKHgyLCB5MiwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBbeDIxLCB5MjFdID0gcm90YXRlKHgyLCB5MSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBtaW5YID0gTWF0aC5taW4oeDExLCB4MTIsIHgyMiwgeDIxKTtcbiAgICBjb25zdCBtaW5ZID0gTWF0aC5taW4oeTExLCB5MTIsIHkyMiwgeTIxKTtcbiAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoeDExLCB4MTIsIHgyMiwgeDIxKTtcbiAgICBjb25zdCBtYXhZID0gTWF0aC5tYXgoeTExLCB5MTIsIHkyMiwgeTIxKTtcbiAgICBib3VuZHMgPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG4gIH1cblxuICByZXR1cm4gYm91bmRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbW1vbkJvdW5kcyA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFswLCAwLCAwLCAwXTtcbiAgfVxuXG4gIGxldCBtaW5YID0gSW5maW5pdHk7XG4gIGxldCBtYXhYID0gLUluZmluaXR5O1xuICBsZXQgbWluWSA9IEluZmluaXR5O1xuICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcblxuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRCb3VuZHMoZWxlbWVudCk7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIHgxKTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeTEpO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4Mik7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHkyKTtcbiAgfSk7XG5cbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNpemVkRWxlbWVudEFic29sdXRlQ29vcmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgbmV4dFdpZHRoOiBudW1iZXIsXG4gIG5leHRIZWlnaHQ6IG51bWJlcixcbiAgbm9ybWFsaXplUG9pbnRzOiBib29sZWFuLFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBpZiAoIShpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgfHwgaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGVsZW1lbnQueCxcbiAgICAgIGVsZW1lbnQueSxcbiAgICAgIGVsZW1lbnQueCArIG5leHRXaWR0aCxcbiAgICAgIGVsZW1lbnQueSArIG5leHRIZWlnaHQsXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0IHBvaW50cyA9IHJlc2NhbGVQb2ludHMoXG4gICAgMCxcbiAgICBuZXh0V2lkdGgsXG4gICAgcmVzY2FsZVBvaW50cygxLCBuZXh0SGVpZ2h0LCBlbGVtZW50LnBvaW50cywgbm9ybWFsaXplUG9pbnRzKSxcbiAgICBub3JtYWxpemVQb2ludHMsXG4gICk7XG5cbiAgbGV0IGJvdW5kczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbiAgaWYgKGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgLy8gRnJlZSBEcmF3XG4gICAgYm91bmRzID0gZ2V0Qm91bmRzRnJvbVBvaW50cyhwb2ludHMpO1xuICB9IGVsc2Uge1xuICAgIC8vIExpbmVcbiAgICBjb25zdCBnZW4gPSByb3VnaC5nZW5lcmF0b3IoKTtcbiAgICBjb25zdCBjdXJ2ZSA9XG4gICAgICBlbGVtZW50LnN0cm9rZVNoYXJwbmVzcyA9PT0gXCJzaGFycFwiXG4gICAgICAgID8gZ2VuLmxpbmVhclBhdGgoXG4gICAgICAgICAgICBwb2ludHMgYXMgW251bWJlciwgbnVtYmVyXVtdLFxuICAgICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgICAgKVxuICAgICAgICA6IGdlbi5jdXJ2ZShcbiAgICAgICAgICAgIHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sXG4gICAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSxcbiAgICAgICAgICApO1xuXG4gICAgY29uc3Qgb3BzID0gZ2V0Q3VydmVQYXRoT3BzKGN1cnZlKTtcbiAgICBib3VuZHMgPSBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMob3BzKTtcbiAgfVxuXG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGJvdW5kcztcbiAgcmV0dXJuIFtcbiAgICBtaW5YICsgZWxlbWVudC54LFxuICAgIG1pblkgKyBlbGVtZW50LnksXG4gICAgbWF4WCArIGVsZW1lbnQueCxcbiAgICBtYXhZICsgZWxlbWVudC55LFxuICBdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRQb2ludHNDb29yZHMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBwb2ludHM6IHJlYWRvbmx5IChyZWFkb25seSBbbnVtYmVyLCBudW1iZXJdKVtdLFxuICBzaGFycG5lc3M6IEV4Y2FsaWRyYXdFbGVtZW50W1wic3Ryb2tlU2hhcnBuZXNzXCJdLFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICAvLyBUaGlzIG1pZ2h0IGJlIGNvbXB1dGF0aW9uYWxseSBoZWF2ZXlcbiAgY29uc3QgZ2VuID0gcm91Z2guZ2VuZXJhdG9yKCk7XG4gIGNvbnN0IGN1cnZlID1cbiAgICBzaGFycG5lc3MgPT09IFwic2hhcnBcIlxuICAgICAgPyBnZW4ubGluZWFyUGF0aChcbiAgICAgICAgICBwb2ludHMgYXMgW251bWJlciwgbnVtYmVyXVtdLFxuICAgICAgICAgIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpLFxuICAgICAgICApXG4gICAgICA6IGdlbi5jdXJ2ZShwb2ludHMgYXMgW251bWJlciwgbnVtYmVyXVtdLCBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSk7XG4gIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhjdXJ2ZSk7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldE1pbk1heFhZRnJvbUN1cnZlUGF0aE9wcyhvcHMpO1xuICByZXR1cm4gW1xuICAgIG1pblggKyBlbGVtZW50LngsXG4gICAgbWluWSArIGVsZW1lbnQueSxcbiAgICBtYXhYICsgZWxlbWVudC54LFxuICAgIG1heFkgKyBlbGVtZW50LnksXG4gIF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q2xvc2VzdEVsZW1lbnRCb3VuZHMgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBmcm9tOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFswLCAwLCAwLCAwXTtcbiAgfVxuXG4gIGxldCBtaW5EaXN0YW5jZSA9IEluZmluaXR5O1xuICBsZXQgY2xvc2VzdEVsZW1lbnQgPSBlbGVtZW50c1swXTtcblxuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRCb3VuZHMoZWxlbWVudCk7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZTJkKCh4MSArIHgyKSAvIDIsICh5MSArIHkyKSAvIDIsIGZyb20ueCwgZnJvbS55KTtcblxuICAgIGlmIChkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7XG4gICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgY2xvc2VzdEVsZW1lbnQgPSBlbGVtZW50O1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGdldEVsZW1lbnRCb3VuZHMoY2xvc2VzdEVsZW1lbnQpO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBCb3gge1xuICBtaW5YOiBudW1iZXI7XG4gIG1pblk6IG51bWJlcjtcbiAgbWF4WDogbnVtYmVyO1xuICBtYXhZOiBudW1iZXI7XG4gIG1pZFg6IG51bWJlcjtcbiAgbWlkWTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGdldENvbW1vbkJvdW5kaW5nQm94ID0gKFxuICBlbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSB8IHJlYWRvbmx5IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+W10sXG4pOiBCb3ggPT4ge1xuICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRDb21tb25Cb3VuZHMoZWxlbWVudHMpO1xuICByZXR1cm4ge1xuICAgIG1pblgsXG4gICAgbWluWSxcbiAgICBtYXhYLFxuICAgIG1heFksXG4gICAgd2lkdGg6IG1heFggLSBtaW5YLFxuICAgIGhlaWdodDogbWF4WSAtIG1pblksXG4gICAgbWlkWDogKG1pblggKyBtYXhYKSAvIDIsXG4gICAgbWlkWTogKG1pblkgKyBtYXhZKSAvIDIsXG4gIH07XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/bounds.ts\n");
|
|
2863
2863
|
|
|
2864
2864
|
/***/ }),
|
|
2865
2865
|
|
|
@@ -2947,7 +2947,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2947
2947
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2948
2948
|
|
|
2949
2949
|
"use strict";
|
|
2950
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getResizeArrowDirection\": () => (/* binding */ getResizeArrowDirection),\n/* harmony export */ \"getResizeOffsetXY\": () => (/* binding */ getResizeOffsetXY),\n/* harmony export */ \"normalizeAngle\": () => (/* binding */ normalizeAngle),\n/* harmony export */ \"reshapeSingleTwoPointElement\": () => (/* binding */ reshapeSingleTwoPointElement),\n/* harmony export */ \"resizeSingleElement\": () => (/* binding */ resizeSingleElement),\n/* harmony export */ \"transformElements\": () => (/* binding */ transformElements)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../points */ \"../../points.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _sizeHelpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sizeHelpers */ \"../../element/sizeHelpers.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _binding__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./binding */ \"../../element/binding.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n\n\n\n\n\n\n\n\n\n\n\nconst normalizeAngle = (angle) => {\n if (angle >= 2 * Math.PI) {\n return angle - 2 * Math.PI;\n }\n return angle;\n};\n// Returns true when transform (resizing/rotation) happened\nconst transformElements = (pointerDownState, transformHandleType, selectedElements, resizeArrowDirection, shouldRotateWithDiscreteAngle, shouldResizeFromCenter, shouldMaintainAspectRatio, pointerX, pointerY, centerX, centerY) => {\n if (selectedElements.length === 1) {\n const [element] = selectedElements;\n if (transformHandleType === \"rotation\") {\n rotateSingleElement(element, pointerX, pointerY, shouldRotateWithDiscreteAngle);\n (0,_binding__WEBPACK_IMPORTED_MODULE_8__.updateBoundElements)(element);\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isLinearElement)(element) &&\n element.points.length === 2 &&\n (transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\")) {\n reshapeSingleTwoPointElement(element, resizeArrowDirection, shouldRotateWithDiscreteAngle, pointerX, pointerY);\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) &&\n (transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\")) {\n resizeSingleTextElement(element, transformHandleType, shouldResizeFromCenter, pointerX, pointerY);\n (0,_binding__WEBPACK_IMPORTED_MODULE_8__.updateBoundElements)(element);\n }\n else if (transformHandleType) {\n resizeSingleElement(pointerDownState.originalElements, shouldMaintainAspectRatio, element, transformHandleType, shouldResizeFromCenter, pointerX, pointerY);\n }\n return true;\n }\n else if (selectedElements.length > 1) {\n if (transformHandleType === \"rotation\") {\n rotateMultipleElements(pointerDownState, selectedElements, pointerX, pointerY, shouldRotateWithDiscreteAngle, centerX, centerY);\n return true;\n }\n else if (transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\") {\n resizeMultipleElements(pointerDownState, selectedElements, transformHandleType, shouldResizeFromCenter, pointerX, pointerY);\n return true;\n }\n }\n return false;\n};\nconst rotateSingleElement = (element, pointerX, pointerY, shouldRotateWithDiscreteAngle) => {\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n let angle = (5 * Math.PI) / 2 + Math.atan2(pointerY - cy, pointerX - cx);\n if (shouldRotateWithDiscreteAngle) {\n angle += _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE / 2;\n angle -= angle % _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE;\n }\n angle = normalizeAngle(angle);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, { angle });\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.getBoundTextElementId)(element);\n if (boundTextElementId) {\n const textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_9__[\"default\"].getScene(element).getElement(boundTextElementId);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(textElement, { angle });\n }\n};\n// used in DEV only\nconst validateTwoPointElementNormalized = (element) => {\n if (element.points.length !== 2 ||\n element.points[0][0] !== 0 ||\n element.points[0][1] !== 0 ||\n Math.abs(element.points[1][0]) !== element.width ||\n Math.abs(element.points[1][1]) !== element.height) {\n throw new Error(\"Two-point element is not normalized\");\n }\n};\nconst getPerfectElementSizeWithRotation = (elementType, width, height, angle) => {\n const size = (0,_sizeHelpers__WEBPACK_IMPORTED_MODULE_6__.getPerfectElementSize)(elementType, ...(0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(width, height, 0, 0, angle));\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(size.width, size.height, 0, 0, -angle);\n};\nconst reshapeSingleTwoPointElement = (element, resizeArrowDirection, shouldRotateWithDiscreteAngle, pointerX, pointerY) => {\n if (true) {\n validateTwoPointElementNormalized(element);\n }\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n // rotation pointer with reverse angle\n const [rotatedX, rotatedY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(pointerX, pointerY, cx, cy, -element.angle);\n let [width, height] = resizeArrowDirection === \"end\"\n ? [rotatedX - element.x, rotatedY - element.y]\n : [\n element.x + element.points[1][0] - rotatedX,\n element.y + element.points[1][1] - rotatedY,\n ];\n if (shouldRotateWithDiscreteAngle) {\n [width, height] = getPerfectElementSizeWithRotation(element.type, width, height, element.angle);\n }\n const [nextElementX, nextElementY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.adjustXYWithRotation)(resizeArrowDirection === \"end\"\n ? { s: true, e: true }\n : { n: true, w: true }, element.x, element.y, element.angle, 0, 0, (element.points[1][0] - width) / 2, (element.points[1][1] - height) / 2);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, {\n x: nextElementX,\n y: nextElementY,\n points: [\n [0, 0],\n [width, height],\n ],\n });\n};\nconst rescalePointsInElement = (element, width, height, normalizePoints) => (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isFreeDrawElement)(element)\n ? {\n points: (0,_points__WEBPACK_IMPORTED_MODULE_1__.rescalePoints)(0, width, (0,_points__WEBPACK_IMPORTED_MODULE_1__.rescalePoints)(1, height, element.points, normalizePoints), normalizePoints),\n }\n : {};\nconst MIN_FONT_SIZE = 1;\nconst measureFontSizeFromWH = (element, nextWidth, nextHeight) => {\n // We only use width to scale font on resize\n const nextFontSize = element.fontSize * (nextWidth / element.width);\n if (nextFontSize < MIN_FONT_SIZE) {\n return null;\n }\n const metrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_7__.getFontString)({ fontSize: nextFontSize, fontFamily: element.fontFamily }), element.containerId ? element.width : null);\n return {\n size: nextFontSize,\n baseline: metrics.baseline + (nextHeight - metrics.height),\n };\n};\nconst getSidesForTransformHandle = (transformHandleType, shouldResizeFromCenter) => {\n return {\n n: /^(n|ne|nw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(s|se|sw)$/.test(transformHandleType)),\n s: /^(s|se|sw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(n|ne|nw)$/.test(transformHandleType)),\n w: /^(w|nw|sw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(e|ne|se)$/.test(transformHandleType)),\n e: /^(e|ne|se)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(w|nw|sw)$/.test(transformHandleType)),\n };\n};\nconst resizeSingleTextElement = (element, transformHandleType, shouldResizeFromCenter, pointerX, pointerY) => {\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n // rotation pointer with reverse angle\n const [rotatedX, rotatedY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(pointerX, pointerY, cx, cy, -element.angle);\n let scale;\n switch (transformHandleType) {\n case \"se\":\n scale = Math.max((rotatedX - x1) / (x2 - x1), (rotatedY - y1) / (y2 - y1));\n break;\n case \"nw\":\n scale = Math.max((x2 - rotatedX) / (x2 - x1), (y2 - rotatedY) / (y2 - y1));\n break;\n case \"ne\":\n scale = Math.max((rotatedX - x1) / (x2 - x1), (y2 - rotatedY) / (y2 - y1));\n break;\n case \"sw\":\n scale = Math.max((x2 - rotatedX) / (x2 - x1), (rotatedY - y1) / (y2 - y1));\n break;\n }\n if (scale > 0) {\n const nextWidth = element.width * scale;\n const nextHeight = element.height * scale;\n const nextFont = measureFontSizeFromWH(element, nextWidth, nextHeight);\n if (nextFont === null) {\n return;\n }\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight, false);\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n const [nextElementX, nextElementY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.adjustXYWithRotation)(getSidesForTransformHandle(transformHandleType, shouldResizeFromCenter), element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, {\n fontSize: nextFont.size,\n width: nextWidth,\n height: nextHeight,\n baseline: nextFont.baseline,\n x: nextElementX,\n y: nextElementY,\n });\n }\n};\nconst resizeSingleElement = (originalElements, shouldMaintainAspectRatio, element, transformHandleDirection, shouldResizeFromCenter, pointerX, pointerY) => {\n const stateAtResizeStart = originalElements.get(element.id);\n // Gets bounds corners\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(stateAtResizeStart, stateAtResizeStart.width, stateAtResizeStart.height, true);\n const startTopLeft = [x1, y1];\n const startBottomRight = [x2, y2];\n const startCenter = (0,_math__WEBPACK_IMPORTED_MODULE_2__.centerPoint)(startTopLeft, startBottomRight);\n // Calculate new dimensions based on cursor position\n const rotatedPointer = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)([pointerX, pointerY], startCenter, -stateAtResizeStart.angle);\n // Get bounds corners rendered on screen\n const [esx1, esy1, esx2, esy2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(element, element.width, element.height, true);\n const boundsCurrentWidth = esx2 - esx1;\n const boundsCurrentHeight = esy2 - esy1;\n // It's important we set the initial scale value based on the width and height at resize start,\n // otherwise previous dimensions affected by modifiers will be taken into account.\n const atStartBoundsWidth = startBottomRight[0] - startTopLeft[0];\n const atStartBoundsHeight = startBottomRight[1] - startTopLeft[1];\n let scaleX = atStartBoundsWidth / boundsCurrentWidth;\n let scaleY = atStartBoundsHeight / boundsCurrentHeight;\n let boundTextFont = {};\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.getBoundTextElement)(element);\n if (transformHandleDirection.includes(\"e\")) {\n scaleX = (rotatedPointer[0] - startTopLeft[0]) / boundsCurrentWidth;\n }\n if (transformHandleDirection.includes(\"s\")) {\n scaleY = (rotatedPointer[1] - startTopLeft[1]) / boundsCurrentHeight;\n }\n if (transformHandleDirection.includes(\"w\")) {\n scaleX = (startBottomRight[0] - rotatedPointer[0]) / boundsCurrentWidth;\n }\n if (transformHandleDirection.includes(\"n\")) {\n scaleY = (startBottomRight[1] - rotatedPointer[1]) / boundsCurrentHeight;\n }\n // Linear elements dimensions differ from bounds dimensions\n const eleInitialWidth = stateAtResizeStart.width;\n const eleInitialHeight = stateAtResizeStart.height;\n // We have to use dimensions of element on screen, otherwise the scaling of the\n // dimensions won't match the cursor for linear elements.\n let eleNewWidth = element.width * scaleX;\n let eleNewHeight = element.height * scaleY;\n // adjust dimensions for resizing from center\n if (shouldResizeFromCenter) {\n eleNewWidth = 2 * eleNewWidth - eleInitialWidth;\n eleNewHeight = 2 * eleNewHeight - eleInitialHeight;\n }\n // adjust dimensions to keep sides ratio\n if (shouldMaintainAspectRatio) {\n const widthRatio = Math.abs(eleNewWidth) / eleInitialWidth;\n const heightRatio = Math.abs(eleNewHeight) / eleInitialHeight;\n if (transformHandleDirection.length === 1) {\n eleNewHeight *= widthRatio;\n eleNewWidth *= heightRatio;\n }\n if (transformHandleDirection.length === 2) {\n const ratio = Math.max(widthRatio, heightRatio);\n eleNewWidth = eleInitialWidth * ratio * Math.sign(eleNewWidth);\n eleNewHeight = eleInitialHeight * ratio * Math.sign(eleNewHeight);\n }\n }\n if (boundTextElement) {\n const stateOfBoundTextElementAtResize = originalElements.get(boundTextElement.id);\n if (stateOfBoundTextElementAtResize) {\n boundTextFont = {\n fontSize: stateOfBoundTextElementAtResize.fontSize,\n baseline: stateOfBoundTextElementAtResize.baseline,\n };\n }\n if (shouldMaintainAspectRatio) {\n const nextFont = measureFontSizeFromWH(boundTextElement, eleNewWidth - _constants__WEBPACK_IMPORTED_MODULE_0__.BOUND_TEXT_PADDING * 2, eleNewHeight - _constants__WEBPACK_IMPORTED_MODULE_0__.BOUND_TEXT_PADDING * 2);\n if (nextFont === null) {\n return;\n }\n boundTextFont = {\n fontSize: nextFont.size,\n baseline: nextFont.baseline,\n };\n }\n else {\n const minWidth = (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.getApproxMinLineWidth)((0,_utils__WEBPACK_IMPORTED_MODULE_7__.getFontString)(boundTextElement));\n const minHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.getApproxMinLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_7__.getFontString)(boundTextElement));\n eleNewWidth = Math.ceil(Math.max(eleNewWidth, minWidth));\n eleNewHeight = Math.ceil(Math.max(eleNewHeight, minHeight));\n }\n }\n const [newBoundsX1, newBoundsY1, newBoundsX2, newBoundsY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(stateAtResizeStart, eleNewWidth, eleNewHeight, true);\n const newBoundsWidth = newBoundsX2 - newBoundsX1;\n const newBoundsHeight = newBoundsY2 - newBoundsY1;\n // Calculate new topLeft based on fixed corner during resize\n let newTopLeft = [...startTopLeft];\n if ([\"n\", \"w\", \"nw\"].includes(transformHandleDirection)) {\n newTopLeft = [\n startBottomRight[0] - Math.abs(newBoundsWidth),\n startBottomRight[1] - Math.abs(newBoundsHeight),\n ];\n }\n if (transformHandleDirection === \"ne\") {\n const bottomLeft = [startTopLeft[0], startBottomRight[1]];\n newTopLeft = [bottomLeft[0], bottomLeft[1] - Math.abs(newBoundsHeight)];\n }\n if (transformHandleDirection === \"sw\") {\n const topRight = [startBottomRight[0], startTopLeft[1]];\n newTopLeft = [topRight[0] - Math.abs(newBoundsWidth), topRight[1]];\n }\n // Keeps opposite handle fixed during resize\n if (shouldMaintainAspectRatio) {\n if ([\"s\", \"n\"].includes(transformHandleDirection)) {\n newTopLeft[0] = startCenter[0] - newBoundsWidth / 2;\n }\n if ([\"e\", \"w\"].includes(transformHandleDirection)) {\n newTopLeft[1] = startCenter[1] - newBoundsHeight / 2;\n }\n }\n // Flip horizontally\n if (eleNewWidth < 0) {\n if (transformHandleDirection.includes(\"e\")) {\n newTopLeft[0] -= Math.abs(newBoundsWidth);\n }\n if (transformHandleDirection.includes(\"w\")) {\n newTopLeft[0] += Math.abs(newBoundsWidth);\n }\n }\n // Flip vertically\n if (eleNewHeight < 0) {\n if (transformHandleDirection.includes(\"s\")) {\n newTopLeft[1] -= Math.abs(newBoundsHeight);\n }\n if (transformHandleDirection.includes(\"n\")) {\n newTopLeft[1] += Math.abs(newBoundsHeight);\n }\n }\n if (shouldResizeFromCenter) {\n newTopLeft[0] = startCenter[0] - Math.abs(newBoundsWidth) / 2;\n newTopLeft[1] = startCenter[1] - Math.abs(newBoundsHeight) / 2;\n }\n // adjust topLeft to new rotation point\n const angle = stateAtResizeStart.angle;\n const rotatedTopLeft = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)(newTopLeft, startCenter, angle);\n const newCenter = [\n newTopLeft[0] + Math.abs(newBoundsWidth) / 2,\n newTopLeft[1] + Math.abs(newBoundsHeight) / 2,\n ];\n const rotatedNewCenter = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)(newCenter, startCenter, angle);\n newTopLeft = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)(rotatedTopLeft, rotatedNewCenter, -angle);\n // Readjust points for linear elements\n const rescaledPoints = rescalePointsInElement(stateAtResizeStart, eleNewWidth, eleNewHeight, true);\n // For linear elements (x,y) are the coordinates of the first drawn point not the top-left corner\n // So we need to readjust (x,y) to be where the first point should be\n const newOrigin = [...newTopLeft];\n newOrigin[0] += stateAtResizeStart.x - newBoundsX1;\n newOrigin[1] += stateAtResizeStart.y - newBoundsY1;\n const resizedElement = Object.assign({ width: Math.abs(eleNewWidth), height: Math.abs(eleNewHeight), x: newOrigin[0], y: newOrigin[1] }, rescaledPoints);\n if (\"scale\" in element && \"scale\" in stateAtResizeStart) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, {\n scale: [\n // defaulting because scaleX/Y can be 0/-0\n (Math.sign(scaleX) || stateAtResizeStart.scale[0]) *\n stateAtResizeStart.scale[0],\n (Math.sign(scaleY) || stateAtResizeStart.scale[1]) *\n stateAtResizeStart.scale[1],\n ],\n });\n }\n if (resizedElement.width !== 0 &&\n resizedElement.height !== 0 &&\n Number.isFinite(resizedElement.x) &&\n Number.isFinite(resizedElement.y)) {\n (0,_binding__WEBPACK_IMPORTED_MODULE_8__.updateBoundElements)(element, {\n newSize: { width: resizedElement.width, height: resizedElement.height },\n });\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, resizedElement);\n if (boundTextElement && boundTextFont) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(boundTextElement, { fontSize: boundTextFont.fontSize });\n }\n (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.handleBindTextResize)(element, transformHandleDirection);\n }\n};\nconst resizeMultipleElements = (pointerDownState, selectedElements, transformHandleType, shouldResizeFromCenter, pointerX, pointerY) => {\n // map selected elements to the original elements. While it never should\n // happen that pointerDownState.originalElements won't contain the selected\n // elements during resize, this coupling isn't guaranteed, so to ensure\n // type safety we need to transform only those elements we filter.\n const targetElements = selectedElements.reduce((acc, element) => {\n const origElement = pointerDownState.originalElements.get(element.id);\n if (origElement) {\n acc.push({ orig: origElement, latest: element });\n }\n return acc;\n }, []);\n const { minX, minY, maxX, maxY, midX, midY } = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getCommonBoundingBox)(targetElements.map(({ orig }) => orig));\n const direction = transformHandleType;\n const mapDirectionsToAnchors = {\n ne: [minX, maxY],\n se: [minX, minY],\n sw: [maxX, minY],\n nw: [maxX, maxY],\n };\n // anchor point must be on the opposite side of the dragged selection handle\n // or be the center of the selection if alt is pressed\n const [anchorX, anchorY] = shouldResizeFromCenter\n ? [midX, midY]\n : mapDirectionsToAnchors[direction];\n const mapDirectionsToPointerSides = {\n ne: [pointerX >= anchorX, pointerY <= anchorY],\n se: [pointerX >= anchorX, pointerY >= anchorY],\n sw: [pointerX <= anchorX, pointerY >= anchorY],\n nw: [pointerX <= anchorX, pointerY <= anchorY],\n };\n // pointer side relative to anchor\n const [pointerSideX, pointerSideY] = mapDirectionsToPointerSides[direction].map((condition) => (condition ? 1 : -1));\n // stop resizing if a pointer is on the other side of selection\n if (pointerSideX < 0 && pointerSideY < 0) {\n return;\n }\n const scale = Math.max((pointerSideX * Math.abs(pointerX - anchorX)) / (maxX - minX), (pointerSideY * Math.abs(pointerY - anchorY)) / (maxY - minY)) * (shouldResizeFromCenter ? 2 : 1);\n if (scale === 1) {\n return;\n }\n targetElements.forEach((element) => {\n const width = element.orig.width * scale;\n const height = element.orig.height * scale;\n const x = anchorX + (element.orig.x - anchorX) * scale;\n const y = anchorY + (element.orig.y - anchorY) * scale;\n // readjust points for linear & free draw elements\n const rescaledPoints = rescalePointsInElement(element.orig, width, height, false);\n const update = Object.assign({ width,\n height,\n x,\n y }, rescaledPoints);\n let boundTextUpdates = null;\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.getBoundTextElement)(element.latest);\n if (boundTextElement || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element.orig)) {\n const optionalPadding = boundTextElement ? _constants__WEBPACK_IMPORTED_MODULE_0__.BOUND_TEXT_PADDING * 2 : 0;\n const textMeasurements = measureFontSizeFromWH(boundTextElement !== null && boundTextElement !== void 0 ? boundTextElement : element.orig, width - optionalPadding, height - optionalPadding);\n if (textMeasurements) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element.orig)) {\n update.fontSize = textMeasurements.size;\n update.baseline = textMeasurements.baseline;\n }\n if (boundTextElement) {\n boundTextUpdates = {\n fontSize: textMeasurements.size,\n baseline: textMeasurements.baseline,\n };\n }\n }\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element.latest, update);\n if (boundTextElement && boundTextUpdates) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(boundTextElement, boundTextUpdates);\n (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.handleBindTextResize)(element.latest, transformHandleType);\n }\n });\n};\nconst rotateMultipleElements = (pointerDownState, elements, pointerX, pointerY, shouldRotateWithDiscreteAngle, centerX, centerY) => {\n let centerAngle = (5 * Math.PI) / 2 + Math.atan2(pointerY - centerY, pointerX - centerX);\n if (shouldRotateWithDiscreteAngle) {\n centerAngle += _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE / 2;\n centerAngle -= centerAngle % _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE;\n }\n elements.forEach((element, index) => {\n var _a, _b;\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const origAngle = (_b = (_a = pointerDownState.originalElements.get(element.id)) === null || _a === void 0 ? void 0 : _a.angle) !== null && _b !== void 0 ? _b : element.angle;\n const [rotatedCX, rotatedCY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(cx, cy, centerX, centerY, centerAngle + origAngle - element.angle);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, {\n x: element.x + (rotatedCX - cx),\n y: element.y + (rotatedCY - cy),\n angle: normalizeAngle(centerAngle + origAngle),\n });\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.getBoundTextElementId)(element);\n if (boundTextElementId) {\n const textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_9__[\"default\"].getScene(element).getElement(boundTextElementId);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(textElement, {\n x: textElement.x + (rotatedCX - cx),\n y: textElement.y + (rotatedCY - cy),\n angle: normalizeAngle(centerAngle + origAngle),\n });\n }\n });\n};\nconst getResizeOffsetXY = (transformHandleType, selectedElements, x, y) => {\n const [x1, y1, x2, y2] = selectedElements.length === 1\n ? (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(selectedElements[0])\n : (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getCommonBounds)(selectedElements);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const angle = selectedElements.length === 1 ? selectedElements[0].angle : 0;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x, y, cx, cy, -angle);\n switch (transformHandleType) {\n case \"n\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - (x1 + x2) / 2, y - y1, 0, 0, angle);\n case \"s\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - (x1 + x2) / 2, y - y2, 0, 0, angle);\n case \"w\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x1, y - (y1 + y2) / 2, 0, 0, angle);\n case \"e\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x2, y - (y1 + y2) / 2, 0, 0, angle);\n case \"nw\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x1, y - y1, 0, 0, angle);\n case \"ne\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x2, y - y1, 0, 0, angle);\n case \"sw\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x1, y - y2, 0, 0, angle);\n case \"se\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x2, y - y2, 0, 0, angle);\n default:\n return [0, 0];\n }\n};\nconst getResizeArrowDirection = (transformHandleType, element) => {\n const [, [px, py]] = element.points;\n const isResizeEnd = (transformHandleType === \"nw\" && (px < 0 || py < 0)) ||\n (transformHandleType === \"ne\" && px >= 0) ||\n (transformHandleType === \"sw\" && px <= 0) ||\n (transformHandleType === \"se\" && (px > 0 || py > 0));\n return isResizeEnd ? \"end\" : \"origin\";\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SUFBSTtZQUNQLE9BQU8sNkNBQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QyxLQUFLLElBQUk7WUFDUCxPQUFPLDZDQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0M7WUFDRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQyxDQUFDO0FBRUssTUFBTSx1QkFBdUIsR0FBRyxDQUNyQyxtQkFBNkMsRUFDN0MsT0FBNEMsRUFDMUIsRUFBRTtJQUNwQixNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDcEMsTUFBTSxXQUFXLEdBQ2YsQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDLG1CQUFtQixLQUFLLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUMsbUJBQW1CLEtBQUssSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekMsQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUN4QyxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC9yZXNpemVFbGVtZW50cy50cz9jYThlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJPVU5EX1RFWFRfUEFERElORywgU0hJRlRfTE9DS0lOR19BTkdMRSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHJlc2NhbGVQb2ludHMgfSBmcm9tIFwiLi4vcG9pbnRzXCI7XG5cbmltcG9ydCB7XG4gIHJvdGF0ZSxcbiAgYWRqdXN0WFlXaXRoUm90YXRpb24sXG4gIGNlbnRlclBvaW50LFxuICByb3RhdGVQb2ludCxcbn0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMsXG4gIGdldENvbW1vbkJvdW5kcyxcbiAgZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyxcbiAgZ2V0Q29tbW9uQm91bmRpbmdCb3gsXG59IGZyb20gXCIuL2JvdW5kc1wiO1xuaW1wb3J0IHtcbiAgaXNGcmVlRHJhd0VsZW1lbnQsXG4gIGlzTGluZWFyRWxlbWVudCxcbiAgaXNUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGdldFBlcmZlY3RFbGVtZW50U2l6ZSB9IGZyb20gXCIuL3NpemVIZWxwZXJzXCI7XG5pbXBvcnQgeyBnZXRGb250U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyB1cGRhdGVCb3VuZEVsZW1lbnRzIH0gZnJvbSBcIi4vYmluZGluZ1wiO1xuaW1wb3J0IHtcbiAgVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuICBUcmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24sXG59IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCB7IFBvaW50LCBQb2ludGVyRG93blN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQge1xuICBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0LFxuICBnZXRBcHByb3hNaW5MaW5lV2lkdGgsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnQsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgaGFuZGxlQmluZFRleHRSZXNpemUsXG4gIG1lYXN1cmVUZXh0LFxufSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplQW5nbGUgPSAoYW5nbGU6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIGlmIChhbmdsZSA+PSAyICogTWF0aC5QSSkge1xuICAgIHJldHVybiBhbmdsZSAtIDIgKiBNYXRoLlBJO1xuICB9XG4gIHJldHVybiBhbmdsZTtcbn07XG5cbi8vIFJldHVybnMgdHJ1ZSB3aGVuIHRyYW5zZm9ybSAocmVzaXppbmcvcm90YXRpb24pIGhhcHBlbmVkXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtRWxlbWVudHMgPSAoXG4gIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgc2VsZWN0ZWRFbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIHJlc2l6ZUFycm93RGlyZWN0aW9uOiBcIm9yaWdpblwiIHwgXCJlbmRcIixcbiAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGU6IGJvb2xlYW4sXG4gIHNob3VsZFJlc2l6ZUZyb21DZW50ZXI6IGJvb2xlYW4sXG4gIHNob3VsZE1haW50YWluQXNwZWN0UmF0aW86IGJvb2xlYW4sXG4gIHBvaW50ZXJYOiBudW1iZXIsXG4gIHBvaW50ZXJZOiBudW1iZXIsXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IFtlbGVtZW50XSA9IHNlbGVjdGVkRWxlbWVudHM7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwicm90YXRpb25cIikge1xuICAgICAgcm90YXRlU2luZ2xlRWxlbWVudChcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgcG9pbnRlclgsXG4gICAgICAgIHBvaW50ZXJZLFxuICAgICAgICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSxcbiAgICAgICk7XG4gICAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgJiZcbiAgICAgIGVsZW1lbnQucG9pbnRzLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibndcIiB8fFxuICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5lXCIgfHxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJzd1wiIHx8XG4gICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwic2VcIilcbiAgICApIHtcbiAgICAgIHJlc2hhcGVTaW5nbGVUd29Qb2ludEVsZW1lbnQoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHJlc2l6ZUFycm93RGlyZWN0aW9uLFxuICAgICAgICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSxcbiAgICAgICAgcG9pbnRlclgsXG4gICAgICAgIHBvaW50ZXJZLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJlxuICAgICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibndcIiB8fFxuICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5lXCIgfHxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJzd1wiIHx8XG4gICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwic2VcIilcbiAgICApIHtcbiAgICAgIHJlc2l6ZVNpbmdsZVRleHRFbGVtZW50KFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlLFxuICAgICAgICBzaG91bGRSZXNpemVGcm9tQ2VudGVyLFxuICAgICAgICBwb2ludGVyWCxcbiAgICAgICAgcG9pbnRlclksXG4gICAgICApO1xuICAgICAgdXBkYXRlQm91bmRFbGVtZW50cyhlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUpIHtcbiAgICAgIHJlc2l6ZVNpbmdsZUVsZW1lbnQoXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luYWxFbGVtZW50cyxcbiAgICAgICAgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcixcbiAgICAgICAgcG9pbnRlclgsXG4gICAgICAgIHBvaW50ZXJZLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICBpZiAodHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJyb3RhdGlvblwiKSB7XG4gICAgICByb3RhdGVNdWx0aXBsZUVsZW1lbnRzKFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLFxuICAgICAgICBwb2ludGVyWCxcbiAgICAgICAgcG9pbnRlclksXG4gICAgICAgIHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlLFxuICAgICAgICBjZW50ZXJYLFxuICAgICAgICBjZW50ZXJZLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm53XCIgfHxcbiAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibmVcIiB8fFxuICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJzd1wiIHx8XG4gICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcInNlXCJcbiAgICApIHtcbiAgICAgIHJlc2l6ZU11bHRpcGxlRWxlbWVudHMoXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUsXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUsXG4gICAgICAgIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIsXG4gICAgICAgIHBvaW50ZXJYLFxuICAgICAgICBwb2ludGVyWSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3Qgcm90YXRlU2luZ2xlRWxlbWVudCA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBwb2ludGVyWDogbnVtYmVyLFxuICBwb2ludGVyWTogbnVtYmVyLFxuICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZTogYm9vbGVhbixcbikgPT4ge1xuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcbiAgbGV0IGFuZ2xlID0gKDUgKiBNYXRoLlBJKSAvIDIgKyBNYXRoLmF0YW4yKHBvaW50ZXJZIC0gY3ksIHBvaW50ZXJYIC0gY3gpO1xuICBpZiAoc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUpIHtcbiAgICBhbmdsZSArPSBTSElGVF9MT0NLSU5HX0FOR0xFIC8gMjtcbiAgICBhbmdsZSAtPSBhbmdsZSAlIFNISUZUX0xPQ0tJTkdfQU5HTEU7XG4gIH1cbiAgYW5nbGUgPSBub3JtYWxpemVBbmdsZShhbmdsZSk7XG4gIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwgeyBhbmdsZSB9KTtcbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgY29uc3QgdGV4dEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KSEuZ2V0RWxlbWVudChib3VuZFRleHRFbGVtZW50SWQpO1xuICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQhLCB7IGFuZ2xlIH0pO1xuICB9XG59O1xuXG4vLyB1c2VkIGluIERFViBvbmx5XG5jb25zdCB2YWxpZGF0ZVR3b1BvaW50RWxlbWVudE5vcm1hbGl6ZWQgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuKSA9PiB7XG4gIGlmIChcbiAgICBlbGVtZW50LnBvaW50cy5sZW5ndGggIT09IDIgfHxcbiAgICBlbGVtZW50LnBvaW50c1swXVswXSAhPT0gMCB8fFxuICAgIGVsZW1lbnQucG9pbnRzWzBdWzFdICE9PSAwIHx8XG4gICAgTWF0aC5hYnMoZWxlbWVudC5wb2ludHNbMV1bMF0pICE9PSBlbGVtZW50LndpZHRoIHx8XG4gICAgTWF0aC5hYnMoZWxlbWVudC5wb2ludHNbMV1bMV0pICE9PSBlbGVtZW50LmhlaWdodFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUd28tcG9pbnQgZWxlbWVudCBpcyBub3Qgbm9ybWFsaXplZFwiKTtcbiAgfVxufTtcblxuY29uc3QgZ2V0UGVyZmVjdEVsZW1lbnRTaXplV2l0aFJvdGF0aW9uID0gKFxuICBlbGVtZW50VHlwZTogRXhjYWxpZHJhd0VsZW1lbnRbXCJ0eXBlXCJdLFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgYW5nbGU6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlcl0gPT4ge1xuICBjb25zdCBzaXplID0gZ2V0UGVyZmVjdEVsZW1lbnRTaXplKFxuICAgIGVsZW1lbnRUeXBlLFxuICAgIC4uLnJvdGF0ZSh3aWR0aCwgaGVpZ2h0LCAwLCAwLCBhbmdsZSksXG4gICk7XG4gIHJldHVybiByb3RhdGUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQsIDAsIDAsIC1hbmdsZSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVzaGFwZVNpbmdsZVR3b1BvaW50RWxlbWVudCA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gIHJlc2l6ZUFycm93RGlyZWN0aW9uOiBcIm9yaWdpblwiIHwgXCJlbmRcIixcbiAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGU6IGJvb2xlYW4sXG4gIHBvaW50ZXJYOiBudW1iZXIsXG4gIHBvaW50ZXJZOiBudW1iZXIsXG4pID0+IHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHZhbGlkYXRlVHdvUG9pbnRFbGVtZW50Tm9ybWFsaXplZChlbGVtZW50KTtcbiAgfVxuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcbiAgLy8gcm90YXRpb24gcG9pbnRlciB3aXRoIHJldmVyc2UgYW5nbGVcbiAgY29uc3QgW3JvdGF0ZWRYLCByb3RhdGVkWV0gPSByb3RhdGUoXG4gICAgcG9pbnRlclgsXG4gICAgcG9pbnRlclksXG4gICAgY3gsXG4gICAgY3ksXG4gICAgLWVsZW1lbnQuYW5nbGUsXG4gICk7XG4gIGxldCBbd2lkdGgsIGhlaWdodF0gPVxuICAgIHJlc2l6ZUFycm93RGlyZWN0aW9uID09PSBcImVuZFwiXG4gICAgICA/IFtyb3RhdGVkWCAtIGVsZW1lbnQueCwgcm90YXRlZFkgLSBlbGVtZW50LnldXG4gICAgICA6IFtcbiAgICAgICAgICBlbGVtZW50LnggKyBlbGVtZW50LnBvaW50c1sxXVswXSAtIHJvdGF0ZWRYLFxuICAgICAgICAgIGVsZW1lbnQueSArIGVsZW1lbnQucG9pbnRzWzFdWzFdIC0gcm90YXRlZFksXG4gICAgICAgIF07XG4gIGlmIChzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSkge1xuICAgIFt3aWR0aCwgaGVpZ2h0XSA9IGdldFBlcmZlY3RFbGVtZW50U2l6ZVdpdGhSb3RhdGlvbihcbiAgICAgIGVsZW1lbnQudHlwZSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgZWxlbWVudC5hbmdsZSxcbiAgICApO1xuICB9XG4gIGNvbnN0IFtuZXh0RWxlbWVudFgsIG5leHRFbGVtZW50WV0gPSBhZGp1c3RYWVdpdGhSb3RhdGlvbihcbiAgICByZXNpemVBcnJvd0RpcmVjdGlvbiA9PT0gXCJlbmRcIlxuICAgICAgPyB7IHM6IHRydWUsIGU6IHRydWUgfVxuICAgICAgOiB7IG46IHRydWUsIHc6IHRydWUgfSxcbiAgICBlbGVtZW50LngsXG4gICAgZWxlbWVudC55LFxuICAgIGVsZW1lbnQuYW5nbGUsXG4gICAgMCxcbiAgICAwLFxuICAgIChlbGVtZW50LnBvaW50c1sxXVswXSAtIHdpZHRoKSAvIDIsXG4gICAgKGVsZW1lbnQucG9pbnRzWzFdWzFdIC0gaGVpZ2h0KSAvIDIsXG4gICk7XG4gIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgIHg6IG5leHRFbGVtZW50WCxcbiAgICB5OiBuZXh0RWxlbWVudFksXG4gICAgcG9pbnRzOiBbXG4gICAgICBbMCwgMF0sXG4gICAgICBbd2lkdGgsIGhlaWdodF0sXG4gICAgXSxcbiAgfSk7XG59O1xuXG5jb25zdCByZXNjYWxlUG9pbnRzSW5FbGVtZW50ID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBub3JtYWxpemVQb2ludHM6IGJvb2xlYW4sXG4pID0+XG4gIGlzTGluZWFyRWxlbWVudChlbGVtZW50KSB8fCBpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KVxuICAgID8ge1xuICAgICAgICBwb2ludHM6IHJlc2NhbGVQb2ludHMoXG4gICAgICAgICAgMCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICByZXNjYWxlUG9pbnRzKDEsIGhlaWdodCwgZWxlbWVudC5wb2ludHMsIG5vcm1hbGl6ZVBvaW50cyksXG4gICAgICAgICAgbm9ybWFsaXplUG9pbnRzLFxuICAgICAgICApLFxuICAgICAgfVxuICAgIDoge307XG5cbmNvbnN0IE1JTl9GT05UX1NJWkUgPSAxO1xuXG5jb25zdCBtZWFzdXJlRm9udFNpemVGcm9tV0ggPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PixcbiAgbmV4dFdpZHRoOiBudW1iZXIsXG4gIG5leHRIZWlnaHQ6IG51bWJlcixcbik6IHsgc2l6ZTogbnVtYmVyOyBiYXNlbGluZTogbnVtYmVyIH0gfCBudWxsID0+IHtcbiAgLy8gV2Ugb25seSB1c2Ugd2lkdGggdG8gc2NhbGUgZm9udCBvbiByZXNpemVcbiAgY29uc3QgbmV4dEZvbnRTaXplID0gZWxlbWVudC5mb250U2l6ZSAqIChuZXh0V2lkdGggLyBlbGVtZW50LndpZHRoKTtcbiAgaWYgKG5leHRGb250U2l6ZSA8IE1JTl9GT05UX1NJWkUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQoXG4gICAgZWxlbWVudC50ZXh0LFxuICAgIGdldEZvbnRTdHJpbmcoeyBmb250U2l6ZTogbmV4dEZvbnRTaXplLCBmb250RmFtaWx5OiBlbGVtZW50LmZvbnRGYW1pbHkgfSksXG4gICAgZWxlbWVudC5jb250YWluZXJJZCA/IGVsZW1lbnQud2lkdGggOiBudWxsLFxuICApO1xuICByZXR1cm4ge1xuICAgIHNpemU6IG5leHRGb250U2l6ZSxcbiAgICBiYXNlbGluZTogbWV0cmljcy5iYXNlbGluZSArIChuZXh0SGVpZ2h0IC0gbWV0cmljcy5oZWlnaHQpLFxuICB9O1xufTtcblxuY29uc3QgZ2V0U2lkZXNGb3JUcmFuc2Zvcm1IYW5kbGUgPSAoXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IFRyYW5zZm9ybUhhbmRsZVR5cGUsXG4gIHNob3VsZFJlc2l6ZUZyb21DZW50ZXI6IGJvb2xlYW4sXG4pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBuOlxuICAgICAgL14obnxuZXxudykkLy50ZXN0KHRyYW5zZm9ybUhhbmRsZVR5cGUpIHx8XG4gICAgICAoc2hvdWxkUmVzaXplRnJvbUNlbnRlciAmJiAvXihzfHNlfHN3KSQvLnRlc3QodHJhbnNmb3JtSGFuZGxlVHlwZSkpLFxuICAgIHM6XG4gICAgICAvXihzfHNlfHN3KSQvLnRlc3QodHJhbnNmb3JtSGFuZGxlVHlwZSkgfHxcbiAgICAgIChzaG91bGRSZXNpemVGcm9tQ2VudGVyICYmIC9eKG58bmV8bncpJC8udGVzdCh0cmFuc2Zvcm1IYW5kbGVUeXBlKSksXG4gICAgdzpcbiAgICAgIC9eKHd8bnd8c3cpJC8udGVzdCh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB8fFxuICAgICAgKHNob3VsZFJlc2l6ZUZyb21DZW50ZXIgJiYgL14oZXxuZXxzZSkkLy50ZXN0KHRyYW5zZm9ybUhhbmRsZVR5cGUpKSxcbiAgICBlOlxuICAgICAgL14oZXxuZXxzZSkkLy50ZXN0KHRyYW5zZm9ybUhhbmRsZVR5cGUpIHx8XG4gICAgICAoc2hvdWxkUmVzaXplRnJvbUNlbnRlciAmJiAvXih3fG53fHN3KSQvLnRlc3QodHJhbnNmb3JtSGFuZGxlVHlwZSkpLFxuICB9O1xufTtcblxuY29uc3QgcmVzaXplU2luZ2xlVGV4dEVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PixcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogXCJud1wiIHwgXCJuZVwiIHwgXCJzd1wiIHwgXCJzZVwiLFxuICBzaG91bGRSZXNpemVGcm9tQ2VudGVyOiBib29sZWFuLFxuICBwb2ludGVyWDogbnVtYmVyLFxuICBwb2ludGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMjtcbiAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyO1xuICAvLyByb3RhdGlvbiBwb2ludGVyIHdpdGggcmV2ZXJzZSBhbmdsZVxuICBjb25zdCBbcm90YXRlZFgsIHJvdGF0ZWRZXSA9IHJvdGF0ZShcbiAgICBwb2ludGVyWCxcbiAgICBwb2ludGVyWSxcbiAgICBjeCxcbiAgICBjeSxcbiAgICAtZWxlbWVudC5hbmdsZSxcbiAgKTtcbiAgbGV0IHNjYWxlOiBudW1iZXI7XG4gIHN3aXRjaCAodHJhbnNmb3JtSGFuZGxlVHlwZSkge1xuICAgIGNhc2UgXCJzZVwiOlxuICAgICAgc2NhbGUgPSBNYXRoLm1heChcbiAgICAgICAgKHJvdGF0ZWRYIC0geDEpIC8gKHgyIC0geDEpLFxuICAgICAgICAocm90YXRlZFkgLSB5MSkgLyAoeTIgLSB5MSksXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm53XCI6XG4gICAgICBzY2FsZSA9IE1hdGgubWF4KFxuICAgICAgICAoeDIgLSByb3RhdGVkWCkgLyAoeDIgLSB4MSksXG4gICAgICAgICh5MiAtIHJvdGF0ZWRZKSAvICh5MiAtIHkxKSxcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwibmVcIjpcbiAgICAgIHNjYWxlID0gTWF0aC5tYXgoXG4gICAgICAgIChyb3RhdGVkWCAtIHgxKSAvICh4MiAtIHgxKSxcbiAgICAgICAgKHkyIC0gcm90YXRlZFkpIC8gKHkyIC0geTEpLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJzd1wiOlxuICAgICAgc2NhbGUgPSBNYXRoLm1heChcbiAgICAgICAgKHgyIC0gcm90YXRlZFgpIC8gKHgyIC0geDEpLFxuICAgICAgICAocm90YXRlZFkgLSB5MSkgLyAoeTIgLSB5MSksXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgaWYgKHNjYWxlID4gMCkge1xuICAgIGNvbnN0IG5leHRXaWR0aCA9IGVsZW1lbnQud2lkdGggKiBzY2FsZTtcbiAgICBjb25zdCBuZXh0SGVpZ2h0ID0gZWxlbWVudC5oZWlnaHQgKiBzY2FsZTtcbiAgICBjb25zdCBuZXh0Rm9udCA9IG1lYXN1cmVGb250U2l6ZUZyb21XSChlbGVtZW50LCBuZXh0V2lkdGgsIG5leHRIZWlnaHQpO1xuICAgIGlmIChuZXh0Rm9udCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbbmV4dFgxLCBuZXh0WTEsIG5leHRYMiwgbmV4dFkyXSA9IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMoXG4gICAgICBlbGVtZW50LFxuICAgICAgbmV4dFdpZHRoLFxuICAgICAgbmV4dEhlaWdodCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgY29uc3QgZGVsdGFYMSA9ICh4MSAtIG5leHRYMSkgLyAyO1xuICAgIGNvbnN0IGRlbHRhWTEgPSAoeTEgLSBuZXh0WTEpIC8gMjtcbiAgICBjb25zdCBkZWx0YVgyID0gKHgyIC0gbmV4dFgyKSAvIDI7XG4gICAgY29uc3QgZGVsdGFZMiA9ICh5MiAtIG5leHRZMikgLyAyO1xuICAgIGNvbnN0IFtuZXh0RWxlbWVudFgsIG5leHRFbGVtZW50WV0gPSBhZGp1c3RYWVdpdGhSb3RhdGlvbihcbiAgICAgIGdldFNpZGVzRm9yVHJhbnNmb3JtSGFuZGxlKHRyYW5zZm9ybUhhbmRsZVR5cGUsIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIpLFxuICAgICAgZWxlbWVudC54LFxuICAgICAgZWxlbWVudC55LFxuICAgICAgZWxlbWVudC5hbmdsZSxcbiAgICAgIGRlbHRhWDEsXG4gICAgICBkZWx0YVkxLFxuICAgICAgZGVsdGFYMixcbiAgICAgIGRlbHRhWTIsXG4gICAgKTtcbiAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgIGZvbnRTaXplOiBuZXh0Rm9udC5zaXplLFxuICAgICAgd2lkdGg6IG5leHRXaWR0aCxcbiAgICAgIGhlaWdodDogbmV4dEhlaWdodCxcbiAgICAgIGJhc2VsaW5lOiBuZXh0Rm9udC5iYXNlbGluZSxcbiAgICAgIHg6IG5leHRFbGVtZW50WCxcbiAgICAgIHk6IG5leHRFbGVtZW50WSxcbiAgICB9KTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc2l6ZVNpbmdsZUVsZW1lbnQgPSAoXG4gIG9yaWdpbmFsRWxlbWVudHM6IFBvaW50ZXJEb3duU3RhdGVbXCJvcmlnaW5hbEVsZW1lbnRzXCJdLFxuICBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvOiBib29sZWFuLFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbjogVHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLFxuICBzaG91bGRSZXNpemVGcm9tQ2VudGVyOiBib29sZWFuLFxuICBwb2ludGVyWDogbnVtYmVyLFxuICBwb2ludGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IHN0YXRlQXRSZXNpemVTdGFydCA9IG9yaWdpbmFsRWxlbWVudHMuZ2V0KGVsZW1lbnQuaWQpITtcbiAgLy8gR2V0cyBib3VuZHMgY29ybmVyc1xuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhcbiAgICBzdGF0ZUF0UmVzaXplU3RhcnQsXG4gICAgc3RhdGVBdFJlc2l6ZVN0YXJ0LndpZHRoLFxuICAgIHN0YXRlQXRSZXNpemVTdGFydC5oZWlnaHQsXG4gICAgdHJ1ZSxcbiAgKTtcbiAgY29uc3Qgc3RhcnRUb3BMZWZ0OiBQb2ludCA9IFt4MSwgeTFdO1xuICBjb25zdCBzdGFydEJvdHRvbVJpZ2h0OiBQb2ludCA9IFt4MiwgeTJdO1xuICBjb25zdCBzdGFydENlbnRlcjogUG9pbnQgPSBjZW50ZXJQb2ludChzdGFydFRvcExlZnQsIHN0YXJ0Qm90dG9tUmlnaHQpO1xuXG4gIC8vIENhbGN1bGF0ZSBuZXcgZGltZW5zaW9ucyBiYXNlZCBvbiBjdXJzb3IgcG9zaXRpb25cbiAgY29uc3Qgcm90YXRlZFBvaW50ZXIgPSByb3RhdGVQb2ludChcbiAgICBbcG9pbnRlclgsIHBvaW50ZXJZXSxcbiAgICBzdGFydENlbnRlcixcbiAgICAtc3RhdGVBdFJlc2l6ZVN0YXJ0LmFuZ2xlLFxuICApO1xuXG4gIC8vIEdldCBib3VuZHMgY29ybmVycyByZW5kZXJlZCBvbiBzY3JlZW5cbiAgY29uc3QgW2VzeDEsIGVzeTEsIGVzeDIsIGVzeTJdID0gZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhcbiAgICBlbGVtZW50LFxuICAgIGVsZW1lbnQud2lkdGgsXG4gICAgZWxlbWVudC5oZWlnaHQsXG4gICAgdHJ1ZSxcbiAgKTtcblxuICBjb25zdCBib3VuZHNDdXJyZW50V2lkdGggPSBlc3gyIC0gZXN4MTtcbiAgY29uc3QgYm91bmRzQ3VycmVudEhlaWdodCA9IGVzeTIgLSBlc3kxO1xuXG4gIC8vIEl0J3MgaW1wb3J0YW50IHdlIHNldCB0aGUgaW5pdGlhbCBzY2FsZSB2YWx1ZSBiYXNlZCBvbiB0aGUgd2lkdGggYW5kIGhlaWdodCBhdCByZXNpemUgc3RhcnQsXG4gIC8vIG90aGVyd2lzZSBwcmV2aW91cyBkaW1lbnNpb25zIGFmZmVjdGVkIGJ5IG1vZGlmaWVycyB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudC5cbiAgY29uc3QgYXRTdGFydEJvdW5kc1dpZHRoID0gc3RhcnRCb3R0b21SaWdodFswXSAtIHN0YXJ0VG9wTGVmdFswXTtcbiAgY29uc3QgYXRTdGFydEJvdW5kc0hlaWdodCA9IHN0YXJ0Qm90dG9tUmlnaHRbMV0gLSBzdGFydFRvcExlZnRbMV07XG4gIGxldCBzY2FsZVggPSBhdFN0YXJ0Qm91bmRzV2lkdGggLyBib3VuZHNDdXJyZW50V2lkdGg7XG4gIGxldCBzY2FsZVkgPSBhdFN0YXJ0Qm91bmRzSGVpZ2h0IC8gYm91bmRzQ3VycmVudEhlaWdodDtcblxuICBsZXQgYm91bmRUZXh0Rm9udDogeyBmb250U2l6ZT86IG51bWJlcjsgYmFzZWxpbmU/OiBudW1iZXIgfSA9IHt9O1xuICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcblxuICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmluY2x1ZGVzKFwiZVwiKSkge1xuICAgIHNjYWxlWCA9IChyb3RhdGVkUG9pbnRlclswXSAtIHN0YXJ0VG9wTGVmdFswXSkgLyBib3VuZHNDdXJyZW50V2lkdGg7XG4gIH1cbiAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbi5pbmNsdWRlcyhcInNcIikpIHtcbiAgICBzY2FsZVkgPSAocm90YXRlZFBvaW50ZXJbMV0gLSBzdGFydFRvcExlZnRbMV0pIC8gYm91bmRzQ3VycmVudEhlaWdodDtcbiAgfVxuICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmluY2x1ZGVzKFwid1wiKSkge1xuICAgIHNjYWxlWCA9IChzdGFydEJvdHRvbVJpZ2h0WzBdIC0gcm90YXRlZFBvaW50ZXJbMF0pIC8gYm91bmRzQ3VycmVudFdpZHRoO1xuICB9XG4gIGlmICh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24uaW5jbHVkZXMoXCJuXCIpKSB7XG4gICAgc2NhbGVZID0gKHN0YXJ0Qm90dG9tUmlnaHRbMV0gLSByb3RhdGVkUG9pbnRlclsxXSkgLyBib3VuZHNDdXJyZW50SGVpZ2h0O1xuICB9XG5cbiAgLy8gTGluZWFyIGVsZW1lbnRzIGRpbWVuc2lvbnMgZGlmZmVyIGZyb20gYm91bmRzIGRpbWVuc2lvbnNcbiAgY29uc3QgZWxlSW5pdGlhbFdpZHRoID0gc3RhdGVBdFJlc2l6ZVN0YXJ0LndpZHRoO1xuICBjb25zdCBlbGVJbml0aWFsSGVpZ2h0ID0gc3RhdGVBdFJlc2l6ZVN0YXJ0LmhlaWdodDtcbiAgLy8gV2UgaGF2ZSB0byB1c2UgZGltZW5zaW9ucyBvZiBlbGVtZW50IG9uIHNjcmVlbiwgb3RoZXJ3aXNlIHRoZSBzY2FsaW5nIG9mIHRoZVxuICAvLyBkaW1lbnNpb25zIHdvbid0IG1hdGNoIHRoZSBjdXJzb3IgZm9yIGxpbmVhciBlbGVtZW50cy5cbiAgbGV0IGVsZU5ld1dpZHRoID0gZWxlbWVudC53aWR0aCAqIHNjYWxlWDtcbiAgbGV0IGVsZU5ld0hlaWdodCA9IGVsZW1lbnQuaGVpZ2h0ICogc2NhbGVZO1xuXG4gIC8vIGFkanVzdCBkaW1lbnNpb25zIGZvciByZXNpemluZyBmcm9tIGNlbnRlclxuICBpZiAoc2hvdWxkUmVzaXplRnJvbUNlbnRlcikge1xuICAgIGVsZU5ld1dpZHRoID0gMiAqIGVsZU5ld1dpZHRoIC0gZWxlSW5pdGlhbFdpZHRoO1xuICAgIGVsZU5ld0hlaWdodCA9IDIgKiBlbGVOZXdIZWlnaHQgLSBlbGVJbml0aWFsSGVpZ2h0O1xuICB9XG5cbiAgLy8gYWRqdXN0IGRpbWVuc2lvbnMgdG8ga2VlcCBzaWRlcyByYXRpb1xuICBpZiAoc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbykge1xuICAgIGNvbnN0IHdpZHRoUmF0aW8gPSBNYXRoLmFicyhlbGVOZXdXaWR0aCkgLyBlbGVJbml0aWFsV2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0UmF0aW8gPSBNYXRoLmFicyhlbGVOZXdIZWlnaHQpIC8gZWxlSW5pdGlhbEhlaWdodDtcbiAgICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZWxlTmV3SGVpZ2h0ICo9IHdpZHRoUmF0aW87XG4gICAgICBlbGVOZXdXaWR0aCAqPSBoZWlnaHRSYXRpbztcbiAgICB9XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHJhdGlvID0gTWF0aC5tYXgod2lkdGhSYXRpbywgaGVpZ2h0UmF0aW8pO1xuICAgICAgZWxlTmV3V2lkdGggPSBlbGVJbml0aWFsV2lkdGggKiByYXRpbyAqIE1hdGguc2lnbihlbGVOZXdXaWR0aCk7XG4gICAgICBlbGVOZXdIZWlnaHQgPSBlbGVJbml0aWFsSGVpZ2h0ICogcmF0aW8gKiBNYXRoLnNpZ24oZWxlTmV3SGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICBpZiAoYm91bmRUZXh0RWxlbWVudCkge1xuICAgIGNvbnN0IHN0YXRlT2ZCb3VuZFRleHRFbGVtZW50QXRSZXNpemUgPSBvcmlnaW5hbEVsZW1lbnRzLmdldChcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnQuaWQsXG4gICAgKSBhcyB0eXBlb2YgYm91bmRUZXh0RWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoc3RhdGVPZkJvdW5kVGV4dEVsZW1lbnRBdFJlc2l6ZSkge1xuICAgICAgYm91bmRUZXh0Rm9udCA9IHtcbiAgICAgICAgZm9udFNpemU6IHN0YXRlT2ZCb3VuZFRleHRFbGVtZW50QXRSZXNpemUuZm9udFNpemUsXG4gICAgICAgIGJhc2VsaW5lOiBzdGF0ZU9mQm91bmRUZXh0RWxlbWVudEF0UmVzaXplLmJhc2VsaW5lLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8pIHtcbiAgICAgIGNvbnN0IG5leHRGb250ID0gbWVhc3VyZUZvbnRTaXplRnJvbVdIKFxuICAgICAgICBib3VuZFRleHRFbGVtZW50LFxuICAgICAgICBlbGVOZXdXaWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDIsXG4gICAgICAgIGVsZU5ld0hlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDIsXG4gICAgICApO1xuICAgICAgaWYgKG5leHRGb250ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJvdW5kVGV4dEZvbnQgPSB7XG4gICAgICAgIGZvbnRTaXplOiBuZXh0Rm9udC5zaXplLFxuICAgICAgICBiYXNlbGluZTogbmV4dEZvbnQuYmFzZWxpbmUsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtaW5XaWR0aCA9IGdldEFwcHJveE1pbkxpbmVXaWR0aChnZXRGb250U3RyaW5nKGJvdW5kVGV4dEVsZW1lbnQpKTtcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IGdldEFwcHJveE1pbkxpbmVIZWlnaHQoZ2V0Rm9udFN0cmluZyhib3VuZFRleHRFbGVtZW50KSk7XG4gICAgICBlbGVOZXdXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChlbGVOZXdXaWR0aCwgbWluV2lkdGgpKTtcbiAgICAgIGVsZU5ld0hlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChlbGVOZXdIZWlnaHQsIG1pbkhlaWdodCkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFtuZXdCb3VuZHNYMSwgbmV3Qm91bmRzWTEsIG5ld0JvdW5kc1gyLCBuZXdCb3VuZHNZMl0gPVxuICAgIGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMoXG4gICAgICBzdGF0ZUF0UmVzaXplU3RhcnQsXG4gICAgICBlbGVOZXdXaWR0aCxcbiAgICAgIGVsZU5ld0hlaWdodCxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgY29uc3QgbmV3Qm91bmRzV2lkdGggPSBuZXdCb3VuZHNYMiAtIG5ld0JvdW5kc1gxO1xuICBjb25zdCBuZXdCb3VuZHNIZWlnaHQgPSBuZXdCb3VuZHNZMiAtIG5ld0JvdW5kc1kxO1xuXG4gIC8vIENhbGN1bGF0ZSBuZXcgdG9wTGVmdCBiYXNlZCBvbiBmaXhlZCBjb3JuZXIgZHVyaW5nIHJlc2l6ZVxuICBsZXQgbmV3VG9wTGVmdCA9IFsuLi5zdGFydFRvcExlZnRdIGFzIFtudW1iZXIsIG51bWJlcl07XG4gIGlmIChbXCJuXCIsIFwid1wiLCBcIm53XCJdLmluY2x1ZGVzKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbikpIHtcbiAgICBuZXdUb3BMZWZ0ID0gW1xuICAgICAgc3RhcnRCb3R0b21SaWdodFswXSAtIE1hdGguYWJzKG5ld0JvdW5kc1dpZHRoKSxcbiAgICAgIHN0YXJ0Qm90dG9tUmlnaHRbMV0gLSBNYXRoLmFicyhuZXdCb3VuZHNIZWlnaHQpLFxuICAgIF07XG4gIH1cbiAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbiA9PT0gXCJuZVwiKSB7XG4gICAgY29uc3QgYm90dG9tTGVmdCA9IFtzdGFydFRvcExlZnRbMF0sIHN0YXJ0Qm90dG9tUmlnaHRbMV1dO1xuICAgIG5ld1RvcExlZnQgPSBbYm90dG9tTGVmdFswXSwgYm90dG9tTGVmdFsxXSAtIE1hdGguYWJzKG5ld0JvdW5kc0hlaWdodCldO1xuICB9XG4gIGlmICh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24gPT09IFwic3dcIikge1xuICAgIGNvbnN0IHRvcFJpZ2h0ID0gW3N0YXJ0Qm90dG9tUmlnaHRbMF0sIHN0YXJ0VG9wTGVmdFsxXV07XG4gICAgbmV3VG9wTGVmdCA9IFt0b3BSaWdodFswXSAtIE1hdGguYWJzKG5ld0JvdW5kc1dpZHRoKSwgdG9wUmlnaHRbMV1dO1xuICB9XG5cbiAgLy8gS2VlcHMgb3Bwb3NpdGUgaGFuZGxlIGZpeGVkIGR1cmluZyByZXNpemVcbiAgaWYgKHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8pIHtcbiAgICBpZiAoW1wic1wiLCBcIm5cIl0uaW5jbHVkZXModHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uKSkge1xuICAgICAgbmV3VG9wTGVmdFswXSA9IHN0YXJ0Q2VudGVyWzBdIC0gbmV3Qm91bmRzV2lkdGggLyAyO1xuICAgIH1cbiAgICBpZiAoW1wiZVwiLCBcIndcIl0uaW5jbHVkZXModHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uKSkge1xuICAgICAgbmV3VG9wTGVmdFsxXSA9IHN0YXJ0Q2VudGVyWzFdIC0gbmV3Qm91bmRzSGVpZ2h0IC8gMjtcbiAgICB9XG4gIH1cblxuICAvLyBGbGlwIGhvcml6b250YWxseVxuICBpZiAoZWxlTmV3V2lkdGggPCAwKSB7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbi5pbmNsdWRlcyhcImVcIikpIHtcbiAgICAgIG5ld1RvcExlZnRbMF0gLT0gTWF0aC5hYnMobmV3Qm91bmRzV2lkdGgpO1xuICAgIH1cbiAgICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmluY2x1ZGVzKFwid1wiKSkge1xuICAgICAgbmV3VG9wTGVmdFswXSArPSBNYXRoLmFicyhuZXdCb3VuZHNXaWR0aCk7XG4gICAgfVxuICB9XG4gIC8vIEZsaXAgdmVydGljYWxseVxuICBpZiAoZWxlTmV3SGVpZ2h0IDwgMCkge1xuICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24uaW5jbHVkZXMoXCJzXCIpKSB7XG4gICAgICBuZXdUb3BMZWZ0WzFdIC09IE1hdGguYWJzKG5ld0JvdW5kc0hlaWdodCk7XG4gICAgfVxuICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24uaW5jbHVkZXMoXCJuXCIpKSB7XG4gICAgICBuZXdUb3BMZWZ0WzFdICs9IE1hdGguYWJzKG5ld0JvdW5kc0hlaWdodCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNob3VsZFJlc2l6ZUZyb21DZW50ZXIpIHtcbiAgICBuZXdUb3BMZWZ0WzBdID0gc3RhcnRDZW50ZXJbMF0gLSBNYXRoLmFicyhuZXdCb3VuZHNXaWR0aCkgLyAyO1xuICAgIG5ld1RvcExlZnRbMV0gPSBzdGFydENlbnRlclsxXSAtIE1hdGguYWJzKG5ld0JvdW5kc0hlaWdodCkgLyAyO1xuICB9XG5cbiAgLy8gYWRqdXN0IHRvcExlZnQgdG8gbmV3IHJvdGF0aW9uIHBvaW50XG4gIGNvbnN0IGFuZ2xlID0gc3RhdGVBdFJlc2l6ZVN0YXJ0LmFuZ2xlO1xuICBjb25zdCByb3RhdGVkVG9wTGVmdCA9IHJvdGF0ZVBvaW50KG5ld1RvcExlZnQsIHN0YXJ0Q2VudGVyLCBhbmdsZSk7XG4gIGNvbnN0IG5ld0NlbnRlcjogUG9pbnQgPSBbXG4gICAgbmV3VG9wTGVmdFswXSArIE1hdGguYWJzKG5ld0JvdW5kc1dpZHRoKSAvIDIsXG4gICAgbmV3VG9wTGVmdFsxXSArIE1hdGguYWJzKG5ld0JvdW5kc0hlaWdodCkgLyAyLFxuICBdO1xuICBjb25zdCByb3RhdGVkTmV3Q2VudGVyID0gcm90YXRlUG9pbnQobmV3Q2VudGVyLCBzdGFydENlbnRlciwgYW5nbGUpO1xuICBuZXdUb3BMZWZ0ID0gcm90YXRlUG9pbnQocm90YXRlZFRvcExlZnQsIHJvdGF0ZWROZXdDZW50ZXIsIC1hbmdsZSk7XG5cbiAgLy8gUmVhZGp1c3QgcG9pbnRzIGZvciBsaW5lYXIgZWxlbWVudHNcbiAgY29uc3QgcmVzY2FsZWRQb2ludHMgPSByZXNjYWxlUG9pbnRzSW5FbGVtZW50KFxuICAgIHN0YXRlQXRSZXNpemVTdGFydCxcbiAgICBlbGVOZXdXaWR0aCxcbiAgICBlbGVOZXdIZWlnaHQsXG4gICAgdHJ1ZSxcbiAgKTtcbiAgLy8gRm9yIGxpbmVhciBlbGVtZW50cyAoeCx5KSBhcmUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBmaXJzdCBkcmF3biBwb2ludCBub3QgdGhlIHRvcC1sZWZ0IGNvcm5lclxuICAvLyBTbyB3ZSBuZWVkIHRvIHJlYWRqdXN0ICh4LHkpIHRvIGJlIHdoZXJlIHRoZSBmaXJzdCBwb2ludCBzaG91bGQgYmVcbiAgY29uc3QgbmV3T3JpZ2luID0gWy4uLm5ld1RvcExlZnRdO1xuICBuZXdPcmlnaW5bMF0gKz0gc3RhdGVBdFJlc2l6ZVN0YXJ0LnggLSBuZXdCb3VuZHNYMTtcbiAgbmV3T3JpZ2luWzFdICs9IHN0YXRlQXRSZXNpemVTdGFydC55IC0gbmV3Qm91bmRzWTE7XG5cbiAgY29uc3QgcmVzaXplZEVsZW1lbnQgPSB7XG4gICAgd2lkdGg6IE1hdGguYWJzKGVsZU5ld1dpZHRoKSxcbiAgICBoZWlnaHQ6IE1hdGguYWJzKGVsZU5ld0hlaWdodCksXG4gICAgeDogbmV3T3JpZ2luWzBdLFxuICAgIHk6IG5ld09yaWdpblsxXSxcbiAgICAuLi5yZXNjYWxlZFBvaW50cyxcbiAgfTtcblxuICBpZiAoXCJzY2FsZVwiIGluIGVsZW1lbnQgJiYgXCJzY2FsZVwiIGluIHN0YXRlQXRSZXNpemVTdGFydCkge1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgc2NhbGU6IFtcbiAgICAgICAgLy8gZGVmYXVsdGluZyBiZWNhdXNlIHNjYWxlWC9ZIGNhbiBiZSAwLy0wXG4gICAgICAgIChNYXRoLnNpZ24oc2NhbGVYKSB8fCBzdGF0ZUF0UmVzaXplU3RhcnQuc2NhbGVbMF0pICpcbiAgICAgICAgICBzdGF0ZUF0UmVzaXplU3RhcnQuc2NhbGVbMF0sXG4gICAgICAgIChNYXRoLnNpZ24oc2NhbGVZKSB8fCBzdGF0ZUF0UmVzaXplU3RhcnQuc2NhbGVbMV0pICpcbiAgICAgICAgICBzdGF0ZUF0UmVzaXplU3RhcnQuc2NhbGVbMV0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKFxuICAgIHJlc2l6ZWRFbGVtZW50LndpZHRoICE9PSAwICYmXG4gICAgcmVzaXplZEVsZW1lbnQuaGVpZ2h0ICE9PSAwICYmXG4gICAgTnVtYmVyLmlzRmluaXRlKHJlc2l6ZWRFbGVtZW50LngpICYmXG4gICAgTnVtYmVyLmlzRmluaXRlKHJlc2l6ZWRFbGVtZW50LnkpXG4gICkge1xuICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCwge1xuICAgICAgbmV3U2l6ZTogeyB3aWR0aDogcmVzaXplZEVsZW1lbnQud2lkdGgsIGhlaWdodDogcmVzaXplZEVsZW1lbnQuaGVpZ2h0IH0sXG4gICAgfSk7XG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCByZXNpemVkRWxlbWVudCk7XG4gICAgaWYgKGJvdW5kVGV4dEVsZW1lbnQgJiYgYm91bmRUZXh0Rm9udCkge1xuICAgICAgbXV0YXRlRWxlbWVudChib3VuZFRleHRFbGVtZW50LCB7IGZvbnRTaXplOiBib3VuZFRleHRGb250LmZvbnRTaXplIH0pO1xuICAgIH1cbiAgICBoYW5kbGVCaW5kVGV4dFJlc2l6ZShlbGVtZW50LCB0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24pO1xuICB9XG59O1xuXG5jb25zdCByZXNpemVNdWx0aXBsZUVsZW1lbnRzID0gKFxuICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICBzZWxlY3RlZEVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogXCJud1wiIHwgXCJuZVwiIHwgXCJzd1wiIHwgXCJzZVwiLFxuICBzaG91bGRSZXNpemVGcm9tQ2VudGVyOiBib29sZWFuLFxuICBwb2ludGVyWDogbnVtYmVyLFxuICBwb2ludGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIC8vIG1hcCBzZWxlY3RlZCBlbGVtZW50cyB0byB0aGUgb3JpZ2luYWwgZWxlbWVudHMuIFdoaWxlIGl0IG5ldmVyIHNob3VsZFxuICAvLyBoYXBwZW4gdGhhdCBwb2ludGVyRG93blN0YXRlLm9yaWdpbmFsRWxlbWVudHMgd29uJ3QgY29udGFpbiB0aGUgc2VsZWN0ZWRcbiAgLy8gZWxlbWVudHMgZHVyaW5nIHJlc2l6ZSwgdGhpcyBjb3VwbGluZyBpc24ndCBndWFyYW50ZWVkLCBzbyB0byBlbnN1cmVcbiAgLy8gdHlwZSBzYWZldHkgd2UgbmVlZCB0byB0cmFuc2Zvcm0gb25seSB0aG9zZSBlbGVtZW50cyB3ZSBmaWx0ZXIuXG4gIGNvbnN0IHRhcmdldEVsZW1lbnRzID0gc2VsZWN0ZWRFbGVtZW50cy5yZWR1Y2UoXG4gICAgKFxuICAgICAgYWNjOiB7XG4gICAgICAgIC8qKiBlbGVtZW50IGF0IHJlc2l6ZSBzdGFydCAqL1xuICAgICAgICBvcmlnOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQ7XG4gICAgICAgIC8qKiBsYXRlc3QgZWxlbWVudCAqL1xuICAgICAgICBsYXRlc3Q6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudDtcbiAgICAgIH1bXSxcbiAgICAgIGVsZW1lbnQsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcmlnRWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luYWxFbGVtZW50cy5nZXQoZWxlbWVudC5pZCk7XG4gICAgICBpZiAob3JpZ0VsZW1lbnQpIHtcbiAgICAgICAgYWNjLnB1c2goeyBvcmlnOiBvcmlnRWxlbWVudCwgbGF0ZXN0OiBlbGVtZW50IH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIGNvbnN0IHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgbWlkWCwgbWlkWSB9ID0gZ2V0Q29tbW9uQm91bmRpbmdCb3goXG4gICAgdGFyZ2V0RWxlbWVudHMubWFwKCh7IG9yaWcgfSkgPT4gb3JpZyksXG4gICk7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IHRyYW5zZm9ybUhhbmRsZVR5cGU7XG5cbiAgY29uc3QgbWFwRGlyZWN0aW9uc1RvQW5jaG9yczogUmVjb3JkPHR5cGVvZiBkaXJlY3Rpb24sIFBvaW50PiA9IHtcbiAgICBuZTogW21pblgsIG1heFldLFxuICAgIHNlOiBbbWluWCwgbWluWV0sXG4gICAgc3c6IFttYXhYLCBtaW5ZXSxcbiAgICBudzogW21heFgsIG1heFldLFxuICB9O1xuXG4gIC8vIGFuY2hvciBwb2ludCBtdXN0IGJlIG9uIHRoZSBvcHBvc2l0ZSBzaWRlIG9mIHRoZSBkcmFnZ2VkIHNlbGVjdGlvbiBoYW5kbGVcbiAgLy8gb3IgYmUgdGhlIGNlbnRlciBvZiB0aGUgc2VsZWN0aW9uIGlmIGFsdCBpcyBwcmVzc2VkXG4gIGNvbnN0IFthbmNob3JYLCBhbmNob3JZXTogUG9pbnQgPSBzaG91bGRSZXNpemVGcm9tQ2VudGVyXG4gICAgPyBbbWlkWCwgbWlkWV1cbiAgICA6IG1hcERpcmVjdGlvbnNUb0FuY2hvcnNbZGlyZWN0aW9uXTtcblxuICBjb25zdCBtYXBEaXJlY3Rpb25zVG9Qb2ludGVyU2lkZXM6IFJlY29yZDxcbiAgICB0eXBlb2YgZGlyZWN0aW9uLFxuICAgIFt4OiBib29sZWFuLCB5OiBib29sZWFuXVxuICA+ID0ge1xuICAgIG5lOiBbcG9pbnRlclggPj0gYW5jaG9yWCwgcG9pbnRlclkgPD0gYW5jaG9yWV0sXG4gICAgc2U6IFtwb2ludGVyWCA+PSBhbmNob3JYLCBwb2ludGVyWSA+PSBhbmNob3JZXSxcbiAgICBzdzogW3BvaW50ZXJYIDw9IGFuY2hvclgsIHBvaW50ZXJZID49IGFuY2hvclldLFxuICAgIG53OiBbcG9pbnRlclggPD0gYW5jaG9yWCwgcG9pbnRlclkgPD0gYW5jaG9yWV0sXG4gIH07XG5cbiAgLy8gcG9pbnRlciBzaWRlIHJlbGF0aXZlIHRvIGFuY2hvclxuICBjb25zdCBbcG9pbnRlclNpZGVYLCBwb2ludGVyU2lkZVldID0gbWFwRGlyZWN0aW9uc1RvUG9pbnRlclNpZGVzW1xuICAgIGRpcmVjdGlvblxuICBdLm1hcCgoY29uZGl0aW9uKSA9PiAoY29uZGl0aW9uID8gMSA6IC0xKSk7XG5cbiAgLy8gc3RvcCByZXNpemluZyBpZiBhIHBvaW50ZXIgaXMgb24gdGhlIG90aGVyIHNpZGUgb2Ygc2VsZWN0aW9uXG4gIGlmIChwb2ludGVyU2lkZVggPCAwICYmIHBvaW50ZXJTaWRlWSA8IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzY2FsZSA9XG4gICAgTWF0aC5tYXgoXG4gICAgICAocG9pbnRlclNpZGVYICogTWF0aC5hYnMocG9pbnRlclggLSBhbmNob3JYKSkgLyAobWF4WCAtIG1pblgpLFxuICAgICAgKHBvaW50ZXJTaWRlWSAqIE1hdGguYWJzKHBvaW50ZXJZIC0gYW5jaG9yWSkpIC8gKG1heFkgLSBtaW5ZKSxcbiAgICApICogKHNob3VsZFJlc2l6ZUZyb21DZW50ZXIgPyAyIDogMSk7XG5cbiAgaWYgKHNjYWxlID09PSAxKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGFyZ2V0RWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHdpZHRoID0gZWxlbWVudC5vcmlnLndpZHRoICogc2NhbGU7XG4gICAgY29uc3QgaGVpZ2h0ID0gZWxlbWVudC5vcmlnLmhlaWdodCAqIHNjYWxlO1xuICAgIGNvbnN0IHggPSBhbmNob3JYICsgKGVsZW1lbnQub3JpZy54IC0gYW5jaG9yWCkgKiBzY2FsZTtcbiAgICBjb25zdCB5ID0gYW5jaG9yWSArIChlbGVtZW50Lm9yaWcueSAtIGFuY2hvclkpICogc2NhbGU7XG5cbiAgICAvLyByZWFkanVzdCBwb2ludHMgZm9yIGxpbmVhciAmIGZyZWUgZHJhdyBlbGVtZW50c1xuICAgIGNvbnN0IHJlc2NhbGVkUG9pbnRzID0gcmVzY2FsZVBvaW50c0luRWxlbWVudChcbiAgICAgIGVsZW1lbnQub3JpZyxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgZmFsc2UsXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZToge1xuICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgICAgeDogbnVtYmVyO1xuICAgICAgeTogbnVtYmVyO1xuICAgICAgcG9pbnRzPzogUG9pbnRbXTtcbiAgICAgIGZvbnRTaXplPzogbnVtYmVyO1xuICAgICAgYmFzZWxpbmU/OiBudW1iZXI7XG4gICAgfSA9IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgICAuLi5yZXNjYWxlZFBvaW50cyxcbiAgICB9O1xuXG4gICAgbGV0IGJvdW5kVGV4dFVwZGF0ZXM6IHsgZm9udFNpemU6IG51bWJlcjsgYmFzZWxpbmU6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50LmxhdGVzdCk7XG5cbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudCB8fCBpc1RleHRFbGVtZW50KGVsZW1lbnQub3JpZykpIHtcbiAgICAgIGNvbnN0IG9wdGlvbmFsUGFkZGluZyA9IGJvdW5kVGV4dEVsZW1lbnQgPyBCT1VORF9URVhUX1BBRERJTkcgKiAyIDogMDtcbiAgICAgIGNvbnN0IHRleHRNZWFzdXJlbWVudHMgPSBtZWFzdXJlRm9udFNpemVGcm9tV0goXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnQgPz8gKGVsZW1lbnQub3JpZyBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQpLFxuICAgICAgICB3aWR0aCAtIG9wdGlvbmFsUGFkZGluZyxcbiAgICAgICAgaGVpZ2h0IC0gb3B0aW9uYWxQYWRkaW5nLFxuICAgICAgKTtcbiAgICAgIGlmICh0ZXh0TWVhc3VyZW1lbnRzKSB7XG4gICAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQub3JpZykpIHtcbiAgICAgICAgICB1cGRhdGUuZm9udFNpemUgPSB0ZXh0TWVhc3VyZW1lbnRzLnNpemU7XG4gICAgICAgICAgdXBkYXRlLmJhc2VsaW5lID0gdGV4dE1lYXN1cmVtZW50cy5iYXNlbGluZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICAgICAgYm91bmRUZXh0VXBkYXRlcyA9IHtcbiAgICAgICAgICAgIGZvbnRTaXplOiB0ZXh0TWVhc3VyZW1lbnRzLnNpemUsXG4gICAgICAgICAgICBiYXNlbGluZTogdGV4dE1lYXN1cmVtZW50cy5iYXNlbGluZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LmxhdGVzdCwgdXBkYXRlKTtcblxuICAgIGlmIChib3VuZFRleHRFbGVtZW50ICYmIGJvdW5kVGV4dFVwZGF0ZXMpIHtcbiAgICAgIG11dGF0ZUVsZW1lbnQoYm91bmRUZXh0RWxlbWVudCwgYm91bmRUZXh0VXBkYXRlcyk7XG4gICAgICBoYW5kbGVCaW5kVGV4dFJlc2l6ZShlbGVtZW50LmxhdGVzdCwgdHJhbnNmb3JtSGFuZGxlVHlwZSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbnN0IHJvdGF0ZU11bHRpcGxlRWxlbWVudHMgPSAoXG4gIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgcG9pbnRlclg6IG51bWJlcixcbiAgcG9pbnRlclk6IG51bWJlcixcbiAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGU6IGJvb2xlYW4sXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIGxldCBjZW50ZXJBbmdsZSA9XG4gICAgKDUgKiBNYXRoLlBJKSAvIDIgKyBNYXRoLmF0YW4yKHBvaW50ZXJZIC0gY2VudGVyWSwgcG9pbnRlclggLSBjZW50ZXJYKTtcbiAgaWYgKHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKSB7XG4gICAgY2VudGVyQW5nbGUgKz0gU0hJRlRfTE9DS0lOR19BTkdMRSAvIDI7XG4gICAgY2VudGVyQW5nbGUgLT0gY2VudGVyQW5nbGUgJSBTSElGVF9MT0NLSU5HX0FOR0xFO1xuICB9XG4gIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyO1xuICAgIGNvbnN0IG9yaWdBbmdsZSA9XG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbmFsRWxlbWVudHMuZ2V0KGVsZW1lbnQuaWQpPy5hbmdsZSA/PyBlbGVtZW50LmFuZ2xlO1xuICAgIGNvbnN0IFtyb3RhdGVkQ1gsIHJvdGF0ZWRDWV0gPSByb3RhdGUoXG4gICAgICBjeCxcbiAgICAgIGN5LFxuICAgICAgY2VudGVyWCxcbiAgICAgIGNlbnRlclksXG4gICAgICBjZW50ZXJBbmdsZSArIG9yaWdBbmdsZSAtIGVsZW1lbnQuYW5nbGUsXG4gICAgKTtcbiAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgIHg6IGVsZW1lbnQueCArIChyb3RhdGVkQ1ggLSBjeCksXG4gICAgICB5OiBlbGVtZW50LnkgKyAocm90YXRlZENZIC0gY3kpLFxuICAgICAgYW5nbGU6IG5vcm1hbGl6ZUFuZ2xlKGNlbnRlckFuZ2xlICsgb3JpZ0FuZ2xlKSxcbiAgICB9KTtcbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoZWxlbWVudCk7XG4gICAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPVxuICAgICAgICBTY2VuZS5nZXRTY2VuZShlbGVtZW50KSEuZ2V0RWxlbWVudChib3VuZFRleHRFbGVtZW50SWQpITtcbiAgICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHtcbiAgICAgICAgeDogdGV4dEVsZW1lbnQueCArIChyb3RhdGVkQ1ggLSBjeCksXG4gICAgICAgIHk6IHRleHRFbGVtZW50LnkgKyAocm90YXRlZENZIC0gY3kpLFxuICAgICAgICBhbmdsZTogbm9ybWFsaXplQW5nbGUoY2VudGVyQW5nbGUgKyBvcmlnQW5nbGUpLFxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNpemVPZmZzZXRYWSA9IChcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuICBzZWxlY3RlZEVsZW1lbnRzOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9XG4gICAgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDFcbiAgICAgID8gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKHNlbGVjdGVkRWxlbWVudHNbMF0pXG4gICAgICA6IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgY29uc3QgY3ggPSAoeDEgKyB4MikgLyAyO1xuICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDI7XG4gIGNvbnN0IGFuZ2xlID0gc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgPyBzZWxlY3RlZEVsZW1lbnRzWzBdLmFuZ2xlIDogMDtcbiAgW3gsIHldID0gcm90YXRlKHgsIHksIGN4LCBjeSwgLWFuZ2xlKTtcbiAgc3dpdGNoICh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgY2FzZSBcIm5cIjpcbiAgICAgIHJldHVybiByb3RhdGUoeCAtICh4MSArIHgyKSAvIDIsIHkgLSB5MSwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJzXCI6XG4gICAgICByZXR1cm4gcm90YXRlKHggLSAoeDEgKyB4MikgLyAyLCB5IC0geTIsIDAsIDAsIGFuZ2xlKTtcbiAgICBjYXNlIFwid1wiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDEsIHkgLSAoeTEgKyB5MikgLyAyLCAwLCAwLCBhbmdsZSk7XG4gICAgY2FzZSBcImVcIjpcbiAgICAgIHJldHVybiByb3RhdGUoeCAtIHgyLCB5IC0gKHkxICsgeTIpIC8gMiwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJud1wiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDEsIHkgLSB5MSwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJuZVwiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDIsIHkgLSB5MSwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJzd1wiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDEsIHkgLSB5MiwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJzZVwiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDIsIHkgLSB5MiwgMCwgMCwgYW5nbGUpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gWzAsIDBdO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24gPSAoXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4pOiBcIm9yaWdpblwiIHwgXCJlbmRcIiA9PiB7XG4gIGNvbnN0IFssIFtweCwgcHldXSA9IGVsZW1lbnQucG9pbnRzO1xuICBjb25zdCBpc1Jlc2l6ZUVuZCA9XG4gICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibndcIiAmJiAocHggPCAwIHx8IHB5IDwgMCkpIHx8XG4gICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibmVcIiAmJiBweCA+PSAwKSB8fFxuICAgICh0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcInN3XCIgJiYgcHggPD0gMCkgfHxcbiAgICAodHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJzZVwiICYmIChweCA+IDAgfHwgcHkgPiAwKSk7XG4gIHJldHVybiBpc1Jlc2l6ZUVuZCA/IFwiZW5kXCIgOiBcIm9yaWdpblwiO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/resizeElements.ts\n");
|
|
2950
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getResizeArrowDirection\": () => (/* binding */ getResizeArrowDirection),\n/* harmony export */ \"getResizeOffsetXY\": () => (/* binding */ getResizeOffsetXY),\n/* harmony export */ \"normalizeAngle\": () => (/* binding */ normalizeAngle),\n/* harmony export */ \"reshapeSingleTwoPointElement\": () => (/* binding */ reshapeSingleTwoPointElement),\n/* harmony export */ \"resizeSingleElement\": () => (/* binding */ resizeSingleElement),\n/* harmony export */ \"transformElements\": () => (/* binding */ transformElements)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../points */ \"../../points.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _sizeHelpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sizeHelpers */ \"../../element/sizeHelpers.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _binding__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./binding */ \"../../element/binding.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n\n\n\n\n\n\n\n\n\n\n\nconst normalizeAngle = (angle) => {\n if (angle >= 2 * Math.PI) {\n return angle - 2 * Math.PI;\n }\n return angle;\n};\n// Returns true when transform (resizing/rotation) happened\nconst transformElements = (pointerDownState, transformHandleType, selectedElements, resizeArrowDirection, shouldRotateWithDiscreteAngle, shouldResizeFromCenter, shouldMaintainAspectRatio, pointerX, pointerY, centerX, centerY) => {\n if (selectedElements.length === 1) {\n const [element] = selectedElements;\n if (transformHandleType === \"rotation\") {\n rotateSingleElement(element, pointerX, pointerY, shouldRotateWithDiscreteAngle);\n (0,_binding__WEBPACK_IMPORTED_MODULE_8__.updateBoundElements)(element);\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isLinearElement)(element) &&\n element.points.length === 2 &&\n (transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\")) {\n reshapeSingleTwoPointElement(element, resizeArrowDirection, shouldRotateWithDiscreteAngle, pointerX, pointerY);\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) &&\n (transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\")) {\n resizeSingleTextElement(element, transformHandleType, shouldResizeFromCenter, pointerX, pointerY);\n (0,_binding__WEBPACK_IMPORTED_MODULE_8__.updateBoundElements)(element);\n }\n else if (transformHandleType) {\n resizeSingleElement(pointerDownState.originalElements, shouldMaintainAspectRatio, element, transformHandleType, shouldResizeFromCenter, pointerX, pointerY);\n }\n return true;\n }\n else if (selectedElements.length > 1) {\n if (transformHandleType === \"rotation\") {\n rotateMultipleElements(pointerDownState, selectedElements, pointerX, pointerY, shouldRotateWithDiscreteAngle, centerX, centerY);\n return true;\n }\n else if (transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\") {\n resizeMultipleElements(pointerDownState, selectedElements, transformHandleType, shouldResizeFromCenter, pointerX, pointerY);\n return true;\n }\n }\n return false;\n};\nconst rotateSingleElement = (element, pointerX, pointerY, shouldRotateWithDiscreteAngle) => {\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n let angle = (5 * Math.PI) / 2 + Math.atan2(pointerY - cy, pointerX - cx);\n if (shouldRotateWithDiscreteAngle) {\n angle += _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE / 2;\n angle -= angle % _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE;\n }\n angle = normalizeAngle(angle);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, { angle });\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.getBoundTextElementId)(element);\n if (boundTextElementId) {\n const textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_9__[\"default\"].getScene(element).getElement(boundTextElementId);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(textElement, { angle });\n }\n};\n// used in DEV only\nconst validateTwoPointElementNormalized = (element) => {\n if (element.points.length !== 2 ||\n element.points[0][0] !== 0 ||\n element.points[0][1] !== 0 ||\n Math.abs(element.points[1][0]) !== element.width ||\n Math.abs(element.points[1][1]) !== element.height) {\n throw new Error(\"Two-point element is not normalized\");\n }\n};\nconst getPerfectElementSizeWithRotation = (elementType, width, height, angle) => {\n const size = (0,_sizeHelpers__WEBPACK_IMPORTED_MODULE_6__.getPerfectElementSize)(elementType, ...(0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(width, height, 0, 0, angle));\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(size.width, size.height, 0, 0, -angle);\n};\nconst reshapeSingleTwoPointElement = (element, resizeArrowDirection, shouldRotateWithDiscreteAngle, pointerX, pointerY) => {\n if (true) {\n validateTwoPointElementNormalized(element);\n }\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n // rotation pointer with reverse angle\n const [rotatedX, rotatedY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(pointerX, pointerY, cx, cy, -element.angle);\n let [width, height] = resizeArrowDirection === \"end\"\n ? [rotatedX - element.x, rotatedY - element.y]\n : [\n element.x + element.points[1][0] - rotatedX,\n element.y + element.points[1][1] - rotatedY,\n ];\n if (shouldRotateWithDiscreteAngle) {\n [width, height] = getPerfectElementSizeWithRotation(element.type, width, height, element.angle);\n }\n const [nextElementX, nextElementY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.adjustXYWithRotation)(resizeArrowDirection === \"end\"\n ? { s: true, e: true }\n : { n: true, w: true }, element.x, element.y, element.angle, 0, 0, (element.points[1][0] - width) / 2, (element.points[1][1] - height) / 2);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, {\n x: nextElementX,\n y: nextElementY,\n points: [\n [0, 0],\n [width, height],\n ],\n });\n};\nconst rescalePointsInElement = (element, width, height, normalizePoints) => (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isFreeDrawElement)(element)\n ? {\n points: (0,_points__WEBPACK_IMPORTED_MODULE_1__.rescalePoints)(0, width, (0,_points__WEBPACK_IMPORTED_MODULE_1__.rescalePoints)(1, height, element.points, normalizePoints), normalizePoints),\n }\n : {};\nconst MIN_FONT_SIZE = 1;\nconst measureFontSizeFromWH = (element, nextWidth, nextHeight) => {\n // We only use width to scale font on resize\n const nextFontSize = element.fontSize * (nextWidth / element.width);\n if (nextFontSize < MIN_FONT_SIZE) {\n return null;\n }\n const metrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_7__.getFontString)({ fontSize: nextFontSize, fontFamily: element.fontFamily }), element.containerId ? element.width : null);\n return {\n size: nextFontSize,\n baseline: metrics.baseline + (nextHeight - metrics.height),\n };\n};\nconst getSidesForTransformHandle = (transformHandleType, shouldResizeFromCenter) => {\n return {\n n: /^(n|ne|nw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(s|se|sw)$/.test(transformHandleType)),\n s: /^(s|se|sw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(n|ne|nw)$/.test(transformHandleType)),\n w: /^(w|nw|sw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(e|ne|se)$/.test(transformHandleType)),\n e: /^(e|ne|se)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(w|nw|sw)$/.test(transformHandleType)),\n };\n};\nconst resizeSingleTextElement = (element, transformHandleType, shouldResizeFromCenter, pointerX, pointerY) => {\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n // rotation pointer with reverse angle\n const [rotatedX, rotatedY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(pointerX, pointerY, cx, cy, -element.angle);\n let scale;\n switch (transformHandleType) {\n case \"se\":\n scale = Math.max((rotatedX - x1) / (x2 - x1), (rotatedY - y1) / (y2 - y1));\n break;\n case \"nw\":\n scale = Math.max((x2 - rotatedX) / (x2 - x1), (y2 - rotatedY) / (y2 - y1));\n break;\n case \"ne\":\n scale = Math.max((rotatedX - x1) / (x2 - x1), (y2 - rotatedY) / (y2 - y1));\n break;\n case \"sw\":\n scale = Math.max((x2 - rotatedX) / (x2 - x1), (rotatedY - y1) / (y2 - y1));\n break;\n }\n if (scale > 0) {\n const nextWidth = element.width * scale;\n const nextHeight = element.height * scale;\n const nextFont = measureFontSizeFromWH(element, nextWidth, nextHeight);\n if (nextFont === null) {\n return;\n }\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight, false);\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n const [nextElementX, nextElementY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.adjustXYWithRotation)(getSidesForTransformHandle(transformHandleType, shouldResizeFromCenter), element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, {\n fontSize: nextFont.size,\n width: nextWidth,\n height: nextHeight,\n baseline: nextFont.baseline,\n x: nextElementX,\n y: nextElementY,\n });\n }\n};\nconst resizeSingleElement = (originalElements, shouldMaintainAspectRatio, element, transformHandleDirection, shouldResizeFromCenter, pointerX, pointerY) => {\n const stateAtResizeStart = originalElements.get(element.id);\n // Gets bounds corners\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(stateAtResizeStart, stateAtResizeStart.width, stateAtResizeStart.height, true);\n const startTopLeft = [x1, y1];\n const startBottomRight = [x2, y2];\n const startCenter = (0,_math__WEBPACK_IMPORTED_MODULE_2__.centerPoint)(startTopLeft, startBottomRight);\n // Calculate new dimensions based on cursor position\n const rotatedPointer = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)([pointerX, pointerY], startCenter, -stateAtResizeStart.angle);\n // Get bounds corners rendered on screen\n const [esx1, esy1, esx2, esy2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(element, element.width, element.height, true);\n const boundsCurrentWidth = esx2 - esx1;\n const boundsCurrentHeight = esy2 - esy1;\n // It's important we set the initial scale value based on the width and height at resize start,\n // otherwise previous dimensions affected by modifiers will be taken into account.\n const atStartBoundsWidth = startBottomRight[0] - startTopLeft[0];\n const atStartBoundsHeight = startBottomRight[1] - startTopLeft[1];\n let scaleX = atStartBoundsWidth / boundsCurrentWidth;\n let scaleY = atStartBoundsHeight / boundsCurrentHeight;\n let boundTextFont = {};\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.getBoundTextElement)(element);\n if (transformHandleDirection.includes(\"e\")) {\n scaleX = (rotatedPointer[0] - startTopLeft[0]) / boundsCurrentWidth;\n }\n if (transformHandleDirection.includes(\"s\")) {\n scaleY = (rotatedPointer[1] - startTopLeft[1]) / boundsCurrentHeight;\n }\n if (transformHandleDirection.includes(\"w\")) {\n scaleX = (startBottomRight[0] - rotatedPointer[0]) / boundsCurrentWidth;\n }\n if (transformHandleDirection.includes(\"n\")) {\n scaleY = (startBottomRight[1] - rotatedPointer[1]) / boundsCurrentHeight;\n }\n // Linear elements dimensions differ from bounds dimensions\n const eleInitialWidth = stateAtResizeStart.width;\n const eleInitialHeight = stateAtResizeStart.height;\n // We have to use dimensions of element on screen, otherwise the scaling of the\n // dimensions won't match the cursor for linear elements.\n let eleNewWidth = element.width * scaleX;\n let eleNewHeight = element.height * scaleY;\n // adjust dimensions for resizing from center\n if (shouldResizeFromCenter) {\n eleNewWidth = 2 * eleNewWidth - eleInitialWidth;\n eleNewHeight = 2 * eleNewHeight - eleInitialHeight;\n }\n // adjust dimensions to keep sides ratio\n if (shouldMaintainAspectRatio) {\n const widthRatio = Math.abs(eleNewWidth) / eleInitialWidth;\n const heightRatio = Math.abs(eleNewHeight) / eleInitialHeight;\n if (transformHandleDirection.length === 1) {\n eleNewHeight *= widthRatio;\n eleNewWidth *= heightRatio;\n }\n if (transformHandleDirection.length === 2) {\n const ratio = Math.max(widthRatio, heightRatio);\n eleNewWidth = eleInitialWidth * ratio * Math.sign(eleNewWidth);\n eleNewHeight = eleInitialHeight * ratio * Math.sign(eleNewHeight);\n }\n }\n if (boundTextElement) {\n const stateOfBoundTextElementAtResize = originalElements.get(boundTextElement.id);\n if (stateOfBoundTextElementAtResize) {\n boundTextFont = {\n fontSize: stateOfBoundTextElementAtResize.fontSize,\n baseline: stateOfBoundTextElementAtResize.baseline,\n };\n }\n if (shouldMaintainAspectRatio) {\n const nextFont = measureFontSizeFromWH(boundTextElement, eleNewWidth - _constants__WEBPACK_IMPORTED_MODULE_0__.BOUND_TEXT_PADDING * 2, eleNewHeight - _constants__WEBPACK_IMPORTED_MODULE_0__.BOUND_TEXT_PADDING * 2);\n if (nextFont === null) {\n return;\n }\n boundTextFont = {\n fontSize: nextFont.size,\n baseline: nextFont.baseline,\n };\n }\n else {\n const minWidth = (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.getApproxMinLineWidth)((0,_utils__WEBPACK_IMPORTED_MODULE_7__.getFontString)(boundTextElement));\n const minHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.getApproxMinLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_7__.getFontString)(boundTextElement));\n eleNewWidth = Math.ceil(Math.max(eleNewWidth, minWidth));\n eleNewHeight = Math.ceil(Math.max(eleNewHeight, minHeight));\n }\n }\n const [newBoundsX1, newBoundsY1, newBoundsX2, newBoundsY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(stateAtResizeStart, eleNewWidth, eleNewHeight, true);\n const newBoundsWidth = newBoundsX2 - newBoundsX1;\n const newBoundsHeight = newBoundsY2 - newBoundsY1;\n // Calculate new topLeft based on fixed corner during resize\n let newTopLeft = [...startTopLeft];\n if ([\"n\", \"w\", \"nw\"].includes(transformHandleDirection)) {\n newTopLeft = [\n startBottomRight[0] - Math.abs(newBoundsWidth),\n startBottomRight[1] - Math.abs(newBoundsHeight),\n ];\n }\n if (transformHandleDirection === \"ne\") {\n const bottomLeft = [startTopLeft[0], startBottomRight[1]];\n newTopLeft = [bottomLeft[0], bottomLeft[1] - Math.abs(newBoundsHeight)];\n }\n if (transformHandleDirection === \"sw\") {\n const topRight = [startBottomRight[0], startTopLeft[1]];\n newTopLeft = [topRight[0] - Math.abs(newBoundsWidth), topRight[1]];\n }\n // Keeps opposite handle fixed during resize\n if (shouldMaintainAspectRatio) {\n if ([\"s\", \"n\"].includes(transformHandleDirection)) {\n newTopLeft[0] = startCenter[0] - newBoundsWidth / 2;\n }\n if ([\"e\", \"w\"].includes(transformHandleDirection)) {\n newTopLeft[1] = startCenter[1] - newBoundsHeight / 2;\n }\n }\n // Flip horizontally\n if (eleNewWidth < 0) {\n if (transformHandleDirection.includes(\"e\")) {\n newTopLeft[0] -= Math.abs(newBoundsWidth);\n }\n if (transformHandleDirection.includes(\"w\")) {\n newTopLeft[0] += Math.abs(newBoundsWidth);\n }\n }\n // Flip vertically\n if (eleNewHeight < 0) {\n if (transformHandleDirection.includes(\"s\")) {\n newTopLeft[1] -= Math.abs(newBoundsHeight);\n }\n if (transformHandleDirection.includes(\"n\")) {\n newTopLeft[1] += Math.abs(newBoundsHeight);\n }\n }\n if (shouldResizeFromCenter) {\n newTopLeft[0] = startCenter[0] - Math.abs(newBoundsWidth) / 2;\n newTopLeft[1] = startCenter[1] - Math.abs(newBoundsHeight) / 2;\n }\n // adjust topLeft to new rotation point\n const angle = stateAtResizeStart.angle;\n const rotatedTopLeft = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)(newTopLeft, startCenter, angle);\n const newCenter = [\n newTopLeft[0] + Math.abs(newBoundsWidth) / 2,\n newTopLeft[1] + Math.abs(newBoundsHeight) / 2,\n ];\n const rotatedNewCenter = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)(newCenter, startCenter, angle);\n newTopLeft = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)(rotatedTopLeft, rotatedNewCenter, -angle);\n // Readjust points for linear elements\n const rescaledPoints = rescalePointsInElement(stateAtResizeStart, eleNewWidth, eleNewHeight, true);\n // For linear elements (x,y) are the coordinates of the first drawn point not the top-left corner\n // So we need to readjust (x,y) to be where the first point should be\n const newOrigin = [...newTopLeft];\n newOrigin[0] += stateAtResizeStart.x - newBoundsX1;\n newOrigin[1] += stateAtResizeStart.y - newBoundsY1;\n const resizedElement = Object.assign({ width: Math.abs(eleNewWidth), height: Math.abs(eleNewHeight), x: newOrigin[0], y: newOrigin[1] }, rescaledPoints);\n if (\"scale\" in element && \"scale\" in stateAtResizeStart) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, {\n scale: [\n // defaulting because scaleX/Y can be 0/-0\n (Math.sign(scaleX) || stateAtResizeStart.scale[0]) *\n stateAtResizeStart.scale[0],\n (Math.sign(scaleY) || stateAtResizeStart.scale[1]) *\n stateAtResizeStart.scale[1],\n ],\n });\n }\n if (resizedElement.width !== 0 &&\n resizedElement.height !== 0 &&\n Number.isFinite(resizedElement.x) &&\n Number.isFinite(resizedElement.y)) {\n (0,_binding__WEBPACK_IMPORTED_MODULE_8__.updateBoundElements)(element, {\n newSize: { width: resizedElement.width, height: resizedElement.height },\n });\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, resizedElement);\n if (boundTextElement && boundTextFont) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(boundTextElement, { fontSize: boundTextFont.fontSize });\n }\n (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.handleBindTextResize)(element, transformHandleDirection);\n }\n};\nconst resizeMultipleElements = (pointerDownState, selectedElements, transformHandleType, shouldResizeFromCenter, pointerX, pointerY) => {\n // map selected elements to the original elements. While it never should\n // happen that pointerDownState.originalElements won't contain the selected\n // elements during resize, this coupling isn't guaranteed, so to ensure\n // type safety we need to transform only those elements we filter.\n const targetElements = selectedElements.reduce((acc, element) => {\n const origElement = pointerDownState.originalElements.get(element.id);\n if (origElement) {\n acc.push({ orig: origElement, latest: element });\n }\n return acc;\n }, []);\n const { minX, minY, maxX, maxY, midX, midY } = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getCommonBoundingBox)(targetElements.map(({ orig }) => orig));\n const direction = transformHandleType;\n const mapDirectionsToAnchors = {\n ne: [minX, maxY],\n se: [minX, minY],\n sw: [maxX, minY],\n nw: [maxX, maxY],\n };\n // anchor point must be on the opposite side of the dragged selection handle\n // or be the center of the selection if alt is pressed\n const [anchorX, anchorY] = shouldResizeFromCenter\n ? [midX, midY]\n : mapDirectionsToAnchors[direction];\n const mapDirectionsToPointerSides = {\n ne: [pointerX >= anchorX, pointerY <= anchorY],\n se: [pointerX >= anchorX, pointerY >= anchorY],\n sw: [pointerX <= anchorX, pointerY >= anchorY],\n nw: [pointerX <= anchorX, pointerY <= anchorY],\n };\n // pointer side relative to anchor\n const [pointerSideX, pointerSideY] = mapDirectionsToPointerSides[direction].map((condition) => (condition ? 1 : -1));\n // stop resizing if a pointer is on the other side of selection\n if (pointerSideX < 0 && pointerSideY < 0) {\n return;\n }\n const scale = Math.max((pointerSideX * Math.abs(pointerX - anchorX)) / (maxX - minX), (pointerSideY * Math.abs(pointerY - anchorY)) / (maxY - minY)) * (shouldResizeFromCenter ? 2 : 1);\n if (scale === 0) {\n return;\n }\n targetElements.forEach((element) => {\n const width = element.orig.width * scale;\n const height = element.orig.height * scale;\n const x = anchorX + (element.orig.x - anchorX) * scale;\n const y = anchorY + (element.orig.y - anchorY) * scale;\n // readjust points for linear & free draw elements\n const rescaledPoints = rescalePointsInElement(element.orig, width, height, false);\n const update = Object.assign({ width,\n height,\n x,\n y }, rescaledPoints);\n let boundTextUpdates = null;\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.getBoundTextElement)(element.latest);\n if (boundTextElement || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element.orig)) {\n const optionalPadding = boundTextElement ? _constants__WEBPACK_IMPORTED_MODULE_0__.BOUND_TEXT_PADDING * 2 : 0;\n const textMeasurements = measureFontSizeFromWH(boundTextElement !== null && boundTextElement !== void 0 ? boundTextElement : element.orig, width - optionalPadding, height - optionalPadding);\n if (!textMeasurements) {\n return;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element.orig)) {\n update.fontSize = textMeasurements.size;\n update.baseline = textMeasurements.baseline;\n }\n if (boundTextElement) {\n boundTextUpdates = {\n fontSize: textMeasurements.size,\n baseline: textMeasurements.baseline,\n };\n }\n }\n (0,_binding__WEBPACK_IMPORTED_MODULE_8__.updateBoundElements)(element.latest, { newSize: { width, height } });\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element.latest, update);\n if (boundTextElement && boundTextUpdates) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(boundTextElement, boundTextUpdates);\n (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.handleBindTextResize)(element.latest, transformHandleType);\n }\n });\n};\nconst rotateMultipleElements = (pointerDownState, elements, pointerX, pointerY, shouldRotateWithDiscreteAngle, centerX, centerY) => {\n let centerAngle = (5 * Math.PI) / 2 + Math.atan2(pointerY - centerY, pointerX - centerX);\n if (shouldRotateWithDiscreteAngle) {\n centerAngle += _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE / 2;\n centerAngle -= centerAngle % _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE;\n }\n elements.forEach((element, index) => {\n var _a, _b;\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const origAngle = (_b = (_a = pointerDownState.originalElements.get(element.id)) === null || _a === void 0 ? void 0 : _a.angle) !== null && _b !== void 0 ? _b : element.angle;\n const [rotatedCX, rotatedCY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(cx, cy, centerX, centerY, centerAngle + origAngle - element.angle);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, {\n x: element.x + (rotatedCX - cx),\n y: element.y + (rotatedCY - cy),\n angle: normalizeAngle(centerAngle + origAngle),\n });\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_10__.getBoundTextElementId)(element);\n if (boundTextElementId) {\n const textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_9__[\"default\"].getScene(element).getElement(boundTextElementId);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(textElement, {\n x: textElement.x + (rotatedCX - cx),\n y: textElement.y + (rotatedCY - cy),\n angle: normalizeAngle(centerAngle + origAngle),\n });\n }\n });\n};\nconst getResizeOffsetXY = (transformHandleType, selectedElements, x, y) => {\n const [x1, y1, x2, y2] = selectedElements.length === 1\n ? (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(selectedElements[0])\n : (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getCommonBounds)(selectedElements);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const angle = selectedElements.length === 1 ? selectedElements[0].angle : 0;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x, y, cx, cy, -angle);\n switch (transformHandleType) {\n case \"n\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - (x1 + x2) / 2, y - y1, 0, 0, angle);\n case \"s\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - (x1 + x2) / 2, y - y2, 0, 0, angle);\n case \"w\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x1, y - (y1 + y2) / 2, 0, 0, angle);\n case \"e\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x2, y - (y1 + y2) / 2, 0, 0, angle);\n case \"nw\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x1, y - y1, 0, 0, angle);\n case \"ne\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x2, y - y1, 0, 0, angle);\n case \"sw\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x1, y - y2, 0, 0, angle);\n case \"se\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x2, y - y2, 0, 0, angle);\n default:\n return [0, 0];\n }\n};\nconst getResizeArrowDirection = (transformHandleType, element) => {\n const [, [px, py]] = element.points;\n const isResizeEnd = (transformHandleType === \"nw\" && (px < 0 || py < 0)) ||\n (transformHandleType === \"ne\" && px >= 0) ||\n (transformHandleType === \"sw\" && px <= 0) ||\n (transformHandleType === \"se\" && (px > 0 || py > 0));\n return isResizeEnd ? \"end\" : \"origin\";\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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IndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC9yZXNpemVFbGVtZW50cy50cz9jYThlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJPVU5EX1RFWFRfUEFERElORywgU0hJRlRfTE9DS0lOR19BTkdMRSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHJlc2NhbGVQb2ludHMgfSBmcm9tIFwiLi4vcG9pbnRzXCI7XG5cbmltcG9ydCB7XG4gIHJvdGF0ZSxcbiAgYWRqdXN0WFlXaXRoUm90YXRpb24sXG4gIGNlbnRlclBvaW50LFxuICByb3RhdGVQb2ludCxcbn0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMsXG4gIGdldENvbW1vbkJvdW5kcyxcbiAgZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyxcbiAgZ2V0Q29tbW9uQm91bmRpbmdCb3gsXG59IGZyb20gXCIuL2JvdW5kc1wiO1xuaW1wb3J0IHtcbiAgaXNGcmVlRHJhd0VsZW1lbnQsXG4gIGlzTGluZWFyRWxlbWVudCxcbiAgaXNUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGdldFBlcmZlY3RFbGVtZW50U2l6ZSB9IGZyb20gXCIuL3NpemVIZWxwZXJzXCI7XG5pbXBvcnQgeyBnZXRGb250U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyB1cGRhdGVCb3VuZEVsZW1lbnRzIH0gZnJvbSBcIi4vYmluZGluZ1wiO1xuaW1wb3J0IHtcbiAgVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuICBUcmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24sXG59IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCB7IFBvaW50LCBQb2ludGVyRG93blN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQge1xuICBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0LFxuICBnZXRBcHByb3hNaW5MaW5lV2lkdGgsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnQsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgaGFuZGxlQmluZFRleHRSZXNpemUsXG4gIG1lYXN1cmVUZXh0LFxufSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplQW5nbGUgPSAoYW5nbGU6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIGlmIChhbmdsZSA+PSAyICogTWF0aC5QSSkge1xuICAgIHJldHVybiBhbmdsZSAtIDIgKiBNYXRoLlBJO1xuICB9XG4gIHJldHVybiBhbmdsZTtcbn07XG5cbi8vIFJldHVybnMgdHJ1ZSB3aGVuIHRyYW5zZm9ybSAocmVzaXppbmcvcm90YXRpb24pIGhhcHBlbmVkXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtRWxlbWVudHMgPSAoXG4gIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgc2VsZWN0ZWRFbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIHJlc2l6ZUFycm93RGlyZWN0aW9uOiBcIm9yaWdpblwiIHwgXCJlbmRcIixcbiAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGU6IGJvb2xlYW4sXG4gIHNob3VsZFJlc2l6ZUZyb21DZW50ZXI6IGJvb2xlYW4sXG4gIHNob3VsZE1haW50YWluQXNwZWN0UmF0aW86IGJvb2xlYW4sXG4gIHBvaW50ZXJYOiBudW1iZXIsXG4gIHBvaW50ZXJZOiBudW1iZXIsXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IFtlbGVtZW50XSA9IHNlbGVjdGVkRWxlbWVudHM7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwicm90YXRpb25cIikge1xuICAgICAgcm90YXRlU2luZ2xlRWxlbWVudChcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgcG9pbnRlclgsXG4gICAgICAgIHBvaW50ZXJZLFxuICAgICAgICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSxcbiAgICAgICk7XG4gICAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgJiZcbiAgICAgIGVsZW1lbnQucG9pbnRzLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibndcIiB8fFxuICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5lXCIgfHxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJzd1wiIHx8XG4gICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwic2VcIilcbiAgICApIHtcbiAgICAgIHJlc2hhcGVTaW5nbGVUd29Qb2ludEVsZW1lbnQoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHJlc2l6ZUFycm93RGlyZWN0aW9uLFxuICAgICAgICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSxcbiAgICAgICAgcG9pbnRlclgsXG4gICAgICAgIHBvaW50ZXJZLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJlxuICAgICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibndcIiB8fFxuICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5lXCIgfHxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJzd1wiIHx8XG4gICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwic2VcIilcbiAgICApIHtcbiAgICAgIHJlc2l6ZVNpbmdsZVRleHRFbGVtZW50KFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlLFxuICAgICAgICBzaG91bGRSZXNpemVGcm9tQ2VudGVyLFxuICAgICAgICBwb2ludGVyWCxcbiAgICAgICAgcG9pbnRlclksXG4gICAgICApO1xuICAgICAgdXBkYXRlQm91bmRFbGVtZW50cyhlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUpIHtcbiAgICAgIHJlc2l6ZVNpbmdsZUVsZW1lbnQoXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luYWxFbGVtZW50cyxcbiAgICAgICAgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcixcbiAgICAgICAgcG9pbnRlclgsXG4gICAgICAgIHBvaW50ZXJZLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICBpZiAodHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJyb3RhdGlvblwiKSB7XG4gICAgICByb3RhdGVNdWx0aXBsZUVsZW1lbnRzKFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLFxuICAgICAgICBwb2ludGVyWCxcbiAgICAgICAgcG9pbnRlclksXG4gICAgICAgIHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlLFxuICAgICAgICBjZW50ZXJYLFxuICAgICAgICBjZW50ZXJZLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm53XCIgfHxcbiAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibmVcIiB8fFxuICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJzd1wiIHx8XG4gICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcInNlXCJcbiAgICApIHtcbiAgICAgIHJlc2l6ZU11bHRpcGxlRWxlbWVudHMoXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUsXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUsXG4gICAgICAgIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIsXG4gICAgICAgIHBvaW50ZXJYLFxuICAgICAgICBwb2ludGVyWSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3Qgcm90YXRlU2luZ2xlRWxlbWVudCA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBwb2ludGVyWDogbnVtYmVyLFxuICBwb2ludGVyWTogbnVtYmVyLFxuICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZTogYm9vbGVhbixcbikgPT4ge1xuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcbiAgbGV0IGFuZ2xlID0gKDUgKiBNYXRoLlBJKSAvIDIgKyBNYXRoLmF0YW4yKHBvaW50ZXJZIC0gY3ksIHBvaW50ZXJYIC0gY3gpO1xuICBpZiAoc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUpIHtcbiAgICBhbmdsZSArPSBTSElGVF9MT0NLSU5HX0FOR0xFIC8gMjtcbiAgICBhbmdsZSAtPSBhbmdsZSAlIFNISUZUX0xPQ0tJTkdfQU5HTEU7XG4gIH1cbiAgYW5nbGUgPSBub3JtYWxpemVBbmdsZShhbmdsZSk7XG4gIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwgeyBhbmdsZSB9KTtcbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgY29uc3QgdGV4dEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KSEuZ2V0RWxlbWVudChib3VuZFRleHRFbGVtZW50SWQpO1xuICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQhLCB7IGFuZ2xlIH0pO1xuICB9XG59O1xuXG4vLyB1c2VkIGluIERFViBvbmx5XG5jb25zdCB2YWxpZGF0ZVR3b1BvaW50RWxlbWVudE5vcm1hbGl6ZWQgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuKSA9PiB7XG4gIGlmIChcbiAgICBlbGVtZW50LnBvaW50cy5sZW5ndGggIT09IDIgfHxcbiAgICBlbGVtZW50LnBvaW50c1swXVswXSAhPT0gMCB8fFxuICAgIGVsZW1lbnQucG9pbnRzWzBdWzFdICE9PSAwIHx8XG4gICAgTWF0aC5hYnMoZWxlbWVudC5wb2ludHNbMV1bMF0pICE9PSBlbGVtZW50LndpZHRoIHx8XG4gICAgTWF0aC5hYnMoZWxlbWVudC5wb2ludHNbMV1bMV0pICE9PSBlbGVtZW50LmhlaWdodFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUd28tcG9pbnQgZWxlbWVudCBpcyBub3Qgbm9ybWFsaXplZFwiKTtcbiAgfVxufTtcblxuY29uc3QgZ2V0UGVyZmVjdEVsZW1lbnRTaXplV2l0aFJvdGF0aW9uID0gKFxuICBlbGVtZW50VHlwZTogRXhjYWxpZHJhd0VsZW1lbnRbXCJ0eXBlXCJdLFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgYW5nbGU6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlcl0gPT4ge1xuICBjb25zdCBzaXplID0gZ2V0UGVyZmVjdEVsZW1lbnRTaXplKFxuICAgIGVsZW1lbnRUeXBlLFxuICAgIC4uLnJvdGF0ZSh3aWR0aCwgaGVpZ2h0LCAwLCAwLCBhbmdsZSksXG4gICk7XG4gIHJldHVybiByb3RhdGUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQsIDAsIDAsIC1hbmdsZSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVzaGFwZVNpbmdsZVR3b1BvaW50RWxlbWVudCA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gIHJlc2l6ZUFycm93RGlyZWN0aW9uOiBcIm9yaWdpblwiIHwgXCJlbmRcIixcbiAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGU6IGJvb2xlYW4sXG4gIHBvaW50ZXJYOiBudW1iZXIsXG4gIHBvaW50ZXJZOiBudW1iZXIsXG4pID0+IHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHZhbGlkYXRlVHdvUG9pbnRFbGVtZW50Tm9ybWFsaXplZChlbGVtZW50KTtcbiAgfVxuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcbiAgLy8gcm90YXRpb24gcG9pbnRlciB3aXRoIHJldmVyc2UgYW5nbGVcbiAgY29uc3QgW3JvdGF0ZWRYLCByb3RhdGVkWV0gPSByb3RhdGUoXG4gICAgcG9pbnRlclgsXG4gICAgcG9pbnRlclksXG4gICAgY3gsXG4gICAgY3ksXG4gICAgLWVsZW1lbnQuYW5nbGUsXG4gICk7XG4gIGxldCBbd2lkdGgsIGhlaWdodF0gPVxuICAgIHJlc2l6ZUFycm93RGlyZWN0aW9uID09PSBcImVuZFwiXG4gICAgICA/IFtyb3RhdGVkWCAtIGVsZW1lbnQueCwgcm90YXRlZFkgLSBlbGVtZW50LnldXG4gICAgICA6IFtcbiAgICAgICAgICBlbGVtZW50LnggKyBlbGVtZW50LnBvaW50c1sxXVswXSAtIHJvdGF0ZWRYLFxuICAgICAgICAgIGVsZW1lbnQueSArIGVsZW1lbnQucG9pbnRzWzFdWzFdIC0gcm90YXRlZFksXG4gICAgICAgIF07XG4gIGlmIChzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSkge1xuICAgIFt3aWR0aCwgaGVpZ2h0XSA9IGdldFBlcmZlY3RFbGVtZW50U2l6ZVdpdGhSb3RhdGlvbihcbiAgICAgIGVsZW1lbnQudHlwZSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgZWxlbWVudC5hbmdsZSxcbiAgICApO1xuICB9XG4gIGNvbnN0IFtuZXh0RWxlbWVudFgsIG5leHRFbGVtZW50WV0gPSBhZGp1c3RYWVdpdGhSb3RhdGlvbihcbiAgICByZXNpemVBcnJvd0RpcmVjdGlvbiA9PT0gXCJlbmRcIlxuICAgICAgPyB7IHM6IHRydWUsIGU6IHRydWUgfVxuICAgICAgOiB7IG46IHRydWUsIHc6IHRydWUgfSxcbiAgICBlbGVtZW50LngsXG4gICAgZWxlbWVudC55LFxuICAgIGVsZW1lbnQuYW5nbGUsXG4gICAgMCxcbiAgICAwLFxuICAgIChlbGVtZW50LnBvaW50c1sxXVswXSAtIHdpZHRoKSAvIDIsXG4gICAgKGVsZW1lbnQucG9pbnRzWzFdWzFdIC0gaGVpZ2h0KSAvIDIsXG4gICk7XG4gIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgIHg6IG5leHRFbGVtZW50WCxcbiAgICB5OiBuZXh0RWxlbWVudFksXG4gICAgcG9pbnRzOiBbXG4gICAgICBbMCwgMF0sXG4gICAgICBbd2lkdGgsIGhlaWdodF0sXG4gICAgXSxcbiAgfSk7XG59O1xuXG5jb25zdCByZXNjYWxlUG9pbnRzSW5FbGVtZW50ID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBub3JtYWxpemVQb2ludHM6IGJvb2xlYW4sXG4pID0+XG4gIGlzTGluZWFyRWxlbWVudChlbGVtZW50KSB8fCBpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KVxuICAgID8ge1xuICAgICAgICBwb2ludHM6IHJlc2NhbGVQb2ludHMoXG4gICAgICAgICAgMCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICByZXNjYWxlUG9pbnRzKDEsIGhlaWdodCwgZWxlbWVudC5wb2ludHMsIG5vcm1hbGl6ZVBvaW50cyksXG4gICAgICAgICAgbm9ybWFsaXplUG9pbnRzLFxuICAgICAgICApLFxuICAgICAgfVxuICAgIDoge307XG5cbmNvbnN0IE1JTl9GT05UX1NJWkUgPSAxO1xuXG5jb25zdCBtZWFzdXJlRm9udFNpemVGcm9tV0ggPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PixcbiAgbmV4dFdpZHRoOiBudW1iZXIsXG4gIG5leHRIZWlnaHQ6IG51bWJlcixcbik6IHsgc2l6ZTogbnVtYmVyOyBiYXNlbGluZTogbnVtYmVyIH0gfCBudWxsID0+IHtcbiAgLy8gV2Ugb25seSB1c2Ugd2lkdGggdG8gc2NhbGUgZm9udCBvbiByZXNpemVcbiAgY29uc3QgbmV4dEZvbnRTaXplID0gZWxlbWVudC5mb250U2l6ZSAqIChuZXh0V2lkdGggLyBlbGVtZW50LndpZHRoKTtcbiAgaWYgKG5leHRGb250U2l6ZSA8IE1JTl9GT05UX1NJWkUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQoXG4gICAgZWxlbWVudC50ZXh0LFxuICAgIGdldEZvbnRTdHJpbmcoeyBmb250U2l6ZTogbmV4dEZvbnRTaXplLCBmb250RmFtaWx5OiBlbGVtZW50LmZvbnRGYW1pbHkgfSksXG4gICAgZWxlbWVudC5jb250YWluZXJJZCA/IGVsZW1lbnQud2lkdGggOiBudWxsLFxuICApO1xuICByZXR1cm4ge1xuICAgIHNpemU6IG5leHRGb250U2l6ZSxcbiAgICBiYXNlbGluZTogbWV0cmljcy5iYXNlbGluZSArIChuZXh0SGVpZ2h0IC0gbWV0cmljcy5oZWlnaHQpLFxuICB9O1xufTtcblxuY29uc3QgZ2V0U2lkZXNGb3JUcmFuc2Zvcm1IYW5kbGUgPSAoXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IFRyYW5zZm9ybUhhbmRsZVR5cGUsXG4gIHNob3VsZFJlc2l6ZUZyb21DZW50ZXI6IGJvb2xlYW4sXG4pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBuOlxuICAgICAgL14obnxuZXxudykkLy50ZXN0KHRyYW5zZm9ybUhhbmRsZVR5cGUpIHx8XG4gICAgICAoc2hvdWxkUmVzaXplRnJvbUNlbnRlciAmJiAvXihzfHNlfHN3KSQvLnRlc3QodHJhbnNmb3JtSGFuZGxlVHlwZSkpLFxuICAgIHM6XG4gICAgICAvXihzfHNlfHN3KSQvLnRlc3QodHJhbnNmb3JtSGFuZGxlVHlwZSkgfHxcbiAgICAgIChzaG91bGRSZXNpemVGcm9tQ2VudGVyICYmIC9eKG58bmV8bncpJC8udGVzdCh0cmFuc2Zvcm1IYW5kbGVUeXBlKSksXG4gICAgdzpcbiAgICAgIC9eKHd8bnd8c3cpJC8udGVzdCh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB8fFxuICAgICAgKHNob3VsZFJlc2l6ZUZyb21DZW50ZXIgJiYgL14oZXxuZXxzZSkkLy50ZXN0KHRyYW5zZm9ybUhhbmRsZVR5cGUpKSxcbiAgICBlOlxuICAgICAgL14oZXxuZXxzZSkkLy50ZXN0KHRyYW5zZm9ybUhhbmRsZVR5cGUpIHx8XG4gICAgICAoc2hvdWxkUmVzaXplRnJvbUNlbnRlciAmJiAvXih3fG53fHN3KSQvLnRlc3QodHJhbnNmb3JtSGFuZGxlVHlwZSkpLFxuICB9O1xufTtcblxuY29uc3QgcmVzaXplU2luZ2xlVGV4dEVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PixcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogXCJud1wiIHwgXCJuZVwiIHwgXCJzd1wiIHwgXCJzZVwiLFxuICBzaG91bGRSZXNpemVGcm9tQ2VudGVyOiBib29sZWFuLFxuICBwb2ludGVyWDogbnVtYmVyLFxuICBwb2ludGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMjtcbiAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyO1xuICAvLyByb3RhdGlvbiBwb2ludGVyIHdpdGggcmV2ZXJzZSBhbmdsZVxuICBjb25zdCBbcm90YXRlZFgsIHJvdGF0ZWRZXSA9IHJvdGF0ZShcbiAgICBwb2ludGVyWCxcbiAgICBwb2ludGVyWSxcbiAgICBjeCxcbiAgICBjeSxcbiAgICAtZWxlbWVudC5hbmdsZSxcbiAgKTtcbiAgbGV0IHNjYWxlOiBudW1iZXI7XG4gIHN3aXRjaCAodHJhbnNmb3JtSGFuZGxlVHlwZSkge1xuICAgIGNhc2UgXCJzZVwiOlxuICAgICAgc2NhbGUgPSBNYXRoLm1heChcbiAgICAgICAgKHJvdGF0ZWRYIC0geDEpIC8gKHgyIC0geDEpLFxuICAgICAgICAocm90YXRlZFkgLSB5MSkgLyAoeTIgLSB5MSksXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm53XCI6XG4gICAgICBzY2FsZSA9IE1hdGgubWF4KFxuICAgICAgICAoeDIgLSByb3RhdGVkWCkgLyAoeDIgLSB4MSksXG4gICAgICAgICh5MiAtIHJvdGF0ZWRZKSAvICh5MiAtIHkxKSxcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwibmVcIjpcbiAgICAgIHNjYWxlID0gTWF0aC5tYXgoXG4gICAgICAgIChyb3RhdGVkWCAtIHgxKSAvICh4MiAtIHgxKSxcbiAgICAgICAgKHkyIC0gcm90YXRlZFkpIC8gKHkyIC0geTEpLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJzd1wiOlxuICAgICAgc2NhbGUgPSBNYXRoLm1heChcbiAgICAgICAgKHgyIC0gcm90YXRlZFgpIC8gKHgyIC0geDEpLFxuICAgICAgICAocm90YXRlZFkgLSB5MSkgLyAoeTIgLSB5MSksXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgaWYgKHNjYWxlID4gMCkge1xuICAgIGNvbnN0IG5leHRXaWR0aCA9IGVsZW1lbnQud2lkdGggKiBzY2FsZTtcbiAgICBjb25zdCBuZXh0SGVpZ2h0ID0gZWxlbWVudC5oZWlnaHQgKiBzY2FsZTtcbiAgICBjb25zdCBuZXh0Rm9udCA9IG1lYXN1cmVGb250U2l6ZUZyb21XSChlbGVtZW50LCBuZXh0V2lkdGgsIG5leHRIZWlnaHQpO1xuICAgIGlmIChuZXh0Rm9udCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbbmV4dFgxLCBuZXh0WTEsIG5leHRYMiwgbmV4dFkyXSA9IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMoXG4gICAgICBlbGVtZW50LFxuICAgICAgbmV4dFdpZHRoLFxuICAgICAgbmV4dEhlaWdodCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgY29uc3QgZGVsdGFYMSA9ICh4MSAtIG5leHRYMSkgLyAyO1xuICAgIGNvbnN0IGRlbHRhWTEgPSAoeTEgLSBuZXh0WTEpIC8gMjtcbiAgICBjb25zdCBkZWx0YVgyID0gKHgyIC0gbmV4dFgyKSAvIDI7XG4gICAgY29uc3QgZGVsdGFZMiA9ICh5MiAtIG5leHRZMikgLyAyO1xuICAgIGNvbnN0IFtuZXh0RWxlbWVudFgsIG5leHRFbGVtZW50WV0gPSBhZGp1c3RYWVdpdGhSb3RhdGlvbihcbiAgICAgIGdldFNpZGVzRm9yVHJhbnNmb3JtSGFuZGxlKHRyYW5zZm9ybUhhbmRsZVR5cGUsIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIpLFxuICAgICAgZWxlbWVudC54LFxuICAgICAgZWxlbWVudC55LFxuICAgICAgZWxlbWVudC5hbmdsZSxcbiAgICAgIGRlbHRhWDEsXG4gICAgICBkZWx0YVkxLFxuICAgICAgZGVsdGFYMixcbiAgICAgIGRlbHRhWTIsXG4gICAgKTtcbiAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgIGZvbnRTaXplOiBuZXh0Rm9udC5zaXplLFxuICAgICAgd2lkdGg6IG5leHRXaWR0aCxcbiAgICAgIGhlaWdodDogbmV4dEhlaWdodCxcbiAgICAgIGJhc2VsaW5lOiBuZXh0Rm9udC5iYXNlbGluZSxcbiAgICAgIHg6IG5leHRFbGVtZW50WCxcbiAgICAgIHk6IG5leHRFbGVtZW50WSxcbiAgICB9KTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc2l6ZVNpbmdsZUVsZW1lbnQgPSAoXG4gIG9yaWdpbmFsRWxlbWVudHM6IFBvaW50ZXJEb3duU3RhdGVbXCJvcmlnaW5hbEVsZW1lbnRzXCJdLFxuICBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvOiBib29sZWFuLFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbjogVHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLFxuICBzaG91bGRSZXNpemVGcm9tQ2VudGVyOiBib29sZWFuLFxuICBwb2ludGVyWDogbnVtYmVyLFxuICBwb2ludGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IHN0YXRlQXRSZXNpemVTdGFydCA9IG9yaWdpbmFsRWxlbWVudHMuZ2V0KGVsZW1lbnQuaWQpITtcbiAgLy8gR2V0cyBib3VuZHMgY29ybmVyc1xuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhcbiAgICBzdGF0ZUF0UmVzaXplU3RhcnQsXG4gICAgc3RhdGVBdFJlc2l6ZVN0YXJ0LndpZHRoLFxuICAgIHN0YXRlQXRSZXNpemVTdGFydC5oZWlnaHQsXG4gICAgdHJ1ZSxcbiAgKTtcbiAgY29uc3Qgc3RhcnRUb3BMZWZ0OiBQb2ludCA9IFt4MSwgeTFdO1xuICBjb25zdCBzdGFydEJvdHRvbVJpZ2h0OiBQb2ludCA9IFt4MiwgeTJdO1xuICBjb25zdCBzdGFydENlbnRlcjogUG9pbnQgPSBjZW50ZXJQb2ludChzdGFydFRvcExlZnQsIHN0YXJ0Qm90dG9tUmlnaHQpO1xuXG4gIC8vIENhbGN1bGF0ZSBuZXcgZGltZW5zaW9ucyBiYXNlZCBvbiBjdXJzb3IgcG9zaXRpb25cbiAgY29uc3Qgcm90YXRlZFBvaW50ZXIgPSByb3RhdGVQb2ludChcbiAgICBbcG9pbnRlclgsIHBvaW50ZXJZXSxcbiAgICBzdGFydENlbnRlcixcbiAgICAtc3RhdGVBdFJlc2l6ZVN0YXJ0LmFuZ2xlLFxuICApO1xuXG4gIC8vIEdldCBib3VuZHMgY29ybmVycyByZW5kZXJlZCBvbiBzY3JlZW5cbiAgY29uc3QgW2VzeDEsIGVzeTEsIGVzeDIsIGVzeTJdID0gZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhcbiAgICBlbGVtZW50LFxuICAgIGVsZW1lbnQud2lkdGgsXG4gICAgZWxlbWVudC5oZWlnaHQsXG4gICAgdHJ1ZSxcbiAgKTtcblxuICBjb25zdCBib3VuZHNDdXJyZW50V2lkdGggPSBlc3gyIC0gZXN4MTtcbiAgY29uc3QgYm91bmRzQ3VycmVudEhlaWdodCA9IGVzeTIgLSBlc3kxO1xuXG4gIC8vIEl0J3MgaW1wb3J0YW50IHdlIHNldCB0aGUgaW5pdGlhbCBzY2FsZSB2YWx1ZSBiYXNlZCBvbiB0aGUgd2lkdGggYW5kIGhlaWdodCBhdCByZXNpemUgc3RhcnQsXG4gIC8vIG90aGVyd2lzZSBwcmV2aW91cyBkaW1lbnNpb25zIGFmZmVjdGVkIGJ5IG1vZGlmaWVycyB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudC5cbiAgY29uc3QgYXRTdGFydEJvdW5kc1dpZHRoID0gc3RhcnRCb3R0b21SaWdodFswXSAtIHN0YXJ0VG9wTGVmdFswXTtcbiAgY29uc3QgYXRTdGFydEJvdW5kc0hlaWdodCA9IHN0YXJ0Qm90dG9tUmlnaHRbMV0gLSBzdGFydFRvcExlZnRbMV07XG4gIGxldCBzY2FsZVggPSBhdFN0YXJ0Qm91bmRzV2lkdGggLyBib3VuZHNDdXJyZW50V2lkdGg7XG4gIGxldCBzY2FsZVkgPSBhdFN0YXJ0Qm91bmRzSGVpZ2h0IC8gYm91bmRzQ3VycmVudEhlaWdodDtcblxuICBsZXQgYm91bmRUZXh0Rm9udDogeyBmb250U2l6ZT86IG51bWJlcjsgYmFzZWxpbmU/OiBudW1iZXIgfSA9IHt9O1xuICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcblxuICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmluY2x1ZGVzKFwiZVwiKSkge1xuICAgIHNjYWxlWCA9IChyb3RhdGVkUG9pbnRlclswXSAtIHN0YXJ0VG9wTGVmdFswXSkgLyBib3VuZHNDdXJyZW50V2lkdGg7XG4gIH1cbiAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbi5pbmNsdWRlcyhcInNcIikpIHtcbiAgICBzY2FsZVkgPSAocm90YXRlZFBvaW50ZXJbMV0gLSBzdGFydFRvcExlZnRbMV0pIC8gYm91bmRzQ3VycmVudEhlaWdodDtcbiAgfVxuICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmluY2x1ZGVzKFwid1wiKSkge1xuICAgIHNjYWxlWCA9IChzdGFydEJvdHRvbVJpZ2h0WzBdIC0gcm90YXRlZFBvaW50ZXJbMF0pIC8gYm91bmRzQ3VycmVudFdpZHRoO1xuICB9XG4gIGlmICh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24uaW5jbHVkZXMoXCJuXCIpKSB7XG4gICAgc2NhbGVZID0gKHN0YXJ0Qm90dG9tUmlnaHRbMV0gLSByb3RhdGVkUG9pbnRlclsxXSkgLyBib3VuZHNDdXJyZW50SGVpZ2h0O1xuICB9XG5cbiAgLy8gTGluZWFyIGVsZW1lbnRzIGRpbWVuc2lvbnMgZGlmZmVyIGZyb20gYm91bmRzIGRpbWVuc2lvbnNcbiAgY29uc3QgZWxlSW5pdGlhbFdpZHRoID0gc3RhdGVBdFJlc2l6ZVN0YXJ0LndpZHRoO1xuICBjb25zdCBlbGVJbml0aWFsSGVpZ2h0ID0gc3RhdGVBdFJlc2l6ZVN0YXJ0LmhlaWdodDtcbiAgLy8gV2UgaGF2ZSB0byB1c2UgZGltZW5zaW9ucyBvZiBlbGVtZW50IG9uIHNjcmVlbiwgb3RoZXJ3aXNlIHRoZSBzY2FsaW5nIG9mIHRoZVxuICAvLyBkaW1lbnNpb25zIHdvbid0IG1hdGNoIHRoZSBjdXJzb3IgZm9yIGxpbmVhciBlbGVtZW50cy5cbiAgbGV0IGVsZU5ld1dpZHRoID0gZWxlbWVudC53aWR0aCAqIHNjYWxlWDtcbiAgbGV0IGVsZU5ld0hlaWdodCA9IGVsZW1lbnQuaGVpZ2h0ICogc2NhbGVZO1xuXG4gIC8vIGFkanVzdCBkaW1lbnNpb25zIGZvciByZXNpemluZyBmcm9tIGNlbnRlclxuICBpZiAoc2hvdWxkUmVzaXplRnJvbUNlbnRlcikge1xuICAgIGVsZU5ld1dpZHRoID0gMiAqIGVsZU5ld1dpZHRoIC0gZWxlSW5pdGlhbFdpZHRoO1xuICAgIGVsZU5ld0hlaWdodCA9IDIgKiBlbGVOZXdIZWlnaHQgLSBlbGVJbml0aWFsSGVpZ2h0O1xuICB9XG5cbiAgLy8gYWRqdXN0IGRpbWVuc2lvbnMgdG8ga2VlcCBzaWRlcyByYXRpb1xuICBpZiAoc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbykge1xuICAgIGNvbnN0IHdpZHRoUmF0aW8gPSBNYXRoLmFicyhlbGVOZXdXaWR0aCkgLyBlbGVJbml0aWFsV2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0UmF0aW8gPSBNYXRoLmFicyhlbGVOZXdIZWlnaHQpIC8gZWxlSW5pdGlhbEhlaWdodDtcbiAgICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZWxlTmV3SGVpZ2h0ICo9IHdpZHRoUmF0aW87XG4gICAgICBlbGVOZXdXaWR0aCAqPSBoZWlnaHRSYXRpbztcbiAgICB9XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHJhdGlvID0gTWF0aC5tYXgod2lkdGhSYXRpbywgaGVpZ2h0UmF0aW8pO1xuICAgICAgZWxlTmV3V2lkdGggPSBlbGVJbml0aWFsV2lkdGggKiByYXRpbyAqIE1hdGguc2lnbihlbGVOZXdXaWR0aCk7XG4gICAgICBlbGVOZXdIZWlnaHQgPSBlbGVJbml0aWFsSGVpZ2h0ICogcmF0aW8gKiBNYXRoLnNpZ24oZWxlTmV3SGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICBpZiAoYm91bmRUZXh0RWxlbWVudCkge1xuICAgIGNvbnN0IHN0YXRlT2ZCb3VuZFRleHRFbGVtZW50QXRSZXNpemUgPSBvcmlnaW5hbEVsZW1lbnRzLmdldChcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnQuaWQsXG4gICAgKSBhcyB0eXBlb2YgYm91bmRUZXh0RWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoc3RhdGVPZkJvdW5kVGV4dEVsZW1lbnRBdFJlc2l6ZSkge1xuICAgICAgYm91bmRUZXh0Rm9udCA9IHtcbiAgICAgICAgZm9udFNpemU6IHN0YXRlT2ZCb3VuZFRleHRFbGVtZW50QXRSZXNpemUuZm9udFNpemUsXG4gICAgICAgIGJhc2VsaW5lOiBzdGF0ZU9mQm91bmRUZXh0RWxlbWVudEF0UmVzaXplLmJhc2VsaW5lLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8pIHtcbiAgICAgIGNvbnN0IG5leHRGb250ID0gbWVhc3VyZUZvbnRTaXplRnJvbVdIKFxuICAgICAgICBib3VuZFRleHRFbGVtZW50LFxuICAgICAgICBlbGVOZXdXaWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDIsXG4gICAgICAgIGVsZU5ld0hlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDIsXG4gICAgICApO1xuICAgICAgaWYgKG5leHRGb250ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJvdW5kVGV4dEZvbnQgPSB7XG4gICAgICAgIGZvbnRTaXplOiBuZXh0Rm9udC5zaXplLFxuICAgICAgICBiYXNlbGluZTogbmV4dEZvbnQuYmFzZWxpbmUsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtaW5XaWR0aCA9IGdldEFwcHJveE1pbkxpbmVXaWR0aChnZXRGb250U3RyaW5nKGJvdW5kVGV4dEVsZW1lbnQpKTtcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IGdldEFwcHJveE1pbkxpbmVIZWlnaHQoZ2V0Rm9udFN0cmluZyhib3VuZFRleHRFbGVtZW50KSk7XG4gICAgICBlbGVOZXdXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChlbGVOZXdXaWR0aCwgbWluV2lkdGgpKTtcbiAgICAgIGVsZU5ld0hlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChlbGVOZXdIZWlnaHQsIG1pbkhlaWdodCkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFtuZXdCb3VuZHNYMSwgbmV3Qm91bmRzWTEsIG5ld0JvdW5kc1gyLCBuZXdCb3VuZHNZMl0gPVxuICAgIGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMoXG4gICAgICBzdGF0ZUF0UmVzaXplU3RhcnQsXG4gICAgICBlbGVOZXdXaWR0aCxcbiAgICAgIGVsZU5ld0hlaWdodCxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgY29uc3QgbmV3Qm91bmRzV2lkdGggPSBuZXdCb3VuZHNYMiAtIG5ld0JvdW5kc1gxO1xuICBjb25zdCBuZXdCb3VuZHNIZWlnaHQgPSBuZXdCb3VuZHNZMiAtIG5ld0JvdW5kc1kxO1xuXG4gIC8vIENhbGN1bGF0ZSBuZXcgdG9wTGVmdCBiYXNlZCBvbiBmaXhlZCBjb3JuZXIgZHVyaW5nIHJlc2l6ZVxuICBsZXQgbmV3VG9wTGVmdCA9IFsuLi5zdGFydFRvcExlZnRdIGFzIFtudW1iZXIsIG51bWJlcl07XG4gIGlmIChbXCJuXCIsIFwid1wiLCBcIm53XCJdLmluY2x1ZGVzKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbikpIHtcbiAgICBuZXdUb3BMZWZ0ID0gW1xuICAgICAgc3RhcnRCb3R0b21SaWdodFswXSAtIE1hdGguYWJzKG5ld0JvdW5kc1dpZHRoKSxcbiAgICAgIHN0YXJ0Qm90dG9tUmlnaHRbMV0gLSBNYXRoLmFicyhuZXdCb3VuZHNIZWlnaHQpLFxuICAgIF07XG4gIH1cbiAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbiA9PT0gXCJuZVwiKSB7XG4gICAgY29uc3QgYm90dG9tTGVmdCA9IFtzdGFydFRvcExlZnRbMF0sIHN0YXJ0Qm90dG9tUmlnaHRbMV1dO1xuICAgIG5ld1RvcExlZnQgPSBbYm90dG9tTGVmdFswXSwgYm90dG9tTGVmdFsxXSAtIE1hdGguYWJzKG5ld0JvdW5kc0hlaWdodCldO1xuICB9XG4gIGlmICh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24gPT09IFwic3dcIikge1xuICAgIGNvbnN0IHRvcFJpZ2h0ID0gW3N0YXJ0Qm90dG9tUmlnaHRbMF0sIHN0YXJ0VG9wTGVmdFsxXV07XG4gICAgbmV3VG9wTGVmdCA9IFt0b3BSaWdodFswXSAtIE1hdGguYWJzKG5ld0JvdW5kc1dpZHRoKSwgdG9wUmlnaHRbMV1dO1xuICB9XG5cbiAgLy8gS2VlcHMgb3Bwb3NpdGUgaGFuZGxlIGZpeGVkIGR1cmluZyByZXNpemVcbiAgaWYgKHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8pIHtcbiAgICBpZiAoW1wic1wiLCBcIm5cIl0uaW5jbHVkZXModHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uKSkge1xuICAgICAgbmV3VG9wTGVmdFswXSA9IHN0YXJ0Q2VudGVyWzBdIC0gbmV3Qm91bmRzV2lkdGggLyAyO1xuICAgIH1cbiAgICBpZiAoW1wiZVwiLCBcIndcIl0uaW5jbHVkZXModHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uKSkge1xuICAgICAgbmV3VG9wTGVmdFsxXSA9IHN0YXJ0Q2VudGVyWzFdIC0gbmV3Qm91bmRzSGVpZ2h0IC8gMjtcbiAgICB9XG4gIH1cblxuICAvLyBGbGlwIGhvcml6b250YWxseVxuICBpZiAoZWxlTmV3V2lkdGggPCAwKSB7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbi5pbmNsdWRlcyhcImVcIikpIHtcbiAgICAgIG5ld1RvcExlZnRbMF0gLT0gTWF0aC5hYnMobmV3Qm91bmRzV2lkdGgpO1xuICAgIH1cbiAgICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmluY2x1ZGVzKFwid1wiKSkge1xuICAgICAgbmV3VG9wTGVmdFswXSArPSBNYXRoLmFicyhuZXdCb3VuZHNXaWR0aCk7XG4gICAgfVxuICB9XG4gIC8vIEZsaXAgdmVydGljYWxseVxuICBpZiAoZWxlTmV3SGVpZ2h0IDwgMCkge1xuICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24uaW5jbHVkZXMoXCJzXCIpKSB7XG4gICAgICBuZXdUb3BMZWZ0WzFdIC09IE1hdGguYWJzKG5ld0JvdW5kc0hlaWdodCk7XG4gICAgfVxuICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24uaW5jbHVkZXMoXCJuXCIpKSB7XG4gICAgICBuZXdUb3BMZWZ0WzFdICs9IE1hdGguYWJzKG5ld0JvdW5kc0hlaWdodCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNob3VsZFJlc2l6ZUZyb21DZW50ZXIpIHtcbiAgICBuZXdUb3BMZWZ0WzBdID0gc3RhcnRDZW50ZXJbMF0gLSBNYXRoLmFicyhuZXdCb3VuZHNXaWR0aCkgLyAyO1xuICAgIG5ld1RvcExlZnRbMV0gPSBzdGFydENlbnRlclsxXSAtIE1hdGguYWJzKG5ld0JvdW5kc0hlaWdodCkgLyAyO1xuICB9XG5cbiAgLy8gYWRqdXN0IHRvcExlZnQgdG8gbmV3IHJvdGF0aW9uIHBvaW50XG4gIGNvbnN0IGFuZ2xlID0gc3RhdGVBdFJlc2l6ZVN0YXJ0LmFuZ2xlO1xuICBjb25zdCByb3RhdGVkVG9wTGVmdCA9IHJvdGF0ZVBvaW50KG5ld1RvcExlZnQsIHN0YXJ0Q2VudGVyLCBhbmdsZSk7XG4gIGNvbnN0IG5ld0NlbnRlcjogUG9pbnQgPSBbXG4gICAgbmV3VG9wTGVmdFswXSArIE1hdGguYWJzKG5ld0JvdW5kc1dpZHRoKSAvIDIsXG4gICAgbmV3VG9wTGVmdFsxXSArIE1hdGguYWJzKG5ld0JvdW5kc0hlaWdodCkgLyAyLFxuICBdO1xuICBjb25zdCByb3RhdGVkTmV3Q2VudGVyID0gcm90YXRlUG9pbnQobmV3Q2VudGVyLCBzdGFydENlbnRlciwgYW5nbGUpO1xuICBuZXdUb3BMZWZ0ID0gcm90YXRlUG9pbnQocm90YXRlZFRvcExlZnQsIHJvdGF0ZWROZXdDZW50ZXIsIC1hbmdsZSk7XG5cbiAgLy8gUmVhZGp1c3QgcG9pbnRzIGZvciBsaW5lYXIgZWxlbWVudHNcbiAgY29uc3QgcmVzY2FsZWRQb2ludHMgPSByZXNjYWxlUG9pbnRzSW5FbGVtZW50KFxuICAgIHN0YXRlQXRSZXNpemVTdGFydCxcbiAgICBlbGVOZXdXaWR0aCxcbiAgICBlbGVOZXdIZWlnaHQsXG4gICAgdHJ1ZSxcbiAgKTtcbiAgLy8gRm9yIGxpbmVhciBlbGVtZW50cyAoeCx5KSBhcmUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBmaXJzdCBkcmF3biBwb2ludCBub3QgdGhlIHRvcC1sZWZ0IGNvcm5lclxuICAvLyBTbyB3ZSBuZWVkIHRvIHJlYWRqdXN0ICh4LHkpIHRvIGJlIHdoZXJlIHRoZSBmaXJzdCBwb2ludCBzaG91bGQgYmVcbiAgY29uc3QgbmV3T3JpZ2luID0gWy4uLm5ld1RvcExlZnRdO1xuICBuZXdPcmlnaW5bMF0gKz0gc3RhdGVBdFJlc2l6ZVN0YXJ0LnggLSBuZXdCb3VuZHNYMTtcbiAgbmV3T3JpZ2luWzFdICs9IHN0YXRlQXRSZXNpemVTdGFydC55IC0gbmV3Qm91bmRzWTE7XG5cbiAgY29uc3QgcmVzaXplZEVsZW1lbnQgPSB7XG4gICAgd2lkdGg6IE1hdGguYWJzKGVsZU5ld1dpZHRoKSxcbiAgICBoZWlnaHQ6IE1hdGguYWJzKGVsZU5ld0hlaWdodCksXG4gICAgeDogbmV3T3JpZ2luWzBdLFxuICAgIHk6IG5ld09yaWdpblsxXSxcbiAgICAuLi5yZXNjYWxlZFBvaW50cyxcbiAgfTtcblxuICBpZiAoXCJzY2FsZVwiIGluIGVsZW1lbnQgJiYgXCJzY2FsZVwiIGluIHN0YXRlQXRSZXNpemVTdGFydCkge1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgc2NhbGU6IFtcbiAgICAgICAgLy8gZGVmYXVsdGluZyBiZWNhdXNlIHNjYWxlWC9ZIGNhbiBiZSAwLy0wXG4gICAgICAgIChNYXRoLnNpZ24oc2NhbGVYKSB8fCBzdGF0ZUF0UmVzaXplU3RhcnQuc2NhbGVbMF0pICpcbiAgICAgICAgICBzdGF0ZUF0UmVzaXplU3RhcnQuc2NhbGVbMF0sXG4gICAgICAgIChNYXRoLnNpZ24oc2NhbGVZKSB8fCBzdGF0ZUF0UmVzaXplU3RhcnQuc2NhbGVbMV0pICpcbiAgICAgICAgICBzdGF0ZUF0UmVzaXplU3RhcnQuc2NhbGVbMV0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKFxuICAgIHJlc2l6ZWRFbGVtZW50LndpZHRoICE9PSAwICYmXG4gICAgcmVzaXplZEVsZW1lbnQuaGVpZ2h0ICE9PSAwICYmXG4gICAgTnVtYmVyLmlzRmluaXRlKHJlc2l6ZWRFbGVtZW50LngpICYmXG4gICAgTnVtYmVyLmlzRmluaXRlKHJlc2l6ZWRFbGVtZW50LnkpXG4gICkge1xuICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCwge1xuICAgICAgbmV3U2l6ZTogeyB3aWR0aDogcmVzaXplZEVsZW1lbnQud2lkdGgsIGhlaWdodDogcmVzaXplZEVsZW1lbnQuaGVpZ2h0IH0sXG4gICAgfSk7XG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCByZXNpemVkRWxlbWVudCk7XG4gICAgaWYgKGJvdW5kVGV4dEVsZW1lbnQgJiYgYm91bmRUZXh0Rm9udCkge1xuICAgICAgbXV0YXRlRWxlbWVudChib3VuZFRleHRFbGVtZW50LCB7IGZvbnRTaXplOiBib3VuZFRleHRGb250LmZvbnRTaXplIH0pO1xuICAgIH1cbiAgICBoYW5kbGVCaW5kVGV4dFJlc2l6ZShlbGVtZW50LCB0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24pO1xuICB9XG59O1xuXG5jb25zdCByZXNpemVNdWx0aXBsZUVsZW1lbnRzID0gKFxuICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICBzZWxlY3RlZEVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogXCJud1wiIHwgXCJuZVwiIHwgXCJzd1wiIHwgXCJzZVwiLFxuICBzaG91bGRSZXNpemVGcm9tQ2VudGVyOiBib29sZWFuLFxuICBwb2ludGVyWDogbnVtYmVyLFxuICBwb2ludGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIC8vIG1hcCBzZWxlY3RlZCBlbGVtZW50cyB0byB0aGUgb3JpZ2luYWwgZWxlbWVudHMuIFdoaWxlIGl0IG5ldmVyIHNob3VsZFxuICAvLyBoYXBwZW4gdGhhdCBwb2ludGVyRG93blN0YXRlLm9yaWdpbmFsRWxlbWVudHMgd29uJ3QgY29udGFpbiB0aGUgc2VsZWN0ZWRcbiAgLy8gZWxlbWVudHMgZHVyaW5nIHJlc2l6ZSwgdGhpcyBjb3VwbGluZyBpc24ndCBndWFyYW50ZWVkLCBzbyB0byBlbnN1cmVcbiAgLy8gdHlwZSBzYWZldHkgd2UgbmVlZCB0byB0cmFuc2Zvcm0gb25seSB0aG9zZSBlbGVtZW50cyB3ZSBmaWx0ZXIuXG4gIGNvbnN0IHRhcmdldEVsZW1lbnRzID0gc2VsZWN0ZWRFbGVtZW50cy5yZWR1Y2UoXG4gICAgKFxuICAgICAgYWNjOiB7XG4gICAgICAgIC8qKiBlbGVtZW50IGF0IHJlc2l6ZSBzdGFydCAqL1xuICAgICAgICBvcmlnOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQ7XG4gICAgICAgIC8qKiBsYXRlc3QgZWxlbWVudCAqL1xuICAgICAgICBsYXRlc3Q6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudDtcbiAgICAgIH1bXSxcbiAgICAgIGVsZW1lbnQsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcmlnRWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luYWxFbGVtZW50cy5nZXQoZWxlbWVudC5pZCk7XG4gICAgICBpZiAob3JpZ0VsZW1lbnQpIHtcbiAgICAgICAgYWNjLnB1c2goeyBvcmlnOiBvcmlnRWxlbWVudCwgbGF0ZXN0OiBlbGVtZW50IH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIGNvbnN0IHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgbWlkWCwgbWlkWSB9ID0gZ2V0Q29tbW9uQm91bmRpbmdCb3goXG4gICAgdGFyZ2V0RWxlbWVudHMubWFwKCh7IG9yaWcgfSkgPT4gb3JpZyksXG4gICk7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IHRyYW5zZm9ybUhhbmRsZVR5cGU7XG5cbiAgY29uc3QgbWFwRGlyZWN0aW9uc1RvQW5jaG9yczogUmVjb3JkPHR5cGVvZiBkaXJlY3Rpb24sIFBvaW50PiA9IHtcbiAgICBuZTogW21pblgsIG1heFldLFxuICAgIHNlOiBbbWluWCwgbWluWV0sXG4gICAgc3c6IFttYXhYLCBtaW5ZXSxcbiAgICBudzogW21heFgsIG1heFldLFxuICB9O1xuXG4gIC8vIGFuY2hvciBwb2ludCBtdXN0IGJlIG9uIHRoZSBvcHBvc2l0ZSBzaWRlIG9mIHRoZSBkcmFnZ2VkIHNlbGVjdGlvbiBoYW5kbGVcbiAgLy8gb3IgYmUgdGhlIGNlbnRlciBvZiB0aGUgc2VsZWN0aW9uIGlmIGFsdCBpcyBwcmVzc2VkXG4gIGNvbnN0IFthbmNob3JYLCBhbmNob3JZXTogUG9pbnQgPSBzaG91bGRSZXNpemVGcm9tQ2VudGVyXG4gICAgPyBbbWlkWCwgbWlkWV1cbiAgICA6IG1hcERpcmVjdGlvbnNUb0FuY2hvcnNbZGlyZWN0aW9uXTtcblxuICBjb25zdCBtYXBEaXJlY3Rpb25zVG9Qb2ludGVyU2lkZXM6IFJlY29yZDxcbiAgICB0eXBlb2YgZGlyZWN0aW9uLFxuICAgIFt4OiBib29sZWFuLCB5OiBib29sZWFuXVxuICA+ID0ge1xuICAgIG5lOiBbcG9pbnRlclggPj0gYW5jaG9yWCwgcG9pbnRlclkgPD0gYW5jaG9yWV0sXG4gICAgc2U6IFtwb2ludGVyWCA+PSBhbmNob3JYLCBwb2ludGVyWSA+PSBhbmNob3JZXSxcbiAgICBzdzogW3BvaW50ZXJYIDw9IGFuY2hvclgsIHBvaW50ZXJZID49IGFuY2hvclldLFxuICAgIG53OiBbcG9pbnRlclggPD0gYW5jaG9yWCwgcG9pbnRlclkgPD0gYW5jaG9yWV0sXG4gIH07XG5cbiAgLy8gcG9pbnRlciBzaWRlIHJlbGF0aXZlIHRvIGFuY2hvclxuICBjb25zdCBbcG9pbnRlclNpZGVYLCBwb2ludGVyU2lkZVldID0gbWFwRGlyZWN0aW9uc1RvUG9pbnRlclNpZGVzW1xuICAgIGRpcmVjdGlvblxuICBdLm1hcCgoY29uZGl0aW9uKSA9PiAoY29uZGl0aW9uID8gMSA6IC0xKSk7XG5cbiAgLy8gc3RvcCByZXNpemluZyBpZiBhIHBvaW50ZXIgaXMgb24gdGhlIG90aGVyIHNpZGUgb2Ygc2VsZWN0aW9uXG4gIGlmIChwb2ludGVyU2lkZVggPCAwICYmIHBvaW50ZXJTaWRlWSA8IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzY2FsZSA9XG4gICAgTWF0aC5tYXgoXG4gICAgICAocG9pbnRlclNpZGVYICogTWF0aC5hYnMocG9pbnRlclggLSBhbmNob3JYKSkgLyAobWF4WCAtIG1pblgpLFxuICAgICAgKHBvaW50ZXJTaWRlWSAqIE1hdGguYWJzKHBvaW50ZXJZIC0gYW5jaG9yWSkpIC8gKG1heFkgLSBtaW5ZKSxcbiAgICApICogKHNob3VsZFJlc2l6ZUZyb21DZW50ZXIgPyAyIDogMSk7XG5cbiAgaWYgKHNjYWxlID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGFyZ2V0RWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHdpZHRoID0gZWxlbWVudC5vcmlnLndpZHRoICogc2NhbGU7XG4gICAgY29uc3QgaGVpZ2h0ID0gZWxlbWVudC5vcmlnLmhlaWdodCAqIHNjYWxlO1xuICAgIGNvbnN0IHggPSBhbmNob3JYICsgKGVsZW1lbnQub3JpZy54IC0gYW5jaG9yWCkgKiBzY2FsZTtcbiAgICBjb25zdCB5ID0gYW5jaG9yWSArIChlbGVtZW50Lm9yaWcueSAtIGFuY2hvclkpICogc2NhbGU7XG5cbiAgICAvLyByZWFkanVzdCBwb2ludHMgZm9yIGxpbmVhciAmIGZyZWUgZHJhdyBlbGVtZW50c1xuICAgIGNvbnN0IHJlc2NhbGVkUG9pbnRzID0gcmVzY2FsZVBvaW50c0luRWxlbWVudChcbiAgICAgIGVsZW1lbnQub3JpZyxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgZmFsc2UsXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZToge1xuICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgICAgeDogbnVtYmVyO1xuICAgICAgeTogbnVtYmVyO1xuICAgICAgcG9pbnRzPzogUG9pbnRbXTtcbiAgICAgIGZvbnRTaXplPzogbnVtYmVyO1xuICAgICAgYmFzZWxpbmU/OiBudW1iZXI7XG4gICAgfSA9IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgICAuLi5yZXNjYWxlZFBvaW50cyxcbiAgICB9O1xuXG4gICAgbGV0IGJvdW5kVGV4dFVwZGF0ZXM6IHsgZm9udFNpemU6IG51bWJlcjsgYmFzZWxpbmU6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50LmxhdGVzdCk7XG5cbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudCB8fCBpc1RleHRFbGVtZW50KGVsZW1lbnQub3JpZykpIHtcbiAgICAgIGNvbnN0IG9wdGlvbmFsUGFkZGluZyA9IGJvdW5kVGV4dEVsZW1lbnQgPyBCT1VORF9URVhUX1BBRERJTkcgKiAyIDogMDtcbiAgICAgIGNvbnN0IHRleHRNZWFzdXJlbWVudHMgPSBtZWFzdXJlRm9udFNpemVGcm9tV0goXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnQgPz8gKGVsZW1lbnQub3JpZyBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQpLFxuICAgICAgICB3aWR0aCAtIG9wdGlvbmFsUGFkZGluZyxcbiAgICAgICAgaGVpZ2h0IC0gb3B0aW9uYWxQYWRkaW5nLFxuICAgICAgKTtcblxuICAgICAgaWYgKCF0ZXh0TWVhc3VyZW1lbnRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudC5vcmlnKSkge1xuICAgICAgICB1cGRhdGUuZm9udFNpemUgPSB0ZXh0TWVhc3VyZW1lbnRzLnNpemU7XG4gICAgICAgIHVwZGF0ZS5iYXNlbGluZSA9IHRleHRNZWFzdXJlbWVudHMuYmFzZWxpbmU7XG4gICAgICB9XG5cbiAgICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICAgIGJvdW5kVGV4dFVwZGF0ZXMgPSB7XG4gICAgICAgICAgZm9udFNpemU6IHRleHRNZWFzdXJlbWVudHMuc2l6ZSxcbiAgICAgICAgICBiYXNlbGluZTogdGV4dE1lYXN1cmVtZW50cy5iYXNlbGluZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQubGF0ZXN0LCB7IG5ld1NpemU6IHsgd2lkdGgsIGhlaWdodCB9IH0pO1xuXG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LmxhdGVzdCwgdXBkYXRlKTtcblxuICAgIGlmIChib3VuZFRleHRFbGVtZW50ICYmIGJvdW5kVGV4dFVwZGF0ZXMpIHtcbiAgICAgIG11dGF0ZUVsZW1lbnQoYm91bmRUZXh0RWxlbWVudCwgYm91bmRUZXh0VXBkYXRlcyk7XG4gICAgICBoYW5kbGVCaW5kVGV4dFJlc2l6ZShlbGVtZW50LmxhdGVzdCwgdHJhbnNmb3JtSGFuZGxlVHlwZSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbnN0IHJvdGF0ZU11bHRpcGxlRWxlbWVudHMgPSAoXG4gIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgcG9pbnRlclg6IG51bWJlcixcbiAgcG9pbnRlclk6IG51bWJlcixcbiAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGU6IGJvb2xlYW4sXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIGxldCBjZW50ZXJBbmdsZSA9XG4gICAgKDUgKiBNYXRoLlBJKSAvIDIgKyBNYXRoLmF0YW4yKHBvaW50ZXJZIC0gY2VudGVyWSwgcG9pbnRlclggLSBjZW50ZXJYKTtcbiAgaWYgKHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKSB7XG4gICAgY2VudGVyQW5nbGUgKz0gU0hJRlRfTE9DS0lOR19BTkdMRSAvIDI7XG4gICAgY2VudGVyQW5nbGUgLT0gY2VudGVyQW5nbGUgJSBTSElGVF9MT0NLSU5HX0FOR0xFO1xuICB9XG4gIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyO1xuICAgIGNvbnN0IG9yaWdBbmdsZSA9XG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbmFsRWxlbWVudHMuZ2V0KGVsZW1lbnQuaWQpPy5hbmdsZSA/PyBlbGVtZW50LmFuZ2xlO1xuICAgIGNvbnN0IFtyb3RhdGVkQ1gsIHJvdGF0ZWRDWV0gPSByb3RhdGUoXG4gICAgICBjeCxcbiAgICAgIGN5LFxuICAgICAgY2VudGVyWCxcbiAgICAgIGNlbnRlclksXG4gICAgICBjZW50ZXJBbmdsZSArIG9yaWdBbmdsZSAtIGVsZW1lbnQuYW5nbGUsXG4gICAgKTtcbiAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgIHg6IGVsZW1lbnQueCArIChyb3RhdGVkQ1ggLSBjeCksXG4gICAgICB5OiBlbGVtZW50LnkgKyAocm90YXRlZENZIC0gY3kpLFxuICAgICAgYW5nbGU6IG5vcm1hbGl6ZUFuZ2xlKGNlbnRlckFuZ2xlICsgb3JpZ0FuZ2xlKSxcbiAgICB9KTtcbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoZWxlbWVudCk7XG4gICAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPVxuICAgICAgICBTY2VuZS5nZXRTY2VuZShlbGVtZW50KSEuZ2V0RWxlbWVudChib3VuZFRleHRFbGVtZW50SWQpITtcbiAgICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHtcbiAgICAgICAgeDogdGV4dEVsZW1lbnQueCArIChyb3RhdGVkQ1ggLSBjeCksXG4gICAgICAgIHk6IHRleHRFbGVtZW50LnkgKyAocm90YXRlZENZIC0gY3kpLFxuICAgICAgICBhbmdsZTogbm9ybWFsaXplQW5nbGUoY2VudGVyQW5nbGUgKyBvcmlnQW5nbGUpLFxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNpemVPZmZzZXRYWSA9IChcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuICBzZWxlY3RlZEVsZW1lbnRzOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9XG4gICAgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDFcbiAgICAgID8gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKHNlbGVjdGVkRWxlbWVudHNbMF0pXG4gICAgICA6IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgY29uc3QgY3ggPSAoeDEgKyB4MikgLyAyO1xuICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDI7XG4gIGNvbnN0IGFuZ2xlID0gc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgPyBzZWxlY3RlZEVsZW1lbnRzWzBdLmFuZ2xlIDogMDtcbiAgW3gsIHldID0gcm90YXRlKHgsIHksIGN4LCBjeSwgLWFuZ2xlKTtcbiAgc3dpdGNoICh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgY2FzZSBcIm5cIjpcbiAgICAgIHJldHVybiByb3RhdGUoeCAtICh4MSArIHgyKSAvIDIsIHkgLSB5MSwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJzXCI6XG4gICAgICByZXR1cm4gcm90YXRlKHggLSAoeDEgKyB4MikgLyAyLCB5IC0geTIsIDAsIDAsIGFuZ2xlKTtcbiAgICBjYXNlIFwid1wiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDEsIHkgLSAoeTEgKyB5MikgLyAyLCAwLCAwLCBhbmdsZSk7XG4gICAgY2FzZSBcImVcIjpcbiAgICAgIHJldHVybiByb3RhdGUoeCAtIHgyLCB5IC0gKHkxICsgeTIpIC8gMiwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJud1wiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDEsIHkgLSB5MSwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJuZVwiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDIsIHkgLSB5MSwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJzd1wiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDEsIHkgLSB5MiwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJzZVwiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDIsIHkgLSB5MiwgMCwgMCwgYW5nbGUpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gWzAsIDBdO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24gPSAoXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4pOiBcIm9yaWdpblwiIHwgXCJlbmRcIiA9PiB7XG4gIGNvbnN0IFssIFtweCwgcHldXSA9IGVsZW1lbnQucG9pbnRzO1xuICBjb25zdCBpc1Jlc2l6ZUVuZCA9XG4gICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibndcIiAmJiAocHggPCAwIHx8IHB5IDwgMCkpIHx8XG4gICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibmVcIiAmJiBweCA+PSAwKSB8fFxuICAgICh0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcInN3XCIgJiYgcHggPD0gMCkgfHxcbiAgICAodHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJzZVwiICYmIChweCA+IDAgfHwgcHkgPiAwKSk7XG4gIHJldHVybiBpc1Jlc2l6ZUVuZCA/IFwiZW5kXCIgOiBcIm9yaWdpblwiO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/resizeElements.ts\n");
|
|
2951
2951
|
|
|
2952
2952
|
/***/ }),
|
|
2953
2953
|
|
|
@@ -3211,7 +3211,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3211
3211
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3212
3212
|
|
|
3213
3213
|
"use strict";
|
|
3214
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_require__.p =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.13.0-
|
|
3214
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_require__.p =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.13.0-f5379d1\"}/dist/`;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBQ3RDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUNwQiw2Q0FBNkM7SUFDN0MscUJBQXVCO1FBQ3JCLE1BQU0sQ0FBQyxxQkFBcUI7WUFDNUIscUJBQXFCLHdCQUFvQixJQUFJLGdCQUF1QixRQUFRLENBQUM7Q0FDaEYiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9wdWJsaWNQYXRoLmpzP2E4N2QiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5WIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuVEVTVCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAvKiBnbG9iYWwgX193ZWJwYWNrX3B1YmxpY19wYXRoX186d3JpdGFibGUgKi9cbiAgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPVxuICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5QS0dfVkVSU0lPTn0vZGlzdC9gO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./publicPath.js\n");
|
|
3215
3215
|
|
|
3216
3216
|
/***/ }),
|
|
3217
3217
|
|
|
@@ -3321,7 +3321,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3321
3321
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3322
3322
|
|
|
3323
3323
|
"use strict";
|
|
3324
|
-
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 roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\nconst exportToCanvas = (elements, appState, files, { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, }, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return { canvas, scale: appState.exportScale };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n const { canvas, scale = 1 } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elements).map((element) => element.fileId),\n files,\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderScene)({\n elements,\n appState,\n scale,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n canvas,\n renderConfig: {\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n remotePointerViewportCoords: {},\n remoteSelectedElementIds: {},\n shouldCacheIgnoreZoom: false,\n remotePointerUsernames: {},\n remotePointerUserStates: {},\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\",\n imageCache,\n renderScrollbars: false,\n renderSelection: false,\n renderGrid: false,\n isExporting: true,\n },\n });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files) => __awaiter(void 0, void 0, void 0, function* () {\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene, } = appState;\n let metadata = \"\";\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\n });\n }\n catch (error) {\n console.error(error);\n }\n }\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n // initialize SVG root\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (true) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.13.0-c8f6e3f\"}`;\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\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 `;\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\n offsetX: -minX + exportPadding,\n offsetY: -minY + exportPadding,\n exportWithDarkMode: appState.exportWithDarkMode,\n });\n return svgRoot;\n});\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\n return [minX, minY, width, height];\n};\nconst getExportSize = (elements, exportPadding, scale) => {\n const [, , width, height] = getCanvasSize(elements, exportPadding).map((dimension) => Math.trunc(dimension * scale));\n return [width, height];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Iiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz85YmY3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VYUE9SVF9QQURESU5HLCBTVkdfTlMsIFRIRU1FX0ZJTFRFUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgc2VyaWFsaXplQXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLFxuICB1cGRhdGVJbWFnZUNhY2hlLFxufSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuXG5leHBvcnQgY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvQ2FudmFzID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICB7XG4gICAgZXhwb3J0QmFja2dyb3VuZCxcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICB9OiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgfSxcbiAgY3JlYXRlQ2FudmFzOiAoXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgKSA9PiB7IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7IHNjYWxlOiBudW1iZXIgfSA9ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICByZXR1cm4geyBjYW52YXMsIHNjYWxlOiBhcHBTdGF0ZS5leHBvcnRTY2FsZSB9O1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIGNvbnN0IHsgY2FudmFzLCBzY2FsZSA9IDEgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcblxuICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcblxuICBjb25zdCB7IGltYWdlQ2FjaGUgfSA9IGF3YWl0IHVwZGF0ZUltYWdlQ2FjaGUoe1xuICAgIGltYWdlQ2FjaGU6IG5ldyBNYXAoKSxcbiAgICBmaWxlSWRzOiBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMoZWxlbWVudHMpLm1hcChcbiAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGVJZCxcbiAgICApLFxuICAgIGZpbGVzLFxuICB9KTtcblxuICByZW5kZXJTY2VuZSh7XG4gICAgZWxlbWVudHMsXG4gICAgYXBwU3RhdGUsXG4gICAgc2NhbGUsXG4gICAgcmM6IHJvdWdoLmNhbnZhcyhjYW52YXMpLFxuICAgIGNhbnZhcyxcbiAgICByZW5kZXJDb25maWc6IHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczoge30sXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogZmFsc2UsXG4gICAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydGluZzogdHJ1ZSxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gY2FudmFzO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvU3ZnID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIGV4cG9ydFNjYWxlPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgICBleHBvcnRXaXRoRGFya01vZGU/OiBib29sZWFuO1xuICAgIGV4cG9ydEVtYmVkU2NlbmU/OiBib29sZWFuO1xuICB9LFxuICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsLFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcblxuICAvLyBpbml0aWFsaXplIFNWRyByb290XG4gIGNvbnN0IHN2Z1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2ZXJzaW9uXCIsIFwiMS4xXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInhtbG5zXCIsIFNWR19OUyk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRoICogZXhwb3J0U2NhbGV9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodCAqIGV4cG9ydFNjYWxlfWApO1xuICBpZiAoYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlKSB7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIiwgVEhFTUVfRklMVEVSKTtcbiAgfVxuXG4gIGxldCBhc3NldFBhdGggPSBcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vXCI7XG5cbiAgLy8gQXNzZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIG9ubHkgd2hlbiB1c2luZyBwYWNrYWdlXG4gIGlmIChwcm9jZXNzLmVudi5JU19FWENBTElEUkFXX05QTV9QQUNLQUdFKSB7XG4gICAgYXNzZXRQYXRoID1cbiAgICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICAgIGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlBLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfWA7XG5cbiAgICBpZiAoYXNzZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgYXNzZXRQYXRoID0gYXNzZXRQYXRoLnJlcGxhY2UoXCIvXCIsIGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59L2ApO1xuICAgIH1cbiAgICBhc3NldFBhdGggPSBgJHthc3NldFBhdGh9L2Rpc3QvZXhjYWxpZHJhdy1hc3NldHMvYDtcbiAgfVxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofVZpcmdpbC53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJDYXNjYWRpYVwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofUNhc2NhZGlhLndvZmYyXCIpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvZGVmcz5cbiAgYDtcbiAgLy8gcmVuZGVyIGJhY2tncm91bmQgcmVjdFxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgIG9mZnNldFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59O1xuXG4vLyBjYWxjdWxhdGUgc21hbGxlc3QgYXJlYSB0byBmaXQgdGhlIGNvbnRlbnRzIGluXG5jb25zdCBnZXRDYW52YXNTaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGV4cG9ydFBhZGRpbmc6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIGV4cG9ydFBhZGRpbmcgKiAyO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIGV4cG9ydFBhZGRpbmcgKyBleHBvcnRQYWRkaW5nO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXhwb3J0U2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4gIHNjYWxlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgWywgLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChcbiAgICAoZGltZW5zaW9uKSA9PiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKSxcbiAgKTtcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
3324
|
+
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 roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\nconst exportToCanvas = (elements, appState, files, { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, }, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return { canvas, scale: appState.exportScale };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n const { canvas, scale = 1 } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elements).map((element) => element.fileId),\n files,\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderScene)({\n elements,\n appState,\n scale,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n canvas,\n renderConfig: {\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n remotePointerViewportCoords: {},\n remoteSelectedElementIds: {},\n shouldCacheIgnoreZoom: false,\n remotePointerUsernames: {},\n remotePointerUserStates: {},\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\",\n imageCache,\n renderScrollbars: false,\n renderSelection: false,\n renderGrid: false,\n isExporting: true,\n },\n });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files) => __awaiter(void 0, void 0, void 0, function* () {\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene, } = appState;\n let metadata = \"\";\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\n });\n }\n catch (error) {\n console.error(error);\n }\n }\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n // initialize SVG root\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (true) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.13.0-f5379d1\"}`;\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\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 `;\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\n offsetX: -minX + exportPadding,\n offsetY: -minY + exportPadding,\n exportWithDarkMode: appState.exportWithDarkMode,\n });\n return svgRoot;\n});\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\n return [minX, minY, width, height];\n};\nconst getExportSize = (elements, exportPadding, scale) => {\n const [, , width, height] = getCanvasSize(elements, exportPadding).map((dimension) => Math.trunc(dimension * scale));\n return [width, height];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Iiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz85YmY3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VYUE9SVF9QQURESU5HLCBTVkdfTlMsIFRIRU1FX0ZJTFRFUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgc2VyaWFsaXplQXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLFxuICB1cGRhdGVJbWFnZUNhY2hlLFxufSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuXG5leHBvcnQgY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvQ2FudmFzID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICB7XG4gICAgZXhwb3J0QmFja2dyb3VuZCxcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICB9OiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgfSxcbiAgY3JlYXRlQ2FudmFzOiAoXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgKSA9PiB7IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7IHNjYWxlOiBudW1iZXIgfSA9ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICByZXR1cm4geyBjYW52YXMsIHNjYWxlOiBhcHBTdGF0ZS5leHBvcnRTY2FsZSB9O1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIGNvbnN0IHsgY2FudmFzLCBzY2FsZSA9IDEgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcblxuICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcblxuICBjb25zdCB7IGltYWdlQ2FjaGUgfSA9IGF3YWl0IHVwZGF0ZUltYWdlQ2FjaGUoe1xuICAgIGltYWdlQ2FjaGU6IG5ldyBNYXAoKSxcbiAgICBmaWxlSWRzOiBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMoZWxlbWVudHMpLm1hcChcbiAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGVJZCxcbiAgICApLFxuICAgIGZpbGVzLFxuICB9KTtcblxuICByZW5kZXJTY2VuZSh7XG4gICAgZWxlbWVudHMsXG4gICAgYXBwU3RhdGUsXG4gICAgc2NhbGUsXG4gICAgcmM6IHJvdWdoLmNhbnZhcyhjYW52YXMpLFxuICAgIGNhbnZhcyxcbiAgICByZW5kZXJDb25maWc6IHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczoge30sXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogZmFsc2UsXG4gICAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydGluZzogdHJ1ZSxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gY2FudmFzO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvU3ZnID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIGV4cG9ydFNjYWxlPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgICBleHBvcnRXaXRoRGFya01vZGU/OiBib29sZWFuO1xuICAgIGV4cG9ydEVtYmVkU2NlbmU/OiBib29sZWFuO1xuICB9LFxuICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsLFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcblxuICAvLyBpbml0aWFsaXplIFNWRyByb290XG4gIGNvbnN0IHN2Z1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2ZXJzaW9uXCIsIFwiMS4xXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInhtbG5zXCIsIFNWR19OUyk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRoICogZXhwb3J0U2NhbGV9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodCAqIGV4cG9ydFNjYWxlfWApO1xuICBpZiAoYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlKSB7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIiwgVEhFTUVfRklMVEVSKTtcbiAgfVxuXG4gIGxldCBhc3NldFBhdGggPSBcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vXCI7XG5cbiAgLy8gQXNzZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIG9ubHkgd2hlbiB1c2luZyBwYWNrYWdlXG4gIGlmIChwcm9jZXNzLmVudi5JU19FWENBTElEUkFXX05QTV9QQUNLQUdFKSB7XG4gICAgYXNzZXRQYXRoID1cbiAgICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICAgIGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlBLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfWA7XG5cbiAgICBpZiAoYXNzZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgYXNzZXRQYXRoID0gYXNzZXRQYXRoLnJlcGxhY2UoXCIvXCIsIGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59L2ApO1xuICAgIH1cbiAgICBhc3NldFBhdGggPSBgJHthc3NldFBhdGh9L2Rpc3QvZXhjYWxpZHJhdy1hc3NldHMvYDtcbiAgfVxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofVZpcmdpbC53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJDYXNjYWRpYVwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofUNhc2NhZGlhLndvZmYyXCIpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvZGVmcz5cbiAgYDtcbiAgLy8gcmVuZGVyIGJhY2tncm91bmQgcmVjdFxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgIG9mZnNldFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59O1xuXG4vLyBjYWxjdWxhdGUgc21hbGxlc3QgYXJlYSB0byBmaXQgdGhlIGNvbnRlbnRzIGluXG5jb25zdCBnZXRDYW52YXNTaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGV4cG9ydFBhZGRpbmc6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIGV4cG9ydFBhZGRpbmcgKiAyO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIGV4cG9ydFBhZGRpbmcgKyBleHBvcnRQYWRkaW5nO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXhwb3J0U2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4gIHNjYWxlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgWywgLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChcbiAgICAoZGltZW5zaW9uKSA9PiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKSxcbiAgKTtcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
3325
3325
|
|
|
3326
3326
|
/***/ }),
|
|
3327
3327
|
|
|
@@ -3409,7 +3409,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3409
3409
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3410
3410
|
|
|
3411
3411
|
"use strict";
|
|
3412
|
-
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 open_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./colors */ \"../../colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./keys */ \"../../keys.ts\");\n\n\n\n\n\nlet mockDateTime = null;\nconst setDateTimeForTests = (dateTime) => {\n mockDateTime = dateTime;\n};\nconst getDateTime = () => {\n if (mockDateTime) {\n return mockDateTime;\n }\n const date = new Date();\n const year = date.getFullYear();\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\n const day = `${date.getDate()}`.padStart(2, \"0\");\n const hr = `${date.getHours()}`.padStart(2, \"0\");\n const min = `${date.getMinutes()}`.padStart(2, \"0\");\n return `${year}-${month}-${day}-${hr}${min}`;\n};\nconst capitalizeString = (str) => str.charAt(0).toUpperCase() + str.slice(1);\nconst isToolIcon = (target) => target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\nconst isInputLike = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement;\nconst isWritableElement = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLTextAreaElement ||\n (target instanceof HTMLInputElement &&\n (target.type === \"text\" || target.type === \"number\"));\nconst getFontFamilyString = ({ fontFamily, }) => {\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY)) {\n if (id === fontFamily) {\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT}`;\n }\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT;\n};\n/** returns fontSize+fontFamily string for assignment to DOM elements */\nconst getFontString = ({ fontSize, fontFamily, }) => {\n return `${fontSize}px ${getFontFamilyString({ fontFamily })}`;\n};\nconst debounce = (fn, timeout) => {\n let handle = 0;\n let lastArgs = null;\n const ret = (...args) => {\n lastArgs = args;\n clearTimeout(handle);\n handle = window.setTimeout(() => {\n lastArgs = null;\n fn(...args);\n }, timeout);\n };\n ret.flush = () => {\n clearTimeout(handle);\n if (lastArgs) {\n const _lastArgs = lastArgs;\n lastArgs = null;\n fn(..._lastArgs);\n }\n };\n ret.cancel = () => {\n lastArgs = null;\n clearTimeout(handle);\n };\n return ret;\n};\n// throttle callback to execute once per animation frame\nconst throttleRAF = (fn, opts) => {\n let timerId = null;\n let lastArgs = null;\n let lastArgsTrailing = null;\n const scheduleFunc = (args) => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n fn(...args);\n lastArgs = null;\n if (lastArgsTrailing) {\n lastArgs = lastArgsTrailing;\n lastArgsTrailing = null;\n scheduleFunc(lastArgs);\n }\n });\n };\n const ret = (...args) => {\n if (false) {}\n lastArgs = args;\n if (timerId === null) {\n scheduleFunc(lastArgs);\n }\n else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\n lastArgsTrailing = args;\n }\n };\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n if (lastArgs) {\n fn(...(lastArgsTrailing || lastArgs));\n lastArgs = lastArgsTrailing = null;\n }\n };\n ret.cancel = () => {\n lastArgs = lastArgsTrailing = null;\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n return ret;\n};\n// https://github.com/lodash/lodash/blob/es/chunk.js\nconst chunk = (array, size) => {\n if (!array.length || size < 1) {\n return [];\n }\n let index = 0;\n let resIndex = 0;\n const result = Array(Math.ceil(array.length / size));\n while (index < array.length) {\n result[resIndex++] = array.slice(index, (index += size));\n }\n return result;\n};\nconst selectNode = (node) => {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n};\nconst removeSelection = () => {\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n};\nconst distance = (x, y) => Math.abs(x - y);\nconst updateActiveTool = (appState, data) => {\n if (data.type === \"custom\") {\n return Object.assign(Object.assign({}, appState.activeTool), { type: \"custom\", customType: data.customType });\n }\n return Object.assign(Object.assign({}, appState.activeTool), { lastActiveToolBeforeEraser: data.lastActiveToolBeforeEraser === undefined\n ? appState.activeTool.lastActiveToolBeforeEraser\n : data.lastActiveToolBeforeEraser, type: data.type, customType: null });\n};\nconst resetCursor = (canvas) => {\n if (canvas) {\n canvas.style.cursor = \"\";\n }\n};\nconst setCursor = (canvas, cursor) => {\n if (canvas) {\n canvas.style.cursor = cursor;\n }\n};\nlet eraserCanvasCache;\nlet previewDataURL;\nconst setEraserCursor = (canvas, theme) => {\n const cursorImageSizePx = 20;\n const drawCanvas = () => {\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_2__.THEME.DARK;\n eraserCanvasCache = document.createElement(\"canvas\");\n eraserCanvasCache.theme = theme;\n eraserCanvasCache.height = cursorImageSizePx;\n eraserCanvasCache.width = cursorImageSizePx;\n const context = eraserCanvasCache.getContext(\"2d\");\n context.lineWidth = 1;\n context.beginPath();\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.black : open_color__WEBPACK_IMPORTED_MODULE_0__.white;\n context.fill();\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.white : open_color__WEBPACK_IMPORTED_MODULE_0__.black;\n context.stroke();\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_2__.MIME_TYPES.svg);\n };\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\n drawCanvas();\n }\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\n};\nconst setCursorForShape = (canvas, appState) => {\n if (!canvas) {\n return;\n }\n if (appState.activeTool.type === \"selection\") {\n resetCursor(canvas);\n }\n else if (appState.activeTool.type === \"eraser\") {\n setEraserCursor(canvas, appState.theme);\n // do nothing if image tool is selected which suggests there's\n // a image-preview set as the cursor\n // Ignore custom type as well and let host decide\n }\n else if (![\"image\", \"custom\"].includes(appState.activeTool.type)) {\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.CROSSHAIR;\n }\n};\nconst isFullScreen = () => { var _a; return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \"HTML\"; };\nconst allowFullScreen = () => document.documentElement.requestFullscreen();\nconst exitFullScreen = () => document.exitFullscreen();\nconst getShortcutKey = (shortcut) => {\n shortcut = shortcut\n .replace(/\\bAlt\\b/i, \"Alt\")\n .replace(/\\bShift\\b/i, \"Shift\")\n .replace(/\\b(Enter|Return)\\b/i, \"Enter\")\n .replace(/\\bDel\\b/i, \"Delete\");\n if (_keys__WEBPACK_IMPORTED_MODULE_4__.isDarwin) {\n return shortcut\n .replace(/\\bCtrlOrCmd\\b/i, \"Cmd\")\n .replace(/\\bAlt\\b/i, \"Option\");\n }\n return shortcut.replace(/\\bCtrlOrCmd\\b/i, \"Ctrl\");\n};\nconst viewportCoordsToSceneCoords = ({ clientX, clientY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const invScale = 1 / zoom.value;\n const x = (clientX - offsetLeft) * invScale - scrollX;\n const y = (clientY - offsetTop) * invScale - scrollY;\n return { x, y };\n};\nconst sceneCoordsToViewportCoords = ({ sceneX, sceneY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return { x, y };\n};\nconst getGlobalCSSVariable = (name) => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" +\n \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\n/**\n * Checks whether first directional character is RTL. Meaning whether it starts\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\n * RTL.\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\n */\nconst isRTL = (text) => RE_RTL_CHECK.test(text);\nconst tupleToCoors = (xyTuple) => {\n const [x, y] = xyTuple;\n return { x, y };\n};\n/** use as a rejectionHandler to mute filesystem Abort errors */\nconst muteFSAbortError = (error) => {\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\n console.warn(error);\n return;\n }\n throw error;\n};\nconst findIndex = (array, cb, fromIndex = 0) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst isTransparent = (color) => {\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n return (isRGBTransparent ||\n isRRGGBBTransparent ||\n color === _colors__WEBPACK_IMPORTED_MODULE_1__[\"default\"].elementBackground[0]);\n};\nconst resolvablePromise = () => {\n let resolve;\n let reject;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n promise.resolve = resolve;\n promise.reject = reject;\n return promise;\n};\n/**\n * @param func handler taking at most single parameter (event).\n */\nconst withBatchedUpdates = (func) => ((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n});\n/**\n * barches React state updates and throttles the calls to a single call per\n * animation frame\n */\nconst withBatchedUpdatesThrottled = (func) => {\n // @ts-ignore\n return throttleRAF(((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n }));\n};\n//https://stackoverflow.com/a/9462382/8418\nconst nFormatter = (num, digits) => {\n const si = [\n { value: 1, symbol: \"b\" },\n { value: 1e3, symbol: \"k\" },\n { value: 1e6, symbol: \"M\" },\n { value: 1e9, symbol: \"G\" },\n ];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n for (index = si.length - 1; index > 0; index--) {\n if (num >= si[index].value) {\n break;\n }\n }\n return ((num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol);\n};\nconst getVersion = () => {\n var _a;\n return (((_a = document.querySelector('meta[name=\"version\"]')) === null || _a === void 0 ? void 0 : _a.content) ||\n _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_VERSION);\n};\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\nconst supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return false;\n }\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\";\n // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\nconst getNearestScrollableContainer = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n const { overflowY } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n if (hasScrollableContent &&\n (overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n overflowY === \"overlay\")) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document;\n};\nconst focusNearestParent = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n parent = parent.parentElement;\n }\n};\nconst preventUnload = (event) => {\n event.preventDefault();\n // NOTE: modern browsers no longer allow showing a custom message here\n event.returnValue = \"\";\n};\nconst bytesToHexString = (bytes) => {\n return Array.from(bytes)\n .map((byte) => `0${byte.toString(16)}`.slice(-2))\n .join(\"\");\n};\nconst getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\nconst arrayToMap = (items) => {\n return items.reduce((acc, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\nconst isTestEnv = () => { var _a; 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\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.13.0-c8f6e3f\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"test\"; };\nconst isProdEnv = () => { var _a; 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\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.13.0-c8f6e3f\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"production\"; };\nconst wrapEvent = (name, nativeEvent) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent,\n },\n cancelable: true,\n });\n};\nconst updateObject = (obj, updates) => {\n let didChange = false;\n for (const key in updates) {\n const value = updates[key];\n if (typeof value !== \"undefined\") {\n if (obj[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)) {\n continue;\n }\n didChange = true;\n }\n }\n if (!didChange) {\n return obj;\n }\n return Object.assign(Object.assign({}, obj), updates);\n};\nconst isPrimitive = (val) => {\n const type = typeof val;\n return val == null || (type !== \"object\" && type !== \"function\");\n};\nconst getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n }\n catch (error) {\n return \"iframe\";\n }\n};\nconst isPromiseLike = (value) => {\n return (!!value &&\n typeof value === \"object\" &&\n \"then\" in value &&\n \"catch\" in value &&\n \"finally\" in value);\n};\nconst queryFocusableElements = (container) => {\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\n return focusableElements\n ? Array.from(focusableElements).filter((element) => element.tabIndex > -1 && !element.disabled)\n : [];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFFBQVEsSUFBSSxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUM7QUFDbkUsQ0FBQyxDQUFDO0FBRUssTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFO0lBQzNCLElBQUk7UUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7S0FDdEQ7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLE9BQU8sUUFBUSxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQyxDQUFDO0FBRUssTUFBTSxhQUFhLEdBQUcsQ0FDM0IsS0FBVSxFQUNzQyxFQUFFO0lBQ2xELE9BQU8sQ0FDTCxDQUFDLENBQUMsS0FBSztRQUNQLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsTUFBTSxJQUFJLEtBQUs7UUFDZixPQUFPLElBQUksS0FBSztRQUNoQixTQUFTLElBQUksS0FBSyxDQUNuQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUssTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFNBQTZCLEVBQUUsRUFBRTtJQUN0RSxNQUFNLGlCQUFpQixHQUFHLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxnQkFBZ0IsQ0FDbkQsb0VBQW9FLENBQ3JFLENBQUM7SUFFRixPQUFPLGlCQUFpQjtRQUN0QixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNWLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBRSxPQUE0QixDQUFDLFFBQVEsQ0FDbkU7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ1QsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3V0aWxzLnRzPzc2M2EiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9jIGZyb20gXCJvcGVuLWNvbG9yXCI7XG5cbmltcG9ydCBjb2xvcnMgZnJvbSBcIi4vY29sb3JzXCI7XG5pbXBvcnQge1xuICBDVVJTT1JfVFlQRSxcbiAgREVGQVVMVF9WRVJTSU9OLFxuICBFVkVOVCxcbiAgRk9OVF9GQU1JTFksXG4gIE1JTUVfVFlQRVMsXG4gIFRIRU1FLFxuICBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRm9udEZhbWlseVZhbHVlcywgRm9udFN0cmluZyB9IGZyb20gXCIuL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlLCBEYXRhVVJMLCBMYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciwgWm9vbSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IGlzRGFyd2luIH0gZnJvbSBcIi4va2V5c1wiO1xuaW1wb3J0IHsgU0hBUEVTIH0gZnJvbSBcIi4vc2hhcGVzXCI7XG5cbmxldCBtb2NrRGF0ZVRpbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgY29uc3Qgc2V0RGF0ZVRpbWVGb3JUZXN0cyA9IChkYXRlVGltZTogc3RyaW5nKSA9PiB7XG4gIG1vY2tEYXRlVGltZSA9IGRhdGVUaW1lO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGVUaW1lID0gKCkgPT4ge1xuICBpZiAobW9ja0RhdGVUaW1lKSB7XG4gICAgcmV0dXJuIG1vY2tEYXRlVGltZTtcbiAgfVxuXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBtb250aCA9IGAke2RhdGUuZ2V0TW9udGgoKSArIDF9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IGRheSA9IGAke2RhdGUuZ2V0RGF0ZSgpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBociA9IGAke2RhdGUuZ2V0SG91cnMoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgbWluID0gYCR7ZGF0ZS5nZXRNaW51dGVzKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG5cbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fS0ke2hyfSR7bWlufWA7XG59O1xuXG5leHBvcnQgY29uc3QgY2FwaXRhbGl6ZVN0cmluZyA9IChzdHI6IHN0cmluZykgPT5cbiAgc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xuXG5leHBvcnQgY29uc3QgaXNUb29sSWNvbiA9IChcbiAgdGFyZ2V0OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQgfCBudWxsLFxuKTogdGFyZ2V0IGlzIEhUTUxFbGVtZW50ID0+XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5jbGFzc05hbWUuaW5jbHVkZXMoXCJUb29sSWNvblwiKTtcblxuZXhwb3J0IGNvbnN0IGlzSW5wdXRMaWtlID0gKFxuICB0YXJnZXQ6IEVsZW1lbnQgfCBFdmVudFRhcmdldCB8IG51bGwsXG4pOiB0YXJnZXQgaXNcbiAgfCBIVE1MSW5wdXRFbGVtZW50XG4gIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICB8IEhUTUxTZWxlY3RFbGVtZW50XG4gIHwgSFRNTEJSRWxlbWVudFxuICB8IEhUTUxEaXZFbGVtZW50ID0+XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuZGF0YXNldC50eXBlID09PSBcInd5c2l3eWdcIikgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50O1xuXG5leHBvcnQgY29uc3QgaXNXcml0YWJsZUVsZW1lbnQgPSAoXG4gIHRhcmdldDogRWxlbWVudCB8IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbik6IHRhcmdldCBpc1xuICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgfCBIVE1MVGV4dEFyZWFFbGVtZW50XG4gIHwgSFRNTEJSRWxlbWVudFxuICB8IEhUTUxEaXZFbGVtZW50ID0+XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuZGF0YXNldC50eXBlID09PSBcInd5c2l3eWdcIikgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fFxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICh0YXJnZXQudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgdGFyZ2V0LnR5cGUgPT09IFwibnVtYmVyXCIpKTtcblxuZXhwb3J0IGNvbnN0IGdldEZvbnRGYW1pbHlTdHJpbmcgPSAoe1xuICBmb250RmFtaWx5LFxufToge1xuICBmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzO1xufSkgPT4ge1xuICBmb3IgKGNvbnN0IFtmb250RmFtaWx5U3RyaW5nLCBpZF0gb2YgT2JqZWN0LmVudHJpZXMoRk9OVF9GQU1JTFkpKSB7XG4gICAgaWYgKGlkID09PSBmb250RmFtaWx5KSB7XG4gICAgICByZXR1cm4gYCR7Zm9udEZhbWlseVN0cmluZ30sICR7V0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQ7XG59O1xuXG4vKiogcmV0dXJucyBmb250U2l6ZStmb250RmFtaWx5IHN0cmluZyBmb3IgYXNzaWdubWVudCB0byBET00gZWxlbWVudHMgKi9cbmV4cG9ydCBjb25zdCBnZXRGb250U3RyaW5nID0gKHtcbiAgZm9udFNpemUsXG4gIGZvbnRGYW1pbHksXG59OiB7XG4gIGZvbnRTaXplOiBudW1iZXI7XG4gIGZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG59KSA9PiB7XG4gIHJldHVybiBgJHtmb250U2l6ZX1weCAke2dldEZvbnRGYW1pbHlTdHJpbmcoeyBmb250RmFtaWx5IH0pfWAgYXMgRm9udFN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IDxUIGV4dGVuZHMgYW55W10+KFxuICBmbjogKC4uLmFyZ3M6IFQpID0+IHZvaWQsXG4gIHRpbWVvdXQ6IG51bWJlcixcbikgPT4ge1xuICBsZXQgaGFuZGxlID0gMDtcbiAgbGV0IGxhc3RBcmdzOiBUIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IHJldCA9ICguLi5hcmdzOiBUKSA9PiB7XG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIGhhbmRsZSA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgIH0sIHRpbWVvdXQpO1xuICB9O1xuICByZXQuZmx1c2ggPSAoKSA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBjb25zdCBfbGFzdEFyZ3MgPSBsYXN0QXJncztcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGZuKC4uLl9sYXN0QXJncyk7XG4gICAgfVxuICB9O1xuICByZXQuY2FuY2VsID0gKCkgPT4ge1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIHRocm90dGxlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgb25jZSBwZXIgYW5pbWF0aW9uIGZyYW1lXG5leHBvcnQgY29uc3QgdGhyb3R0bGVSQUYgPSA8VCBleHRlbmRzIGFueVtdPihcbiAgZm46ICguLi5hcmdzOiBUKSA9PiB2b2lkLFxuICBvcHRzPzogeyB0cmFpbGluZz86IGJvb2xlYW4gfSxcbikgPT4ge1xuICBsZXQgdGltZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGxldCBsYXN0QXJnczogVCB8IG51bGwgPSBudWxsO1xuICBsZXQgbGFzdEFyZ3NUcmFpbGluZzogVCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHNjaGVkdWxlRnVuYyA9IChhcmdzOiBUKSA9PiB7XG4gICAgdGltZXJJZCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGlmIChsYXN0QXJnc1RyYWlsaW5nKSB7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdEFyZ3NUcmFpbGluZztcbiAgICAgICAgbGFzdEFyZ3NUcmFpbGluZyA9IG51bGw7XG4gICAgICAgIHNjaGVkdWxlRnVuYyhsYXN0QXJncyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcmV0ID0gKC4uLmFyZ3M6IFQpID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGlmICh0aW1lcklkID09PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgIH0gZWxzZSBpZiAob3B0cz8udHJhaWxpbmcpIHtcbiAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBhcmdzO1xuICAgIH1cbiAgfTtcbiAgcmV0LmZsdXNoID0gKCkgPT4ge1xuICAgIGlmICh0aW1lcklkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aW1lcklkKTtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobGFzdEFyZ3MpIHtcbiAgICAgIGZuKC4uLihsYXN0QXJnc1RyYWlsaW5nIHx8IGxhc3RBcmdzKSk7XG4gICAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0LmNhbmNlbCA9ICgpID0+IHtcbiAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgIGlmICh0aW1lcklkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aW1lcklkKTtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvZXMvY2h1bmsuanNcbmV4cG9ydCBjb25zdCBjaHVuayA9IDxUIGV4dGVuZHMgYW55PihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgc2l6ZTogbnVtYmVyLFxuKTogVFtdW10gPT4ge1xuICBpZiAoIWFycmF5Lmxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgcmVzSW5kZXggPSAwO1xuICBjb25zdCByZXN1bHQgPSBBcnJheShNYXRoLmNlaWwoYXJyYXkubGVuZ3RoIC8gc2l6ZSkpO1xuICB3aGlsZSAoaW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBhcnJheS5zbGljZShpbmRleCwgKGluZGV4ICs9IHNpemUpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdE5vZGUgPSAobm9kZTogRWxlbWVudCkgPT4ge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIGlmIChzZWxlY3Rpb24pIHtcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKG5vZGUpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlU2VsZWN0aW9uID0gKCkgPT4ge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIGlmIChzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkaXN0YW5jZSA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gTWF0aC5hYnMoeCAtIHkpO1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQWN0aXZlVG9vbCA9IChcbiAgYXBwU3RhdGU6IFBpY2s8QXBwU3RhdGUsIFwiYWN0aXZlVG9vbFwiPixcbiAgZGF0YTogKFxuICAgIHwgeyB0eXBlOiB0eXBlb2YgU0hBUEVTW251bWJlcl1bXCJ2YWx1ZVwiXSB8IFwiZXJhc2VyXCIgfVxuICAgIHwgeyB0eXBlOiBcImN1c3RvbVwiOyBjdXN0b21UeXBlOiBzdHJpbmcgfVxuICApICYgeyBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcj86IExhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyIH0sXG4pOiBBcHBTdGF0ZVtcImFjdGl2ZVRvb2xcIl0gPT4ge1xuICBpZiAoZGF0YS50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgY3VzdG9tVHlwZTogZGF0YS5jdXN0b21UeXBlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgbGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXI6XG4gICAgICBkYXRhLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBhcHBTdGF0ZS5hY3RpdmVUb29sLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyXG4gICAgICAgIDogZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcixcbiAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgY3VzdG9tVHlwZTogbnVsbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNldEN1cnNvciA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDdXJzb3IgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsIGN1cnNvcjogc3RyaW5nKSA9PiB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xuXG5sZXQgZXJhc2VyQ2FudmFzQ2FjaGU6IGFueTtcbmxldCBwcmV2aWV3RGF0YVVSTDogc3RyaW5nO1xuZXhwb3J0IGNvbnN0IHNldEVyYXNlckN1cnNvciA9IChcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gIHRoZW1lOiBBcHBTdGF0ZVtcInRoZW1lXCJdLFxuKSA9PiB7XG4gIGNvbnN0IGN1cnNvckltYWdlU2l6ZVB4ID0gMjA7XG5cbiAgY29uc3QgZHJhd0NhbnZhcyA9ICgpID0+IHtcbiAgICBjb25zdCBpc0RhcmtUaGVtZSA9IHRoZW1lID09PSBUSEVNRS5EQVJLO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSA9IHRoZW1lO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgY29uc3QgY29udGV4dCA9IGVyYXNlckNhbnZhc0NhY2hlLmdldENvbnRleHQoXCIyZFwiKSE7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5hcmMoXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS53aWR0aCAvIDIsXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS5oZWlnaHQgLyAyLFxuICAgICAgNSxcbiAgICAgIDAsXG4gICAgICAyICogTWF0aC5QSSxcbiAgICApO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy5ibGFjayA6IG9jLndoaXRlO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBpc0RhcmtUaGVtZSA/IG9jLndoaXRlIDogb2MuYmxhY2s7XG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgICBwcmV2aWV3RGF0YVVSTCA9IGVyYXNlckNhbnZhc0NhY2hlLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2ZykgYXMgRGF0YVVSTDtcbiAgfTtcbiAgaWYgKCFlcmFzZXJDYW52YXNDYWNoZSB8fCBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSAhPT0gdGhlbWUpIHtcbiAgICBkcmF3Q2FudmFzKCk7XG4gIH1cblxuICBzZXRDdXJzb3IoXG4gICAgY2FudmFzLFxuICAgIGB1cmwoJHtwcmV2aWV3RGF0YVVSTH0pICR7Y3Vyc29ySW1hZ2VTaXplUHggLyAyfSAke1xuICAgICAgY3Vyc29ySW1hZ2VTaXplUHggLyAyXG4gICAgfSwgYXV0b2AsXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yRm9yU2hhcGUgPSAoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gIH0gZWxzZSBpZiAoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImVyYXNlclwiKSB7XG4gICAgc2V0RXJhc2VyQ3Vyc29yKGNhbnZhcywgYXBwU3RhdGUudGhlbWUpO1xuICAgIC8vIGRvIG5vdGhpbmcgaWYgaW1hZ2UgdG9vbCBpcyBzZWxlY3RlZCB3aGljaCBzdWdnZXN0cyB0aGVyZSdzXG4gICAgLy8gYSBpbWFnZS1wcmV2aWV3IHNldCBhcyB0aGUgY3Vyc29yXG4gICAgLy8gSWdub3JlIGN1c3RvbSB0eXBlIGFzIHdlbGwgYW5kIGxldCBob3N0IGRlY2lkZVxuICB9IGVsc2UgaWYgKCFbXCJpbWFnZVwiLCBcImN1c3RvbVwiXS5pbmNsdWRlcyhhcHBTdGF0ZS5hY3RpdmVUb29sLnR5cGUpKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IENVUlNPUl9UWVBFLkNST1NTSEFJUjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGlzRnVsbFNjcmVlbiA9ICgpID0+XG4gIGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50Py5ub2RlTmFtZSA9PT0gXCJIVE1MXCI7XG5cbmV4cG9ydCBjb25zdCBhbGxvd0Z1bGxTY3JlZW4gPSAoKSA9PlxuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcblxuZXhwb3J0IGNvbnN0IGV4aXRGdWxsU2NyZWVuID0gKCkgPT4gZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcblxuZXhwb3J0IGNvbnN0IGdldFNob3J0Y3V0S2V5ID0gKHNob3J0Y3V0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBzaG9ydGN1dCA9IHNob3J0Y3V0XG4gICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIkFsdFwiKVxuICAgIC5yZXBsYWNlKC9cXGJTaGlmdFxcYi9pLCBcIlNoaWZ0XCIpXG4gICAgLnJlcGxhY2UoL1xcYihFbnRlcnxSZXR1cm4pXFxiL2ksIFwiRW50ZXJcIilcbiAgICAucmVwbGFjZSgvXFxiRGVsXFxiL2ksIFwiRGVsZXRlXCIpO1xuXG4gIGlmIChpc0Rhcndpbikge1xuICAgIHJldHVybiBzaG9ydGN1dFxuICAgICAgLnJlcGxhY2UoL1xcYkN0cmxPckNtZFxcYi9pLCBcIkNtZFwiKVxuICAgICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIk9wdGlvblwiKTtcbiAgfVxuICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2ksIFwiQ3RybFwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMgPSAoXG4gIHsgY2xpZW50WCwgY2xpZW50WSB9OiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0sXG4gIHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWSxcbiAgfToge1xuICAgIHpvb206IFpvb207XG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICAgIG9mZnNldFRvcDogbnVtYmVyO1xuICAgIHNjcm9sbFg6IG51bWJlcjtcbiAgICBzY3JvbGxZOiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgaW52U2NhbGUgPSAxIC8gem9vbS52YWx1ZTtcbiAgY29uc3QgeCA9IChjbGllbnRYIC0gb2Zmc2V0TGVmdCkgKiBpbnZTY2FsZSAtIHNjcm9sbFg7XG4gIGNvbnN0IHkgPSAoY2xpZW50WSAtIG9mZnNldFRvcCkgKiBpbnZTY2FsZSAtIHNjcm9sbFk7XG5cbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyA9IChcbiAgeyBzY2VuZVgsIHNjZW5lWSB9OiB7IHNjZW5lWDogbnVtYmVyOyBzY2VuZVk6IG51bWJlciB9LFxuICB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFksXG4gIH06IHtcbiAgICB6b29tOiBab29tO1xuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgICBzY3JvbGxYOiBudW1iZXI7XG4gICAgc2Nyb2xsWTogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHggPSAoc2NlbmVYICsgc2Nyb2xsWCkgKiB6b29tLnZhbHVlICsgb2Zmc2V0TGVmdDtcbiAgY29uc3QgeSA9IChzY2VuZVkgKyBzY3JvbGxZKSAqIHpvb20udmFsdWUgKyBvZmZzZXRUb3A7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHbG9iYWxDU1NWYXJpYWJsZSA9IChuYW1lOiBzdHJpbmcpID0+XG4gIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKGAtLSR7bmFtZX1gKTtcblxuY29uc3QgUlNfTFRSX0NIQVJTID1cbiAgXCJBLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyQjhcXHUwMzAwLVxcdTA1OTBcXHUwODAwLVxcdTFGRkZcIiArXG4gIFwiXFx1MkMwMC1cXHVGQjFDXFx1RkRGRS1cXHVGRTZGXFx1RkVGRC1cXHVGRkZGXCI7XG5jb25zdCBSU19SVExfQ0hBUlMgPSBcIlxcdTA1OTEtXFx1MDdGRlxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ1wiO1xuY29uc3QgUkVfUlRMX0NIRUNLID0gbmV3IFJlZ0V4cChgXlteJHtSU19MVFJfQ0hBUlN9XSpbJHtSU19SVExfQ0hBUlN9XWApO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBmaXJzdCBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIgaXMgUlRMLiBNZWFuaW5nIHdoZXRoZXIgaXQgc3RhcnRzXG4gKiAgd2l0aCBSVEwgY2hhcmFjdGVycywgb3IgaW5kZXRlcm1pbmF0ZSAobnVtYmVycyBldGMuKSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5XG4gKiAgUlRMLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC8xNzIyI2Rpc2N1c3Npb25fcjQzNjM0MDE3MVxuICovXG5leHBvcnQgY29uc3QgaXNSVEwgPSAodGV4dDogc3RyaW5nKSA9PiBSRV9SVExfQ0hFQ0sudGVzdCh0ZXh0KTtcblxuZXhwb3J0IGNvbnN0IHR1cGxlVG9Db29ycyA9IChcbiAgeHlUdXBsZTogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSxcbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IFt4LCB5XSA9IHh5VHVwbGU7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbi8qKiB1c2UgYXMgYSByZWplY3Rpb25IYW5kbGVyIHRvIG11dGUgZmlsZXN5c3RlbSBBYm9ydCBlcnJvcnMgKi9cbmV4cG9ydCBjb25zdCBtdXRlRlNBYm9ydEVycm9yID0gKGVycm9yPzogRXJyb3IpID0+IHtcbiAgaWYgKGVycm9yPy5uYW1lID09PSBcIkFib3J0RXJyb3JcIikge1xuICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IGVycm9yO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRJbmRleCA9IDxUPihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgY2I6IChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogcmVhZG9ubHkgVFtdKSA9PiBib29sZWFuLFxuICBmcm9tSW5kZXg6IG51bWJlciA9IDAsXG4pID0+IHtcbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cbiAgZnJvbUluZGV4ID0gTWF0aC5taW4oYXJyYXkubGVuZ3RoLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4IC0gMTtcbiAgd2hpbGUgKCsraW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICBpZiAoY2IoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kTGFzdEluZGV4ID0gPFQ+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBjYjogKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiByZWFkb25seSBUW10pID0+IGJvb2xlYW4sXG4gIGZyb21JbmRleDogbnVtYmVyID0gYXJyYXkubGVuZ3RoIC0gMSxcbikgPT4ge1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgd2hpbGUgKC0taW5kZXggPiAtMSkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVHJhbnNwYXJlbnQgPSAoY29sb3I6IHN0cmluZykgPT4ge1xuICBjb25zdCBpc1JHQlRyYW5zcGFyZW50ID0gY29sb3IubGVuZ3RoID09PSA1ICYmIGNvbG9yLnN1YnN0cig0LCAxKSA9PT0gXCIwXCI7XG4gIGNvbnN0IGlzUlJHR0JCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDkgJiYgY29sb3Iuc3Vic3RyKDcsIDIpID09PSBcIjAwXCI7XG4gIHJldHVybiAoXG4gICAgaXNSR0JUcmFuc3BhcmVudCB8fFxuICAgIGlzUlJHR0JCVHJhbnNwYXJlbnQgfHxcbiAgICBjb2xvciA9PT0gY29sb3JzLmVsZW1lbnRCYWNrZ3JvdW5kWzBdXG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBSZXNvbHZhYmxlUHJvbWlzZTxUPiA9IFByb21pc2U8VD4gJiB7XG4gIHJlc29sdmU6IFtUXSBleHRlbmRzIFt1bmRlZmluZWRdID8gKHZhbHVlPzogVCkgPT4gdm9pZCA6ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcbmV4cG9ydCBjb25zdCByZXNvbHZhYmxlUHJvbWlzZSA9IDxUPigpID0+IHtcbiAgbGV0IHJlc29sdmUhOiBhbnk7XG4gIGxldCByZWplY3QhOiBhbnk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIChwcm9taXNlIGFzIGFueSkucmVzb2x2ZSA9IHJlc29sdmU7XG4gIChwcm9taXNlIGFzIGFueSkucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZSBhcyBSZXNvbHZhYmxlUHJvbWlzZTxUPjtcbn07XG5cbi8qKlxuICogQHBhcmFtIGZ1bmMgaGFuZGxlciB0YWtpbmcgYXQgbW9zdCBzaW5nbGUgcGFyYW1ldGVyIChldmVudCkuXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXMgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PlxuICAoKGV2ZW50KSA9PiB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYyBhcyBURnVuY3Rpb24sIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uO1xuXG4vKipcbiAqIGJhcmNoZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBhbmQgdGhyb3R0bGVzIHRoZSBjYWxscyB0byBhIHNpbmdsZSBjYWxsIHBlclxuICogYW5pbWF0aW9uIGZyYW1lXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PiB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIHRocm90dGxlUkFGPFBhcmFtZXRlcnM8VEZ1bmN0aW9uPj4oKChldmVudCkgPT4ge1xuICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmMsIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uKTtcbn07XG5cbi8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuZXhwb3J0IGNvbnN0IG5Gb3JtYXR0ZXIgPSAobnVtOiBudW1iZXIsIGRpZ2l0czogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc2kgPSBbXG4gICAgeyB2YWx1ZTogMSwgc3ltYm9sOiBcImJcIiB9LFxuICAgIHsgdmFsdWU6IDFlMywgc3ltYm9sOiBcImtcIiB9LFxuICAgIHsgdmFsdWU6IDFlNiwgc3ltYm9sOiBcIk1cIiB9LFxuICAgIHsgdmFsdWU6IDFlOSwgc3ltYm9sOiBcIkdcIiB9LFxuICBdO1xuICBjb25zdCByeCA9IC9cXC4wKyR8KFxcLlswLTldKlsxLTldKTArJC87XG4gIGxldCBpbmRleDtcbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICAobnVtIC8gc2lbaW5kZXhdLnZhbHVlKS50b0ZpeGVkKGRpZ2l0cykucmVwbGFjZShyeCwgXCIkMVwiKSArIHNpW2luZGV4XS5zeW1ib2xcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTE1ldGFFbGVtZW50PignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8XG4gICAgREVGQVVMVF9WRVJTSU9OXG4gICk7XG59O1xuXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvYmxvYi9tYXN0ZXIvZmVhdHVyZS1kZXRlY3RzL2Vtb2ppLmpzXG5leHBvcnQgY29uc3Qgc3VwcG9ydHNFbW9qaSA9ICgpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qgb2Zmc2V0ID0gMTI7XG4gIGN0eC5maWxsU3R5bGUgPSBcIiNmMDBcIjtcbiAgY3R4LnRleHRCYXNlbGluZSA9IFwidG9wXCI7XG4gIGN0eC5mb250ID0gXCIzMnB4IEFyaWFsXCI7XG4gIC8vIE1vZGVybml6ciB1c2VkIPCfkKgsIGJ1dCBpdCBpcyBzb3J0IG9mIHN1cHBvcnRlZCBvbiBXaW5kb3dzIDcuXG4gIC8vIEx1Y2tpbHkg8J+YgCBpc24ndCBzdXBwb3J0ZWQuXG4gIGN0eC5maWxsVGV4dChcIvCfmIBcIiwgMCwgMCk7XG4gIHJldHVybiBjdHguZ2V0SW1hZ2VEYXRhKG9mZnNldCwgb2Zmc2V0LCAxLCAxKS5kYXRhWzBdICE9PSAwO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbik6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudCA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIH1cbiAgICBjb25zdCB7IG92ZXJmbG93WSB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50KTtcbiAgICBjb25zdCBoYXNTY3JvbGxhYmxlQ29udGVudCA9IHBhcmVudC5zY3JvbGxIZWlnaHQgPiBwYXJlbnQuY2xpZW50SGVpZ2h0O1xuICAgIGlmIChcbiAgICAgIGhhc1Njcm9sbGFibGVDb250ZW50ICYmXG4gICAgICAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fFxuICAgICAgICBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHxcbiAgICAgICAgb3ZlcmZsb3dZID09PSBcIm92ZXJsYXlcIilcbiAgICApIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBkb2N1bWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBmb2N1c05lYXJlc3RQYXJlbnQgPSAoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudC50YWJJbmRleCA+IC0xKSB7XG4gICAgICBwYXJlbnQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwcmV2ZW50VW5sb2FkID0gKGV2ZW50OiBCZWZvcmVVbmxvYWRFdmVudCkgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBOT1RFOiBtb2Rlcm4gYnJvd3NlcnMgbm8gbG9uZ2VyIGFsbG93IHNob3dpbmcgYSBjdXN0b20gbWVzc2FnZSBoZXJlXG4gIGV2ZW50LnJldHVyblZhbHVlID0gXCJcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBieXRlc1RvSGV4U3RyaW5nID0gKGJ5dGVzOiBVaW50OEFycmF5KSA9PiB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKVxuICAgIC5tYXAoKGJ5dGUpID0+IGAwJHtieXRlLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC0yKSlcbiAgICAuam9pbihcIlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVcGRhdGVkVGltZXN0YW1wID0gKCkgPT4gKGlzVGVzdEVudigpID8gMSA6IERhdGUubm93KCkpO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGBpZGAgYXR0cmlidXRlLFxuICogb3IgYXJyYXkgb2YgaWRzIChzdHJpbmdzKSwgaW50byBhIE1hcCwga2V5ZCBieSBgaWRgLlxuICovXG5leHBvcnQgY29uc3QgYXJyYXlUb01hcCA9IDxUIGV4dGVuZHMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmc+KFxuICBpdGVtczogcmVhZG9ubHkgVFtdLFxuKSA9PiB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYzogTWFwPHN0cmluZywgVD4sIGVsZW1lbnQpID0+IHtcbiAgICBhY2Muc2V0KHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiID8gZWxlbWVudCA6IGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIG5ldyBNYXAoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUZXN0RW52ID0gKCkgPT5cbiAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInRlc3RcIjtcblxuZXhwb3J0IGNvbnN0IGlzUHJvZEVudiA9ICgpID0+XG4gIHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCB3cmFwRXZlbnQgPSA8VCBleHRlbmRzIEV2ZW50PihuYW1lOiBFVkVOVCwgbmF0aXZlRXZlbnQ6IFQpID0+IHtcbiAgcmV0dXJuIG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG4gICAgZGV0YWlsOiB7XG4gICAgICBuYXRpdmVFdmVudCxcbiAgICB9LFxuICAgIGNhbmNlbGFibGU6IHRydWUsXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU9iamVjdCA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9iajogVCxcbiAgdXBkYXRlczogUGFydGlhbDxUPixcbik6IFQgPT4ge1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9ICh1cGRhdGVzIGFzIGFueSlba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChvYmogYXMgYW55KVtrZXldID09PSB2YWx1ZSAmJlxuICAgICAgICAvLyBpZiBvYmplY3QsIGFsd2F5cyB1cGRhdGUgYmVjYXVzZSBpdHMgYXR0cnMgY291bGQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ub2JqLFxuICAgIC4uLnVwZGF0ZXMsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAodmFsOiBhbnkpID0+IHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCAodHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcImZ1bmN0aW9uXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZyYW1lID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cuc2VsZiA9PT0gd2luZG93LnRvcCA/IFwidG9wXCIgOiBcImlmcmFtZVwiO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBcImlmcmFtZVwiO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcm9taXNlTGlrZSA9IChcbiAgdmFsdWU6IGFueSxcbik6IHZhbHVlIGlzIFByb21pc2U8UmVzb2x1dGlvblR5cGU8dHlwZW9mIHZhbHVlPj4gPT4ge1xuICByZXR1cm4gKFxuICAgICEhdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcInRoZW5cIiBpbiB2YWx1ZSAmJlxuICAgIFwiY2F0Y2hcIiBpbiB2YWx1ZSAmJlxuICAgIFwiZmluYWxseVwiIGluIHZhbHVlXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgcXVlcnlGb2N1c2FibGVFbGVtZW50cyA9IChjb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXG4gICAgXCJidXR0b24sIGEsIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBkaXZbdGFiaW5kZXhdLCBsYWJlbFt0YWJpbmRleF1cIixcbiAgKTtcblxuICByZXR1cm4gZm9jdXNhYmxlRWxlbWVudHNcbiAgICA/IEFycmF5LmZyb20oZm9jdXNhYmxlRWxlbWVudHMpLmZpbHRlcihcbiAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgZWxlbWVudC50YWJJbmRleCA+IC0xICYmICEoZWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS5kaXNhYmxlZCxcbiAgICAgIClcbiAgICA6IFtdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../utils.ts\n");
|
|
3412
|
+
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 open_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./colors */ \"../../colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./keys */ \"../../keys.ts\");\n\n\n\n\n\nlet mockDateTime = null;\nconst setDateTimeForTests = (dateTime) => {\n mockDateTime = dateTime;\n};\nconst getDateTime = () => {\n if (mockDateTime) {\n return mockDateTime;\n }\n const date = new Date();\n const year = date.getFullYear();\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\n const day = `${date.getDate()}`.padStart(2, \"0\");\n const hr = `${date.getHours()}`.padStart(2, \"0\");\n const min = `${date.getMinutes()}`.padStart(2, \"0\");\n return `${year}-${month}-${day}-${hr}${min}`;\n};\nconst capitalizeString = (str) => str.charAt(0).toUpperCase() + str.slice(1);\nconst isToolIcon = (target) => target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\nconst isInputLike = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement;\nconst isWritableElement = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLTextAreaElement ||\n (target instanceof HTMLInputElement &&\n (target.type === \"text\" || target.type === \"number\"));\nconst getFontFamilyString = ({ fontFamily, }) => {\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY)) {\n if (id === fontFamily) {\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT}`;\n }\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT;\n};\n/** returns fontSize+fontFamily string for assignment to DOM elements */\nconst getFontString = ({ fontSize, fontFamily, }) => {\n return `${fontSize}px ${getFontFamilyString({ fontFamily })}`;\n};\nconst debounce = (fn, timeout) => {\n let handle = 0;\n let lastArgs = null;\n const ret = (...args) => {\n lastArgs = args;\n clearTimeout(handle);\n handle = window.setTimeout(() => {\n lastArgs = null;\n fn(...args);\n }, timeout);\n };\n ret.flush = () => {\n clearTimeout(handle);\n if (lastArgs) {\n const _lastArgs = lastArgs;\n lastArgs = null;\n fn(..._lastArgs);\n }\n };\n ret.cancel = () => {\n lastArgs = null;\n clearTimeout(handle);\n };\n return ret;\n};\n// throttle callback to execute once per animation frame\nconst throttleRAF = (fn, opts) => {\n let timerId = null;\n let lastArgs = null;\n let lastArgsTrailing = null;\n const scheduleFunc = (args) => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n fn(...args);\n lastArgs = null;\n if (lastArgsTrailing) {\n lastArgs = lastArgsTrailing;\n lastArgsTrailing = null;\n scheduleFunc(lastArgs);\n }\n });\n };\n const ret = (...args) => {\n if (false) {}\n lastArgs = args;\n if (timerId === null) {\n scheduleFunc(lastArgs);\n }\n else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\n lastArgsTrailing = args;\n }\n };\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n if (lastArgs) {\n fn(...(lastArgsTrailing || lastArgs));\n lastArgs = lastArgsTrailing = null;\n }\n };\n ret.cancel = () => {\n lastArgs = lastArgsTrailing = null;\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n return ret;\n};\n// https://github.com/lodash/lodash/blob/es/chunk.js\nconst chunk = (array, size) => {\n if (!array.length || size < 1) {\n return [];\n }\n let index = 0;\n let resIndex = 0;\n const result = Array(Math.ceil(array.length / size));\n while (index < array.length) {\n result[resIndex++] = array.slice(index, (index += size));\n }\n return result;\n};\nconst selectNode = (node) => {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n};\nconst removeSelection = () => {\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n};\nconst distance = (x, y) => Math.abs(x - y);\nconst updateActiveTool = (appState, data) => {\n if (data.type === \"custom\") {\n return Object.assign(Object.assign({}, appState.activeTool), { type: \"custom\", customType: data.customType });\n }\n return Object.assign(Object.assign({}, appState.activeTool), { lastActiveToolBeforeEraser: data.lastActiveToolBeforeEraser === undefined\n ? appState.activeTool.lastActiveToolBeforeEraser\n : data.lastActiveToolBeforeEraser, type: data.type, customType: null });\n};\nconst resetCursor = (canvas) => {\n if (canvas) {\n canvas.style.cursor = \"\";\n }\n};\nconst setCursor = (canvas, cursor) => {\n if (canvas) {\n canvas.style.cursor = cursor;\n }\n};\nlet eraserCanvasCache;\nlet previewDataURL;\nconst setEraserCursor = (canvas, theme) => {\n const cursorImageSizePx = 20;\n const drawCanvas = () => {\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_2__.THEME.DARK;\n eraserCanvasCache = document.createElement(\"canvas\");\n eraserCanvasCache.theme = theme;\n eraserCanvasCache.height = cursorImageSizePx;\n eraserCanvasCache.width = cursorImageSizePx;\n const context = eraserCanvasCache.getContext(\"2d\");\n context.lineWidth = 1;\n context.beginPath();\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.black : open_color__WEBPACK_IMPORTED_MODULE_0__.white;\n context.fill();\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.white : open_color__WEBPACK_IMPORTED_MODULE_0__.black;\n context.stroke();\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_2__.MIME_TYPES.svg);\n };\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\n drawCanvas();\n }\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\n};\nconst setCursorForShape = (canvas, appState) => {\n if (!canvas) {\n return;\n }\n if (appState.activeTool.type === \"selection\") {\n resetCursor(canvas);\n }\n else if (appState.activeTool.type === \"eraser\") {\n setEraserCursor(canvas, appState.theme);\n // do nothing if image tool is selected which suggests there's\n // a image-preview set as the cursor\n // Ignore custom type as well and let host decide\n }\n else if (![\"image\", \"custom\"].includes(appState.activeTool.type)) {\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.CROSSHAIR;\n }\n};\nconst isFullScreen = () => { var _a; return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \"HTML\"; };\nconst allowFullScreen = () => document.documentElement.requestFullscreen();\nconst exitFullScreen = () => document.exitFullscreen();\nconst getShortcutKey = (shortcut) => {\n shortcut = shortcut\n .replace(/\\bAlt\\b/i, \"Alt\")\n .replace(/\\bShift\\b/i, \"Shift\")\n .replace(/\\b(Enter|Return)\\b/i, \"Enter\")\n .replace(/\\bDel\\b/i, \"Delete\");\n if (_keys__WEBPACK_IMPORTED_MODULE_4__.isDarwin) {\n return shortcut\n .replace(/\\bCtrlOrCmd\\b/i, \"Cmd\")\n .replace(/\\bAlt\\b/i, \"Option\");\n }\n return shortcut.replace(/\\bCtrlOrCmd\\b/i, \"Ctrl\");\n};\nconst viewportCoordsToSceneCoords = ({ clientX, clientY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const invScale = 1 / zoom.value;\n const x = (clientX - offsetLeft) * invScale - scrollX;\n const y = (clientY - offsetTop) * invScale - scrollY;\n return { x, y };\n};\nconst sceneCoordsToViewportCoords = ({ sceneX, sceneY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return { x, y };\n};\nconst getGlobalCSSVariable = (name) => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" +\n \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\n/**\n * Checks whether first directional character is RTL. Meaning whether it starts\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\n * RTL.\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\n */\nconst isRTL = (text) => RE_RTL_CHECK.test(text);\nconst tupleToCoors = (xyTuple) => {\n const [x, y] = xyTuple;\n return { x, y };\n};\n/** use as a rejectionHandler to mute filesystem Abort errors */\nconst muteFSAbortError = (error) => {\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\n console.warn(error);\n return;\n }\n throw error;\n};\nconst findIndex = (array, cb, fromIndex = 0) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst isTransparent = (color) => {\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n return (isRGBTransparent ||\n isRRGGBBTransparent ||\n color === _colors__WEBPACK_IMPORTED_MODULE_1__[\"default\"].elementBackground[0]);\n};\nconst resolvablePromise = () => {\n let resolve;\n let reject;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n promise.resolve = resolve;\n promise.reject = reject;\n return promise;\n};\n/**\n * @param func handler taking at most single parameter (event).\n */\nconst withBatchedUpdates = (func) => ((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n});\n/**\n * barches React state updates and throttles the calls to a single call per\n * animation frame\n */\nconst withBatchedUpdatesThrottled = (func) => {\n // @ts-ignore\n return throttleRAF(((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n }));\n};\n//https://stackoverflow.com/a/9462382/8418\nconst nFormatter = (num, digits) => {\n const si = [\n { value: 1, symbol: \"b\" },\n { value: 1e3, symbol: \"k\" },\n { value: 1e6, symbol: \"M\" },\n { value: 1e9, symbol: \"G\" },\n ];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n for (index = si.length - 1; index > 0; index--) {\n if (num >= si[index].value) {\n break;\n }\n }\n return ((num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol);\n};\nconst getVersion = () => {\n var _a;\n return (((_a = document.querySelector('meta[name=\"version\"]')) === null || _a === void 0 ? void 0 : _a.content) ||\n _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_VERSION);\n};\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\nconst supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return false;\n }\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\";\n // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\nconst getNearestScrollableContainer = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n const { overflowY } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n if (hasScrollableContent &&\n (overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n overflowY === \"overlay\")) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document;\n};\nconst focusNearestParent = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n parent = parent.parentElement;\n }\n};\nconst preventUnload = (event) => {\n event.preventDefault();\n // NOTE: modern browsers no longer allow showing a custom message here\n event.returnValue = \"\";\n};\nconst bytesToHexString = (bytes) => {\n return Array.from(bytes)\n .map((byte) => `0${byte.toString(16)}`.slice(-2))\n .join(\"\");\n};\nconst getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\nconst arrayToMap = (items) => {\n return items.reduce((acc, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\nconst isTestEnv = () => { var _a; 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\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.13.0-f5379d1\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"test\"; };\nconst isProdEnv = () => { var _a; 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\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.13.0-f5379d1\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"production\"; };\nconst wrapEvent = (name, nativeEvent) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent,\n },\n cancelable: true,\n });\n};\nconst updateObject = (obj, updates) => {\n let didChange = false;\n for (const key in updates) {\n const value = updates[key];\n if (typeof value !== \"undefined\") {\n if (obj[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)) {\n continue;\n }\n didChange = true;\n }\n }\n if (!didChange) {\n return obj;\n }\n return Object.assign(Object.assign({}, obj), updates);\n};\nconst isPrimitive = (val) => {\n const type = typeof val;\n return val == null || (type !== \"object\" && type !== \"function\");\n};\nconst getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n }\n catch (error) {\n return \"iframe\";\n }\n};\nconst isPromiseLike = (value) => {\n return (!!value &&\n typeof value === \"object\" &&\n \"then\" in value &&\n \"catch\" in value &&\n \"finally\" in value);\n};\nconst queryFocusableElements = (container) => {\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\n return focusableElements\n ? Array.from(focusableElements).filter((element) => element.tabIndex > -1 && !element.disabled)\n : [];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFFBQVEsSUFBSSxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUM7QUFDbkUsQ0FBQyxDQUFDO0FBRUssTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFO0lBQzNCLElBQUk7UUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7S0FDdEQ7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLE9BQU8sUUFBUSxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQyxDQUFDO0FBRUssTUFBTSxhQUFhLEdBQUcsQ0FDM0IsS0FBVSxFQUNzQyxFQUFFO0lBQ2xELE9BQU8sQ0FDTCxDQUFDLENBQUMsS0FBSztRQUNQLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsTUFBTSxJQUFJLEtBQUs7UUFDZixPQUFPLElBQUksS0FBSztRQUNoQixTQUFTLElBQUksS0FBSyxDQUNuQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUssTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFNBQTZCLEVBQUUsRUFBRTtJQUN0RSxNQUFNLGlCQUFpQixHQUFHLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxnQkFBZ0IsQ0FDbkQsb0VBQW9FLENBQ3JFLENBQUM7SUFFRixPQUFPLGlCQUFpQjtRQUN0QixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNWLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBRSxPQUE0QixDQUFDLFFBQVEsQ0FDbkU7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ1QsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3V0aWxzLnRzPzc2M2EiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9jIGZyb20gXCJvcGVuLWNvbG9yXCI7XG5cbmltcG9ydCBjb2xvcnMgZnJvbSBcIi4vY29sb3JzXCI7XG5pbXBvcnQge1xuICBDVVJTT1JfVFlQRSxcbiAgREVGQVVMVF9WRVJTSU9OLFxuICBFVkVOVCxcbiAgRk9OVF9GQU1JTFksXG4gIE1JTUVfVFlQRVMsXG4gIFRIRU1FLFxuICBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRm9udEZhbWlseVZhbHVlcywgRm9udFN0cmluZyB9IGZyb20gXCIuL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlLCBEYXRhVVJMLCBMYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciwgWm9vbSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IGlzRGFyd2luIH0gZnJvbSBcIi4va2V5c1wiO1xuaW1wb3J0IHsgU0hBUEVTIH0gZnJvbSBcIi4vc2hhcGVzXCI7XG5cbmxldCBtb2NrRGF0ZVRpbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgY29uc3Qgc2V0RGF0ZVRpbWVGb3JUZXN0cyA9IChkYXRlVGltZTogc3RyaW5nKSA9PiB7XG4gIG1vY2tEYXRlVGltZSA9IGRhdGVUaW1lO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGVUaW1lID0gKCkgPT4ge1xuICBpZiAobW9ja0RhdGVUaW1lKSB7XG4gICAgcmV0dXJuIG1vY2tEYXRlVGltZTtcbiAgfVxuXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBtb250aCA9IGAke2RhdGUuZ2V0TW9udGgoKSArIDF9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IGRheSA9IGAke2RhdGUuZ2V0RGF0ZSgpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBociA9IGAke2RhdGUuZ2V0SG91cnMoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgbWluID0gYCR7ZGF0ZS5nZXRNaW51dGVzKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG5cbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fS0ke2hyfSR7bWlufWA7XG59O1xuXG5leHBvcnQgY29uc3QgY2FwaXRhbGl6ZVN0cmluZyA9IChzdHI6IHN0cmluZykgPT5cbiAgc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xuXG5leHBvcnQgY29uc3QgaXNUb29sSWNvbiA9IChcbiAgdGFyZ2V0OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQgfCBudWxsLFxuKTogdGFyZ2V0IGlzIEhUTUxFbGVtZW50ID0+XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5jbGFzc05hbWUuaW5jbHVkZXMoXCJUb29sSWNvblwiKTtcblxuZXhwb3J0IGNvbnN0IGlzSW5wdXRMaWtlID0gKFxuICB0YXJnZXQ6IEVsZW1lbnQgfCBFdmVudFRhcmdldCB8IG51bGwsXG4pOiB0YXJnZXQgaXNcbiAgfCBIVE1MSW5wdXRFbGVtZW50XG4gIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICB8IEhUTUxTZWxlY3RFbGVtZW50XG4gIHwgSFRNTEJSRWxlbWVudFxuICB8IEhUTUxEaXZFbGVtZW50ID0+XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuZGF0YXNldC50eXBlID09PSBcInd5c2l3eWdcIikgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50O1xuXG5leHBvcnQgY29uc3QgaXNXcml0YWJsZUVsZW1lbnQgPSAoXG4gIHRhcmdldDogRWxlbWVudCB8IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbik6IHRhcmdldCBpc1xuICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgfCBIVE1MVGV4dEFyZWFFbGVtZW50XG4gIHwgSFRNTEJSRWxlbWVudFxuICB8IEhUTUxEaXZFbGVtZW50ID0+XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuZGF0YXNldC50eXBlID09PSBcInd5c2l3eWdcIikgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fFxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICh0YXJnZXQudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgdGFyZ2V0LnR5cGUgPT09IFwibnVtYmVyXCIpKTtcblxuZXhwb3J0IGNvbnN0IGdldEZvbnRGYW1pbHlTdHJpbmcgPSAoe1xuICBmb250RmFtaWx5LFxufToge1xuICBmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzO1xufSkgPT4ge1xuICBmb3IgKGNvbnN0IFtmb250RmFtaWx5U3RyaW5nLCBpZF0gb2YgT2JqZWN0LmVudHJpZXMoRk9OVF9GQU1JTFkpKSB7XG4gICAgaWYgKGlkID09PSBmb250RmFtaWx5KSB7XG4gICAgICByZXR1cm4gYCR7Zm9udEZhbWlseVN0cmluZ30sICR7V0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQ7XG59O1xuXG4vKiogcmV0dXJucyBmb250U2l6ZStmb250RmFtaWx5IHN0cmluZyBmb3IgYXNzaWdubWVudCB0byBET00gZWxlbWVudHMgKi9cbmV4cG9ydCBjb25zdCBnZXRGb250U3RyaW5nID0gKHtcbiAgZm9udFNpemUsXG4gIGZvbnRGYW1pbHksXG59OiB7XG4gIGZvbnRTaXplOiBudW1iZXI7XG4gIGZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG59KSA9PiB7XG4gIHJldHVybiBgJHtmb250U2l6ZX1weCAke2dldEZvbnRGYW1pbHlTdHJpbmcoeyBmb250RmFtaWx5IH0pfWAgYXMgRm9udFN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IDxUIGV4dGVuZHMgYW55W10+KFxuICBmbjogKC4uLmFyZ3M6IFQpID0+IHZvaWQsXG4gIHRpbWVvdXQ6IG51bWJlcixcbikgPT4ge1xuICBsZXQgaGFuZGxlID0gMDtcbiAgbGV0IGxhc3RBcmdzOiBUIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IHJldCA9ICguLi5hcmdzOiBUKSA9PiB7XG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIGhhbmRsZSA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgIH0sIHRpbWVvdXQpO1xuICB9O1xuICByZXQuZmx1c2ggPSAoKSA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBjb25zdCBfbGFzdEFyZ3MgPSBsYXN0QXJncztcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGZuKC4uLl9sYXN0QXJncyk7XG4gICAgfVxuICB9O1xuICByZXQuY2FuY2VsID0gKCkgPT4ge1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIHRocm90dGxlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgb25jZSBwZXIgYW5pbWF0aW9uIGZyYW1lXG5leHBvcnQgY29uc3QgdGhyb3R0bGVSQUYgPSA8VCBleHRlbmRzIGFueVtdPihcbiAgZm46ICguLi5hcmdzOiBUKSA9PiB2b2lkLFxuICBvcHRzPzogeyB0cmFpbGluZz86IGJvb2xlYW4gfSxcbikgPT4ge1xuICBsZXQgdGltZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGxldCBsYXN0QXJnczogVCB8IG51bGwgPSBudWxsO1xuICBsZXQgbGFzdEFyZ3NUcmFpbGluZzogVCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHNjaGVkdWxlRnVuYyA9IChhcmdzOiBUKSA9PiB7XG4gICAgdGltZXJJZCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGlmIChsYXN0QXJnc1RyYWlsaW5nKSB7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdEFyZ3NUcmFpbGluZztcbiAgICAgICAgbGFzdEFyZ3NUcmFpbGluZyA9IG51bGw7XG4gICAgICAgIHNjaGVkdWxlRnVuYyhsYXN0QXJncyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcmV0ID0gKC4uLmFyZ3M6IFQpID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGlmICh0aW1lcklkID09PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgIH0gZWxzZSBpZiAob3B0cz8udHJhaWxpbmcpIHtcbiAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBhcmdzO1xuICAgIH1cbiAgfTtcbiAgcmV0LmZsdXNoID0gKCkgPT4ge1xuICAgIGlmICh0aW1lcklkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aW1lcklkKTtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobGFzdEFyZ3MpIHtcbiAgICAgIGZuKC4uLihsYXN0QXJnc1RyYWlsaW5nIHx8IGxhc3RBcmdzKSk7XG4gICAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0LmNhbmNlbCA9ICgpID0+IHtcbiAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgIGlmICh0aW1lcklkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aW1lcklkKTtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvZXMvY2h1bmsuanNcbmV4cG9ydCBjb25zdCBjaHVuayA9IDxUIGV4dGVuZHMgYW55PihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgc2l6ZTogbnVtYmVyLFxuKTogVFtdW10gPT4ge1xuICBpZiAoIWFycmF5Lmxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgcmVzSW5kZXggPSAwO1xuICBjb25zdCByZXN1bHQgPSBBcnJheShNYXRoLmNlaWwoYXJyYXkubGVuZ3RoIC8gc2l6ZSkpO1xuICB3aGlsZSAoaW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBhcnJheS5zbGljZShpbmRleCwgKGluZGV4ICs9IHNpemUpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdE5vZGUgPSAobm9kZTogRWxlbWVudCkgPT4ge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIGlmIChzZWxlY3Rpb24pIHtcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKG5vZGUpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlU2VsZWN0aW9uID0gKCkgPT4ge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIGlmIChzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkaXN0YW5jZSA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gTWF0aC5hYnMoeCAtIHkpO1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQWN0aXZlVG9vbCA9IChcbiAgYXBwU3RhdGU6IFBpY2s8QXBwU3RhdGUsIFwiYWN0aXZlVG9vbFwiPixcbiAgZGF0YTogKFxuICAgIHwgeyB0eXBlOiB0eXBlb2YgU0hBUEVTW251bWJlcl1bXCJ2YWx1ZVwiXSB8IFwiZXJhc2VyXCIgfVxuICAgIHwgeyB0eXBlOiBcImN1c3RvbVwiOyBjdXN0b21UeXBlOiBzdHJpbmcgfVxuICApICYgeyBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcj86IExhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyIH0sXG4pOiBBcHBTdGF0ZVtcImFjdGl2ZVRvb2xcIl0gPT4ge1xuICBpZiAoZGF0YS50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgY3VzdG9tVHlwZTogZGF0YS5jdXN0b21UeXBlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgbGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXI6XG4gICAgICBkYXRhLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBhcHBTdGF0ZS5hY3RpdmVUb29sLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyXG4gICAgICAgIDogZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcixcbiAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgY3VzdG9tVHlwZTogbnVsbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNldEN1cnNvciA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDdXJzb3IgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsIGN1cnNvcjogc3RyaW5nKSA9PiB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xuXG5sZXQgZXJhc2VyQ2FudmFzQ2FjaGU6IGFueTtcbmxldCBwcmV2aWV3RGF0YVVSTDogc3RyaW5nO1xuZXhwb3J0IGNvbnN0IHNldEVyYXNlckN1cnNvciA9IChcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gIHRoZW1lOiBBcHBTdGF0ZVtcInRoZW1lXCJdLFxuKSA9PiB7XG4gIGNvbnN0IGN1cnNvckltYWdlU2l6ZVB4ID0gMjA7XG5cbiAgY29uc3QgZHJhd0NhbnZhcyA9ICgpID0+IHtcbiAgICBjb25zdCBpc0RhcmtUaGVtZSA9IHRoZW1lID09PSBUSEVNRS5EQVJLO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSA9IHRoZW1lO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgY29uc3QgY29udGV4dCA9IGVyYXNlckNhbnZhc0NhY2hlLmdldENvbnRleHQoXCIyZFwiKSE7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5hcmMoXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS53aWR0aCAvIDIsXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS5oZWlnaHQgLyAyLFxuICAgICAgNSxcbiAgICAgIDAsXG4gICAgICAyICogTWF0aC5QSSxcbiAgICApO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy5ibGFjayA6IG9jLndoaXRlO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBpc0RhcmtUaGVtZSA/IG9jLndoaXRlIDogb2MuYmxhY2s7XG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgICBwcmV2aWV3RGF0YVVSTCA9IGVyYXNlckNhbnZhc0NhY2hlLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2ZykgYXMgRGF0YVVSTDtcbiAgfTtcbiAgaWYgKCFlcmFzZXJDYW52YXNDYWNoZSB8fCBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSAhPT0gdGhlbWUpIHtcbiAgICBkcmF3Q2FudmFzKCk7XG4gIH1cblxuICBzZXRDdXJzb3IoXG4gICAgY2FudmFzLFxuICAgIGB1cmwoJHtwcmV2aWV3RGF0YVVSTH0pICR7Y3Vyc29ySW1hZ2VTaXplUHggLyAyfSAke1xuICAgICAgY3Vyc29ySW1hZ2VTaXplUHggLyAyXG4gICAgfSwgYXV0b2AsXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yRm9yU2hhcGUgPSAoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gIH0gZWxzZSBpZiAoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImVyYXNlclwiKSB7XG4gICAgc2V0RXJhc2VyQ3Vyc29yKGNhbnZhcywgYXBwU3RhdGUudGhlbWUpO1xuICAgIC8vIGRvIG5vdGhpbmcgaWYgaW1hZ2UgdG9vbCBpcyBzZWxlY3RlZCB3aGljaCBzdWdnZXN0cyB0aGVyZSdzXG4gICAgLy8gYSBpbWFnZS1wcmV2aWV3IHNldCBhcyB0aGUgY3Vyc29yXG4gICAgLy8gSWdub3JlIGN1c3RvbSB0eXBlIGFzIHdlbGwgYW5kIGxldCBob3N0IGRlY2lkZVxuICB9IGVsc2UgaWYgKCFbXCJpbWFnZVwiLCBcImN1c3RvbVwiXS5pbmNsdWRlcyhhcHBTdGF0ZS5hY3RpdmVUb29sLnR5cGUpKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IENVUlNPUl9UWVBFLkNST1NTSEFJUjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGlzRnVsbFNjcmVlbiA9ICgpID0+XG4gIGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50Py5ub2RlTmFtZSA9PT0gXCJIVE1MXCI7XG5cbmV4cG9ydCBjb25zdCBhbGxvd0Z1bGxTY3JlZW4gPSAoKSA9PlxuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcblxuZXhwb3J0IGNvbnN0IGV4aXRGdWxsU2NyZWVuID0gKCkgPT4gZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcblxuZXhwb3J0IGNvbnN0IGdldFNob3J0Y3V0S2V5ID0gKHNob3J0Y3V0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBzaG9ydGN1dCA9IHNob3J0Y3V0XG4gICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIkFsdFwiKVxuICAgIC5yZXBsYWNlKC9cXGJTaGlmdFxcYi9pLCBcIlNoaWZ0XCIpXG4gICAgLnJlcGxhY2UoL1xcYihFbnRlcnxSZXR1cm4pXFxiL2ksIFwiRW50ZXJcIilcbiAgICAucmVwbGFjZSgvXFxiRGVsXFxiL2ksIFwiRGVsZXRlXCIpO1xuXG4gIGlmIChpc0Rhcndpbikge1xuICAgIHJldHVybiBzaG9ydGN1dFxuICAgICAgLnJlcGxhY2UoL1xcYkN0cmxPckNtZFxcYi9pLCBcIkNtZFwiKVxuICAgICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIk9wdGlvblwiKTtcbiAgfVxuICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2ksIFwiQ3RybFwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMgPSAoXG4gIHsgY2xpZW50WCwgY2xpZW50WSB9OiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0sXG4gIHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWSxcbiAgfToge1xuICAgIHpvb206IFpvb207XG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICAgIG9mZnNldFRvcDogbnVtYmVyO1xuICAgIHNjcm9sbFg6IG51bWJlcjtcbiAgICBzY3JvbGxZOiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgaW52U2NhbGUgPSAxIC8gem9vbS52YWx1ZTtcbiAgY29uc3QgeCA9IChjbGllbnRYIC0gb2Zmc2V0TGVmdCkgKiBpbnZTY2FsZSAtIHNjcm9sbFg7XG4gIGNvbnN0IHkgPSAoY2xpZW50WSAtIG9mZnNldFRvcCkgKiBpbnZTY2FsZSAtIHNjcm9sbFk7XG5cbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyA9IChcbiAgeyBzY2VuZVgsIHNjZW5lWSB9OiB7IHNjZW5lWDogbnVtYmVyOyBzY2VuZVk6IG51bWJlciB9LFxuICB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFksXG4gIH06IHtcbiAgICB6b29tOiBab29tO1xuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgICBzY3JvbGxYOiBudW1iZXI7XG4gICAgc2Nyb2xsWTogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHggPSAoc2NlbmVYICsgc2Nyb2xsWCkgKiB6b29tLnZhbHVlICsgb2Zmc2V0TGVmdDtcbiAgY29uc3QgeSA9IChzY2VuZVkgKyBzY3JvbGxZKSAqIHpvb20udmFsdWUgKyBvZmZzZXRUb3A7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHbG9iYWxDU1NWYXJpYWJsZSA9IChuYW1lOiBzdHJpbmcpID0+XG4gIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKGAtLSR7bmFtZX1gKTtcblxuY29uc3QgUlNfTFRSX0NIQVJTID1cbiAgXCJBLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyQjhcXHUwMzAwLVxcdTA1OTBcXHUwODAwLVxcdTFGRkZcIiArXG4gIFwiXFx1MkMwMC1cXHVGQjFDXFx1RkRGRS1cXHVGRTZGXFx1RkVGRC1cXHVGRkZGXCI7XG5jb25zdCBSU19SVExfQ0hBUlMgPSBcIlxcdTA1OTEtXFx1MDdGRlxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ1wiO1xuY29uc3QgUkVfUlRMX0NIRUNLID0gbmV3IFJlZ0V4cChgXlteJHtSU19MVFJfQ0hBUlN9XSpbJHtSU19SVExfQ0hBUlN9XWApO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBmaXJzdCBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIgaXMgUlRMLiBNZWFuaW5nIHdoZXRoZXIgaXQgc3RhcnRzXG4gKiAgd2l0aCBSVEwgY2hhcmFjdGVycywgb3IgaW5kZXRlcm1pbmF0ZSAobnVtYmVycyBldGMuKSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5XG4gKiAgUlRMLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC8xNzIyI2Rpc2N1c3Npb25fcjQzNjM0MDE3MVxuICovXG5leHBvcnQgY29uc3QgaXNSVEwgPSAodGV4dDogc3RyaW5nKSA9PiBSRV9SVExfQ0hFQ0sudGVzdCh0ZXh0KTtcblxuZXhwb3J0IGNvbnN0IHR1cGxlVG9Db29ycyA9IChcbiAgeHlUdXBsZTogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSxcbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IFt4LCB5XSA9IHh5VHVwbGU7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbi8qKiB1c2UgYXMgYSByZWplY3Rpb25IYW5kbGVyIHRvIG11dGUgZmlsZXN5c3RlbSBBYm9ydCBlcnJvcnMgKi9cbmV4cG9ydCBjb25zdCBtdXRlRlNBYm9ydEVycm9yID0gKGVycm9yPzogRXJyb3IpID0+IHtcbiAgaWYgKGVycm9yPy5uYW1lID09PSBcIkFib3J0RXJyb3JcIikge1xuICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IGVycm9yO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRJbmRleCA9IDxUPihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgY2I6IChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogcmVhZG9ubHkgVFtdKSA9PiBib29sZWFuLFxuICBmcm9tSW5kZXg6IG51bWJlciA9IDAsXG4pID0+IHtcbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cbiAgZnJvbUluZGV4ID0gTWF0aC5taW4oYXJyYXkubGVuZ3RoLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4IC0gMTtcbiAgd2hpbGUgKCsraW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICBpZiAoY2IoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kTGFzdEluZGV4ID0gPFQ+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBjYjogKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiByZWFkb25seSBUW10pID0+IGJvb2xlYW4sXG4gIGZyb21JbmRleDogbnVtYmVyID0gYXJyYXkubGVuZ3RoIC0gMSxcbikgPT4ge1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgd2hpbGUgKC0taW5kZXggPiAtMSkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVHJhbnNwYXJlbnQgPSAoY29sb3I6IHN0cmluZykgPT4ge1xuICBjb25zdCBpc1JHQlRyYW5zcGFyZW50ID0gY29sb3IubGVuZ3RoID09PSA1ICYmIGNvbG9yLnN1YnN0cig0LCAxKSA9PT0gXCIwXCI7XG4gIGNvbnN0IGlzUlJHR0JCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDkgJiYgY29sb3Iuc3Vic3RyKDcsIDIpID09PSBcIjAwXCI7XG4gIHJldHVybiAoXG4gICAgaXNSR0JUcmFuc3BhcmVudCB8fFxuICAgIGlzUlJHR0JCVHJhbnNwYXJlbnQgfHxcbiAgICBjb2xvciA9PT0gY29sb3JzLmVsZW1lbnRCYWNrZ3JvdW5kWzBdXG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBSZXNvbHZhYmxlUHJvbWlzZTxUPiA9IFByb21pc2U8VD4gJiB7XG4gIHJlc29sdmU6IFtUXSBleHRlbmRzIFt1bmRlZmluZWRdID8gKHZhbHVlPzogVCkgPT4gdm9pZCA6ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcbmV4cG9ydCBjb25zdCByZXNvbHZhYmxlUHJvbWlzZSA9IDxUPigpID0+IHtcbiAgbGV0IHJlc29sdmUhOiBhbnk7XG4gIGxldCByZWplY3QhOiBhbnk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIChwcm9taXNlIGFzIGFueSkucmVzb2x2ZSA9IHJlc29sdmU7XG4gIChwcm9taXNlIGFzIGFueSkucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZSBhcyBSZXNvbHZhYmxlUHJvbWlzZTxUPjtcbn07XG5cbi8qKlxuICogQHBhcmFtIGZ1bmMgaGFuZGxlciB0YWtpbmcgYXQgbW9zdCBzaW5nbGUgcGFyYW1ldGVyIChldmVudCkuXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXMgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PlxuICAoKGV2ZW50KSA9PiB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYyBhcyBURnVuY3Rpb24sIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uO1xuXG4vKipcbiAqIGJhcmNoZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBhbmQgdGhyb3R0bGVzIHRoZSBjYWxscyB0byBhIHNpbmdsZSBjYWxsIHBlclxuICogYW5pbWF0aW9uIGZyYW1lXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PiB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIHRocm90dGxlUkFGPFBhcmFtZXRlcnM8VEZ1bmN0aW9uPj4oKChldmVudCkgPT4ge1xuICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmMsIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uKTtcbn07XG5cbi8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuZXhwb3J0IGNvbnN0IG5Gb3JtYXR0ZXIgPSAobnVtOiBudW1iZXIsIGRpZ2l0czogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc2kgPSBbXG4gICAgeyB2YWx1ZTogMSwgc3ltYm9sOiBcImJcIiB9LFxuICAgIHsgdmFsdWU6IDFlMywgc3ltYm9sOiBcImtcIiB9LFxuICAgIHsgdmFsdWU6IDFlNiwgc3ltYm9sOiBcIk1cIiB9LFxuICAgIHsgdmFsdWU6IDFlOSwgc3ltYm9sOiBcIkdcIiB9LFxuICBdO1xuICBjb25zdCByeCA9IC9cXC4wKyR8KFxcLlswLTldKlsxLTldKTArJC87XG4gIGxldCBpbmRleDtcbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICAobnVtIC8gc2lbaW5kZXhdLnZhbHVlKS50b0ZpeGVkKGRpZ2l0cykucmVwbGFjZShyeCwgXCIkMVwiKSArIHNpW2luZGV4XS5zeW1ib2xcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTE1ldGFFbGVtZW50PignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8XG4gICAgREVGQVVMVF9WRVJTSU9OXG4gICk7XG59O1xuXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvYmxvYi9tYXN0ZXIvZmVhdHVyZS1kZXRlY3RzL2Vtb2ppLmpzXG5leHBvcnQgY29uc3Qgc3VwcG9ydHNFbW9qaSA9ICgpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qgb2Zmc2V0ID0gMTI7XG4gIGN0eC5maWxsU3R5bGUgPSBcIiNmMDBcIjtcbiAgY3R4LnRleHRCYXNlbGluZSA9IFwidG9wXCI7XG4gIGN0eC5mb250ID0gXCIzMnB4IEFyaWFsXCI7XG4gIC8vIE1vZGVybml6ciB1c2VkIPCfkKgsIGJ1dCBpdCBpcyBzb3J0IG9mIHN1cHBvcnRlZCBvbiBXaW5kb3dzIDcuXG4gIC8vIEx1Y2tpbHkg8J+YgCBpc24ndCBzdXBwb3J0ZWQuXG4gIGN0eC5maWxsVGV4dChcIvCfmIBcIiwgMCwgMCk7XG4gIHJldHVybiBjdHguZ2V0SW1hZ2VEYXRhKG9mZnNldCwgb2Zmc2V0LCAxLCAxKS5kYXRhWzBdICE9PSAwO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbik6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudCA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIH1cbiAgICBjb25zdCB7IG92ZXJmbG93WSB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50KTtcbiAgICBjb25zdCBoYXNTY3JvbGxhYmxlQ29udGVudCA9IHBhcmVudC5zY3JvbGxIZWlnaHQgPiBwYXJlbnQuY2xpZW50SGVpZ2h0O1xuICAgIGlmIChcbiAgICAgIGhhc1Njcm9sbGFibGVDb250ZW50ICYmXG4gICAgICAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fFxuICAgICAgICBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHxcbiAgICAgICAgb3ZlcmZsb3dZID09PSBcIm92ZXJsYXlcIilcbiAgICApIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBkb2N1bWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBmb2N1c05lYXJlc3RQYXJlbnQgPSAoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudC50YWJJbmRleCA+IC0xKSB7XG4gICAgICBwYXJlbnQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwcmV2ZW50VW5sb2FkID0gKGV2ZW50OiBCZWZvcmVVbmxvYWRFdmVudCkgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBOT1RFOiBtb2Rlcm4gYnJvd3NlcnMgbm8gbG9uZ2VyIGFsbG93IHNob3dpbmcgYSBjdXN0b20gbWVzc2FnZSBoZXJlXG4gIGV2ZW50LnJldHVyblZhbHVlID0gXCJcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBieXRlc1RvSGV4U3RyaW5nID0gKGJ5dGVzOiBVaW50OEFycmF5KSA9PiB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKVxuICAgIC5tYXAoKGJ5dGUpID0+IGAwJHtieXRlLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC0yKSlcbiAgICAuam9pbihcIlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVcGRhdGVkVGltZXN0YW1wID0gKCkgPT4gKGlzVGVzdEVudigpID8gMSA6IERhdGUubm93KCkpO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGBpZGAgYXR0cmlidXRlLFxuICogb3IgYXJyYXkgb2YgaWRzIChzdHJpbmdzKSwgaW50byBhIE1hcCwga2V5ZCBieSBgaWRgLlxuICovXG5leHBvcnQgY29uc3QgYXJyYXlUb01hcCA9IDxUIGV4dGVuZHMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmc+KFxuICBpdGVtczogcmVhZG9ubHkgVFtdLFxuKSA9PiB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYzogTWFwPHN0cmluZywgVD4sIGVsZW1lbnQpID0+IHtcbiAgICBhY2Muc2V0KHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiID8gZWxlbWVudCA6IGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIG5ldyBNYXAoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUZXN0RW52ID0gKCkgPT5cbiAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInRlc3RcIjtcblxuZXhwb3J0IGNvbnN0IGlzUHJvZEVudiA9ICgpID0+XG4gIHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCB3cmFwRXZlbnQgPSA8VCBleHRlbmRzIEV2ZW50PihuYW1lOiBFVkVOVCwgbmF0aXZlRXZlbnQ6IFQpID0+IHtcbiAgcmV0dXJuIG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG4gICAgZGV0YWlsOiB7XG4gICAgICBuYXRpdmVFdmVudCxcbiAgICB9LFxuICAgIGNhbmNlbGFibGU6IHRydWUsXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU9iamVjdCA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9iajogVCxcbiAgdXBkYXRlczogUGFydGlhbDxUPixcbik6IFQgPT4ge1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9ICh1cGRhdGVzIGFzIGFueSlba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChvYmogYXMgYW55KVtrZXldID09PSB2YWx1ZSAmJlxuICAgICAgICAvLyBpZiBvYmplY3QsIGFsd2F5cyB1cGRhdGUgYmVjYXVzZSBpdHMgYXR0cnMgY291bGQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ub2JqLFxuICAgIC4uLnVwZGF0ZXMsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAodmFsOiBhbnkpID0+IHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCAodHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcImZ1bmN0aW9uXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZyYW1lID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cuc2VsZiA9PT0gd2luZG93LnRvcCA/IFwidG9wXCIgOiBcImlmcmFtZVwiO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBcImlmcmFtZVwiO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcm9taXNlTGlrZSA9IChcbiAgdmFsdWU6IGFueSxcbik6IHZhbHVlIGlzIFByb21pc2U8UmVzb2x1dGlvblR5cGU8dHlwZW9mIHZhbHVlPj4gPT4ge1xuICByZXR1cm4gKFxuICAgICEhdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcInRoZW5cIiBpbiB2YWx1ZSAmJlxuICAgIFwiY2F0Y2hcIiBpbiB2YWx1ZSAmJlxuICAgIFwiZmluYWxseVwiIGluIHZhbHVlXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgcXVlcnlGb2N1c2FibGVFbGVtZW50cyA9IChjb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXG4gICAgXCJidXR0b24sIGEsIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBkaXZbdGFiaW5kZXhdLCBsYWJlbFt0YWJpbmRleF1cIixcbiAgKTtcblxuICByZXR1cm4gZm9jdXNhYmxlRWxlbWVudHNcbiAgICA/IEFycmF5LmZyb20oZm9jdXNhYmxlRWxlbWVudHMpLmZpbHRlcihcbiAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgZWxlbWVudC50YWJJbmRleCA+IC0xICYmICEoZWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS5kaXNhYmxlZCxcbiAgICAgIClcbiAgICA6IFtdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../utils.ts\n");
|
|
3413
3413
|
|
|
3414
3414
|
/***/ }),
|
|
3415
3415
|
|