@zsviczian/excalidraw 0.12.0-obsidian-0 → 0.12.0-obsidian-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1861,7 +1861,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
1861
1861
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1862
1862
|
|
|
1863
1863
|
"use strict";
|
|
1864
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"trackEvent\\\": () => (/* binding */ trackEvent)\\n/* harmony export */ });\\nvar _a, _b;\\r\\nconst trackEvent = typeof process !== \\\"undefined\\\" && ((_a = ({\\\"REACT_APP_BACKEND_V2_GET_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/\\\",\\\"REACT_APP_BACKEND_V2_POST_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/post/\\\",\\\"REACT_APP_LIBRARY_URL\\\":\\\"https://libraries.excalidraw.com\\\",\\\"REACT_APP_LIBRARY_BACKEND\\\":\\\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\\\",\\\"REACT_APP_WS_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_PORTAL_URL\\\":\\\"\\\",\\\"REACT_APP_FIREBASE_CONFIG\\\":\\\"{\\\\\\\"apiKey\\\\\\\":\\\\\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\\\\\",\\\\\\\"authDomain\\\\\\\":\\\\\\\"excalidraw-oss-dev.firebaseapp.com\\\\\\\",\\\\\\\"projectId\\\\\\\":\\\\\\\"excalidraw-oss-dev\\\\\\\",\\\\\\\"storageBucket\\\\\\\":\\\\\\\"excalidraw-oss-dev.appspot.com\\\\\\\",\\\\\\\"messagingSenderId\\\\\\\":\\\\\\\"664559512677\\\\\\\",\\\\\\\"appId\\\\\\\":\\\\\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\\\\\"}\\\",\\\"REACT_APP_DEV_ENABLE_SW\\\":\\\"\\\",\\\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\\\":\\\"\\\",\\\"PKG_NAME\\\":\\\"@zsviczian/excalidraw\\\",\\\"PKG_VERSION\\\":\\\"0.12.0-obsidian-
|
|
1864
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"trackEvent\\\": () => (/* binding */ trackEvent)\\n/* harmony export */ });\\nvar _a, _b;\\r\\nconst trackEvent = typeof process !== \\\"undefined\\\" && ((_a = ({\\\"REACT_APP_BACKEND_V2_GET_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/\\\",\\\"REACT_APP_BACKEND_V2_POST_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/post/\\\",\\\"REACT_APP_LIBRARY_URL\\\":\\\"https://libraries.excalidraw.com\\\",\\\"REACT_APP_LIBRARY_BACKEND\\\":\\\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\\\",\\\"REACT_APP_WS_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_PORTAL_URL\\\":\\\"\\\",\\\"REACT_APP_FIREBASE_CONFIG\\\":\\\"{\\\\\\\"apiKey\\\\\\\":\\\\\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\\\\\",\\\\\\\"authDomain\\\\\\\":\\\\\\\"excalidraw-oss-dev.firebaseapp.com\\\\\\\",\\\\\\\"projectId\\\\\\\":\\\\\\\"excalidraw-oss-dev\\\\\\\",\\\\\\\"storageBucket\\\\\\\":\\\\\\\"excalidraw-oss-dev.appspot.com\\\\\\\",\\\\\\\"messagingSenderId\\\\\\\":\\\\\\\"664559512677\\\\\\\",\\\\\\\"appId\\\\\\\":\\\\\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\\\\\"}\\\",\\\"REACT_APP_DEV_ENABLE_SW\\\":\\\"\\\",\\\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\\\":\\\"\\\",\\\"PKG_NAME\\\":\\\"@zsviczian/excalidraw\\\",\\\"PKG_VERSION\\\":\\\"0.12.0-obsidian-1\\\",\\\"IS_EXCALIDRAW_NPM_PACKAGE\\\":true})) === null || _a === void 0 ? void 0 : _a.REACT_APP_GOOGLE_ANALYTICS_ID) && typeof window !== \\\"undefined\\\" && window.gtag ? function (category, action, label, value) {\\r\\n try {\\r\\n window.gtag(\\\"event\\\", action, {\\r\\n event_category: category,\\r\\n event_label: label,\\r\\n value\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(\\\"error logging to ga\\\", error);\\r\\n }\\r\\n} : typeof process !== \\\"undefined\\\" && ((_b = ({\\\"REACT_APP_BACKEND_V2_GET_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/\\\",\\\"REACT_APP_BACKEND_V2_POST_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/post/\\\",\\\"REACT_APP_LIBRARY_URL\\\":\\\"https://libraries.excalidraw.com\\\",\\\"REACT_APP_LIBRARY_BACKEND\\\":\\\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\\\",\\\"REACT_APP_WS_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_PORTAL_URL\\\":\\\"\\\",\\\"REACT_APP_FIREBASE_CONFIG\\\":\\\"{\\\\\\\"apiKey\\\\\\\":\\\\\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\\\\\",\\\\\\\"authDomain\\\\\\\":\\\\\\\"excalidraw-oss-dev.firebaseapp.com\\\\\\\",\\\\\\\"projectId\\\\\\\":\\\\\\\"excalidraw-oss-dev\\\\\\\",\\\\\\\"storageBucket\\\\\\\":\\\\\\\"excalidraw-oss-dev.appspot.com\\\\\\\",\\\\\\\"messagingSenderId\\\\\\\":\\\\\\\"664559512677\\\\\\\",\\\\\\\"appId\\\\\\\":\\\\\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\\\\\"}\\\",\\\"REACT_APP_DEV_ENABLE_SW\\\":\\\"\\\",\\\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\\\":\\\"\\\",\\\"PKG_NAME\\\":\\\"@zsviczian/excalidraw\\\",\\\"PKG_VERSION\\\":\\\"0.12.0-obsidian-1\\\",\\\"IS_EXCALIDRAW_NPM_PACKAGE\\\":true})) === null || _b === void 0 ? void 0 : _b.JEST_WORKER_ID) ? function (category, action, label, value) { } : function (category, action, label, value) {\\r\\n // console.log(\\\"Track Event\\\", { category, action, label, value });\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQU8sTUFBTSxVQUFVLEdBQUcsT0FBTyxPQUFPLEtBQUssV0FBVyxLQUFJLG00QkFBVywwQ0FBRSw2QkFBNkIsS0FBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLO0lBQy9MLElBQUk7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7WUFDM0IsY0FBYyxFQUFFLFFBQVE7WUFDeEIsV0FBVyxFQUFFLEtBQUs7WUFDbEIsS0FBSztTQUNOLENBQUMsQ0FBQztLQUNKO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzdDO0FBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLEtBQUksbTRCQUFXLDBDQUFFLGNBQWMsRUFBQyxDQUFDLENBQUMsVUFBVSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLElBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUs7SUFDekosa0VBQWtFO0FBQ3BFLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9hbmFseXRpY3MudHM/ZmIxMCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgdHJhY2tFdmVudCA9IHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5SRUFDVF9BUFBfR09PR0xFX0FOQUxZVElDU19JRCAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5ndGFnID8gZnVuY3Rpb24gKGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB2YWx1ZSkge1xuICB0cnkge1xuICAgIHdpbmRvdy5ndGFnKFwiZXZlbnRcIiwgYWN0aW9uLCB7XG4gICAgICBldmVudF9jYXRlZ29yeTogY2F0ZWdvcnksXG4gICAgICBldmVudF9sYWJlbDogbGFiZWwsXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciBsb2dnaW5nIHRvIGdhXCIsIGVycm9yKTtcbiAgfVxufSA6IHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5KRVNUX1dPUktFUl9JRCA/IGZ1bmN0aW9uIChjYXRlZ29yeSwgYWN0aW9uLCBsYWJlbCwgdmFsdWUpIHt9IDogZnVuY3Rpb24gKGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB2YWx1ZSkgey8vIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIHRyYWNrIGxvY2FsbHlcbiAgLy8gY29uc29sZS5sb2coXCJUcmFjayBFdmVudFwiLCB7IGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB2YWx1ZSB9KTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///../../analytics.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../analytics.ts?");
|
|
1865
1865
|
|
|
1866
1866
|
/***/ }),
|
|
1867
1867
|
|
|
@@ -1949,7 +1949,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
1949
1949
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1950
1950
|
|
|
1951
1951
|
"use strict";
|
|
1952
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"default\\\": () => (__WEBPACK_DEFAULT_EXPORT__),\\n/* harmony export */ \\\"showFourthFont\\\": () => (/* binding */ showFourthFont),\\n/* harmony export */ \\\"useDevice\\\": () => (/* binding */ useDevice),\\n/* harmony export */ \\\"useExcalidrawContainer\\\": () => (/* binding */ useExcalidrawContainer)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \\\"../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\\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 roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! roughjs/bin/rough */ \\\"../../../node_modules/roughjs/bin/rough.js\\\");\\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \\\"../../../node_modules/clsx/dist/clsx.m.js\\\");\\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! nanoid */ \\\"../../../node_modules/nanoid/index.browser.js\\\");\\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions */ \\\"../../actions/index.ts\\\");\\n/* harmony import */ var _actions_actionHistory__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/actionHistory */ \\\"../../actions/actionHistory.tsx\\\");\\n/* harmony import */ var _actions_manager__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/manager */ \\\"../../actions/manager.tsx\\\");\\n/* harmony import */ var _actions_register__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../actions/register */ \\\"../../actions/register.ts\\\");\\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../analytics */ \\\"../../analytics.ts\\\");\\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../appState */ \\\"../../appState.ts\\\");\\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../clipboard */ \\\"../../clipboard.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../data */ \\\"../../data/index.ts\\\");\\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../data/library */ \\\"../../data/library.ts\\\");\\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../data/restore */ \\\"../../data/restore.ts\\\");\\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../element */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../element/binding */ \\\"../../element/binding.ts\\\");\\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../element/linearElementEditor */ \\\"../../element/linearElementEditor.ts\\\");\\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../element/mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/newElement */ \\\"../../element/newElement.ts\\\");\\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../element/typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _gesture__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../gesture */ \\\"../../gesture.ts\\\");\\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../groups */ \\\"../../groups.ts\\\");\\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../history */ \\\"../../history.ts\\\");\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../keys */ \\\"../../keys.ts\\\");\\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../math */ \\\"../../math.ts\\\");\\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../renderer/renderScene */ \\\"../../renderer/renderScene.ts\\\");\\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../renderer/renderElement */ \\\"../../renderer/renderElement.ts\\\");\\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../scene */ \\\"../../scene/index.ts\\\");\\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../scene/Scene */ \\\"../../scene/Scene.ts\\\");\\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../scene/zoom */ \\\"../../scene/zoom.ts\\\");\\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../shapes */ \\\"../../shapes.tsx\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _ContextMenu__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./ContextMenu */ \\\"../../components/ContextMenu.tsx\\\");\\n/* harmony import */ var _LayerUI__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./LayerUI */ \\\"../../components/LayerUI.tsx\\\");\\n/* harmony import */ var _Toast__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Toast */ \\\"../../components/Toast.tsx\\\");\\n/* harmony import */ var _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../actions/actionToggleViewMode */ \\\"../../actions/actionToggleViewMode.tsx\\\");\\n/* harmony import */ var _data_blob__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../data/blob */ \\\"../../data/blob.ts\\\");\\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../element/image */ \\\"../../element/image.ts\\\");\\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! lodash.throttle */ \\\"../../../node_modules/lodash.throttle/index.js\\\");\\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_42___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_42__);\\n/* harmony import */ var _data_filesystem__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../data/filesystem */ \\\"../../data/filesystem.ts\\\");\\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../element/textElement */ \\\"../../element/textElement.ts\\\");\\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../element/collision */ \\\"../../element/collision.ts\\\");\\n/* harmony import */ var _element_resizeElements__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../element/resizeElements */ \\\"../../element/resizeElements.ts\\\");\\n/* harmony import */ var _element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ../element/Hyperlink */ \\\"../../element/Hyperlink.tsx\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n\\r\\n\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n//zsviczian\\r\\nlet showFourthFont = false;\\r\\nconst deviceContextInitialValue = {\\r\\n isSmScreen: false,\\r\\n isMobile: false,\\r\\n isTouchScreen: false,\\r\\n canDeviceFitSidebar: false\\r\\n};\\r\\nconst DeviceContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createContext(deviceContextInitialValue);\\r\\nconst useDevice = function () {\\r\\n return (0,react__WEBPACK_IMPORTED_MODULE_2__.useContext)(DeviceContext);\\r\\n};\\r\\nconst ExcalidrawContainerContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createContext({\\r\\n container: null,\\r\\n id: null\\r\\n});\\r\\nconst useExcalidrawContainer = function () {\\r\\n return (0,react__WEBPACK_IMPORTED_MODULE_2__.useContext)(ExcalidrawContainerContext);\\r\\n};\\r\\nlet didTapTwice = false;\\r\\nlet tappedTwiceTimer = 0;\\r\\nlet cursorX = 0;\\r\\nlet cursorY = 0;\\r\\nlet isHoldingSpace = false;\\r\\nlet isPanning = false;\\r\\nlet isDraggingScrollBar = false;\\r\\nlet currentScrollBars = {\\r\\n horizontal: null,\\r\\n vertical: null\\r\\n};\\r\\nlet touchTimeout = 0;\\r\\nlet invalidateContextMenu = false; // remove this hack when we can sync render & resizeObserver (state update)\\r\\n// to rAF. See #5439\\r\\nlet THROTTLE_NEXT_RENDER = true;\\r\\nlet lastPointerUp = null;\\r\\nconst gesture = {\\r\\n pointers: new Map(),\\r\\n lastCenter: null,\\r\\n initialDistance: null,\\r\\n initialScale: null\\r\\n};\\r\\nclass App extends (react__WEBPACK_IMPORTED_MODULE_2___default().Component) {\\r\\n //zsviczian\\r\\n constructor(props) {\\r\\n var _a;\\r\\n var _this;\\r\\n super(props);\\r\\n _this = this;\\r\\n _initialiseProps.call(this);\\r\\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_11__.getDefaultAppState)();\\r\\n const { excalidrawRef, viewModeEnabled = false, zenModeEnabled = false, gridModeEnabled = false, theme = defaultAppState.theme, name = defaultAppState.name } = props;\\r\\n this.state = _objectSpread(_objectSpread(_objectSpread({}, defaultAppState), {}, {\\r\\n theme,\\r\\n isLoading: true\\r\\n }, this.getCanvasOffsets()), {}, {\\r\\n viewModeEnabled,\\r\\n zenModeEnabled,\\r\\n gridSize: gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_13__.GRID_SIZE : null,\\r\\n name,\\r\\n width: window.innerWidth,\\r\\n height: window.innerHeight,\\r\\n showHyperlinkPopup: false,\\r\\n isLibraryMenuDocked: false\\r\\n });\\r\\n this.id = (0,nanoid__WEBPACK_IMPORTED_MODULE_49__.nanoid)();\\r\\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_15__[\\\"default\\\"](this);\\r\\n if (excalidrawRef) {\\r\\n const readyPromise = \\\"current\\\" in excalidrawRef && ((_a = excalidrawRef.current) === null || _a === void 0 ? void 0 : _a.readyPromise) || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resolvablePromise)();\\r\\n const api = {\\r\\n ready: true,\\r\\n readyPromise,\\r\\n updateScene: this.updateScene,\\r\\n updateLibrary: this.library.updateLibrary,\\r\\n addFiles: this.addFiles,\\r\\n resetScene: this.resetScene,\\r\\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\\r\\n history: {\\r\\n clear: this.resetHistory\\r\\n },\\r\\n scrollToContent: this.scrollToContent,\\r\\n zoomToFit: this.zoomToFit,\\r\\n //zsviczian\\r\\n getSceneElements: this.getSceneElements,\\r\\n getAppState: function () {\\r\\n return _this.state;\\r\\n },\\r\\n getFiles: function () {\\r\\n return _this.files;\\r\\n },\\r\\n refresh: this.refresh,\\r\\n setToast: this.setToast,\\r\\n updateContainerSize: this.updateContainerSize,\\r\\n //zsviczian\\r\\n id: this.id,\\r\\n setLocalFont: this.setLocalFont,\\r\\n //zsviczian\\r\\n selectElements: this.selectElements,\\r\\n //zsviczian\\r\\n sendBackward: this.sendBackward,\\r\\n //zsviczian\\r\\n bringForward: this.bringForward,\\r\\n //zsviczian\\r\\n sendToBack: this.sendToBack,\\r\\n //zsviczian\\r\\n bringToFront: this.bringToFront,\\r\\n //zsviczian\\r\\n restore: this.restore,\\r\\n //zsviczian\\r\\n setMobileModeAllowed: this.setMobileModeAllowed,\\r\\n //zsviczian\\r\\n setActiveTool: this.setActiveTool,\\r\\n setCursor: this.setCursor,\\r\\n resetCursor: this.resetCursor\\r\\n };\\r\\n if (typeof excalidrawRef === \\\"function\\\") {\\r\\n excalidrawRef(api);\\r\\n }\\r\\n else {\\r\\n excalidrawRef.current = api;\\r\\n }\\r\\n readyPromise.resolve(api);\\r\\n }\\r\\n this.excalidrawContainerValue = {\\r\\n container: this.excalidrawContainerRef.current,\\r\\n id: this.id\\r\\n };\\r\\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_32__[\\\"default\\\"]();\\r\\n this.history = new _history__WEBPACK_IMPORTED_MODULE_25__[\\\"default\\\"]();\\r\\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_8__.ActionManager(this.syncActionResult, function () {\\r\\n return _this.state;\\r\\n }, function () {\\r\\n return _this.scene.getElementsIncludingDeleted();\\r\\n }, this);\\r\\n this.actionManager.registerAll(_actions_register__WEBPACK_IMPORTED_MODULE_9__.actions);\\r\\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_7__.createUndoAction)(this.history));\\r\\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_7__.createRedoAction)(this.history));\\r\\n }\\r\\n renderCanvas() {\\r\\n const canvasScale = window.devicePixelRatio;\\r\\n const { width: canvasDOMWidth, height: canvasDOMHeight, viewModeEnabled } = this.state;\\r\\n const canvasWidth = canvasDOMWidth * canvasScale;\\r\\n const canvasHeight = canvasDOMHeight * canvasScale;\\r\\n if (viewModeEnabled) {\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"canvas\\\", {\\r\\n className: \\\"excalidraw__canvas\\\",\\r\\n style: {\\r\\n width: canvasDOMWidth,\\r\\n height: canvasDOMHeight,\\r\\n cursor: _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.GRAB\\r\\n },\\r\\n width: canvasWidth,\\r\\n height: canvasHeight,\\r\\n ref: this.handleCanvasRef,\\r\\n onContextMenu: this.handleCanvasContextMenu,\\r\\n onPointerMove: this.handleCanvasPointerMove,\\r\\n onPointerUp: this.handleCanvasPointerUp,\\r\\n onPointerCancel: this.removePointer,\\r\\n onTouchMove: this.handleTouchMove,\\r\\n onPointerDown: this.handleCanvasPointerDown,\\r\\n children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"labels.drawingCanvas\\\")\\r\\n });\\r\\n }\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"canvas\\\", {\\r\\n className: \\\"excalidraw__canvas\\\",\\r\\n style: {\\r\\n width: canvasDOMWidth,\\r\\n height: canvasDOMHeight\\r\\n },\\r\\n width: canvasWidth,\\r\\n height: canvasHeight,\\r\\n ref: this.handleCanvasRef,\\r\\n onContextMenu: this.handleCanvasContextMenu,\\r\\n onPointerDown: this.handleCanvasPointerDown,\\r\\n onDoubleClick: this.handleCanvasDoubleClick,\\r\\n onPointerMove: this.handleCanvasPointerMove,\\r\\n onPointerUp: this.handleCanvasPointerUp,\\r\\n onPointerCancel: this.removePointer,\\r\\n onTouchMove: this.handleTouchMove,\\r\\n children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"labels.drawingCanvas\\\")\\r\\n });\\r\\n }\\r\\n render() {\\r\\n var _a, _b;\\r\\n var _this2 = this;\\r\\n const selectedElement = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\\r\\n const { onCollabButtonClick, renderTopRightUI, renderFooter, renderCustomStats } = this.props;\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"div\\\", {\\r\\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_5__[\\\"default\\\"])(\\\"excalidraw excalidraw-container\\\", {\\r\\n \\\"excalidraw--view-mode\\\": this.state.viewModeEnabled,\\r\\n \\\"excalidraw--mobile\\\": this.device.isMobile || !(this.state.viewModeEnabled || this.state.zenModeEnabled) && this.state.trayModeEnabled //zsviczian\\r\\n }),\\r\\n ref: this.excalidrawContainerRef,\\r\\n onDrop: this.handleAppOnDrop,\\r\\n tabIndex: 0,\\r\\n onKeyDown: this.props.handleKeyboardGlobally ? undefined : this.onKeyDown,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(ExcalidrawContainerContext.Provider, {\\r\\n value: this.excalidrawContainerValue,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsxs)(DeviceContext.Provider, {\\r\\n value: this.device,\\r\\n children: [/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(_LayerUI__WEBPACK_IMPORTED_MODULE_37__[\\\"default\\\"], {\\r\\n canvas: this.canvas,\\r\\n appState: this.state,\\r\\n files: this.files,\\r\\n setAppState: this.setAppState,\\r\\n actionManager: this.actionManager,\\r\\n elements: this.scene.getNonDeletedElements(),\\r\\n onCollabButtonClick: onCollabButtonClick,\\r\\n onLockToggle: this.toggleLock,\\r\\n onPenModeToggle: this.togglePenMode,\\r\\n onInsertElements: function (elements) {\\r\\n return _this2.addElementsFromPasteOrLibrary({\\r\\n elements,\\r\\n position: \\\"center\\\",\\r\\n files: null\\r\\n });\\r\\n },\\r\\n langCode: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.getLanguage)().code,\\r\\n isCollaborating: this.props.isCollaborating,\\r\\n renderTopRightUI: renderTopRightUI,\\r\\n renderCustomFooter: renderFooter,\\r\\n renderCustomStats: renderCustomStats,\\r\\n showExitZenModeBtn: typeof ((_a = this.props) === null || _a === void 0 ? void 0 : _a.zenModeEnabled) === \\\"undefined\\\" && this.state.zenModeEnabled,\\r\\n showThemeBtn: typeof ((_b = this.props) === null || _b === void 0 ? void 0 : _b.theme) === \\\"undefined\\\" && this.props.UIOptions.canvasActions.theme,\\r\\n libraryReturnUrl: this.props.libraryReturnUrl,\\r\\n UIOptions: this.props.UIOptions,\\r\\n focusContainer: this.focusContainer,\\r\\n library: this.library,\\r\\n id: this.id,\\r\\n onImageAction: this.onImageAction\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"div\\\", {\\r\\n className: \\\"excalidraw-textEditorContainer\\\"\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"div\\\", {\\r\\n className: \\\"excalidraw-contextMenuContainer\\\"\\r\\n }), selectedElement.length === 1 && this.state.showHyperlinkPopup && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.Hyperlink, {\\r\\n element: selectedElement[0],\\r\\n appState: this.state,\\r\\n setAppState: this.setAppState,\\r\\n onLinkOpen: this.props.onLinkOpen\\r\\n }, selectedElement[0].id), this.state.toast !== null && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(_Toast__WEBPACK_IMPORTED_MODULE_38__.Toast, {\\r\\n message: this.state.toast.message,\\r\\n onClose: function () {\\r\\n return _this2.setToast(null);\\r\\n },\\r\\n duration: this.state.toast.duration,\\r\\n closable: this.state.toast.closable\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"main\\\", {\\r\\n children: this.renderCanvas()\\r\\n })]\\r\\n })\\r\\n })\\r\\n });\\r\\n }\\r\\n componentDidMount() {\\r\\n var _this3 = this;\\r\\n return (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n var _a, _b;\\r\\n _this3.unmounted = false;\\r\\n _this3.excalidrawContainerValue.container = _this3.excalidrawContainerRef.current;\\r\\n if (\\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_13__.ENV.TEST || \\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_13__.ENV.DEVELOPMENT) {\\r\\n const setState = _this3.setState.bind(_this3);\\r\\n Object.defineProperties(window.h, {\\r\\n state: {\\r\\n configurable: true,\\r\\n get: function () {\\r\\n return _this3.state;\\r\\n }\\r\\n },\\r\\n setState: {\\r\\n configurable: true,\\r\\n value: function () {\\r\\n return _this3.setState(...arguments);\\r\\n }\\r\\n },\\r\\n app: {\\r\\n configurable: true,\\r\\n value: _this3\\r\\n },\\r\\n history: {\\r\\n configurable: true,\\r\\n value: _this3.history\\r\\n }\\r\\n });\\r\\n }\\r\\n _this3.scene.addCallback(_this3.onSceneUpdated);\\r\\n _this3.addEventListeners();\\r\\n if (_this3.excalidrawContainerRef.current) {\\r\\n _this3.focusContainer();\\r\\n }\\r\\n if (_this3.excalidrawContainerRef.current && // bounding rects don't work in tests so updating\\r\\n // the state on init would result in making the test enviro run\\r\\n // in mobile breakpoint (0 width/height), making everything fail\\r\\n \\\"development\\\" !== \\\"test\\\") {\\r\\n _this3.refreshDeviceState(_this3.excalidrawContainerRef.current);\\r\\n }\\r\\n if (\\\"ResizeObserver\\\" in window && ((_a = _this3.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current)) {\\r\\n _this3.resizeObserver = new ResizeObserver(function () {\\r\\n THROTTLE_NEXT_RENDER = false; // recompute device dimensions state\\r\\n // ---------------------------------------------------------------------\\r\\n _this3.refreshDeviceState(_this3.excalidrawContainerRef.current); // refresh offsets\\r\\n // ---------------------------------------------------------------------\\r\\n _this3.updateDOMRect();\\r\\n });\\r\\n (_b = _this3.resizeObserver) === null || _b === void 0 ? void 0 : _b.observe(_this3.excalidrawContainerRef.current);\\r\\n }\\r\\n else if (window.matchMedia) {\\r\\n const mdScreenQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${_constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${_constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_WIDTH_LANDSCAPE}px)`);\\r\\n const smScreenQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_13__.MQ_SM_MAX_WIDTH}px)`);\\r\\n const canDeviceFitSidebarMediaQuery = window.matchMedia(`(min-width: ${ // NOTE this won't update if a different breakpoint is supplied\\r\\n // after mount\\r\\n _this3.props.UIOptions.dockedSidebarBreakpoint != null ? _this3.props.UIOptions.dockedSidebarBreakpoint : _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_RIGHT_SIDEBAR_MIN_WIDTH}px)`);\\r\\n const handler = function () {\\r\\n _this3.excalidrawContainerRef.current.getBoundingClientRect();\\r\\n _this3.device = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateObject)(_this3.device, {\\r\\n isSmScreen: smScreenQuery.matches,\\r\\n isMobile: mdScreenQuery.matches && _this3.allowMobileMode,\\r\\n //zsviczian\\r\\n canDeviceFitSidebar: canDeviceFitSidebarMediaQuery.matches\\r\\n });\\r\\n };\\r\\n mdScreenQuery.addListener(handler);\\r\\n _this3.detachIsMobileMqHandler = function () {\\r\\n return mdScreenQuery.removeListener(handler);\\r\\n };\\r\\n }\\r\\n const searchParams = new URLSearchParams(window.location.search.slice(1));\\r\\n if (searchParams.has(\\\"web-share-target\\\")) {\\r\\n // Obtain a file that was shared via the Web Share Target API.\\r\\n _this3.restoreFileFromShare();\\r\\n }\\r\\n else {\\r\\n _this3.updateDOMRect(_this3.initializeScene);\\r\\n }\\r\\n })();\\r\\n }\\r\\n componentWillUnmount() {\\r\\n var _a;\\r\\n this.files = {};\\r\\n this.imageCache.clear();\\r\\n (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\\r\\n this.unmounted = true;\\r\\n this.removeEventListeners();\\r\\n this.scene.destroy();\\r\\n clearTimeout(touchTimeout);\\r\\n touchTimeout = 0;\\r\\n }\\r\\n removeEventListeners() {\\r\\n var _a, _b, _c, _d, _e;\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, this.removePointer);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.COPY, this.onCopy);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.PASTE, this.pasteFromClipboard);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.CUT, this.onCut);\\r\\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.WHEEL, this.onWheel);\\r\\n (_b = this.nearestScrollableContainer) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.SCROLL, this.onScroll);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYDOWN, this.onKeyDown, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYUP, this.onKeyUp);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.RESIZE, this.onResize, false);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.UNLOAD, this.onUnload, false);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.BLUR, this.onBlur, false);\\r\\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.DRAG_OVER, this.disableEvent, false);\\r\\n (_d = this.excalidrawContainerRef.current) === null || _d === void 0 ? void 0 : _d.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.DROP, this.disableEvent, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.GESTURE_START, this.onGestureStart, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.GESTURE_END, this.onGestureEnd, false);\\r\\n (_e = this.detachIsMobileMqHandler) === null || _e === void 0 ? void 0 : _e.call(this);\\r\\n }\\r\\n addEventListeners() {\\r\\n var _a, _b, _c, _d, _e;\\r\\n this.removeEventListeners();\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, this.removePointer); // #3553\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.COPY, this.onCopy);\\r\\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.WHEEL, this.onWheel, {\\r\\n passive: false\\r\\n });\\r\\n if (this.props.handleKeyboardGlobally) {\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYDOWN, this.onKeyDown, false);\\r\\n }\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYUP, this.onKeyUp, {\\r\\n passive: true\\r\\n });\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition); // rerender text elements on font load to fix #637 && #1553\\r\\n (_c = (_b = document.fonts) === null || _b === void 0 ? void 0 : _b.addEventListener) === null || _c === void 0 ? void 0 : _c.call(_b, \\\"loadingdone\\\", this.onFontLoaded); // Safari-only desktop pinch zoom\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.GESTURE_START, this.onGestureStart, false);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.GESTURE_END, this.onGestureEnd, false);\\r\\n if (this.state.viewModeEnabled) {\\r\\n return;\\r\\n }\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.PASTE, this.pasteFromClipboard);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.CUT, this.onCut);\\r\\n if (this.props.detectScroll) {\\r\\n this.nearestScrollableContainer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.getNearestScrollableContainer)(this.excalidrawContainerRef.current);\\r\\n this.nearestScrollableContainer.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.SCROLL, this.onScroll);\\r\\n }\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.RESIZE, this.onResize, false);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.UNLOAD, this.onUnload, false);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.BLUR, this.onBlur, false);\\r\\n (_d = this.excalidrawContainerRef.current) === null || _d === void 0 ? void 0 : _d.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.DRAG_OVER, this.disableEvent, false);\\r\\n (_e = this.excalidrawContainerRef.current) === null || _e === void 0 ? void 0 : _e.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.DROP, this.disableEvent, false);\\r\\n }\\r\\n componentDidUpdate(prevProps, prevState) {\\r\\n var _a, _b, _c, _d, _e;\\r\\n var _this4 = this;\\r\\n if (this.excalidrawContainerRef.current && prevProps.UIOptions.dockedSidebarBreakpoint !== this.props.UIOptions.dockedSidebarBreakpoint) {\\r\\n this.refreshDeviceState(this.excalidrawContainerRef.current);\\r\\n }\\r\\n if (prevState.scrollX !== this.state.scrollX || prevState.scrollY !== this.state.scrollY) {\\r\\n (_b = (_a = this.props) === null || _a === void 0 ? void 0 : _a.onScrollChange) === null || _b === void 0 ? void 0 : _b.call(_a, this.state.scrollX, this.state.scrollY);\\r\\n }\\r\\n if (Object.keys(this.state.selectedElementIds).length && (0,_appState__WEBPACK_IMPORTED_MODULE_11__.isEraserActive)(this.state)) {\\r\\n this.setState({\\r\\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateActiveTool)(this.state, {\\r\\n type: \\\"selection\\\"\\r\\n })\\r\\n });\\r\\n }\\r\\n if (this.state.activeTool.type === \\\"eraser\\\" && prevState.theme !== this.state.theme) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setEraserCursor)(this.canvas, this.state.theme);\\r\\n } // Hide hyperlink popup if shown when element type is not selection\\r\\n if (prevState.activeTool.type === \\\"selection\\\" && this.state.activeTool.type !== \\\"selection\\\" && this.state.showHyperlinkPopup) {\\r\\n this.setState({\\r\\n showHyperlinkPopup: false\\r\\n });\\r\\n }\\r\\n if (prevProps.langCode !== this.props.langCode) {\\r\\n this.updateLanguage();\\r\\n }\\r\\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\\r\\n this.setState({\\r\\n viewModeEnabled: !!this.props.viewModeEnabled\\r\\n });\\r\\n }\\r\\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\\r\\n this.addEventListeners();\\r\\n this.deselectElements();\\r\\n }\\r\\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\\r\\n this.setState({\\r\\n zenModeEnabled: !!this.props.zenModeEnabled\\r\\n });\\r\\n }\\r\\n if (prevProps.theme !== this.props.theme && this.props.theme) {\\r\\n this.setState({\\r\\n theme: this.props.theme\\r\\n });\\r\\n }\\r\\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\\r\\n this.setState({\\r\\n gridSize: this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_13__.GRID_SIZE : null\\r\\n });\\r\\n }\\r\\n if (this.props.name && prevProps.name !== this.props.name) {\\r\\n this.setState({\\r\\n name: this.props.name\\r\\n });\\r\\n }\\r\\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.classList.toggle(\\\"theme--dark\\\", this.state.theme === \\\"dark\\\");\\r\\n if (this.state.editingLinearElement && !this.state.selectedElementIds[this.state.editingLinearElement.elementId]) {\\r\\n // defer so that the commitToHistory flag isn't reset via current update\\r\\n setTimeout(function () {\\r\\n _this4.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n });\\r\\n }\\r\\n const { multiElement } = prevState;\\r\\n if (prevState.activeTool !== this.state.activeTool && multiElement != null && (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(this.state) && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(multiElement, false)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(multiElement, this.state, this.scene, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)(_element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiElement, -1)));\\r\\n }\\r\\n const cursorButton = {};\\r\\n const pointerViewportCoords = {};\\r\\n const remoteSelectedElementIds = {};\\r\\n const pointerUsernames = {};\\r\\n const pointerUserStates = {};\\r\\n this.state.collaborators.forEach(function (user, socketId) {\\r\\n if (user.selectedElementIds) {\\r\\n for (const id of Object.keys(user.selectedElementIds)) {\\r\\n if (!(id in remoteSelectedElementIds)) {\\r\\n remoteSelectedElementIds[id] = [];\\r\\n }\\r\\n remoteSelectedElementIds[id].push(socketId);\\r\\n }\\r\\n }\\r\\n if (!user.pointer) {\\r\\n return;\\r\\n }\\r\\n if (user.username) {\\r\\n pointerUsernames[socketId] = user.username;\\r\\n }\\r\\n if (user.userState) {\\r\\n pointerUserStates[socketId] = user.userState;\\r\\n }\\r\\n pointerViewportCoords[socketId] = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: user.pointer.x,\\r\\n sceneY: user.pointer.y\\r\\n }, _this4.state);\\r\\n cursorButton[socketId] = user.button;\\r\\n });\\r\\n const renderingElements = this.scene.getNonDeletedElements().filter(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(element)) {\\r\\n if ( // not placed on canvas yet (but in elements array)\\r\\n _this4.state.pendingImageElementId === element.id) {\\r\\n return false;\\r\\n }\\r\\n } // don't render text element that's being currently edited (it's\\r\\n // rendered on remote only)\\r\\n return !_this4.state.editingElement || _this4.state.editingElement.type !== \\\"text\\\" || element.id !== _this4.state.editingElement.id;\\r\\n });\\r\\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_29__.renderScene)(renderingElements, this.state, this.state.selectionElement, window.devicePixelRatio, this.rc, this.canvas, {\\r\\n scrollX: this.state.scrollX,\\r\\n scrollY: this.state.scrollY,\\r\\n viewBackgroundColor: this.state.viewBackgroundColor,\\r\\n zoom: this.state.zoom,\\r\\n remotePointerViewportCoords: pointerViewportCoords,\\r\\n remotePointerButton: cursorButton,\\r\\n remoteSelectedElementIds,\\r\\n remotePointerUsernames: pointerUsernames,\\r\\n remotePointerUserStates: pointerUserStates,\\r\\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\\r\\n theme: this.state.theme,\\r\\n imageCache: this.imageCache,\\r\\n isExporting: false,\\r\\n renderScrollbars: !this.device.isMobile\\r\\n }, function (_ref) {\\r\\n let { atLeastOneVisibleElement, scrollBars } = _ref;\\r\\n if (scrollBars) {\\r\\n currentScrollBars = scrollBars;\\r\\n }\\r\\n const scrolledOutside = // hide when editing text\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this4.state.editingElement) ? false : !atLeastOneVisibleElement && renderingElements.length > 0;\\r\\n if (_this4.state.scrolledOutside !== scrolledOutside) {\\r\\n _this4.setState({\\r\\n scrolledOutside\\r\\n });\\r\\n }\\r\\n _this4.scheduleImageRefresh();\\r\\n }, THROTTLE_NEXT_RENDER && window.EXCALIDRAW_THROTTLE_RENDER === true);\\r\\n if (!THROTTLE_NEXT_RENDER) {\\r\\n THROTTLE_NEXT_RENDER = true;\\r\\n }\\r\\n this.history.record(this.state, this.scene.getElementsIncludingDeleted()); // Do not notify consumers if we're still loading the scene. Among other\\r\\n // potential issues, this fixes a case where the tab isn't focused during\\r\\n // init, which would trigger onChange with empty elements, which would then\\r\\n // override whatever is in localStorage currently.\\r\\n if (!this.state.isLoading) {\\r\\n (_e = (_d = this.props).onChange) === null || _e === void 0 ? void 0 : _e.call(_d, this.scene.getElementsIncludingDeleted(), this.state, this.files);\\r\\n }\\r\\n }\\r\\n static resetTapTwice() {\\r\\n didTapTwice = false;\\r\\n }\\r\\n addTextFromPaste(text) {\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: cursorX,\\r\\n clientY: cursorY\\r\\n }, this.state);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\\r\\n x,\\r\\n y,\\r\\n strokeColor: this.state.currentItemStrokeColor,\\r\\n backgroundColor: this.state.currentItemBackgroundColor,\\r\\n fillStyle: this.state.currentItemFillStyle,\\r\\n strokeWidth: this.state.currentItemStrokeWidth,\\r\\n strokeStyle: this.state.currentItemStrokeStyle,\\r\\n roughness: this.state.currentItemRoughness,\\r\\n opacity: this.state.currentItemOpacity,\\r\\n strokeSharpness: this.state.currentItemStrokeSharpness,\\r\\n text,\\r\\n rawText: text,\\r\\n fontSize: this.state.currentItemFontSize,\\r\\n fontFamily: this.state.currentItemFontFamily,\\r\\n textAlign: this.state.currentItemTextAlign,\\r\\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_13__.DEFAULT_VERTICAL_ALIGN,\\r\\n locked: false\\r\\n });\\r\\n this.scene.replaceAllElements([...this.scene.getElementsIncludingDeleted(), element]);\\r\\n this.setState({\\r\\n selectedElementIds: {\\r\\n [element.id]: true\\r\\n }\\r\\n });\\r\\n this.history.resumeRecording();\\r\\n } // Collaboration\\r\\n handleTextWysiwyg(element, _ref2) {\\r\\n var _this5 = this;\\r\\n let { isExistingElement = false } = _ref2;\\r\\n const updateElement = function (text, originalText, isDeleted, rawText, link) {\\r\\n _this5.scene.replaceAllElements([..._this5.scene.getElementsIncludingDeleted().map(function (_element) {\\r\\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\\r\\n text,\\r\\n isDeleted,\\r\\n originalText,\\r\\n rawText: rawText !== null && rawText !== void 0 ? rawText : originalText,\\r\\n link\\r\\n });\\r\\n }\\r\\n return _element;\\r\\n })]);\\r\\n };\\r\\n if (isExistingElement && this.props.onBeforeTextEdit) {\\r\\n const text = this.props.onBeforeTextEdit(element);\\r\\n if (text) {\\r\\n this.scene.replaceAllElements([...this.scene.getElementsIncludingDeleted().map(function (_element) {\\r\\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\\r\\n element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\\r\\n text,\\r\\n isDeleted: false,\\r\\n originalText: text\\r\\n });\\r\\n return element;\\r\\n }\\r\\n return _element;\\r\\n })]);\\r\\n }\\r\\n }\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.textWysiwyg)({\\r\\n id: element.id,\\r\\n canvas: this.canvas,\\r\\n getViewportCoords: function (x, y) {\\r\\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: x,\\r\\n sceneY: y\\r\\n }, _this5.state);\\r\\n return [viewportX - _this5.state.offsetLeft, viewportY - _this5.state.offsetTop];\\r\\n },\\r\\n onChange: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (text) {\\r\\n updateElement(text, text, false);\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element);\\r\\n }\\r\\n }),\\r\\n onSubmit: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (_ref3) {\\r\\n let { text, viaKeyboard, originalText } = _ref3;\\r\\n const isDeleted = !text.trim();\\r\\n const rawText = originalText; //should this be originalText??\\r\\n let link = undefined;\\r\\n if (_this5.props.onBeforeTextSubmit) {\\r\\n const [updatedText, updatedOriginalText, l] = _this5.props.onBeforeTextSubmit(element, text, originalText, isDeleted);\\r\\n text = updatedText !== null && updatedText !== void 0 ? updatedText : text;\\r\\n originalText = updatedOriginalText !== null && updatedOriginalText !== void 0 ? updatedOriginalText : originalText;\\r\\n link = l;\\r\\n }\\r\\n updateElement(text, originalText, isDeleted, rawText, link); // select the created text element only if submitting via keyboard\\r\\n // (when submitting via click it should act as signal to deselect)\\r\\n if (!isDeleted && viaKeyboard) {\\r\\n const elementIdToSelect = element.containerId ? element.containerId : element.id;\\r\\n _this5.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [elementIdToSelect]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n if (isDeleted) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDeletion)(_this5.scene.getNonDeletedElements(), [element]);\\r\\n }\\r\\n if (!isDeleted || isExistingElement) {\\r\\n _this5.history.resumeRecording();\\r\\n }\\r\\n _this5.setState({\\r\\n draggingElement: null,\\r\\n editingElement: null\\r\\n });\\r\\n if (_this5.state.activeTool.locked) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this5.canvas, _this5.state);\\r\\n }\\r\\n _this5.focusContainer();\\r\\n }),\\r\\n element,\\r\\n excalidrawContainer: this.excalidrawContainerRef.current,\\r\\n app: this\\r\\n }); // deselect all other elements when inserting text\\r\\n this.deselectElements(); // do an initial update to re-initialize element position since we were\\r\\n // modifying element's x/y for sake of editor (case: syncing to remote)\\r\\n updateElement(element.text, element.originalText, false);\\r\\n }\\r\\n deselectElements() {\\r\\n this.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n getTextElementAtPosition(x, y) {\\r\\n const element = this.getElementAtPosition(x, y, {\\r\\n includeBoundTextElement: true\\r\\n });\\r\\n if (element && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element) && !element.isDeleted) {\\r\\n return element;\\r\\n }\\r\\n return null;\\r\\n }\\r\\n getElementAtPosition(x, y, opts) {\\r\\n const allHitElements = this.getElementsAtPosition(x, y, opts === null || opts === void 0 ? void 0 : opts.includeBoundTextElement, opts === null || opts === void 0 ? void 0 : opts.includeLockedElements);\\r\\n if (allHitElements.length > 1) {\\r\\n if (opts === null || opts === void 0 ? void 0 : opts.preferSelected) {\\r\\n for (let index = allHitElements.length - 1; index > -1; index--) {\\r\\n if (this.state.selectedElementIds[allHitElements[index].id]) {\\r\\n return allHitElements[index];\\r\\n }\\r\\n }\\r\\n }\\r\\n const elementWithHighestZIndex = allHitElements[allHitElements.length - 1]; // If we're hitting element with highest z-index only on its bounding box\\r\\n // while also hitting other element figure, the latter should be considered.\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(elementWithHighestZIndex, this.state, x, y) ? allHitElements[allHitElements.length - 2] : elementWithHighestZIndex;\\r\\n }\\r\\n if (allHitElements.length === 1) {\\r\\n return allHitElements[0];\\r\\n }\\r\\n return null;\\r\\n }\\r\\n getElementsAtPosition(x, y) {\\r\\n var _this6 = this;\\r\\n let includeBoundTextElement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\\r\\n let includeLockedElements = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\\r\\n const elements = includeBoundTextElement && includeLockedElements ? this.scene.getNonDeletedElements() : this.scene.getNonDeletedElements().filter(function (element) {\\r\\n return (includeLockedElements || !element.locked) && (includeBoundTextElement || !((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element) && element.containerId));\\r\\n });\\r\\n return (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsAtPosition)(elements, function (element) {\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.hitTest)(element, _this6.state, x, y);\\r\\n });\\r\\n }\\r\\n maybeCleanupAfterMissingPointerUp(event) {\\r\\n if (lastPointerUp !== null) {\\r\\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\\r\\n // this can happen when a contextual menu or alert is triggered. In order to avoid\\r\\n // being in a weird state, we clean up on the next pointerdown\\r\\n lastPointerUp(event);\\r\\n }\\r\\n } // Returns whether the event is a panning\\r\\n updateGestureOnPointerDown(event) {\\r\\n gesture.pointers.set(event.pointerId, {\\r\\n x: event.clientX,\\r\\n y: event.clientY\\r\\n });\\r\\n if (gesture.pointers.size === 2) {\\r\\n gesture.lastCenter = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\\r\\n gesture.initialScale = this.state.zoom.value;\\r\\n gesture.initialDistance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\\r\\n }\\r\\n }\\r\\n initialPointerDownState(event) {\\r\\n const origin = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\\r\\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\\r\\n return {\\r\\n origin,\\r\\n withCmdOrCtrl: event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD],\\r\\n originInGrid: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(origin.x, origin.y, this.state.gridSize)),\\r\\n scrollbars: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop),\\r\\n // we need to duplicate because we'll be updating this state\\r\\n lastCoords: _objectSpread({}, origin),\\r\\n originalElements: this.scene.getNonDeletedElements().reduce(function (acc, element) {\\r\\n acc.set(element.id, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.deepCopyElement)(element));\\r\\n return acc;\\r\\n }, new Map()),\\r\\n resize: {\\r\\n handleType: false,\\r\\n isResizing: false,\\r\\n offset: {\\r\\n x: 0,\\r\\n y: 0\\r\\n },\\r\\n arrowDirection: \\\"origin\\\",\\r\\n center: {\\r\\n x: (maxX + minX) / 2,\\r\\n y: (maxY + minY) / 2\\r\\n }\\r\\n },\\r\\n hit: {\\r\\n element: null,\\r\\n allHitElements: [],\\r\\n wasAddedToSelection: false,\\r\\n hasBeenDuplicated: false,\\r\\n hasHitCommonBoundingBoxOfSelectedElements: this.isHittingCommonBoundingBoxOfSelectedElements(origin, selectedElements),\\r\\n hasHitElementInside: false\\r\\n },\\r\\n drag: {\\r\\n hasOccurred: false,\\r\\n offset: null\\r\\n },\\r\\n eventListeners: {\\r\\n onMove: null,\\r\\n onUp: null,\\r\\n onKeyUp: null,\\r\\n onKeyDown: null\\r\\n },\\r\\n boxSelection: {\\r\\n hasOccurred: false\\r\\n },\\r\\n elementIdsToErase: {}\\r\\n };\\r\\n } // Returns whether the event is a dragging a scrollbar\\r\\n handleDraggingScrollBar(event, pointerDownState) {\\r\\n var _this7 = this;\\r\\n if (!(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)) {\\r\\n return false;\\r\\n }\\r\\n isDraggingScrollBar = true;\\r\\n pointerDownState.lastCoords.x = event.clientX;\\r\\n pointerDownState.lastCoords.y = event.clientY;\\r\\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdatesThrottled)(function (event) {\\r\\n const target = event.target;\\r\\n if (!(target instanceof HTMLElement)) {\\r\\n return;\\r\\n }\\r\\n _this7.handlePointerMoveOverScrollbars(event, pointerDownState);\\r\\n });\\r\\n const onPointerUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n isDraggingScrollBar = false;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this7.canvas, _this7.state);\\r\\n lastPointerUp = null;\\r\\n _this7.setState({\\r\\n cursorButton: \\\"up\\\"\\r\\n });\\r\\n _this7.savePointer(event.clientX, event.clientY, \\\"up\\\");\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, onPointerUp);\\r\\n onPointerMove.flush();\\r\\n });\\r\\n lastPointerUp = onPointerUp;\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, onPointerUp);\\r\\n return true;\\r\\n }\\r\\n isASelectedElement(hitElement) {\\r\\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\\r\\n }\\r\\n isHittingCommonBoundingBoxOfSelectedElements(point, selectedElements) {\\r\\n if (selectedElements.length < 2) {\\r\\n return false;\\r\\n } // How many pixels off the shape boundary we still consider a hit\\r\\n const threshold = 10 / this.state.zoom.value;\\r\\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\\r\\n return point.x > x1 - threshold && point.x < x2 + threshold && point.y > y1 - threshold && point.y < y2 + threshold;\\r\\n }\\r\\n onKeyDownFromPointerDownHandler(pointerDownState) {\\r\\n var _this8 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n if (_this8.maybeHandleResize(pointerDownState, event)) {\\r\\n return;\\r\\n }\\r\\n _this8.maybeDragNewGenericElement(pointerDownState, event);\\r\\n });\\r\\n }\\r\\n onKeyUpFromPointerDownHandler(pointerDownState) {\\r\\n var _this9 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n // Prevents focus from escaping excalidraw tab\\r\\n event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ALT && event.preventDefault();\\r\\n if (_this9.maybeHandleResize(pointerDownState, event)) {\\r\\n return;\\r\\n }\\r\\n _this9.maybeDragNewGenericElement(pointerDownState, event);\\r\\n });\\r\\n }\\r\\n onPointerMoveFromPointerDownHandler(pointerDownState) {\\r\\n var _this10 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdatesThrottled)(function (event) {\\r\\n var _a, _b;\\r\\n // We need to initialize dragOffsetXY only after we've updated\\r\\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\\r\\n // event handler should hopefully ensure we're already working with\\r\\n // the updated state.\\r\\n if (pointerDownState.drag.offset === null) {\\r\\n pointerDownState.drag.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getDragOffsetXY)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this10.scene.getNonDeletedElements(), _this10.state), pointerDownState.origin.x, pointerDownState.origin.y));\\r\\n }\\r\\n const target = event.target;\\r\\n if (!(target instanceof HTMLElement)) {\\r\\n return;\\r\\n }\\r\\n if (_this10.handlePointerMoveOverScrollbars(event, pointerDownState)) {\\r\\n return;\\r\\n }\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this10.state);\\r\\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_11__.isEraserActive)(_this10.state)) {\\r\\n _this10.handleEraser(event, pointerDownState, pointerCoords);\\r\\n return;\\r\\n }\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, _this10.state.gridSize); // for arrows/lines, don't start dragging until a given threshold\\r\\n // to ensure we don't create a 2-point arrow by mistake when\\r\\n // user clicks mouse in a way that it moves a tiny bit (thus\\r\\n // triggering pointermove)\\r\\n if (!pointerDownState.drag.hasOccurred && (_this10.state.activeTool.type === \\\"arrow\\\" || _this10.state.activeTool.type === \\\"line\\\")) {\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerCoords.x, pointerCoords.y, pointerDownState.origin.x, pointerDownState.origin.y) < _constants__WEBPACK_IMPORTED_MODULE_13__.DRAGGING_THRESHOLD) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n if (pointerDownState.resize.isResizing) {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n if (_this10.maybeHandleResize(pointerDownState, event)) {\\r\\n return true;\\r\\n }\\r\\n }\\r\\n if (_this10.state.editingLinearElement) {\\r\\n const didDrag = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointDragging(_this10.state, function (appState) {\\r\\n return _this10.setState(appState);\\r\\n }, pointerCoords.x, pointerCoords.y, function (element, pointsSceneCoords) {\\r\\n _this10.maybeSuggestBindingsForLinearElementAtCoords(element, pointsSceneCoords);\\r\\n });\\r\\n if (didDrag) {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n return;\\r\\n }\\r\\n }\\r\\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some(function (element) {\\r\\n return _this10.isASelectedElement(element);\\r\\n });\\r\\n if ((hasHitASelectedElement || pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) && ( // this allows for box-selecting points when clicking inside the\\r\\n // line's bounding box\\r\\n !_this10.state.editingLinearElement || !event.shiftKey) && ( // box-selecting without shift when editing line, not clicking on a line\\r\\n !_this10.state.editingLinearElement || ((_a = _this10.state.editingLinearElement) === null || _a === void 0 ? void 0 : _a.elementId) !== ((_b = pointerDownState.hit.element) === null || _b === void 0 ? void 0 : _b.id) || pointerDownState.hit.hasHitElementInside)) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this10.scene.getNonDeletedElements(), _this10.state);\\r\\n if (selectedElements.every(function (element) {\\r\\n return element.locked;\\r\\n })) {\\r\\n return;\\r\\n } // Marking that click was used for dragging to check\\r\\n // if elements should be deselected on pointerup\\r\\n pointerDownState.drag.hasOccurred = true; // prevent dragging even if we're no longer holding cmd/ctrl otherwise\\r\\n // it would have weird results (stuff jumping all over the screen)\\r\\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\\r\\n const [dragX, dragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.drag.offset.x, pointerCoords.y - pointerDownState.drag.offset.y, _this10.state.gridSize);\\r\\n const [dragDistanceX, dragDistanceY] = [Math.abs(pointerCoords.x - pointerDownState.origin.x), Math.abs(pointerCoords.y - pointerDownState.origin.y)]; // We only drag in one direction if shift is pressed\\r\\n const lockDirection = event.shiftKey;\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragSelectedElements)(pointerDownState, selectedElements, dragX, dragY, lockDirection, dragDistanceX, dragDistanceY, _this10.state);\\r\\n _this10.maybeSuggestBindingForAll(selectedElements); // We duplicate the selected element if alt is pressed on pointer move\\r\\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\\r\\n // Move the currently selected elements to the top of the z index stack, and\\r\\n // put the duplicates where the selected elements used to be.\\r\\n // (the origin point where the dragging started)\\r\\n pointerDownState.hit.hasBeenDuplicated = true;\\r\\n const nextElements = [];\\r\\n const elementsToAppend = [];\\r\\n const groupIdMap = new Map();\\r\\n const oldIdToDuplicatedId = new Map();\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n const elements = _this10.scene.getElementsIncludingDeleted();\\r\\n const selectedElementIds = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this10.state, true).map(function (element) {\\r\\n return element.id;\\r\\n });\\r\\n for (const element of elements) {\\r\\n if (selectedElementIds.includes(element.id) || // case: the state.selectedElementIds might not have been\\r\\n // updated yet by the time this mousemove event is fired\\r\\n element.id === (hitElement === null || hitElement === void 0 ? void 0 : hitElement.id) && pointerDownState.hit.wasAddedToSelection) {\\r\\n const duplicatedElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(_this10.state.editingGroupId, groupIdMap, element);\\r\\n const [originDragX, originDragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x - pointerDownState.drag.offset.x, pointerDownState.origin.y - pointerDownState.drag.offset.y, _this10.state.gridSize);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(duplicatedElement, {\\r\\n x: duplicatedElement.x + (originDragX - dragX),\\r\\n y: duplicatedElement.y + (originDragY - dragY)\\r\\n });\\r\\n nextElements.push(duplicatedElement);\\r\\n elementsToAppend.push(element);\\r\\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\\r\\n }\\r\\n else {\\r\\n nextElements.push(element);\\r\\n }\\r\\n }\\r\\n const nextSceneElements = [...nextElements, ...elementsToAppend];\\r\\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.bindTextToShapeAfterDuplication)(nextElements, elementsToAppend, oldIdToDuplicatedId);\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, \\\"duplicatesServeAsOld\\\");\\r\\n _this10.scene.replaceAllElements(nextSceneElements);\\r\\n }\\r\\n return;\\r\\n }\\r\\n } // It is very important to read this.state within each move event,\\r\\n // otherwise we would read a stale one!\\r\\n const draggingElement = _this10.state.draggingElement;\\r\\n if (!draggingElement) {\\r\\n return;\\r\\n }\\r\\n if (draggingElement.type === \\\"freedraw\\\") {\\r\\n const points = draggingElement.points;\\r\\n const dx = pointerCoords.x - draggingElement.x;\\r\\n const dy = pointerCoords.y - draggingElement.y;\\r\\n const lastPoint = points.length > 0 && points[points.length - 1];\\r\\n const discardPoint = lastPoint && lastPoint[0] === dx && lastPoint[1] === dy;\\r\\n if (!discardPoint) {\\r\\n const pressures = draggingElement.simulatePressure ? draggingElement.pressures : [...draggingElement.pressures, event.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]],\\r\\n pressures\\r\\n });\\r\\n }\\r\\n }\\r\\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\\r\\n pointerDownState.drag.hasOccurred = true;\\r\\n const points = draggingElement.points;\\r\\n let dx = gridX - draggingElement.x;\\r\\n let dy = gridY - draggingElement.y;\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldRotateWithDiscreteAngle)(event) && points.length === 2) {\\r\\n ({\\r\\n width: dx,\\r\\n height: dy\\r\\n } = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getPerfectElementSize)(_this10.state.activeTool.type, dx, dy));\\r\\n }\\r\\n if (points.length === 1) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]]\\r\\n });\\r\\n }\\r\\n else if (points.length > 1) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points.slice(0, -1), [dx, dy]]\\r\\n });\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement, false)) {\\r\\n // When creating a linear element by dragging\\r\\n _this10.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [pointerCoords], _this10.state.startBoundElement);\\r\\n }\\r\\n }\\r\\n else {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n _this10.maybeDragNewGenericElement(pointerDownState, event);\\r\\n }\\r\\n if (_this10.state.activeTool.type === \\\"selection\\\") {\\r\\n pointerDownState.boxSelection.hasOccurred = true;\\r\\n const elements = _this10.scene.getNonDeletedElements();\\r\\n if (!event.shiftKey && // allows for box-selecting points (without shift)\\r\\n !_this10.state.editingLinearElement && (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(elements, _this10.state)) {\\r\\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\\r\\n _this10.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: {\\r\\n [pointerDownState.hit.element.id]: true\\r\\n }\\r\\n }), _this10.scene.getNonDeletedElements());\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this10.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n } // box-select line editor points\\r\\n if (_this10.state.editingLinearElement) {\\r\\n _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handleBoxSelection(event, _this10.state, _this10.setState.bind(_this10)); // regular box-select\\r\\n }\\r\\n else {\\r\\n const elementsWithinSelection = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsWithinSelection)(elements, draggingElement);\\r\\n _this10.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread(_objectSpread({}, prevState.selectedElementIds), elementsWithinSelection.reduce(function (acc, element) {\\r\\n acc[element.id] = true;\\r\\n return acc;\\r\\n }, {})), pointerDownState.hit.element ? {\\r\\n // if using ctrl/cmd, select the hitElement only if we\\r\\n // haven't box-selected anything else\\r\\n [pointerDownState.hit.element.id]: !elementsWithinSelection.length\\r\\n } : null),\\r\\n showHyperlinkPopup: elementsWithinSelection.length === 1 && elementsWithinSelection[0].link ? \\\"info\\\" : false\\r\\n }), _this10.scene.getNonDeletedElements());\\r\\n });\\r\\n }\\r\\n }\\r\\n });\\r\\n } // Returns whether the pointer move happened over either scrollbar\\r\\n handlePointerMoveOverScrollbars(event, pointerDownState) {\\r\\n if (pointerDownState.scrollbars.isOverHorizontal) {\\r\\n const x = event.clientX;\\r\\n const dx = x - pointerDownState.lastCoords.x;\\r\\n this.setState({\\r\\n scrollX: this.state.scrollX - dx / this.state.zoom.value\\r\\n });\\r\\n pointerDownState.lastCoords.x = x;\\r\\n return true;\\r\\n }\\r\\n if (pointerDownState.scrollbars.isOverVertical) {\\r\\n const y = event.clientY;\\r\\n const dy = y - pointerDownState.lastCoords.y;\\r\\n this.setState({\\r\\n scrollY: this.state.scrollY - dy / this.state.zoom.value\\r\\n });\\r\\n pointerDownState.lastCoords.y = y;\\r\\n return true;\\r\\n }\\r\\n return false;\\r\\n }\\r\\n onPointerUpFromPointerDownHandler(pointerDownState) {\\r\\n var _this11 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (childEvent) {\\r\\n var _a, _b;\\r\\n const { draggingElement, resizingElement, multiElement, activeTool, isResizing, isRotating } = _this11.state;\\r\\n _this11.setState({\\r\\n isResizing: false,\\r\\n isRotating: false,\\r\\n resizingElement: null,\\r\\n selectionElement: null,\\r\\n cursorButton: \\\"up\\\",\\r\\n // text elements are reset on finalize, and resetting on pointerup\\r\\n // may cause issues with double taps\\r\\n editingElement: multiElement || (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this11.state.editingElement) ? _this11.state.editingElement : null\\r\\n });\\r\\n _this11.savePointer(childEvent.clientX, childEvent.clientY, \\\"up\\\"); // Handle end of dragging a point of a linear element, might close a loop\\r\\n // and sets binding element\\r\\n if (_this11.state.editingLinearElement) {\\r\\n if (!pointerDownState.boxSelection.hasOccurred && (((_b = (_a = pointerDownState.hit) === null || _a === void 0 ? void 0 : _a.element) === null || _b === void 0 ? void 0 : _b.id) !== _this11.state.editingLinearElement.elementId || !pointerDownState.hit.hasHitElementInside)) {\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n }\\r\\n else {\\r\\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerUp(childEvent, _this11.state.editingLinearElement, _this11.state);\\r\\n if (editingLinearElement !== _this11.state.editingLinearElement) {\\r\\n _this11.setState({\\r\\n editingLinearElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n }\\r\\n }\\r\\n lastPointerUp = null;\\r\\n if (pointerDownState.eventListeners.onMove) {\\r\\n pointerDownState.eventListeners.onMove.flush();\\r\\n }\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_MOVE, pointerDownState.eventListeners.onMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, pointerDownState.eventListeners.onUp);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYDOWN, pointerDownState.eventListeners.onKeyDown);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYUP, pointerDownState.eventListeners.onKeyUp);\\r\\n if (_this11.state.pendingImageElementId) {\\r\\n _this11.setState({\\r\\n pendingImageElementId: null\\r\\n });\\r\\n }\\r\\n if ((draggingElement === null || draggingElement === void 0 ? void 0 : draggingElement.type) === \\\"freedraw\\\") {\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, _this11.state);\\r\\n const points = draggingElement.points;\\r\\n let dx = pointerCoords.x - draggingElement.x;\\r\\n let dy = pointerCoords.y - draggingElement.y; // Allows dots to avoid being flagged as infinitely small\\r\\n if (dx === points[0][0] && dy === points[0][1]) {\\r\\n dy += 0.0001;\\r\\n dx += 0.0001;\\r\\n }\\r\\n const pressures = draggingElement.simulatePressure ? [] : [...draggingElement.pressures, childEvent.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]],\\r\\n pressures,\\r\\n lastCommittedPoint: [dx, dy]\\r\\n });\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(draggingElement)) {\\r\\n const imageElement = draggingElement;\\r\\n try {\\r\\n _this11.initializeImageDimensions(imageElement);\\r\\n _this11.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().filter(function (el) {\\r\\n return el.id !== imageElement.id;\\r\\n }));\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n }\\r\\n return;\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\\r\\n if (draggingElement.points.length > 1) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, _this11.state);\\r\\n if (!pointerDownState.drag.hasOccurred && draggingElement && !multiElement) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...draggingElement.points, [pointerCoords.x - draggingElement.x, pointerCoords.y - draggingElement.y]]\\r\\n });\\r\\n _this11.setState({\\r\\n multiElement: draggingElement,\\r\\n editingElement: _this11.state.draggingElement\\r\\n });\\r\\n }\\r\\n else if (pointerDownState.drag.hasOccurred && !multiElement) {\\r\\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this11.state) && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement, false)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(draggingElement, _this11.state, _this11.scene, pointerCoords);\\r\\n }\\r\\n _this11.setState({\\r\\n suggestedBindings: [],\\r\\n startBoundElement: null\\r\\n });\\r\\n if (!activeTool.locked) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this11.canvas);\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n draggingElement: null,\\r\\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateActiveTool)(_this11.state, {\\r\\n type: \\\"selection\\\"\\r\\n }),\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n draggingElement: null,\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n }\\r\\n return;\\r\\n }\\r\\n if (activeTool.type !== \\\"selection\\\" && draggingElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(draggingElement)) {\\r\\n // remove invisible element which was added in onPointerDown\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().slice(0, -1));\\r\\n _this11.setState({\\r\\n draggingElement: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (draggingElement) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getNormalizedDimensions)(draggingElement));\\r\\n }\\r\\n if (resizingElement) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n if (resizingElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(resizingElement)) {\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().filter(function (el) {\\r\\n return el.id !== resizingElement.id;\\r\\n }));\\r\\n } // Code below handles selection when element(s) weren't\\r\\n // drag or added to selection on pointer down phase.\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_11__.isEraserActive)(_this11.state)) {\\r\\n const draggedDistance = (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(_this11.lastPointerDown.clientX, _this11.lastPointerDown.clientY, _this11.lastPointerUp.clientX, _this11.lastPointerUp.clientY);\\r\\n if (draggedDistance === 0) {\\r\\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: _this11.lastPointerUp.clientX,\\r\\n clientY: _this11.lastPointerUp.clientY\\r\\n }, _this11.state);\\r\\n const hitElements = _this11.getElementsAtPosition(scenePointer.x, scenePointer.y);\\r\\n hitElements.forEach(function (hitElement) {\\r\\n return pointerDownState.elementIdsToErase[hitElement.id] = {\\r\\n erase: true,\\r\\n opacity: hitElement.opacity\\r\\n };\\r\\n });\\r\\n }\\r\\n _this11.eraseElements(pointerDownState);\\r\\n return;\\r\\n }\\r\\n else if (Object.keys(pointerDownState.elementIdsToErase).length) {\\r\\n _this11.restoreReadyToEraseElements(pointerDownState);\\r\\n }\\r\\n if (hitElement && !pointerDownState.drag.hasOccurred && !pointerDownState.hit.wasAddedToSelection && ( // if we're editing a line, pointerup shouldn't switch selection if\\r\\n // box selected\\r\\n !_this11.state.editingLinearElement || !pointerDownState.boxSelection.hasOccurred)) {\\r\\n // when inside line editor, shift selects points instead\\r\\n if (childEvent.shiftKey && !_this11.state.editingLinearElement) {\\r\\n if (_this11.state.selectedElementIds[hitElement.id]) {\\r\\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_24__.isSelectedViaGroup)(_this11.state, hitElement)) {\\r\\n // We want to unselect all groups hitElement is part of\\r\\n // as well as all elements that are part of the groups\\r\\n // hitElement is part of\\r\\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds.flatMap(function (groupId) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getElementsInGroup)(_this11.scene.getNonDeletedElements(), groupId);\\r\\n }).map(function (element) {\\r\\n return {\\r\\n [element.id]: false\\r\\n };\\r\\n }).reduce(function (prevId, acc) {\\r\\n return _objectSpread(_objectSpread({}, prevId), acc);\\r\\n }, {});\\r\\n _this11.setState(function (_prevState) {\\r\\n return {\\r\\n selectedGroupIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), hitElement.groupIds.map(function (gId) {\\r\\n return {\\r\\n [gId]: false\\r\\n };\\r\\n }).reduce(function (prev, acc) {\\r\\n return _objectSpread(_objectSpread({}, prev), acc);\\r\\n }, {})),\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), idsOfSelectedElementsThatAreInGroups)\\r\\n };\\r\\n });\\r\\n }\\r\\n else {\\r\\n // remove element from selection while\\r\\n // keeping prev elements selected\\r\\n _this11.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: false\\r\\n })\\r\\n }), _this11.scene.getNonDeletedElements());\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n // add element to selection while\\r\\n // keeping prev elements selected\\r\\n _this11.setState(function (_prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n _this11.setState(function (prevState) {\\r\\n return _objectSpread({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: {\\r\\n [hitElement.id]: true\\r\\n }\\r\\n }), _this11.scene.getNonDeletedElements()));\\r\\n });\\r\\n }\\r\\n }\\r\\n if (!_this11.state.editingLinearElement && !pointerDownState.drag.hasOccurred && !_this11.state.isResizing && (hitElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(hitElement, _this11.state, pointerDownState.origin.x, pointerDownState.origin.y) || !hitElement && pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements)) {\\r\\n // Deselect selected elements\\r\\n _this11.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (!activeTool.locked && activeTool.type !== \\\"freedraw\\\" && draggingElement) {\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n if (activeTool.type !== \\\"selection\\\" || (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(_this11.scene.getNonDeletedElements(), _this11.state)) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\\r\\n ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this11.state) ? _element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements : _element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this11.scene.getNonDeletedElements(), _this11.state));\\r\\n }\\r\\n if (!activeTool.locked && activeTool.type !== \\\"freedraw\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this11.canvas);\\r\\n _this11.setState({\\r\\n draggingElement: null,\\r\\n suggestedBindings: [],\\r\\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateActiveTool)(_this11.state, {\\r\\n type: \\\"selection\\\"\\r\\n })\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this11.setState({\\r\\n draggingElement: null,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n });\\r\\n }\\r\\n maybeSuggestBindingForAll(selectedElements) {\\r\\n const suggestedBindings = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getEligibleElementsForBinding)(selectedElements);\\r\\n this.setState({\\r\\n suggestedBindings\\r\\n });\\r\\n }\\r\\n clearSelection(hitElement) {\\r\\n this.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n // Continue editing the same group if the user selected a different\\r\\n // element from it\\r\\n editingGroupId: prevState.editingGroupId && hitElement != null && (0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, prevState.editingGroupId) ? prevState.editingGroupId : null\\r\\n };\\r\\n });\\r\\n this.setState({\\r\\n selectedElementIds: {},\\r\\n previousSelectedElementIds: this.state.selectedElementIds\\r\\n });\\r\\n }\\r\\n getTextWysiwygSnappedToCenterPosition(x, y, appState, canvas, scale) {\\r\\n const elementClickedInside = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getTextBindableContainerAtPosition)(this.scene.getElementsIncludingDeleted().filter(function (element) {\\r\\n return !(0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element);\\r\\n }), x, y);\\r\\n if (elementClickedInside) {\\r\\n const elementCenterX = elementClickedInside.x + elementClickedInside.width / 2;\\r\\n const elementCenterY = elementClickedInside.y + elementClickedInside.height / 2;\\r\\n const distanceToCenter = Math.hypot(x - elementCenterX, y - elementCenterY);\\r\\n const isSnappedToCenter = distanceToCenter < _constants__WEBPACK_IMPORTED_MODULE_13__.TEXT_TO_CENTER_SNAP_THRESHOLD;\\r\\n if (isSnappedToCenter) {\\r\\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: elementCenterX,\\r\\n sceneY: elementCenterY\\r\\n }, appState);\\r\\n return {\\r\\n viewportX,\\r\\n viewportY,\\r\\n elementCenterX,\\r\\n elementCenterY\\r\\n };\\r\\n }\\r\\n }\\r\\n }\\r\\n getCanvasOffsets() {\\r\\n var _a;\\r\\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\\r\\n const excalidrawContainer = this.excalidrawContainerRef.current;\\r\\n const { left, top } = excalidrawContainer.getBoundingClientRect();\\r\\n return {\\r\\n offsetLeft: left,\\r\\n offsetTop: top\\r\\n };\\r\\n }\\r\\n return {\\r\\n offsetLeft: 0,\\r\\n offsetTop: 0\\r\\n };\\r\\n }\\r\\n updateLanguage() {\\r\\n var _this12 = this;\\r\\n return (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n const currentLang = _i18n__WEBPACK_IMPORTED_MODULE_26__.languages.find(function (lang) {\\r\\n return lang.code === _this12.props.langCode;\\r\\n }) || _i18n__WEBPACK_IMPORTED_MODULE_26__.defaultLang;\\r\\n yield (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.setLanguage)(currentLang);\\r\\n _this12.setAppState({});\\r\\n })();\\r\\n }\\r\\n} // -----------------------------------------------------------------------------\\r\\n// TEST HOOKS\\r\\n// -----------------------------------------------------------------------------\\r\\nApp.defaultProps = {\\r\\n // needed for tests to pass since we directly render App in many tests\\r\\n UIOptions: _constants__WEBPACK_IMPORTED_MODULE_13__.DEFAULT_UI_OPTIONS\\r\\n};\\r\\nvar _initialiseProps = function () {\\r\\n var _this13 = this;\\r\\n this.canvas = null;\\r\\n this.rc = null;\\r\\n this.unmounted = false;\\r\\n this.device = deviceContextInitialValue;\\r\\n this.excalidrawContainerRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createRef();\\r\\n this.files = {};\\r\\n this.imageCache = new Map();\\r\\n this.lastPointerDown = null;\\r\\n this.lastPointerUp = null;\\r\\n this.contextMenuOpen = false;\\r\\n this.lastScenePointer = null;\\r\\n this.allowMobileMode = true;\\r\\n this.focusContainer = function () {\\r\\n var _a;\\r\\n if (_this13.props.autoFocus) {\\r\\n (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.focus();\\r\\n }\\r\\n };\\r\\n this.getSceneElementsIncludingDeleted = function () {\\r\\n return _this13.scene.getElementsIncludingDeleted();\\r\\n };\\r\\n this.getSceneElements = function () {\\r\\n return _this13.scene.getNonDeletedElements();\\r\\n };\\r\\n this.syncActionResult = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (actionResult) {\\r\\n var _a, _b, _c, _d, _e, _f;\\r\\n // Since context menu closes when action triggered so setting to false\\r\\n _this13.contextMenuOpen = false;\\r\\n if (_this13.unmounted || actionResult === false) {\\r\\n return;\\r\\n }\\r\\n let editingElement = null;\\r\\n if (actionResult.elements) {\\r\\n actionResult.elements.forEach(function (element) {\\r\\n var _a;\\r\\n if (((_a = _this13.state.editingElement) === null || _a === void 0 ? void 0 : _a.id) === element.id && _this13.state.editingElement !== element && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\\r\\n editingElement = element;\\r\\n }\\r\\n });\\r\\n _this13.scene.replaceAllElements(actionResult.elements);\\r\\n if (actionResult.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n }\\r\\n if (actionResult.files) {\\r\\n _this13.files = actionResult.replaceFiles ? actionResult.files : _objectSpread(_objectSpread({}, _this13.files), actionResult.files);\\r\\n _this13.addNewImagesToImageCache();\\r\\n }\\r\\n if (actionResult.appState || editingElement) {\\r\\n if (actionResult.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n let viewModeEnabled = ((_a = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _a === void 0 ? void 0 : _a.viewModeEnabled) || false;\\r\\n let zenModeEnabled = ((_b = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _b === void 0 ? void 0 : _b.zenModeEnabled) || false;\\r\\n let gridSize = ((_c = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _c === void 0 ? void 0 : _c.gridSize) || null;\\r\\n let theme = ((_d = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _d === void 0 ? void 0 : _d.theme) || _constants__WEBPACK_IMPORTED_MODULE_13__.THEME.LIGHT;\\r\\n let name = (_f = (_e = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : _this13.state.name;\\r\\n if (typeof _this13.props.viewModeEnabled !== \\\"undefined\\\") {\\r\\n viewModeEnabled = _this13.props.viewModeEnabled;\\r\\n }\\r\\n if (typeof _this13.props.zenModeEnabled !== \\\"undefined\\\") {\\r\\n zenModeEnabled = _this13.props.zenModeEnabled;\\r\\n }\\r\\n if (typeof _this13.props.gridModeEnabled !== \\\"undefined\\\") {\\r\\n gridSize = _this13.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_13__.GRID_SIZE : null;\\r\\n }\\r\\n if (typeof _this13.props.theme !== \\\"undefined\\\") {\\r\\n theme = _this13.props.theme;\\r\\n }\\r\\n if (typeof _this13.props.name !== \\\"undefined\\\") {\\r\\n name = _this13.props.name;\\r\\n }\\r\\n _this13.setState(function (state) {\\r\\n var _a;\\r\\n // using Object.assign instead of spread to fool TS 4.2.2+ into\\r\\n // regarding the resulting type as not containing undefined\\r\\n // (which the following expression will never contain)\\r\\n return Object.assign(actionResult.appState || {}, {\\r\\n editingElement: editingElement || ((_a = actionResult.appState) === null || _a === void 0 ? void 0 : _a.editingElement) || null,\\r\\n viewModeEnabled,\\r\\n zenModeEnabled,\\r\\n gridSize,\\r\\n theme,\\r\\n name\\r\\n });\\r\\n }, function () {\\r\\n if (actionResult.syncHistory) {\\r\\n _this13.history.setCurrentState(_this13.state, _this13.scene.getElementsIncludingDeleted());\\r\\n }\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onBlur = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n isHoldingSpace = false;\\r\\n _this13.setState({\\r\\n isBindingEnabled: true\\r\\n });\\r\\n });\\r\\n this.onUnload = function () {\\r\\n _this13.onBlur();\\r\\n };\\r\\n this.disableEvent = function (event) {\\r\\n event.preventDefault();\\r\\n };\\r\\n this.onFontLoaded = function () {\\r\\n _this13.scene.getElementsIncludingDeleted().forEach(function (element) {\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element)) {\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n }\\r\\n });\\r\\n _this13.onSceneUpdated();\\r\\n };\\r\\n this.resetHistory = function () {\\r\\n _this13.history.clear();\\r\\n };\\r\\n this.resetScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (opts) {\\r\\n _this13.scene.replaceAllElements([]);\\r\\n _this13.setState(function (state) {\\r\\n return _objectSpread(_objectSpread({}, (0,_appState__WEBPACK_IMPORTED_MODULE_11__.getDefaultAppState)()), {}, {\\r\\n isLoading: (opts === null || opts === void 0 ? void 0 : opts.resetLoadingState) ? false : state.isLoading,\\r\\n theme: _this13.state.theme\\r\\n });\\r\\n });\\r\\n _this13.resetHistory();\\r\\n });\\r\\n this.initializeScene = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n var _a;\\r\\n if (\\\"launchQueue\\\" in window && \\\"LaunchParams\\\" in window) {\\r\\n window.launchQueue.setConsumer(/*#__PURE__*/ function () {\\r\\n var _ref5 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (launchParams) {\\r\\n if (!launchParams.files.length) {\\r\\n return;\\r\\n }\\r\\n const fileHandle = launchParams.files[0];\\r\\n const blob = yield fileHandle.getFile();\\r\\n _this13.loadFileToCanvas(new File([blob], blob.name || \\\"\\\", {\\r\\n type: blob.type\\r\\n }), fileHandle);\\r\\n });\\r\\n return function (_x) {\\r\\n return _ref5.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n }\\r\\n if (!_this13.state.isLoading) {\\r\\n _this13.setState({\\r\\n isLoading: true\\r\\n });\\r\\n }\\r\\n let initialData = null;\\r\\n try {\\r\\n initialData = (yield _this13.props.initialData) || null;\\r\\n if (initialData === null || initialData === void 0 ? void 0 : initialData.libraryItems) {\\r\\n _this13.library.updateLibrary({\\r\\n libraryItems: initialData.libraryItems,\\r\\n merge: true\\r\\n }).catch(function (error) {\\r\\n console.error(error);\\r\\n });\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n initialData = {\\r\\n appState: {\\r\\n errorMessage: error.message || \\\"Encountered an error during importing or restoring scene data\\\"\\r\\n }\\r\\n };\\r\\n }\\r\\n const scene = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restore)(initialData, null, null);\\r\\n scene.appState = _objectSpread(_objectSpread({}, scene.appState), {}, {\\r\\n // we're falling back to current (pre-init) state when deciding\\r\\n // whether to open the library, to handle a case where we\\r\\n // update the state outside of initialData (e.g. when loading the app\\r\\n // with a library install link, which should auto-open the library)\\r\\n isLibraryOpen: ((_a = initialData === null || initialData === void 0 ? void 0 : initialData.appState) === null || _a === void 0 ? void 0 : _a.isLibraryOpen) || _this13.state.isLibraryOpen,\\r\\n activeTool: scene.appState.activeTool.type === \\\"image\\\" ? _objectSpread(_objectSpread({}, scene.appState.activeTool), {}, {\\r\\n type: \\\"selection\\\"\\r\\n }) : scene.appState.activeTool,\\r\\n isLoading: false,\\r\\n toast: _this13.state.toast\\r\\n });\\r\\n if (initialData === null || initialData === void 0 ? void 0 : initialData.scrollToContent) {\\r\\n scene.appState = _objectSpread(_objectSpread({}, scene.appState), (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(scene.elements, _objectSpread(_objectSpread({}, scene.appState), {}, {\\r\\n width: _this13.state.width,\\r\\n height: _this13.state.height,\\r\\n offsetTop: _this13.state.offsetTop,\\r\\n offsetLeft: _this13.state.offsetLeft\\r\\n }), null));\\r\\n }\\r\\n _this13.resetHistory();\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n commitToHistory: true\\r\\n }));\\r\\n });\\r\\n this.refreshDeviceState = function (container) {\\r\\n const { width, height } = container.getBoundingClientRect();\\r\\n const sidebarBreakpoint = _this13.props.UIOptions.dockedSidebarBreakpoint != null ? _this13.props.UIOptions.dockedSidebarBreakpoint : _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_RIGHT_SIDEBAR_MIN_WIDTH;\\r\\n _this13.device = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateObject)(_this13.device, {\\r\\n isSmScreen: width < _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_SM_MAX_WIDTH,\\r\\n isMobile: _this13.allowMobileMode && ( //zsviczian\\r\\n width < _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_WIDTH_PORTRAIT || height < _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_HEIGHT_LANDSCAPE && width < _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_WIDTH_LANDSCAPE),\\r\\n canDeviceFitSidebar: width > sidebarBreakpoint\\r\\n });\\r\\n };\\r\\n this.onResize = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n _this13.scene.getElementsIncludingDeleted().forEach(function (element) {\\r\\n return (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n });\\r\\n _this13.setState({});\\r\\n });\\r\\n this.onScroll = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(function () {\\r\\n const { offsetTop, offsetLeft } = _this13.getCanvasOffsets();\\r\\n _this13.setState(function (state) {\\r\\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\\r\\n return null;\\r\\n }\\r\\n return {\\r\\n offsetTop,\\r\\n offsetLeft\\r\\n };\\r\\n });\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_13__.SCROLL_TIMEOUT);\\r\\n this.onCut = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\\r\\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\\r\\n return;\\r\\n }\\r\\n _this13.cutAll();\\r\\n event.preventDefault();\\r\\n event.stopPropagation();\\r\\n });\\r\\n this.onCopy = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\\r\\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\\r\\n return;\\r\\n }\\r\\n _this13.copyAll();\\r\\n event.preventDefault();\\r\\n event.stopPropagation();\\r\\n });\\r\\n this.cutAll = function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionCut, \\\"keyboard\\\");\\r\\n };\\r\\n this.copyAll = function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionCopy, \\\"keyboard\\\");\\r\\n };\\r\\n this.onTapStart = function (event) {\\r\\n // fix for Apple Pencil Scribble\\r\\n // On Android, preventing the event would disable contextMenu on tap-hold\\r\\n if (!_keys__WEBPACK_IMPORTED_MODULE_27__.isAndroid) {\\r\\n event.preventDefault();\\r\\n }\\r\\n if (!didTapTwice) {\\r\\n didTapTwice = true;\\r\\n clearTimeout(tappedTwiceTimer);\\r\\n tappedTwiceTimer = window.setTimeout(App.resetTapTwice, _constants__WEBPACK_IMPORTED_MODULE_13__.TAP_TWICE_TIMEOUT);\\r\\n return;\\r\\n } // insert text only if we tapped twice with a single finger\\r\\n // event.touches.length === 1 will also prevent inserting text when user's zooming\\r\\n if (didTapTwice && event.touches.length === 1) {\\r\\n const [touch] = event.touches; // @ts-ignore\\r\\n _this13.handleCanvasDoubleClick({\\r\\n clientX: touch.clientX,\\r\\n clientY: touch.clientY\\r\\n });\\r\\n didTapTwice = false;\\r\\n clearTimeout(tappedTwiceTimer);\\r\\n }\\r\\n if (_keys__WEBPACK_IMPORTED_MODULE_27__.isAndroid) {\\r\\n event.preventDefault();\\r\\n }\\r\\n if (event.touches.length === 2) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {}\\r\\n });\\r\\n }\\r\\n };\\r\\n this.onTapEnd = function (event) {\\r\\n _this13.resetContextMenuTimer();\\r\\n if (event.touches.length > 0) {\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: {},\\r\\n selectedElementIds: _this13.state.previousSelectedElementIds\\r\\n });\\r\\n }\\r\\n else {\\r\\n gesture.pointers.clear();\\r\\n }\\r\\n };\\r\\n this.pasteFromClipboard = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(/*#__PURE__*/ function () {\\r\\n var _ref6 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (event) {\\r\\n var _a, _b;\\r\\n // #686\\r\\n const target = document.activeElement;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(target);\\r\\n if (!isExcalidrawActive) {\\r\\n return;\\r\\n }\\r\\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\\r\\n if ( // if no ClipboardEvent supplied, assume we're pasting via contextMenu\\r\\n // thus these checks don't make sense\\r\\n event && (!(elementUnderCursor instanceof HTMLCanvasElement) || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(target))) {\\r\\n return;\\r\\n } // must be called in the same frame (thus before any awaits) as the paste\\r\\n // event else some browsers (FF...) will clear the clipboardData\\r\\n // (something something security)\\r\\n let file = (_b = event === null || event === void 0 ? void 0 : event.clipboardData) === null || _b === void 0 ? void 0 : _b.files[0];\\r\\n const data = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_12__.parseClipboard)(event);\\r\\n if (!file && data.text) {\\r\\n const string = data.text.trim();\\r\\n if (string.startsWith(\\\"<svg\\\") && string.endsWith(\\\"</svg>\\\")) {\\r\\n // ignore SVG validation/normalization which will be done during image\\r\\n // initialization\\r\\n file = (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.SVGStringToFile)(string);\\r\\n }\\r\\n } // prefer spreadsheet data over image file (MS Office/Libre Office)\\r\\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(file) && !data.spreadsheet) {\\r\\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: cursorX,\\r\\n clientY: cursorY\\r\\n }, _this13.state);\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX,\\r\\n sceneY\\r\\n });\\r\\n _this13.insertImageElement(imageElement, file);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (_this13.props.onPaste) {\\r\\n try {\\r\\n if ((yield _this13.props.onPaste(data, event)) === false) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n }\\r\\n if (data.errorMessage) {\\r\\n _this13.setState({\\r\\n errorMessage: data.errorMessage\\r\\n });\\r\\n }\\r\\n else if (data.spreadsheet) {\\r\\n _this13.setState({\\r\\n pasteDialog: {\\r\\n data: data.spreadsheet,\\r\\n shown: true\\r\\n }\\r\\n });\\r\\n }\\r\\n else if (data.elements) {\\r\\n _this13.addElementsFromPasteOrLibrary({\\r\\n elements: data.elements,\\r\\n files: data.files || null,\\r\\n position: \\\"cursor\\\"\\r\\n });\\r\\n }\\r\\n else if (data.text) {\\r\\n _this13.addTextFromPaste(data.text);\\r\\n }\\r\\n _this13.setActiveTool({\\r\\n type: \\\"selection\\\"\\r\\n });\\r\\n event === null || event === void 0 ? void 0 : event.preventDefault();\\r\\n });\\r\\n return function (_x2) {\\r\\n return _ref6.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n this.addElementsFromPasteOrLibrary = function (opts) {\\r\\n const elements = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreElements)(opts.elements, null);\\r\\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(elements);\\r\\n const elementsCenterX = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minX, maxX) / 2;\\r\\n const elementsCenterY = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minY, maxY) / 2;\\r\\n const clientX = typeof opts.position === \\\"object\\\" ? opts.position.clientX : opts.position === \\\"cursor\\\" ? cursorX : _this13.state.width / 2 + _this13.state.offsetLeft;\\r\\n const clientY = typeof opts.position === \\\"object\\\" ? opts.position.clientY : opts.position === \\\"cursor\\\" ? cursorY : _this13.state.height / 2 + _this13.state.offsetTop;\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX,\\r\\n clientY\\r\\n }, _this13.state);\\r\\n const dx = x - elementsCenterX;\\r\\n const dy = y - elementsCenterY;\\r\\n const groupIdMap = new Map();\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(dx, dy, _this13.state.gridSize);\\r\\n const oldIdToDuplicatedId = new Map();\\r\\n const newElements = elements.map(function (element) {\\r\\n const newElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(_this13.state.editingGroupId, groupIdMap, element, {\\r\\n x: element.x + gridX - minX,\\r\\n y: element.y + gridY - minY\\r\\n });\\r\\n oldIdToDuplicatedId.set(element.id, newElement.id);\\r\\n return newElement;\\r\\n });\\r\\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.bindTextToShapeAfterDuplication)(newElements, elements, oldIdToDuplicatedId);\\r\\n const nextElements = [..._this13.scene.getElementsIncludingDeleted(), ...newElements];\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextElements, elements, oldIdToDuplicatedId);\\r\\n if (opts.files) {\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), opts.files);\\r\\n }\\r\\n _this13.scene.replaceAllElements(nextElements);\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState((0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, _this13.state), {}, {\\r\\n isLibraryOpen: _this13.state.isLibraryOpen && _this13.device.canDeviceFitSidebar ? _this13.state.isLibraryMenuDocked : false,\\r\\n selectedElementIds: newElements.reduce(function (acc, element) {\\r\\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBoundToContainer)(element)) {\\r\\n acc[element.id] = true;\\r\\n }\\r\\n return acc;\\r\\n }, {}),\\r\\n selectedGroupIds: {}\\r\\n }), _this13.scene.getNonDeletedElements()), function () {\\r\\n if (opts.files) {\\r\\n _this13.addNewImagesToImageCache();\\r\\n }\\r\\n });\\r\\n _this13.setActiveTool({\\r\\n type: \\\"selection\\\"\\r\\n });\\r\\n };\\r\\n this.setAppState = function (obj) {\\r\\n _this13.setState(obj);\\r\\n };\\r\\n this.removePointer = function (event) {\\r\\n if (touchTimeout) {\\r\\n _this13.resetContextMenuTimer();\\r\\n }\\r\\n gesture.pointers.delete(event.pointerId);\\r\\n };\\r\\n this.toggleLock = function () {\\r\\n let source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \\\"ui\\\";\\r\\n if (!_this13.state.activeTool.locked) {\\r\\n (0,_analytics__WEBPACK_IMPORTED_MODULE_10__.trackEvent)(\\\"toolbar\\\", \\\"toggleLock\\\", `${source} (${_this13.device.isMobile ? \\\"mobile\\\" : \\\"desktop\\\"})`);\\r\\n }\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n activeTool: _objectSpread(_objectSpread(_objectSpread({}, prevState.activeTool), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateActiveTool)(_this13.state, prevState.activeTool.locked ? {\\r\\n type: \\\"selection\\\"\\r\\n } : prevState.activeTool)), {}, {\\r\\n locked: !prevState.activeTool.locked\\r\\n })\\r\\n };\\r\\n });\\r\\n };\\r\\n this.togglePenMode = function () {\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n penMode: !prevState.penMode\\r\\n };\\r\\n });\\r\\n };\\r\\n this.scrollToContent = function () {\\r\\n let target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this13.scene.getNonDeletedElements();\\r\\n _this13.setState(_objectSpread({}, (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(Array.isArray(target) ? target : [target], _this13.state, _this13.canvas)));\\r\\n };\\r\\n this.zoomToFit = function () {\\r\\n let target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this13.scene.getNonDeletedElements();\\r\\n let maxZoom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\\r\\n let margin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.03;\\r\\n if (!target) {\\r\\n target = _this13.scene.getNonDeletedElements();\\r\\n }\\r\\n if (target.length === 0) {\\r\\n maxZoom = 1;\\r\\n }\\r\\n _this13.setState((0,_actions__WEBPACK_IMPORTED_MODULE_6__.zoomToFitElements)(target, _this13.state, false, maxZoom, margin).appState);\\r\\n };\\r\\n this.updateContainerSize = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (containers) {\\r\\n containers.forEach(function (el) {\\r\\n const [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.rotate)(el.x + el.width, el.y + el.height, el.x + el.width / 2, el.y + el.height / 2, el.angle);\\r\\n (0,_element_resizeElements__WEBPACK_IMPORTED_MODULE_46__.resizeSingleElement)(new Map().set(el.id, el), true, el, \\\"se\\\", true, x, y);\\r\\n });\\r\\n });\\r\\n this.restore = function (data) {\\r\\n return (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restore)(data, null, null);\\r\\n };\\r\\n this.setToast = function (toast) {\\r\\n _this13.setState({\\r\\n toast\\r\\n });\\r\\n };\\r\\n this.restoreFileFromShare = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n try {\\r\\n const webShareTargetCache = yield caches.open(\\\"web-share-target\\\");\\r\\n const response = yield webShareTargetCache.match(\\\"shared-file\\\");\\r\\n if (response) {\\r\\n const blob = yield response.blob();\\r\\n const file = new File([blob], blob.name || \\\"\\\", {\\r\\n type: blob.type\\r\\n });\\r\\n _this13.loadFileToCanvas(file, null);\\r\\n yield webShareTargetCache.delete(\\\"shared-file\\\");\\r\\n window.history.replaceState(null, _constants__WEBPACK_IMPORTED_MODULE_13__.APP_NAME, window.location.pathname);\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n _this13.setState({\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n });\\r\\n this.addFiles = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (files) {\\r\\n const filesMap = files.reduce(function (acc, fileData) {\\r\\n acc.set(fileData.id, fileData);\\r\\n return acc;\\r\\n }, new Map());\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), Object.fromEntries(filesMap));\\r\\n _this13.scene.getNonDeletedElements().forEach(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(element) && filesMap.has(element.fileId)) {\\r\\n _this13.imageCache.delete(element.fileId);\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n }\\r\\n });\\r\\n _this13.scene.informMutation();\\r\\n _this13.addNewImagesToImageCache();\\r\\n });\\r\\n this.setMobileModeAllowed = function (allow) {\\r\\n const { width, height } = _this13.excalidrawContainerRef.current.getBoundingClientRect();\\r\\n _this13.allowMobileMode = allow;\\r\\n if (allow) {\\r\\n _this13.device = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateObject)(_this13.device, {\\r\\n isMobile: width < _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_WIDTH_PORTRAIT || height < _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_HEIGHT_LANDSCAPE && width < _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_WIDTH_LANDSCAPE\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.device = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateObject)(_this13.device, {\\r\\n isMobile: false\\r\\n });\\r\\n }\\r\\n _this13.forceUpdate();\\r\\n };\\r\\n this.setLocalFont = function (showOnPanel) {\\r\\n showFourthFont = showOnPanel;\\r\\n };\\r\\n this.selectElements = function (elements) {\\r\\n _this13.updateScene({\\r\\n appState: _objectSpread(_objectSpread({}, _this13.state), {}, {\\r\\n editingGroupId: null,\\r\\n selectedElementIds: elements.reduce(function (map, element) {\\r\\n map[element.id] = true;\\r\\n return map;\\r\\n }, {})\\r\\n }),\\r\\n commitToHistory: true\\r\\n });\\r\\n };\\r\\n this.bringToFront = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_6__.actionBringToFront.perform(_this13.scene.getNonDeletedElements(), _this13.state));\\r\\n };\\r\\n this.bringForward = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_6__.actionBringForward.perform(_this13.scene.getNonDeletedElements(), _this13.state));\\r\\n };\\r\\n this.sendToBack = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_6__.actionSendToBack.perform(_this13.scene.getNonDeletedElements(), _this13.state));\\r\\n };\\r\\n this.sendBackward = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_6__.actionSendBackward.perform(_this13.scene.getNonDeletedElements(), _this13.state));\\r\\n };\\r\\n this.updateScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (sceneData) {\\r\\n if (sceneData.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n if (sceneData.appState) {\\r\\n _this13.setState(sceneData.appState);\\r\\n }\\r\\n if (sceneData.elements) {\\r\\n _this13.scene.replaceAllElements(sceneData.elements);\\r\\n }\\r\\n if (sceneData.collaborators) {\\r\\n _this13.setState({\\r\\n collaborators: sceneData.collaborators\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onSceneUpdated = function () {\\r\\n _this13.setState({});\\r\\n };\\r\\n this.updateCurrentCursorPosition = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n cursorX = event.clientX;\\r\\n cursorY = event.clientY;\\r\\n });\\r\\n this.onKeyDown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n // normalize `event.key` when CapsLock is pressed #2372\\r\\n if (\\\"Proxy\\\" in window && (!event.shiftKey && /^[A-Z]$/.test(event.key) || event.shiftKey && /^[a-z]$/.test(event.key))) {\\r\\n event = new Proxy(event, {\\r\\n get(ev, prop) {\\r\\n const value = ev[prop];\\r\\n if (typeof value === \\\"function\\\") {\\r\\n // fix for Proxies hijacking `this`\\r\\n return value.bind(ev);\\r\\n }\\r\\n return prop === \\\"key\\\" ? // CapsLock inverts capitalization based on ShiftKey, so invert\\r\\n // it back\\r\\n event.shiftKey ? ev.key.toUpperCase() : ev.key.toLowerCase() : value;\\r\\n }\\r\\n });\\r\\n } // prevent browser zoom in input fields\\r\\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\\r\\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_27__.CODES.MINUS || event.code === _keys__WEBPACK_IMPORTED_MODULE_27__.CODES.EQUAL) {\\r\\n event.preventDefault();\\r\\n return;\\r\\n }\\r\\n } // bail if\\r\\n if ( // inside an input\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target) && // unless pressing escape (finalize action)\\r\\n event.key !== _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ESCAPE || // or unless using arrows (to move between buttons)\\r\\n (0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key) && (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isInputLike)(event.target)) {\\r\\n return;\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.QUESTION_MARK) {\\r\\n _this13.setState({\\r\\n showHelpDialog: true\\r\\n });\\r\\n }\\r\\n if (_this13.actionManager.handleKeyDown(event)) {\\r\\n return;\\r\\n }\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n return;\\r\\n }\\r\\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && _this13.state.isBindingEnabled) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: false\\r\\n });\\r\\n }\\r\\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_27__.CODES.ZERO) {\\r\\n const nextState = !_this13.state.isLibraryOpen;\\r\\n _this13.setState({\\r\\n isLibraryOpen: nextState\\r\\n }); // track only openings\\r\\n if (nextState) {\\r\\n (0,_analytics__WEBPACK_IMPORTED_MODULE_10__.trackEvent)(\\\"library\\\", \\\"toggleLibrary (open)\\\", `keyboard (${_this13.device.isMobile ? \\\"mobile\\\" : \\\"desktop\\\"})`);\\r\\n }\\r\\n }\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\\r\\n const step = _this13.state.gridSize && (event.shiftKey ? _constants__WEBPACK_IMPORTED_MODULE_13__.ELEMENT_TRANSLATE_AMOUNT : _this13.state.gridSize) || (event.shiftKey ? _constants__WEBPACK_IMPORTED_MODULE_13__.ELEMENT_SHIFT_TRANSLATE_AMOUNT : _constants__WEBPACK_IMPORTED_MODULE_13__.ELEMENT_TRANSLATE_AMOUNT);\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state, true);\\r\\n let offsetX = 0;\\r\\n let offsetY = 0;\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_LEFT) {\\r\\n offsetX = -step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_RIGHT) {\\r\\n offsetX = step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_UP) {\\r\\n offsetY = -step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_DOWN) {\\r\\n offsetY = step;\\r\\n }\\r\\n selectedElements.forEach(function (element) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n x: element.x + offsetX,\\r\\n y: element.y + offsetY\\r\\n });\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element, {\\r\\n simultaneouslyUpdated: selectedElements\\r\\n });\\r\\n });\\r\\n _this13.maybeSuggestBindingForAll(selectedElements);\\r\\n event.preventDefault();\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ENTER) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n if (selectedElements.length === 1) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n if (!_this13.state.editingLinearElement || _this13.state.editingLinearElement.elementId !== selectedElements[0].id) {\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState({\\r\\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], _this13.scene)\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n const selectedElement = selectedElements[0];\\r\\n _this13.startTextEditing({\\r\\n sceneX: selectedElement.x + selectedElement.width / 2,\\r\\n sceneY: selectedElement.y + selectedElement.height / 2,\\r\\n shouldBind: true\\r\\n });\\r\\n event.preventDefault();\\r\\n return;\\r\\n }\\r\\n }\\r\\n }\\r\\n else if (!event.ctrlKey && !event.altKey && !event.metaKey && _this13.state.draggingElement === null) {\\r\\n const shape = (0,_shapes__WEBPACK_IMPORTED_MODULE_34__.findShapeByKey)(event.key);\\r\\n if (shape) {\\r\\n if (_this13.state.activeTool.type !== shape) {\\r\\n (0,_analytics__WEBPACK_IMPORTED_MODULE_10__.trackEvent)(\\\"toolbar\\\", shape, `keyboard (${_this13.device.isMobile ? \\\"mobile\\\" : \\\"desktop\\\"})`);\\r\\n }\\r\\n _this13.setActiveTool({\\r\\n type: shape\\r\\n });\\r\\n event.stopPropagation();\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.Q) {\\r\\n _this13.toggleLock(\\\"keyboard\\\");\\r\\n event.stopPropagation();\\r\\n }\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE && gesture.pointers.size === 0) {\\r\\n isHoldingSpace = true;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.GRABBING);\\r\\n event.preventDefault();\\r\\n }\\r\\n if ((event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G || event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) && !event.altKey && !event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD]) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n if (_this13.state.activeTool.type === \\\"selection\\\" && !selectedElements.length) {\\r\\n return;\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G && ((0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(_this13.state.activeTool.type) || selectedElements.some(function (element) {\\r\\n return (0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(element.type);\\r\\n }))) {\\r\\n _this13.setState({\\r\\n openPopup: \\\"backgroundColorPicker\\\"\\r\\n });\\r\\n event.stopPropagation();\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) {\\r\\n _this13.setState({\\r\\n openPopup: \\\"strokeColorPicker\\\"\\r\\n });\\r\\n event.stopPropagation();\\r\\n }\\r\\n }\\r\\n });\\r\\n this.onWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n // prevent browser pinch zoom on DOM elements\\r\\n if (!(event.target instanceof HTMLCanvasElement) && event.ctrlKey) {\\r\\n event.preventDefault();\\r\\n }\\r\\n });\\r\\n this.onKeyUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE) {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else if (_this13.state.activeTool.type === \\\"selection\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state);\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n isHoldingSpace = false;\\r\\n }\\r\\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !_this13.state.isBindingEnabled) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: true\\r\\n });\\r\\n }\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this13.state) ? (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements)(selectedElements) : (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)(selectedElements);\\r\\n _this13.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n });\\r\\n this.setActiveTool = function (tool) {\\r\\n const nextActiveTool = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateActiveTool)(_this13.state, tool);\\r\\n if (!isHoldingSpace) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state);\\r\\n }\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_35__.isToolIcon)(document.activeElement)) {\\r\\n _this13.focusContainer();\\r\\n }\\r\\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElementType)(nextActiveTool.type)) {\\r\\n _this13.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n if (nextActiveTool.type === \\\"image\\\") {\\r\\n _this13.onImageAction();\\r\\n }\\r\\n if (nextActiveTool.type !== \\\"selection\\\") {\\r\\n _this13.setState({\\r\\n activeTool: nextActiveTool,\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n activeTool: nextActiveTool\\r\\n });\\r\\n }\\r\\n };\\r\\n this.setCursor = function (cursor) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, cursor);\\r\\n };\\r\\n this.resetCursor = function () {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n };\\r\\n this.isTouchScreenMultiTouchGesture = function () {\\r\\n // we don't want to deselect when using trackpad, and multi-point gestures\\r\\n // only work on touch screens, so checking for >= pointers means we're on a\\r\\n // touchscreen\\r\\n return gesture.pointers.size >= 2;\\r\\n };\\r\\n this.onGestureStart = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault(); // we only want to deselect on touch screens because user may have selected\\r\\n // elements by mistake while zooming\\r\\n if (_this13.isTouchScreenMultiTouchGesture()) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {}\\r\\n });\\r\\n }\\r\\n gesture.initialScale = _this13.state.zoom.value;\\r\\n });\\r\\n this.onGestureChange = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault(); // onGestureChange only has zoom factor but not the center.\\r\\n // If we're on iPad or iPhone, then we recognize multi-touch and will\\r\\n // zoom in at the right location in the touchmove handler\\r\\n // (handleCanvasPointerMove).\\r\\n //\\r\\n // On Macbook trackpad, we don't have those events so will zoom in at the\\r\\n // current location instead.\\r\\n //\\r\\n // As such, bail from this handler on touch devices.\\r\\n if (_this13.isTouchScreenMultiTouchGesture()) {\\r\\n return;\\r\\n }\\r\\n const initialScale = gesture.initialScale;\\r\\n if (initialScale) {\\r\\n _this13.setState(function (state) {\\r\\n return _objectSpread({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getStateForZoom)({\\r\\n viewportX: cursorX,\\r\\n viewportY: cursorY,\\r\\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * event.scale)\\r\\n }, state));\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onGestureEnd = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault(); // reselect elements only on touch screens (see onGestureStart)\\r\\n if (_this13.isTouchScreenMultiTouchGesture()) {\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: {},\\r\\n selectedElementIds: _this13.state.previousSelectedElementIds\\r\\n });\\r\\n }\\r\\n gesture.initialScale = null;\\r\\n });\\r\\n this.startTextEditing = function (_ref8) {\\r\\n var _a, _b;\\r\\n let { sceneX, sceneY, shouldBind, insertAtParentCenter = true } = _ref8;\\r\\n let parentCenterPosition = insertAtParentCenter && _this13.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, _this13.state, _this13.canvas, window.devicePixelRatio);\\r\\n let existingTextElement = null;\\r\\n let container = null;\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n if (selectedElements.length === 1) {\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(selectedElements[0])) {\\r\\n existingTextElement = selectedElements[0];\\r\\n }\\r\\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isTextBindableContainer)(selectedElements[0], false)) {\\r\\n existingTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.getBoundTextElement)(selectedElements[0]);\\r\\n }\\r\\n else {\\r\\n existingTextElement = _this13.getTextElementAtPosition(sceneX, sceneY);\\r\\n }\\r\\n }\\r\\n else {\\r\\n existingTextElement = _this13.getTextElementAtPosition(sceneX, sceneY);\\r\\n } // bind to container when shouldBind is true or\\r\\n // clicked on center of container\\r\\n if (!container && !existingTextElement && (shouldBind || parentCenterPosition)) {\\r\\n container = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getTextBindableContainerAtPosition)(_this13.scene.getNonDeletedElements().filter(function (ele) {\\r\\n return (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isTextBindableContainer)(ele, false) && !(0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.getBoundTextElement)(ele);\\r\\n }), sceneX, sceneY);\\r\\n }\\r\\n if (!existingTextElement && container) {\\r\\n const fontString = {\\r\\n fontSize: _this13.state.currentItemFontSize,\\r\\n fontFamily: _this13.state.currentItemFontFamily\\r\\n };\\r\\n const minWidth = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.getApproxMinLineWidth)((0,_utils__WEBPACK_IMPORTED_MODULE_35__.getFontString)(fontString));\\r\\n const minHeight = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.getApproxMinLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_35__.getFontString)(fontString));\\r\\n const newHeight = Math.max(container.height, minHeight);\\r\\n const newWidth = Math.max(container.width, minWidth);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(container, {\\r\\n height: newHeight,\\r\\n width: newWidth\\r\\n });\\r\\n sceneX = container.x + newWidth / 2;\\r\\n sceneY = container.y + newHeight / 2;\\r\\n if (parentCenterPosition) {\\r\\n parentCenterPosition = _this13.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, _this13.state, _this13.canvas, window.devicePixelRatio);\\r\\n }\\r\\n }\\r\\n const element = existingTextElement ? existingTextElement : (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\\r\\n x: parentCenterPosition ? parentCenterPosition.elementCenterX : sceneX,\\r\\n y: parentCenterPosition ? parentCenterPosition.elementCenterY : sceneY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemStrokeSharpness,\\r\\n text: \\\"\\\",\\r\\n rawText: \\\"\\\",\\r\\n fontSize: _this13.state.currentItemFontSize,\\r\\n fontFamily: _this13.state.currentItemFontFamily,\\r\\n textAlign: parentCenterPosition ? \\\"center\\\" : _this13.state.currentItemTextAlign,\\r\\n verticalAlign: parentCenterPosition ? _constants__WEBPACK_IMPORTED_MODULE_13__.VERTICAL_ALIGN.MIDDLE : _constants__WEBPACK_IMPORTED_MODULE_13__.DEFAULT_VERTICAL_ALIGN,\\r\\n containerId: (_a = container === null || container === void 0 ? void 0 : container.id) !== null && _a !== void 0 ? _a : undefined,\\r\\n groupIds: (_b = container === null || container === void 0 ? void 0 : container.groupIds) !== null && _b !== void 0 ? _b : [],\\r\\n locked: false\\r\\n });\\r\\n _this13.setState({\\r\\n editingElement: element\\r\\n });\\r\\n if (!existingTextElement) {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]); // case: creating new text not centered to parent element → offset Y\\r\\n // so that the text is centered to cursor position\\r\\n if (!parentCenterPosition) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n y: element.y - element.baseline / 2\\r\\n });\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n editingElement: element\\r\\n });\\r\\n _this13.handleTextWysiwyg(element, {\\r\\n isExistingElement: !!existingTextElement\\r\\n });\\r\\n };\\r\\n this.handleCanvasDoubleClick = function (event) {\\r\\n // case: double-clicking with arrow/line tool selected would both create\\r\\n // text and enter multiElement mode\\r\\n if (_this13.state.multiElement) {\\r\\n return;\\r\\n } // we should only be able to double click when mode is selection\\r\\n if (_this13.state.activeTool.type !== \\\"selection\\\") {\\r\\n return;\\r\\n }\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n if (!_this13.state.editingLinearElement || _this13.state.editingLinearElement.elementId !== selectedElements[0].id) {\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState({\\r\\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], _this13.scene)\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n let { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const selectedGroupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIds)(_this13.state);\\r\\n if (selectedGroupIds.length > 0) {\\r\\n const hitElement = _this13.getElementAtPosition(sceneX, sceneY);\\r\\n const selectedGroupId = hitElement && (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIdForElement)(hitElement, _this13.state.selectedGroupIds);\\r\\n if (selectedGroupId) {\\r\\n _this13.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n editingGroupId: selectedGroupId,\\r\\n selectedElementIds: {\\r\\n [hitElement.id]: true\\r\\n },\\r\\n selectedGroupIds: {}\\r\\n }), _this13.scene.getNonDeletedElements());\\r\\n });\\r\\n return;\\r\\n }\\r\\n }\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !_this13.state.viewModeEnabled) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n if (selectedElements.length === 1) {\\r\\n const selectedElement = selectedElements[0];\\r\\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.hasBoundTextElement)(selectedElement);\\r\\n if (canBindText) {\\r\\n sceneX = selectedElement.x + selectedElement.width / 2;\\r\\n sceneY = selectedElement.y + selectedElement.height / 2;\\r\\n }\\r\\n }\\r\\n _this13.startTextEditing({\\r\\n sceneX,\\r\\n sceneY,\\r\\n shouldBind: false,\\r\\n insertAtParentCenter: !event.altKey\\r\\n });\\r\\n }\\r\\n };\\r\\n this.getElementLinkAtPosition = function (scenePointer, hitElement) {\\r\\n // Reversing so we traverse the elements in decreasing order\\r\\n // of z-index\\r\\n const elements = _this13.scene.getNonDeletedElements().slice().reverse();\\r\\n let hitElementIndex = Infinity;\\r\\n return elements.find(function (element, index) {\\r\\n if (hitElement && element.id === hitElement.id) {\\r\\n hitElementIndex = index;\\r\\n }\\r\\n return element.link && index <= hitElementIndex && (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.isPointHittingLinkIcon)(element, _this13.state, [scenePointer.x, scenePointer.y], _this13.device.isMobile);\\r\\n });\\r\\n };\\r\\n this.redirectToLink = function (event, isTouchScreen) {\\r\\n const draggedDistance = (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(_this13.lastPointerDown.clientX, _this13.lastPointerDown.clientY, _this13.lastPointerUp.clientX, _this13.lastPointerUp.clientY);\\r\\n if (!_this13.hitLinkElement || // For touch screen allow dragging threshold else strict check\\r\\n isTouchScreen && draggedDistance > _constants__WEBPACK_IMPORTED_MODULE_13__.DRAGGING_THRESHOLD || !isTouchScreen && draggedDistance !== 0) {\\r\\n return;\\r\\n }\\r\\n const lastPointerDownCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(_this13.lastPointerDown, _this13.state);\\r\\n const lastPointerDownHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.isPointHittingLinkIcon)(_this13.hitLinkElement, _this13.state, [lastPointerDownCoords.x, lastPointerDownCoords.y], _this13.device.isMobile);\\r\\n const lastPointerUpCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(_this13.lastPointerUp, _this13.state);\\r\\n const lastPointerUpHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.isPointHittingLinkIcon)(_this13.hitLinkElement, _this13.state, [lastPointerUpCoords.x, lastPointerUpCoords.y], _this13.device.isMobile);\\r\\n if (lastPointerDownHittingLinkIcon && lastPointerUpHittingLinkIcon) {\\r\\n const url = _this13.hitLinkElement.link;\\r\\n if (url) {\\r\\n let customEvent;\\r\\n if (_this13.props.onLinkOpen) {\\r\\n customEvent = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.wrapEvent)(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.EXCALIDRAW_LINK, event.nativeEvent);\\r\\n _this13.props.onLinkOpen(_this13.hitLinkElement, customEvent);\\r\\n }\\r\\n if (!(customEvent === null || customEvent === void 0 ? void 0 : customEvent.defaultPrevented)) {\\r\\n const target = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.isLocalLink)(url) ? \\\"_self\\\" : \\\"_blank\\\";\\r\\n const newWindow = window.open(undefined, target); // https://mathiasbynens.github.io/rel-noopener/\\r\\n if (newWindow) {\\r\\n newWindow.opener = null;\\r\\n newWindow.location = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.normalizeLink)(url);\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleCanvasPointerMove = function (event) {\\r\\n var _a;\\r\\n _this13.savePointer(event.clientX, event.clientY, _this13.state.cursorButton);\\r\\n if (gesture.pointers.has(event.pointerId)) {\\r\\n gesture.pointers.set(event.pointerId, {\\r\\n x: event.clientX,\\r\\n y: event.clientY\\r\\n });\\r\\n }\\r\\n const initialScale = gesture.initialScale;\\r\\n if (gesture.pointers.size === 2 && gesture.lastCenter && initialScale && gesture.initialDistance) {\\r\\n const center = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\\r\\n const deltaX = center.x - gesture.lastCenter.x;\\r\\n const deltaY = center.y - gesture.lastCenter.y;\\r\\n gesture.lastCenter = center;\\r\\n const distance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\\r\\n const scaleFactor = _this13.state.activeTool.type === \\\"freedraw\\\" && _this13.state.penMode ? 1 : distance / gesture.initialDistance;\\r\\n const nextZoom = scaleFactor ? (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * scaleFactor) : _this13.state.zoom.value;\\r\\n _this13.setState(function (state) {\\r\\n const zoomState = (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getStateForZoom)({\\r\\n viewportX: center.x,\\r\\n viewportY: center.y,\\r\\n nextZoom\\r\\n }, state);\\r\\n return {\\r\\n zoom: zoomState.zoom,\\r\\n scrollX: zoomState.scrollX + deltaX / nextZoom,\\r\\n scrollY: zoomState.scrollY + deltaY / nextZoom,\\r\\n shouldCacheIgnoreZoom: true\\r\\n };\\r\\n });\\r\\n _this13.resetShouldCacheIgnoreZoomDebounced();\\r\\n }\\r\\n else {\\r\\n gesture.lastCenter = gesture.initialDistance = gesture.initialScale = null;\\r\\n }\\r\\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\\r\\n return;\\r\\n }\\r\\n const isPointerOverScrollBars = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - _this13.state.offsetLeft, event.clientY - _this13.state.offsetTop);\\r\\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\\r\\n if (!_this13.state.draggingElement && !_this13.state.multiElement) {\\r\\n if (isOverScrollBar) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state);\\r\\n }\\r\\n }\\r\\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\\r\\n if (_this13.state.editingLinearElement && !_this13.state.editingLinearElement.isDragging) {\\r\\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerMove(event, scenePointerX, scenePointerY, _this13.state.editingLinearElement, _this13.state.gridSize);\\r\\n if (editingLinearElement !== _this13.state.editingLinearElement) {\\r\\n // Since we are reading from previous state which is not possible with\\r\\n // automatic batching in React 18 hence using flush sync to synchronously\\r\\n // update the state. Check https://github.com/excalidraw/excalidraw/pull/5508 for more details.\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.flushSync)(function () {\\r\\n _this13.setState({\\r\\n editingLinearElement\\r\\n });\\r\\n });\\r\\n }\\r\\n if (editingLinearElement.lastUncommittedPoint != null) {\\r\\n _this13.maybeSuggestBindingAtCursor(scenePointer);\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElementType)(_this13.state.activeTool.type)) {\\r\\n // Hovering with a selected tool or creating new linear element via click\\r\\n // and point\\r\\n const { draggingElement } = _this13.state;\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement, false)) {\\r\\n _this13.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [scenePointer], _this13.state.startBoundElement);\\r\\n }\\r\\n else {\\r\\n _this13.maybeSuggestBindingAtCursor(scenePointer);\\r\\n }\\r\\n }\\r\\n if (_this13.state.multiElement) {\\r\\n const { multiElement } = _this13.state;\\r\\n const { x: rx, y: ry } = multiElement;\\r\\n const { points, lastCommittedPoint } = multiElement;\\r\\n const lastPoint = points[points.length - 1];\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state);\\r\\n if (lastPoint === lastCommittedPoint) {\\r\\n // if we haven't yet created a temp point and we're beyond commit-zone\\r\\n // threshold, add a point\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastPoint[0], lastPoint[1]) >= _constants__WEBPACK_IMPORTED_MODULE_13__.LINE_CONFIRM_THRESHOLD) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: [...points, [scenePointerX - rx, scenePointerY - ry]]\\r\\n });\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.POINTER); // in this branch, we're inside the commit zone, and no uncommitted\\r\\n // point exists. Thus do nothing (don't add/remove points).\\r\\n }\\r\\n }\\r\\n else if (points.length > 2 && lastCommittedPoint && (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_13__.LINE_CONFIRM_THRESHOLD) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.POINTER);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: points.slice(0, -1)\\r\\n });\\r\\n }\\r\\n else {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(scenePointerX, scenePointerY, _this13.state.gridSize);\\r\\n const [lastCommittedX, lastCommittedY] = (_a = multiElement === null || multiElement === void 0 ? void 0 : multiElement.lastCommittedPoint) !== null && _a !== void 0 ? _a : [0, 0];\\r\\n let dxFromLastCommitted = gridX - rx - lastCommittedX;\\r\\n let dyFromLastCommitted = gridY - ry - lastCommittedY;\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldRotateWithDiscreteAngle)(event)) {\\r\\n ({\\r\\n width: dxFromLastCommitted,\\r\\n height: dyFromLastCommitted\\r\\n } = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getPerfectElementSize)(_this13.state.activeTool.type, dxFromLastCommitted, dyFromLastCommitted));\\r\\n }\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(points, _this13.state.zoom.value)) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.POINTER);\\r\\n } // update last uncommitted point\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: [...points.slice(0, -1), [lastCommittedX + dxFromLastCommitted, lastCommittedY + dyFromLastCommitted]]\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n const hasDeselectedButton = Boolean(event.buttons);\\r\\n if (hasDeselectedButton || _this13.state.activeTool.type !== \\\"selection\\\" && _this13.state.activeTool.type !== \\\"text\\\" && _this13.state.activeTool.type !== \\\"eraser\\\") {\\r\\n return;\\r\\n }\\r\\n const elements = _this13.scene.getNonDeletedElements();\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this13.state);\\r\\n if (selectedElements.length === 1 && !isOverScrollBar && !_this13.state.editingLinearElement) {\\r\\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, _this13.state, scenePointerX, scenePointerY, _this13.state.zoom, event.pointerType);\\r\\n if (elementWithTransformHandleType && elementWithTransformHandleType.transformHandleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)(elementWithTransformHandleType));\\r\\n return;\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length > 1 && !isOverScrollBar) {\\r\\n const transformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), scenePointerX, scenePointerY, _this13.state.zoom, event.pointerType);\\r\\n if (transformHandleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\\r\\n transformHandleType\\r\\n }));\\r\\n return;\\r\\n }\\r\\n }\\r\\n const hitElement = _this13.getElementAtPosition(scenePointer.x, scenePointer.y);\\r\\n _this13.hitLinkElement = _this13.getElementLinkAtPosition(scenePointer, hitElement);\\r\\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_11__.isEraserActive)(_this13.state)) {\\r\\n return;\\r\\n }\\r\\n if (_this13.hitLinkElement && !_this13.state.selectedElementIds[_this13.hitLinkElement.id]) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.POINTER);\\r\\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.showHyperlinkTooltip)(_this13.hitLinkElement, _this13.state);\\r\\n if (_this13.props.onLinkHover) {\\r\\n _this13.props.onLinkHover(_this13.hitLinkElement, event);\\r\\n } //zsviczian\\r\\n }\\r\\n else {\\r\\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.hideHyperlinkToolip)();\\r\\n if (hitElement && hitElement.link && _this13.state.selectedElementIds[hitElement.id] && !_this13.contextMenuOpen && !_this13.state.showHyperlinkPopup) {\\r\\n _this13.setState({\\r\\n showHyperlinkPopup: \\\"info\\\"\\r\\n });\\r\\n }\\r\\n else if (_this13.state.activeTool.type === \\\"text\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(hitElement) ? _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.TEXT : _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.CROSSHAIR);\\r\\n }\\r\\n else if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else if (isOverScrollBar) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n else if (_this13.state.editingLinearElement) {\\r\\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.getElement(_this13.state.editingLinearElement.elementId);\\r\\n if (element && (0,_element_collision__WEBPACK_IMPORTED_MODULE_45__.isHittingElementNotConsideringBoundingBox)(element, _this13.state, [scenePointer.x, scenePointer.y])) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.MOVE);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n }\\r\\n else if ( // if using cmd/ctrl, we're not dragging\\r\\n !event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && (hitElement || _this13.isHittingCommonBoundingBoxOfSelectedElements(scenePointer, selectedElements)) && !(hitElement === null || hitElement === void 0 ? void 0 : hitElement.locked)) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.MOVE);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleEraser = function (event, pointerDownState, scenePointer) {\\r\\n const updateElementIds = function (elements) {\\r\\n elements.forEach(function (element) {\\r\\n if (element.locked) {\\r\\n return;\\r\\n }\\r\\n idsToUpdate.push(element.id);\\r\\n if (event.altKey) {\\r\\n if (pointerDownState.elementIdsToErase[element.id] && pointerDownState.elementIdsToErase[element.id].erase) {\\r\\n pointerDownState.elementIdsToErase[element.id].erase = false;\\r\\n }\\r\\n }\\r\\n else if (!pointerDownState.elementIdsToErase[element.id]) {\\r\\n pointerDownState.elementIdsToErase[element.id] = {\\r\\n erase: true,\\r\\n opacity: element.opacity\\r\\n };\\r\\n }\\r\\n });\\r\\n };\\r\\n const idsToUpdate = [];\\r\\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerDownState.lastCoords.x, pointerDownState.lastCoords.y, scenePointer.x, scenePointer.y);\\r\\n const threshold = 10 / _this13.state.zoom.value;\\r\\n const point = _objectSpread({}, pointerDownState.lastCoords);\\r\\n let samplingInterval = 0;\\r\\n while (samplingInterval <= distance) {\\r\\n const hitElements = _this13.getElementsAtPosition(point.x, point.y);\\r\\n updateElementIds(hitElements); // Exit since we reached current point\\r\\n if (samplingInterval === distance) {\\r\\n break;\\r\\n } // Calculate next point in the line at a distance of sampling interval\\r\\n samplingInterval = Math.min(samplingInterval + threshold, distance);\\r\\n const distanceRatio = samplingInterval / distance;\\r\\n const nextX = (1 - distanceRatio) * point.x + distanceRatio * scenePointer.x;\\r\\n const nextY = (1 - distanceRatio) * point.y + distanceRatio * scenePointer.y;\\r\\n point.x = nextX;\\r\\n point.y = nextY;\\r\\n }\\r\\n const elements = _this13.scene.getElementsIncludingDeleted().map(function (ele) {\\r\\n const id = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBoundToContainer)(ele) && idsToUpdate.includes(ele.containerId) ? ele.containerId : ele.id;\\r\\n if (idsToUpdate.includes(id)) {\\r\\n if (event.altKey) {\\r\\n if (pointerDownState.elementIdsToErase[id] && pointerDownState.elementIdsToErase[id].erase === false) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(ele, {\\r\\n opacity: pointerDownState.elementIdsToErase[id].opacity\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(ele, {\\r\\n opacity: _constants__WEBPACK_IMPORTED_MODULE_13__.ELEMENT_READY_TO_ERASE_OPACITY\\r\\n });\\r\\n }\\r\\n }\\r\\n return ele;\\r\\n });\\r\\n _this13.scene.replaceAllElements(elements);\\r\\n pointerDownState.lastCoords.x = scenePointer.x;\\r\\n pointerDownState.lastCoords.y = scenePointer.y;\\r\\n };\\r\\n this.handleTouchMove = function (event) {\\r\\n invalidateContextMenu = true;\\r\\n };\\r\\n this.handleCanvasPointerDown = function (event) {\\r\\n var _a, _b;\\r\\n _this13.focusContainer(); //zsviczian\\r\\n // remove any active selection when we start to interact with canvas\\r\\n // (mainly, we care about removing selection outside the component which\\r\\n // would prevent our copy handling otherwise)\\r\\n const selection = document.getSelection();\\r\\n if (selection === null || selection === void 0 ? void 0 : selection.anchorNode) {\\r\\n selection.removeAllRanges();\\r\\n }\\r\\n _this13.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\\r\\n _this13.maybeCleanupAfterMissingPointerUp(event); //fires only once, if pen is detected, penMode is enabled\\r\\n //the user can disable this by toggling the penMode button\\r\\n if (!_this13.state.penDetected && event.pointerType === \\\"pen\\\") {\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n penMode: true,\\r\\n penDetected: true\\r\\n };\\r\\n });\\r\\n }\\r\\n if (!_this13.device.isTouchScreen && [\\\"pen\\\", \\\"touch\\\"].includes(event.pointerType)) {\\r\\n _this13.device = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateObject)(_this13.device, {\\r\\n isTouchScreen: true\\r\\n });\\r\\n }\\r\\n if (isPanning) {\\r\\n return;\\r\\n }\\r\\n _this13.lastPointerDown = event;\\r\\n _this13.setState({\\r\\n lastPointerDownWith: event.pointerType,\\r\\n cursorButton: \\\"down\\\"\\r\\n });\\r\\n _this13.savePointer(event.clientX, event.clientY, \\\"down\\\");\\r\\n _this13.updateGestureOnPointerDown(event);\\r\\n if (_this13.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\\r\\n return;\\r\\n } // only handle left mouse button or touch\\r\\n if (event.button !== _constants__WEBPACK_IMPORTED_MODULE_13__.POINTER_BUTTON.MAIN && event.button !== _constants__WEBPACK_IMPORTED_MODULE_13__.POINTER_BUTTON.TOUCH) {\\r\\n return;\\r\\n } // don't select while panning\\r\\n if (gesture.pointers.size > 1) {\\r\\n return;\\r\\n } // State for the duration of a pointer interaction, which starts with a\\r\\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\\r\\n const pointerDownState = _this13.initialPointerDownState(event);\\r\\n if (_this13.handleDraggingScrollBar(event, pointerDownState)) {\\r\\n return;\\r\\n } // Since context menu closes on pointer down so setting to false\\r\\n _this13.contextMenuOpen = false;\\r\\n _this13.clearSelectionIfNotUsingSelection();\\r\\n _this13.updateBindingEnabledOnPointerMove(event);\\r\\n if (_this13.handleSelectionOnPointerDown(event, pointerDownState)) {\\r\\n return;\\r\\n }\\r\\n const allowOnPointerDown = !_this13.state.penMode || event.pointerType !== \\\"touch\\\" || _this13.state.activeTool.type === \\\"selection\\\" || _this13.state.activeTool.type === \\\"text\\\" || _this13.state.activeTool.type === \\\"image\\\";\\r\\n if (!allowOnPointerDown) {\\r\\n return;\\r\\n }\\r\\n if (_this13.state.activeTool.type === \\\"text\\\") {\\r\\n _this13.handleTextOnPointerDown(event, pointerDownState);\\r\\n return;\\r\\n }\\r\\n else if (_this13.state.activeTool.type === \\\"arrow\\\" || _this13.state.activeTool.type === \\\"line\\\") {\\r\\n _this13.handleLinearElementOnPointerDown(event, _this13.state.activeTool.type, pointerDownState);\\r\\n }\\r\\n else if (_this13.state.activeTool.type === \\\"image\\\") {\\r\\n // reset image preview on pointerdown\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.CROSSHAIR); // retrieve the latest element as the state may be stale\\r\\n const pendingImageElement = _this13.state.pendingImageElementId && _this13.scene.getElement(_this13.state.pendingImageElementId);\\r\\n if (!pendingImageElement) {\\r\\n return;\\r\\n }\\r\\n _this13.setState({\\r\\n draggingElement: pendingImageElement,\\r\\n editingElement: pendingImageElement,\\r\\n pendingImageElementId: null,\\r\\n multiElement: null\\r\\n });\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(pendingImageElement, {\\r\\n x,\\r\\n y\\r\\n });\\r\\n }\\r\\n else if (_this13.state.activeTool.type === \\\"freedraw\\\") {\\r\\n _this13.handleFreeDrawElementOnPointerDown(event, _this13.state.activeTool.type, pointerDownState);\\r\\n }\\r\\n else if (_this13.state.activeTool.type === \\\"custom\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n else if (_this13.state.activeTool.type !== \\\"eraser\\\") {\\r\\n _this13.createGenericElementOnPointerDown(_this13.state.activeTool.type, pointerDownState);\\r\\n }\\r\\n (_b = (_a = _this13.props) === null || _a === void 0 ? void 0 : _a.onPointerDown) === null || _b === void 0 ? void 0 : _b.call(_a, _this13.state.activeTool, pointerDownState);\\r\\n const onPointerMove = _this13.onPointerMoveFromPointerDownHandler(pointerDownState);\\r\\n const onPointerUp = _this13.onPointerUpFromPointerDownHandler(pointerDownState);\\r\\n const onKeyDown = _this13.onKeyDownFromPointerDownHandler(pointerDownState);\\r\\n const onKeyUp = _this13.onKeyUpFromPointerDownHandler(pointerDownState);\\r\\n lastPointerUp = onPointerUp;\\r\\n if (!_this13.state.viewModeEnabled) {\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, onPointerUp);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYDOWN, onKeyDown);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYUP, onKeyUp);\\r\\n pointerDownState.eventListeners.onMove = onPointerMove;\\r\\n pointerDownState.eventListeners.onUp = onPointerUp;\\r\\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\\r\\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\\r\\n }\\r\\n };\\r\\n this.handleCanvasPointerUp = function (event) {\\r\\n _this13.lastPointerUp = event;\\r\\n if (_this13.device.isTouchScreen) {\\r\\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: event.clientX,\\r\\n clientY: event.clientY\\r\\n }, _this13.state);\\r\\n const hitElement = _this13.getElementAtPosition(scenePointer.x, scenePointer.y);\\r\\n _this13.hitLinkElement = _this13.getElementLinkAtPosition(scenePointer, hitElement);\\r\\n }\\r\\n if (_this13.hitLinkElement && !_this13.state.selectedElementIds[_this13.hitLinkElement.id]) {\\r\\n _this13.redirectToLink(event, _this13.device.isTouchScreen);\\r\\n }\\r\\n _this13.removePointer(event);\\r\\n };\\r\\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices = function (event) {\\r\\n // deal with opening context menu on touch devices\\r\\n if (event.pointerType === \\\"touch\\\") {\\r\\n invalidateContextMenu = false;\\r\\n if (touchTimeout) {\\r\\n // If there's already a touchTimeout, this means that there's another\\r\\n // touch down and we are doing another touch, so we shouldn't open the\\r\\n // context menu.\\r\\n invalidateContextMenu = true;\\r\\n }\\r\\n else {\\r\\n // open the context menu with the first touch's clientX and clientY\\r\\n // if the touch is not moving\\r\\n touchTimeout = window.setTimeout(function () {\\r\\n touchTimeout = 0;\\r\\n if (!invalidateContextMenu) {\\r\\n _this13.handleCanvasContextMenu(event);\\r\\n }\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_13__.TOUCH_CTX_MENU_TIMEOUT);\\r\\n }\\r\\n }\\r\\n };\\r\\n this.resetContextMenuTimer = function () {\\r\\n clearTimeout(touchTimeout);\\r\\n touchTimeout = 0;\\r\\n invalidateContextMenu = false;\\r\\n };\\r\\n this.handleCanvasPanUsingWheelOrSpaceDrag = function (event) {\\r\\n if (!(gesture.pointers.size <= 1 && (event.button === _constants__WEBPACK_IMPORTED_MODULE_13__.POINTER_BUTTON.WHEEL || event.button === _constants__WEBPACK_IMPORTED_MODULE_13__.POINTER_BUTTON.MAIN && isHoldingSpace || _this13.state.viewModeEnabled)) || (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this13.state.editingElement)) {\\r\\n return false;\\r\\n }\\r\\n isPanning = true;\\r\\n event.preventDefault();\\r\\n let nextPastePrevented = false;\\r\\n const isLinux = /Linux/.test(window.navigator.platform);\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.GRABBING);\\r\\n let { clientX: lastX, clientY: lastY } = event;\\r\\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdatesThrottled)(function (event) {\\r\\n const deltaX = lastX - event.clientX;\\r\\n const deltaY = lastY - event.clientY;\\r\\n lastX = event.clientX;\\r\\n lastY = event.clientY;\\r\\n /*\\r\\n * Prevent paste event if we move while middle clicking on Linux.\\r\\n * See issue #1383.\\r\\n */\\r\\n if (isLinux && !nextPastePrevented && (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)) {\\r\\n nextPastePrevented = true;\\r\\n /* Prevent the next paste event */\\r\\n const preventNextPaste = function (event) {\\r\\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.PASTE, preventNextPaste);\\r\\n event.stopPropagation();\\r\\n };\\r\\n /*\\r\\n * Reenable next paste in case of disabled middle click paste for\\r\\n * any reason:\\r\\n * - right click paste\\r\\n * - empty clipboard\\r\\n */\\r\\n const enableNextPaste = function () {\\r\\n setTimeout(function () {\\r\\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.PASTE, preventNextPaste);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, enableNextPaste);\\r\\n }, 100);\\r\\n };\\r\\n document.body.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.PASTE, preventNextPaste);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, enableNextPaste);\\r\\n }\\r\\n _this13.setState({\\r\\n scrollX: _this13.state.scrollX - deltaX / _this13.state.zoom.value,\\r\\n scrollY: _this13.state.scrollY - deltaY / _this13.state.zoom.value\\r\\n });\\r\\n });\\r\\n const teardown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(lastPointerUp = function () {\\r\\n lastPointerUp = null;\\r\\n isPanning = false;\\r\\n if (!isHoldingSpace) {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state);\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n cursorButton: \\\"up\\\"\\r\\n });\\r\\n _this13.savePointer(event.clientX, event.clientY, \\\"up\\\");\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, teardown);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.BLUR, teardown);\\r\\n onPointerMove.flush();\\r\\n });\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.BLUR, teardown);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_MOVE, onPointerMove, {\\r\\n passive: true\\r\\n });\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, teardown);\\r\\n return true;\\r\\n };\\r\\n this.clearSelectionIfNotUsingSelection = function () {\\r\\n if (_this13.state.activeTool.type !== \\\"selection\\\") {\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n };\\r\\n this.handleSelectionOnPointerDown = function (event, pointerDownState) {\\r\\n var _a;\\r\\n if (_this13.state.activeTool.type === \\\"selection\\\") {\\r\\n const elements = _this13.scene.getNonDeletedElements();\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this13.state);\\r\\n if (selectedElements.length === 1 && !_this13.state.editingLinearElement) {\\r\\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, _this13.state, pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.zoom, event.pointerType);\\r\\n if (elementWithTransformHandleType != null) {\\r\\n _this13.setState({\\r\\n resizingElement: elementWithTransformHandleType.element\\r\\n });\\r\\n pointerDownState.resize.handleType = elementWithTransformHandleType.transformHandleType;\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length > 1) {\\r\\n pointerDownState.resize.handleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.zoom, event.pointerType);\\r\\n }\\r\\n if (pointerDownState.resize.handleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\\r\\n transformHandleType: pointerDownState.resize.handleType\\r\\n }));\\r\\n pointerDownState.resize.isResizing = true;\\r\\n pointerDownState.resize.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeOffsetXY)(pointerDownState.resize.handleType, selectedElements, pointerDownState.origin.x, pointerDownState.origin.y));\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0]) && selectedElements[0].points.length === 2) {\\r\\n pointerDownState.resize.arrowDirection = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeArrowDirection)(pointerDownState.resize.handleType, selectedElements[0]);\\r\\n }\\r\\n }\\r\\n else {\\r\\n if (_this13.state.editingLinearElement) {\\r\\n const ret = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerDown(event, _this13.state, function (appState) {\\r\\n return _this13.setState(appState);\\r\\n }, _this13.history, pointerDownState.origin);\\r\\n if (ret.hitElement) {\\r\\n pointerDownState.hit.element = ret.hitElement;\\r\\n }\\r\\n if (ret.didAddPoint) {\\r\\n return true;\\r\\n }\\r\\n } // hitElement may already be set above, so check first\\r\\n pointerDownState.hit.element = (_a = pointerDownState.hit.element) !== null && _a !== void 0 ? _a : _this13.getElementAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\\r\\n if (pointerDownState.hit.element) {\\r\\n // Early return if pointer is hitting link icon\\r\\n if ((0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.isPointHittingLinkIcon)(pointerDownState.hit.element, _this13.state, [pointerDownState.origin.x, pointerDownState.origin.y], _this13.device.isMobile)) {\\r\\n return false;\\r\\n }\\r\\n pointerDownState.hit.hasHitElementInside = (0,_element_collision__WEBPACK_IMPORTED_MODULE_45__.isHittingElementNotConsideringBoundingBox)(pointerDownState.hit.element, _this13.state, [pointerDownState.origin.x, pointerDownState.origin.y]);\\r\\n } // For overlapped elements one position may hit\\r\\n // multiple elements\\r\\n pointerDownState.hit.allHitElements = _this13.getElementsAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n const someHitElementIsSelected = pointerDownState.hit.allHitElements.some(function (element) {\\r\\n return _this13.isASelectedElement(element);\\r\\n });\\r\\n if ((hitElement === null || !someHitElementIsSelected) && !event.shiftKey && !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\\r\\n _this13.clearSelection(hitElement);\\r\\n }\\r\\n if (_this13.state.editingLinearElement) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [_this13.state.editingLinearElement.elementId]: true\\r\\n }\\r\\n }); // If we click on something\\r\\n }\\r\\n else if (hitElement != null) {\\r\\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\\r\\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD]) {\\r\\n if (!_this13.state.selectedElementIds[hitElement.id]) {\\r\\n pointerDownState.hit.wasAddedToSelection = true;\\r\\n }\\r\\n _this13.setState(function (prevState) {\\r\\n return _objectSpread(_objectSpread({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.editGroupForSelectedElement)(prevState, hitElement)), {}, {\\r\\n previousSelectedElementIds: _this13.state.selectedElementIds\\r\\n });\\r\\n }); // mark as not completely handled so as to allow dragging etc.\\r\\n return false;\\r\\n } // deselect if item is selected\\r\\n // if shift is not clicked, this will always return true\\r\\n // otherwise, it will trigger selection based on current\\r\\n // state of the box\\r\\n if (!_this13.state.selectedElementIds[hitElement.id]) {\\r\\n // if we are currently editing a group, exiting editing mode and deselect the group.\\r\\n if (_this13.state.editingGroupId && !(0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, _this13.state.editingGroupId)) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n } // Add hit element to selection. At this point if we're not holding\\r\\n // SHIFT the previously selected element(s) were deselected above\\r\\n // (make sure you use setState updater to use latest state)\\r\\n if (!someHitElementIsSelected && !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\\r\\n _this13.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: true\\r\\n }),\\r\\n showHyperlinkPopup: hitElement.link ? \\\"info\\\" : false\\r\\n }), _this13.scene.getNonDeletedElements());\\r\\n });\\r\\n pointerDownState.hit.wasAddedToSelection = true;\\r\\n }\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: _this13.state.selectedElementIds\\r\\n });\\r\\n }\\r\\n }\\r\\n return false;\\r\\n };\\r\\n this.handleTextOnPointerDown = function (event, pointerDownState) {\\r\\n // if we're currently still editing text, clicking outside\\r\\n // should only finalize it, not create another (irrespective\\r\\n // of state.activeTool.locked)\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this13.state.editingElement)) {\\r\\n return;\\r\\n }\\r\\n let sceneX = pointerDownState.origin.x;\\r\\n let sceneY = pointerDownState.origin.y;\\r\\n const element = _this13.getElementAtPosition(sceneX, sceneY, {\\r\\n includeBoundTextElement: true\\r\\n });\\r\\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.hasBoundTextElement)(element);\\r\\n if (canBindText) {\\r\\n sceneX = element.x + element.width / 2;\\r\\n sceneY = element.y + element.height / 2;\\r\\n }\\r\\n _this13.startTextEditing({\\r\\n sceneX,\\r\\n sceneY,\\r\\n shouldBind: false,\\r\\n insertAtParentCenter: !event.altKey\\r\\n });\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n if (!_this13.state.activeTool.locked) {\\r\\n _this13.setState({\\r\\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateActiveTool)(_this13.state, {\\r\\n type: \\\"selection\\\"\\r\\n })\\r\\n });\\r\\n }\\r\\n };\\r\\n this.handleFreeDrawElementOnPointerDown = function (event, elementType, pointerDownState) {\\r\\n // Begin a mark capture. This does not have to update state yet.\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, null);\\r\\n const element = (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.newFreeDrawElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness,\\r\\n simulatePressure: event.pressure === 0.5,\\r\\n locked: false\\r\\n });\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [element.id]: false\\r\\n })\\r\\n };\\r\\n });\\r\\n const pressures = element.simulatePressure ? element.pressures : [...element.pressures, event.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n points: [[0, 0]],\\r\\n pressures\\r\\n });\\r\\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, _this13.scene);\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n draggingElement: element,\\r\\n editingElement: element,\\r\\n startBoundElement: boundElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n };\\r\\n this.createImageElement = function (_ref9) {\\r\\n let { sceneX, sceneY } = _ref9;\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(sceneX, sceneY, _this13.state.gridSize);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newImageElement)({\\r\\n type: \\\"image\\\",\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness,\\r\\n locked: false\\r\\n });\\r\\n return element;\\r\\n };\\r\\n this.handleLinearElementOnPointerDown = function (event, elementType, pointerDownState) {\\r\\n if (_this13.state.multiElement) {\\r\\n const { multiElement } = _this13.state; // finalize if completing a loop\\r\\n if (multiElement.type === \\\"line\\\" && (0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(multiElement.points, _this13.state.zoom.value)) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1]\\r\\n });\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n const { x: rx, y: ry, lastCommittedPoint } = multiElement; // clicking inside commit zone → finalize arrow\\r\\n if (multiElement.points.length > 1 && lastCommittedPoint && (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerDownState.origin.x - rx, pointerDownState.origin.y - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_13__.LINE_CONFIRM_THRESHOLD) {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [multiElement.id]: true\\r\\n })\\r\\n };\\r\\n }); // clicking outside commit zone → update reference for last committed\\r\\n // point\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1]\\r\\n });\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.POINTER);\\r\\n }\\r\\n else {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.gridSize);\\r\\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\\r\\n If so, we want it to be null for start and \\\"arrow\\\" for end. If the linear item is not\\r\\n an arrow, we want it to be null for both. Otherwise, we want it to use the\\r\\n values from appState. */\\r\\n const { currentItemStartArrowhead, currentItemEndArrowhead } = _this13.state;\\r\\n const [startArrowhead, endArrowhead] = elementType === \\\"arrow\\\" ? [currentItemStartArrowhead, currentItemEndArrowhead] : [null, null];\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newLinearElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness,\\r\\n startArrowhead,\\r\\n endArrowhead,\\r\\n locked: false\\r\\n });\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [element.id]: false\\r\\n })\\r\\n };\\r\\n });\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n points: [...element.points, [0, 0]]\\r\\n });\\r\\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, _this13.scene);\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n draggingElement: element,\\r\\n editingElement: element,\\r\\n startBoundElement: boundElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n };\\r\\n this.createGenericElementOnPointerDown = function (elementType, pointerDownState) {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.gridSize);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemStrokeSharpness,\\r\\n locked: false\\r\\n });\\r\\n if (element.type === \\\"selection\\\") {\\r\\n _this13.setState({\\r\\n selectionElement: element,\\r\\n draggingElement: element\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n multiElement: null,\\r\\n draggingElement: element,\\r\\n editingElement: element\\r\\n });\\r\\n }\\r\\n };\\r\\n this.restoreReadyToEraseElements = function (pointerDownState) {\\r\\n const elements = _this13.scene.getElementsIncludingDeleted().map(function (ele) {\\r\\n if (pointerDownState.elementIdsToErase[ele.id] && pointerDownState.elementIdsToErase[ele.id].erase) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(ele, {\\r\\n opacity: pointerDownState.elementIdsToErase[ele.id].opacity\\r\\n });\\r\\n }\\r\\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBoundToContainer)(ele) && pointerDownState.elementIdsToErase[ele.containerId] && pointerDownState.elementIdsToErase[ele.containerId].erase) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(ele, {\\r\\n opacity: pointerDownState.elementIdsToErase[ele.containerId].opacity\\r\\n });\\r\\n }\\r\\n return ele;\\r\\n });\\r\\n _this13.scene.replaceAllElements(elements);\\r\\n };\\r\\n this.eraseElements = function (pointerDownState) {\\r\\n const elements = _this13.scene.getElementsIncludingDeleted().map(function (ele) {\\r\\n if (pointerDownState.elementIdsToErase[ele.id] && pointerDownState.elementIdsToErase[ele.id].erase) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(ele, {\\r\\n isDeleted: true\\r\\n });\\r\\n }\\r\\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBoundToContainer)(ele) && pointerDownState.elementIdsToErase[ele.containerId] && pointerDownState.elementIdsToErase[ele.containerId].erase) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(ele, {\\r\\n isDeleted: true\\r\\n });\\r\\n }\\r\\n return ele;\\r\\n });\\r\\n _this13.history.resumeRecording();\\r\\n _this13.scene.replaceAllElements(elements);\\r\\n };\\r\\n this.initializeImage = /*#__PURE__*/ function () {\\r\\n var _ref10 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (_ref11) {\\r\\n var _a, _b, _c, _d;\\r\\n let { imageFile, imageElement: _imageElement, showCursorImagePreview = false } = _ref11;\\r\\n // at this point this should be guaranteed image file, but we do this check\\r\\n // to satisfy TS down the line\\r\\n if (!(0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(imageFile)) {\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.unsupportedFileType\\\"));\\r\\n }\\r\\n const mimeType = imageFile.type;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, \\\"wait\\\");\\r\\n if (mimeType === _constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.svg) {\\r\\n try {\\r\\n imageFile = (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.SVGStringToFile)(yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.normalizeSVG)(yield imageFile.text()), imageFile.name);\\r\\n }\\r\\n catch (error) {\\r\\n console.warn(error);\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.svgImageInsertError\\\"));\\r\\n }\\r\\n } // generate image id (by default the file digest) before any\\r\\n // resizing/compression takes place to keep it more portable\\r\\n const fileId = yield ((_b = (_a = _this13.props).generateIdForFile) === null || _b === void 0 ? void 0 : _b.call(_a, imageFile)) || (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.generateIdFromFile)(imageFile);\\r\\n if (!fileId) {\\r\\n console.warn(\\\"Couldn't generate file id or the supplied `generateIdForFile` didn't resolve to one.\\\");\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\"));\\r\\n }\\r\\n const existingFileData = _this13.files[fileId];\\r\\n if (!(existingFileData === null || existingFileData === void 0 ? void 0 : existingFileData.dataURL)) {\\r\\n try {\\r\\n imageFile = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.resizeImageFile)(imageFile, {\\r\\n maxWidthOrHeight: _constants__WEBPACK_IMPORTED_MODULE_13__.DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(\\\"error trying to resing image file on insertion\\\", error);\\r\\n }\\r\\n if (imageFile.size > _constants__WEBPACK_IMPORTED_MODULE_13__.MAX_ALLOWED_FILE_BYTES) {\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.fileTooBig\\\", {\\r\\n maxSize: `${Math.trunc(_constants__WEBPACK_IMPORTED_MODULE_13__.MAX_ALLOWED_FILE_BYTES / 1024 / 1024)}MB`\\r\\n }));\\r\\n }\\r\\n }\\r\\n if (showCursorImagePreview) {\\r\\n const dataURL = (_c = _this13.files[fileId]) === null || _c === void 0 ? void 0 : _c.dataURL; // optimization so that we don't unnecessarily resize the original\\r\\n // full-size file for cursor preview\\r\\n // (it's much faster to convert the resized dataURL to File)\\r\\n const resizedFile = dataURL && (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.dataURLToFile)(dataURL);\\r\\n _this13.setImagePreviewCursor(resizedFile || imageFile);\\r\\n }\\r\\n const dataURL = ((_d = _this13.files[fileId]) === null || _d === void 0 ? void 0 : _d.dataURL) || (yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.getDataURL)(imageFile));\\r\\n const imageElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(_imageElement, {\\r\\n fileId\\r\\n }, false);\\r\\n return new Promise(/*#__PURE__*/ function () {\\r\\n var _ref12 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (resolve, reject) {\\r\\n var _a;\\r\\n try {\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), {}, {\\r\\n [fileId]: {\\r\\n mimeType,\\r\\n id: fileId,\\r\\n dataURL,\\r\\n created: Date.now()\\r\\n }\\r\\n });\\r\\n const cachedImageData = _this13.imageCache.get(fileId);\\r\\n if (!cachedImageData) {\\r\\n _this13.addNewImagesToImageCache();\\r\\n yield _this13.updateImageCache([imageElement]);\\r\\n }\\r\\n if ((cachedImageData === null || cachedImageData === void 0 ? void 0 : cachedImageData.image) instanceof Promise) {\\r\\n yield cachedImageData.image;\\r\\n }\\r\\n if (_this13.state.pendingImageElementId !== imageElement.id && ((_a = _this13.state.draggingElement) === null || _a === void 0 ? void 0 : _a.id) !== imageElement.id) {\\r\\n _this13.initializeImageDimensions(imageElement, true);\\r\\n }\\r\\n resolve(imageElement);\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n reject(new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\")));\\r\\n }\\r\\n finally {\\r\\n if (!showCursorImagePreview) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n }\\r\\n });\\r\\n return function (_x4, _x5) {\\r\\n return _ref12.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n });\\r\\n return function (_x3) {\\r\\n return _ref10.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.insertImageElement = /*#__PURE__*/ function () {\\r\\n var _ref13 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (imageElement, imageFile, showCursorImagePreview) {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), imageElement]);\\r\\n try {\\r\\n yield _this13.initializeImage({\\r\\n imageFile,\\r\\n imageElement,\\r\\n showCursorImagePreview\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n isDeleted: true\\r\\n });\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n _this13.setState({\\r\\n errorMessage: error.message || (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\")\\r\\n });\\r\\n }\\r\\n });\\r\\n return function (_x6, _x7, _x8) {\\r\\n return _ref13.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.setImagePreviewCursor = /*#__PURE__*/ function () {\\r\\n var _ref14 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (imageFile) {\\r\\n // mustn't be larger than 128 px\\r\\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property\\r\\n const cursorImageSizePx = 96;\\r\\n const imagePreview = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.resizeImageFile)(imageFile, {\\r\\n maxWidthOrHeight: cursorImageSizePx\\r\\n });\\r\\n let previewDataURL = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.getDataURL)(imagePreview); // SVG cannot be resized via `resizeImageFile` so we resize by rendering to\\r\\n // a small canvas\\r\\n if (imageFile.type === _constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.svg) {\\r\\n const img = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.loadHTMLImageElement)(previewDataURL);\\r\\n let height = Math.min(img.height, cursorImageSizePx);\\r\\n let width = height * (img.width / img.height);\\r\\n if (width > cursorImageSizePx) {\\r\\n width = cursorImageSizePx;\\r\\n height = width * (img.height / img.width);\\r\\n }\\r\\n const canvas = document.createElement(\\\"canvas\\\");\\r\\n canvas.height = height;\\r\\n canvas.width = width;\\r\\n const context = canvas.getContext(\\\"2d\\\");\\r\\n context.drawImage(img, 0, 0, width, height);\\r\\n previewDataURL = canvas.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.svg);\\r\\n }\\r\\n if (_this13.state.pendingImageElementId) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, `url(${previewDataURL}) 4 4, auto`);\\r\\n }\\r\\n });\\r\\n return function (_x9) {\\r\\n return _ref14.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.onImageAction = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n let { insertOnCanvasDirectly } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\\r\\n insertOnCanvasDirectly: false\\r\\n };\\r\\n try {\\r\\n const clientX = _this13.state.width / 2 + _this13.state.offsetLeft;\\r\\n const clientY = _this13.state.height / 2 + _this13.state.offsetTop;\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX,\\r\\n clientY\\r\\n }, _this13.state);\\r\\n const imageFile = yield (0,_data_filesystem__WEBPACK_IMPORTED_MODULE_43__.fileOpen)({\\r\\n description: \\\"Image\\\",\\r\\n extensions: [\\\"jpg\\\", \\\"png\\\", \\\"svg\\\", \\\"gif\\\"]\\r\\n });\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX: x,\\r\\n sceneY: y\\r\\n });\\r\\n if (insertOnCanvasDirectly) {\\r\\n _this13.insertImageElement(imageElement, imageFile);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n pendingImageElementId: imageElement.id\\r\\n }, function () {\\r\\n _this13.insertImageElement(imageElement, imageFile, \\r\\n /* showCursorImagePreview */\\r\\n true);\\r\\n });\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n if (error.name !== \\\"AbortError\\\") {\\r\\n console.error(error);\\r\\n }\\r\\n else {\\r\\n console.warn(error);\\r\\n }\\r\\n _this13.setState({\\r\\n pendingImageElementId: null,\\r\\n editingElement: null,\\r\\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateActiveTool)(_this13.state, {\\r\\n type: \\\"selection\\\"\\r\\n })\\r\\n }, function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n });\\r\\n }\\r\\n });\\r\\n this.initializeImageDimensions = function (imageElement) {\\r\\n var _a;\\r\\n let forceNaturalSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\\r\\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(imageElement) && ((_a = _this13.imageCache.get(imageElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\\r\\n if (!image || image instanceof Promise) {\\r\\n if (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_13__.DRAGGING_THRESHOLD / _this13.state.zoom.value && imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_13__.DRAGGING_THRESHOLD / _this13.state.zoom.value) {\\r\\n const placeholderSize = 100 / _this13.state.zoom.value;\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n x: imageElement.x - placeholderSize / 2,\\r\\n y: imageElement.y - placeholderSize / 2,\\r\\n width: placeholderSize,\\r\\n height: placeholderSize\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n if (forceNaturalSize || // if user-created bounding box is below threshold, assume the\\r\\n // intention was to click instead of drag, and use the image's\\r\\n // intrinsic size\\r\\n imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_13__.DRAGGING_THRESHOLD / _this13.state.zoom.value && imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_13__.DRAGGING_THRESHOLD / _this13.state.zoom.value) {\\r\\n const minHeight = Math.max(_this13.state.height - 120, 160); // max 65% of canvas height, clamped to <300px, vh - 120px>\\r\\n const maxHeight = Math.min(minHeight, Math.floor(_this13.state.height * 0.5) / _this13.state.zoom.value);\\r\\n const height = Math.min(image.naturalHeight, maxHeight);\\r\\n const width = height * (image.naturalWidth / image.naturalHeight); // add current imageElement width/height to account for previous centering\\r\\n // of the placeholder image\\r\\n const x = imageElement.x + imageElement.width / 2 - width / 2;\\r\\n const y = imageElement.y + imageElement.height / 2 - height / 2;\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n x,\\r\\n y,\\r\\n width,\\r\\n height\\r\\n });\\r\\n }\\r\\n };\\r\\n this.updateImageCache = /*#__PURE__*/ function () {\\r\\n var _ref16 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (elements) {\\r\\n let files = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this13.files;\\r\\n const { updatedFiles, erroredFiles } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.updateImageCache)({\\r\\n imageCache: _this13.imageCache,\\r\\n fileIds: elements.map(function (element) {\\r\\n return element.fileId;\\r\\n }),\\r\\n files\\r\\n });\\r\\n if (updatedFiles.size || erroredFiles.size) {\\r\\n for (const element of elements) {\\r\\n if (updatedFiles.has(element.fileId)) {\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n }\\r\\n }\\r\\n }\\r\\n if (erroredFiles.size) {\\r\\n _this13.scene.replaceAllElements(_this13.scene.getElementsIncludingDeleted().map(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(element) && erroredFiles.has(element.fileId)) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(element, {\\r\\n status: \\\"error\\\"\\r\\n });\\r\\n }\\r\\n return element;\\r\\n }));\\r\\n }\\r\\n return {\\r\\n updatedFiles,\\r\\n erroredFiles\\r\\n };\\r\\n });\\r\\n return function (_x10) {\\r\\n return _ref16.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.addNewImagesToImageCache = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n let imageElements = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.getInitializedImageElements)(_this13.scene.getNonDeletedElements());\\r\\n let files = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this13.files;\\r\\n const uncachedImageElements = imageElements.filter(function (element) {\\r\\n return !element.isDeleted && !_this13.imageCache.has(element.fileId);\\r\\n });\\r\\n if (uncachedImageElements.length) {\\r\\n const { updatedFiles } = yield _this13.updateImageCache(uncachedImageElements, files);\\r\\n if (updatedFiles.size) {\\r\\n _this13.scene.informMutation();\\r\\n }\\r\\n }\\r\\n });\\r\\n this.scheduleImageRefresh = lodash_throttle__WEBPACK_IMPORTED_MODULE_42___default()(function () {\\r\\n _this13.addNewImagesToImageCache();\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_13__.IMAGE_RENDER_TIMEOUT);\\r\\n this.updateBindingEnabledOnPointerMove = function (event) {\\r\\n const shouldEnableBinding = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.shouldEnableBindingForPointerEvent)(event);\\r\\n if (_this13.state.isBindingEnabled !== shouldEnableBinding) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: shouldEnableBinding\\r\\n });\\r\\n }\\r\\n };\\r\\n this.maybeSuggestBindingAtCursor = function (pointerCoords) {\\r\\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerCoords, _this13.scene);\\r\\n _this13.setState({\\r\\n suggestedBindings: hoveredBindableElement != null ? [hoveredBindableElement] : []\\r\\n });\\r\\n };\\r\\n this.maybeSuggestBindingsForLinearElementAtCoords = function (linearElement, pointerCoords, oppositeBindingBoundElement) {\\r\\n if (!pointerCoords.length) {\\r\\n return;\\r\\n }\\r\\n const suggestedBindings = pointerCoords.reduce(function (acc, coords) {\\r\\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(coords, _this13.scene);\\r\\n if (hoveredBindableElement != null && !(0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isLinearElementSimpleAndAlreadyBound)(linearElement, oppositeBindingBoundElement === null || oppositeBindingBoundElement === void 0 ? void 0 : oppositeBindingBoundElement.id, hoveredBindableElement)) {\\r\\n acc.push(hoveredBindableElement);\\r\\n }\\r\\n return acc;\\r\\n }, []);\\r\\n _this13.setState({\\r\\n suggestedBindings\\r\\n });\\r\\n };\\r\\n this.handleCanvasRef = function (canvas) {\\r\\n var _a, _b, _c;\\r\\n // canvas is null when unmounting\\r\\n if (canvas !== null) {\\r\\n _this13.canvas = canvas;\\r\\n _this13.rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__[\\\"default\\\"].canvas(_this13.canvas);\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.WHEEL, _this13.handleWheel, {\\r\\n passive: false\\r\\n });\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.TOUCH_START, _this13.onTapStart);\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.TOUCH_END, _this13.onTapEnd);\\r\\n }\\r\\n else {\\r\\n (_a = _this13.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.WHEEL, _this13.handleWheel);\\r\\n (_b = _this13.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.TOUCH_START, _this13.onTapStart);\\r\\n (_c = _this13.canvas) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.TOUCH_END, _this13.onTapEnd);\\r\\n }\\r\\n };\\r\\n this.handleAppOnDrop = /*#__PURE__*/ function () {\\r\\n var _ref18 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (event) {\\r\\n if (_this13.props.onDrop) {\\r\\n try {\\r\\n if ((yield _this13.props.onDrop(event)) === false) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (e) {\\r\\n console.error(e);\\r\\n }\\r\\n } // must be retrieved first, in the same frame\\r\\n const { file, fileHandle } = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.getFileFromEvent)(event);\\r\\n try {\\r\\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(file)) {\\r\\n // first attempt to decode scene from the image if it's embedded\\r\\n // ---------------------------------------------------------------------\\r\\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.png || (file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.svg) {\\r\\n try {\\r\\n const scene = yield (0,_data__WEBPACK_IMPORTED_MODULE_14__.loadFromBlob)(file, _this13.state, _this13.scene.getElementsIncludingDeleted(), fileHandle);\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, scene.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n replaceFiles: true,\\r\\n commitToHistory: true\\r\\n }));\\r\\n return;\\r\\n }\\r\\n catch (error) {\\r\\n if (error.name !== \\\"EncodingError\\\") {\\r\\n throw error;\\r\\n }\\r\\n }\\r\\n } // if no scene is embedded or we fail for whatever reason, fall back\\r\\n // to importing as regular image\\r\\n // ---------------------------------------------------------------------\\r\\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX,\\r\\n sceneY\\r\\n });\\r\\n _this13.insertImageElement(imageElement, file);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n });\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n return _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n const libraryJSON = event.dataTransfer.getData(_constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.excalidrawlib);\\r\\n if (libraryJSON && typeof libraryJSON === \\\"string\\\") {\\r\\n try {\\r\\n const libraryItems = (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.parseLibraryJSON)(libraryJSON);\\r\\n _this13.addElementsFromPasteOrLibrary({\\r\\n elements: (0,_data_library__WEBPACK_IMPORTED_MODULE_15__.distributeLibraryItemsOnSquareGrid)(libraryItems),\\r\\n position: event,\\r\\n files: null\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n _this13.setState({\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n if (file) {\\r\\n // atetmpt to parse an excalidraw/excalidrawlib file\\r\\n yield _this13.loadFileToCanvas(file, fileHandle);\\r\\n }\\r\\n });\\r\\n return function (_x11) {\\r\\n return _ref18.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.loadFileToCanvas = /*#__PURE__*/ function () {\\r\\n var _ref19 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (file, fileHandle) {\\r\\n file = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.normalizeFile)(file);\\r\\n try {\\r\\n const ret = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.loadSceneOrLibraryFromBlob)(file, _this13.state, _this13.scene.getElementsIncludingDeleted(), fileHandle);\\r\\n if (ret.type === _constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.excalidraw) {\\r\\n _this13.setState({\\r\\n isLoading: true\\r\\n });\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, ret.data), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, ret.data.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n replaceFiles: true,\\r\\n commitToHistory: true\\r\\n }));\\r\\n }\\r\\n else if (ret.type === _constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.excalidrawlib) {\\r\\n yield _this13.library.updateLibrary({\\r\\n libraryItems: file,\\r\\n merge: true,\\r\\n openLibraryMenu: true\\r\\n }).catch(function (error) {\\r\\n console.error(error);\\r\\n _this13.setState({\\r\\n errorMessage: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.importLibraryError\\\")\\r\\n });\\r\\n });\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n });\\r\\n return function (_x12, _x13) {\\r\\n return _ref19.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.handleCanvasContextMenu = function (event) {\\r\\n event.preventDefault();\\r\\n if ((event.nativeEvent.pointerType === \\\"touch\\\" || event.nativeEvent.pointerType === \\\"pen\\\" && // always allow if user uses a pen secondary button\\r\\n event.button !== _constants__WEBPACK_IMPORTED_MODULE_13__.POINTER_BUTTON.SECONDARY) && _this13.state.activeTool.type !== \\\"selection\\\") {\\r\\n return;\\r\\n }\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const element = _this13.getElementAtPosition(x, y, {\\r\\n preferSelected: true,\\r\\n includeLockedElements: true\\r\\n });\\r\\n const type = element ? \\\"element\\\" : \\\"canvas\\\";\\r\\n const container = _this13.excalidrawContainerRef.current;\\r\\n const { top: offsetTop, left: offsetLeft } = container.getBoundingClientRect();\\r\\n const left = event.clientX - offsetLeft;\\r\\n const top = event.clientY - offsetTop;\\r\\n if (element && !_this13.state.selectedElementIds[element.id]) {\\r\\n _this13.setState((0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, _this13.state), {}, {\\r\\n selectedElementIds: {\\r\\n [element.id]: true\\r\\n }\\r\\n }), _this13.scene.getNonDeletedElements()), function () {\\r\\n _this13._openContextMenu({\\r\\n top,\\r\\n left\\r\\n }, type);\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13._openContextMenu({\\r\\n top,\\r\\n left\\r\\n }, type);\\r\\n }\\r\\n };\\r\\n this.maybeDragNewGenericElement = function (pointerDownState, event) {\\r\\n var _a;\\r\\n const draggingElement = _this13.state.draggingElement;\\r\\n const pointerCoords = pointerDownState.lastCoords;\\r\\n if (!draggingElement) {\\r\\n return;\\r\\n }\\r\\n if (draggingElement.type === \\\"selection\\\" && _this13.state.activeTool.type !== \\\"eraser\\\") {\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, _this13.state.activeTool.type, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.x, pointerCoords.x), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.y, pointerCoords.y), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event));\\r\\n }\\r\\n else {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, _this13.state.gridSize);\\r\\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(draggingElement) && ((_a = _this13.imageCache.get(draggingElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\\r\\n const aspectRatio = image && !(image instanceof Promise) ? image.width / image.height : null;\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, _this13.state.activeTool.type, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.x, gridX), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.y, gridY), (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(draggingElement) ? !(0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event) : (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event), aspectRatio);\\r\\n _this13.maybeSuggestBindingForAll([draggingElement]);\\r\\n }\\r\\n };\\r\\n this.maybeHandleResize = function (pointerDownState, event) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n const transformHandleType = pointerDownState.resize.handleType;\\r\\n _this13.setState({\\r\\n // TODO: rename this state field to \\\"isScaling\\\" to distinguish\\r\\n // it from the generic \\\"isResizing\\\" which includes scaling and\\r\\n // rotating\\r\\n isResizing: transformHandleType && transformHandleType !== \\\"rotation\\\",\\r\\n isRotating: transformHandleType === \\\"rotation\\\"\\r\\n });\\r\\n const pointerCoords = pointerDownState.lastCoords;\\r\\n const [resizeX, resizeY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.resize.offset.x, pointerCoords.y - pointerDownState.resize.offset.y, _this13.state.gridSize);\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.transformElements)(pointerDownState, transformHandleType, selectedElements, pointerDownState.resize.arrowDirection, (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldRotateWithDiscreteAngle)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event), selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(selectedElements[0]) ? !(0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event) : (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {\\r\\n _this13.maybeSuggestBindingForAll(selectedElements);\\r\\n return true;\\r\\n }\\r\\n return false;\\r\\n };\\r\\n this._openContextMenu = function (_ref20, type) {\\r\\n let { left, top } = _ref20;\\r\\n if (_this13.state.showHyperlinkPopup) {\\r\\n _this13.setState({\\r\\n showHyperlinkPopup: false\\r\\n });\\r\\n }\\r\\n _this13.contextMenuOpen = true;\\r\\n const maybeGroupAction = _actions__WEBPACK_IMPORTED_MODULE_6__.actionGroup.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeUngroupAction = _actions__WEBPACK_IMPORTED_MODULE_6__.actionUngroup.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeFlipHorizontal = _actions__WEBPACK_IMPORTED_MODULE_6__.actionFlipHorizontal.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeFlipVertical = _actions__WEBPACK_IMPORTED_MODULE_6__.actionFlipVertical.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const mayBeAllowUnbinding = _actions__WEBPACK_IMPORTED_MODULE_6__.actionUnbindText.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const mayBeAllowBinding = _actions__WEBPACK_IMPORTED_MODULE_6__.actionBindText.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const separator = \\\"separator\\\";\\r\\n const elements = _this13.scene.getNonDeletedElements();\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n const options = [];\\r\\n if (_clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardBlob && elements.length > 0) {\\r\\n options.push(_actions__WEBPACK_IMPORTED_MODULE_6__.actionCopyAsPng);\\r\\n }\\r\\n if (_clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardWriteText && elements.length > 0) {\\r\\n options.push(_actions__WEBPACK_IMPORTED_MODULE_6__.actionCopyAsSvg);\\r\\n }\\r\\n if (type === \\\"element\\\" && _actions__WEBPACK_IMPORTED_MODULE_6__.copyText.contextItemPredicate(elements, _this13.state) && _clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardWriteText) {\\r\\n options.push(_actions__WEBPACK_IMPORTED_MODULE_6__.copyText);\\r\\n }\\r\\n if (type === \\\"canvas\\\") {\\r\\n const viewModeOptions = [...options, typeof _this13.props.gridModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_6__.actionToggleGridMode, typeof _this13.props.zenModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_6__.actionToggleZenMode, typeof _this13.props.viewModeEnabled === \\\"undefined\\\" && _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__.actionToggleViewMode, _actions__WEBPACK_IMPORTED_MODULE_6__.actionToggleStats];\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: viewModeOptions,\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n else {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [_this13.device.isMobile && navigator.clipboard && {\\r\\n trackEvent: false,\\r\\n name: \\\"paste\\\",\\r\\n perform: function (elements, appStates) {\\r\\n _this13.pasteFromClipboard(null);\\r\\n return {\\r\\n commitToHistory: false\\r\\n };\\r\\n },\\r\\n contextItemLabel: \\\"labels.paste\\\"\\r\\n }, _this13.device.isMobile && navigator.clipboard && separator, _clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardBlob && elements.length > 0 && _actions__WEBPACK_IMPORTED_MODULE_6__.actionCopyAsPng, _clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardWriteText && elements.length > 0 && _actions__WEBPACK_IMPORTED_MODULE_6__.actionCopyAsSvg, _clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardWriteText && selectedElements.length > 0 && _actions__WEBPACK_IMPORTED_MODULE_6__.copyText, (_clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardBlob && elements.length > 0 || _clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardWriteText && elements.length > 0) && separator, _actions__WEBPACK_IMPORTED_MODULE_6__.actionSelectAll, separator, typeof _this13.props.gridModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_6__.actionToggleGridMode, typeof _this13.props.zenModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_6__.actionToggleZenMode, typeof _this13.props.viewModeEnabled === \\\"undefined\\\" && _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__.actionToggleViewMode, _actions__WEBPACK_IMPORTED_MODULE_6__.actionToggleStats],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n }\\r\\n else if (type === \\\"element\\\") {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_6__.actionCopy, ...options],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n else {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [_this13.device.isMobile && _actions__WEBPACK_IMPORTED_MODULE_6__.actionCut, _this13.device.isMobile && navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_6__.actionCopy, _this13.device.isMobile && navigator.clipboard && {\\r\\n name: \\\"paste\\\",\\r\\n trackEvent: false,\\r\\n perform: function (elements, appStates) {\\r\\n _this13.pasteFromClipboard(null);\\r\\n return {\\r\\n commitToHistory: false\\r\\n };\\r\\n },\\r\\n contextItemLabel: \\\"labels.paste\\\"\\r\\n }, _this13.device.isMobile && separator, ...options, separator, _actions__WEBPACK_IMPORTED_MODULE_6__.actionCopyStyles, _actions__WEBPACK_IMPORTED_MODULE_6__.actionPasteStyles, separator, maybeGroupAction && _actions__WEBPACK_IMPORTED_MODULE_6__.actionGroup, mayBeAllowUnbinding && _actions__WEBPACK_IMPORTED_MODULE_6__.actionUnbindText, mayBeAllowBinding && _actions__WEBPACK_IMPORTED_MODULE_6__.actionBindText, maybeUngroupAction && _actions__WEBPACK_IMPORTED_MODULE_6__.actionUngroup, (maybeGroupAction || maybeUngroupAction) && separator, _actions__WEBPACK_IMPORTED_MODULE_6__.actionAddToLibrary, separator, _actions__WEBPACK_IMPORTED_MODULE_6__.actionSendBackward, _actions__WEBPACK_IMPORTED_MODULE_6__.actionBringForward, _actions__WEBPACK_IMPORTED_MODULE_6__.actionSendToBack, _actions__WEBPACK_IMPORTED_MODULE_6__.actionBringToFront, separator, maybeFlipHorizontal && _actions__WEBPACK_IMPORTED_MODULE_6__.actionFlipHorizontal, maybeFlipVertical && _actions__WEBPACK_IMPORTED_MODULE_6__.actionFlipVertical, (maybeFlipHorizontal || maybeFlipVertical) && separator, _actions__WEBPACK_IMPORTED_MODULE_6__.actionLink.contextItemPredicate(elements, _this13.state) && _actions__WEBPACK_IMPORTED_MODULE_6__.actionLink, _actions__WEBPACK_IMPORTED_MODULE_6__.actionDuplicateSelection, _actions__WEBPACK_IMPORTED_MODULE_6__.actionToggleLock, separator, _actions__WEBPACK_IMPORTED_MODULE_6__.actionDeleteSelected],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault();\\r\\n if (isPanning) {\\r\\n return;\\r\\n }\\r\\n const { deltaX, deltaY } = event; // note that event.ctrlKey is necessary to handle pinch zooming\\r\\n if (event.metaKey || event.ctrlKey) {\\r\\n const sign = Math.sign(deltaY);\\r\\n const MAX_STEP = 10;\\r\\n const absDelta = Math.abs(deltaY);\\r\\n let delta = deltaY;\\r\\n if (absDelta > MAX_STEP) {\\r\\n delta = MAX_STEP * sign;\\r\\n }\\r\\n let newZoom = _this13.state.zoom.value - delta / 100; // increase zoom steps the more zoomed-in we are (applies to >100% only)\\r\\n newZoom += Math.log10(Math.max(1, _this13.state.zoom.value)) * -sign * // reduced amplification for small deltas (small movements on a trackpad)\\r\\n Math.min(1, absDelta / 20);\\r\\n _this13.setState(function (state) {\\r\\n return _objectSpread(_objectSpread({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getStateForZoom)({\\r\\n viewportX: cursorX,\\r\\n viewportY: cursorY,\\r\\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(newZoom)\\r\\n }, state)), {}, {\\r\\n shouldCacheIgnoreZoom: true\\r\\n });\\r\\n });\\r\\n _this13.resetShouldCacheIgnoreZoomDebounced();\\r\\n return;\\r\\n } // scroll horizontally when shift pressed\\r\\n if (event.shiftKey) {\\r\\n _this13.setState(function (_ref21) {\\r\\n let { zoom, scrollX } = _ref21;\\r\\n return {\\r\\n // on Mac, shift+wheel tends to result in deltaX\\r\\n scrollX: scrollX - (deltaY || deltaX) / zoom.value\\r\\n };\\r\\n });\\r\\n return;\\r\\n }\\r\\n _this13.setState(function (_ref22) {\\r\\n let { zoom, scrollX, scrollY } = _ref22;\\r\\n return {\\r\\n scrollX: scrollX - deltaX / zoom.value,\\r\\n scrollY: scrollY - deltaY / zoom.value\\r\\n };\\r\\n });\\r\\n });\\r\\n this.savePointer = function (x, y, button) {\\r\\n var _a, _b;\\r\\n if (!x || !y) {\\r\\n return;\\r\\n }\\r\\n const pointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: x,\\r\\n clientY: y\\r\\n }, _this13.state);\\r\\n if (isNaN(pointer.x) || isNaN(pointer.y)) { // sometimes the pointer goes off screen\\r\\n }\\r\\n (_b = (_a = _this13.props).onPointerUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, {\\r\\n pointer,\\r\\n button,\\r\\n pointersMap: gesture.pointers\\r\\n });\\r\\n };\\r\\n this.resetShouldCacheIgnoreZoomDebounced = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(function () {\\r\\n if (!_this13.unmounted) {\\r\\n _this13.setState({\\r\\n shouldCacheIgnoreZoom: false\\r\\n });\\r\\n }\\r\\n }, 300);\\r\\n this.updateDOMRect = function (cb) {\\r\\n var _a;\\r\\n if ((_a = _this13.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\\r\\n const excalidrawContainer = _this13.excalidrawContainerRef.current;\\r\\n const { width, height, left: offsetLeft, top: offsetTop } = excalidrawContainer.getBoundingClientRect();\\r\\n const { width: currentWidth, height: currentHeight, offsetTop: currentOffsetTop, offsetLeft: currentOffsetLeft } = _this13.state;\\r\\n if (width === currentWidth && height === currentHeight && offsetLeft === currentOffsetLeft && offsetTop === currentOffsetTop) {\\r\\n if (cb) {\\r\\n cb();\\r\\n }\\r\\n return;\\r\\n }\\r\\n _this13.setState({\\r\\n width,\\r\\n height,\\r\\n offsetLeft,\\r\\n offsetTop\\r\\n }, function () {\\r\\n cb && cb();\\r\\n });\\r\\n }\\r\\n };\\r\\n this.refresh = function () {\\r\\n _this13.setState(_objectSpread({}, _this13.getCanvasOffsets()));\\r\\n };\\r\\n};\\r\\nif (\\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_13__.ENV.TEST || \\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_13__.ENV.DEVELOPMENT) {\\r\\n window.h = window.h || {};\\r\\n Object.defineProperties(window.h, {\\r\\n elements: {\\r\\n configurable: true,\\r\\n get() {\\r\\n var _a;\\r\\n return (_a = this.app) === null || _a === void 0 ? void 0 : _a.scene.getElementsIncludingDeleted();\\r\\n },\\r\\n set(elements) {\\r\\n var _a;\\r\\n return (_a = this.app) === null || _a === void 0 ? void 0 : _a.scene.replaceAllElements(elements);\\r\\n }\\r\\n }\\r\\n });\\r\\n}\\r\\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixJQUFJLGFBQW9CLEtBQUssaURBQVEsSUFBSSxhQUFvQixLQUFLLHdEQUFlLEVBQUU7SUFDakYsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtRQUNoQyxRQUFRLEVBQUU7WUFDUixZQUFZLEVBQUUsSUFBSTtZQUVsQixHQUFHOztnQkFDRCxPQUFPLFVBQUksQ0FBQyxHQUFHLDBDQUFFLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQ3ZELENBQUM7WUFFRCxHQUFHLENBQUMsUUFBUTs7Z0JBQ1YsT0FBTyxVQUFJLENBQUMsR0FBRywwQ0FBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEQsQ0FBQztTQUVGO0tBQ0YsQ0FBQyxDQUFDO0NBQ0o7QUFFRCxpRUFBZSxHQUFHLEVBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vY29tcG9uZW50cy9BcHAudHN4PzM4ZTYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGZsdXNoU3luYyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCBjbHN4IGZyb20gXCJjbHN4XCI7XG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tIFwibmFub2lkXCI7XG5pbXBvcnQgeyBhY3Rpb25BZGRUb0xpYnJhcnksIGFjdGlvbkJyaW5nRm9yd2FyZCwgYWN0aW9uQnJpbmdUb0Zyb250LCBhY3Rpb25Db3B5LCBhY3Rpb25Db3B5QXNQbmcsIGFjdGlvbkNvcHlBc1N2ZywgY29weVRleHQsIGFjdGlvbkNvcHlTdHlsZXMsIGFjdGlvbkN1dCwgYWN0aW9uRGVsZXRlU2VsZWN0ZWQsIGFjdGlvbkR1cGxpY2F0ZVNlbGVjdGlvbiwgYWN0aW9uRmluYWxpemUsIGFjdGlvbkZsaXBIb3Jpem9udGFsLCBhY3Rpb25GbGlwVmVydGljYWwsIGFjdGlvbkdyb3VwLCBhY3Rpb25QYXN0ZVN0eWxlcywgYWN0aW9uU2VsZWN0QWxsLCBhY3Rpb25TZW5kQmFja3dhcmQsIGFjdGlvblNlbmRUb0JhY2ssIGFjdGlvblRvZ2dsZUdyaWRNb2RlLCBhY3Rpb25Ub2dnbGVTdGF0cywgYWN0aW9uVG9nZ2xlWmVuTW9kZSwgYWN0aW9uVW5iaW5kVGV4dCwgYWN0aW9uQmluZFRleHQsIGFjdGlvblVuZ3JvdXAsIHpvb21Ub0ZpdEVsZW1lbnRzLCBhY3Rpb25MaW5rLCBhY3Rpb25Ub2dnbGVMb2NrIH0gZnJvbSBcIi4uL2FjdGlvbnNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlZG9BY3Rpb24sIGNyZWF0ZVVuZG9BY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25IaXN0b3J5XCI7XG5pbXBvcnQgeyBBY3Rpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL2FjdGlvbnMvbWFuYWdlclwiO1xuaW1wb3J0IHsgYWN0aW9ucyB9IGZyb20gXCIuLi9hY3Rpb25zL3JlZ2lzdGVyXCI7XG5pbXBvcnQgeyB0cmFja0V2ZW50IH0gZnJvbSBcIi4uL2FuYWx5dGljc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlLCBpc0VyYXNlckFjdGl2ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgcGFyc2VDbGlwYm9hcmQsIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iLCBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0IH0gZnJvbSBcIi4uL2NsaXBib2FyZFwiO1xuaW1wb3J0IHsgQVBQX05BTUUsIENVUlNPUl9UWVBFLCBERUZBVUxUX01BWF9JTUFHRV9XSURUSF9PUl9IRUlHSFQsIERFRkFVTFRfVUlfT1BUSU9OUywgREVGQVVMVF9WRVJUSUNBTF9BTElHTiwgRFJBR0dJTkdfVEhSRVNIT0xELCBFTEVNRU5UX1JFQURZX1RPX0VSQVNFX09QQUNJVFksIEVMRU1FTlRfU0hJRlRfVFJBTlNMQVRFX0FNT1VOVCwgRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5ULCBFTlYsIEVWRU5ULCBHUklEX1NJWkUsIElNQUdFX1JFTkRFUl9USU1FT1VULCBMSU5FX0NPTkZJUk1fVEhSRVNIT0xELCBNQVhfQUxMT1dFRF9GSUxFX0JZVEVTLCBNSU1FX1RZUEVTLCBNUV9NQVhfSEVJR0hUX0xBTkRTQ0FQRSwgTVFfTUFYX1dJRFRIX0xBTkRTQ0FQRSwgTVFfTUFYX1dJRFRIX1BPUlRSQUlULCBNUV9SSUdIVF9TSURFQkFSX01JTl9XSURUSCwgTVFfU01fTUFYX1dJRFRILCBQT0lOVEVSX0JVVFRPTiwgU0NST0xMX1RJTUVPVVQsIFRBUF9UV0lDRV9USU1FT1VULCBURVhUX1RPX0NFTlRFUl9TTkFQX1RIUkVTSE9MRCwgVEhFTUUsIFRPVUNIX0NUWF9NRU5VX1RJTUVPVVQsIFZFUlRJQ0FMX0FMSUdOIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbG9hZEZyb21CbG9iIH0gZnJvbSBcIi4uL2RhdGFcIjtcbmltcG9ydCBMaWJyYXJ5LCB7IGRpc3RyaWJ1dGVMaWJyYXJ5SXRlbXNPblNxdWFyZUdyaWQgfSBmcm9tIFwiLi4vZGF0YS9saWJyYXJ5XCI7XG5pbXBvcnQgeyByZXN0b3JlLCByZXN0b3JlRWxlbWVudHMgfSBmcm9tIFwiLi4vZGF0YS9yZXN0b3JlXCI7XG5pbXBvcnQgeyBkcmFnTmV3RWxlbWVudCwgZHJhZ1NlbGVjdGVkRWxlbWVudHMsIGR1cGxpY2F0ZUVsZW1lbnQsIGdldENvbW1vbkJvdW5kcywgZ2V0Q3Vyc29yRm9yUmVzaXppbmdFbGVtZW50LCBnZXREcmFnT2Zmc2V0WFksIGdldEVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSwgZ2V0Tm9ybWFsaXplZERpbWVuc2lvbnMsIGdldFBlcmZlY3RFbGVtZW50U2l6ZSwgZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24sIGdldFJlc2l6ZU9mZnNldFhZLCBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcywgaGl0VGVzdCwgaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50LCBpc0ludmlzaWJseVNtYWxsRWxlbWVudCwgaXNOb25EZWxldGVkRWxlbWVudCwgaXNUZXh0RWxlbWVudCwgbmV3RWxlbWVudCwgbmV3TGluZWFyRWxlbWVudCwgbmV3VGV4dEVsZW1lbnQsIG5ld0ltYWdlRWxlbWVudCwgdGV4dFd5c2l3eWcsIHRyYW5zZm9ybUVsZW1lbnRzLCB1cGRhdGVUZXh0RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50XCI7XG5pbXBvcnQgeyBiaW5kT3JVbmJpbmRTZWxlY3RlZEVsZW1lbnRzLCBmaXhCaW5kaW5nc0FmdGVyRGVsZXRpb24sIGZpeEJpbmRpbmdzQWZ0ZXJEdXBsaWNhdGlvbiwgZ2V0RWxpZ2libGVFbGVtZW50c0ZvckJpbmRpbmcsIGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZywgaXNCaW5kaW5nRW5hYmxlZCwgaXNMaW5lYXJFbGVtZW50U2ltcGxlQW5kQWxyZWFkeUJvdW5kLCBtYXliZUJpbmRMaW5lYXJFbGVtZW50LCBzaG91bGRFbmFibGVCaW5kaW5nRm9yUG9pbnRlckV2ZW50LCB1bmJpbmRMaW5lYXJFbGVtZW50cywgdXBkYXRlQm91bmRFbGVtZW50cyB9IGZyb20gXCIuLi9lbGVtZW50L2JpbmRpbmdcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50LCBuZXdFbGVtZW50V2l0aCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGRlZXBDb3B5RWxlbWVudCwgbmV3RnJlZURyYXdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvbmV3RWxlbWVudFwiO1xuaW1wb3J0IHsgaGFzQm91bmRUZXh0RWxlbWVudCwgaXNCaW5kaW5nRWxlbWVudCwgaXNCaW5kaW5nRWxlbWVudFR5cGUsIGlzQm91bmRUb0NvbnRhaW5lciwgaXNJbWFnZUVsZW1lbnQsIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQsIGlzTGluZWFyRWxlbWVudCwgaXNMaW5lYXJFbGVtZW50VHlwZSwgaXNUZXh0QmluZGFibGVDb250YWluZXIgfSBmcm9tIFwiLi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBnZXRDZW50ZXIsIGdldERpc3RhbmNlIH0gZnJvbSBcIi4uL2dlc3R1cmVcIjtcbmltcG9ydCB7IGVkaXRHcm91cEZvclNlbGVjdGVkRWxlbWVudCwgZ2V0RWxlbWVudHNJbkdyb3VwLCBnZXRTZWxlY3RlZEdyb3VwSWRGb3JFbGVtZW50LCBnZXRTZWxlY3RlZEdyb3VwSWRzLCBpc0VsZW1lbnRJbkdyb3VwLCBpc1NlbGVjdGVkVmlhR3JvdXAsIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMgfSBmcm9tIFwiLi4vZ3JvdXBzXCI7XG5pbXBvcnQgSGlzdG9yeSBmcm9tIFwiLi4vaGlzdG9yeVwiO1xuaW1wb3J0IHsgZGVmYXVsdExhbmcsIGdldExhbmd1YWdlLCBsYW5ndWFnZXMsIHNldExhbmd1YWdlLCB0IH0gZnJvbSBcIi4uL2kxOG5cIjtcbmltcG9ydCB7IENPREVTLCBzaG91bGRSZXNpemVGcm9tQ2VudGVyLCBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvLCBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSwgaXNBcnJvd0tleSwgS0VZUywgaXNBbmRyb2lkIH0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCB7IGRpc3RhbmNlMmQsIGdldEdyaWRQb2ludCwgaXNQYXRoQUxvb3AsIHJvdGF0ZSB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgeyByZW5kZXJTY2VuZSB9IGZyb20gXCIuLi9yZW5kZXJlci9yZW5kZXJTY2VuZVwiO1xuaW1wb3J0IHsgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudCB9IGZyb20gXCIuLi9yZW5kZXJlci9yZW5kZXJFbGVtZW50XCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVTY3JvbGxDZW50ZXIsIGdldFRleHRCaW5kYWJsZUNvbnRhaW5lckF0UG9zaXRpb24sIGdldEVsZW1lbnRzQXRQb3NpdGlvbiwgZ2V0RWxlbWVudHNXaXRoaW5TZWxlY3Rpb24sIGdldE5vcm1hbGl6ZWRab29tLCBnZXRTZWxlY3RlZEVsZW1lbnRzLCBoYXNCYWNrZ3JvdW5kLCBpc092ZXJTY3JvbGxCYXJzLCBpc1NvbWVFbGVtZW50U2VsZWN0ZWQgfSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGdldFN0YXRlRm9yWm9vbSB9IGZyb20gXCIuLi9zY2VuZS96b29tXCI7XG5pbXBvcnQgeyBmaW5kU2hhcGVCeUtleSB9IGZyb20gXCIuLi9zaGFwZXNcIjtcbmltcG9ydCB7IGRlYm91bmNlLCBkaXN0YW5jZSwgZ2V0Rm9udFN0cmluZywgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIsIGlzSW5wdXRMaWtlLCBpc1Rvb2xJY29uLCBpc1dyaXRhYmxlRWxlbWVudCwgcmVzZXRDdXJzb3IsIHJlc29sdmFibGVQcm9taXNlLCBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMsIHNldEN1cnNvciwgc2V0Q3Vyc29yRm9yU2hhcGUsIHR1cGxlVG9Db29ycywgdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzLCB3aXRoQmF0Y2hlZFVwZGF0ZXMsIHdyYXBFdmVudCwgd2l0aEJhdGNoZWRVcGRhdGVzVGhyb3R0bGVkLCB1cGRhdGVPYmplY3QsIHNldEVyYXNlckN1cnNvciwgdXBkYXRlQWN0aXZlVG9vbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IENvbnRleHRNZW51IGZyb20gXCIuL0NvbnRleHRNZW51XCI7XG5pbXBvcnQgTGF5ZXJVSSBmcm9tIFwiLi9MYXllclVJXCI7XG5pbXBvcnQgeyBUb2FzdCB9IGZyb20gXCIuL1RvYXN0XCI7XG5pbXBvcnQgeyBhY3Rpb25Ub2dnbGVWaWV3TW9kZSB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvblRvZ2dsZVZpZXdNb2RlXCI7XG5pbXBvcnQgeyBkYXRhVVJMVG9GaWxlLCBnZW5lcmF0ZUlkRnJvbUZpbGUsIGdldERhdGFVUkwsIGdldEZpbGVGcm9tRXZlbnQsIGlzU3VwcG9ydGVkSW1hZ2VGaWxlLCBsb2FkU2NlbmVPckxpYnJhcnlGcm9tQmxvYiwgbm9ybWFsaXplRmlsZSwgcGFyc2VMaWJyYXJ5SlNPTiwgcmVzaXplSW1hZ2VGaWxlLCBTVkdTdHJpbmdUb0ZpbGUgfSBmcm9tIFwiLi4vZGF0YS9ibG9iXCI7XG5pbXBvcnQgeyBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMsIGxvYWRIVE1MSW1hZ2VFbGVtZW50LCBub3JtYWxpemVTVkcsIHVwZGF0ZUltYWdlQ2FjaGUgYXMgX3VwZGF0ZUltYWdlQ2FjaGUgfSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuaW1wb3J0IHRocm90dGxlIGZyb20gXCJsb2Rhc2gudGhyb3R0bGVcIjtcbmltcG9ydCB7IGZpbGVPcGVuIH0gZnJvbSBcIi4uL2RhdGEvZmlsZXN5c3RlbVwiO1xuaW1wb3J0IHsgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbiwgZ2V0QXBwcm94TWluTGluZUhlaWdodCwgZ2V0QXBwcm94TWluTGluZVdpZHRoLCBnZXRCb3VuZFRleHRFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94IH0gZnJvbSBcIi4uL2VsZW1lbnQvY29sbGlzaW9uXCI7XG5pbXBvcnQgeyByZXNpemVTaW5nbGVFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvcmVzaXplRWxlbWVudHNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUxpbmssIHNob3dIeXBlcmxpbmtUb29sdGlwLCBoaWRlSHlwZXJsaW5rVG9vbGlwLCBIeXBlcmxpbmssIGlzUG9pbnRIaXR0aW5nTGlua0ljb24sIGlzTG9jYWxMaW5rIH0gZnJvbSBcIi4uL2VsZW1lbnQvSHlwZXJsaW5rXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuLy96c3ZpY3ppYW5cbmV4cG9ydCBsZXQgc2hvd0ZvdXJ0aEZvbnQgPSBmYWxzZTtcbmNvbnN0IGRldmljZUNvbnRleHRJbml0aWFsVmFsdWUgPSB7XG4gIGlzU21TY3JlZW46IGZhbHNlLFxuICBpc01vYmlsZTogZmFsc2UsXG4gIGlzVG91Y2hTY3JlZW46IGZhbHNlLFxuICBjYW5EZXZpY2VGaXRTaWRlYmFyOiBmYWxzZVxufTtcbmNvbnN0IERldmljZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChkZXZpY2VDb250ZXh0SW5pdGlhbFZhbHVlKTtcbmV4cG9ydCBjb25zdCB1c2VEZXZpY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB1c2VDb250ZXh0KERldmljZUNvbnRleHQpO1xufTtcbmNvbnN0IEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBjb250YWluZXI6IG51bGwsXG4gIGlkOiBudWxsXG59KTtcbmV4cG9ydCBjb25zdCB1c2VFeGNhbGlkcmF3Q29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdXNlQ29udGV4dChFeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dCk7XG59O1xubGV0IGRpZFRhcFR3aWNlID0gZmFsc2U7XG5sZXQgdGFwcGVkVHdpY2VUaW1lciA9IDA7XG5sZXQgY3Vyc29yWCA9IDA7XG5sZXQgY3Vyc29yWSA9IDA7XG5sZXQgaXNIb2xkaW5nU3BhY2UgPSBmYWxzZTtcbmxldCBpc1Bhbm5pbmcgPSBmYWxzZTtcbmxldCBpc0RyYWdnaW5nU2Nyb2xsQmFyID0gZmFsc2U7XG5sZXQgY3VycmVudFNjcm9sbEJhcnMgPSB7XG4gIGhvcml6b250YWw6IG51bGwsXG4gIHZlcnRpY2FsOiBudWxsXG59O1xubGV0IHRvdWNoVGltZW91dCA9IDA7XG5sZXQgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7IC8vIHJlbW92ZSB0aGlzIGhhY2sgd2hlbiB3ZSBjYW4gc3luYyByZW5kZXIgJiByZXNpemVPYnNlcnZlciAoc3RhdGUgdXBkYXRlKVxuLy8gdG8gckFGLiBTZWUgIzU0MzlcblxubGV0IFRIUk9UVExFX05FWFRfUkVOREVSID0gdHJ1ZTtcbmxldCBsYXN0UG9pbnRlclVwID0gbnVsbDtcbmNvbnN0IGdlc3R1cmUgPSB7XG4gIHBvaW50ZXJzOiBuZXcgTWFwKCksXG4gIGxhc3RDZW50ZXI6IG51bGwsXG4gIGluaXRpYWxEaXN0YW5jZTogbnVsbCxcbiAgaW5pdGlhbFNjYWxlOiBudWxsXG59O1xuXG5jbGFzcyBBcHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAvL3pzdmljemlhblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIHN1cGVyKHByb3BzKTtcbiAgICBfdGhpcyA9IHRoaXM7XG5cbiAgICBfaW5pdGlhbGlzZVByb3BzLmNhbGwodGhpcyk7XG5cbiAgICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcbiAgICBjb25zdCB7XG4gICAgICBleGNhbGlkcmF3UmVmLFxuICAgICAgdmlld01vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICB6ZW5Nb2RlRW5hYmxlZCA9IGZhbHNlLFxuICAgICAgZ3JpZE1vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICB0aGVtZSA9IGRlZmF1bHRBcHBTdGF0ZS50aGVtZSxcbiAgICAgIG5hbWUgPSBkZWZhdWx0QXBwU3RhdGUubmFtZVxuICAgIH0gPSBwcm9wcztcbiAgICB0aGlzLnN0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRBcHBTdGF0ZSksIHt9LCB7XG4gICAgICB0aGVtZSxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZVxuICAgIH0sIHRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpKSwge30sIHtcbiAgICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgIHplbk1vZGVFbmFibGVkLFxuICAgICAgZ3JpZFNpemU6IGdyaWRNb2RlRW5hYmxlZCA/IEdSSURfU0laRSA6IG51bGwsXG4gICAgICBuYW1lLFxuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IGZhbHNlLFxuICAgICAgaXNMaWJyYXJ5TWVudURvY2tlZDogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLmlkID0gbmFub2lkKCk7XG4gICAgdGhpcy5saWJyYXJ5ID0gbmV3IExpYnJhcnkodGhpcyk7XG5cbiAgICBpZiAoZXhjYWxpZHJhd1JlZikge1xuICAgICAgY29uc3QgcmVhZHlQcm9taXNlID0gXCJjdXJyZW50XCIgaW4gZXhjYWxpZHJhd1JlZiAmJiBleGNhbGlkcmF3UmVmLmN1cnJlbnQ/LnJlYWR5UHJvbWlzZSB8fCByZXNvbHZhYmxlUHJvbWlzZSgpO1xuICAgICAgY29uc3QgYXBpID0ge1xuICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgcmVhZHlQcm9taXNlLFxuICAgICAgICB1cGRhdGVTY2VuZTogdGhpcy51cGRhdGVTY2VuZSxcbiAgICAgICAgdXBkYXRlTGlicmFyeTogdGhpcy5saWJyYXJ5LnVwZGF0ZUxpYnJhcnksXG4gICAgICAgIGFkZEZpbGVzOiB0aGlzLmFkZEZpbGVzLFxuICAgICAgICByZXNldFNjZW5lOiB0aGlzLnJlc2V0U2NlbmUsXG4gICAgICAgIGdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkOiB0aGlzLmdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkLFxuICAgICAgICBoaXN0b3J5OiB7XG4gICAgICAgICAgY2xlYXI6IHRoaXMucmVzZXRIaXN0b3J5XG4gICAgICAgIH0sXG4gICAgICAgIHNjcm9sbFRvQ29udGVudDogdGhpcy5zY3JvbGxUb0NvbnRlbnQsXG4gICAgICAgIHpvb21Ub0ZpdDogdGhpcy56b29tVG9GaXQsXG4gICAgICAgIC8venN2aWN6aWFuXG4gICAgICAgIGdldFNjZW5lRWxlbWVudHM6IHRoaXMuZ2V0U2NlbmVFbGVtZW50cyxcbiAgICAgICAgZ2V0QXBwU3RhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMuc3RhdGU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEZpbGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLmZpbGVzO1xuICAgICAgICB9LFxuICAgICAgICByZWZyZXNoOiB0aGlzLnJlZnJlc2gsXG4gICAgICAgIHNldFRvYXN0OiB0aGlzLnNldFRvYXN0LFxuICAgICAgICB1cGRhdGVDb250YWluZXJTaXplOiB0aGlzLnVwZGF0ZUNvbnRhaW5lclNpemUsXG4gICAgICAgIC8venN2aWN6aWFuXG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICBzZXRMb2NhbEZvbnQ6IHRoaXMuc2V0TG9jYWxGb250LFxuICAgICAgICAvL3pzdmljemlhblxuICAgICAgICBzZWxlY3RFbGVtZW50czogdGhpcy5zZWxlY3RFbGVtZW50cyxcbiAgICAgICAgLy96c3ZpY3ppYW5cbiAgICAgICAgc2VuZEJhY2t3YXJkOiB0aGlzLnNlbmRCYWNrd2FyZCxcbiAgICAgICAgLy96c3ZpY3ppYW5cbiAgICAgICAgYnJpbmdGb3J3YXJkOiB0aGlzLmJyaW5nRm9yd2FyZCxcbiAgICAgICAgLy96c3ZpY3ppYW5cbiAgICAgICAgc2VuZFRvQmFjazogdGhpcy5zZW5kVG9CYWNrLFxuICAgICAgICAvL3pzdmljemlhblxuICAgICAgICBicmluZ1RvRnJvbnQ6IHRoaXMuYnJpbmdUb0Zyb250LFxuICAgICAgICAvL3pzdmljemlhblxuICAgICAgICByZXN0b3JlOiB0aGlzLnJlc3RvcmUsXG4gICAgICAgIC8venN2aWN6aWFuXG4gICAgICAgIHNldE1vYmlsZU1vZGVBbGxvd2VkOiB0aGlzLnNldE1vYmlsZU1vZGVBbGxvd2VkLFxuICAgICAgICAvL3pzdmljemlhblxuICAgICAgICBzZXRBY3RpdmVUb29sOiB0aGlzLnNldEFjdGl2ZVRvb2wsXG4gICAgICAgIHNldEN1cnNvcjogdGhpcy5zZXRDdXJzb3IsXG4gICAgICAgIHJlc2V0Q3Vyc29yOiB0aGlzLnJlc2V0Q3Vyc29yXG4gICAgICB9O1xuXG4gICAgICBpZiAodHlwZW9mIGV4Y2FsaWRyYXdSZWYgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBleGNhbGlkcmF3UmVmKGFwaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGNhbGlkcmF3UmVmLmN1cnJlbnQgPSBhcGk7XG4gICAgICB9XG5cbiAgICAgIHJlYWR5UHJvbWlzZS5yZXNvbHZlKGFwaSk7XG4gICAgfVxuXG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUgPSB7XG4gICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgaWQ6IHRoaXMuaWRcbiAgICB9O1xuICAgIHRoaXMuc2NlbmUgPSBuZXcgU2NlbmUoKTtcbiAgICB0aGlzLmhpc3RvcnkgPSBuZXcgSGlzdG9yeSgpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlciA9IG5ldyBBY3Rpb25NYW5hZ2VyKHRoaXMuc3luY0FjdGlvblJlc3VsdCwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnN0YXRlO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKTtcbiAgICB9LCB0aGlzKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIucmVnaXN0ZXJBbGwoYWN0aW9ucyk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWN0aW9uKGNyZWF0ZVVuZG9BY3Rpb24odGhpcy5oaXN0b3J5KSk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWN0aW9uKGNyZWF0ZVJlZG9BY3Rpb24odGhpcy5oaXN0b3J5KSk7XG4gIH1cblxuICByZW5kZXJDYW52YXMoKSB7XG4gICAgY29uc3QgY2FudmFzU2NhbGUgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aDogY2FudmFzRE9NV2lkdGgsXG4gICAgICBoZWlnaHQ6IGNhbnZhc0RPTUhlaWdodCxcbiAgICAgIHZpZXdNb2RlRW5hYmxlZFxuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IGNhbnZhc1dpZHRoID0gY2FudmFzRE9NV2lkdGggKiBjYW52YXNTY2FsZTtcbiAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBjYW52YXNET01IZWlnaHQgKiBjYW52YXNTY2FsZTtcblxuICAgIGlmICh2aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImNhbnZhc1wiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJleGNhbGlkcmF3X19jYW52YXNcIixcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICB3aWR0aDogY2FudmFzRE9NV2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBjYW52YXNET01IZWlnaHQsXG4gICAgICAgICAgY3Vyc29yOiBDVVJTT1JfVFlQRS5HUkFCXG4gICAgICAgIH0sXG4gICAgICAgIHdpZHRoOiBjYW52YXNXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjYW52YXNIZWlnaHQsXG4gICAgICAgIHJlZjogdGhpcy5oYW5kbGVDYW52YXNSZWYsXG4gICAgICAgIG9uQ29udGV4dE1lbnU6IHRoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUsXG4gICAgICAgIG9uUG9pbnRlck1vdmU6IHRoaXMuaGFuZGxlQ2FudmFzUG9pbnRlck1vdmUsXG4gICAgICAgIG9uUG9pbnRlclVwOiB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJVcCxcbiAgICAgICAgb25Qb2ludGVyQ2FuY2VsOiB0aGlzLnJlbW92ZVBvaW50ZXIsXG4gICAgICAgIG9uVG91Y2hNb3ZlOiB0aGlzLmhhbmRsZVRvdWNoTW92ZSxcbiAgICAgICAgb25Qb2ludGVyRG93bjogdGhpcy5oYW5kbGVDYW52YXNQb2ludGVyRG93bixcbiAgICAgICAgY2hpbGRyZW46IHQoXCJsYWJlbHMuZHJhd2luZ0NhbnZhc1wiKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwiY2FudmFzXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJleGNhbGlkcmF3X19jYW52YXNcIixcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHdpZHRoOiBjYW52YXNET01XaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjYW52YXNET01IZWlnaHRcbiAgICAgIH0sXG4gICAgICB3aWR0aDogY2FudmFzV2lkdGgsXG4gICAgICBoZWlnaHQ6IGNhbnZhc0hlaWdodCxcbiAgICAgIHJlZjogdGhpcy5oYW5kbGVDYW52YXNSZWYsXG4gICAgICBvbkNvbnRleHRNZW51OiB0aGlzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51LFxuICAgICAgb25Qb2ludGVyRG93bjogdGhpcy5oYW5kbGVDYW52YXNQb2ludGVyRG93bixcbiAgICAgIG9uRG91YmxlQ2xpY2s6IHRoaXMuaGFuZGxlQ2FudmFzRG91YmxlQ2xpY2ssXG4gICAgICBvblBvaW50ZXJNb3ZlOiB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlLFxuICAgICAgb25Qb2ludGVyVXA6IHRoaXMuaGFuZGxlQ2FudmFzUG9pbnRlclVwLFxuICAgICAgb25Qb2ludGVyQ2FuY2VsOiB0aGlzLnJlbW92ZVBvaW50ZXIsXG4gICAgICBvblRvdWNoTW92ZTogdGhpcy5oYW5kbGVUb3VjaE1vdmUsXG4gICAgICBjaGlsZHJlbjogdChcImxhYmVscy5kcmF3aW5nQ2FudmFzXCIpXG4gICAgfSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IHtcbiAgICAgIG9uQ29sbGFiQnV0dG9uQ2xpY2ssXG4gICAgICByZW5kZXJUb3BSaWdodFVJLFxuICAgICAgcmVuZGVyRm9vdGVyLFxuICAgICAgcmVuZGVyQ3VzdG9tU3RhdHNcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KFwiZXhjYWxpZHJhdyBleGNhbGlkcmF3LWNvbnRhaW5lclwiLCB7XG4gICAgICAgIFwiZXhjYWxpZHJhdy0tdmlldy1tb2RlXCI6IHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkLFxuICAgICAgICBcImV4Y2FsaWRyYXctLW1vYmlsZVwiOiB0aGlzLmRldmljZS5pc01vYmlsZSB8fCAhKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkIHx8IHRoaXMuc3RhdGUuemVuTW9kZUVuYWJsZWQpICYmIHRoaXMuc3RhdGUudHJheU1vZGVFbmFibGVkIC8venN2aWN6aWFuXG5cbiAgICAgIH0pLFxuICAgICAgcmVmOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYsXG4gICAgICBvbkRyb3A6IHRoaXMuaGFuZGxlQXBwT25Ecm9wLFxuICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICBvbktleURvd246IHRoaXMucHJvcHMuaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSA/IHVuZGVmaW5lZCA6IHRoaXMub25LZXlEb3duLFxuICAgICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJWYWx1ZSxcbiAgICAgICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4cyhEZXZpY2VDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMuZGV2aWNlLFxuICAgICAgICAgIGNoaWxkcmVuOiBbLyojX19QVVJFX18qL19qc3goTGF5ZXJVSSwge1xuICAgICAgICAgICAgY2FudmFzOiB0aGlzLmNhbnZhcyxcbiAgICAgICAgICAgIGFwcFN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgZmlsZXM6IHRoaXMuZmlsZXMsXG4gICAgICAgICAgICBzZXRBcHBTdGF0ZTogdGhpcy5zZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IHRoaXMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICAgIGVsZW1lbnRzOiB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgICAgICAgb25Db2xsYWJCdXR0b25DbGljazogb25Db2xsYWJCdXR0b25DbGljayxcbiAgICAgICAgICAgIG9uTG9ja1RvZ2dsZTogdGhpcy50b2dnbGVMb2NrLFxuICAgICAgICAgICAgb25QZW5Nb2RlVG9nZ2xlOiB0aGlzLnRvZ2dsZVBlbk1vZGUsXG4gICAgICAgICAgICBvbkluc2VydEVsZW1lbnRzOiBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSh7XG4gICAgICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgZmlsZXM6IG51bGxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFuZ0NvZGU6IGdldExhbmd1YWdlKCkuY29kZSxcbiAgICAgICAgICAgIGlzQ29sbGFib3JhdGluZzogdGhpcy5wcm9wcy5pc0NvbGxhYm9yYXRpbmcsXG4gICAgICAgICAgICByZW5kZXJUb3BSaWdodFVJOiByZW5kZXJUb3BSaWdodFVJLFxuICAgICAgICAgICAgcmVuZGVyQ3VzdG9tRm9vdGVyOiByZW5kZXJGb290ZXIsXG4gICAgICAgICAgICByZW5kZXJDdXN0b21TdGF0czogcmVuZGVyQ3VzdG9tU3RhdHMsXG4gICAgICAgICAgICBzaG93RXhpdFplbk1vZGVCdG46IHR5cGVvZiB0aGlzLnByb3BzPy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0aGlzLnN0YXRlLnplbk1vZGVFbmFibGVkLFxuICAgICAgICAgICAgc2hvd1RoZW1lQnRuOiB0eXBlb2YgdGhpcy5wcm9wcz8udGhlbWUgPT09IFwidW5kZWZpbmVkXCIgJiYgdGhpcy5wcm9wcy5VSU9wdGlvbnMuY2FudmFzQWN0aW9ucy50aGVtZSxcbiAgICAgICAgICAgIGxpYnJhcnlSZXR1cm5Vcmw6IHRoaXMucHJvcHMubGlicmFyeVJldHVyblVybCxcbiAgICAgICAgICAgIFVJT3B0aW9uczogdGhpcy5wcm9wcy5VSU9wdGlvbnMsXG4gICAgICAgICAgICBmb2N1c0NvbnRhaW5lcjogdGhpcy5mb2N1c0NvbnRhaW5lcixcbiAgICAgICAgICAgIGxpYnJhcnk6IHRoaXMubGlicmFyeSxcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgb25JbWFnZUFjdGlvbjogdGhpcy5vbkltYWdlQWN0aW9uXG4gICAgICAgICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJleGNhbGlkcmF3LXRleHRFZGl0b3JDb250YWluZXJcIlxuICAgICAgICAgIH0pLCAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiZXhjYWxpZHJhdy1jb250ZXh0TWVudUNvbnRhaW5lclwiXG4gICAgICAgICAgfSksIHNlbGVjdGVkRWxlbWVudC5sZW5ndGggPT09IDEgJiYgdGhpcy5zdGF0ZS5zaG93SHlwZXJsaW5rUG9wdXAgJiYgLyojX19QVVJFX18qL19qc3goSHlwZXJsaW5rLCB7XG4gICAgICAgICAgICBlbGVtZW50OiBzZWxlY3RlZEVsZW1lbnRbMF0sXG4gICAgICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHNldEFwcFN0YXRlOiB0aGlzLnNldEFwcFN0YXRlLFxuICAgICAgICAgICAgb25MaW5rT3BlbjogdGhpcy5wcm9wcy5vbkxpbmtPcGVuXG4gICAgICAgICAgfSwgc2VsZWN0ZWRFbGVtZW50WzBdLmlkKSwgdGhpcy5zdGF0ZS50b2FzdCAhPT0gbnVsbCAmJiAvKiNfX1BVUkVfXyovX2pzeChUb2FzdCwge1xuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5zdGF0ZS50b2FzdC5tZXNzYWdlLFxuICAgICAgICAgICAgb25DbG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLnNldFRvYXN0KG51bGwpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLnN0YXRlLnRvYXN0LmR1cmF0aW9uLFxuICAgICAgICAgICAgY2xvc2FibGU6IHRoaXMuc3RhdGUudG9hc3QuY2xvc2FibGVcbiAgICAgICAgICB9KSwgLyojX19QVVJFX18qL19qc3goXCJtYWluXCIsIHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiB0aGlzLnJlbmRlckNhbnZhcygpXG4gICAgICAgICAgfSldXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICAgIF90aGlzMy51bm1vdW50ZWQgPSBmYWxzZTtcbiAgICAgIF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUuY29udGFpbmVyID0gX3RoaXMzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuVEVTVCB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLkRFVkVMT1BNRU5UKSB7XG4gICAgICAgIGNvbnN0IHNldFN0YXRlID0gX3RoaXMzLnNldFN0YXRlLmJpbmQoX3RoaXMzKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3cuaCwge1xuICAgICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5zdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldFN0YXRlOiB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzLnNldFN0YXRlKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcHA6IHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBfdGhpczNcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhpc3Rvcnk6IHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBfdGhpczMuaGlzdG9yeVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzMy5zY2VuZS5hZGRDYWxsYmFjayhfdGhpczMub25TY2VuZVVwZGF0ZWQpO1xuXG4gICAgICBfdGhpczMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgICAgaWYgKF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgX3RoaXMzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ICYmIC8vIGJvdW5kaW5nIHJlY3RzIGRvbid0IHdvcmsgaW4gdGVzdHMgc28gdXBkYXRpbmdcbiAgICAgIC8vIHRoZSBzdGF0ZSBvbiBpbml0IHdvdWxkIHJlc3VsdCBpbiBtYWtpbmcgdGhlIHRlc3QgZW52aXJvIHJ1blxuICAgICAgLy8gaW4gbW9iaWxlIGJyZWFrcG9pbnQgKDAgd2lkdGgvaGVpZ2h0KSwgbWFraW5nIGV2ZXJ5dGhpbmcgZmFpbFxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwidGVzdFwiKSB7XG4gICAgICAgIF90aGlzMy5yZWZyZXNoRGV2aWNlU3RhdGUoX3RoaXMzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93ICYmIF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmPy5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzMy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgVEhST1RUTEVfTkVYVF9SRU5ERVIgPSBmYWxzZTsgLy8gcmVjb21wdXRlIGRldmljZSBkaW1lbnNpb25zIHN0YXRlXG4gICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgICBfdGhpczMucmVmcmVzaERldmljZVN0YXRlKF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpOyAvLyByZWZyZXNoIG9mZnNldHNcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4gICAgICAgICAgX3RoaXMzLnVwZGF0ZURPTVJlY3QoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIF90aGlzMy5yZXNpemVPYnNlcnZlcj8ub2JzZXJ2ZShfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICAgIH0gZWxzZSBpZiAod2luZG93Lm1hdGNoTWVkaWEpIHtcbiAgICAgICAgY29uc3QgbWRTY3JlZW5RdWVyeSA9IHdpbmRvdy5tYXRjaE1lZGlhKGAobWF4LXdpZHRoOiAke01RX01BWF9XSURUSF9QT1JUUkFJVH1weCksIChtYXgtaGVpZ2h0OiAke01RX01BWF9IRUlHSFRfTEFORFNDQVBFfXB4KSBhbmQgKG1heC13aWR0aDogJHtNUV9NQVhfV0lEVEhfTEFORFNDQVBFfXB4KWApO1xuICAgICAgICBjb25zdCBzbVNjcmVlblF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoYChtYXgtd2lkdGg6ICR7TVFfU01fTUFYX1dJRFRIfXB4KWApO1xuICAgICAgICBjb25zdCBjYW5EZXZpY2VGaXRTaWRlYmFyTWVkaWFRdWVyeSA9IHdpbmRvdy5tYXRjaE1lZGlhKGAobWluLXdpZHRoOiAkey8vIE5PVEUgdGhpcyB3b24ndCB1cGRhdGUgaWYgYSBkaWZmZXJlbnQgYnJlYWtwb2ludCBpcyBzdXBwbGllZFxuICAgICAgICAvLyBhZnRlciBtb3VudFxuICAgICAgICBfdGhpczMucHJvcHMuVUlPcHRpb25zLmRvY2tlZFNpZGViYXJCcmVha3BvaW50ICE9IG51bGwgPyBfdGhpczMucHJvcHMuVUlPcHRpb25zLmRvY2tlZFNpZGViYXJCcmVha3BvaW50IDogTVFfUklHSFRfU0lERUJBUl9NSU5fV0lEVEh9cHgpYCk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgX3RoaXMzLmRldmljZSA9IHVwZGF0ZU9iamVjdChfdGhpczMuZGV2aWNlLCB7XG4gICAgICAgICAgICBpc1NtU2NyZWVuOiBzbVNjcmVlblF1ZXJ5Lm1hdGNoZXMsXG4gICAgICAgICAgICBpc01vYmlsZTogbWRTY3JlZW5RdWVyeS5tYXRjaGVzICYmIF90aGlzMy5hbGxvd01vYmlsZU1vZGUsXG4gICAgICAgICAgICAvL3pzdmljemlhblxuICAgICAgICAgICAgY2FuRGV2aWNlRml0U2lkZWJhcjogY2FuRGV2aWNlRml0U2lkZWJhck1lZGlhUXVlcnkubWF0Y2hlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIG1kU2NyZWVuUXVlcnkuYWRkTGlzdGVuZXIoaGFuZGxlcik7XG5cbiAgICAgICAgX3RoaXMzLmRldGFjaElzTW9iaWxlTXFIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBtZFNjcmVlblF1ZXJ5LnJlbW92ZUxpc3RlbmVyKGhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkpO1xuXG4gICAgICBpZiAoc2VhcmNoUGFyYW1zLmhhcyhcIndlYi1zaGFyZS10YXJnZXRcIikpIHtcbiAgICAgICAgLy8gT2J0YWluIGEgZmlsZSB0aGF0IHdhcyBzaGFyZWQgdmlhIHRoZSBXZWIgU2hhcmUgVGFyZ2V0IEFQSS5cbiAgICAgICAgX3RoaXMzLnJlc3RvcmVGaWxlRnJvbVNoYXJlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpczMudXBkYXRlRE9NUmVjdChfdGhpczMuaW5pdGlhbGl6ZVNjZW5lKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5maWxlcyA9IHt9O1xuICAgIHRoaXMuaW1hZ2VDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnVubW91bnRlZCA9IHRydWU7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgIHRoaXMuc2NlbmUuZGVzdHJveSgpO1xuICAgIGNsZWFyVGltZW91dCh0b3VjaFRpbWVvdXQpO1xuICAgIHRvdWNoVGltZW91dCA9IDA7XG4gIH1cblxuICByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRoaXMucmVtb3ZlUG9pbnRlcik7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5DT1BZLCB0aGlzLm9uQ29weSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgdGhpcy5wYXN0ZUZyb21DbGlwYm9hcmQpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQ1VULCB0aGlzLm9uQ3V0KTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5XSEVFTCwgdGhpcy5vbldoZWVsKTtcbiAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlNDUk9MTCwgdGhpcy5vblNjcm9sbCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCB0aGlzLm9uS2V5RG93biwgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuTU9VU0VfTU9WRSwgdGhpcy51cGRhdGVDdXJyZW50Q3Vyc29yUG9zaXRpb24sIGZhbHNlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULktFWVVQLCB0aGlzLm9uS2V5VXApO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlJFU0laRSwgdGhpcy5vblJlc2l6ZSwgZmFsc2UpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlVOTE9BRCwgdGhpcy5vblVubG9hZCwgZmFsc2UpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRoaXMub25CbHVyLCBmYWxzZSk7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuRFJBR19PVkVSLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkRST1AsIHRoaXMuZGlzYWJsZUV2ZW50LCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5HRVNUVVJFX1NUQVJULCB0aGlzLm9uR2VzdHVyZVN0YXJ0LCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5HRVNUVVJFX0NIQU5HRSwgdGhpcy5vbkdlc3R1cmVDaGFuZ2UsIGZhbHNlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkdFU1RVUkVfRU5ELCB0aGlzLm9uR2VzdHVyZUVuZCwgZmFsc2UpO1xuICAgIHRoaXMuZGV0YWNoSXNNb2JpbGVNcUhhbmRsZXI/LigpO1xuICB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgdGhpcy5yZW1vdmVQb2ludGVyKTsgLy8gIzM1NTNcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09QWSwgdGhpcy5vbkNvcHkpO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5hZGRFdmVudExpc3RlbmVyKEVWRU5ULldIRUVMLCB0aGlzLm9uV2hlZWwsIHtcbiAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5oYW5kbGVLZXlib2FyZEdsb2JhbGx5KSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIHRoaXMub25LZXlEb3duLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgdGhpcy5vbktleVVwLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlXG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5NT1VTRV9NT1ZFLCB0aGlzLnVwZGF0ZUN1cnJlbnRDdXJzb3JQb3NpdGlvbik7IC8vIHJlcmVuZGVyIHRleHQgZWxlbWVudHMgb24gZm9udCBsb2FkIHRvIGZpeCAjNjM3ICYmICMxNTUzXG5cbiAgICBkb2N1bWVudC5mb250cz8uYWRkRXZlbnRMaXN0ZW5lcj8uKFwibG9hZGluZ2RvbmVcIiwgdGhpcy5vbkZvbnRMb2FkZWQpOyAvLyBTYWZhcmktb25seSBkZXNrdG9wIHBpbmNoIHpvb21cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9TVEFSVCwgdGhpcy5vbkdlc3R1cmVTdGFydCwgZmFsc2UpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9DSEFOR0UsIHRoaXMub25HZXN0dXJlQ2hhbmdlLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5HRVNUVVJFX0VORCwgdGhpcy5vbkdlc3R1cmVFbmQsIGZhbHNlKTtcblxuICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5kZXRlY3RTY3JvbGwpIHtcbiAgICAgIHRoaXMubmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIgPSBnZXROZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lcih0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCk7XG4gICAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuU0NST0xMLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICB9XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5SRVNJWkUsIHRoaXMub25SZXNpemUsIGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5VTkxPQUQsIHRoaXMub25VbmxvYWQsIGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0aGlzLm9uQmx1ciwgZmFsc2UpO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkRSQUdfT1ZFUiwgdGhpcy5kaXNhYmxlRXZlbnQsIGZhbHNlKTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5EUk9QLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQgJiYgcHJldlByb3BzLlVJT3B0aW9ucy5kb2NrZWRTaWRlYmFyQnJlYWtwb2ludCAhPT0gdGhpcy5wcm9wcy5VSU9wdGlvbnMuZG9ja2VkU2lkZWJhckJyZWFrcG9pbnQpIHtcbiAgICAgIHRoaXMucmVmcmVzaERldmljZVN0YXRlKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlN0YXRlLnNjcm9sbFggIT09IHRoaXMuc3RhdGUuc2Nyb2xsWCB8fCBwcmV2U3RhdGUuc2Nyb2xsWSAhPT0gdGhpcy5zdGF0ZS5zY3JvbGxZKSB7XG4gICAgICB0aGlzLnByb3BzPy5vblNjcm9sbENoYW5nZT8uKHRoaXMuc3RhdGUuc2Nyb2xsWCwgdGhpcy5zdGF0ZS5zY3JvbGxZKTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLmxlbmd0aCAmJiBpc0VyYXNlckFjdGl2ZSh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGFjdGl2ZVRvb2w6IHVwZGF0ZUFjdGl2ZVRvb2wodGhpcy5zdGF0ZSwge1xuICAgICAgICAgIHR5cGU6IFwic2VsZWN0aW9uXCJcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJlcmFzZXJcIiAmJiBwcmV2U3RhdGUudGhlbWUgIT09IHRoaXMuc3RhdGUudGhlbWUpIHtcbiAgICAgIHNldEVyYXNlckN1cnNvcih0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZS50aGVtZSk7XG4gICAgfSAvLyBIaWRlIGh5cGVybGluayBwb3B1cCBpZiBzaG93biB3aGVuIGVsZW1lbnQgdHlwZSBpcyBub3Qgc2VsZWN0aW9uXG5cblxuICAgIGlmIChwcmV2U3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInNlbGVjdGlvblwiICYmIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlICE9PSBcInNlbGVjdGlvblwiICYmIHRoaXMuc3RhdGUuc2hvd0h5cGVybGlua1BvcHVwKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2hvd0h5cGVybGlua1BvcHVwOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5sYW5nQ29kZSAhPT0gdGhpcy5wcm9wcy5sYW5nQ29kZSkge1xuICAgICAgdGhpcy51cGRhdGVMYW5ndWFnZSgpO1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMudmlld01vZGVFbmFibGVkICE9PSB0aGlzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHZpZXdNb2RlRW5hYmxlZDogISF0aGlzLnByb3BzLnZpZXdNb2RlRW5hYmxlZFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZTdGF0ZS52aWV3TW9kZUVuYWJsZWQgIT09IHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLmRlc2VsZWN0RWxlbWVudHMoKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnplbk1vZGVFbmFibGVkICE9PSB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgemVuTW9kZUVuYWJsZWQ6ICEhdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy50aGVtZSAhPT0gdGhpcy5wcm9wcy50aGVtZSAmJiB0aGlzLnByb3BzLnRoZW1lKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdGhlbWU6IHRoaXMucHJvcHMudGhlbWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMuZ3JpZE1vZGVFbmFibGVkICE9PSB0aGlzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGdyaWRTaXplOiB0aGlzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCA/IEdSSURfU0laRSA6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLm5hbWUgJiYgcHJldlByb3BzLm5hbWUgIT09IHRoaXMucHJvcHMubmFtZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIG5hbWU6IHRoaXMucHJvcHMubmFtZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNsYXNzTGlzdC50b2dnbGUoXCJ0aGVtZS0tZGFya1wiLCB0aGlzLnN0YXRlLnRoZW1lID09PSBcImRhcmtcIik7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJiAhdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWRdKSB7XG4gICAgICAvLyBkZWZlciBzbyB0aGF0IHRoZSBjb21taXRUb0hpc3RvcnkgZmxhZyBpc24ndCByZXNldCB2aWEgY3VycmVudCB1cGRhdGVcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczQuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIG11bHRpRWxlbWVudFxuICAgIH0gPSBwcmV2U3RhdGU7XG5cbiAgICBpZiAocHJldlN0YXRlLmFjdGl2ZVRvb2wgIT09IHRoaXMuc3RhdGUuYWN0aXZlVG9vbCAmJiBtdWx0aUVsZW1lbnQgIT0gbnVsbCAmJiBpc0JpbmRpbmdFbmFibGVkKHRoaXMuc3RhdGUpICYmIGlzQmluZGluZ0VsZW1lbnQobXVsdGlFbGVtZW50LCBmYWxzZSkpIHtcbiAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQobXVsdGlFbGVtZW50LCB0aGlzLnN0YXRlLCB0aGlzLnNjZW5lLCB0dXBsZVRvQ29vcnMoTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEF0SW5kZXhHbG9iYWxDb29yZGluYXRlcyhtdWx0aUVsZW1lbnQsIC0xKSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnNvckJ1dHRvbiA9IHt9O1xuICAgIGNvbnN0IHBvaW50ZXJWaWV3cG9ydENvb3JkcyA9IHt9O1xuICAgIGNvbnN0IHJlbW90ZVNlbGVjdGVkRWxlbWVudElkcyA9IHt9O1xuICAgIGNvbnN0IHBvaW50ZXJVc2VybmFtZXMgPSB7fTtcbiAgICBjb25zdCBwb2ludGVyVXNlclN0YXRlcyA9IHt9O1xuICAgIHRoaXMuc3RhdGUuY29sbGFib3JhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh1c2VyLCBzb2NrZXRJZCkge1xuICAgICAgaWYgKHVzZXIuc2VsZWN0ZWRFbGVtZW50SWRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgT2JqZWN0LmtleXModXNlci5zZWxlY3RlZEVsZW1lbnRJZHMpKSB7XG4gICAgICAgICAgaWYgKCEoaWQgaW4gcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzKSkge1xuICAgICAgICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2lkXSA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkc1tpZF0ucHVzaChzb2NrZXRJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF1c2VyLnBvaW50ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgICBwb2ludGVyVXNlcm5hbWVzW3NvY2tldElkXSA9IHVzZXIudXNlcm5hbWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh1c2VyLnVzZXJTdGF0ZSkge1xuICAgICAgICBwb2ludGVyVXNlclN0YXRlc1tzb2NrZXRJZF0gPSB1c2VyLnVzZXJTdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcG9pbnRlclZpZXdwb3J0Q29vcmRzW3NvY2tldElkXSA9IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3Jkcyh7XG4gICAgICAgIHNjZW5lWDogdXNlci5wb2ludGVyLngsXG4gICAgICAgIHNjZW5lWTogdXNlci5wb2ludGVyLnlcbiAgICAgIH0sIF90aGlzNC5zdGF0ZSk7XG4gICAgICBjdXJzb3JCdXR0b25bc29ja2V0SWRdID0gdXNlci5idXR0b247XG4gICAgfSk7XG4gICAgY29uc3QgcmVuZGVyaW5nRWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLmZpbHRlcihmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgaWYgKGlzSW1hZ2VFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGlmICggLy8gbm90IHBsYWNlZCBvbiBjYW52YXMgeWV0IChidXQgaW4gZWxlbWVudHMgYXJyYXkpXG4gICAgICAgIF90aGlzNC5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50SWQgPT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gZG9uJ3QgcmVuZGVyIHRleHQgZWxlbWVudCB0aGF0J3MgYmVpbmcgY3VycmVudGx5IGVkaXRlZCAoaXQnc1xuICAgICAgLy8gcmVuZGVyZWQgb24gcmVtb3RlIG9ubHkpXG5cblxuICAgICAgcmV0dXJuICFfdGhpczQuc3RhdGUuZWRpdGluZ0VsZW1lbnQgfHwgX3RoaXM0LnN0YXRlLmVkaXRpbmdFbGVtZW50LnR5cGUgIT09IFwidGV4dFwiIHx8IGVsZW1lbnQuaWQgIT09IF90aGlzNC5zdGF0ZS5lZGl0aW5nRWxlbWVudC5pZDtcbiAgICB9KTtcbiAgICByZW5kZXJTY2VuZShyZW5kZXJpbmdFbGVtZW50cywgdGhpcy5zdGF0ZSwgdGhpcy5zdGF0ZS5zZWxlY3Rpb25FbGVtZW50LCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgdGhpcy5yYywgdGhpcy5jYW52YXMsIHtcbiAgICAgIHNjcm9sbFg6IHRoaXMuc3RhdGUuc2Nyb2xsWCxcbiAgICAgIHNjcm9sbFk6IHRoaXMuc3RhdGUuc2Nyb2xsWSxcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUudmlld0JhY2tncm91bmRDb2xvcixcbiAgICAgIHpvb206IHRoaXMuc3RhdGUuem9vbSxcbiAgICAgIHJlbW90ZVBvaW50ZXJWaWV3cG9ydENvb3JkczogcG9pbnRlclZpZXdwb3J0Q29vcmRzLFxuICAgICAgcmVtb3RlUG9pbnRlckJ1dHRvbjogY3Vyc29yQnV0dG9uLFxuICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczogcG9pbnRlclVzZXJuYW1lcyxcbiAgICAgIHJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzOiBwb2ludGVyVXNlclN0YXRlcyxcbiAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdGhpcy5zdGF0ZS5zaG91bGRDYWNoZUlnbm9yZVpvb20sXG4gICAgICB0aGVtZTogdGhpcy5zdGF0ZS50aGVtZSxcbiAgICAgIGltYWdlQ2FjaGU6IHRoaXMuaW1hZ2VDYWNoZSxcbiAgICAgIGlzRXhwb3J0aW5nOiBmYWxzZSxcbiAgICAgIHJlbmRlclNjcm9sbGJhcnM6ICF0aGlzLmRldmljZS5pc01vYmlsZVxuICAgIH0sIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICBsZXQge1xuICAgICAgICBhdExlYXN0T25lVmlzaWJsZUVsZW1lbnQsXG4gICAgICAgIHNjcm9sbEJhcnNcbiAgICAgIH0gPSBfcmVmO1xuXG4gICAgICBpZiAoc2Nyb2xsQmFycykge1xuICAgICAgICBjdXJyZW50U2Nyb2xsQmFycyA9IHNjcm9sbEJhcnM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjcm9sbGVkT3V0c2lkZSA9IC8vIGhpZGUgd2hlbiBlZGl0aW5nIHRleHRcbiAgICAgIGlzVGV4dEVsZW1lbnQoX3RoaXM0LnN0YXRlLmVkaXRpbmdFbGVtZW50KSA/IGZhbHNlIDogIWF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCAmJiByZW5kZXJpbmdFbGVtZW50cy5sZW5ndGggPiAwO1xuXG4gICAgICBpZiAoX3RoaXM0LnN0YXRlLnNjcm9sbGVkT3V0c2lkZSAhPT0gc2Nyb2xsZWRPdXRzaWRlKSB7XG4gICAgICAgIF90aGlzNC5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2Nyb2xsZWRPdXRzaWRlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBfdGhpczQuc2NoZWR1bGVJbWFnZVJlZnJlc2goKTtcbiAgICB9LCBUSFJPVFRMRV9ORVhUX1JFTkRFUiAmJiB3aW5kb3cuRVhDQUxJRFJBV19USFJPVFRMRV9SRU5ERVIgPT09IHRydWUpO1xuXG4gICAgaWYgKCFUSFJPVFRMRV9ORVhUX1JFTkRFUikge1xuICAgICAgVEhST1RUTEVfTkVYVF9SRU5ERVIgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuaGlzdG9yeS5yZWNvcmQodGhpcy5zdGF0ZSwgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSk7IC8vIERvIG5vdCBub3RpZnkgY29uc3VtZXJzIGlmIHdlJ3JlIHN0aWxsIGxvYWRpbmcgdGhlIHNjZW5lLiBBbW9uZyBvdGhlclxuICAgIC8vIHBvdGVudGlhbCBpc3N1ZXMsIHRoaXMgZml4ZXMgYSBjYXNlIHdoZXJlIHRoZSB0YWIgaXNuJ3QgZm9jdXNlZCBkdXJpbmdcbiAgICAvLyBpbml0LCB3aGljaCB3b3VsZCB0cmlnZ2VyIG9uQ2hhbmdlIHdpdGggZW1wdHkgZWxlbWVudHMsIHdoaWNoIHdvdWxkIHRoZW5cbiAgICAvLyBvdmVycmlkZSB3aGF0ZXZlciBpcyBpbiBsb2NhbFN0b3JhZ2UgY3VycmVudGx5LlxuXG4gICAgaWYgKCF0aGlzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZT8uKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIHRoaXMuc3RhdGUsIHRoaXMuZmlsZXMpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyByZXNldFRhcFR3aWNlKCkge1xuICAgIGRpZFRhcFR3aWNlID0gZmFsc2U7XG4gIH1cblxuICBhZGRUZXh0RnJvbVBhc3RlKHRleHQpIHtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgICAgY2xpZW50WDogY3Vyc29yWCxcbiAgICAgIGNsaWVudFk6IGN1cnNvcllcbiAgICB9LCB0aGlzLnN0YXRlKTtcbiAgICBjb25zdCBlbGVtZW50ID0gbmV3VGV4dEVsZW1lbnQoe1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIHRleHQsXG4gICAgICByYXdUZXh0OiB0ZXh0LFxuICAgICAgZm9udFNpemU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgIGZvbnRGYW1pbHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250RmFtaWx5LFxuICAgICAgdGV4dEFsaWduOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtVGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbjogREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgICAgIGxvY2tlZDogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgZWxlbWVudF0pO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgIFtlbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgfSAvLyBDb2xsYWJvcmF0aW9uXG5cblxuICBoYW5kbGVUZXh0V3lzaXd5ZyhlbGVtZW50LCBfcmVmMikge1xuICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgbGV0IHtcbiAgICAgIGlzRXhpc3RpbmdFbGVtZW50ID0gZmFsc2VcbiAgICB9ID0gX3JlZjI7XG5cbiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gZnVuY3Rpb24gKHRleHQsIG9yaWdpbmFsVGV4dCwgaXNEZWxldGVkLCByYXdUZXh0LCBsaW5rKSB7XG4gICAgICBfdGhpczUuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi5fdGhpczUuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkubWFwKGZ1bmN0aW9uIChfZWxlbWVudCkge1xuICAgICAgICBpZiAoX2VsZW1lbnQuaWQgPT09IGVsZW1lbnQuaWQgJiYgaXNUZXh0RWxlbWVudChfZWxlbWVudCkpIHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlVGV4dEVsZW1lbnQoX2VsZW1lbnQsIHtcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICBpc0RlbGV0ZWQsXG4gICAgICAgICAgICBvcmlnaW5hbFRleHQsXG4gICAgICAgICAgICByYXdUZXh0OiByYXdUZXh0ID8/IG9yaWdpbmFsVGV4dCxcbiAgICAgICAgICAgIGxpbmtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfZWxlbWVudDtcbiAgICAgIH0pXSk7XG4gICAgfTtcblxuICAgIGlmIChpc0V4aXN0aW5nRWxlbWVudCAmJiB0aGlzLnByb3BzLm9uQmVmb3JlVGV4dEVkaXQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnByb3BzLm9uQmVmb3JlVGV4dEVkaXQoZWxlbWVudCk7XG5cbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcChmdW5jdGlvbiAoX2VsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoX2VsZW1lbnQuaWQgPT09IGVsZW1lbnQuaWQgJiYgaXNUZXh0RWxlbWVudChfZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB1cGRhdGVUZXh0RWxlbWVudChfZWxlbWVudCwge1xuICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICBpc0RlbGV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICBvcmlnaW5hbFRleHQ6IHRleHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIF9lbGVtZW50O1xuICAgICAgICB9KV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRleHRXeXNpd3lnKHtcbiAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgY2FudmFzOiB0aGlzLmNhbnZhcyxcbiAgICAgIGdldFZpZXdwb3J0Q29vcmRzOiBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeDogdmlld3BvcnRYLFxuICAgICAgICAgIHk6IHZpZXdwb3J0WVxuICAgICAgICB9ID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKHtcbiAgICAgICAgICBzY2VuZVg6IHgsXG4gICAgICAgICAgc2NlbmVZOiB5XG4gICAgICAgIH0sIF90aGlzNS5zdGF0ZSk7XG4gICAgICAgIHJldHVybiBbdmlld3BvcnRYIC0gX3RoaXM1LnN0YXRlLm9mZnNldExlZnQsIHZpZXdwb3J0WSAtIF90aGlzNS5zdGF0ZS5vZmZzZXRUb3BdO1xuICAgICAgfSxcbiAgICAgIG9uQ2hhbmdlOiB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgdXBkYXRlRWxlbWVudCh0ZXh0LCB0ZXh0LCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKGlzTm9uRGVsZXRlZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIG9uU3VibWl0OiB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICB2aWFLZXlib2FyZCxcbiAgICAgICAgICBvcmlnaW5hbFRleHRcbiAgICAgICAgfSA9IF9yZWYzO1xuICAgICAgICBjb25zdCBpc0RlbGV0ZWQgPSAhdGV4dC50cmltKCk7XG4gICAgICAgIGNvbnN0IHJhd1RleHQgPSBvcmlnaW5hbFRleHQ7IC8vc2hvdWxkIHRoaXMgYmUgb3JpZ2luYWxUZXh0Pz9cblxuICAgICAgICBsZXQgbGluayA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoX3RoaXM1LnByb3BzLm9uQmVmb3JlVGV4dFN1Ym1pdCkge1xuICAgICAgICAgIGNvbnN0IFt1cGRhdGVkVGV4dCwgdXBkYXRlZE9yaWdpbmFsVGV4dCwgbF0gPSBfdGhpczUucHJvcHMub25CZWZvcmVUZXh0U3VibWl0KGVsZW1lbnQsIHRleHQsIG9yaWdpbmFsVGV4dCwgaXNEZWxldGVkKTtcblxuICAgICAgICAgIHRleHQgPSB1cGRhdGVkVGV4dCA/PyB0ZXh0O1xuICAgICAgICAgIG9yaWdpbmFsVGV4dCA9IHVwZGF0ZWRPcmlnaW5hbFRleHQgPz8gb3JpZ2luYWxUZXh0O1xuICAgICAgICAgIGxpbmsgPSBsO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlRWxlbWVudCh0ZXh0LCBvcmlnaW5hbFRleHQsIGlzRGVsZXRlZCwgcmF3VGV4dCwgbGluayk7IC8vIHNlbGVjdCB0aGUgY3JlYXRlZCB0ZXh0IGVsZW1lbnQgb25seSBpZiBzdWJtaXR0aW5nIHZpYSBrZXlib2FyZFxuICAgICAgICAvLyAod2hlbiBzdWJtaXR0aW5nIHZpYSBjbGljayBpdCBzaG91bGQgYWN0IGFzIHNpZ25hbCB0byBkZXNlbGVjdClcblxuICAgICAgICBpZiAoIWlzRGVsZXRlZCAmJiB2aWFLZXlib2FyZCkge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZFRvU2VsZWN0ID0gZWxlbWVudC5jb250YWluZXJJZCA/IGVsZW1lbnQuY29udGFpbmVySWQgOiBlbGVtZW50LmlkO1xuXG4gICAgICAgICAgX3RoaXM1LnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgICBbZWxlbWVudElkVG9TZWxlY3RdOiB0cnVlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVsZXRlZCkge1xuICAgICAgICAgIGZpeEJpbmRpbmdzQWZ0ZXJEZWxldGlvbihfdGhpczUuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIFtlbGVtZW50XSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzRGVsZXRlZCB8fCBpc0V4aXN0aW5nRWxlbWVudCkge1xuICAgICAgICAgIF90aGlzNS5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXM1LnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IG51bGxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKF90aGlzNS5zdGF0ZS5hY3RpdmVUb29sLmxvY2tlZCkge1xuICAgICAgICAgIHNldEN1cnNvckZvclNoYXBlKF90aGlzNS5jYW52YXMsIF90aGlzNS5zdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczUuZm9jdXNDb250YWluZXIoKTtcbiAgICAgIH0pLFxuICAgICAgZWxlbWVudCxcbiAgICAgIGV4Y2FsaWRyYXdDb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgYXBwOiB0aGlzXG4gICAgfSk7IC8vIGRlc2VsZWN0IGFsbCBvdGhlciBlbGVtZW50cyB3aGVuIGluc2VydGluZyB0ZXh0XG5cbiAgICB0aGlzLmRlc2VsZWN0RWxlbWVudHMoKTsgLy8gZG8gYW4gaW5pdGlhbCB1cGRhdGUgdG8gcmUtaW5pdGlhbGl6ZSBlbGVtZW50IHBvc2l0aW9uIHNpbmNlIHdlIHdlcmVcbiAgICAvLyBtb2RpZnlpbmcgZWxlbWVudCdzIHgveSBmb3Igc2FrZSBvZiBlZGl0b3IgKGNhc2U6IHN5bmNpbmcgdG8gcmVtb3RlKVxuXG4gICAgdXBkYXRlRWxlbWVudChlbGVtZW50LnRleHQsIGVsZW1lbnQub3JpZ2luYWxUZXh0LCBmYWxzZSk7XG4gIH1cblxuICBkZXNlbGVjdEVsZW1lbnRzKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICB9KTtcbiAgfVxuXG4gIGdldFRleHRFbGVtZW50QXRQb3NpdGlvbih4LCB5KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudEF0UG9zaXRpb24oeCwgeSwge1xuICAgICAgaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQ6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChlbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgIWVsZW1lbnQuaXNEZWxldGVkKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldEVsZW1lbnRBdFBvc2l0aW9uKHgsIHksIG9wdHMpIHtcbiAgICBjb25zdCBhbGxIaXRFbGVtZW50cyA9IHRoaXMuZ2V0RWxlbWVudHNBdFBvc2l0aW9uKHgsIHksIG9wdHM/LmluY2x1ZGVCb3VuZFRleHRFbGVtZW50LCBvcHRzPy5pbmNsdWRlTG9ja2VkRWxlbWVudHMpO1xuXG4gICAgaWYgKGFsbEhpdEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGlmIChvcHRzPy5wcmVmZXJTZWxlY3RlZCkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IGFsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDE7IGluZGV4ID4gLTE7IGluZGV4LS0pIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbYWxsSGl0RWxlbWVudHNbaW5kZXhdLmlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIGFsbEhpdEVsZW1lbnRzW2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4ID0gYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMV07IC8vIElmIHdlJ3JlIGhpdHRpbmcgZWxlbWVudCB3aXRoIGhpZ2hlc3Qgei1pbmRleCBvbmx5IG9uIGl0cyBib3VuZGluZyBib3hcbiAgICAgIC8vIHdoaWxlIGFsc28gaGl0dGluZyBvdGhlciBlbGVtZW50IGZpZ3VyZSwgdGhlIGxhdHRlciBzaG91bGQgYmUgY29uc2lkZXJlZC5cblxuICAgICAgcmV0dXJuIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudChlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXgsIHRoaXMuc3RhdGUsIHgsIHkpID8gYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMl0gOiBlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKGFsbEhpdEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGFsbEhpdEVsZW1lbnRzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0RWxlbWVudHNBdFBvc2l0aW9uKHgsIHkpIHtcbiAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgIGxldCBpbmNsdWRlQm91bmRUZXh0RWxlbWVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gICAgbGV0IGluY2x1ZGVMb2NrZWRFbGVtZW50cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7XG4gICAgY29uc3QgZWxlbWVudHMgPSBpbmNsdWRlQm91bmRUZXh0RWxlbWVudCAmJiBpbmNsdWRlTG9ja2VkRWxlbWVudHMgPyB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpIDogdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKS5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiAoaW5jbHVkZUxvY2tlZEVsZW1lbnRzIHx8ICFlbGVtZW50LmxvY2tlZCkgJiYgKGluY2x1ZGVCb3VuZFRleHRFbGVtZW50IHx8ICEoaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiBlbGVtZW50LmNvbnRhaW5lcklkKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGdldEVsZW1lbnRzQXRQb3NpdGlvbihlbGVtZW50cywgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBoaXRUZXN0KGVsZW1lbnQsIF90aGlzNi5zdGF0ZSwgeCwgeSk7XG4gICAgfSk7XG4gIH1cblxuICBtYXliZUNsZWFudXBBZnRlck1pc3NpbmdQb2ludGVyVXAoZXZlbnQpIHtcbiAgICBpZiAobGFzdFBvaW50ZXJVcCAhPT0gbnVsbCkge1xuICAgICAgLy8gVW5mb3J0dW5hdGVseSwgc29tZXRpbWVzIHdlIGRvbid0IGdldCBhIHBvaW50ZXJ1cCBhZnRlciBhIHBvaW50ZXJkb3duLFxuICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb250ZXh0dWFsIG1lbnUgb3IgYWxlcnQgaXMgdHJpZ2dlcmVkLiBJbiBvcmRlciB0byBhdm9pZFxuICAgICAgLy8gYmVpbmcgaW4gYSB3ZWlyZCBzdGF0ZSwgd2UgY2xlYW4gdXAgb24gdGhlIG5leHQgcG9pbnRlcmRvd25cbiAgICAgIGxhc3RQb2ludGVyVXAoZXZlbnQpO1xuICAgIH1cbiAgfSAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGV2ZW50IGlzIGEgcGFubmluZ1xuXG5cbiAgdXBkYXRlR2VzdHVyZU9uUG9pbnRlckRvd24oZXZlbnQpIHtcbiAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBldmVudC5jbGllbnRZXG4gICAgfSk7XG5cbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAyKSB7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPSBnZXRDZW50ZXIoZ2VzdHVyZS5wb2ludGVycyk7XG4gICAgICBnZXN0dXJlLmluaXRpYWxTY2FsZSA9IHRoaXMuc3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlID0gZ2V0RGlzdGFuY2UoQXJyYXkuZnJvbShnZXN0dXJlLnBvaW50ZXJzLnZhbHVlcygpKSk7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbFBvaW50ZXJEb3duU3RhdGUoZXZlbnQpIHtcbiAgICBjb25zdCBvcmlnaW4gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICByZXR1cm4ge1xuICAgICAgb3JpZ2luLFxuICAgICAgd2l0aENtZE9yQ3RybDogZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0sXG4gICAgICBvcmlnaW5JbkdyaWQ6IHR1cGxlVG9Db29ycyhnZXRHcmlkUG9pbnQob3JpZ2luLngsIG9yaWdpbi55LCB0aGlzLnN0YXRlLmdyaWRTaXplKSksXG4gICAgICBzY3JvbGxiYXJzOiBpc092ZXJTY3JvbGxCYXJzKGN1cnJlbnRTY3JvbGxCYXJzLCBldmVudC5jbGllbnRYIC0gdGhpcy5zdGF0ZS5vZmZzZXRMZWZ0LCBldmVudC5jbGllbnRZIC0gdGhpcy5zdGF0ZS5vZmZzZXRUb3ApLFxuICAgICAgLy8gd2UgbmVlZCB0byBkdXBsaWNhdGUgYmVjYXVzZSB3ZSdsbCBiZSB1cGRhdGluZyB0aGlzIHN0YXRlXG4gICAgICBsYXN0Q29vcmRzOiBfb2JqZWN0U3ByZWFkKHt9LCBvcmlnaW4pLFxuICAgICAgb3JpZ2luYWxFbGVtZW50czogdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZWxlbWVudCkge1xuICAgICAgICBhY2Muc2V0KGVsZW1lbnQuaWQsIGRlZXBDb3B5RWxlbWVudChlbGVtZW50KSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBuZXcgTWFwKCkpLFxuICAgICAgcmVzaXplOiB7XG4gICAgICAgIGhhbmRsZVR5cGU6IGZhbHNlLFxuICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgb2Zmc2V0OiB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0sXG4gICAgICAgIGFycm93RGlyZWN0aW9uOiBcIm9yaWdpblwiLFxuICAgICAgICBjZW50ZXI6IHtcbiAgICAgICAgICB4OiAobWF4WCArIG1pblgpIC8gMixcbiAgICAgICAgICB5OiAobWF4WSArIG1pblkpIC8gMlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGl0OiB7XG4gICAgICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgICAgIGFsbEhpdEVsZW1lbnRzOiBbXSxcbiAgICAgICAgd2FzQWRkZWRUb1NlbGVjdGlvbjogZmFsc2UsXG4gICAgICAgIGhhc0JlZW5EdXBsaWNhdGVkOiBmYWxzZSxcbiAgICAgICAgaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHM6IHRoaXMuaXNIaXR0aW5nQ29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMob3JpZ2luLCBzZWxlY3RlZEVsZW1lbnRzKSxcbiAgICAgICAgaGFzSGl0RWxlbWVudEluc2lkZTogZmFsc2VcbiAgICAgIH0sXG4gICAgICBkcmFnOiB7XG4gICAgICAgIGhhc09jY3VycmVkOiBmYWxzZSxcbiAgICAgICAgb2Zmc2V0OiBudWxsXG4gICAgICB9LFxuICAgICAgZXZlbnRMaXN0ZW5lcnM6IHtcbiAgICAgICAgb25Nb3ZlOiBudWxsLFxuICAgICAgICBvblVwOiBudWxsLFxuICAgICAgICBvbktleVVwOiBudWxsLFxuICAgICAgICBvbktleURvd246IG51bGxcbiAgICAgIH0sXG4gICAgICBib3hTZWxlY3Rpb246IHtcbiAgICAgICAgaGFzT2NjdXJyZWQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgZWxlbWVudElkc1RvRXJhc2U6IHt9XG4gICAgfTtcbiAgfSAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGV2ZW50IGlzIGEgZHJhZ2dpbmcgYSBzY3JvbGxiYXJcblxuXG4gIGhhbmRsZURyYWdnaW5nU2Nyb2xsQmFyKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgdmFyIF90aGlzNyA9IHRoaXM7XG5cbiAgICBpZiAoIShwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVyRWl0aGVyICYmICF0aGlzLnN0YXRlLm11bHRpRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc0RyYWdnaW5nU2Nyb2xsQmFyID0gdHJ1ZTtcbiAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IGV2ZW50LmNsaWVudFg7XG4gICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBldmVudC5jbGllbnRZO1xuICAgIGNvbnN0IG9uUG9pbnRlck1vdmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzNy5oYW5kbGVQb2ludGVyTW92ZU92ZXJTY3JvbGxiYXJzKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKTtcbiAgICB9KTtcbiAgICBjb25zdCBvblBvaW50ZXJVcCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7XG4gICAgICBpc0RyYWdnaW5nU2Nyb2xsQmFyID0gZmFsc2U7XG4gICAgICBzZXRDdXJzb3JGb3JTaGFwZShfdGhpczcuY2FudmFzLCBfdGhpczcuc3RhdGUpO1xuICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG5cbiAgICAgIF90aGlzNy5zZXRTdGF0ZSh7XG4gICAgICAgIGN1cnNvckJ1dHRvbjogXCJ1cFwiXG4gICAgICB9KTtcblxuICAgICAgX3RoaXM3LnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIFwidXBcIik7XG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgICBvblBvaW50ZXJNb3ZlLmZsdXNoKCk7XG4gICAgfSk7XG4gICAgbGFzdFBvaW50ZXJVcCA9IG9uUG9pbnRlclVwO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgb25Qb2ludGVyVXApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaXNBU2VsZWN0ZWRFbGVtZW50KGhpdEVsZW1lbnQpIHtcbiAgICByZXR1cm4gaGl0RWxlbWVudCAhPSBudWxsICYmIHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdO1xuICB9XG5cbiAgaXNIaXR0aW5nQ29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMocG9pbnQsIHNlbGVjdGVkRWxlbWVudHMpIHtcbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBIb3cgbWFueSBwaXhlbHMgb2ZmIHRoZSBzaGFwZSBib3VuZGFyeSB3ZSBzdGlsbCBjb25zaWRlciBhIGhpdFxuXG5cbiAgICBjb25zdCB0aHJlc2hvbGQgPSAxMCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZTtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgIHJldHVybiBwb2ludC54ID4geDEgLSB0aHJlc2hvbGQgJiYgcG9pbnQueCA8IHgyICsgdGhyZXNob2xkICYmIHBvaW50LnkgPiB5MSAtIHRocmVzaG9sZCAmJiBwb2ludC55IDwgeTIgKyB0aHJlc2hvbGQ7XG4gIH1cblxuICBvbktleURvd25Gcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICB2YXIgX3RoaXM4ID0gdGhpcztcblxuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBpZiAoX3RoaXM4Lm1heWJlSGFuZGxlUmVzaXplKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzOC5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBvbktleVVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKSB7XG4gICAgdmFyIF90aGlzOSA9IHRoaXM7XG5cbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgLy8gUHJldmVudHMgZm9jdXMgZnJvbSBlc2NhcGluZyBleGNhbGlkcmF3IHRhYlxuICAgICAgZXZlbnQua2V5ID09PSBLRVlTLkFMVCAmJiBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBpZiAoX3RoaXM5Lm1heWJlSGFuZGxlUmVzaXplKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzOS5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBvblBvaW50ZXJNb3ZlRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKSB7XG4gICAgdmFyIF90aGlzMTAgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHdpdGhCYXRjaGVkVXBkYXRlc1Rocm90dGxlZChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBkcmFnT2Zmc2V0WFkgb25seSBhZnRlciB3ZSd2ZSB1cGRhdGVkXG4gICAgICAvLyBgc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzYCBvbiBwb2ludGVyRG93bi4gRG9pbmcgaXQgaGVyZSBpbiBwb2ludGVyTW92ZVxuICAgICAgLy8gZXZlbnQgaGFuZGxlciBzaG91bGQgaG9wZWZ1bGx5IGVuc3VyZSB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgd2l0aFxuICAgICAgLy8gdGhlIHVwZGF0ZWQgc3RhdGUuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldCA9PT0gbnVsbCkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKGdldERyYWdPZmZzZXRYWShnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTAuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIF90aGlzMTAuc3RhdGUpLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55KSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMTAuaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCBfdGhpczEwLnN0YXRlKTtcblxuICAgICAgaWYgKGlzRXJhc2VyQWN0aXZlKF90aGlzMTAuc3RhdGUpKSB7XG4gICAgICAgIF90aGlzMTAuaGFuZGxlRXJhc2VyKGV2ZW50LCBwb2ludGVyRG93blN0YXRlLCBwb2ludGVyQ29vcmRzKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJDb29yZHMueCwgcG9pbnRlckNvb3Jkcy55LCBfdGhpczEwLnN0YXRlLmdyaWRTaXplKTsgLy8gZm9yIGFycm93cy9saW5lcywgZG9uJ3Qgc3RhcnQgZHJhZ2dpbmcgdW50aWwgYSBnaXZlbiB0aHJlc2hvbGRcbiAgICAgIC8vIHRvIGVuc3VyZSB3ZSBkb24ndCBjcmVhdGUgYSAyLXBvaW50IGFycm93IGJ5IG1pc3Rha2Ugd2hlblxuICAgICAgLy8gdXNlciBjbGlja3MgbW91c2UgaW4gYSB3YXkgdGhhdCBpdCBtb3ZlcyBhIHRpbnkgYml0ICh0aHVzXG4gICAgICAvLyB0cmlnZ2VyaW5nIHBvaW50ZXJtb3ZlKVxuXG4gICAgICBpZiAoIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJiAoX3RoaXMxMC5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwiYXJyb3dcIiB8fCBfdGhpczEwLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJsaW5lXCIpKSB7XG4gICAgICAgIGlmIChkaXN0YW5jZTJkKHBvaW50ZXJDb29yZHMueCwgcG9pbnRlckNvb3Jkcy55LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55KSA8IERSQUdHSU5HX1RIUkVTSE9MRCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaXNSZXNpemluZykge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG5cbiAgICAgICAgaWYgKF90aGlzMTAubWF5YmVIYW5kbGVSZXNpemUocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZGlkRHJhZyA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnREcmFnZ2luZyhfdGhpczEwLnN0YXRlLCBmdW5jdGlvbiAoYXBwU3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMxMC5zZXRTdGF0ZShhcHBTdGF0ZSk7XG4gICAgICAgIH0sIHBvaW50ZXJDb29yZHMueCwgcG9pbnRlckNvb3Jkcy55LCBmdW5jdGlvbiAoZWxlbWVudCwgcG9pbnRzU2NlbmVDb29yZHMpIHtcbiAgICAgICAgICBfdGhpczEwLm1heWJlU3VnZ2VzdEJpbmRpbmdzRm9yTGluZWFyRWxlbWVudEF0Q29vcmRzKGVsZW1lbnQsIHBvaW50c1NjZW5lQ29vcmRzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGRpZERyYWcpIHtcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IHBvaW50ZXJDb29yZHMueTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzSGl0QVNlbGVjdGVkRWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmFsbEhpdEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMTAuaXNBU2VsZWN0ZWRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICgoaGFzSGl0QVNlbGVjdGVkRWxlbWVudCB8fCBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cykgJiYgKCAvLyB0aGlzIGFsbG93cyBmb3IgYm94LXNlbGVjdGluZyBwb2ludHMgd2hlbiBjbGlja2luZyBpbnNpZGUgdGhlXG4gICAgICAvLyBsaW5lJ3MgYm91bmRpbmcgYm94XG4gICAgICAhX3RoaXMxMC5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fCAhZXZlbnQuc2hpZnRLZXkpICYmICggLy8gYm94LXNlbGVjdGluZyB3aXRob3V0IHNoaWZ0IHdoZW4gZWRpdGluZyBsaW5lLCBub3QgY2xpY2tpbmcgb24gYSBsaW5lXG4gICAgICAhX3RoaXMxMC5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fCBfdGhpczEwLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50Py5lbGVtZW50SWQgIT09IHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ/LmlkIHx8IHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdEVsZW1lbnRJbnNpZGUpKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTAuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIF90aGlzMTAuc3RhdGUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmV2ZXJ5KGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQubG9ja2VkO1xuICAgICAgICB9KSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBNYXJraW5nIHRoYXQgY2xpY2sgd2FzIHVzZWQgZm9yIGRyYWdnaW5nIHRvIGNoZWNrXG4gICAgICAgIC8vIGlmIGVsZW1lbnRzIHNob3VsZCBiZSBkZXNlbGVjdGVkIG9uIHBvaW50ZXJ1cFxuXG5cbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkID0gdHJ1ZTsgLy8gcHJldmVudCBkcmFnZ2luZyBldmVuIGlmIHdlJ3JlIG5vIGxvbmdlciBob2xkaW5nIGNtZC9jdHJsIG90aGVyd2lzZVxuICAgICAgICAvLyBpdCB3b3VsZCBoYXZlIHdlaXJkIHJlc3VsdHMgKHN0dWZmIGp1bXBpbmcgYWxsIG92ZXIgdGhlIHNjcmVlbilcblxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwICYmICFwb2ludGVyRG93blN0YXRlLndpdGhDbWRPckN0cmwpIHtcbiAgICAgICAgICBjb25zdCBbZHJhZ1gsIGRyYWdZXSA9IGdldEdyaWRQb2ludChwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsIHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueSwgX3RoaXMxMC5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgICAgICAgY29uc3QgW2RyYWdEaXN0YW5jZVgsIGRyYWdEaXN0YW5jZVldID0gW01hdGguYWJzKHBvaW50ZXJDb29yZHMueCAtIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngpLCBNYXRoLmFicyhwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55KV07IC8vIFdlIG9ubHkgZHJhZyBpbiBvbmUgZGlyZWN0aW9uIGlmIHNoaWZ0IGlzIHByZXNzZWRcblxuICAgICAgICAgIGNvbnN0IGxvY2tEaXJlY3Rpb24gPSBldmVudC5zaGlmdEtleTtcbiAgICAgICAgICBkcmFnU2VsZWN0ZWRFbGVtZW50cyhwb2ludGVyRG93blN0YXRlLCBzZWxlY3RlZEVsZW1lbnRzLCBkcmFnWCwgZHJhZ1ksIGxvY2tEaXJlY3Rpb24sIGRyYWdEaXN0YW5jZVgsIGRyYWdEaXN0YW5jZVksIF90aGlzMTAuc3RhdGUpO1xuXG4gICAgICAgICAgX3RoaXMxMC5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpOyAvLyBXZSBkdXBsaWNhdGUgdGhlIHNlbGVjdGVkIGVsZW1lbnQgaWYgYWx0IGlzIHByZXNzZWQgb24gcG9pbnRlciBtb3ZlXG5cblxuICAgICAgICAgIGlmIChldmVudC5hbHRLZXkgJiYgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0JlZW5EdXBsaWNhdGVkKSB7XG4gICAgICAgICAgICAvLyBNb3ZlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudHMgdG8gdGhlIHRvcCBvZiB0aGUgeiBpbmRleCBzdGFjaywgYW5kXG4gICAgICAgICAgICAvLyBwdXQgdGhlIGR1cGxpY2F0ZXMgd2hlcmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIHVzZWQgdG8gYmUuXG4gICAgICAgICAgICAvLyAodGhlIG9yaWdpbiBwb2ludCB3aGVyZSB0aGUgZHJhZ2dpbmcgc3RhcnRlZClcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0JlZW5EdXBsaWNhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRFbGVtZW50cyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNUb0FwcGVuZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBJZE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZElkVG9EdXBsaWNhdGVkSWQgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcblxuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEwLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpO1xuXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRJZHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBfdGhpczEwLnN0YXRlLCB0cnVlKS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaWQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRJZHMuaW5jbHVkZXMoZWxlbWVudC5pZCkgfHwgLy8gY2FzZTogdGhlIHN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyBtaWdodCBub3QgaGF2ZSBiZWVuXG4gICAgICAgICAgICAgIC8vIHVwZGF0ZWQgeWV0IGJ5IHRoZSB0aW1lIHRoaXMgbW91c2Vtb3ZlIGV2ZW50IGlzIGZpcmVkXG4gICAgICAgICAgICAgIGVsZW1lbnQuaWQgPT09IGhpdEVsZW1lbnQ/LmlkICYmIHBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVkRWxlbWVudCA9IGR1cGxpY2F0ZUVsZW1lbnQoX3RoaXMxMC5zdGF0ZS5lZGl0aW5nR3JvdXBJZCwgZ3JvdXBJZE1hcCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgW29yaWdpbkRyYWdYLCBvcmlnaW5EcmFnWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueSwgX3RoaXMxMC5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgICAgICAgICAgICAgbXV0YXRlRWxlbWVudChkdXBsaWNhdGVkRWxlbWVudCwge1xuICAgICAgICAgICAgICAgICAgeDogZHVwbGljYXRlZEVsZW1lbnQueCArIChvcmlnaW5EcmFnWCAtIGRyYWdYKSxcbiAgICAgICAgICAgICAgICAgIHk6IGR1cGxpY2F0ZWRFbGVtZW50LnkgKyAob3JpZ2luRHJhZ1kgLSBkcmFnWSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBuZXh0RWxlbWVudHMucHVzaChkdXBsaWNhdGVkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgZWxlbWVudHNUb0FwcGVuZC5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIG9sZElkVG9EdXBsaWNhdGVkSWQuc2V0KGVsZW1lbnQuaWQsIGR1cGxpY2F0ZWRFbGVtZW50LmlkKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXh0RWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuZXh0U2NlbmVFbGVtZW50cyA9IFsuLi5uZXh0RWxlbWVudHMsIC4uLmVsZW1lbnRzVG9BcHBlbmRdO1xuICAgICAgICAgICAgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbihuZXh0RWxlbWVudHMsIGVsZW1lbnRzVG9BcHBlbmQsIG9sZElkVG9EdXBsaWNhdGVkSWQpO1xuICAgICAgICAgICAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uKG5leHRTY2VuZUVsZW1lbnRzLCBlbGVtZW50c1RvQXBwZW5kLCBvbGRJZFRvRHVwbGljYXRlZElkLCBcImR1cGxpY2F0ZXNTZXJ2ZUFzT2xkXCIpO1xuXG4gICAgICAgICAgICBfdGhpczEwLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhuZXh0U2NlbmVFbGVtZW50cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IC8vIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRvIHJlYWQgdGhpcy5zdGF0ZSB3aXRoaW4gZWFjaCBtb3ZlIGV2ZW50LFxuICAgICAgLy8gb3RoZXJ3aXNlIHdlIHdvdWxkIHJlYWQgYSBzdGFsZSBvbmUhXG5cblxuICAgICAgY29uc3QgZHJhZ2dpbmdFbGVtZW50ID0gX3RoaXMxMC5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQ7XG5cbiAgICAgIGlmICghZHJhZ2dpbmdFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudC50eXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZHJhZ2dpbmdFbGVtZW50LnBvaW50cztcbiAgICAgICAgY29uc3QgZHggPSBwb2ludGVyQ29vcmRzLnggLSBkcmFnZ2luZ0VsZW1lbnQueDtcbiAgICAgICAgY29uc3QgZHkgPSBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueTtcbiAgICAgICAgY29uc3QgbGFzdFBvaW50ID0gcG9pbnRzLmxlbmd0aCA+IDAgJiYgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgZGlzY2FyZFBvaW50ID0gbGFzdFBvaW50ICYmIGxhc3RQb2ludFswXSA9PT0gZHggJiYgbGFzdFBvaW50WzFdID09PSBkeTtcblxuICAgICAgICBpZiAoIWRpc2NhcmRQb2ludCkge1xuICAgICAgICAgIGNvbnN0IHByZXNzdXJlcyA9IGRyYWdnaW5nRWxlbWVudC5zaW11bGF0ZVByZXNzdXJlID8gZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlcyA6IFsuLi5kcmFnZ2luZ0VsZW1lbnQucHJlc3N1cmVzLCBldmVudC5wcmVzc3VyZV07XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgICAgcHJlc3N1cmVzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNMaW5lYXJFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZHJhZ2dpbmdFbGVtZW50LnBvaW50cztcbiAgICAgICAgbGV0IGR4ID0gZ3JpZFggLSBkcmFnZ2luZ0VsZW1lbnQueDtcbiAgICAgICAgbGV0IGR5ID0gZ3JpZFkgLSBkcmFnZ2luZ0VsZW1lbnQueTtcblxuICAgICAgICBpZiAoc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUoZXZlbnQpICYmIHBvaW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAoe1xuICAgICAgICAgICAgd2lkdGg6IGR4LFxuICAgICAgICAgICAgaGVpZ2h0OiBkeVxuICAgICAgICAgIH0gPSBnZXRQZXJmZWN0RWxlbWVudFNpemUoX3RoaXMxMC5zdGF0ZS5hY3RpdmVUb29sLnR5cGUsIGR4LCBkeSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLCBbZHgsIGR5XV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChwb2ludHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMuc2xpY2UoMCwgLTEpLCBbZHgsIGR5XV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0JpbmRpbmdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwgZmFsc2UpKSB7XG4gICAgICAgICAgLy8gV2hlbiBjcmVhdGluZyBhIGxpbmVhciBlbGVtZW50IGJ5IGRyYWdnaW5nXG4gICAgICAgICAgX3RoaXMxMC5tYXliZVN1Z2dlc3RCaW5kaW5nc0ZvckxpbmVhckVsZW1lbnRBdENvb3JkcyhkcmFnZ2luZ0VsZW1lbnQsIFtwb2ludGVyQ29vcmRzXSwgX3RoaXMxMC5zdGF0ZS5zdGFydEJvdW5kRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0gcG9pbnRlckNvb3Jkcy54O1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IHBvaW50ZXJDb29yZHMueTtcblxuICAgICAgICBfdGhpczEwLm1heWJlRHJhZ05ld0dlbmVyaWNFbGVtZW50KHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMTAuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuYm94U2VsZWN0aW9uLmhhc09jY3VycmVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IF90aGlzMTAuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCk7XG5cbiAgICAgICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiAvLyBhbGxvd3MgZm9yIGJveC1zZWxlY3RpbmcgcG9pbnRzICh3aXRob3V0IHNoaWZ0KVxuICAgICAgICAhX3RoaXMxMC5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJiBpc1NvbWVFbGVtZW50U2VsZWN0ZWQoZWxlbWVudHMsIF90aGlzMTAuc3RhdGUpKSB7XG4gICAgICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUud2l0aENtZE9yQ3RybCAmJiBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50KSB7XG4gICAgICAgICAgICBfdGhpczEwLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgICAgW3BvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSwgX3RoaXMxMC5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMxMC5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIGJveC1zZWxlY3QgbGluZSBlZGl0b3IgcG9pbnRzXG5cblxuICAgICAgICBpZiAoX3RoaXMxMC5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlQm94U2VsZWN0aW9uKGV2ZW50LCBfdGhpczEwLnN0YXRlLCBfdGhpczEwLnNldFN0YXRlLmJpbmQoX3RoaXMxMCkpOyAvLyByZWd1bGFyIGJveC1zZWxlY3RcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50c1dpdGhpblNlbGVjdGlvbiA9IGdldEVsZW1lbnRzV2l0aGluU2VsZWN0aW9uKGVsZW1lbnRzLCBkcmFnZ2luZ0VsZW1lbnQpO1xuXG4gICAgICAgICAgX3RoaXMxMC5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCBlbGVtZW50c1dpdGhpblNlbGVjdGlvbi5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGFjY1tlbGVtZW50LmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgfSwge30pKSwgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA/IHtcbiAgICAgICAgICAgICAgICAvLyBpZiB1c2luZyBjdHJsL2NtZCwgc2VsZWN0IHRoZSBoaXRFbGVtZW50IG9ubHkgaWYgd2VcbiAgICAgICAgICAgICAgICAvLyBoYXZlbid0IGJveC1zZWxlY3RlZCBhbnl0aGluZyBlbHNlXG4gICAgICAgICAgICAgICAgW3BvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQuaWRdOiAhZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ubGVuZ3RoXG4gICAgICAgICAgICAgIH0gOiBudWxsKSxcbiAgICAgICAgICAgICAgc2hvd0h5cGVybGlua1BvcHVwOiBlbGVtZW50c1dpdGhpblNlbGVjdGlvbi5sZW5ndGggPT09IDEgJiYgZWxlbWVudHNXaXRoaW5TZWxlY3Rpb25bMF0ubGluayA/IFwiaW5mb1wiIDogZmFsc2VcbiAgICAgICAgICAgIH0pLCBfdGhpczEwLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9IC8vIFJldHVybnMgd2hldGhlciB0aGUgcG9pbnRlciBtb3ZlIGhhcHBlbmVkIG92ZXIgZWl0aGVyIHNjcm9sbGJhclxuXG5cbiAgaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhldmVudCwgcG9pbnRlckRvd25TdGF0ZSkge1xuICAgIGlmIChwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVySG9yaXpvbnRhbCkge1xuICAgICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjb25zdCBkeCA9IHggLSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueDtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxYOiB0aGlzLnN0YXRlLnNjcm9sbFggLSBkeCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZVxuICAgICAgfSk7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHg7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5zY3JvbGxiYXJzLmlzT3ZlclZlcnRpY2FsKSB7XG4gICAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIGNvbnN0IGR5ID0geSAtIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55O1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFk6IHRoaXMuc3RhdGUuc2Nyb2xsWSAtIGR5IC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlXG4gICAgICB9KTtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0geTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG9uUG9pbnRlclVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKSB7XG4gICAgdmFyIF90aGlzMTEgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoY2hpbGRFdmVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgIHJlc2l6aW5nRWxlbWVudCxcbiAgICAgICAgbXVsdGlFbGVtZW50LFxuICAgICAgICBhY3RpdmVUb29sLFxuICAgICAgICBpc1Jlc2l6aW5nLFxuICAgICAgICBpc1JvdGF0aW5nXG4gICAgICB9ID0gX3RoaXMxMS5zdGF0ZTtcblxuICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgIGlzUmVzaXppbmc6IGZhbHNlLFxuICAgICAgICBpc1JvdGF0aW5nOiBmYWxzZSxcbiAgICAgICAgcmVzaXppbmdFbGVtZW50OiBudWxsLFxuICAgICAgICBzZWxlY3Rpb25FbGVtZW50OiBudWxsLFxuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIixcbiAgICAgICAgLy8gdGV4dCBlbGVtZW50cyBhcmUgcmVzZXQgb24gZmluYWxpemUsIGFuZCByZXNldHRpbmcgb24gcG9pbnRlcnVwXG4gICAgICAgIC8vIG1heSBjYXVzZSBpc3N1ZXMgd2l0aCBkb3VibGUgdGFwc1xuICAgICAgICBlZGl0aW5nRWxlbWVudDogbXVsdGlFbGVtZW50IHx8IGlzVGV4dEVsZW1lbnQoX3RoaXMxMS5zdGF0ZS5lZGl0aW5nRWxlbWVudCkgPyBfdGhpczExLnN0YXRlLmVkaXRpbmdFbGVtZW50IDogbnVsbFxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzMTEuc2F2ZVBvaW50ZXIoY2hpbGRFdmVudC5jbGllbnRYLCBjaGlsZEV2ZW50LmNsaWVudFksIFwidXBcIik7IC8vIEhhbmRsZSBlbmQgb2YgZHJhZ2dpbmcgYSBwb2ludCBvZiBhIGxpbmVhciBlbGVtZW50LCBtaWdodCBjbG9zZSBhIGxvb3BcbiAgICAgIC8vIGFuZCBzZXRzIGJpbmRpbmcgZWxlbWVudFxuXG5cbiAgICAgIGlmIChfdGhpczExLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGlmICghcG9pbnRlckRvd25TdGF0ZS5ib3hTZWxlY3Rpb24uaGFzT2NjdXJyZWQgJiYgKHBvaW50ZXJEb3duU3RhdGUuaGl0Py5lbGVtZW50Py5pZCAhPT0gX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQgfHwgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdEVsZW1lbnRJbnNpZGUpKSB7XG4gICAgICAgICAgX3RoaXMxMS5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVkaXRpbmdMaW5lYXJFbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludGVyVXAoY2hpbGRFdmVudCwgX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCwgX3RoaXMxMS5zdGF0ZSk7XG5cbiAgICAgICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQgIT09IF90aGlzMTEuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudCxcbiAgICAgICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG5cbiAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZSkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZS5mbHVzaCgpO1xuICAgICAgfVxuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25Nb3ZlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25VcCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5RG93bik7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleVVwKTtcblxuICAgICAgaWYgKF90aGlzMTEuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudElkKSB7XG4gICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnRJZDogbnVsbFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudD8udHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoY2hpbGRFdmVudCwgX3RoaXMxMS5zdGF0ZSk7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGxldCBkeCA9IHBvaW50ZXJDb29yZHMueCAtIGRyYWdnaW5nRWxlbWVudC54O1xuICAgICAgICBsZXQgZHkgPSBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueTsgLy8gQWxsb3dzIGRvdHMgdG8gYXZvaWQgYmVpbmcgZmxhZ2dlZCBhcyBpbmZpbml0ZWx5IHNtYWxsXG5cbiAgICAgICAgaWYgKGR4ID09PSBwb2ludHNbMF1bMF0gJiYgZHkgPT09IHBvaW50c1swXVsxXSkge1xuICAgICAgICAgIGR5ICs9IDAuMDAwMTtcbiAgICAgICAgICBkeCArPSAwLjAwMDE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVzc3VyZXMgPSBkcmFnZ2luZ0VsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZSA/IFtdIDogWy4uLmRyYWdnaW5nRWxlbWVudC5wcmVzc3VyZXMsIGNoaWxkRXZlbnQucHJlc3N1cmVdO1xuICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgIHByZXNzdXJlcyxcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IFtkeCwgZHldXG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMTEuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0ltYWdlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IGRyYWdnaW5nRWxlbWVudDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIF90aGlzMTEuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuXG4gICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgW2ltYWdlRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpczExLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG5cbiAgICAgICAgICBfdGhpczExLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhfdGhpczExLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBlbC5pZCAhPT0gaW1hZ2VFbGVtZW50LmlkO1xuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIF90aGlzMTEuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQucG9pbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBfdGhpczExLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGNoaWxkRXZlbnQsIF90aGlzMTEuc3RhdGUpO1xuXG4gICAgICAgIGlmICghcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmIGRyYWdnaW5nRWxlbWVudCAmJiAhbXVsdGlFbGVtZW50KSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLmRyYWdnaW5nRWxlbWVudC5wb2ludHMsIFtwb2ludGVyQ29vcmRzLnggLSBkcmFnZ2luZ0VsZW1lbnQueCwgcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50LnldXVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBtdWx0aUVsZW1lbnQ6IGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiBfdGhpczExLnN0YXRlLmRyYWdnaW5nRWxlbWVudFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJiAhbXVsdGlFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKGlzQmluZGluZ0VuYWJsZWQoX3RoaXMxMS5zdGF0ZSkgJiYgaXNCaW5kaW5nRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIGZhbHNlKSkge1xuICAgICAgICAgICAgbWF5YmVCaW5kTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIF90aGlzMTEuc3RhdGUsIF90aGlzMTEuc2NlbmUsIHBvaW50ZXJDb29yZHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgICAgICAgc3RhcnRCb3VuZEVsZW1lbnQ6IG51bGxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghYWN0aXZlVG9vbC5sb2NrZWQpIHtcbiAgICAgICAgICAgIHJlc2V0Q3Vyc29yKF90aGlzMTEuY2FudmFzKTtcblxuICAgICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIGFjdGl2ZVRvb2w6IHVwZGF0ZUFjdGl2ZVRvb2woX3RoaXMxMS5zdGF0ZSwge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgICAgIFtkcmFnZ2luZ0VsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpczExLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgICAgICAgW2RyYWdnaW5nRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aXZlVG9vbC50eXBlICE9PSBcInNlbGVjdGlvblwiICYmIGRyYWdnaW5nRWxlbWVudCAmJiBpc0ludmlzaWJseVNtYWxsRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIC8vIHJlbW92ZSBpbnZpc2libGUgZWxlbWVudCB3aGljaCB3YXMgYWRkZWQgaW4gb25Qb2ludGVyRG93blxuICAgICAgICBfdGhpczExLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhfdGhpczExLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLnNsaWNlKDAsIC0xKSk7XG5cbiAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwgZ2V0Tm9ybWFsaXplZERpbWVuc2lvbnMoZHJhZ2dpbmdFbGVtZW50KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNpemluZ0VsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMxMS5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzaXppbmdFbGVtZW50ICYmIGlzSW52aXNpYmx5U21hbGxFbGVtZW50KHJlc2l6aW5nRWxlbWVudCkpIHtcbiAgICAgICAgX3RoaXMxMS5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoX3RoaXMxMS5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgcmV0dXJuIGVsLmlkICE9PSByZXNpemluZ0VsZW1lbnQuaWQ7XG4gICAgICAgIH0pKTtcbiAgICAgIH0gLy8gQ29kZSBiZWxvdyBoYW5kbGVzIHNlbGVjdGlvbiB3aGVuIGVsZW1lbnQocykgd2VyZW4ndFxuICAgICAgLy8gZHJhZyBvciBhZGRlZCB0byBzZWxlY3Rpb24gb24gcG9pbnRlciBkb3duIHBoYXNlLlxuXG5cbiAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuXG4gICAgICBpZiAoaXNFcmFzZXJBY3RpdmUoX3RoaXMxMS5zdGF0ZSkpIHtcbiAgICAgICAgY29uc3QgZHJhZ2dlZERpc3RhbmNlID0gZGlzdGFuY2UyZChfdGhpczExLmxhc3RQb2ludGVyRG93bi5jbGllbnRYLCBfdGhpczExLmxhc3RQb2ludGVyRG93bi5jbGllbnRZLCBfdGhpczExLmxhc3RQb2ludGVyVXAuY2xpZW50WCwgX3RoaXMxMS5sYXN0UG9pbnRlclVwLmNsaWVudFkpO1xuXG4gICAgICAgIGlmIChkcmFnZ2VkRGlzdGFuY2UgPT09IDApIHtcbiAgICAgICAgICBjb25zdCBzY2VuZVBvaW50ZXIgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgICAgICAgICAgY2xpZW50WDogX3RoaXMxMS5sYXN0UG9pbnRlclVwLmNsaWVudFgsXG4gICAgICAgICAgICBjbGllbnRZOiBfdGhpczExLmxhc3RQb2ludGVyVXAuY2xpZW50WVxuICAgICAgICAgIH0sIF90aGlzMTEuc3RhdGUpO1xuXG4gICAgICAgICAgY29uc3QgaGl0RWxlbWVudHMgPSBfdGhpczExLmdldEVsZW1lbnRzQXRQb3NpdGlvbihzY2VuZVBvaW50ZXIueCwgc2NlbmVQb2ludGVyLnkpO1xuXG4gICAgICAgICAgaGl0RWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoaGl0RWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbaGl0RWxlbWVudC5pZF0gPSB7XG4gICAgICAgICAgICAgIGVyYXNlOiB0cnVlLFxuICAgICAgICAgICAgICBvcGFjaXR5OiBoaXRFbGVtZW50Lm9wYWNpdHlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczExLmVyYXNlRWxlbWVudHMocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChPYmplY3Qua2V5cyhwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlKS5sZW5ndGgpIHtcbiAgICAgICAgX3RoaXMxMS5yZXN0b3JlUmVhZHlUb0VyYXNlRWxlbWVudHMocG9pbnRlckRvd25TdGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoaXRFbGVtZW50ICYmICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiYgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb24gJiYgKCAvLyBpZiB3ZSdyZSBlZGl0aW5nIGEgbGluZSwgcG9pbnRlcnVwIHNob3VsZG4ndCBzd2l0Y2ggc2VsZWN0aW9uIGlmXG4gICAgICAvLyBib3ggc2VsZWN0ZWRcbiAgICAgICFfdGhpczExLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8ICFwb2ludGVyRG93blN0YXRlLmJveFNlbGVjdGlvbi5oYXNPY2N1cnJlZCkpIHtcbiAgICAgICAgLy8gd2hlbiBpbnNpZGUgbGluZSBlZGl0b3IsIHNoaWZ0IHNlbGVjdHMgcG9pbnRzIGluc3RlYWRcbiAgICAgICAgaWYgKGNoaWxkRXZlbnQuc2hpZnRLZXkgJiYgIV90aGlzMTEuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoX3RoaXMxMS5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkVmlhR3JvdXAoX3RoaXMxMS5zdGF0ZSwgaGl0RWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1bnNlbGVjdCBhbGwgZ3JvdXBzIGhpdEVsZW1lbnQgaXMgcGFydCBvZlxuICAgICAgICAgICAgICAvLyBhcyB3ZWxsIGFzIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBncm91cHNcbiAgICAgICAgICAgICAgLy8gaGl0RWxlbWVudCBpcyBwYXJ0IG9mXG4gICAgICAgICAgICAgIGNvbnN0IGlkc09mU2VsZWN0ZWRFbGVtZW50c1RoYXRBcmVJbkdyb3VwcyA9IGhpdEVsZW1lbnQuZ3JvdXBJZHMuZmxhdE1hcChmdW5jdGlvbiAoZ3JvdXBJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRFbGVtZW50c0luR3JvdXAoX3RoaXMxMS5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgZ3JvdXBJZCk7XG4gICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBbZWxlbWVudC5pZF06IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uIChwcmV2SWQsIGFjYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZJZCksIGFjYyk7XG4gICAgICAgICAgICAgIH0sIHt9KTtcblxuICAgICAgICAgICAgICBfdGhpczExLnNldFN0YXRlKGZ1bmN0aW9uIChfcHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCBoaXRFbGVtZW50Lmdyb3VwSWRzLm1hcChmdW5jdGlvbiAoZ0lkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgW2dJZF06IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGFjYykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2KSwgYWNjKTtcbiAgICAgICAgICAgICAgICAgIH0sIHt9KSksXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCBpZHNPZlNlbGVjdGVkRWxlbWVudHNUaGF0QXJlSW5Hcm91cHMpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyByZW1vdmUgZWxlbWVudCBmcm9tIHNlbGVjdGlvbiB3aGlsZVxuICAgICAgICAgICAgICAvLyBrZWVwaW5nIHByZXYgZWxlbWVudHMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgICAgICAgICBbaGl0RWxlbWVudC5pZF06IGZhbHNlXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pLCBfdGhpczExLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFkZCBlbGVtZW50IHRvIHNlbGVjdGlvbiB3aGlsZVxuICAgICAgICAgICAgLy8ga2VlcGluZyBwcmV2IGVsZW1lbnRzIHNlbGVjdGVkXG4gICAgICAgICAgICBfdGhpczExLnNldFN0YXRlKGZ1bmN0aW9uIChfcHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF9wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSwgX3RoaXMxMS5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJiAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmICFfdGhpczExLnN0YXRlLmlzUmVzaXppbmcgJiYgKGhpdEVsZW1lbnQgJiYgaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50KGhpdEVsZW1lbnQsIF90aGlzMTEuc3RhdGUsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpIHx8ICFoaXRFbGVtZW50ICYmIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKSkge1xuICAgICAgICAvLyBEZXNlbGVjdCBzZWxlY3RlZCBlbGVtZW50c1xuICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhY3RpdmVUb29sLmxvY2tlZCAmJiBhY3RpdmVUb29sLnR5cGUgIT09IFwiZnJlZWRyYXdcIiAmJiBkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgW2RyYWdnaW5nRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3RpdmVUb29sLnR5cGUgIT09IFwic2VsZWN0aW9uXCIgfHwgaXNTb21lRWxlbWVudFNlbGVjdGVkKF90aGlzMTEuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIF90aGlzMTEuc3RhdGUpKSB7XG4gICAgICAgIF90aGlzMTEuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCB8fCBpc1Jlc2l6aW5nIHx8IGlzUm90YXRpbmcpIHtcbiAgICAgICAgKGlzQmluZGluZ0VuYWJsZWQoX3RoaXMxMS5zdGF0ZSkgPyBiaW5kT3JVbmJpbmRTZWxlY3RlZEVsZW1lbnRzIDogdW5iaW5kTGluZWFyRWxlbWVudHMpKGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMS5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgX3RoaXMxMS5zdGF0ZSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFjdGl2ZVRvb2wubG9ja2VkICYmIGFjdGl2ZVRvb2wudHlwZSAhPT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKF90aGlzMTEuY2FudmFzKTtcblxuICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgICAgIGFjdGl2ZVRvb2w6IHVwZGF0ZUFjdGl2ZVRvb2woX3RoaXMxMS5zdGF0ZSwge1xuICAgICAgICAgICAgdHlwZTogXCJzZWxlY3Rpb25cIlxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cykge1xuICAgIGNvbnN0IHN1Z2dlc3RlZEJpbmRpbmdzID0gZ2V0RWxpZ2libGVFbGVtZW50c0ZvckJpbmRpbmcoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nc1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudCkge1xuICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIC8vIENvbnRpbnVlIGVkaXRpbmcgdGhlIHNhbWUgZ3JvdXAgaWYgdGhlIHVzZXIgc2VsZWN0ZWQgYSBkaWZmZXJlbnRcbiAgICAgICAgLy8gZWxlbWVudCBmcm9tIGl0XG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBwcmV2U3RhdGUuZWRpdGluZ0dyb3VwSWQgJiYgaGl0RWxlbWVudCAhPSBudWxsICYmIGlzRWxlbWVudEluR3JvdXAoaGl0RWxlbWVudCwgcHJldlN0YXRlLmVkaXRpbmdHcm91cElkKSA/IHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZCA6IG51bGxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzXG4gICAgfSk7XG4gIH1cblxuICBnZXRUZXh0V3lzaXd5Z1NuYXBwZWRUb0NlbnRlclBvc2l0aW9uKHgsIHksIGFwcFN0YXRlLCBjYW52YXMsIHNjYWxlKSB7XG4gICAgY29uc3QgZWxlbWVudENsaWNrZWRJbnNpZGUgPSBnZXRUZXh0QmluZGFibGVDb250YWluZXJBdFBvc2l0aW9uKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gIWlzVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gICAgfSksIHgsIHkpO1xuXG4gICAgaWYgKGVsZW1lbnRDbGlja2VkSW5zaWRlKSB7XG4gICAgICBjb25zdCBlbGVtZW50Q2VudGVyWCA9IGVsZW1lbnRDbGlja2VkSW5zaWRlLnggKyBlbGVtZW50Q2xpY2tlZEluc2lkZS53aWR0aCAvIDI7XG4gICAgICBjb25zdCBlbGVtZW50Q2VudGVyWSA9IGVsZW1lbnRDbGlja2VkSW5zaWRlLnkgKyBlbGVtZW50Q2xpY2tlZEluc2lkZS5oZWlnaHQgLyAyO1xuICAgICAgY29uc3QgZGlzdGFuY2VUb0NlbnRlciA9IE1hdGguaHlwb3QoeCAtIGVsZW1lbnRDZW50ZXJYLCB5IC0gZWxlbWVudENlbnRlclkpO1xuICAgICAgY29uc3QgaXNTbmFwcGVkVG9DZW50ZXIgPSBkaXN0YW5jZVRvQ2VudGVyIDwgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQ7XG5cbiAgICAgIGlmIChpc1NuYXBwZWRUb0NlbnRlcikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeDogdmlld3BvcnRYLFxuICAgICAgICAgIHk6IHZpZXdwb3J0WVxuICAgICAgICB9ID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKHtcbiAgICAgICAgICBzY2VuZVg6IGVsZW1lbnRDZW50ZXJYLFxuICAgICAgICAgIHNjZW5lWTogZWxlbWVudENlbnRlcllcbiAgICAgICAgfSwgYXBwU3RhdGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZpZXdwb3J0WCxcbiAgICAgICAgICB2aWV3cG9ydFksXG4gICAgICAgICAgZWxlbWVudENlbnRlclgsXG4gICAgICAgICAgZWxlbWVudENlbnRlcllcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRDYW52YXNPZmZzZXRzKCkge1xuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGV4Y2FsaWRyYXdDb250YWluZXIgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGVmdCxcbiAgICAgICAgdG9wXG4gICAgICB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldExlZnQ6IGxlZnQsXG4gICAgICAgIG9mZnNldFRvcDogdG9wXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvZmZzZXRMZWZ0OiAwLFxuICAgICAgb2Zmc2V0VG9wOiAwXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZUxhbmd1YWdlKCkge1xuICAgIHZhciBfdGhpczEyID0gdGhpcztcblxuICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgY3VycmVudExhbmcgPSBsYW5ndWFnZXMuZmluZChmdW5jdGlvbiAobGFuZykge1xuICAgICAgICByZXR1cm4gbGFuZy5jb2RlID09PSBfdGhpczEyLnByb3BzLmxhbmdDb2RlO1xuICAgICAgfSkgfHwgZGVmYXVsdExhbmc7XG4gICAgICB5aWVsZCBzZXRMYW5ndWFnZShjdXJyZW50TGFuZyk7XG5cbiAgICAgIF90aGlzMTIuc2V0QXBwU3RhdGUoe30pO1xuICAgIH0pKCk7XG4gIH1cblxufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVEVTVCBIT09LU1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG5BcHAuZGVmYXVsdFByb3BzID0ge1xuICAvLyBuZWVkZWQgZm9yIHRlc3RzIHRvIHBhc3Mgc2luY2Ugd2UgZGlyZWN0bHkgcmVuZGVyIEFwcCBpbiBtYW55IHRlc3RzXG4gIFVJT3B0aW9uczogREVGQVVMVF9VSV9PUFRJT05TXG59O1xuXG52YXIgX2luaXRpYWxpc2VQcm9wcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF90aGlzMTMgPSB0aGlzO1xuXG4gIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgdGhpcy5yYyA9IG51bGw7XG4gIHRoaXMudW5tb3VudGVkID0gZmFsc2U7XG4gIHRoaXMuZGV2aWNlID0gZGV2aWNlQ29udGV4dEluaXRpYWxWYWx1ZTtcbiAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpO1xuICB0aGlzLmZpbGVzID0ge307XG4gIHRoaXMuaW1hZ2VDYWNoZSA9IG5ldyBNYXAoKTtcbiAgdGhpcy5sYXN0UG9pbnRlckRvd24gPSBudWxsO1xuICB0aGlzLmxhc3RQb2ludGVyVXAgPSBudWxsO1xuICB0aGlzLmNvbnRleHRNZW51T3BlbiA9IGZhbHNlO1xuICB0aGlzLmxhc3RTY2VuZVBvaW50ZXIgPSBudWxsO1xuICB0aGlzLmFsbG93TW9iaWxlTW9kZSA9IHRydWU7XG5cbiAgdGhpcy5mb2N1c0NvbnRhaW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoX3RoaXMxMy5wcm9wcy5hdXRvRm9jdXMpIHtcbiAgICAgIF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLmdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpO1xuICB9O1xuXG4gIHRoaXMuZ2V0U2NlbmVFbGVtZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcbiAgfTtcblxuICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGFjdGlvblJlc3VsdCkge1xuICAgIC8vIFNpbmNlIGNvbnRleHQgbWVudSBjbG9zZXMgd2hlbiBhY3Rpb24gdHJpZ2dlcmVkIHNvIHNldHRpbmcgdG8gZmFsc2VcbiAgICBfdGhpczEzLmNvbnRleHRNZW51T3BlbiA9IGZhbHNlO1xuXG4gICAgaWYgKF90aGlzMTMudW5tb3VudGVkIHx8IGFjdGlvblJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZWRpdGluZ0VsZW1lbnQgPSBudWxsO1xuXG4gICAgaWYgKGFjdGlvblJlc3VsdC5lbGVtZW50cykge1xuICAgICAgYWN0aW9uUmVzdWx0LmVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKF90aGlzMTMuc3RhdGUuZWRpdGluZ0VsZW1lbnQ/LmlkID09PSBlbGVtZW50LmlkICYmIF90aGlzMTMuc3RhdGUuZWRpdGluZ0VsZW1lbnQgIT09IGVsZW1lbnQgJiYgaXNOb25EZWxldGVkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgIGVkaXRpbmdFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGFjdGlvblJlc3VsdC5lbGVtZW50cyk7XG5cbiAgICAgIGlmIChhY3Rpb25SZXN1bHQuY29tbWl0VG9IaXN0b3J5KSB7XG4gICAgICAgIF90aGlzMTMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uUmVzdWx0LmZpbGVzKSB7XG4gICAgICBfdGhpczEzLmZpbGVzID0gYWN0aW9uUmVzdWx0LnJlcGxhY2VGaWxlcyA/IGFjdGlvblJlc3VsdC5maWxlcyA6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMxMy5maWxlcyksIGFjdGlvblJlc3VsdC5maWxlcyk7XG5cbiAgICAgIF90aGlzMTMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvblJlc3VsdC5hcHBTdGF0ZSB8fCBlZGl0aW5nRWxlbWVudCkge1xuICAgICAgaWYgKGFjdGlvblJlc3VsdC5jb21taXRUb0hpc3RvcnkpIHtcbiAgICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuXG4gICAgICBsZXQgdmlld01vZGVFbmFibGVkID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8udmlld01vZGVFbmFibGVkIHx8IGZhbHNlO1xuICAgICAgbGV0IHplbk1vZGVFbmFibGVkID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8uemVuTW9kZUVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICBsZXQgZ3JpZFNpemUgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy5ncmlkU2l6ZSB8fCBudWxsO1xuICAgICAgbGV0IHRoZW1lID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8udGhlbWUgfHwgVEhFTUUuTElHSFQ7XG4gICAgICBsZXQgbmFtZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/Lm5hbWUgPz8gX3RoaXMxMy5zdGF0ZS5uYW1lO1xuXG4gICAgICBpZiAodHlwZW9mIF90aGlzMTMucHJvcHMudmlld01vZGVFbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHZpZXdNb2RlRW5hYmxlZCA9IF90aGlzMTMucHJvcHMudmlld01vZGVFbmFibGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIF90aGlzMTMucHJvcHMuemVuTW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgemVuTW9kZUVuYWJsZWQgPSBfdGhpczEzLnByb3BzLnplbk1vZGVFbmFibGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIF90aGlzMTMucHJvcHMuZ3JpZE1vZGVFbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGdyaWRTaXplID0gX3RoaXMxMy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPyBHUklEX1NJWkUgOiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIF90aGlzMTMucHJvcHMudGhlbWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhlbWUgPSBfdGhpczEzLnByb3BzLnRoZW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIF90aGlzMTMucHJvcHMubmFtZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBuYW1lID0gX3RoaXMxMy5wcm9wcy5uYW1lO1xuICAgICAgfVxuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICAvLyB1c2luZyBPYmplY3QuYXNzaWduIGluc3RlYWQgb2Ygc3ByZWFkIHRvIGZvb2wgVFMgNC4yLjIrIGludG9cbiAgICAgICAgLy8gcmVnYXJkaW5nIHRoZSByZXN1bHRpbmcgdHlwZSBhcyBub3QgY29udGFpbmluZyB1bmRlZmluZWRcbiAgICAgICAgLy8gKHdoaWNoIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiB3aWxsIG5ldmVyIGNvbnRhaW4pXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjdGlvblJlc3VsdC5hcHBTdGF0ZSB8fCB7fSwge1xuICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiBlZGl0aW5nRWxlbWVudCB8fCBhY3Rpb25SZXN1bHQuYXBwU3RhdGU/LmVkaXRpbmdFbGVtZW50IHx8IG51bGwsXG4gICAgICAgICAgdmlld01vZGVFbmFibGVkLFxuICAgICAgICAgIHplbk1vZGVFbmFibGVkLFxuICAgICAgICAgIGdyaWRTaXplLFxuICAgICAgICAgIHRoZW1lLFxuICAgICAgICAgIG5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChhY3Rpb25SZXN1bHQuc3luY0hpc3RvcnkpIHtcbiAgICAgICAgICBfdGhpczEzLmhpc3Rvcnkuc2V0Q3VycmVudFN0YXRlKF90aGlzMTMuc3RhdGUsIF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICB0aGlzLm9uQmx1ciA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7XG4gICAgaXNIb2xkaW5nU3BhY2UgPSBmYWxzZTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgaXNCaW5kaW5nRW5hYmxlZDogdHJ1ZVxuICAgIH0pO1xuICB9KTtcblxuICB0aGlzLm9uVW5sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMub25CbHVyKCk7XG4gIH07XG5cbiAgdGhpcy5kaXNhYmxlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9O1xuXG4gIHRoaXMub25Gb250TG9hZGVkID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIF90aGlzMTMub25TY2VuZVVwZGF0ZWQoKTtcbiAgfTtcblxuICB0aGlzLnJlc2V0SGlzdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLmhpc3RvcnkuY2xlYXIoKTtcbiAgfTtcblxuICB0aGlzLnJlc2V0U2NlbmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKG9wdHMpIHtcbiAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXSk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0RGVmYXVsdEFwcFN0YXRlKCkpLCB7fSwge1xuICAgICAgICBpc0xvYWRpbmc6IG9wdHM/LnJlc2V0TG9hZGluZ1N0YXRlID8gZmFsc2UgOiBzdGF0ZS5pc0xvYWRpbmcsXG4gICAgICAgIHRoZW1lOiBfdGhpczEzLnN0YXRlLnRoZW1lXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIF90aGlzMTMucmVzZXRIaXN0b3J5KCk7XG4gIH0pO1xuICB0aGlzLmluaXRpYWxpemVTY2VuZSA9IC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgIGlmIChcImxhdW5jaFF1ZXVlXCIgaW4gd2luZG93ICYmIFwiTGF1bmNoUGFyYW1zXCIgaW4gd2luZG93KSB7XG4gICAgICB3aW5kb3cubGF1bmNoUXVldWUuc2V0Q29uc3VtZXIoIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfcmVmNSA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAobGF1bmNoUGFyYW1zKSB7XG4gICAgICAgICAgaWYgKCFsYXVuY2hQYXJhbXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZmlsZUhhbmRsZSA9IGxhdW5jaFBhcmFtcy5maWxlc1swXTtcbiAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgZmlsZUhhbmRsZS5nZXRGaWxlKCk7XG5cbiAgICAgICAgICBfdGhpczEzLmxvYWRGaWxlVG9DYW52YXMobmV3IEZpbGUoW2Jsb2JdLCBibG9iLm5hbWUgfHwgXCJcIiwge1xuICAgICAgICAgICAgdHlwZTogYmxvYi50eXBlXG4gICAgICAgICAgfSksIGZpbGVIYW5kbGUpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF94KSB7XG4gICAgICAgICAgcmV0dXJuIF9yZWY1LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KCkpO1xuICAgIH1cblxuICAgIGlmICghX3RoaXMxMy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCBpbml0aWFsRGF0YSA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgaW5pdGlhbERhdGEgPSAoeWllbGQgX3RoaXMxMy5wcm9wcy5pbml0aWFsRGF0YSkgfHwgbnVsbDtcblxuICAgICAgaWYgKGluaXRpYWxEYXRhPy5saWJyYXJ5SXRlbXMpIHtcbiAgICAgICAgX3RoaXMxMy5saWJyYXJ5LnVwZGF0ZUxpYnJhcnkoe1xuICAgICAgICAgIGxpYnJhcnlJdGVtczogaW5pdGlhbERhdGEubGlicmFyeUl0ZW1zLFxuICAgICAgICAgIG1lcmdlOiB0cnVlXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICBpbml0aWFsRGF0YSA9IHtcbiAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgXCJFbmNvdW50ZXJlZCBhbiBlcnJvciBkdXJpbmcgaW1wb3J0aW5nIG9yIHJlc3RvcmluZyBzY2VuZSBkYXRhXCJcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2VuZSA9IHJlc3RvcmUoaW5pdGlhbERhdGEsIG51bGwsIG51bGwpO1xuICAgIHNjZW5lLmFwcFN0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzY2VuZS5hcHBTdGF0ZSksIHt9LCB7XG4gICAgICAvLyB3ZSdyZSBmYWxsaW5nIGJhY2sgdG8gY3VycmVudCAocHJlLWluaXQpIHN0YXRlIHdoZW4gZGVjaWRpbmdcbiAgICAgIC8vIHdoZXRoZXIgdG8gb3BlbiB0aGUgbGlicmFyeSwgdG8gaGFuZGxlIGEgY2FzZSB3aGVyZSB3ZVxuICAgICAgLy8gdXBkYXRlIHRoZSBzdGF0ZSBvdXRzaWRlIG9mIGluaXRpYWxEYXRhIChlLmcuIHdoZW4gbG9hZGluZyB0aGUgYXBwXG4gICAgICAvLyB3aXRoIGEgbGlicmFyeSBpbnN0YWxsIGxpbmssIHdoaWNoIHNob3VsZCBhdXRvLW9wZW4gdGhlIGxpYnJhcnkpXG4gICAgICBpc0xpYnJhcnlPcGVuOiBpbml0aWFsRGF0YT8uYXBwU3RhdGU/LmlzTGlicmFyeU9wZW4gfHwgX3RoaXMxMy5zdGF0ZS5pc0xpYnJhcnlPcGVuLFxuICAgICAgYWN0aXZlVG9vbDogc2NlbmUuYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImltYWdlXCIgPyBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lLmFwcFN0YXRlLmFjdGl2ZVRvb2wpLCB7fSwge1xuICAgICAgICB0eXBlOiBcInNlbGVjdGlvblwiXG4gICAgICB9KSA6IHNjZW5lLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgdG9hc3Q6IF90aGlzMTMuc3RhdGUudG9hc3RcbiAgICB9KTtcblxuICAgIGlmIChpbml0aWFsRGF0YT8uc2Nyb2xsVG9Db250ZW50KSB7XG4gICAgICBzY2VuZS5hcHBTdGF0ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUpLCBjYWxjdWxhdGVTY3JvbGxDZW50ZXIoc2NlbmUuZWxlbWVudHMsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUpLCB7fSwge1xuICAgICAgICB3aWR0aDogX3RoaXMxMy5zdGF0ZS53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBfdGhpczEzLnN0YXRlLmhlaWdodCxcbiAgICAgICAgb2Zmc2V0VG9wOiBfdGhpczEzLnN0YXRlLm9mZnNldFRvcCxcbiAgICAgICAgb2Zmc2V0TGVmdDogX3RoaXMxMy5zdGF0ZS5vZmZzZXRMZWZ0XG4gICAgICB9KSwgbnVsbCkpO1xuICAgIH1cblxuICAgIF90aGlzMTMucmVzZXRIaXN0b3J5KCk7XG5cbiAgICBfdGhpczEzLnN5bmNBY3Rpb25SZXN1bHQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzY2VuZSksIHt9LCB7XG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWVcbiAgICB9KSk7XG4gIH0pO1xuXG4gIHRoaXMucmVmcmVzaERldmljZVN0YXRlID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzaWRlYmFyQnJlYWtwb2ludCA9IF90aGlzMTMucHJvcHMuVUlPcHRpb25zLmRvY2tlZFNpZGViYXJCcmVha3BvaW50ICE9IG51bGwgPyBfdGhpczEzLnByb3BzLlVJT3B0aW9ucy5kb2NrZWRTaWRlYmFyQnJlYWtwb2ludCA6IE1RX1JJR0hUX1NJREVCQVJfTUlOX1dJRFRIO1xuICAgIF90aGlzMTMuZGV2aWNlID0gdXBkYXRlT2JqZWN0KF90aGlzMTMuZGV2aWNlLCB7XG4gICAgICBpc1NtU2NyZWVuOiB3aWR0aCA8IE1RX1NNX01BWF9XSURUSCxcbiAgICAgIGlzTW9iaWxlOiBfdGhpczEzLmFsbG93TW9iaWxlTW9kZSAmJiAoIC8venN2aWN6aWFuXG4gICAgICB3aWR0aCA8IE1RX01BWF9XSURUSF9QT1JUUkFJVCB8fCBoZWlnaHQgPCBNUV9NQVhfSEVJR0hUX0xBTkRTQ0FQRSAmJiB3aWR0aCA8IE1RX01BWF9XSURUSF9MQU5EU0NBUEUpLFxuICAgICAgY2FuRGV2aWNlRml0U2lkZWJhcjogd2lkdGggPiBzaWRlYmFyQnJlYWtwb2ludFxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMub25SZXNpemUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHt9KTtcbiAgfSk7XG4gIHRoaXMub25TY3JvbGwgPSBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgb2Zmc2V0VG9wLFxuICAgICAgb2Zmc2V0TGVmdFxuICAgIH0gPSBfdGhpczEzLmdldENhbnZhc09mZnNldHMoKTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICBpZiAoc3RhdGUub2Zmc2V0TGVmdCA9PT0gb2Zmc2V0TGVmdCAmJiBzdGF0ZS5vZmZzZXRUb3AgPT09IG9mZnNldFRvcCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2Zmc2V0VG9wLFxuICAgICAgICBvZmZzZXRMZWZ0XG4gICAgICB9O1xuICAgIH0pO1xuICB9LCBTQ1JPTExfVElNRU9VVCk7XG4gIHRoaXMub25DdXQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgaWYgKCFpc0V4Y2FsaWRyYXdBY3RpdmUgfHwgaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF90aGlzMTMuY3V0QWxsKCk7XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9KTtcbiAgdGhpcy5vbkNvcHkgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgaWYgKCFpc0V4Y2FsaWRyYXdBY3RpdmUgfHwgaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF90aGlzMTMuY29weUFsbCgpO1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSk7XG5cbiAgdGhpcy5jdXRBbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uQ3V0LCBcImtleWJvYXJkXCIpO1xuICB9O1xuXG4gIHRoaXMuY29weUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25Db3B5LCBcImtleWJvYXJkXCIpO1xuICB9O1xuXG4gIHRoaXMub25UYXBTdGFydCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGZpeCBmb3IgQXBwbGUgUGVuY2lsIFNjcmliYmxlXG4gICAgLy8gT24gQW5kcm9pZCwgcHJldmVudGluZyB0aGUgZXZlbnQgd291bGQgZGlzYWJsZSBjb250ZXh0TWVudSBvbiB0YXAtaG9sZFxuICAgIGlmICghaXNBbmRyb2lkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmICghZGlkVGFwVHdpY2UpIHtcbiAgICAgIGRpZFRhcFR3aWNlID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0YXBwZWRUd2ljZVRpbWVyKTtcbiAgICAgIHRhcHBlZFR3aWNlVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dChBcHAucmVzZXRUYXBUd2ljZSwgVEFQX1RXSUNFX1RJTUVPVVQpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gaW5zZXJ0IHRleHQgb25seSBpZiB3ZSB0YXBwZWQgdHdpY2Ugd2l0aCBhIHNpbmdsZSBmaW5nZXJcbiAgICAvLyBldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMSB3aWxsIGFsc28gcHJldmVudCBpbnNlcnRpbmcgdGV4dCB3aGVuIHVzZXIncyB6b29taW5nXG5cblxuICAgIGlmIChkaWRUYXBUd2ljZSAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgW3RvdWNoXSA9IGV2ZW50LnRvdWNoZXM7IC8vIEB0cy1pZ25vcmVcblxuICAgICAgX3RoaXMxMy5oYW5kbGVDYW52YXNEb3VibGVDbGljayh7XG4gICAgICAgIGNsaWVudFg6IHRvdWNoLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFlcbiAgICAgIH0pO1xuXG4gICAgICBkaWRUYXBUd2ljZSA9IGZhbHNlO1xuICAgICAgY2xlYXJUaW1lb3V0KHRhcHBlZFR3aWNlVGltZXIpO1xuICAgIH1cblxuICAgIGlmIChpc0FuZHJvaWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMub25UYXBFbmQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBfdGhpczEzLnJlc2V0Q29udGV4dE1lbnVUaW1lcigpO1xuXG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfdGhpczEzLnN0YXRlLnByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VzdHVyZS5wb2ludGVycy5jbGVhcigpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZCA9IHdpdGhCYXRjaGVkVXBkYXRlcyggLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGV2ZW50KSB7XG4gICAgICAvLyAjNjg2XG4gICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKHRhcmdldCk7XG5cbiAgICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudFVuZGVyQ3Vyc29yID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChjdXJzb3JYLCBjdXJzb3JZKTtcblxuICAgICAgaWYgKCAvLyBpZiBubyBDbGlwYm9hcmRFdmVudCBzdXBwbGllZCwgYXNzdW1lIHdlJ3JlIHBhc3RpbmcgdmlhIGNvbnRleHRNZW51XG4gICAgICAvLyB0aHVzIHRoZXNlIGNoZWNrcyBkb24ndCBtYWtlIHNlbnNlXG4gICAgICBldmVudCAmJiAoIShlbGVtZW50VW5kZXJDdXJzb3IgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkgfHwgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgc2FtZSBmcmFtZSAodGh1cyBiZWZvcmUgYW55IGF3YWl0cykgYXMgdGhlIHBhc3RlXG4gICAgICAvLyBldmVudCBlbHNlIHNvbWUgYnJvd3NlcnMgKEZGLi4uKSB3aWxsIGNsZWFyIHRoZSBjbGlwYm9hcmREYXRhXG4gICAgICAvLyAoc29tZXRoaW5nIHNvbWV0aGluZyBzZWN1cml0eSlcblxuXG4gICAgICBsZXQgZmlsZSA9IGV2ZW50Py5jbGlwYm9hcmREYXRhPy5maWxlc1swXTtcbiAgICAgIGNvbnN0IGRhdGEgPSB5aWVsZCBwYXJzZUNsaXBib2FyZChldmVudCk7XG5cbiAgICAgIGlmICghZmlsZSAmJiBkYXRhLnRleHQpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nID0gZGF0YS50ZXh0LnRyaW0oKTtcblxuICAgICAgICBpZiAoc3RyaW5nLnN0YXJ0c1dpdGgoXCI8c3ZnXCIpICYmIHN0cmluZy5lbmRzV2l0aChcIjwvc3ZnPlwiKSkge1xuICAgICAgICAgIC8vIGlnbm9yZSBTVkcgdmFsaWRhdGlvbi9ub3JtYWxpemF0aW9uIHdoaWNoIHdpbGwgYmUgZG9uZSBkdXJpbmcgaW1hZ2VcbiAgICAgICAgICAvLyBpbml0aWFsaXphdGlvblxuICAgICAgICAgIGZpbGUgPSBTVkdTdHJpbmdUb0ZpbGUoc3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBwcmVmZXIgc3ByZWFkc2hlZXQgZGF0YSBvdmVyIGltYWdlIGZpbGUgKE1TIE9mZmljZS9MaWJyZSBPZmZpY2UpXG5cblxuICAgICAgaWYgKGlzU3VwcG9ydGVkSW1hZ2VGaWxlKGZpbGUpICYmICFkYXRhLnNwcmVhZHNoZWV0KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB4OiBzY2VuZVgsXG4gICAgICAgICAgeTogc2NlbmVZXG4gICAgICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgICAgICAgIGNsaWVudFg6IGN1cnNvclgsXG4gICAgICAgICAgY2xpZW50WTogY3Vyc29yWVxuICAgICAgICB9LCBfdGhpczEzLnN0YXRlKTtcblxuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBfdGhpczEzLmNyZWF0ZUltYWdlRWxlbWVudCh7XG4gICAgICAgICAgc2NlbmVYLFxuICAgICAgICAgIHNjZW5lWVxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczEzLmluc2VydEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQsIGZpbGUpO1xuXG4gICAgICAgIF90aGlzMTMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgW2ltYWdlRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMTMucHJvcHMub25QYXN0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICgoeWllbGQgX3RoaXMxMy5wcm9wcy5vblBhc3RlKGRhdGEsIGV2ZW50KSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLmVycm9yTWVzc2FnZSkge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGRhdGEuZXJyb3JNZXNzYWdlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnNwcmVhZHNoZWV0KSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHBhc3RlRGlhbG9nOiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLnNwcmVhZHNoZWV0LFxuICAgICAgICAgICAgc2hvd246IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmVsZW1lbnRzKSB7XG4gICAgICAgIF90aGlzMTMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgIGVsZW1lbnRzOiBkYXRhLmVsZW1lbnRzLFxuICAgICAgICAgIGZpbGVzOiBkYXRhLmZpbGVzIHx8IG51bGwsXG4gICAgICAgICAgcG9zaXRpb246IFwiY3Vyc29yXCJcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEudGV4dCkge1xuICAgICAgICBfdGhpczEzLmFkZFRleHRGcm9tUGFzdGUoZGF0YS50ZXh0KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZXRBY3RpdmVUb29sKHtcbiAgICAgICAgdHlwZTogXCJzZWxlY3Rpb25cIlxuICAgICAgfSk7XG5cbiAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDIpIHtcbiAgICAgIHJldHVybiBfcmVmNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKSk7XG5cbiAgdGhpcy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSByZXN0b3JlRWxlbWVudHMob3B0cy5lbGVtZW50cywgbnVsbCk7XG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgICBjb25zdCBlbGVtZW50c0NlbnRlclggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSAvIDI7XG4gICAgY29uc3QgZWxlbWVudHNDZW50ZXJZID0gZGlzdGFuY2UobWluWSwgbWF4WSkgLyAyO1xuICAgIGNvbnN0IGNsaWVudFggPSB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIiA/IG9wdHMucG9zaXRpb24uY2xpZW50WCA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCIgPyBjdXJzb3JYIDogX3RoaXMxMy5zdGF0ZS53aWR0aCAvIDIgKyBfdGhpczEzLnN0YXRlLm9mZnNldExlZnQ7XG4gICAgY29uc3QgY2xpZW50WSA9IHR5cGVvZiBvcHRzLnBvc2l0aW9uID09PSBcIm9iamVjdFwiID8gb3B0cy5wb3NpdGlvbi5jbGllbnRZIDogb3B0cy5wb3NpdGlvbiA9PT0gXCJjdXJzb3JcIiA/IGN1cnNvclkgOiBfdGhpczEzLnN0YXRlLmhlaWdodCAvIDIgKyBfdGhpczEzLnN0YXRlLm9mZnNldFRvcDtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgICAgY2xpZW50WCxcbiAgICAgIGNsaWVudFlcbiAgICB9LCBfdGhpczEzLnN0YXRlKTtcbiAgICBjb25zdCBkeCA9IHggLSBlbGVtZW50c0NlbnRlclg7XG4gICAgY29uc3QgZHkgPSB5IC0gZWxlbWVudHNDZW50ZXJZO1xuICAgIGNvbnN0IGdyb3VwSWRNYXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoZHgsIGR5LCBfdGhpczEzLnN0YXRlLmdyaWRTaXplKTtcbiAgICBjb25zdCBvbGRJZFRvRHVwbGljYXRlZElkID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZWxlbWVudHMubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICBjb25zdCBuZXdFbGVtZW50ID0gZHVwbGljYXRlRWxlbWVudChfdGhpczEzLnN0YXRlLmVkaXRpbmdHcm91cElkLCBncm91cElkTWFwLCBlbGVtZW50LCB7XG4gICAgICAgIHg6IGVsZW1lbnQueCArIGdyaWRYIC0gbWluWCxcbiAgICAgICAgeTogZWxlbWVudC55ICsgZ3JpZFkgLSBtaW5ZXG4gICAgICB9KTtcbiAgICAgIG9sZElkVG9EdXBsaWNhdGVkSWQuc2V0KGVsZW1lbnQuaWQsIG5ld0VsZW1lbnQuaWQpO1xuICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gICAgfSk7XG4gICAgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbihuZXdFbGVtZW50cywgZWxlbWVudHMsIG9sZElkVG9EdXBsaWNhdGVkSWQpO1xuICAgIGNvbnN0IG5leHRFbGVtZW50cyA9IFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCAuLi5uZXdFbGVtZW50c107XG4gICAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uKG5leHRFbGVtZW50cywgZWxlbWVudHMsIG9sZElkVG9EdXBsaWNhdGVkSWQpO1xuXG4gICAgaWYgKG9wdHMuZmlsZXMpIHtcbiAgICAgIF90aGlzMTMuZmlsZXMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzMTMuZmlsZXMpLCBvcHRzLmZpbGVzKTtcbiAgICB9XG5cbiAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhuZXh0RWxlbWVudHMpO1xuXG4gICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICBpc0xpYnJhcnlPcGVuOiBfdGhpczEzLnN0YXRlLmlzTGlicmFyeU9wZW4gJiYgX3RoaXMxMy5kZXZpY2UuY2FuRGV2aWNlRml0U2lkZWJhciA/IF90aGlzMTMuc3RhdGUuaXNMaWJyYXJ5TWVudURvY2tlZCA6IGZhbHNlLFxuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBuZXdFbGVtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZWxlbWVudCkge1xuICAgICAgICBpZiAoIWlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgICAgICAgIGFjY1tlbGVtZW50LmlkXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30pLFxuICAgICAgc2VsZWN0ZWRHcm91cElkczoge31cbiAgICB9KSwgX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSksIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvcHRzLmZpbGVzKSB7XG4gICAgICAgIF90aGlzMTMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnNldEFjdGl2ZVRvb2woe1xuICAgICAgdHlwZTogXCJzZWxlY3Rpb25cIlxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuc2V0QXBwU3RhdGUgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgX3RoaXMxMy5zZXRTdGF0ZShvYmopO1xuICB9O1xuXG4gIHRoaXMucmVtb3ZlUG9pbnRlciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICh0b3VjaFRpbWVvdXQpIHtcbiAgICAgIF90aGlzMTMucmVzZXRDb250ZXh0TWVudVRpbWVyKCk7XG4gICAgfVxuXG4gICAgZ2VzdHVyZS5wb2ludGVycy5kZWxldGUoZXZlbnQucG9pbnRlcklkKTtcbiAgfTtcblxuICB0aGlzLnRvZ2dsZUxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHNvdXJjZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogXCJ1aVwiO1xuXG4gICAgaWYgKCFfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wubG9ja2VkKSB7XG4gICAgICB0cmFja0V2ZW50KFwidG9vbGJhclwiLCBcInRvZ2dsZUxvY2tcIiwgYCR7c291cmNlfSAoJHtfdGhpczEzLmRldmljZS5pc01vYmlsZSA/IFwibW9iaWxlXCIgOiBcImRlc2t0b3BcIn0pYCk7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3RpdmVUb29sOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLmFjdGl2ZVRvb2wpLCB1cGRhdGVBY3RpdmVUb29sKF90aGlzMTMuc3RhdGUsIHByZXZTdGF0ZS5hY3RpdmVUb29sLmxvY2tlZCA/IHtcbiAgICAgICAgICB0eXBlOiBcInNlbGVjdGlvblwiXG4gICAgICAgIH0gOiBwcmV2U3RhdGUuYWN0aXZlVG9vbCkpLCB7fSwge1xuICAgICAgICAgIGxvY2tlZDogIXByZXZTdGF0ZS5hY3RpdmVUb29sLmxvY2tlZFxuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLnRvZ2dsZVBlbk1vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwZW5Nb2RlOiAhcHJldlN0YXRlLnBlbk1vZGVcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5zY3JvbGxUb0NvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHRhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoX29iamVjdFNwcmVhZCh7fSwgY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldCA6IFt0YXJnZXRdLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLmNhbnZhcykpKTtcbiAgfTtcblxuICB0aGlzLnpvb21Ub0ZpdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgdGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBfdGhpczEzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpO1xuICAgIGxldCBtYXhab29tID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAxO1xuICAgIGxldCBtYXJnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDAuMDM7XG5cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGFyZ2V0ID0gX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgbWF4Wm9vbSA9IDE7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh6b29tVG9GaXRFbGVtZW50cyh0YXJnZXQsIF90aGlzMTMuc3RhdGUsIGZhbHNlLCBtYXhab29tLCBtYXJnaW4pLmFwcFN0YXRlKTtcbiAgfTtcblxuICB0aGlzLnVwZGF0ZUNvbnRhaW5lclNpemUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGNvbnRhaW5lcnMpIHtcbiAgICBjb250YWluZXJzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICBjb25zdCBbeCwgeV0gPSByb3RhdGUoZWwueCArIGVsLndpZHRoLCBlbC55ICsgZWwuaGVpZ2h0LCBlbC54ICsgZWwud2lkdGggLyAyLCBlbC55ICsgZWwuaGVpZ2h0IC8gMiwgZWwuYW5nbGUpO1xuICAgICAgcmVzaXplU2luZ2xlRWxlbWVudChuZXcgTWFwKCkuc2V0KGVsLmlkLCBlbCksIHRydWUsIGVsLCBcInNlXCIsIHRydWUsIHgsIHkpO1xuICAgIH0pO1xuICB9KTtcblxuICB0aGlzLnJlc3RvcmUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHJldHVybiByZXN0b3JlKGRhdGEsIG51bGwsIG51bGwpO1xuICB9O1xuXG4gIHRoaXMuc2V0VG9hc3QgPSBmdW5jdGlvbiAodG9hc3QpIHtcbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIHRvYXN0XG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5yZXN0b3JlRmlsZUZyb21TaGFyZSA9IC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3ZWJTaGFyZVRhcmdldENhY2hlID0geWllbGQgY2FjaGVzLm9wZW4oXCJ3ZWItc2hhcmUtdGFyZ2V0XCIpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCB3ZWJTaGFyZVRhcmdldENhY2hlLm1hdGNoKFwic2hhcmVkLWZpbGVcIik7XG5cbiAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICBjb25zdCBibG9iID0geWllbGQgcmVzcG9uc2UuYmxvYigpO1xuICAgICAgICBjb25zdCBmaWxlID0gbmV3IEZpbGUoW2Jsb2JdLCBibG9iLm5hbWUgfHwgXCJcIiwge1xuICAgICAgICAgIHR5cGU6IGJsb2IudHlwZVxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczEzLmxvYWRGaWxlVG9DYW52YXMoZmlsZSwgbnVsbCk7XG5cbiAgICAgICAgeWllbGQgd2ViU2hhcmVUYXJnZXRDYWNoZS5kZWxldGUoXCJzaGFyZWQtZmlsZVwiKTtcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIEFQUF9OQU1FLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICB0aGlzLmFkZEZpbGVzID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChmaWxlcykge1xuICAgIGNvbnN0IGZpbGVzTWFwID0gZmlsZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGZpbGVEYXRhKSB7XG4gICAgICBhY2Muc2V0KGZpbGVEYXRhLmlkLCBmaWxlRGF0YSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIG5ldyBNYXAoKSk7XG4gICAgX3RoaXMxMy5maWxlcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMxMy5maWxlcyksIE9iamVjdC5mcm9tRW50cmllcyhmaWxlc01hcCkpO1xuXG4gICAgX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICBpZiAoaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChlbGVtZW50KSAmJiBmaWxlc01hcC5oYXMoZWxlbWVudC5maWxlSWQpKSB7XG4gICAgICAgIF90aGlzMTMuaW1hZ2VDYWNoZS5kZWxldGUoZWxlbWVudC5maWxlSWQpO1xuXG4gICAgICAgIGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnNjZW5lLmluZm9ybU11dGF0aW9uKCk7XG5cbiAgICBfdGhpczEzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICB9KTtcblxuICB0aGlzLnNldE1vYmlsZU1vZGVBbGxvd2VkID0gZnVuY3Rpb24gKGFsbG93KSB7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBfdGhpczEzLmFsbG93TW9iaWxlTW9kZSA9IGFsbG93O1xuXG4gICAgaWYgKGFsbG93KSB7XG4gICAgICBfdGhpczEzLmRldmljZSA9IHVwZGF0ZU9iamVjdChfdGhpczEzLmRldmljZSwge1xuICAgICAgICBpc01vYmlsZTogd2lkdGggPCBNUV9NQVhfV0lEVEhfUE9SVFJBSVQgfHwgaGVpZ2h0IDwgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUgJiYgd2lkdGggPCBNUV9NQVhfV0lEVEhfTEFORFNDQVBFXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMxMy5kZXZpY2UgPSB1cGRhdGVPYmplY3QoX3RoaXMxMy5kZXZpY2UsIHtcbiAgICAgICAgaXNNb2JpbGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBfdGhpczEzLmZvcmNlVXBkYXRlKCk7XG4gIH07XG5cbiAgdGhpcy5zZXRMb2NhbEZvbnQgPSBmdW5jdGlvbiAoc2hvd09uUGFuZWwpIHtcbiAgICBzaG93Rm91cnRoRm9udCA9IHNob3dPblBhbmVsO1xuICB9O1xuXG4gIHRoaXMuc2VsZWN0RWxlbWVudHMgPSBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgICBfdGhpczEzLnVwZGF0ZVNjZW5lKHtcbiAgICAgIGFwcFN0YXRlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzMTMuc3RhdGUpLCB7fSwge1xuICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBlbGVtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKG1hcCwgZWxlbWVudCkge1xuICAgICAgICAgIG1hcFtlbGVtZW50LmlkXSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgfSwge30pXG4gICAgICB9KSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZVxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuYnJpbmdUb0Zyb250ID0gZnVuY3Rpb24gKGVsZW1lbnRzKSB7XG4gICAgX3RoaXMxMy5zZWxlY3RFbGVtZW50cyhlbGVtZW50cyk7XG5cbiAgICBfdGhpczEzLnVwZGF0ZVNjZW5lKGFjdGlvbkJyaW5nVG9Gcm9udC5wZXJmb3JtKF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpKTtcbiAgfTtcblxuICB0aGlzLmJyaW5nRm9yd2FyZCA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICAgIF90aGlzMTMuc2VsZWN0RWxlbWVudHMoZWxlbWVudHMpO1xuXG4gICAgX3RoaXMxMy51cGRhdGVTY2VuZShhY3Rpb25CcmluZ0ZvcndhcmQucGVyZm9ybShfdGhpczEzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlKSk7XG4gIH07XG5cbiAgdGhpcy5zZW5kVG9CYWNrID0gZnVuY3Rpb24gKGVsZW1lbnRzKSB7XG4gICAgX3RoaXMxMy5zZWxlY3RFbGVtZW50cyhlbGVtZW50cyk7XG5cbiAgICBfdGhpczEzLnVwZGF0ZVNjZW5lKGFjdGlvblNlbmRUb0JhY2sucGVyZm9ybShfdGhpczEzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlKSk7XG4gIH07XG5cbiAgdGhpcy5zZW5kQmFja3dhcmQgPSBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgICBfdGhpczEzLnNlbGVjdEVsZW1lbnRzKGVsZW1lbnRzKTtcblxuICAgIF90aGlzMTMudXBkYXRlU2NlbmUoYWN0aW9uU2VuZEJhY2t3YXJkLnBlcmZvcm0oX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSkpO1xuICB9O1xuXG4gIHRoaXMudXBkYXRlU2NlbmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKHNjZW5lRGF0YSkge1xuICAgIGlmIChzY2VuZURhdGEuY29tbWl0VG9IaXN0b3J5KSB7XG4gICAgICBfdGhpczEzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKHNjZW5lRGF0YS5hcHBTdGF0ZSkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShzY2VuZURhdGEuYXBwU3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzY2VuZURhdGEuZWxlbWVudHMpIHtcbiAgICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKHNjZW5lRGF0YS5lbGVtZW50cyk7XG4gICAgfVxuXG4gICAgaWYgKHNjZW5lRGF0YS5jb2xsYWJvcmF0b3JzKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgY29sbGFib3JhdG9yczogc2NlbmVEYXRhLmNvbGxhYm9yYXRvcnNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5vblNjZW5lVXBkYXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLnNldFN0YXRlKHt9KTtcbiAgfTtcblxuICB0aGlzLnVwZGF0ZUN1cnJlbnRDdXJzb3JQb3NpdGlvbiA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBjdXJzb3JYID0gZXZlbnQuY2xpZW50WDtcbiAgICBjdXJzb3JZID0gZXZlbnQuY2xpZW50WTtcbiAgfSk7XG4gIHRoaXMub25LZXlEb3duID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIG5vcm1hbGl6ZSBgZXZlbnQua2V5YCB3aGVuIENhcHNMb2NrIGlzIHByZXNzZWQgIzIzNzJcbiAgICBpZiAoXCJQcm94eVwiIGluIHdpbmRvdyAmJiAoIWV2ZW50LnNoaWZ0S2V5ICYmIC9eW0EtWl0kLy50ZXN0KGV2ZW50LmtleSkgfHwgZXZlbnQuc2hpZnRLZXkgJiYgL15bYS16XSQvLnRlc3QoZXZlbnQua2V5KSkpIHtcbiAgICAgIGV2ZW50ID0gbmV3IFByb3h5KGV2ZW50LCB7XG4gICAgICAgIGdldChldiwgcHJvcCkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZXZbcHJvcF07XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIC8vIGZpeCBmb3IgUHJveGllcyBoaWphY2tpbmcgYHRoaXNgXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuYmluZChldik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHByb3AgPT09IFwia2V5XCIgPyAvLyBDYXBzTG9jayBpbnZlcnRzIGNhcGl0YWxpemF0aW9uIGJhc2VkIG9uIFNoaWZ0S2V5LCBzbyBpbnZlcnRcbiAgICAgICAgICAvLyBpdCBiYWNrXG4gICAgICAgICAgZXZlbnQuc2hpZnRLZXkgPyBldi5rZXkudG9VcHBlckNhc2UoKSA6IGV2LmtleS50b0xvd2VyQ2FzZSgpIDogdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgfSk7XG4gICAgfSAvLyBwcmV2ZW50IGJyb3dzZXIgem9vbSBpbiBpbnB1dCBmaWVsZHNcblxuXG4gICAgaWYgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmIGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIGlmIChldmVudC5jb2RlID09PSBDT0RFUy5NSU5VUyB8fCBldmVudC5jb2RlID09PSBDT0RFUy5FUVVBTCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSAvLyBiYWlsIGlmXG5cblxuICAgIGlmICggLy8gaW5zaWRlIGFuIGlucHV0XG4gICAgaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KSAmJiAvLyB1bmxlc3MgcHJlc3NpbmcgZXNjYXBlIChmaW5hbGl6ZSBhY3Rpb24pXG4gICAgZXZlbnQua2V5ICE9PSBLRVlTLkVTQ0FQRSB8fCAvLyBvciB1bmxlc3MgdXNpbmcgYXJyb3dzICh0byBtb3ZlIGJldHdlZW4gYnV0dG9ucylcbiAgICBpc0Fycm93S2V5KGV2ZW50LmtleSkgJiYgaXNJbnB1dExpa2UoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuUVVFU1RJT05fTUFSSykge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHNob3dIZWxwRGlhbG9nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmhhbmRsZUtleURvd24oZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKF90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmIF90aGlzMTMuc3RhdGUuaXNCaW5kaW5nRW5hYmxlZCkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzQmluZGluZ0VuYWJsZWQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gQ09ERVMuWkVSTykge1xuICAgICAgY29uc3QgbmV4dFN0YXRlID0gIV90aGlzMTMuc3RhdGUuaXNMaWJyYXJ5T3BlbjtcblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTGlicmFyeU9wZW46IG5leHRTdGF0ZVxuICAgICAgfSk7IC8vIHRyYWNrIG9ubHkgb3BlbmluZ3NcblxuXG4gICAgICBpZiAobmV4dFN0YXRlKSB7XG4gICAgICAgIHRyYWNrRXZlbnQoXCJsaWJyYXJ5XCIsIFwidG9nZ2xlTGlicmFyeSAob3BlbilcIiwgYGtleWJvYXJkICgke190aGlzMTMuZGV2aWNlLmlzTW9iaWxlID8gXCJtb2JpbGVcIiA6IFwiZGVza3RvcFwifSlgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNBcnJvd0tleShldmVudC5rZXkpKSB7XG4gICAgICBjb25zdCBzdGVwID0gX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSAmJiAoZXZlbnQuc2hpZnRLZXkgPyBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlQgOiBfdGhpczEzLnN0YXRlLmdyaWRTaXplKSB8fCAoZXZlbnQuc2hpZnRLZXkgPyBFTEVNRU5UX1NISUZUX1RSQU5TTEFURV9BTU9VTlQgOiBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlQpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSwgdHJ1ZSk7XG4gICAgICBsZXQgb2Zmc2V0WCA9IDA7XG4gICAgICBsZXQgb2Zmc2V0WSA9IDA7XG5cbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfTEVGVCkge1xuICAgICAgICBvZmZzZXRYID0gLXN0ZXA7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5BUlJPV19SSUdIVCkge1xuICAgICAgICBvZmZzZXRYID0gc3RlcDtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX1VQKSB7XG4gICAgICAgIG9mZnNldFkgPSAtc3RlcDtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX0RPV04pIHtcbiAgICAgICAgb2Zmc2V0WSA9IHN0ZXA7XG4gICAgICB9XG5cbiAgICAgIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICB4OiBlbGVtZW50LnggKyBvZmZzZXRYLFxuICAgICAgICAgIHk6IGVsZW1lbnQueSArIG9mZnNldFlcbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCwge1xuICAgICAgICAgIHNpbXVsdGFuZW91c2x5VXBkYXRlZDogc2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgaWYgKGlzTGluZWFyRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgICAgIGlmICghX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fCBfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCAhPT0gc2VsZWN0ZWRFbGVtZW50c1swXS5pZCkge1xuICAgICAgICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuXG4gICAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQ6IG5ldyBMaW5lYXJFbGVtZW50RWRpdG9yKHNlbGVjdGVkRWxlbWVudHNbMF0sIF90aGlzMTMuc2NlbmUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcblxuICAgICAgICAgIF90aGlzMTMuc3RhcnRUZXh0RWRpdGluZyh7XG4gICAgICAgICAgICBzY2VuZVg6IHNlbGVjdGVkRWxlbWVudC54ICsgc2VsZWN0ZWRFbGVtZW50LndpZHRoIC8gMixcbiAgICAgICAgICAgIHNjZW5lWTogc2VsZWN0ZWRFbGVtZW50LnkgKyBzZWxlY3RlZEVsZW1lbnQuaGVpZ2h0IC8gMixcbiAgICAgICAgICAgIHNob3VsZEJpbmQ6IHRydWVcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5tZXRhS2V5ICYmIF90aGlzMTMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICBjb25zdCBzaGFwZSA9IGZpbmRTaGFwZUJ5S2V5KGV2ZW50LmtleSk7XG5cbiAgICAgIGlmIChzaGFwZSkge1xuICAgICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgIT09IHNoYXBlKSB7XG4gICAgICAgICAgdHJhY2tFdmVudChcInRvb2xiYXJcIiwgc2hhcGUsIGBrZXlib2FyZCAoJHtfdGhpczEzLmRldmljZS5pc01vYmlsZSA/IFwibW9iaWxlXCIgOiBcImRlc2t0b3BcIn0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczEzLnNldEFjdGl2ZVRvb2woe1xuICAgICAgICAgIHR5cGU6IHNoYXBlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuUSkge1xuICAgICAgICBfdGhpczEzLnRvZ2dsZUxvY2soXCJrZXlib2FyZFwiKTtcblxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlNQQUNFICYmIGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgaXNIb2xkaW5nU3BhY2UgPSB0cnVlO1xuICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5HUkFCQklORyk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmICgoZXZlbnQua2V5ID09PSBLRVlTLkcgfHwgZXZlbnQua2V5ID09PSBLRVlTLlMpICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlKTtcblxuICAgICAgaWYgKF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInNlbGVjdGlvblwiICYmICFzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuRyAmJiAoaGFzQmFja2dyb3VuZChfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSkgfHwgc2VsZWN0ZWRFbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBoYXNCYWNrZ3JvdW5kKGVsZW1lbnQudHlwZSk7XG4gICAgICB9KSkpIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgb3BlblBvcHVwOiBcImJhY2tncm91bmRDb2xvclBpY2tlclwiXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlMpIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgb3BlblBvcHVwOiBcInN0cm9rZUNvbG9yUGlja2VyXCJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy5vbldoZWVsID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIHByZXZlbnQgYnJvd3NlciBwaW5jaCB6b29tIG9uIERPTSBlbGVtZW50c1xuICAgIGlmICghKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSAmJiBldmVudC5jdHJsS2V5KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSk7XG4gIHRoaXMub25LZXlVcCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlNQQUNFKSB7XG4gICAgICBpZiAoX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5HUkFCKTtcbiAgICAgIH0gZWxzZSBpZiAoX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXMxMy5jYW52YXMsIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlzSG9sZGluZ1NwYWNlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJiAhX3RoaXMxMy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgaXNCaW5kaW5nRW5hYmxlZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyb3dLZXkoZXZlbnQua2V5KSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgICBpc0JpbmRpbmdFbmFibGVkKF90aGlzMTMuc3RhdGUpID8gYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cyhzZWxlY3RlZEVsZW1lbnRzKSA6IHVuYmluZExpbmVhckVsZW1lbnRzKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMuc2V0QWN0aXZlVG9vbCA9IGZ1bmN0aW9uICh0b29sKSB7XG4gICAgY29uc3QgbmV4dEFjdGl2ZVRvb2wgPSB1cGRhdGVBY3RpdmVUb29sKF90aGlzMTMuc3RhdGUsIHRvb2wpO1xuXG4gICAgaWYgKCFpc0hvbGRpbmdTcGFjZSkge1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXMxMy5jYW52YXMsIF90aGlzMTMuc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChpc1Rvb2xJY29uKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICBfdGhpczEzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0xpbmVhckVsZW1lbnRUeXBlKG5leHRBY3RpdmVUb29sLnR5cGUpKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobmV4dEFjdGl2ZVRvb2wudHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICBfdGhpczEzLm9uSW1hZ2VBY3Rpb24oKTtcbiAgICB9XG5cbiAgICBpZiAobmV4dEFjdGl2ZVRvb2wudHlwZSAhPT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGFjdGl2ZVRvb2w6IG5leHRBY3RpdmVUb29sLFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgYWN0aXZlVG9vbDogbmV4dEFjdGl2ZVRvb2xcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnNldEN1cnNvciA9IGZ1bmN0aW9uIChjdXJzb3IpIHtcbiAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIGN1cnNvcik7XG4gIH07XG5cbiAgdGhpcy5yZXNldEN1cnNvciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXNldEN1cnNvcihfdGhpczEzLmNhbnZhcyk7XG4gIH07XG5cbiAgdGhpcy5pc1RvdWNoU2NyZWVuTXVsdGlUb3VjaEdlc3R1cmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBkZXNlbGVjdCB3aGVuIHVzaW5nIHRyYWNrcGFkLCBhbmQgbXVsdGktcG9pbnQgZ2VzdHVyZXNcbiAgICAvLyBvbmx5IHdvcmsgb24gdG91Y2ggc2NyZWVucywgc28gY2hlY2tpbmcgZm9yID49IHBvaW50ZXJzIG1lYW5zIHdlJ3JlIG9uIGFcbiAgICAvLyB0b3VjaHNjcmVlblxuICAgIHJldHVybiBnZXN0dXJlLnBvaW50ZXJzLnNpemUgPj0gMjtcbiAgfTtcblxuICB0aGlzLm9uR2VzdHVyZVN0YXJ0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIHdlIG9ubHkgd2FudCB0byBkZXNlbGVjdCBvbiB0b3VjaCBzY3JlZW5zIGJlY2F1c2UgdXNlciBtYXkgaGF2ZSBzZWxlY3RlZFxuICAgIC8vIGVsZW1lbnRzIGJ5IG1pc3Rha2Ugd2hpbGUgem9vbWluZ1xuXG4gICAgaWYgKF90aGlzMTMuaXNUb3VjaFNjcmVlbk11bHRpVG91Y2hHZXN0dXJlKCkpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXN0dXJlLmluaXRpYWxTY2FsZSA9IF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZTtcbiAgfSk7XG4gIHRoaXMub25HZXN0dXJlQ2hhbmdlID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIG9uR2VzdHVyZUNoYW5nZSBvbmx5IGhhcyB6b29tIGZhY3RvciBidXQgbm90IHRoZSBjZW50ZXIuXG4gICAgLy8gSWYgd2UncmUgb24gaVBhZCBvciBpUGhvbmUsIHRoZW4gd2UgcmVjb2duaXplIG11bHRpLXRvdWNoIGFuZCB3aWxsXG4gICAgLy8gem9vbSBpbiBhdCB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlIHRvdWNobW92ZSBoYW5kbGVyXG4gICAgLy8gKGhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlKS5cbiAgICAvL1xuICAgIC8vIE9uIE1hY2Jvb2sgdHJhY2twYWQsIHdlIGRvbid0IGhhdmUgdGhvc2UgZXZlbnRzIHNvIHdpbGwgem9vbSBpbiBhdCB0aGVcbiAgICAvLyBjdXJyZW50IGxvY2F0aW9uIGluc3RlYWQuXG4gICAgLy9cbiAgICAvLyBBcyBzdWNoLCBiYWlsIGZyb20gdGhpcyBoYW5kbGVyIG9uIHRvdWNoIGRldmljZXMuXG5cbiAgICBpZiAoX3RoaXMxMy5pc1RvdWNoU2NyZWVuTXVsdGlUb3VjaEdlc3R1cmUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxTY2FsZSA9IGdlc3R1cmUuaW5pdGlhbFNjYWxlO1xuXG4gICAgaWYgKGluaXRpYWxTY2FsZSkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIGdldFN0YXRlRm9yWm9vbSh7XG4gICAgICAgICAgdmlld3BvcnRYOiBjdXJzb3JYLFxuICAgICAgICAgIHZpZXdwb3J0WTogY3Vyc29yWSxcbiAgICAgICAgICBuZXh0Wm9vbTogZ2V0Tm9ybWFsaXplZFpvb20oaW5pdGlhbFNjYWxlICogZXZlbnQuc2NhbGUpXG4gICAgICAgIH0sIHN0YXRlKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICB0aGlzLm9uR2VzdHVyZUVuZCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyByZXNlbGVjdCBlbGVtZW50cyBvbmx5IG9uIHRvdWNoIHNjcmVlbnMgKHNlZSBvbkdlc3R1cmVTdGFydClcblxuICAgIGlmIChfdGhpczEzLmlzVG91Y2hTY3JlZW5NdWx0aVRvdWNoR2VzdHVyZSgpKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF90aGlzMTMuc3RhdGUucHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gbnVsbDtcbiAgfSk7XG5cbiAgdGhpcy5zdGFydFRleHRFZGl0aW5nID0gZnVuY3Rpb24gKF9yZWY4KSB7XG4gICAgbGV0IHtcbiAgICAgIHNjZW5lWCxcbiAgICAgIHNjZW5lWSxcbiAgICAgIHNob3VsZEJpbmQsXG4gICAgICBpbnNlcnRBdFBhcmVudENlbnRlciA9IHRydWVcbiAgICB9ID0gX3JlZjg7XG5cbiAgICBsZXQgcGFyZW50Q2VudGVyUG9zaXRpb24gPSBpbnNlcnRBdFBhcmVudENlbnRlciAmJiBfdGhpczEzLmdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oc2NlbmVYLCBzY2VuZVksIF90aGlzMTMuc3RhdGUsIF90aGlzMTMuY2FudmFzLCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XG5cbiAgICBsZXQgZXhpc3RpbmdUZXh0RWxlbWVudCA9IG51bGw7XG4gICAgbGV0IGNvbnRhaW5lciA9IG51bGw7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pKSB7XG4gICAgICAgIGV4aXN0aW5nVGV4dEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzBdO1xuICAgICAgfSBlbHNlIGlmIChpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihzZWxlY3RlZEVsZW1lbnRzWzBdLCBmYWxzZSkpIHtcbiAgICAgICAgZXhpc3RpbmdUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZ1RleHRFbGVtZW50ID0gX3RoaXMxMy5nZXRUZXh0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBleGlzdGluZ1RleHRFbGVtZW50ID0gX3RoaXMxMy5nZXRUZXh0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuICAgIH0gLy8gYmluZCB0byBjb250YWluZXIgd2hlbiBzaG91bGRCaW5kIGlzIHRydWUgb3JcbiAgICAvLyBjbGlja2VkIG9uIGNlbnRlciBvZiBjb250YWluZXJcblxuXG4gICAgaWYgKCFjb250YWluZXIgJiYgIWV4aXN0aW5nVGV4dEVsZW1lbnQgJiYgKHNob3VsZEJpbmQgfHwgcGFyZW50Q2VudGVyUG9zaXRpb24pKSB7XG4gICAgICBjb250YWluZXIgPSBnZXRUZXh0QmluZGFibGVDb250YWluZXJBdFBvc2l0aW9uKF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgcmV0dXJuIGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyKGVsZSwgZmFsc2UpICYmICFnZXRCb3VuZFRleHRFbGVtZW50KGVsZSk7XG4gICAgICB9KSwgc2NlbmVYLCBzY2VuZVkpO1xuICAgIH1cblxuICAgIGlmICghZXhpc3RpbmdUZXh0RWxlbWVudCAmJiBjb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGZvbnRTdHJpbmcgPSB7XG4gICAgICAgIGZvbnRTaXplOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICAgIGZvbnRGYW1pbHk6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Gb250RmFtaWx5XG4gICAgICB9O1xuICAgICAgY29uc3QgbWluV2lkdGggPSBnZXRBcHByb3hNaW5MaW5lV2lkdGgoZ2V0Rm9udFN0cmluZyhmb250U3RyaW5nKSk7XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPSBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcoZm9udFN0cmluZykpO1xuICAgICAgY29uc3QgbmV3SGVpZ2h0ID0gTWF0aC5tYXgoY29udGFpbmVyLmhlaWdodCwgbWluSGVpZ2h0KTtcbiAgICAgIGNvbnN0IG5ld1dpZHRoID0gTWF0aC5tYXgoY29udGFpbmVyLndpZHRoLCBtaW5XaWR0aCk7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICBoZWlnaHQ6IG5ld0hlaWdodCxcbiAgICAgICAgd2lkdGg6IG5ld1dpZHRoXG4gICAgICB9KTtcbiAgICAgIHNjZW5lWCA9IGNvbnRhaW5lci54ICsgbmV3V2lkdGggLyAyO1xuICAgICAgc2NlbmVZID0gY29udGFpbmVyLnkgKyBuZXdIZWlnaHQgLyAyO1xuXG4gICAgICBpZiAocGFyZW50Q2VudGVyUG9zaXRpb24pIHtcbiAgICAgICAgcGFyZW50Q2VudGVyUG9zaXRpb24gPSBfdGhpczEzLmdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oc2NlbmVYLCBzY2VuZVksIF90aGlzMTMuc3RhdGUsIF90aGlzMTMuY2FudmFzLCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGV4aXN0aW5nVGV4dEVsZW1lbnQgPyBleGlzdGluZ1RleHRFbGVtZW50IDogbmV3VGV4dEVsZW1lbnQoe1xuICAgICAgeDogcGFyZW50Q2VudGVyUG9zaXRpb24gPyBwYXJlbnRDZW50ZXJQb3NpdGlvbi5lbGVtZW50Q2VudGVyWCA6IHNjZW5lWCxcbiAgICAgIHk6IHBhcmVudENlbnRlclBvc2l0aW9uID8gcGFyZW50Q2VudGVyUG9zaXRpb24uZWxlbWVudENlbnRlclkgOiBzY2VuZVksXG4gICAgICBzdHJva2VDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIHRleHQ6IFwiXCIsXG4gICAgICByYXdUZXh0OiBcIlwiLFxuICAgICAgZm9udFNpemU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgIGZvbnRGYW1pbHk6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Gb250RmFtaWx5LFxuICAgICAgdGV4dEFsaWduOiBwYXJlbnRDZW50ZXJQb3NpdGlvbiA/IFwiY2VudGVyXCIgOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtVGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbjogcGFyZW50Q2VudGVyUG9zaXRpb24gPyBWRVJUSUNBTF9BTElHTi5NSURETEUgOiBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICAgICAgY29udGFpbmVySWQ6IGNvbnRhaW5lcj8uaWQgPz8gdW5kZWZpbmVkLFxuICAgICAgZ3JvdXBJZHM6IGNvbnRhaW5lcj8uZ3JvdXBJZHMgPz8gW10sXG4gICAgICBsb2NrZWQ6IGZhbHNlXG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50XG4gICAgfSk7XG5cbiAgICBpZiAoIWV4aXN0aW5nVGV4dEVsZW1lbnQpIHtcbiAgICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBlbGVtZW50XSk7IC8vIGNhc2U6IGNyZWF0aW5nIG5ldyB0ZXh0IG5vdCBjZW50ZXJlZCB0byBwYXJlbnQgZWxlbWVudCDihpIgb2Zmc2V0IFlcbiAgICAgIC8vIHNvIHRoYXQgdGhlIHRleHQgaXMgY2VudGVyZWQgdG8gY3Vyc29yIHBvc2l0aW9uXG5cblxuICAgICAgaWYgKCFwYXJlbnRDZW50ZXJQb3NpdGlvbikge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICB5OiBlbGVtZW50LnkgLSBlbGVtZW50LmJhc2VsaW5lIC8gMlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLmhhbmRsZVRleHRXeXNpd3lnKGVsZW1lbnQsIHtcbiAgICAgIGlzRXhpc3RpbmdFbGVtZW50OiAhIWV4aXN0aW5nVGV4dEVsZW1lbnRcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZUNhbnZhc0RvdWJsZUNsaWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gY2FzZTogZG91YmxlLWNsaWNraW5nIHdpdGggYXJyb3cvbGluZSB0b29sIHNlbGVjdGVkIHdvdWxkIGJvdGggY3JlYXRlXG4gICAgLy8gdGV4dCBhbmQgZW50ZXIgbXVsdGlFbGVtZW50IG1vZGVcbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHdlIHNob3VsZCBvbmx5IGJlIGFibGUgdG8gZG91YmxlIGNsaWNrIHdoZW4gbW9kZSBpcyBzZWxlY3Rpb25cblxuXG4gICAgaWYgKF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pKSB7XG4gICAgICBpZiAoIV90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHwgX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQgIT09IHNlbGVjdGVkRWxlbWVudHNbMF0uaWQpIHtcbiAgICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBuZXcgTGluZWFyRWxlbWVudEVkaXRvcihzZWxlY3RlZEVsZW1lbnRzWzBdLCBfdGhpczEzLnNjZW5lKVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzKTtcbiAgICBsZXQge1xuICAgICAgeDogc2NlbmVYLFxuICAgICAgeTogc2NlbmVZXG4gICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cElkcyA9IGdldFNlbGVjdGVkR3JvdXBJZHMoX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRHcm91cElkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBJZCA9IGhpdEVsZW1lbnQgJiYgZ2V0U2VsZWN0ZWRHcm91cElkRm9yRWxlbWVudChoaXRFbGVtZW50LCBfdGhpczEzLnN0YXRlLnNlbGVjdGVkR3JvdXBJZHMpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRHcm91cElkKSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlKSwge30sIHtcbiAgICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBzZWxlY3RlZEdyb3VwSWQsXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge31cbiAgICAgICAgICB9KSwgX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldEN1cnNvcihfdGhpczEzLmNhbnZhcyk7XG5cbiAgICBpZiAoIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmICFfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzBdO1xuICAgICAgICBjb25zdCBjYW5CaW5kVGV4dCA9IGhhc0JvdW5kVGV4dEVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50KTtcblxuICAgICAgICBpZiAoY2FuQmluZFRleHQpIHtcbiAgICAgICAgICBzY2VuZVggPSBzZWxlY3RlZEVsZW1lbnQueCArIHNlbGVjdGVkRWxlbWVudC53aWR0aCAvIDI7XG4gICAgICAgICAgc2NlbmVZID0gc2VsZWN0ZWRFbGVtZW50LnkgKyBzZWxlY3RlZEVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBfdGhpczEzLnN0YXJ0VGV4dEVkaXRpbmcoe1xuICAgICAgICBzY2VuZVgsXG4gICAgICAgIHNjZW5lWSxcbiAgICAgICAgc2hvdWxkQmluZDogZmFsc2UsXG4gICAgICAgIGluc2VydEF0UGFyZW50Q2VudGVyOiAhZXZlbnQuYWx0S2V5XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5nZXRFbGVtZW50TGlua0F0UG9zaXRpb24gPSBmdW5jdGlvbiAoc2NlbmVQb2ludGVyLCBoaXRFbGVtZW50KSB7XG4gICAgLy8gUmV2ZXJzaW5nIHNvIHdlIHRyYXZlcnNlIHRoZSBlbGVtZW50cyBpbiBkZWNyZWFzaW5nIG9yZGVyXG4gICAgLy8gb2Ygei1pbmRleFxuICAgIGNvbnN0IGVsZW1lbnRzID0gX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKS5zbGljZSgpLnJldmVyc2UoKTtcblxuICAgIGxldCBoaXRFbGVtZW50SW5kZXggPSBJbmZpbml0eTtcbiAgICByZXR1cm4gZWxlbWVudHMuZmluZChmdW5jdGlvbiAoZWxlbWVudCwgaW5kZXgpIHtcbiAgICAgIGlmIChoaXRFbGVtZW50ICYmIGVsZW1lbnQuaWQgPT09IGhpdEVsZW1lbnQuaWQpIHtcbiAgICAgICAgaGl0RWxlbWVudEluZGV4ID0gaW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbGVtZW50LmxpbmsgJiYgaW5kZXggPD0gaGl0RWxlbWVudEluZGV4ICYmIGlzUG9pbnRIaXR0aW5nTGlua0ljb24oZWxlbWVudCwgX3RoaXMxMy5zdGF0ZSwgW3NjZW5lUG9pbnRlci54LCBzY2VuZVBvaW50ZXIueV0sIF90aGlzMTMuZGV2aWNlLmlzTW9iaWxlKTtcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLnJlZGlyZWN0VG9MaW5rID0gZnVuY3Rpb24gKGV2ZW50LCBpc1RvdWNoU2NyZWVuKSB7XG4gICAgY29uc3QgZHJhZ2dlZERpc3RhbmNlID0gZGlzdGFuY2UyZChfdGhpczEzLmxhc3RQb2ludGVyRG93bi5jbGllbnRYLCBfdGhpczEzLmxhc3RQb2ludGVyRG93bi5jbGllbnRZLCBfdGhpczEzLmxhc3RQb2ludGVyVXAuY2xpZW50WCwgX3RoaXMxMy5sYXN0UG9pbnRlclVwLmNsaWVudFkpO1xuXG4gICAgaWYgKCFfdGhpczEzLmhpdExpbmtFbGVtZW50IHx8IC8vIEZvciB0b3VjaCBzY3JlZW4gYWxsb3cgZHJhZ2dpbmcgdGhyZXNob2xkIGVsc2Ugc3RyaWN0IGNoZWNrXG4gICAgaXNUb3VjaFNjcmVlbiAmJiBkcmFnZ2VkRGlzdGFuY2UgPiBEUkFHR0lOR19USFJFU0hPTEQgfHwgIWlzVG91Y2hTY3JlZW4gJiYgZHJhZ2dlZERpc3RhbmNlICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdFBvaW50ZXJEb3duQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKF90aGlzMTMubGFzdFBvaW50ZXJEb3duLCBfdGhpczEzLnN0YXRlKTtcbiAgICBjb25zdCBsYXN0UG9pbnRlckRvd25IaXR0aW5nTGlua0ljb24gPSBpc1BvaW50SGl0dGluZ0xpbmtJY29uKF90aGlzMTMuaGl0TGlua0VsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtsYXN0UG9pbnRlckRvd25Db29yZHMueCwgbGFzdFBvaW50ZXJEb3duQ29vcmRzLnldLCBfdGhpczEzLmRldmljZS5pc01vYmlsZSk7XG4gICAgY29uc3QgbGFzdFBvaW50ZXJVcENvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhfdGhpczEzLmxhc3RQb2ludGVyVXAsIF90aGlzMTMuc3RhdGUpO1xuICAgIGNvbnN0IGxhc3RQb2ludGVyVXBIaXR0aW5nTGlua0ljb24gPSBpc1BvaW50SGl0dGluZ0xpbmtJY29uKF90aGlzMTMuaGl0TGlua0VsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtsYXN0UG9pbnRlclVwQ29vcmRzLngsIGxhc3RQb2ludGVyVXBDb29yZHMueV0sIF90aGlzMTMuZGV2aWNlLmlzTW9iaWxlKTtcblxuICAgIGlmIChsYXN0UG9pbnRlckRvd25IaXR0aW5nTGlua0ljb24gJiYgbGFzdFBvaW50ZXJVcEhpdHRpbmdMaW5rSWNvbikge1xuICAgICAgY29uc3QgdXJsID0gX3RoaXMxMy5oaXRMaW5rRWxlbWVudC5saW5rO1xuXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIGxldCBjdXN0b21FdmVudDtcblxuICAgICAgICBpZiAoX3RoaXMxMy5wcm9wcy5vbkxpbmtPcGVuKSB7XG4gICAgICAgICAgY3VzdG9tRXZlbnQgPSB3cmFwRXZlbnQoRVZFTlQuRVhDQUxJRFJBV19MSU5LLCBldmVudC5uYXRpdmVFdmVudCk7XG5cbiAgICAgICAgICBfdGhpczEzLnByb3BzLm9uTGlua09wZW4oX3RoaXMxMy5oaXRMaW5rRWxlbWVudCwgY3VzdG9tRXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjdXN0b21FdmVudD8uZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGlzTG9jYWxMaW5rKHVybCkgPyBcIl9zZWxmXCIgOiBcIl9ibGFua1wiO1xuICAgICAgICAgIGNvbnN0IG5ld1dpbmRvdyA9IHdpbmRvdy5vcGVuKHVuZGVmaW5lZCwgdGFyZ2V0KTsgLy8gaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmdpdGh1Yi5pby9yZWwtbm9vcGVuZXIvXG5cbiAgICAgICAgICBpZiAobmV3V2luZG93KSB7XG4gICAgICAgICAgICBuZXdXaW5kb3cub3BlbmVyID0gbnVsbDtcbiAgICAgICAgICAgIG5ld1dpbmRvdy5sb2NhdGlvbiA9IG5vcm1hbGl6ZUxpbmsodXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVDYW52YXNQb2ludGVyTW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIF90aGlzMTMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgX3RoaXMxMy5zdGF0ZS5jdXJzb3JCdXR0b24pO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcbiAgICAgIGdlc3R1cmUucG9pbnRlcnMuc2V0KGV2ZW50LnBvaW50ZXJJZCwge1xuICAgICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgICB5OiBldmVudC5jbGllbnRZXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0aWFsU2NhbGUgPSBnZXN0dXJlLmluaXRpYWxTY2FsZTtcblxuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLnNpemUgPT09IDIgJiYgZ2VzdHVyZS5sYXN0Q2VudGVyICYmIGluaXRpYWxTY2FsZSAmJiBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSkge1xuICAgICAgY29uc3QgY2VudGVyID0gZ2V0Q2VudGVyKGdlc3R1cmUucG9pbnRlcnMpO1xuICAgICAgY29uc3QgZGVsdGFYID0gY2VudGVyLnggLSBnZXN0dXJlLmxhc3RDZW50ZXIueDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGNlbnRlci55IC0gZ2VzdHVyZS5sYXN0Q2VudGVyLnk7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPSBjZW50ZXI7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IGdldERpc3RhbmNlKEFycmF5LmZyb20oZ2VzdHVyZS5wb2ludGVycy52YWx1ZXMoKSkpO1xuICAgICAgY29uc3Qgc2NhbGVGYWN0b3IgPSBfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJmcmVlZHJhd1wiICYmIF90aGlzMTMuc3RhdGUucGVuTW9kZSA/IDEgOiBkaXN0YW5jZSAvIGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlO1xuICAgICAgY29uc3QgbmV4dFpvb20gPSBzY2FsZUZhY3RvciA/IGdldE5vcm1hbGl6ZWRab29tKGluaXRpYWxTY2FsZSAqIHNjYWxlRmFjdG9yKSA6IF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZTtcblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgY29uc3Qgem9vbVN0YXRlID0gZ2V0U3RhdGVGb3Jab29tKHtcbiAgICAgICAgICB2aWV3cG9ydFg6IGNlbnRlci54LFxuICAgICAgICAgIHZpZXdwb3J0WTogY2VudGVyLnksXG4gICAgICAgICAgbmV4dFpvb21cbiAgICAgICAgfSwgc3RhdGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHpvb206IHpvb21TdGF0ZS56b29tLFxuICAgICAgICAgIHNjcm9sbFg6IHpvb21TdGF0ZS5zY3JvbGxYICsgZGVsdGFYIC8gbmV4dFpvb20sXG4gICAgICAgICAgc2Nyb2xsWTogem9vbVN0YXRlLnNjcm9sbFkgKyBkZWx0YVkgLyBuZXh0Wm9vbSxcbiAgICAgICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLnJlc2V0U2hvdWxkQ2FjaGVJZ25vcmVab29tRGVib3VuY2VkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlc3R1cmUubGFzdENlbnRlciA9IGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlID0gZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChpc0hvbGRpbmdTcGFjZSB8fCBpc1Bhbm5pbmcgfHwgaXNEcmFnZ2luZ1Njcm9sbEJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzUG9pbnRlck92ZXJTY3JvbGxCYXJzID0gaXNPdmVyU2Nyb2xsQmFycyhjdXJyZW50U2Nyb2xsQmFycywgZXZlbnQuY2xpZW50WCAtIF90aGlzMTMuc3RhdGUub2Zmc2V0TGVmdCwgZXZlbnQuY2xpZW50WSAtIF90aGlzMTMuc3RhdGUub2Zmc2V0VG9wKTtcbiAgICBjb25zdCBpc092ZXJTY3JvbGxCYXIgPSBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycy5pc092ZXJFaXRoZXI7XG5cbiAgICBpZiAoIV90aGlzMTMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50ICYmICFfdGhpczEzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgaWYgKGlzT3ZlclNjcm9sbEJhcikge1xuICAgICAgICByZXNldEN1cnNvcihfdGhpczEzLmNhbnZhcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZShfdGhpczEzLmNhbnZhcywgX3RoaXMxMy5zdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmVQb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCBfdGhpczEzLnN0YXRlKTtcbiAgICBjb25zdCB7XG4gICAgICB4OiBzY2VuZVBvaW50ZXJYLFxuICAgICAgeTogc2NlbmVQb2ludGVyWVxuICAgIH0gPSBzY2VuZVBvaW50ZXI7XG5cbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJiAhX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5pc0RyYWdnaW5nKSB7XG4gICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlck1vdmUoZXZlbnQsIHNjZW5lUG9pbnRlclgsIHNjZW5lUG9pbnRlclksIF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQsIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuXG4gICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQgIT09IF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgLy8gU2luY2Ugd2UgYXJlIHJlYWRpbmcgZnJvbSBwcmV2aW91cyBzdGF0ZSB3aGljaCBpcyBub3QgcG9zc2libGUgd2l0aFxuICAgICAgICAvLyBhdXRvbWF0aWMgYmF0Y2hpbmcgaW4gUmVhY3QgMTggaGVuY2UgdXNpbmcgZmx1c2ggc3luYyB0byBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgc3RhdGUuIENoZWNrIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC81NTA4IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVkaXRpbmdMaW5lYXJFbGVtZW50Lmxhc3RVbmNvbW1pdHRlZFBvaW50ICE9IG51bGwpIHtcbiAgICAgICAgX3RoaXMxMy5tYXliZVN1Z2dlc3RCaW5kaW5nQXRDdXJzb3Ioc2NlbmVQb2ludGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNCaW5kaW5nRWxlbWVudFR5cGUoX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUpKSB7XG4gICAgICAvLyBIb3ZlcmluZyB3aXRoIGEgc2VsZWN0ZWQgdG9vbCBvciBjcmVhdGluZyBuZXcgbGluZWFyIGVsZW1lbnQgdmlhIGNsaWNrXG4gICAgICAvLyBhbmQgcG9pbnRcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50XG4gICAgICB9ID0gX3RoaXMxMy5zdGF0ZTtcblxuICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCBmYWxzZSkpIHtcbiAgICAgICAgX3RoaXMxMy5tYXliZVN1Z2dlc3RCaW5kaW5nc0ZvckxpbmVhckVsZW1lbnRBdENvb3JkcyhkcmFnZ2luZ0VsZW1lbnQsIFtzY2VuZVBvaW50ZXJdLCBfdGhpczEzLnN0YXRlLnN0YXJ0Qm91bmRFbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzMTMubWF5YmVTdWdnZXN0QmluZGluZ0F0Q3Vyc29yKHNjZW5lUG9pbnRlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF90aGlzMTMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG11bHRpRWxlbWVudFxuICAgICAgfSA9IF90aGlzMTMuc3RhdGU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHg6IHJ4LFxuICAgICAgICB5OiByeVxuICAgICAgfSA9IG11bHRpRWxlbWVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcG9pbnRzLFxuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnRcbiAgICAgIH0gPSBtdWx0aUVsZW1lbnQ7XG4gICAgICBjb25zdCBsYXN0UG9pbnQgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXMxMy5jYW52YXMsIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICBpZiAobGFzdFBvaW50ID09PSBsYXN0Q29tbWl0dGVkUG9pbnQpIHtcbiAgICAgICAgLy8gaWYgd2UgaGF2ZW4ndCB5ZXQgY3JlYXRlZCBhIHRlbXAgcG9pbnQgYW5kIHdlJ3JlIGJleW9uZCBjb21taXQtem9uZVxuICAgICAgICAvLyB0aHJlc2hvbGQsIGFkZCBhIHBvaW50XG4gICAgICAgIGlmIChkaXN0YW5jZTJkKHNjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5LCBsYXN0UG9pbnRbMF0sIGxhc3RQb2ludFsxXSkgPj0gTElORV9DT05GSVJNX1RIUkVTSE9MRCkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtzY2VuZVBvaW50ZXJYIC0gcngsIHNjZW5lUG9pbnRlclkgLSByeV1dXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTsgLy8gaW4gdGhpcyBicmFuY2gsIHdlJ3JlIGluc2lkZSB0aGUgY29tbWl0IHpvbmUsIGFuZCBubyB1bmNvbW1pdHRlZFxuICAgICAgICAgIC8vIHBvaW50IGV4aXN0cy4gVGh1cyBkbyBub3RoaW5nIChkb24ndCBhZGQvcmVtb3ZlIHBvaW50cykuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA+IDIgJiYgbGFzdENvbW1pdHRlZFBvaW50ICYmIGRpc3RhbmNlMmQoc2NlbmVQb2ludGVyWCAtIHJ4LCBzY2VuZVBvaW50ZXJZIC0gcnksIGxhc3RDb21taXR0ZWRQb2ludFswXSwgbGFzdENvbW1pdHRlZFBvaW50WzFdKSA8IExJTkVfQ09ORklSTV9USFJFU0hPTEQpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICBwb2ludHM6IHBvaW50cy5zbGljZSgwLCAtMSlcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChzY2VuZVBvaW50ZXJYLCBzY2VuZVBvaW50ZXJZLCBfdGhpczEzLnN0YXRlLmdyaWRTaXplKTtcbiAgICAgICAgY29uc3QgW2xhc3RDb21taXR0ZWRYLCBsYXN0Q29tbWl0dGVkWV0gPSBtdWx0aUVsZW1lbnQ/Lmxhc3RDb21taXR0ZWRQb2ludCA/PyBbMCwgMF07XG4gICAgICAgIGxldCBkeEZyb21MYXN0Q29tbWl0dGVkID0gZ3JpZFggLSByeCAtIGxhc3RDb21taXR0ZWRYO1xuICAgICAgICBsZXQgZHlGcm9tTGFzdENvbW1pdHRlZCA9IGdyaWRZIC0gcnkgLSBsYXN0Q29tbWl0dGVkWTtcblxuICAgICAgICBpZiAoc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUoZXZlbnQpKSB7XG4gICAgICAgICAgKHtcbiAgICAgICAgICAgIHdpZHRoOiBkeEZyb21MYXN0Q29tbWl0dGVkLFxuICAgICAgICAgICAgaGVpZ2h0OiBkeUZyb21MYXN0Q29tbWl0dGVkXG4gICAgICAgICAgfSA9IGdldFBlcmZlY3RFbGVtZW50U2l6ZShfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSwgZHhGcm9tTGFzdENvbW1pdHRlZCwgZHlGcm9tTGFzdENvbW1pdHRlZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzUGF0aEFMb29wKHBvaW50cywgX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlKSkge1xuICAgICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgICAgIH0gLy8gdXBkYXRlIGxhc3QgdW5jb21taXR0ZWQgcG9pbnRcblxuXG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLnNsaWNlKDAsIC0xKSwgW2xhc3RDb21taXR0ZWRYICsgZHhGcm9tTGFzdENvbW1pdHRlZCwgbGFzdENvbW1pdHRlZFkgKyBkeUZyb21MYXN0Q29tbWl0dGVkXV1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNEZXNlbGVjdGVkQnV0dG9uID0gQm9vbGVhbihldmVudC5idXR0b25zKTtcblxuICAgIGlmIChoYXNEZXNlbGVjdGVkQnV0dG9uIHx8IF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlICE9PSBcInNlbGVjdGlvblwiICYmIF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlICE9PSBcInRleHRcIiAmJiBfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJlcmFzZXJcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBfdGhpczEzLnN0YXRlKTtcblxuICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhaXNPdmVyU2Nyb2xsQmFyICYmICFfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRFbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUoZWxlbWVudHMsIF90aGlzMTMuc3RhdGUsIHNjZW5lUG9pbnRlclgsIHNjZW5lUG9pbnRlclksIF90aGlzMTMuc3RhdGUuem9vbSwgZXZlbnQucG9pbnRlclR5cGUpO1xuXG4gICAgICBpZiAoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlICYmIGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZS50cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgZ2V0Q3Vyc29yRm9yUmVzaXppbmdFbGVtZW50KGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDEgJiYgIWlzT3ZlclNjcm9sbEJhcikge1xuICAgICAgY29uc3QgdHJhbnNmb3JtSGFuZGxlVHlwZSA9IGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzKGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKSwgc2NlbmVQb2ludGVyWCwgc2NlbmVQb2ludGVyWSwgX3RoaXMxMy5zdGF0ZS56b29tLCBldmVudC5wb2ludGVyVHlwZSk7XG5cbiAgICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgZ2V0Q3Vyc29yRm9yUmVzaXppbmdFbGVtZW50KHtcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlXG4gICAgICAgIH0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBfdGhpczEzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHNjZW5lUG9pbnRlci54LCBzY2VuZVBvaW50ZXIueSk7XG5cbiAgICBfdGhpczEzLmhpdExpbmtFbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50TGlua0F0UG9zaXRpb24oc2NlbmVQb2ludGVyLCBoaXRFbGVtZW50KTtcblxuICAgIGlmIChpc0VyYXNlckFjdGl2ZShfdGhpczEzLnN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfdGhpczEzLmhpdExpbmtFbGVtZW50ICYmICFfdGhpczEzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tfdGhpczEzLmhpdExpbmtFbGVtZW50LmlkXSkge1xuICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICAgIHNob3dIeXBlcmxpbmtUb29sdGlwKF90aGlzMTMuaGl0TGlua0VsZW1lbnQsIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICBpZiAoX3RoaXMxMy5wcm9wcy5vbkxpbmtIb3Zlcikge1xuICAgICAgICBfdGhpczEzLnByb3BzLm9uTGlua0hvdmVyKF90aGlzMTMuaGl0TGlua0VsZW1lbnQsIGV2ZW50KTtcbiAgICAgIH0gLy96c3ZpY3ppYW5cblxuICAgIH0gZWxzZSB7XG4gICAgICBoaWRlSHlwZXJsaW5rVG9vbGlwKCk7XG5cbiAgICAgIGlmIChoaXRFbGVtZW50ICYmIGhpdEVsZW1lbnQubGluayAmJiBfdGhpczEzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1toaXRFbGVtZW50LmlkXSAmJiAhX3RoaXMxMy5jb250ZXh0TWVudU9wZW4gJiYgIV90aGlzMTMuc3RhdGUuc2hvd0h5cGVybGlua1BvcHVwKSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNob3dIeXBlcmxpbmtQb3B1cDogXCJpbmZvXCJcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInRleHRcIikge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIGlzVGV4dEVsZW1lbnQoaGl0RWxlbWVudCkgPyBDVVJTT1JfVFlQRS5URVhUIDogQ1VSU09SX1RZUEUuQ1JPU1NIQUlSKTtcbiAgICAgIH0gZWxzZSBpZiAoX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5HUkFCKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNPdmVyU2Nyb2xsQmFyKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuQVVUTyk7XG4gICAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudChfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCk7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3goZWxlbWVudCwgX3RoaXMxMy5zdGF0ZSwgW3NjZW5lUG9pbnRlci54LCBzY2VuZVBvaW50ZXIueV0pKSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5NT1ZFKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCAvLyBpZiB1c2luZyBjbWQvY3RybCwgd2UncmUgbm90IGRyYWdnaW5nXG4gICAgICAhZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgKGhpdEVsZW1lbnQgfHwgX3RoaXMxMy5pc0hpdHRpbmdDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cyhzY2VuZVBvaW50ZXIsIHNlbGVjdGVkRWxlbWVudHMpKSAmJiAhaGl0RWxlbWVudD8ubG9ja2VkKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB0aGlzLmhhbmRsZUVyYXNlciA9IGZ1bmN0aW9uIChldmVudCwgcG9pbnRlckRvd25TdGF0ZSwgc2NlbmVQb2ludGVyKSB7XG4gICAgY29uc3QgdXBkYXRlRWxlbWVudElkcyA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoZWxlbWVudC5sb2NrZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZHNUb1VwZGF0ZS5wdXNoKGVsZW1lbnQuaWQpO1xuXG4gICAgICAgIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGVtZW50LmlkXSAmJiBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZW1lbnQuaWRdLmVyYXNlKSB7XG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZW1lbnQuaWRdLmVyYXNlID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGVtZW50LmlkXSA9IHtcbiAgICAgICAgICAgIGVyYXNlOiB0cnVlLFxuICAgICAgICAgICAgb3BhY2l0eTogZWxlbWVudC5vcGFjaXR5XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGlkc1RvVXBkYXRlID0gW107XG4gICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZTJkKHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54LCBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSwgc2NlbmVQb2ludGVyLngsIHNjZW5lUG9pbnRlci55KTtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSAxMCAvIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZTtcblxuICAgIGNvbnN0IHBvaW50ID0gX29iamVjdFNwcmVhZCh7fSwgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzKTtcblxuICAgIGxldCBzYW1wbGluZ0ludGVydmFsID0gMDtcblxuICAgIHdoaWxlIChzYW1wbGluZ0ludGVydmFsIDw9IGRpc3RhbmNlKSB7XG4gICAgICBjb25zdCBoaXRFbGVtZW50cyA9IF90aGlzMTMuZ2V0RWxlbWVudHNBdFBvc2l0aW9uKHBvaW50LngsIHBvaW50LnkpO1xuXG4gICAgICB1cGRhdGVFbGVtZW50SWRzKGhpdEVsZW1lbnRzKTsgLy8gRXhpdCBzaW5jZSB3ZSByZWFjaGVkIGN1cnJlbnQgcG9pbnRcblxuICAgICAgaWYgKHNhbXBsaW5nSW50ZXJ2YWwgPT09IGRpc3RhbmNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBDYWxjdWxhdGUgbmV4dCBwb2ludCBpbiB0aGUgbGluZSBhdCBhIGRpc3RhbmNlIG9mIHNhbXBsaW5nIGludGVydmFsXG5cblxuICAgICAgc2FtcGxpbmdJbnRlcnZhbCA9IE1hdGgubWluKHNhbXBsaW5nSW50ZXJ2YWwgKyB0aHJlc2hvbGQsIGRpc3RhbmNlKTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlUmF0aW8gPSBzYW1wbGluZ0ludGVydmFsIC8gZGlzdGFuY2U7XG4gICAgICBjb25zdCBuZXh0WCA9ICgxIC0gZGlzdGFuY2VSYXRpbykgKiBwb2ludC54ICsgZGlzdGFuY2VSYXRpbyAqIHNjZW5lUG9pbnRlci54O1xuICAgICAgY29uc3QgbmV4dFkgPSAoMSAtIGRpc3RhbmNlUmF0aW8pICogcG9pbnQueSArIGRpc3RhbmNlUmF0aW8gKiBzY2VuZVBvaW50ZXIueTtcbiAgICAgIHBvaW50LnggPSBuZXh0WDtcbiAgICAgIHBvaW50LnkgPSBuZXh0WTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50cyA9IF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkubWFwKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIGNvbnN0IGlkID0gaXNCb3VuZFRvQ29udGFpbmVyKGVsZSkgJiYgaWRzVG9VcGRhdGUuaW5jbHVkZXMoZWxlLmNvbnRhaW5lcklkKSA/IGVsZS5jb250YWluZXJJZCA6IGVsZS5pZDtcblxuICAgICAgaWYgKGlkc1RvVXBkYXRlLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbaWRdICYmIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbaWRdLmVyYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKGVsZSwge1xuICAgICAgICAgICAgICBvcGFjaXR5OiBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2lkXS5vcGFjaXR5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKGVsZSwge1xuICAgICAgICAgICAgb3BhY2l0eTogRUxFTUVOVF9SRUFEWV9UT19FUkFTRV9PUEFDSVRZXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVsZTtcbiAgICB9KTtcblxuICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGVsZW1lbnRzKTtcblxuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0gc2NlbmVQb2ludGVyLng7XG4gICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBzY2VuZVBvaW50ZXIueTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZVRvdWNoTW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGludmFsaWRhdGVDb250ZXh0TWVudSA9IHRydWU7XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVDYW52YXNQb2ludGVyRG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIF90aGlzMTMuZm9jdXNDb250YWluZXIoKTsgLy96c3ZpY3ppYW5cbiAgICAvLyByZW1vdmUgYW55IGFjdGl2ZSBzZWxlY3Rpb24gd2hlbiB3ZSBzdGFydCB0byBpbnRlcmFjdCB3aXRoIGNhbnZhc1xuICAgIC8vIChtYWlubHksIHdlIGNhcmUgYWJvdXQgcmVtb3Zpbmcgc2VsZWN0aW9uIG91dHNpZGUgdGhlIGNvbXBvbmVudCB3aGljaFxuICAgIC8vICB3b3VsZCBwcmV2ZW50IG91ciBjb3B5IGhhbmRsaW5nIG90aGVyd2lzZSlcblxuXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICBpZiAoc2VsZWN0aW9uPy5hbmNob3JOb2RlKSB7XG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5tYXliZU9wZW5Db250ZXh0TWVudUFmdGVyUG9pbnRlckRvd25PblRvdWNoRGV2aWNlcyhldmVudCk7XG5cbiAgICBfdGhpczEzLm1heWJlQ2xlYW51cEFmdGVyTWlzc2luZ1BvaW50ZXJVcChldmVudCk7IC8vZmlyZXMgb25seSBvbmNlLCBpZiBwZW4gaXMgZGV0ZWN0ZWQsIHBlbk1vZGUgaXMgZW5hYmxlZFxuICAgIC8vdGhlIHVzZXIgY2FuIGRpc2FibGUgdGhpcyBieSB0b2dnbGluZyB0aGUgcGVuTW9kZSBidXR0b25cblxuXG4gICAgaWYgKCFfdGhpczEzLnN0YXRlLnBlbkRldGVjdGVkICYmIGV2ZW50LnBvaW50ZXJUeXBlID09PSBcInBlblwiKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwZW5Nb2RlOiB0cnVlLFxuICAgICAgICAgIHBlbkRldGVjdGVkOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIV90aGlzMTMuZGV2aWNlLmlzVG91Y2hTY3JlZW4gJiYgW1wicGVuXCIsIFwidG91Y2hcIl0uaW5jbHVkZXMoZXZlbnQucG9pbnRlclR5cGUpKSB7XG4gICAgICBfdGhpczEzLmRldmljZSA9IHVwZGF0ZU9iamVjdChfdGhpczEzLmRldmljZSwge1xuICAgICAgICBpc1RvdWNoU2NyZWVuOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3RoaXMxMy5sYXN0UG9pbnRlckRvd24gPSBldmVudDtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgbGFzdFBvaW50ZXJEb3duV2l0aDogZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICBjdXJzb3JCdXR0b246IFwiZG93blwiXG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIFwiZG93blwiKTtcblxuICAgIF90aGlzMTMudXBkYXRlR2VzdHVyZU9uUG9pbnRlckRvd24oZXZlbnQpO1xuXG4gICAgaWYgKF90aGlzMTMuaGFuZGxlQ2FudmFzUGFuVXNpbmdXaGVlbE9yU3BhY2VEcmFnKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gb25seSBoYW5kbGUgbGVmdCBtb3VzZSBidXR0b24gb3IgdG91Y2hcblxuXG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gUE9JTlRFUl9CVVRUT04uTUFJTiAmJiBldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLlRPVUNIKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBkb24ndCBzZWxlY3Qgd2hpbGUgcGFubmluZ1xuXG5cbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5zaXplID4gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gU3RhdGUgZm9yIHRoZSBkdXJhdGlvbiBvZiBhIHBvaW50ZXIgaW50ZXJhY3Rpb24sIHdoaWNoIHN0YXJ0cyB3aXRoIGFcbiAgICAvLyBwb2ludGVyRG93biBldmVudCwgZW5kcyB3aXRoIGEgcG9pbnRlclVwIGV2ZW50IChvciBhbm90aGVyIHBvaW50ZXJEb3duKVxuXG5cbiAgICBjb25zdCBwb2ludGVyRG93blN0YXRlID0gX3RoaXMxMy5pbml0aWFsUG9pbnRlckRvd25TdGF0ZShldmVudCk7XG5cbiAgICBpZiAoX3RoaXMxMy5oYW5kbGVEcmFnZ2luZ1Njcm9sbEJhcihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFNpbmNlIGNvbnRleHQgbWVudSBjbG9zZXMgb24gcG9pbnRlciBkb3duIHNvIHNldHRpbmcgdG8gZmFsc2VcblxuXG4gICAgX3RoaXMxMy5jb250ZXh0TWVudU9wZW4gPSBmYWxzZTtcblxuICAgIF90aGlzMTMuY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uKCk7XG5cbiAgICBfdGhpczEzLnVwZGF0ZUJpbmRpbmdFbmFibGVkT25Qb2ludGVyTW92ZShldmVudCk7XG5cbiAgICBpZiAoX3RoaXMxMy5oYW5kbGVTZWxlY3Rpb25PblBvaW50ZXJEb3duKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbG93T25Qb2ludGVyRG93biA9ICFfdGhpczEzLnN0YXRlLnBlbk1vZGUgfHwgZXZlbnQucG9pbnRlclR5cGUgIT09IFwidG91Y2hcIiB8fCBfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIiB8fCBfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwiaW1hZ2VcIjtcblxuICAgIGlmICghYWxsb3dPblBvaW50ZXJEb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInRleHRcIikge1xuICAgICAgX3RoaXMxMy5oYW5kbGVUZXh0T25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImFycm93XCIgfHwgX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwibGluZVwiKSB7XG4gICAgICBfdGhpczEzLmhhbmRsZUxpbmVhckVsZW1lbnRPblBvaW50ZXJEb3duKGV2ZW50LCBfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICAvLyByZXNldCBpbWFnZSBwcmV2aWV3IG9uIHBvaW50ZXJkb3duXG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkNST1NTSEFJUik7IC8vIHJldHJpZXZlIHRoZSBsYXRlc3QgZWxlbWVudCBhcyB0aGUgc3RhdGUgbWF5IGJlIHN0YWxlXG5cbiAgICAgIGNvbnN0IHBlbmRpbmdJbWFnZUVsZW1lbnQgPSBfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnRJZCAmJiBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnQoX3RoaXMxMy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50SWQpO1xuXG4gICAgICBpZiAoIXBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBwZW5kaW5nSW1hZ2VFbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogcGVuZGluZ0ltYWdlRWxlbWVudCxcbiAgICAgICAgcGVuZGluZ0ltYWdlRWxlbWVudElkOiBudWxsLFxuICAgICAgICBtdWx0aUVsZW1lbnQ6IG51bGxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIF90aGlzMTMuc3RhdGUpO1xuICAgICAgbXV0YXRlRWxlbWVudChwZW5kaW5nSW1hZ2VFbGVtZW50LCB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgX3RoaXMxMy5oYW5kbGVGcmVlRHJhd0VsZW1lbnRPblBvaW50ZXJEb3duKGV2ZW50LCBfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJjdXN0b21cIikge1xuICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5BVVRPKTtcbiAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlICE9PSBcImVyYXNlclwiKSB7XG4gICAgICBfdGhpczEzLmNyZWF0ZUdlbmVyaWNFbGVtZW50T25Qb2ludGVyRG93bihfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5wcm9wcz8ub25Qb2ludGVyRG93bj8uKF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbCwgcG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gX3RoaXMxMy5vblBvaW50ZXJNb3ZlRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcblxuICAgIGNvbnN0IG9uUG9pbnRlclVwID0gX3RoaXMxMy5vblBvaW50ZXJVcEZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvbktleURvd24gPSBfdGhpczEzLm9uS2V5RG93bkZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvbktleVVwID0gX3RoaXMxMy5vbktleVVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcblxuICAgIGxhc3RQb2ludGVyVXAgPSBvblBvaW50ZXJVcDtcblxuICAgIGlmICghX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCBvbktleURvd24pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIG9uS2V5VXApO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbk1vdmUgPSBvblBvaW50ZXJNb3ZlO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vblVwID0gb25Qb2ludGVyVXA7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5VXAgPSBvbktleVVwO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleURvd24gPSBvbktleURvd247XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzUG9pbnRlclVwID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgX3RoaXMxMy5sYXN0UG9pbnRlclVwID0gZXZlbnQ7XG5cbiAgICBpZiAoX3RoaXMxMy5kZXZpY2UuaXNUb3VjaFNjcmVlbikge1xuICAgICAgY29uc3Qgc2NlbmVQb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKHtcbiAgICAgICAgY2xpZW50WDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgY2xpZW50WTogZXZlbnQuY2xpZW50WVxuICAgICAgfSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBfdGhpczEzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHNjZW5lUG9pbnRlci54LCBzY2VuZVBvaW50ZXIueSk7XG5cbiAgICAgIF90aGlzMTMuaGl0TGlua0VsZW1lbnQgPSBfdGhpczEzLmdldEVsZW1lbnRMaW5rQXRQb3NpdGlvbihzY2VuZVBvaW50ZXIsIGhpdEVsZW1lbnQpO1xuICAgIH1cblxuICAgIGlmIChfdGhpczEzLmhpdExpbmtFbGVtZW50ICYmICFfdGhpczEzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tfdGhpczEzLmhpdExpbmtFbGVtZW50LmlkXSkge1xuICAgICAgX3RoaXMxMy5yZWRpcmVjdFRvTGluayhldmVudCwgX3RoaXMxMy5kZXZpY2UuaXNUb3VjaFNjcmVlbik7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5yZW1vdmVQb2ludGVyKGV2ZW50KTtcbiAgfTtcblxuICB0aGlzLm1heWJlT3BlbkNvbnRleHRNZW51QWZ0ZXJQb2ludGVyRG93bk9uVG91Y2hEZXZpY2VzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gZGVhbCB3aXRoIG9wZW5pbmcgY29udGV4dCBtZW51IG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIikge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG5cbiAgICAgIGlmICh0b3VjaFRpbWVvdXQpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbHJlYWR5IGEgdG91Y2hUaW1lb3V0LCB0aGlzIG1lYW5zIHRoYXQgdGhlcmUncyBhbm90aGVyXG4gICAgICAgIC8vIHRvdWNoIGRvd24gYW5kIHdlIGFyZSBkb2luZyBhbm90aGVyIHRvdWNoLCBzbyB3ZSBzaG91bGRuJ3Qgb3BlbiB0aGVcbiAgICAgICAgLy8gY29udGV4dCBtZW51LlxuICAgICAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3BlbiB0aGUgY29udGV4dCBtZW51IHdpdGggdGhlIGZpcnN0IHRvdWNoJ3MgY2xpZW50WCBhbmQgY2xpZW50WVxuICAgICAgICAvLyBpZiB0aGUgdG91Y2ggaXMgbm90IG1vdmluZ1xuICAgICAgICB0b3VjaFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdG91Y2hUaW1lb3V0ID0gMDtcblxuICAgICAgICAgIGlmICghaW52YWxpZGF0ZUNvbnRleHRNZW51KSB7XG4gICAgICAgICAgICBfdGhpczEzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51KGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIFRPVUNIX0NUWF9NRU5VX1RJTUVPVVQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB0aGlzLnJlc2V0Q29udGV4dE1lbnVUaW1lciA9IGZ1bmN0aW9uICgpIHtcbiAgICBjbGVhclRpbWVvdXQodG91Y2hUaW1lb3V0KTtcbiAgICB0b3VjaFRpbWVvdXQgPSAwO1xuICAgIGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzUGFuVXNpbmdXaGVlbE9yU3BhY2VEcmFnID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCEoZ2VzdHVyZS5wb2ludGVycy5zaXplIDw9IDEgJiYgKGV2ZW50LmJ1dHRvbiA9PT0gUE9JTlRFUl9CVVRUT04uV0hFRUwgfHwgZXZlbnQuYnV0dG9uID09PSBQT0lOVEVSX0JVVFRPTi5NQUlOICYmIGlzSG9sZGluZ1NwYWNlIHx8IF90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSkgfHwgaXNUZXh0RWxlbWVudChfdGhpczEzLnN0YXRlLmVkaXRpbmdFbGVtZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzUGFubmluZyA9IHRydWU7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBsZXQgbmV4dFBhc3RlUHJldmVudGVkID0gZmFsc2U7XG4gICAgY29uc3QgaXNMaW51eCA9IC9MaW51eC8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtKTtcbiAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUJCSU5HKTtcbiAgICBsZXQge1xuICAgICAgY2xpZW50WDogbGFzdFgsXG4gICAgICBjbGllbnRZOiBsYXN0WVxuICAgIH0gPSBldmVudDtcbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gd2l0aEJhdGNoZWRVcGRhdGVzVGhyb3R0bGVkKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgY29uc3QgZGVsdGFYID0gbGFzdFggLSBldmVudC5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gbGFzdFkgLSBldmVudC5jbGllbnRZO1xuICAgICAgbGFzdFggPSBldmVudC5jbGllbnRYO1xuICAgICAgbGFzdFkgPSBldmVudC5jbGllbnRZO1xuICAgICAgLypcbiAgICAgICAqIFByZXZlbnQgcGFzdGUgZXZlbnQgaWYgd2UgbW92ZSB3aGlsZSBtaWRkbGUgY2xpY2tpbmcgb24gTGludXguXG4gICAgICAgKiBTZWUgaXNzdWUgIzEzODMuXG4gICAgICAgKi9cblxuICAgICAgaWYgKGlzTGludXggJiYgIW5leHRQYXN0ZVByZXZlbnRlZCAmJiAoTWF0aC5hYnMoZGVsdGFYKSA+IDEgfHwgTWF0aC5hYnMoZGVsdGFZKSA+IDEpKSB7XG4gICAgICAgIG5leHRQYXN0ZVByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgIC8qIFByZXZlbnQgdGhlIG5leHQgcGFzdGUgZXZlbnQgKi9cblxuICAgICAgICBjb25zdCBwcmV2ZW50TmV4dFBhc3RlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCBwcmV2ZW50TmV4dFBhc3RlKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfTtcbiAgICAgICAgLypcbiAgICAgICAgICogUmVlbmFibGUgbmV4dCBwYXN0ZSBpbiBjYXNlIG9mIGRpc2FibGVkIG1pZGRsZSBjbGljayBwYXN0ZSBmb3JcbiAgICAgICAgICogYW55IHJlYXNvbjpcbiAgICAgICAgICogLSByaWdodCBjbGljayBwYXN0ZVxuICAgICAgICAgKiAtIGVtcHR5IGNsaXBib2FyZFxuICAgICAgICAgKi9cblxuXG4gICAgICAgIGNvbnN0IGVuYWJsZU5leHRQYXN0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgcHJldmVudE5leHRQYXN0ZSk7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBlbmFibGVOZXh0UGFzdGUpO1xuICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCBwcmV2ZW50TmV4dFBhc3RlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgZW5hYmxlTmV4dFBhc3RlKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFg6IF90aGlzMTMuc3RhdGUuc2Nyb2xsWCAtIGRlbHRhWCAvIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgICAgc2Nyb2xsWTogX3RoaXMxMy5zdGF0ZS5zY3JvbGxZIC0gZGVsdGFZIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCB0ZWFyZG93biA9IHdpdGhCYXRjaGVkVXBkYXRlcyhsYXN0UG9pbnRlclVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG4gICAgICBpc1Bhbm5pbmcgPSBmYWxzZTtcblxuICAgICAgaWYgKCFpc0hvbGRpbmdTcGFjZSkge1xuICAgICAgICBpZiAoX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEN1cnNvckZvclNoYXBlKF90aGlzMTMuY2FudmFzLCBfdGhpczEzLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCJcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIFwidXBcIik7XG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0ZWFyZG93bik7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0ZWFyZG93bik7XG4gICAgICBvblBvaW50ZXJNb3ZlLmZsdXNoKCk7XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQkxVUiwgdGVhcmRvd24pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRlYXJkb3duKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICB0aGlzLmNsZWFyU2VsZWN0aW9uSWZOb3RVc2luZ1NlbGVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgIT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLmhhbmRsZVNlbGVjdGlvbk9uUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgIV90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlID0gZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKGVsZW1lbnRzLCBfdGhpczEzLnN0YXRlLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBfdGhpczEzLnN0YXRlLnpvb20sIGV2ZW50LnBvaW50ZXJUeXBlKTtcblxuICAgICAgICBpZiAoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlICE9IG51bGwpIHtcbiAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHJlc2l6aW5nRWxlbWVudDogZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLmVsZW1lbnRcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUgPSBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSA9IGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzKGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgX3RoaXMxMy5zdGF0ZS56b29tLCBldmVudC5wb2ludGVyVHlwZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgZ2V0Q3Vyc29yRm9yUmVzaXppbmdFbGVtZW50KHtcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlOiBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlXG4gICAgICAgIH0pKTtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaXNSZXNpemluZyA9IHRydWU7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLm9mZnNldCA9IHR1cGxlVG9Db29ycyhnZXRSZXNpemVPZmZzZXRYWShwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlLCBzZWxlY3RlZEVsZW1lbnRzLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55KSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmIGlzTGluZWFyRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSAmJiBzZWxlY3RlZEVsZW1lbnRzWzBdLnBvaW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5hcnJvd0RpcmVjdGlvbiA9IGdldFJlc2l6ZUFycm93RGlyZWN0aW9uKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUsIHNlbGVjdGVkRWxlbWVudHNbMF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHJldCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlckRvd24oZXZlbnQsIF90aGlzMTMuc3RhdGUsIGZ1bmN0aW9uIChhcHBTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMTMuc2V0U3RhdGUoYXBwU3RhdGUpO1xuICAgICAgICAgIH0sIF90aGlzMTMuaGlzdG9yeSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4pO1xuXG4gICAgICAgICAgaWYgKHJldC5oaXRFbGVtZW50KSB7XG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50ID0gcmV0LmhpdEVsZW1lbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJldC5kaWRBZGRQb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIGhpdEVsZW1lbnQgbWF5IGFscmVhZHkgYmUgc2V0IGFib3ZlLCBzbyBjaGVjayBmaXJzdFxuXG5cbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPz8gX3RoaXMxMy5nZXRFbGVtZW50QXRQb3NpdGlvbihwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55KTtcblxuICAgICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCkge1xuICAgICAgICAgIC8vIEVhcmx5IHJldHVybiBpZiBwb2ludGVyIGlzIGhpdHRpbmcgbGluayBpY29uXG4gICAgICAgICAgaWYgKGlzUG9pbnRIaXR0aW5nTGlua0ljb24ocG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCwgX3RoaXMxMy5zdGF0ZSwgW3BvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnldLCBfdGhpczEzLmRldmljZS5pc01vYmlsZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRFbGVtZW50SW5zaWRlID0gaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3gocG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCwgX3RoaXMxMy5zdGF0ZSwgW3BvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnldKTtcbiAgICAgICAgfSAvLyBGb3Igb3ZlcmxhcHBlZCBlbGVtZW50cyBvbmUgcG9zaXRpb24gbWF5IGhpdFxuICAgICAgICAvLyBtdWx0aXBsZSBlbGVtZW50c1xuXG5cbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuYWxsSGl0RWxlbWVudHMgPSBfdGhpczEzLmdldEVsZW1lbnRzQXRQb3NpdGlvbihwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55KTtcbiAgICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHNvbWVIaXRFbGVtZW50SXNTZWxlY3RlZCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmFsbEhpdEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMxMy5pc0FTZWxlY3RlZEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICgoaGl0RWxlbWVudCA9PT0gbnVsbCB8fCAhc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkKSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKSB7XG4gICAgICAgICAgX3RoaXMxMy5jbGVhclNlbGVjdGlvbihoaXRFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgW190aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkXTogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pOyAvLyBJZiB3ZSBjbGljayBvbiBzb21ldGhpbmdcblxuICAgICAgICB9IGVsc2UgaWYgKGhpdEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIG9uIENNRC9DVFJMLCBkcmlsbCBkb3duIHRvIGhpdCBlbGVtZW50IHJlZ2FyZGxlc3Mgb2YgZ3JvdXBzIGV0Yy5cbiAgICAgICAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgICAgICAgIGlmICghX3RoaXMxMy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBlZGl0R3JvdXBGb3JTZWxlY3RlZEVsZW1lbnQocHJldlN0YXRlLCBoaXRFbGVtZW50KSksIHt9LCB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IF90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7IC8vIG1hcmsgYXMgbm90IGNvbXBsZXRlbHkgaGFuZGxlZCBzbyBhcyB0byBhbGxvdyBkcmFnZ2luZyBldGMuXG5cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0gLy8gZGVzZWxlY3QgaWYgaXRlbSBpcyBzZWxlY3RlZFxuICAgICAgICAgIC8vIGlmIHNoaWZ0IGlzIG5vdCBjbGlja2VkLCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0cnVlXG4gICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpdCB3aWxsIHRyaWdnZXIgc2VsZWN0aW9uIGJhc2VkIG9uIGN1cnJlbnRcbiAgICAgICAgICAvLyBzdGF0ZSBvZiB0aGUgYm94XG5cblxuICAgICAgICAgIGlmICghX3RoaXMxMy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBjdXJyZW50bHkgZWRpdGluZyBhIGdyb3VwLCBleGl0aW5nIGVkaXRpbmcgbW9kZSBhbmQgZGVzZWxlY3QgdGhlIGdyb3VwLlxuICAgICAgICAgICAgaWYgKF90aGlzMTMuc3RhdGUuZWRpdGluZ0dyb3VwSWQgJiYgIWlzRWxlbWVudEluR3JvdXAoaGl0RWxlbWVudCwgX3RoaXMxMy5zdGF0ZS5lZGl0aW5nR3JvdXBJZCkpIHtcbiAgICAgICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gLy8gQWRkIGhpdCBlbGVtZW50IHRvIHNlbGVjdGlvbi4gQXQgdGhpcyBwb2ludCBpZiB3ZSdyZSBub3QgaG9sZGluZ1xuICAgICAgICAgICAgLy8gU0hJRlQgdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgZWxlbWVudChzKSB3ZXJlIGRlc2VsZWN0ZWQgYWJvdmVcbiAgICAgICAgICAgIC8vIChtYWtlIHN1cmUgeW91IHVzZSBzZXRTdGF0ZSB1cGRhdGVyIHRvIHVzZSBsYXRlc3Qgc3RhdGUpXG5cblxuICAgICAgICAgICAgaWYgKCFzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQgJiYgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlKSwge30sIHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIHNob3dIeXBlcmxpbmtQb3B1cDogaGl0RWxlbWVudC5saW5rID8gXCJpbmZvXCIgOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pLCBfdGhpczEzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpKTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IF90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZVRleHRPblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgLy8gaWYgd2UncmUgY3VycmVudGx5IHN0aWxsIGVkaXRpbmcgdGV4dCwgY2xpY2tpbmcgb3V0c2lkZVxuICAgIC8vIHNob3VsZCBvbmx5IGZpbmFsaXplIGl0LCBub3QgY3JlYXRlIGFub3RoZXIgKGlycmVzcGVjdGl2ZVxuICAgIC8vIG9mIHN0YXRlLmFjdGl2ZVRvb2wubG9ja2VkKVxuICAgIGlmIChpc1RleHRFbGVtZW50KF90aGlzMTMuc3RhdGUuZWRpdGluZ0VsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHNjZW5lWCA9IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLng7XG4gICAgbGV0IHNjZW5lWSA9IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSwge1xuICAgICAgaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQ6IHRydWVcbiAgICB9KTtcblxuICAgIGNvbnN0IGNhbkJpbmRUZXh0ID0gaGFzQm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcblxuICAgIGlmIChjYW5CaW5kVGV4dCkge1xuICAgICAgc2NlbmVYID0gZWxlbWVudC54ICsgZWxlbWVudC53aWR0aCAvIDI7XG4gICAgICBzY2VuZVkgPSBlbGVtZW50LnkgKyBlbGVtZW50LmhlaWdodCAvIDI7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgIHNjZW5lWCxcbiAgICAgIHNjZW5lWSxcbiAgICAgIHNob3VsZEJpbmQ6IGZhbHNlLFxuICAgICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXI6ICFldmVudC5hbHRLZXlcbiAgICB9KTtcblxuICAgIHJlc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzKTtcblxuICAgIGlmICghX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLmxvY2tlZCkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGFjdGl2ZVRvb2w6IHVwZGF0ZUFjdGl2ZVRvb2woX3RoaXMxMy5zdGF0ZSwge1xuICAgICAgICAgIHR5cGU6IFwic2VsZWN0aW9uXCJcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLmhhbmRsZUZyZWVEcmF3RWxlbWVudE9uUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXZlbnQsIGVsZW1lbnRUeXBlLCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgLy8gQmVnaW4gYSBtYXJrIGNhcHR1cmUuIFRoaXMgZG9lcyBub3QgaGF2ZSB0byB1cGRhdGUgc3RhdGUgeWV0LlxuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIG51bGwpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdGcmVlRHJhd0VsZW1lbnQoe1xuICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICB4OiBncmlkWCxcbiAgICAgIHk6IGdyaWRZLFxuICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3MsXG4gICAgICBzaW11bGF0ZVByZXNzdXJlOiBldmVudC5wcmVzc3VyZSA9PT0gMC41LFxuICAgICAgbG9ja2VkOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgW2VsZW1lbnQuaWRdOiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHByZXNzdXJlcyA9IGVsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZSA/IGVsZW1lbnQucHJlc3N1cmVzIDogWy4uLmVsZW1lbnQucHJlc3N1cmVzLCBldmVudC5wcmVzc3VyZV07XG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICBwb2ludHM6IFtbMCwgMF1dLFxuICAgICAgcHJlc3N1cmVzXG4gICAgfSk7XG4gICAgY29uc3QgYm91bmRFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLCBfdGhpczEzLnNjZW5lKTtcblxuICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBlbGVtZW50XSk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIGRyYWdnaW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgc3RhcnRCb3VuZEVsZW1lbnQ6IGJvdW5kRWxlbWVudCxcbiAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuY3JlYXRlSW1hZ2VFbGVtZW50ID0gZnVuY3Rpb24gKF9yZWY5KSB7XG4gICAgbGV0IHtcbiAgICAgIHNjZW5lWCxcbiAgICAgIHNjZW5lWVxuICAgIH0gPSBfcmVmOTtcbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChzY2VuZVgsIHNjZW5lWSwgX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0ltYWdlRWxlbWVudCh7XG4gICAgICB0eXBlOiBcImltYWdlXCIsXG4gICAgICB4OiBncmlkWCxcbiAgICAgIHk6IGdyaWRZLFxuICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3MsXG4gICAgICBsb2NrZWQ6IGZhbHNlXG4gICAgfSk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVMaW5lYXJFbGVtZW50T25Qb2ludGVyRG93biA9IGZ1bmN0aW9uIChldmVudCwgZWxlbWVudFR5cGUsIHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbXVsdGlFbGVtZW50XG4gICAgICB9ID0gX3RoaXMxMy5zdGF0ZTsgLy8gZmluYWxpemUgaWYgY29tcGxldGluZyBhIGxvb3BcblxuICAgICAgaWYgKG11bHRpRWxlbWVudC50eXBlID09PSBcImxpbmVcIiAmJiBpc1BhdGhBTG9vcChtdWx0aUVsZW1lbnQucG9pbnRzLCBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUpKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBtdWx0aUVsZW1lbnQucG9pbnRzW211bHRpRWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge1xuICAgICAgICB4OiByeCxcbiAgICAgICAgeTogcnksXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFxuICAgICAgfSA9IG11bHRpRWxlbWVudDsgLy8gY2xpY2tpbmcgaW5zaWRlIGNvbW1pdCB6b25lIOKGkiBmaW5hbGl6ZSBhcnJvd1xuXG4gICAgICBpZiAobXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggPiAxICYmIGxhc3RDb21taXR0ZWRQb2ludCAmJiBkaXN0YW5jZTJkKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSByeCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSAtIHJ5LCBsYXN0Q29tbWl0dGVkUG9pbnRbMF0sIGxhc3RDb21taXR0ZWRQb2ludFsxXSkgPCBMSU5FX0NPTkZJUk1fVEhSRVNIT0xEKSB7XG4gICAgICAgIF90aGlzMTMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgIFttdWx0aUVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH0pOyAvLyBjbGlja2luZyBvdXRzaWRlIGNvbW1pdCB6b25lIOKGkiB1cGRhdGUgcmVmZXJlbmNlIGZvciBsYXN0IGNvbW1pdHRlZFxuICAgICAgLy8gcG9pbnRcblxuXG4gICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXVxuICAgICAgfSk7XG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBfdGhpczEzLnN0YXRlLmdyaWRTaXplKTtcbiAgICAgIC8qIElmIGFycm93IGlzIHByZS1hcnJvd2hlYWRzLCBpdCB3aWxsIGhhdmUgdW5kZWZpbmVkIGZvciBib3RoIHN0YXJ0IGFuZCBlbmQgYXJyb3doZWFkcy5cbiAgICAgIElmIHNvLCB3ZSB3YW50IGl0IHRvIGJlIG51bGwgZm9yIHN0YXJ0IGFuZCBcImFycm93XCIgZm9yIGVuZC4gSWYgdGhlIGxpbmVhciBpdGVtIGlzIG5vdFxuICAgICAgYW4gYXJyb3csIHdlIHdhbnQgaXQgdG8gYmUgbnVsbCBmb3IgYm90aC4gT3RoZXJ3aXNlLCB3ZSB3YW50IGl0IHRvIHVzZSB0aGVcbiAgICAgIHZhbHVlcyBmcm9tIGFwcFN0YXRlLiAqL1xuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGN1cnJlbnRJdGVtU3RhcnRBcnJvd2hlYWQsXG4gICAgICAgIGN1cnJlbnRJdGVtRW5kQXJyb3doZWFkXG4gICAgICB9ID0gX3RoaXMxMy5zdGF0ZTtcbiAgICAgIGNvbnN0IFtzdGFydEFycm93aGVhZCwgZW5kQXJyb3doZWFkXSA9IGVsZW1lbnRUeXBlID09PSBcImFycm93XCIgPyBbY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCwgY3VycmVudEl0ZW1FbmRBcnJvd2hlYWRdIDogW251bGwsIG51bGxdO1xuICAgICAgY29uc3QgZWxlbWVudCA9IG5ld0xpbmVhckVsZW1lbnQoe1xuICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgeDogZ3JpZFgsXG4gICAgICAgIHk6IGdyaWRZLFxuICAgICAgICBzdHJva2VDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIGZpbGxTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgICAgc3Ryb2tlU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgICAgcm91Z2huZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgICBvcGFjaXR5OiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgICAgc3Ryb2tlU2hhcnBuZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgICBzdGFydEFycm93aGVhZCxcbiAgICAgICAgZW5kQXJyb3doZWFkLFxuICAgICAgICBsb2NrZWQ6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgW2VsZW1lbnQuaWRdOiBmYWxzZVxuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgIHBvaW50czogWy4uLmVsZW1lbnQucG9pbnRzLCBbMCwgMF1dXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhwb2ludGVyRG93blN0YXRlLm9yaWdpbiwgX3RoaXMxMy5zY2VuZSk7XG5cbiAgICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBlbGVtZW50XSk7XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBzdGFydEJvdW5kRWxlbWVudDogYm91bmRFbGVtZW50LFxuICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLmNyZWF0ZUdlbmVyaWNFbGVtZW50T25Qb2ludGVyRG93biA9IGZ1bmN0aW9uIChlbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZSkge1xuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdFbGVtZW50KHtcbiAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgeDogZ3JpZFgsXG4gICAgICB5OiBncmlkWSxcbiAgICAgIHN0cm9rZUNvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgbG9ja2VkOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGlvbkVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGRyYWdnaW5nRWxlbWVudDogZWxlbWVudFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBlbGVtZW50XSk7XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBtdWx0aUVsZW1lbnQ6IG51bGwsXG4gICAgICAgIGRyYWdnaW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnJlc3RvcmVSZWFkeVRvRXJhc2VFbGVtZW50cyA9IGZ1bmN0aW9uIChwb2ludGVyRG93blN0YXRlKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGUuaWRdICYmIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmlkXS5lcmFzZSkge1xuICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7XG4gICAgICAgICAgb3BhY2l0eTogcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGUuaWRdLm9wYWNpdHlcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGUpICYmIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmNvbnRhaW5lcklkXSAmJiBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZS5jb250YWluZXJJZF0uZXJhc2UpIHtcbiAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKGVsZSwge1xuICAgICAgICAgIG9wYWNpdHk6IHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmNvbnRhaW5lcklkXS5vcGFjaXR5XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWxlO1xuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoZWxlbWVudHMpO1xuICB9O1xuXG4gIHRoaXMuZXJhc2VFbGVtZW50cyA9IGZ1bmN0aW9uIChwb2ludGVyRG93blN0YXRlKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGUuaWRdICYmIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmlkXS5lcmFzZSkge1xuICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7XG4gICAgICAgICAgaXNEZWxldGVkOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChpc0JvdW5kVG9Db250YWluZXIoZWxlKSAmJiBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZS5jb250YWluZXJJZF0gJiYgcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGUuY29udGFpbmVySWRdLmVyYXNlKSB7XG4gICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGUsIHtcbiAgICAgICAgICBpc0RlbGV0ZWQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbGU7XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG5cbiAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhlbGVtZW50cyk7XG4gIH07XG5cbiAgdGhpcy5pbml0aWFsaXplSW1hZ2UgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTAgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKF9yZWYxMSkge1xuICAgICAgbGV0IHtcbiAgICAgICAgaW1hZ2VGaWxlLFxuICAgICAgICBpbWFnZUVsZW1lbnQ6IF9pbWFnZUVsZW1lbnQsXG4gICAgICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXcgPSBmYWxzZVxuICAgICAgfSA9IF9yZWYxMTtcblxuICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGlzIHNob3VsZCBiZSBndWFyYW50ZWVkIGltYWdlIGZpbGUsIGJ1dCB3ZSBkbyB0aGlzIGNoZWNrXG4gICAgICAvLyB0byBzYXRpc2Z5IFRTIGRvd24gdGhlIGxpbmVcbiAgICAgIGlmICghaXNTdXBwb3J0ZWRJbWFnZUZpbGUoaW1hZ2VGaWxlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy51bnN1cHBvcnRlZEZpbGVUeXBlXCIpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWltZVR5cGUgPSBpbWFnZUZpbGUudHlwZTtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgXCJ3YWl0XCIpO1xuXG4gICAgICBpZiAobWltZVR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW1hZ2VGaWxlID0gU1ZHU3RyaW5nVG9GaWxlKHlpZWxkIG5vcm1hbGl6ZVNWRyh5aWVsZCBpbWFnZUZpbGUudGV4dCgpKSwgaW1hZ2VGaWxlLm5hbWUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQoXCJlcnJvcnMuc3ZnSW1hZ2VJbnNlcnRFcnJvclwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gZ2VuZXJhdGUgaW1hZ2UgaWQgKGJ5IGRlZmF1bHQgdGhlIGZpbGUgZGlnZXN0KSBiZWZvcmUgYW55XG4gICAgICAvLyByZXNpemluZy9jb21wcmVzc2lvbiB0YWtlcyBwbGFjZSB0byBrZWVwIGl0IG1vcmUgcG9ydGFibGVcblxuXG4gICAgICBjb25zdCBmaWxlSWQgPSB5aWVsZCBfdGhpczEzLnByb3BzLmdlbmVyYXRlSWRGb3JGaWxlPy4oaW1hZ2VGaWxlKSB8fCBnZW5lcmF0ZUlkRnJvbUZpbGUoaW1hZ2VGaWxlKTtcblxuICAgICAgaWYgKCFmaWxlSWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGRuJ3QgZ2VuZXJhdGUgZmlsZSBpZCBvciB0aGUgc3VwcGxpZWQgYGdlbmVyYXRlSWRGb3JGaWxlYCBkaWRuJ3QgcmVzb2x2ZSB0byBvbmUuXCIpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhpc3RpbmdGaWxlRGF0YSA9IF90aGlzMTMuZmlsZXNbZmlsZUlkXTtcblxuICAgICAgaWYgKCFleGlzdGluZ0ZpbGVEYXRhPy5kYXRhVVJMKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW1hZ2VGaWxlID0geWllbGQgcmVzaXplSW1hZ2VGaWxlKGltYWdlRmlsZSwge1xuICAgICAgICAgICAgbWF4V2lkdGhPckhlaWdodDogREVGQVVMVF9NQVhfSU1BR0VfV0lEVEhfT1JfSEVJR0hUXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIHRyeWluZyB0byByZXNpbmcgaW1hZ2UgZmlsZSBvbiBpbnNlcnRpb25cIiwgZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltYWdlRmlsZS5zaXplID4gTUFYX0FMTE9XRURfRklMRV9CWVRFUykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcih0KFwiZXJyb3JzLmZpbGVUb29CaWdcIiwge1xuICAgICAgICAgICAgbWF4U2l6ZTogYCR7TWF0aC50cnVuYyhNQVhfQUxMT1dFRF9GSUxFX0JZVEVTIC8gMTAyNCAvIDEwMjQpfU1CYFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvd0N1cnNvckltYWdlUHJldmlldykge1xuICAgICAgICBjb25zdCBkYXRhVVJMID0gX3RoaXMxMy5maWxlc1tmaWxlSWRdPy5kYXRhVVJMOyAvLyBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBkb24ndCB1bm5lY2Vzc2FyaWx5IHJlc2l6ZSB0aGUgb3JpZ2luYWxcbiAgICAgICAgLy8gZnVsbC1zaXplIGZpbGUgZm9yIGN1cnNvciBwcmV2aWV3XG4gICAgICAgIC8vIChpdCdzIG11Y2ggZmFzdGVyIHRvIGNvbnZlcnQgdGhlIHJlc2l6ZWQgZGF0YVVSTCB0byBGaWxlKVxuXG4gICAgICAgIGNvbnN0IHJlc2l6ZWRGaWxlID0gZGF0YVVSTCAmJiBkYXRhVVJMVG9GaWxlKGRhdGFVUkwpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0SW1hZ2VQcmV2aWV3Q3Vyc29yKHJlc2l6ZWRGaWxlIHx8IGltYWdlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFVUkwgPSBfdGhpczEzLmZpbGVzW2ZpbGVJZF0/LmRhdGFVUkwgfHwgKHlpZWxkIGdldERhdGFVUkwoaW1hZ2VGaWxlKSk7XG4gICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBtdXRhdGVFbGVtZW50KF9pbWFnZUVsZW1lbnQsIHtcbiAgICAgICAgZmlsZUlkXG4gICAgICB9LCBmYWxzZSk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfcmVmMTIgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBfdGhpczEzLmZpbGVzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLmZpbGVzKSwge30sIHtcbiAgICAgICAgICAgICAgW2ZpbGVJZF06IHtcbiAgICAgICAgICAgICAgICBtaW1lVHlwZSxcbiAgICAgICAgICAgICAgICBpZDogZmlsZUlkLFxuICAgICAgICAgICAgICAgIGRhdGFVUkwsXG4gICAgICAgICAgICAgICAgY3JlYXRlZDogRGF0ZS5ub3coKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgY2FjaGVkSW1hZ2VEYXRhID0gX3RoaXMxMy5pbWFnZUNhY2hlLmdldChmaWxlSWQpO1xuXG4gICAgICAgICAgICBpZiAoIWNhY2hlZEltYWdlRGF0YSkge1xuICAgICAgICAgICAgICBfdGhpczEzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuXG4gICAgICAgICAgICAgIHlpZWxkIF90aGlzMTMudXBkYXRlSW1hZ2VDYWNoZShbaW1hZ2VFbGVtZW50XSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjYWNoZWRJbWFnZURhdGE/LmltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICB5aWVsZCBjYWNoZWRJbWFnZURhdGEuaW1hZ2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnRJZCAhPT0gaW1hZ2VFbGVtZW50LmlkICYmIF90aGlzMTMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50Py5pZCAhPT0gaW1hZ2VFbGVtZW50LmlkKSB7XG4gICAgICAgICAgICAgIF90aGlzMTMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKGltYWdlRWxlbWVudCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0KFwiZXJyb3JzLmltYWdlSW5zZXJ0RXJyb3JcIikpKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKCFzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3KSB7XG4gICAgICAgICAgICAgIHJlc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g0LCBfeDUpIHtcbiAgICAgICAgICByZXR1cm4gX3JlZjEyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KCkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDMpIHtcbiAgICAgIHJldHVybiBfcmVmMTAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5pbnNlcnRJbWFnZUVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTMgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGltYWdlRWxlbWVudCwgaW1hZ2VGaWxlLCBzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3KSB7XG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgaW1hZ2VFbGVtZW50XSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHlpZWxkIF90aGlzMTMuaW5pdGlhbGl6ZUltYWdlKHtcbiAgICAgICAgICBpbWFnZUZpbGUsXG4gICAgICAgICAgaW1hZ2VFbGVtZW50LFxuICAgICAgICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXdcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGltYWdlRWxlbWVudCwge1xuICAgICAgICAgIGlzRGVsZXRlZDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG5cbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8IHQoXCJlcnJvcnMuaW1hZ2VJbnNlcnRFcnJvclwiKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoX3g2LCBfeDcsIF94OCkge1xuICAgICAgcmV0dXJuIF9yZWYxMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLnNldEltYWdlUHJldmlld0N1cnNvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYxNCA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoaW1hZ2VGaWxlKSB7XG4gICAgICAvLyBtdXN0bid0IGJlIGxhcmdlciB0aGFuIDEyOCBweFxuICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19CYXNpY19Vc2VyX0ludGVyZmFjZS9Vc2luZ19VUkxfdmFsdWVzX2Zvcl90aGVfY3Vyc29yX3Byb3BlcnR5XG4gICAgICBjb25zdCBjdXJzb3JJbWFnZVNpemVQeCA9IDk2O1xuICAgICAgY29uc3QgaW1hZ2VQcmV2aWV3ID0geWllbGQgcmVzaXplSW1hZ2VGaWxlKGltYWdlRmlsZSwge1xuICAgICAgICBtYXhXaWR0aE9ySGVpZ2h0OiBjdXJzb3JJbWFnZVNpemVQeFxuICAgICAgfSk7XG4gICAgICBsZXQgcHJldmlld0RhdGFVUkwgPSB5aWVsZCBnZXREYXRhVVJMKGltYWdlUHJldmlldyk7IC8vIFNWRyBjYW5ub3QgYmUgcmVzaXplZCB2aWEgYHJlc2l6ZUltYWdlRmlsZWAgc28gd2UgcmVzaXplIGJ5IHJlbmRlcmluZyB0b1xuICAgICAgLy8gYSBzbWFsbCBjYW52YXNcblxuICAgICAgaWYgKGltYWdlRmlsZS50eXBlID09PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgICBjb25zdCBpbWcgPSB5aWVsZCBsb2FkSFRNTEltYWdlRWxlbWVudChwcmV2aWV3RGF0YVVSTCk7XG4gICAgICAgIGxldCBoZWlnaHQgPSBNYXRoLm1pbihpbWcuaGVpZ2h0LCBjdXJzb3JJbWFnZVNpemVQeCk7XG4gICAgICAgIGxldCB3aWR0aCA9IGhlaWdodCAqIChpbWcud2lkdGggLyBpbWcuaGVpZ2h0KTtcblxuICAgICAgICBpZiAod2lkdGggPiBjdXJzb3JJbWFnZVNpemVQeCkge1xuICAgICAgICAgIHdpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgICAgICAgaGVpZ2h0ID0gd2lkdGggKiAoaW1nLmhlaWdodCAvIGltZy53aWR0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHByZXZpZXdEYXRhVVJMID0gY2FudmFzLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2Zyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnRJZCkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIGB1cmwoJHtwcmV2aWV3RGF0YVVSTH0pIDQgNCwgYXV0b2ApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDkpIHtcbiAgICAgIHJldHVybiBfcmVmMTQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5vbkltYWdlQWN0aW9uID0gLyojX19QVVJFX18qL19hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoKSB7XG4gICAgbGV0IHtcbiAgICAgIGluc2VydE9uQ2FudmFzRGlyZWN0bHlcbiAgICB9ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7XG4gICAgICBpbnNlcnRPbkNhbnZhc0RpcmVjdGx5OiBmYWxzZVxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xpZW50WCA9IF90aGlzMTMuc3RhdGUud2lkdGggLyAyICsgX3RoaXMxMy5zdGF0ZS5vZmZzZXRMZWZ0O1xuICAgICAgY29uc3QgY2xpZW50WSA9IF90aGlzMTMuc3RhdGUuaGVpZ2h0IC8gMiArIF90aGlzMTMuc3RhdGUub2Zmc2V0VG9wO1xuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKHtcbiAgICAgICAgY2xpZW50WCxcbiAgICAgICAgY2xpZW50WVxuICAgICAgfSwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgICBjb25zdCBpbWFnZUZpbGUgPSB5aWVsZCBmaWxlT3Blbih7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkltYWdlXCIsXG4gICAgICAgIGV4dGVuc2lvbnM6IFtcImpwZ1wiLCBcInBuZ1wiLCBcInN2Z1wiLCBcImdpZlwiXVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IF90aGlzMTMuY3JlYXRlSW1hZ2VFbGVtZW50KHtcbiAgICAgICAgc2NlbmVYOiB4LFxuICAgICAgICBzY2VuZVk6IHlcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaW5zZXJ0T25DYW52YXNEaXJlY3RseSkge1xuICAgICAgICBfdGhpczEzLmluc2VydEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQsIGltYWdlRmlsZSk7XG5cbiAgICAgICAgX3RoaXMxMy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCk7XG5cbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICBbaW1hZ2VFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMTMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBwZW5kaW5nSW1hZ2VFbGVtZW50SWQ6IGltYWdlRWxlbWVudC5pZFxuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMxMy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBpbWFnZUZpbGUsXG4gICAgICAgICAgLyogc2hvd0N1cnNvckltYWdlUHJldmlldyAqL1xuICAgICAgICAgIHRydWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLm5hbWUgIT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnRJZDogbnVsbCxcbiAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgIGFjdGl2ZVRvb2w6IHVwZGF0ZUFjdGl2ZVRvb2woX3RoaXMxMy5zdGF0ZSwge1xuICAgICAgICAgIHR5cGU6IFwic2VsZWN0aW9uXCJcbiAgICAgICAgfSlcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMgPSBmdW5jdGlvbiAoaW1hZ2VFbGVtZW50KSB7XG4gICAgbGV0IGZvcmNlTmF0dXJhbFNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIGNvbnN0IGltYWdlID0gaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQpICYmIF90aGlzMTMuaW1hZ2VDYWNoZS5nZXQoaW1hZ2VFbGVtZW50LmZpbGVJZCk/LmltYWdlO1xuXG4gICAgaWYgKCFpbWFnZSB8fCBpbWFnZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIGlmIChpbWFnZUVsZW1lbnQud2lkdGggPCBEUkFHR0lOR19USFJFU0hPTEQgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUgJiYgaW1hZ2VFbGVtZW50LmhlaWdodCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSkge1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlclNpemUgPSAxMDAgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCB7XG4gICAgICAgICAgeDogaW1hZ2VFbGVtZW50LnggLSBwbGFjZWhvbGRlclNpemUgLyAyLFxuICAgICAgICAgIHk6IGltYWdlRWxlbWVudC55IC0gcGxhY2Vob2xkZXJTaXplIC8gMixcbiAgICAgICAgICB3aWR0aDogcGxhY2Vob2xkZXJTaXplLFxuICAgICAgICAgIGhlaWdodDogcGxhY2Vob2xkZXJTaXplXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZvcmNlTmF0dXJhbFNpemUgfHwgLy8gaWYgdXNlci1jcmVhdGVkIGJvdW5kaW5nIGJveCBpcyBiZWxvdyB0aHJlc2hvbGQsIGFzc3VtZSB0aGVcbiAgICAvLyBpbnRlbnRpb24gd2FzIHRvIGNsaWNrIGluc3RlYWQgb2YgZHJhZywgYW5kIHVzZSB0aGUgaW1hZ2Unc1xuICAgIC8vIGludHJpbnNpYyBzaXplXG4gICAgaW1hZ2VFbGVtZW50LndpZHRoIDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlICYmIGltYWdlRWxlbWVudC5oZWlnaHQgPCBEUkFHR0lOR19USFJFU0hPTEQgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUpIHtcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IE1hdGgubWF4KF90aGlzMTMuc3RhdGUuaGVpZ2h0IC0gMTIwLCAxNjApOyAvLyBtYXggNjUlIG9mIGNhbnZhcyBoZWlnaHQsIGNsYW1wZWQgdG8gPDMwMHB4LCB2aCAtIDEyMHB4PlxuXG4gICAgICBjb25zdCBtYXhIZWlnaHQgPSBNYXRoLm1pbihtaW5IZWlnaHQsIE1hdGguZmxvb3IoX3RoaXMxMy5zdGF0ZS5oZWlnaHQgKiAwLjUpIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWluKGltYWdlLm5hdHVyYWxIZWlnaHQsIG1heEhlaWdodCk7XG4gICAgICBjb25zdCB3aWR0aCA9IGhlaWdodCAqIChpbWFnZS5uYXR1cmFsV2lkdGggLyBpbWFnZS5uYXR1cmFsSGVpZ2h0KTsgLy8gYWRkIGN1cnJlbnQgaW1hZ2VFbGVtZW50IHdpZHRoL2hlaWdodCB0byBhY2NvdW50IGZvciBwcmV2aW91cyBjZW50ZXJpbmdcbiAgICAgIC8vIG9mIHRoZSBwbGFjZWhvbGRlciBpbWFnZVxuXG4gICAgICBjb25zdCB4ID0gaW1hZ2VFbGVtZW50LnggKyBpbWFnZUVsZW1lbnQud2lkdGggLyAyIC0gd2lkdGggLyAyO1xuICAgICAgY29uc3QgeSA9IGltYWdlRWxlbWVudC55ICsgaW1hZ2VFbGVtZW50LmhlaWdodCAvIDIgLSBoZWlnaHQgLyAyO1xuICAgICAgbXV0YXRlRWxlbWVudChpbWFnZUVsZW1lbnQsIHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMudXBkYXRlSW1hZ2VDYWNoZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYxNiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoZWxlbWVudHMpIHtcbiAgICAgIGxldCBmaWxlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogX3RoaXMxMy5maWxlcztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdXBkYXRlZEZpbGVzLFxuICAgICAgICBlcnJvcmVkRmlsZXNcbiAgICAgIH0gPSB5aWVsZCBfdXBkYXRlSW1hZ2VDYWNoZSh7XG4gICAgICAgIGltYWdlQ2FjaGU6IF90aGlzMTMuaW1hZ2VDYWNoZSxcbiAgICAgICAgZmlsZUlkczogZWxlbWVudHMubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZmlsZUlkO1xuICAgICAgICB9KSxcbiAgICAgICAgZmlsZXNcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodXBkYXRlZEZpbGVzLnNpemUgfHwgZXJyb3JlZEZpbGVzLnNpemUpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgaWYgKHVwZGF0ZWRGaWxlcy5oYXMoZWxlbWVudC5maWxlSWQpKSB7XG4gICAgICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3JlZEZpbGVzLnNpemUpIHtcbiAgICAgICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChlbGVtZW50KSAmJiBlcnJvcmVkRmlsZXMuaGFzKGVsZW1lbnQuZmlsZUlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKGVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBcImVycm9yXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVwZGF0ZWRGaWxlcyxcbiAgICAgICAgZXJyb3JlZEZpbGVzXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDEwKSB7XG4gICAgICByZXR1cm4gX3JlZjE2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSgpO1xuXG4gIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlID0gLyojX19QVVJFX18qL19hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoKSB7XG4gICAgbGV0IGltYWdlRWxlbWVudHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpKTtcbiAgICBsZXQgZmlsZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IF90aGlzMTMuZmlsZXM7XG4gICAgY29uc3QgdW5jYWNoZWRJbWFnZUVsZW1lbnRzID0gaW1hZ2VFbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiAhZWxlbWVudC5pc0RlbGV0ZWQgJiYgIV90aGlzMTMuaW1hZ2VDYWNoZS5oYXMoZWxlbWVudC5maWxlSWQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHVuY2FjaGVkSW1hZ2VFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdXBkYXRlZEZpbGVzXG4gICAgICB9ID0geWllbGQgX3RoaXMxMy51cGRhdGVJbWFnZUNhY2hlKHVuY2FjaGVkSW1hZ2VFbGVtZW50cywgZmlsZXMpO1xuXG4gICAgICBpZiAodXBkYXRlZEZpbGVzLnNpemUpIHtcbiAgICAgICAgX3RoaXMxMy5zY2VuZS5pbmZvcm1NdXRhdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHRoaXMuc2NoZWR1bGVJbWFnZVJlZnJlc2ggPSB0aHJvdHRsZShmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgfSwgSU1BR0VfUkVOREVSX1RJTUVPVVQpO1xuXG4gIHRoaXMudXBkYXRlQmluZGluZ0VuYWJsZWRPblBvaW50ZXJNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgY29uc3Qgc2hvdWxkRW5hYmxlQmluZGluZyA9IHNob3VsZEVuYWJsZUJpbmRpbmdGb3JQb2ludGVyRXZlbnQoZXZlbnQpO1xuXG4gICAgaWYgKF90aGlzMTMuc3RhdGUuaXNCaW5kaW5nRW5hYmxlZCAhPT0gc2hvdWxkRW5hYmxlQmluZGluZykge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzQmluZGluZ0VuYWJsZWQ6IHNob3VsZEVuYWJsZUJpbmRpbmdcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvciA9IGZ1bmN0aW9uIChwb2ludGVyQ29vcmRzKSB7XG4gICAgY29uc3QgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhwb2ludGVyQ29vcmRzLCBfdGhpczEzLnNjZW5lKTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgIT0gbnVsbCA/IFtob3ZlcmVkQmluZGFibGVFbGVtZW50XSA6IFtdXG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nc0ZvckxpbmVhckVsZW1lbnRBdENvb3JkcyA9IGZ1bmN0aW9uIChsaW5lYXJFbGVtZW50LCBwb2ludGVyQ29vcmRzLCBvcHBvc2l0ZUJpbmRpbmdCb3VuZEVsZW1lbnQpIHtcbiAgICBpZiAoIXBvaW50ZXJDb29yZHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3VnZ2VzdGVkQmluZGluZ3MgPSBwb2ludGVyQ29vcmRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBjb29yZHMpIHtcbiAgICAgIGNvbnN0IGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoY29vcmRzLCBfdGhpczEzLnNjZW5lKTtcblxuICAgICAgaWYgKGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgIT0gbnVsbCAmJiAhaXNMaW5lYXJFbGVtZW50U2ltcGxlQW5kQWxyZWFkeUJvdW5kKGxpbmVhckVsZW1lbnQsIG9wcG9zaXRlQmluZGluZ0JvdW5kRWxlbWVudD8uaWQsIGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQpKSB7XG4gICAgICAgIGFjYy5wdXNoKGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgc3VnZ2VzdGVkQmluZGluZ3NcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZUNhbnZhc1JlZiA9IGZ1bmN0aW9uIChjYW52YXMpIHtcbiAgICAvLyBjYW52YXMgaXMgbnVsbCB3aGVuIHVubW91bnRpbmdcbiAgICBpZiAoY2FudmFzICE9PSBudWxsKSB7XG4gICAgICBfdGhpczEzLmNhbnZhcyA9IGNhbnZhcztcbiAgICAgIF90aGlzMTMucmMgPSByb3VnaC5jYW52YXMoX3RoaXMxMy5jYW52YXMpO1xuXG4gICAgICBfdGhpczEzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULldIRUVMLCBfdGhpczEzLmhhbmRsZVdoZWVsLCB7XG4gICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5UT1VDSF9TVEFSVCwgX3RoaXMxMy5vblRhcFN0YXJ0KTtcblxuICAgICAgX3RoaXMxMy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5UT1VDSF9FTkQsIF90aGlzMTMub25UYXBFbmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpczEzLmNhbnZhcz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5XSEVFTCwgX3RoaXMxMy5oYW5kbGVXaGVlbCk7XG4gICAgICBfdGhpczEzLmNhbnZhcz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5UT1VDSF9TVEFSVCwgX3RoaXMxMy5vblRhcFN0YXJ0KTtcbiAgICAgIF90aGlzMTMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX0VORCwgX3RoaXMxMy5vblRhcEVuZCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlQXBwT25Ecm9wID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjE4ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChldmVudCkge1xuICAgICAgaWYgKF90aGlzMTMucHJvcHMub25Ecm9wKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCh5aWVsZCBfdGhpczEzLnByb3BzLm9uRHJvcChldmVudCkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gbXVzdCBiZSByZXRyaWV2ZWQgZmlyc3QsIGluIHRoZSBzYW1lIGZyYW1lXG5cblxuICAgICAgY29uc3Qge1xuICAgICAgICBmaWxlLFxuICAgICAgICBmaWxlSGFuZGxlXG4gICAgICB9ID0geWllbGQgZ2V0RmlsZUZyb21FdmVudChldmVudCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChpc1N1cHBvcnRlZEltYWdlRmlsZShmaWxlKSkge1xuICAgICAgICAgIC8vIGZpcnN0IGF0dGVtcHQgdG8gZGVjb2RlIHNjZW5lIGZyb20gdGhlIGltYWdlIGlmIGl0J3MgZW1iZWRkZWRcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICBpZiAoZmlsZT8udHlwZSA9PT0gTUlNRV9UWVBFUy5wbmcgfHwgZmlsZT8udHlwZSA9PT0gTUlNRV9UWVBFUy5zdmcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNjZW5lID0geWllbGQgbG9hZEZyb21CbG9iKGZpbGUsIF90aGlzMTMuc3RhdGUsIF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIGZpbGVIYW5kbGUpO1xuXG4gICAgICAgICAgICAgIF90aGlzMTMuc3luY0FjdGlvblJlc3VsdChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lKSwge30sIHtcbiAgICAgICAgICAgICAgICBhcHBTdGF0ZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzY2VuZS5hcHBTdGF0ZSB8fCBfdGhpczEzLnN0YXRlKSwge30sIHtcbiAgICAgICAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICByZXBsYWNlRmlsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlXG4gICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBpZiAoZXJyb3IubmFtZSAhPT0gXCJFbmNvZGluZ0Vycm9yXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gaWYgbm8gc2NlbmUgaXMgZW1iZWRkZWQgb3Igd2UgZmFpbCBmb3Igd2hhdGV2ZXIgcmVhc29uLCBmYWxsIGJhY2tcbiAgICAgICAgICAvLyB0byBpbXBvcnRpbmcgYXMgcmVndWxhciBpbWFnZVxuICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB4OiBzY2VuZVgsXG4gICAgICAgICAgICB5OiBzY2VuZVlcbiAgICAgICAgICB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCBfdGhpczEzLnN0YXRlKTtcblxuICAgICAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IF90aGlzMTMuY3JlYXRlSW1hZ2VFbGVtZW50KHtcbiAgICAgICAgICAgIHNjZW5lWCxcbiAgICAgICAgICAgIHNjZW5lWVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMxMy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBmaWxlKTtcblxuICAgICAgICAgIF90aGlzMTMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuXG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgW2ltYWdlRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsaWJyYXJ5SlNPTiA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYik7XG5cbiAgICAgIGlmIChsaWJyYXJ5SlNPTiAmJiB0eXBlb2YgbGlicmFyeUpTT04gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBsaWJyYXJ5SXRlbXMgPSBwYXJzZUxpYnJhcnlKU09OKGxpYnJhcnlKU09OKTtcblxuICAgICAgICAgIF90aGlzMTMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgICAgZWxlbWVudHM6IGRpc3RyaWJ1dGVMaWJyYXJ5SXRlbXNPblNxdWFyZUdyaWQobGlicmFyeUl0ZW1zKSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBldmVudCxcbiAgICAgICAgICAgIGZpbGVzOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgLy8gYXRldG1wdCB0byBwYXJzZSBhbiBleGNhbGlkcmF3L2V4Y2FsaWRyYXdsaWIgZmlsZVxuICAgICAgICB5aWVsZCBfdGhpczEzLmxvYWRGaWxlVG9DYW52YXMoZmlsZSwgZmlsZUhhbmRsZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94MTEpIHtcbiAgICAgIHJldHVybiBfcmVmMTguYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5sb2FkRmlsZVRvQ2FudmFzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjE5ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChmaWxlLCBmaWxlSGFuZGxlKSB7XG4gICAgICBmaWxlID0geWllbGQgbm9ybWFsaXplRmlsZShmaWxlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmV0ID0geWllbGQgbG9hZFNjZW5lT3JMaWJyYXJ5RnJvbUJsb2IoZmlsZSwgX3RoaXMxMy5zdGF0ZSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgZmlsZUhhbmRsZSk7XG5cbiAgICAgICAgaWYgKHJldC50eXBlID09PSBNSU1FX1RZUEVTLmV4Y2FsaWRyYXcpIHtcbiAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGlzTG9hZGluZzogdHJ1ZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMxMy5zeW5jQWN0aW9uUmVzdWx0KF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcmV0LmRhdGEpLCB7fSwge1xuICAgICAgICAgICAgYXBwU3RhdGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcmV0LmRhdGEuYXBwU3RhdGUgfHwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHJldC50eXBlID09PSBNSU1FX1RZUEVTLmV4Y2FsaWRyYXdsaWIpIHtcbiAgICAgICAgICB5aWVsZCBfdGhpczEzLmxpYnJhcnkudXBkYXRlTGlicmFyeSh7XG4gICAgICAgICAgICBsaWJyYXJ5SXRlbXM6IGZpbGUsXG4gICAgICAgICAgICBtZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIG9wZW5MaWJyYXJ5TWVudTogdHJ1ZVxuICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG5cbiAgICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHQoXCJlcnJvcnMuaW1wb3J0TGlicmFyeUVycm9yXCIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94MTIsIF94MTMpIHtcbiAgICAgIHJldHVybiBfcmVmMTkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoKGV2ZW50Lm5hdGl2ZUV2ZW50LnBvaW50ZXJUeXBlID09PSBcInRvdWNoXCIgfHwgZXZlbnQubmF0aXZlRXZlbnQucG9pbnRlclR5cGUgPT09IFwicGVuXCIgJiYgLy8gYWx3YXlzIGFsbG93IGlmIHVzZXIgdXNlcyBhIHBlbiBzZWNvbmRhcnkgYnV0dG9uXG4gICAgZXZlbnQuYnV0dG9uICE9PSBQT0lOVEVSX0JVVFRPTi5TRUNPTkRBUlkpICYmIF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHlcbiAgICB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCBfdGhpczEzLnN0YXRlKTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBfdGhpczEzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHgsIHksIHtcbiAgICAgIHByZWZlclNlbGVjdGVkOiB0cnVlLFxuICAgICAgaW5jbHVkZUxvY2tlZEVsZW1lbnRzOiB0cnVlXG4gICAgfSk7XG5cbiAgICBjb25zdCB0eXBlID0gZWxlbWVudCA/IFwiZWxlbWVudFwiIDogXCJjYW52YXNcIjtcbiAgICBjb25zdCBjb250YWluZXIgPSBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICBjb25zdCB7XG4gICAgICB0b3A6IG9mZnNldFRvcCxcbiAgICAgIGxlZnQ6IG9mZnNldExlZnRcbiAgICB9ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGxlZnQgPSBldmVudC5jbGllbnRYIC0gb2Zmc2V0TGVmdDtcbiAgICBjb25zdCB0b3AgPSBldmVudC5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuXG4gICAgaWYgKGVsZW1lbnQgJiYgIV90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2VsZW1lbnQuaWRdKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLnN0YXRlKSwge30sIHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgW2VsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pLCBfdGhpczEzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczEzLl9vcGVuQ29udGV4dE1lbnUoe1xuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0XG4gICAgICAgIH0sIHR5cGUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzMTMuX29wZW5Db250ZXh0TWVudSh7XG4gICAgICAgIHRvcCxcbiAgICAgICAgbGVmdFxuICAgICAgfSwgdHlwZSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQgPSBmdW5jdGlvbiAocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpIHtcbiAgICBjb25zdCBkcmFnZ2luZ0VsZW1lbnQgPSBfdGhpczEzLnN0YXRlLmRyYWdnaW5nRWxlbWVudDtcbiAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzO1xuXG4gICAgaWYgKCFkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZHJhZ2dpbmdFbGVtZW50LnR5cGUgPT09IFwic2VsZWN0aW9uXCIgJiYgX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgIT09IFwiZXJhc2VyXCIpIHtcbiAgICAgIGRyYWdOZXdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwgX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIHBvaW50ZXJDb29yZHMueCwgcG9pbnRlckNvb3Jkcy55LCBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyQ29vcmRzLngpLCBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBwb2ludGVyQ29vcmRzLnkpLCBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSwgc2hvdWxkUmVzaXplRnJvbUNlbnRlcihldmVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgICBjb25zdCBpbWFnZSA9IGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSAmJiBfdGhpczEzLmltYWdlQ2FjaGUuZ2V0KGRyYWdnaW5nRWxlbWVudC5maWxlSWQpPy5pbWFnZTtcbiAgICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gaW1hZ2UgJiYgIShpbWFnZSBpbnN0YW5jZW9mIFByb21pc2UpID8gaW1hZ2Uud2lkdGggLyBpbWFnZS5oZWlnaHQgOiBudWxsO1xuICAgICAgZHJhZ05ld0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCBfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueSwgZ3JpZFgsIGdyaWRZLCBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC54LCBncmlkWCksIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLnksIGdyaWRZKSwgaXNJbWFnZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSA/ICFzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSA6IHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLCBzaG91bGRSZXNpemVGcm9tQ2VudGVyKGV2ZW50KSwgYXNwZWN0UmF0aW8pO1xuXG4gICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoW2RyYWdnaW5nRWxlbWVudF0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLm1heWJlSGFuZGxlUmVzaXplID0gZnVuY3Rpb24gKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgY29uc3QgdHJhbnNmb3JtSGFuZGxlVHlwZSA9IHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGU7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIC8vIFRPRE86IHJlbmFtZSB0aGlzIHN0YXRlIGZpZWxkIHRvIFwiaXNTY2FsaW5nXCIgdG8gZGlzdGluZ3Vpc2hcbiAgICAgIC8vIGl0IGZyb20gdGhlIGdlbmVyaWMgXCJpc1Jlc2l6aW5nXCIgd2hpY2ggaW5jbHVkZXMgc2NhbGluZyBhbmRcbiAgICAgIC8vIHJvdGF0aW5nXG4gICAgICBpc1Jlc2l6aW5nOiB0cmFuc2Zvcm1IYW5kbGVUeXBlICYmIHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwicm90YXRpb25cIixcbiAgICAgIGlzUm90YXRpbmc6IHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwicm90YXRpb25cIlxuICAgIH0pO1xuXG4gICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3JkcztcbiAgICBjb25zdCBbcmVzaXplWCwgcmVzaXplWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckNvb3Jkcy54IC0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0LngsIHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLm9mZnNldC55LCBfdGhpczEzLnN0YXRlLmdyaWRTaXplKTtcblxuICAgIGlmICh0cmFuc2Zvcm1FbGVtZW50cyhwb2ludGVyRG93blN0YXRlLCB0cmFuc2Zvcm1IYW5kbGVUeXBlLCBzZWxlY3RlZEVsZW1lbnRzLCBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5hcnJvd0RpcmVjdGlvbiwgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUoZXZlbnQpLCBzaG91bGRSZXNpemVGcm9tQ2VudGVyKGV2ZW50KSwgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgaXNJbWFnZUVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkgPyAhc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudCkgOiBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSwgcmVzaXplWCwgcmVzaXplWSwgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuY2VudGVyLngsIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmNlbnRlci55KSkge1xuICAgICAgX3RoaXMxMy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgdGhpcy5fb3BlbkNvbnRleHRNZW51ID0gZnVuY3Rpb24gKF9yZWYyMCwgdHlwZSkge1xuICAgIGxldCB7XG4gICAgICBsZWZ0LFxuICAgICAgdG9wXG4gICAgfSA9IF9yZWYyMDtcblxuICAgIGlmIChfdGhpczEzLnN0YXRlLnNob3dIeXBlcmxpbmtQb3B1cCkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHNob3dIeXBlcmxpbmtQb3B1cDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIF90aGlzMTMuY29udGV4dE1lbnVPcGVuID0gdHJ1ZTtcbiAgICBjb25zdCBtYXliZUdyb3VwQWN0aW9uID0gYWN0aW9uR3JvdXAuY29udGV4dEl0ZW1QcmVkaWNhdGUoX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSk7XG4gICAgY29uc3QgbWF5YmVVbmdyb3VwQWN0aW9uID0gYWN0aW9uVW5ncm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZShfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpKTtcbiAgICBjb25zdCBtYXliZUZsaXBIb3Jpem9udGFsID0gYWN0aW9uRmxpcEhvcml6b250YWwuY29udGV4dEl0ZW1QcmVkaWNhdGUoX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSk7XG4gICAgY29uc3QgbWF5YmVGbGlwVmVydGljYWwgPSBhY3Rpb25GbGlwVmVydGljYWwuY29udGV4dEl0ZW1QcmVkaWNhdGUoX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSk7XG4gICAgY29uc3QgbWF5QmVBbGxvd1VuYmluZGluZyA9IGFjdGlvblVuYmluZFRleHQuY29udGV4dEl0ZW1QcmVkaWNhdGUoX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSk7XG4gICAgY29uc3QgbWF5QmVBbGxvd0JpbmRpbmcgPSBhY3Rpb25CaW5kVGV4dC5jb250ZXh0SXRlbVByZWRpY2F0ZShfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpKTtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSBcInNlcGFyYXRvclwiO1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IFtdO1xuXG4gICAgaWYgKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9wdGlvbnMucHVzaChhY3Rpb25Db3B5QXNQbmcpO1xuICAgIH1cblxuICAgIGlmIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9wdGlvbnMucHVzaChhY3Rpb25Db3B5QXNTdmcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcImVsZW1lbnRcIiAmJiBjb3B5VGV4dC5jb250ZXh0SXRlbVByZWRpY2F0ZShlbGVtZW50cywgX3RoaXMxMy5zdGF0ZSkgJiYgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZFdyaXRlVGV4dCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGNvcHlUZXh0KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJjYW52YXNcIikge1xuICAgICAgY29uc3Qgdmlld01vZGVPcHRpb25zID0gWy4uLm9wdGlvbnMsIHR5cGVvZiBfdGhpczEzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiBhY3Rpb25Ub2dnbGVHcmlkTW9kZSwgdHlwZW9mIF90aGlzMTMucHJvcHMuemVuTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlWmVuTW9kZSwgdHlwZW9mIF90aGlzMTMucHJvcHMudmlld01vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIGFjdGlvblRvZ2dsZVZpZXdNb2RlLCBhY3Rpb25Ub2dnbGVTdGF0c107XG5cbiAgICAgIGlmIChfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBDb250ZXh0TWVudS5wdXNoKHtcbiAgICAgICAgICBvcHRpb25zOiB2aWV3TW9kZU9wdGlvbnMsXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgYWN0aW9uTWFuYWdlcjogX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICAgIGFwcFN0YXRlOiBfdGhpczEzLnN0YXRlLFxuICAgICAgICAgIGNvbnRhaW5lcjogX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgICAgICAgZWxlbWVudHNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDb250ZXh0TWVudS5wdXNoKHtcbiAgICAgICAgICBvcHRpb25zOiBbX3RoaXMxMy5kZXZpY2UuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiB7XG4gICAgICAgICAgICB0cmFja0V2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWU6IFwicGFzdGVcIixcbiAgICAgICAgICAgIHBlcmZvcm06IGZ1bmN0aW9uIChlbGVtZW50cywgYXBwU3RhdGVzKSB7XG4gICAgICAgICAgICAgIF90aGlzMTMucGFzdGVGcm9tQ2xpcGJvYXJkKG51bGwpO1xuXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiBmYWxzZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLnBhc3RlXCJcbiAgICAgICAgICB9LCBfdGhpczEzLmRldmljZS5pc01vYmlsZSAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHNlcGFyYXRvciwgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiYgZWxlbWVudHMubGVuZ3RoID4gMCAmJiBhY3Rpb25Db3B5QXNQbmcsIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgZWxlbWVudHMubGVuZ3RoID4gMCAmJiBhY3Rpb25Db3B5QXNTdmcsIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwICYmIGNvcHlUZXh0LCAocHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiYgZWxlbWVudHMubGVuZ3RoID4gMCB8fCBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApICYmIHNlcGFyYXRvciwgYWN0aW9uU2VsZWN0QWxsLCBzZXBhcmF0b3IsIHR5cGVvZiBfdGhpczEzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiBhY3Rpb25Ub2dnbGVHcmlkTW9kZSwgdHlwZW9mIF90aGlzMTMucHJvcHMuemVuTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlWmVuTW9kZSwgdHlwZW9mIF90aGlzMTMucHJvcHMudmlld01vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIGFjdGlvblRvZ2dsZVZpZXdNb2RlLCBhY3Rpb25Ub2dnbGVTdGF0c10sXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgYWN0aW9uTWFuYWdlcjogX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICAgIGFwcFN0YXRlOiBfdGhpczEzLnN0YXRlLFxuICAgICAgICAgIGNvbnRhaW5lcjogX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgICAgICAgZWxlbWVudHNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImVsZW1lbnRcIikge1xuICAgICAgaWYgKF90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICAgIG9wdGlvbnM6IFtuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIGFjdGlvbkNvcHksIC4uLm9wdGlvbnNdLFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IF90aGlzMTMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICBhcHBTdGF0ZTogX3RoaXMxMy5zdGF0ZSxcbiAgICAgICAgICBjb250YWluZXI6IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgICAgIGVsZW1lbnRzXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW190aGlzMTMuZGV2aWNlLmlzTW9iaWxlICYmIGFjdGlvbkN1dCwgX3RoaXMxMy5kZXZpY2UuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBhY3Rpb25Db3B5LCBfdGhpczEzLmRldmljZS5pc01vYmlsZSAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHtcbiAgICAgICAgICAgIG5hbWU6IFwicGFzdGVcIixcbiAgICAgICAgICAgIHRyYWNrRXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgcGVyZm9ybTogZnVuY3Rpb24gKGVsZW1lbnRzLCBhcHBTdGF0ZXMpIHtcbiAgICAgICAgICAgICAgX3RoaXMxMy5wYXN0ZUZyb21DbGlwYm9hcmQobnVsbCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMucGFzdGVcIlxuICAgICAgICAgIH0sIF90aGlzMTMuZGV2aWNlLmlzTW9iaWxlICYmIHNlcGFyYXRvciwgLi4ub3B0aW9ucywgc2VwYXJhdG9yLCBhY3Rpb25Db3B5U3R5bGVzLCBhY3Rpb25QYXN0ZVN0eWxlcywgc2VwYXJhdG9yLCBtYXliZUdyb3VwQWN0aW9uICYmIGFjdGlvbkdyb3VwLCBtYXlCZUFsbG93VW5iaW5kaW5nICYmIGFjdGlvblVuYmluZFRleHQsIG1heUJlQWxsb3dCaW5kaW5nICYmIGFjdGlvbkJpbmRUZXh0LCBtYXliZVVuZ3JvdXBBY3Rpb24gJiYgYWN0aW9uVW5ncm91cCwgKG1heWJlR3JvdXBBY3Rpb24gfHwgbWF5YmVVbmdyb3VwQWN0aW9uKSAmJiBzZXBhcmF0b3IsIGFjdGlvbkFkZFRvTGlicmFyeSwgc2VwYXJhdG9yLCBhY3Rpb25TZW5kQmFja3dhcmQsIGFjdGlvbkJyaW5nRm9yd2FyZCwgYWN0aW9uU2VuZFRvQmFjaywgYWN0aW9uQnJpbmdUb0Zyb250LCBzZXBhcmF0b3IsIG1heWJlRmxpcEhvcml6b250YWwgJiYgYWN0aW9uRmxpcEhvcml6b250YWwsIG1heWJlRmxpcFZlcnRpY2FsICYmIGFjdGlvbkZsaXBWZXJ0aWNhbCwgKG1heWJlRmxpcEhvcml6b250YWwgfHwgbWF5YmVGbGlwVmVydGljYWwpICYmIHNlcGFyYXRvciwgYWN0aW9uTGluay5jb250ZXh0SXRlbVByZWRpY2F0ZShlbGVtZW50cywgX3RoaXMxMy5zdGF0ZSkgJiYgYWN0aW9uTGluaywgYWN0aW9uRHVwbGljYXRlU2VsZWN0aW9uLCBhY3Rpb25Ub2dnbGVMb2NrLCBzZXBhcmF0b3IsIGFjdGlvbkRlbGV0ZVNlbGVjdGVkXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiBfdGhpczEzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IF90aGlzMTMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgICAgICBlbGVtZW50c1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVXaGVlbCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKGlzUGFubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWVxuICAgIH0gPSBldmVudDsgLy8gbm90ZSB0aGF0IGV2ZW50LmN0cmxLZXkgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBwaW5jaCB6b29taW5nXG5cbiAgICBpZiAoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSB7XG4gICAgICBjb25zdCBzaWduID0gTWF0aC5zaWduKGRlbHRhWSk7XG4gICAgICBjb25zdCBNQVhfU1RFUCA9IDEwO1xuICAgICAgY29uc3QgYWJzRGVsdGEgPSBNYXRoLmFicyhkZWx0YVkpO1xuICAgICAgbGV0IGRlbHRhID0gZGVsdGFZO1xuXG4gICAgICBpZiAoYWJzRGVsdGEgPiBNQVhfU1RFUCkge1xuICAgICAgICBkZWx0YSA9IE1BWF9TVEVQICogc2lnbjtcbiAgICAgIH1cblxuICAgICAgbGV0IG5ld1pvb20gPSBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUgLSBkZWx0YSAvIDEwMDsgLy8gaW5jcmVhc2Ugem9vbSBzdGVwcyB0aGUgbW9yZSB6b29tZWQtaW4gd2UgYXJlIChhcHBsaWVzIHRvID4xMDAlIG9ubHkpXG5cbiAgICAgIG5ld1pvb20gKz0gTWF0aC5sb2cxMChNYXRoLm1heCgxLCBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUpKSAqIC1zaWduICogLy8gcmVkdWNlZCBhbXBsaWZpY2F0aW9uIGZvciBzbWFsbCBkZWx0YXMgKHNtYWxsIG1vdmVtZW50cyBvbiBhIHRyYWNrcGFkKVxuICAgICAgTWF0aC5taW4oMSwgYWJzRGVsdGEgLyAyMCk7XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdldFN0YXRlRm9yWm9vbSh7XG4gICAgICAgICAgdmlld3BvcnRYOiBjdXJzb3JYLFxuICAgICAgICAgIHZpZXdwb3J0WTogY3Vyc29yWSxcbiAgICAgICAgICBuZXh0Wm9vbTogZ2V0Tm9ybWFsaXplZFpvb20obmV3Wm9vbSlcbiAgICAgICAgfSwgc3RhdGUpKSwge30sIHtcbiAgICAgICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBzY3JvbGwgaG9yaXpvbnRhbGx5IHdoZW4gc2hpZnQgcHJlc3NlZFxuXG5cbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYyMSkge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHpvb20sXG4gICAgICAgICAgc2Nyb2xsWFxuICAgICAgICB9ID0gX3JlZjIxO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC8vIG9uIE1hYywgc2hpZnQrd2hlZWwgdGVuZHMgdG8gcmVzdWx0IGluIGRlbHRhWFxuICAgICAgICAgIHNjcm9sbFg6IHNjcm9sbFggLSAoZGVsdGFZIHx8IGRlbHRhWCkgLyB6b29tLnZhbHVlXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYyMikge1xuICAgICAgbGV0IHtcbiAgICAgICAgem9vbSxcbiAgICAgICAgc2Nyb2xsWCxcbiAgICAgICAgc2Nyb2xsWVxuICAgICAgfSA9IF9yZWYyMjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjcm9sbFg6IHNjcm9sbFggLSBkZWx0YVggLyB6b29tLnZhbHVlLFxuICAgICAgICBzY3JvbGxZOiBzY3JvbGxZIC0gZGVsdGFZIC8gem9vbS52YWx1ZVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhpcy5zYXZlUG9pbnRlciA9IGZ1bmN0aW9uICh4LCB5LCBidXR0b24pIHtcbiAgICBpZiAoIXggfHwgIXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKHtcbiAgICAgIGNsaWVudFg6IHgsXG4gICAgICBjbGllbnRZOiB5XG4gICAgfSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBpZiAoaXNOYU4ocG9pbnRlci54KSB8fCBpc05hTihwb2ludGVyLnkpKSB7Ly8gc29tZXRpbWVzIHRoZSBwb2ludGVyIGdvZXMgb2ZmIHNjcmVlblxuICAgIH1cblxuICAgIF90aGlzMTMucHJvcHMub25Qb2ludGVyVXBkYXRlPy4oe1xuICAgICAgcG9pbnRlcixcbiAgICAgIGJ1dHRvbixcbiAgICAgIHBvaW50ZXJzTWFwOiBnZXN0dXJlLnBvaW50ZXJzXG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCA9IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIV90aGlzMTMudW5tb3VudGVkKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCAzMDApO1xuXG4gIHRoaXMudXBkYXRlRE9NUmVjdCA9IGZ1bmN0aW9uIChjYikge1xuICAgIGlmIChfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGV4Y2FsaWRyYXdDb250YWluZXIgPSBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgbGVmdDogb2Zmc2V0TGVmdCxcbiAgICAgICAgdG9wOiBvZmZzZXRUb3BcbiAgICAgIH0gPSBleGNhbGlkcmF3Q29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qge1xuICAgICAgICB3aWR0aDogY3VycmVudFdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGN1cnJlbnRIZWlnaHQsXG4gICAgICAgIG9mZnNldFRvcDogY3VycmVudE9mZnNldFRvcCxcbiAgICAgICAgb2Zmc2V0TGVmdDogY3VycmVudE9mZnNldExlZnRcbiAgICAgIH0gPSBfdGhpczEzLnN0YXRlO1xuXG4gICAgICBpZiAod2lkdGggPT09IGN1cnJlbnRXaWR0aCAmJiBoZWlnaHQgPT09IGN1cnJlbnRIZWlnaHQgJiYgb2Zmc2V0TGVmdCA9PT0gY3VycmVudE9mZnNldExlZnQgJiYgb2Zmc2V0VG9wID09PSBjdXJyZW50T2Zmc2V0VG9wKSB7XG4gICAgICAgIGlmIChjYikge1xuICAgICAgICAgIGNiKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBvZmZzZXRMZWZ0LFxuICAgICAgICBvZmZzZXRUb3BcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2IgJiYgY2IoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5zZXRTdGF0ZShfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLmdldENhbnZhc09mZnNldHMoKSkpO1xuICB9O1xufTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuVEVTVCB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLkRFVkVMT1BNRU5UKSB7XG4gIHdpbmRvdy5oID0gd2luZG93LmggfHwge307XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdpbmRvdy5oLCB7XG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblxuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHA/LnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpO1xuICAgICAgfSxcblxuICAgICAgc2V0KGVsZW1lbnRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcD8uc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgICAgIH1cblxuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFwcDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///../../components/App.tsx\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../components/App.tsx?");
|
|
1952
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"default\\\": () => (__WEBPACK_DEFAULT_EXPORT__),\\n/* harmony export */ \\\"showFourthFont\\\": () => (/* binding */ showFourthFont),\\n/* harmony export */ \\\"useDevice\\\": () => (/* binding */ useDevice),\\n/* harmony export */ \\\"useExcalidrawContainer\\\": () => (/* binding */ useExcalidrawContainer)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \\\"../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\\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 roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! roughjs/bin/rough */ \\\"../../../node_modules/roughjs/bin/rough.js\\\");\\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \\\"../../../node_modules/clsx/dist/clsx.m.js\\\");\\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! nanoid */ \\\"../../../node_modules/nanoid/index.browser.js\\\");\\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions */ \\\"../../actions/index.ts\\\");\\n/* harmony import */ var _actions_actionHistory__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/actionHistory */ \\\"../../actions/actionHistory.tsx\\\");\\n/* harmony import */ var _actions_manager__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/manager */ \\\"../../actions/manager.tsx\\\");\\n/* harmony import */ var _actions_register__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../actions/register */ \\\"../../actions/register.ts\\\");\\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../analytics */ \\\"../../analytics.ts\\\");\\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../appState */ \\\"../../appState.ts\\\");\\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../clipboard */ \\\"../../clipboard.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../data */ \\\"../../data/index.ts\\\");\\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../data/library */ \\\"../../data/library.ts\\\");\\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../data/restore */ \\\"../../data/restore.ts\\\");\\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../element */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../element/binding */ \\\"../../element/binding.ts\\\");\\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../element/linearElementEditor */ \\\"../../element/linearElementEditor.ts\\\");\\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../element/mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/newElement */ \\\"../../element/newElement.ts\\\");\\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../element/typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _gesture__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../gesture */ \\\"../../gesture.ts\\\");\\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../groups */ \\\"../../groups.ts\\\");\\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../history */ \\\"../../history.ts\\\");\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../keys */ \\\"../../keys.ts\\\");\\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../math */ \\\"../../math.ts\\\");\\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../renderer/renderScene */ \\\"../../renderer/renderScene.ts\\\");\\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../renderer/renderElement */ \\\"../../renderer/renderElement.ts\\\");\\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../scene */ \\\"../../scene/index.ts\\\");\\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../scene/Scene */ \\\"../../scene/Scene.ts\\\");\\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../scene/zoom */ \\\"../../scene/zoom.ts\\\");\\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../shapes */ \\\"../../shapes.tsx\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _ContextMenu__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./ContextMenu */ \\\"../../components/ContextMenu.tsx\\\");\\n/* harmony import */ var _LayerUI__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./LayerUI */ \\\"../../components/LayerUI.tsx\\\");\\n/* harmony import */ var _Toast__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Toast */ \\\"../../components/Toast.tsx\\\");\\n/* harmony import */ var _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../actions/actionToggleViewMode */ \\\"../../actions/actionToggleViewMode.tsx\\\");\\n/* harmony import */ var _data_blob__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../data/blob */ \\\"../../data/blob.ts\\\");\\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../element/image */ \\\"../../element/image.ts\\\");\\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! lodash.throttle */ \\\"../../../node_modules/lodash.throttle/index.js\\\");\\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_42___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_42__);\\n/* harmony import */ var _data_filesystem__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../data/filesystem */ \\\"../../data/filesystem.ts\\\");\\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../element/textElement */ \\\"../../element/textElement.ts\\\");\\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../element/collision */ \\\"../../element/collision.ts\\\");\\n/* harmony import */ var _element_resizeElements__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../element/resizeElements */ \\\"../../element/resizeElements.ts\\\");\\n/* harmony import */ var _element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ../element/Hyperlink */ \\\"../../element/Hyperlink.tsx\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n\\r\\n\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n//zsviczian\\r\\nlet showFourthFont = false;\\r\\nconst deviceContextInitialValue = {\\r\\n isSmScreen: false,\\r\\n isMobile: false,\\r\\n isTouchScreen: false,\\r\\n canDeviceFitSidebar: false\\r\\n};\\r\\nconst DeviceContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createContext(deviceContextInitialValue);\\r\\nconst useDevice = function () {\\r\\n return (0,react__WEBPACK_IMPORTED_MODULE_2__.useContext)(DeviceContext);\\r\\n};\\r\\nconst ExcalidrawContainerContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createContext({\\r\\n container: null,\\r\\n id: null\\r\\n});\\r\\nconst useExcalidrawContainer = function () {\\r\\n return (0,react__WEBPACK_IMPORTED_MODULE_2__.useContext)(ExcalidrawContainerContext);\\r\\n};\\r\\nlet didTapTwice = false;\\r\\nlet tappedTwiceTimer = 0;\\r\\nlet cursorX = 0;\\r\\nlet cursorY = 0;\\r\\nlet isHoldingSpace = false;\\r\\nlet isPanning = false;\\r\\nlet isDraggingScrollBar = false;\\r\\nlet currentScrollBars = {\\r\\n horizontal: null,\\r\\n vertical: null\\r\\n};\\r\\nlet touchTimeout = 0;\\r\\nlet invalidateContextMenu = false; // remove this hack when we can sync render & resizeObserver (state update)\\r\\n// to rAF. See #5439\\r\\nlet THROTTLE_NEXT_RENDER = true;\\r\\nlet lastPointerUp = null;\\r\\nconst gesture = {\\r\\n pointers: new Map(),\\r\\n lastCenter: null,\\r\\n initialDistance: null,\\r\\n initialScale: null\\r\\n};\\r\\nclass App extends (react__WEBPACK_IMPORTED_MODULE_2___default().Component) {\\r\\n //zsviczian\\r\\n constructor(props) {\\r\\n var _a;\\r\\n var _this;\\r\\n super(props);\\r\\n _this = this;\\r\\n _initialiseProps.call(this);\\r\\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_11__.getDefaultAppState)();\\r\\n const { excalidrawRef, viewModeEnabled = false, zenModeEnabled = false, gridModeEnabled = false, theme = defaultAppState.theme, name = defaultAppState.name, trayModeEnabled = false //zsviczian\\r\\n } = props;\\r\\n this.state = _objectSpread(_objectSpread(_objectSpread({}, defaultAppState), {}, {\\r\\n theme,\\r\\n isLoading: true\\r\\n }, this.getCanvasOffsets()), {}, {\\r\\n viewModeEnabled,\\r\\n zenModeEnabled,\\r\\n trayModeEnabled,\\r\\n //zsviczian\\r\\n gridSize: gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_13__.GRID_SIZE : null,\\r\\n name,\\r\\n width: window.innerWidth,\\r\\n height: window.innerHeight,\\r\\n showHyperlinkPopup: false,\\r\\n isLibraryMenuDocked: false\\r\\n });\\r\\n this.id = (0,nanoid__WEBPACK_IMPORTED_MODULE_49__.nanoid)();\\r\\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_15__[\\\"default\\\"](this);\\r\\n if (excalidrawRef) {\\r\\n const readyPromise = \\\"current\\\" in excalidrawRef && ((_a = excalidrawRef.current) === null || _a === void 0 ? void 0 : _a.readyPromise) || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resolvablePromise)();\\r\\n const api = {\\r\\n ready: true,\\r\\n readyPromise,\\r\\n updateScene: this.updateScene,\\r\\n updateLibrary: this.library.updateLibrary,\\r\\n addFiles: this.addFiles,\\r\\n resetScene: this.resetScene,\\r\\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\\r\\n history: {\\r\\n clear: this.resetHistory\\r\\n },\\r\\n scrollToContent: this.scrollToContent,\\r\\n zoomToFit: this.zoomToFit,\\r\\n //zsviczian\\r\\n getSceneElements: this.getSceneElements,\\r\\n getAppState: function () {\\r\\n return _this.state;\\r\\n },\\r\\n getFiles: function () {\\r\\n return _this.files;\\r\\n },\\r\\n refresh: this.refresh,\\r\\n setToast: this.setToast,\\r\\n updateContainerSize: this.updateContainerSize,\\r\\n //zsviczian\\r\\n id: this.id,\\r\\n setLocalFont: this.setLocalFont,\\r\\n //zsviczian\\r\\n selectElements: this.selectElements,\\r\\n //zsviczian\\r\\n sendBackward: this.sendBackward,\\r\\n //zsviczian\\r\\n bringForward: this.bringForward,\\r\\n //zsviczian\\r\\n sendToBack: this.sendToBack,\\r\\n //zsviczian\\r\\n bringToFront: this.bringToFront,\\r\\n //zsviczian\\r\\n restore: this.restore,\\r\\n //zsviczian\\r\\n setMobileModeAllowed: this.setMobileModeAllowed,\\r\\n //zsviczian\\r\\n setActiveTool: this.setActiveTool,\\r\\n setCursor: this.setCursor,\\r\\n resetCursor: this.resetCursor\\r\\n };\\r\\n if (typeof excalidrawRef === \\\"function\\\") {\\r\\n excalidrawRef(api);\\r\\n }\\r\\n else {\\r\\n excalidrawRef.current = api;\\r\\n }\\r\\n readyPromise.resolve(api);\\r\\n }\\r\\n this.excalidrawContainerValue = {\\r\\n container: this.excalidrawContainerRef.current,\\r\\n id: this.id\\r\\n };\\r\\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_32__[\\\"default\\\"]();\\r\\n this.history = new _history__WEBPACK_IMPORTED_MODULE_25__[\\\"default\\\"]();\\r\\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_8__.ActionManager(this.syncActionResult, function () {\\r\\n return _this.state;\\r\\n }, function () {\\r\\n return _this.scene.getElementsIncludingDeleted();\\r\\n }, this);\\r\\n this.actionManager.registerAll(_actions_register__WEBPACK_IMPORTED_MODULE_9__.actions);\\r\\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_7__.createUndoAction)(this.history));\\r\\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_7__.createRedoAction)(this.history));\\r\\n }\\r\\n renderCanvas() {\\r\\n const canvasScale = window.devicePixelRatio;\\r\\n const { width: canvasDOMWidth, height: canvasDOMHeight, viewModeEnabled } = this.state;\\r\\n const canvasWidth = canvasDOMWidth * canvasScale;\\r\\n const canvasHeight = canvasDOMHeight * canvasScale;\\r\\n if (viewModeEnabled) {\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"canvas\\\", {\\r\\n className: \\\"excalidraw__canvas\\\",\\r\\n style: {\\r\\n width: canvasDOMWidth,\\r\\n height: canvasDOMHeight,\\r\\n cursor: _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.GRAB\\r\\n },\\r\\n width: canvasWidth,\\r\\n height: canvasHeight,\\r\\n ref: this.handleCanvasRef,\\r\\n onContextMenu: this.handleCanvasContextMenu,\\r\\n onPointerMove: this.handleCanvasPointerMove,\\r\\n onPointerUp: this.handleCanvasPointerUp,\\r\\n onPointerCancel: this.removePointer,\\r\\n onTouchMove: this.handleTouchMove,\\r\\n onPointerDown: this.handleCanvasPointerDown,\\r\\n children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"labels.drawingCanvas\\\")\\r\\n });\\r\\n }\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"canvas\\\", {\\r\\n className: \\\"excalidraw__canvas\\\",\\r\\n style: {\\r\\n width: canvasDOMWidth,\\r\\n height: canvasDOMHeight\\r\\n },\\r\\n width: canvasWidth,\\r\\n height: canvasHeight,\\r\\n ref: this.handleCanvasRef,\\r\\n onContextMenu: this.handleCanvasContextMenu,\\r\\n onPointerDown: this.handleCanvasPointerDown,\\r\\n onDoubleClick: this.handleCanvasDoubleClick,\\r\\n onPointerMove: this.handleCanvasPointerMove,\\r\\n onPointerUp: this.handleCanvasPointerUp,\\r\\n onPointerCancel: this.removePointer,\\r\\n onTouchMove: this.handleTouchMove,\\r\\n children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"labels.drawingCanvas\\\")\\r\\n });\\r\\n }\\r\\n render() {\\r\\n var _a;\\r\\n var _this2 = this;\\r\\n const selectedElement = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\\r\\n const { onCollabButtonClick, renderTopRightUI, renderFooter, renderCustomStats } = this.props;\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"div\\\", {\\r\\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_5__[\\\"default\\\"])(\\\"excalidraw excalidraw-container\\\", {\\r\\n \\\"excalidraw--view-mode\\\": this.state.viewModeEnabled,\\r\\n \\\"excalidraw--mobile\\\": this.device.isMobile || !(this.state.viewModeEnabled || this.state.zenModeEnabled) && this.state.trayModeEnabled //zsviczian\\r\\n }),\\r\\n ref: this.excalidrawContainerRef,\\r\\n onDrop: this.handleAppOnDrop,\\r\\n tabIndex: 0,\\r\\n onKeyDown: this.props.handleKeyboardGlobally ? undefined : this.onKeyDown,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(ExcalidrawContainerContext.Provider, {\\r\\n value: this.excalidrawContainerValue,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsxs)(DeviceContext.Provider, {\\r\\n value: this.device,\\r\\n children: [/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(_LayerUI__WEBPACK_IMPORTED_MODULE_37__[\\\"default\\\"], {\\r\\n canvas: this.canvas,\\r\\n appState: this.state,\\r\\n files: this.files,\\r\\n setAppState: this.setAppState,\\r\\n actionManager: this.actionManager,\\r\\n elements: this.scene.getNonDeletedElements(),\\r\\n onCollabButtonClick: onCollabButtonClick,\\r\\n onLockToggle: this.toggleLock,\\r\\n onPenModeToggle: this.togglePenMode,\\r\\n onInsertElements: function (elements) {\\r\\n return _this2.addElementsFromPasteOrLibrary({\\r\\n elements,\\r\\n position: \\\"center\\\",\\r\\n files: null\\r\\n });\\r\\n },\\r\\n langCode: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.getLanguage)().code,\\r\\n isCollaborating: this.props.isCollaborating,\\r\\n renderTopRightUI: renderTopRightUI,\\r\\n renderCustomFooter: renderFooter,\\r\\n renderCustomStats: renderCustomStats,\\r\\n showExitZenModeBtn: typeof ((_a = this.props) === null || _a === void 0 ? void 0 : _a.zenModeEnabled) === \\\"undefined\\\" && this.state.zenModeEnabled,\\r\\n showThemeBtn: //typeof this.props?.theme === \\\"undefined\\\" && //zsviczian\\r\\n this.props.UIOptions.canvasActions.theme,\\r\\n libraryReturnUrl: this.props.libraryReturnUrl,\\r\\n UIOptions: this.props.UIOptions,\\r\\n focusContainer: this.focusContainer,\\r\\n library: this.library,\\r\\n id: this.id,\\r\\n onImageAction: this.onImageAction\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"div\\\", {\\r\\n className: \\\"excalidraw-textEditorContainer\\\"\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"div\\\", {\\r\\n className: \\\"excalidraw-contextMenuContainer\\\"\\r\\n }), selectedElement.length === 1 && this.state.showHyperlinkPopup && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.Hyperlink, {\\r\\n element: selectedElement[0],\\r\\n appState: this.state,\\r\\n setAppState: this.setAppState,\\r\\n onLinkOpen: this.props.onLinkOpen\\r\\n }, selectedElement[0].id), this.state.toast !== null && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(_Toast__WEBPACK_IMPORTED_MODULE_38__.Toast, {\\r\\n message: this.state.toast.message,\\r\\n onClose: function () {\\r\\n return _this2.setToast(null);\\r\\n },\\r\\n duration: this.state.toast.duration,\\r\\n closable: this.state.toast.closable\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"main\\\", {\\r\\n children: this.renderCanvas()\\r\\n })]\\r\\n })\\r\\n })\\r\\n });\\r\\n }\\r\\n componentDidMount() {\\r\\n var _this3 = this;\\r\\n return (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n var _a, _b;\\r\\n _this3.unmounted = false;\\r\\n _this3.excalidrawContainerValue.container = _this3.excalidrawContainerRef.current;\\r\\n if (\\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_13__.ENV.TEST || \\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_13__.ENV.DEVELOPMENT) {\\r\\n const setState = _this3.setState.bind(_this3);\\r\\n Object.defineProperties(window.h, {\\r\\n state: {\\r\\n configurable: true,\\r\\n get: function () {\\r\\n return _this3.state;\\r\\n }\\r\\n },\\r\\n setState: {\\r\\n configurable: true,\\r\\n value: function () {\\r\\n return _this3.setState(...arguments);\\r\\n }\\r\\n },\\r\\n app: {\\r\\n configurable: true,\\r\\n value: _this3\\r\\n },\\r\\n history: {\\r\\n configurable: true,\\r\\n value: _this3.history\\r\\n }\\r\\n });\\r\\n }\\r\\n _this3.scene.addCallback(_this3.onSceneUpdated);\\r\\n _this3.addEventListeners();\\r\\n if (_this3.excalidrawContainerRef.current) {\\r\\n _this3.focusContainer();\\r\\n }\\r\\n if (_this3.excalidrawContainerRef.current && // bounding rects don't work in tests so updating\\r\\n // the state on init would result in making the test enviro run\\r\\n // in mobile breakpoint (0 width/height), making everything fail\\r\\n \\\"development\\\" !== \\\"test\\\") {\\r\\n _this3.refreshDeviceState(_this3.excalidrawContainerRef.current);\\r\\n }\\r\\n if (\\\"ResizeObserver\\\" in window && ((_a = _this3.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current)) {\\r\\n _this3.resizeObserver = new ResizeObserver(function () {\\r\\n THROTTLE_NEXT_RENDER = false; // recompute device dimensions state\\r\\n // ---------------------------------------------------------------------\\r\\n _this3.refreshDeviceState(_this3.excalidrawContainerRef.current); // refresh offsets\\r\\n // ---------------------------------------------------------------------\\r\\n _this3.updateDOMRect();\\r\\n });\\r\\n (_b = _this3.resizeObserver) === null || _b === void 0 ? void 0 : _b.observe(_this3.excalidrawContainerRef.current);\\r\\n }\\r\\n else if (window.matchMedia) {\\r\\n const mdScreenQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${_constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${_constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_WIDTH_LANDSCAPE}px)`);\\r\\n const smScreenQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_13__.MQ_SM_MAX_WIDTH}px)`);\\r\\n const canDeviceFitSidebarMediaQuery = window.matchMedia(`(min-width: ${ // NOTE this won't update if a different breakpoint is supplied\\r\\n // after mount\\r\\n _this3.props.UIOptions.dockedSidebarBreakpoint != null ? _this3.props.UIOptions.dockedSidebarBreakpoint : _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_RIGHT_SIDEBAR_MIN_WIDTH}px)`);\\r\\n const handler = function () {\\r\\n _this3.excalidrawContainerRef.current.getBoundingClientRect();\\r\\n _this3.device = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateObject)(_this3.device, {\\r\\n isSmScreen: smScreenQuery.matches,\\r\\n isMobile: mdScreenQuery.matches && _this3.allowMobileMode,\\r\\n //zsviczian\\r\\n canDeviceFitSidebar: canDeviceFitSidebarMediaQuery.matches\\r\\n });\\r\\n };\\r\\n mdScreenQuery.addListener(handler);\\r\\n _this3.detachIsMobileMqHandler = function () {\\r\\n return mdScreenQuery.removeListener(handler);\\r\\n };\\r\\n }\\r\\n const searchParams = new URLSearchParams(window.location.search.slice(1));\\r\\n if (searchParams.has(\\\"web-share-target\\\")) {\\r\\n // Obtain a file that was shared via the Web Share Target API.\\r\\n _this3.restoreFileFromShare();\\r\\n }\\r\\n else {\\r\\n _this3.updateDOMRect(_this3.initializeScene);\\r\\n }\\r\\n })();\\r\\n }\\r\\n componentWillUnmount() {\\r\\n var _a;\\r\\n this.files = {};\\r\\n this.imageCache.clear();\\r\\n (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\\r\\n this.unmounted = true;\\r\\n this.removeEventListeners();\\r\\n this.scene.destroy();\\r\\n clearTimeout(touchTimeout);\\r\\n touchTimeout = 0;\\r\\n }\\r\\n removeEventListeners() {\\r\\n var _a, _b, _c, _d, _e;\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, this.removePointer);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.COPY, this.onCopy);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.PASTE, this.pasteFromClipboard);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.CUT, this.onCut);\\r\\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.WHEEL, this.onWheel);\\r\\n (_b = this.nearestScrollableContainer) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.SCROLL, this.onScroll);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYDOWN, this.onKeyDown, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYUP, this.onKeyUp);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.RESIZE, this.onResize, false);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.UNLOAD, this.onUnload, false);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.BLUR, this.onBlur, false);\\r\\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.DRAG_OVER, this.disableEvent, false);\\r\\n (_d = this.excalidrawContainerRef.current) === null || _d === void 0 ? void 0 : _d.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.DROP, this.disableEvent, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.GESTURE_START, this.onGestureStart, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.GESTURE_END, this.onGestureEnd, false);\\r\\n (_e = this.detachIsMobileMqHandler) === null || _e === void 0 ? void 0 : _e.call(this);\\r\\n }\\r\\n addEventListeners() {\\r\\n var _a, _b, _c, _d, _e;\\r\\n this.removeEventListeners();\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, this.removePointer); // #3553\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.COPY, this.onCopy);\\r\\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.WHEEL, this.onWheel, {\\r\\n passive: false\\r\\n });\\r\\n if (this.props.handleKeyboardGlobally) {\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYDOWN, this.onKeyDown, false);\\r\\n }\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYUP, this.onKeyUp, {\\r\\n passive: true\\r\\n });\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition); // rerender text elements on font load to fix #637 && #1553\\r\\n (_c = (_b = document.fonts) === null || _b === void 0 ? void 0 : _b.addEventListener) === null || _c === void 0 ? void 0 : _c.call(_b, \\\"loadingdone\\\", this.onFontLoaded); // Safari-only desktop pinch zoom\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.GESTURE_START, this.onGestureStart, false);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.GESTURE_END, this.onGestureEnd, false);\\r\\n if (this.state.viewModeEnabled) {\\r\\n return;\\r\\n }\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.PASTE, this.pasteFromClipboard);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.CUT, this.onCut);\\r\\n if (this.props.detectScroll) {\\r\\n this.nearestScrollableContainer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.getNearestScrollableContainer)(this.excalidrawContainerRef.current);\\r\\n this.nearestScrollableContainer.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.SCROLL, this.onScroll);\\r\\n }\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.RESIZE, this.onResize, false);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.UNLOAD, this.onUnload, false);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.BLUR, this.onBlur, false);\\r\\n (_d = this.excalidrawContainerRef.current) === null || _d === void 0 ? void 0 : _d.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.DRAG_OVER, this.disableEvent, false);\\r\\n (_e = this.excalidrawContainerRef.current) === null || _e === void 0 ? void 0 : _e.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.DROP, this.disableEvent, false);\\r\\n }\\r\\n componentDidUpdate(prevProps, prevState) {\\r\\n var _a, _b, _c, _d, _e;\\r\\n var _this4 = this;\\r\\n if (this.excalidrawContainerRef.current && prevProps.UIOptions.dockedSidebarBreakpoint !== this.props.UIOptions.dockedSidebarBreakpoint) {\\r\\n this.refreshDeviceState(this.excalidrawContainerRef.current);\\r\\n }\\r\\n if (prevState.scrollX !== this.state.scrollX || prevState.scrollY !== this.state.scrollY) {\\r\\n (_b = (_a = this.props) === null || _a === void 0 ? void 0 : _a.onScrollChange) === null || _b === void 0 ? void 0 : _b.call(_a, this.state.scrollX, this.state.scrollY);\\r\\n }\\r\\n if (Object.keys(this.state.selectedElementIds).length && (0,_appState__WEBPACK_IMPORTED_MODULE_11__.isEraserActive)(this.state)) {\\r\\n this.setState({\\r\\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateActiveTool)(this.state, {\\r\\n type: \\\"selection\\\"\\r\\n })\\r\\n });\\r\\n }\\r\\n if (this.state.activeTool.type === \\\"eraser\\\" && prevState.theme !== this.state.theme) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setEraserCursor)(this.canvas, this.state.theme);\\r\\n } // Hide hyperlink popup if shown when element type is not selection\\r\\n if (prevState.activeTool.type === \\\"selection\\\" && this.state.activeTool.type !== \\\"selection\\\" && this.state.showHyperlinkPopup) {\\r\\n this.setState({\\r\\n showHyperlinkPopup: false\\r\\n });\\r\\n }\\r\\n if (prevProps.langCode !== this.props.langCode) {\\r\\n this.updateLanguage();\\r\\n }\\r\\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\\r\\n this.setState({\\r\\n viewModeEnabled: !!this.props.viewModeEnabled\\r\\n });\\r\\n }\\r\\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\\r\\n this.addEventListeners();\\r\\n this.deselectElements();\\r\\n }\\r\\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\\r\\n this.setState({\\r\\n zenModeEnabled: !!this.props.zenModeEnabled\\r\\n });\\r\\n }\\r\\n if (prevProps.theme !== this.props.theme && this.props.theme) {\\r\\n this.setState({\\r\\n theme: this.props.theme\\r\\n });\\r\\n }\\r\\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\\r\\n this.setState({\\r\\n gridSize: this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_13__.GRID_SIZE : null\\r\\n });\\r\\n }\\r\\n if (this.props.name && prevProps.name !== this.props.name) {\\r\\n this.setState({\\r\\n name: this.props.name\\r\\n });\\r\\n }\\r\\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.classList.toggle(\\\"theme--dark\\\", this.state.theme === \\\"dark\\\");\\r\\n if (this.state.editingLinearElement && !this.state.selectedElementIds[this.state.editingLinearElement.elementId]) {\\r\\n // defer so that the commitToHistory flag isn't reset via current update\\r\\n setTimeout(function () {\\r\\n _this4.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n });\\r\\n }\\r\\n const { multiElement } = prevState;\\r\\n if (prevState.activeTool !== this.state.activeTool && multiElement != null && (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(this.state) && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(multiElement, false)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(multiElement, this.state, this.scene, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)(_element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiElement, -1)));\\r\\n }\\r\\n const cursorButton = {};\\r\\n const pointerViewportCoords = {};\\r\\n const remoteSelectedElementIds = {};\\r\\n const pointerUsernames = {};\\r\\n const pointerUserStates = {};\\r\\n this.state.collaborators.forEach(function (user, socketId) {\\r\\n if (user.selectedElementIds) {\\r\\n for (const id of Object.keys(user.selectedElementIds)) {\\r\\n if (!(id in remoteSelectedElementIds)) {\\r\\n remoteSelectedElementIds[id] = [];\\r\\n }\\r\\n remoteSelectedElementIds[id].push(socketId);\\r\\n }\\r\\n }\\r\\n if (!user.pointer) {\\r\\n return;\\r\\n }\\r\\n if (user.username) {\\r\\n pointerUsernames[socketId] = user.username;\\r\\n }\\r\\n if (user.userState) {\\r\\n pointerUserStates[socketId] = user.userState;\\r\\n }\\r\\n pointerViewportCoords[socketId] = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: user.pointer.x,\\r\\n sceneY: user.pointer.y\\r\\n }, _this4.state);\\r\\n cursorButton[socketId] = user.button;\\r\\n });\\r\\n const renderingElements = this.scene.getNonDeletedElements().filter(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(element)) {\\r\\n if ( // not placed on canvas yet (but in elements array)\\r\\n _this4.state.pendingImageElementId === element.id) {\\r\\n return false;\\r\\n }\\r\\n } // don't render text element that's being currently edited (it's\\r\\n // rendered on remote only)\\r\\n return !_this4.state.editingElement || _this4.state.editingElement.type !== \\\"text\\\" || element.id !== _this4.state.editingElement.id;\\r\\n });\\r\\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_29__.renderScene)(renderingElements, this.state, this.state.selectionElement, window.devicePixelRatio, this.rc, this.canvas, {\\r\\n scrollX: this.state.scrollX,\\r\\n scrollY: this.state.scrollY,\\r\\n viewBackgroundColor: this.state.viewBackgroundColor,\\r\\n zoom: this.state.zoom,\\r\\n remotePointerViewportCoords: pointerViewportCoords,\\r\\n remotePointerButton: cursorButton,\\r\\n remoteSelectedElementIds,\\r\\n remotePointerUsernames: pointerUsernames,\\r\\n remotePointerUserStates: pointerUserStates,\\r\\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\\r\\n theme: this.state.theme,\\r\\n imageCache: this.imageCache,\\r\\n isExporting: false,\\r\\n renderScrollbars: !this.device.isMobile\\r\\n }, function (_ref) {\\r\\n let { atLeastOneVisibleElement, scrollBars } = _ref;\\r\\n if (scrollBars) {\\r\\n currentScrollBars = scrollBars;\\r\\n }\\r\\n const scrolledOutside = // hide when editing text\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this4.state.editingElement) ? false : !atLeastOneVisibleElement && renderingElements.length > 0;\\r\\n if (_this4.state.scrolledOutside !== scrolledOutside) {\\r\\n _this4.setState({\\r\\n scrolledOutside\\r\\n });\\r\\n }\\r\\n _this4.scheduleImageRefresh();\\r\\n }, THROTTLE_NEXT_RENDER && window.EXCALIDRAW_THROTTLE_RENDER === true);\\r\\n if (!THROTTLE_NEXT_RENDER) {\\r\\n THROTTLE_NEXT_RENDER = true;\\r\\n }\\r\\n this.history.record(this.state, this.scene.getElementsIncludingDeleted()); // Do not notify consumers if we're still loading the scene. Among other\\r\\n // potential issues, this fixes a case where the tab isn't focused during\\r\\n // init, which would trigger onChange with empty elements, which would then\\r\\n // override whatever is in localStorage currently.\\r\\n if (!this.state.isLoading) {\\r\\n (_e = (_d = this.props).onChange) === null || _e === void 0 ? void 0 : _e.call(_d, this.scene.getElementsIncludingDeleted(), this.state, this.files);\\r\\n }\\r\\n }\\r\\n static resetTapTwice() {\\r\\n didTapTwice = false;\\r\\n }\\r\\n addTextFromPaste(text) {\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: cursorX,\\r\\n clientY: cursorY\\r\\n }, this.state);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\\r\\n x,\\r\\n y,\\r\\n strokeColor: this.state.currentItemStrokeColor,\\r\\n backgroundColor: this.state.currentItemBackgroundColor,\\r\\n fillStyle: this.state.currentItemFillStyle,\\r\\n strokeWidth: this.state.currentItemStrokeWidth,\\r\\n strokeStyle: this.state.currentItemStrokeStyle,\\r\\n roughness: this.state.currentItemRoughness,\\r\\n opacity: this.state.currentItemOpacity,\\r\\n strokeSharpness: this.state.currentItemStrokeSharpness,\\r\\n text,\\r\\n rawText: text,\\r\\n fontSize: this.state.currentItemFontSize,\\r\\n fontFamily: this.state.currentItemFontFamily,\\r\\n textAlign: this.state.currentItemTextAlign,\\r\\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_13__.DEFAULT_VERTICAL_ALIGN,\\r\\n locked: false\\r\\n });\\r\\n this.scene.replaceAllElements([...this.scene.getElementsIncludingDeleted(), element]);\\r\\n this.setState({\\r\\n selectedElementIds: {\\r\\n [element.id]: true\\r\\n }\\r\\n });\\r\\n this.history.resumeRecording();\\r\\n } // Collaboration\\r\\n handleTextWysiwyg(element, _ref2) {\\r\\n var _this5 = this;\\r\\n let { isExistingElement = false } = _ref2;\\r\\n const updateElement = function (text, originalText, isDeleted, rawText, link) {\\r\\n _this5.scene.replaceAllElements([..._this5.scene.getElementsIncludingDeleted().map(function (_element) {\\r\\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\\r\\n text,\\r\\n isDeleted,\\r\\n originalText,\\r\\n rawText: rawText !== null && rawText !== void 0 ? rawText : originalText,\\r\\n link\\r\\n });\\r\\n }\\r\\n return _element;\\r\\n })]);\\r\\n };\\r\\n if (isExistingElement && this.props.onBeforeTextEdit) {\\r\\n const text = this.props.onBeforeTextEdit(element);\\r\\n if (text) {\\r\\n this.scene.replaceAllElements([...this.scene.getElementsIncludingDeleted().map(function (_element) {\\r\\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\\r\\n element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\\r\\n text,\\r\\n isDeleted: false,\\r\\n originalText: text\\r\\n });\\r\\n return element;\\r\\n }\\r\\n return _element;\\r\\n })]);\\r\\n }\\r\\n }\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.textWysiwyg)({\\r\\n id: element.id,\\r\\n canvas: this.canvas,\\r\\n getViewportCoords: function (x, y) {\\r\\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: x,\\r\\n sceneY: y\\r\\n }, _this5.state);\\r\\n return [viewportX - _this5.state.offsetLeft, viewportY - _this5.state.offsetTop];\\r\\n },\\r\\n onChange: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (text) {\\r\\n updateElement(text, text, false);\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element);\\r\\n }\\r\\n }),\\r\\n onSubmit: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (_ref3) {\\r\\n let { text, viaKeyboard, originalText } = _ref3;\\r\\n const isDeleted = !text.trim();\\r\\n const rawText = originalText; //should this be originalText??\\r\\n let link = undefined;\\r\\n if (_this5.props.onBeforeTextSubmit) {\\r\\n const [updatedText, updatedOriginalText, l] = _this5.props.onBeforeTextSubmit(element, text, originalText, isDeleted);\\r\\n text = updatedText !== null && updatedText !== void 0 ? updatedText : text;\\r\\n originalText = updatedOriginalText !== null && updatedOriginalText !== void 0 ? updatedOriginalText : originalText;\\r\\n link = l;\\r\\n }\\r\\n updateElement(text, originalText, isDeleted, rawText, link); // select the created text element only if submitting via keyboard\\r\\n // (when submitting via click it should act as signal to deselect)\\r\\n if (!isDeleted && viaKeyboard) {\\r\\n const elementIdToSelect = element.containerId ? element.containerId : element.id;\\r\\n _this5.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [elementIdToSelect]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n if (isDeleted) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDeletion)(_this5.scene.getNonDeletedElements(), [element]);\\r\\n }\\r\\n if (!isDeleted || isExistingElement) {\\r\\n _this5.history.resumeRecording();\\r\\n }\\r\\n _this5.setState({\\r\\n draggingElement: null,\\r\\n editingElement: null\\r\\n });\\r\\n if (_this5.state.activeTool.locked) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this5.canvas, _this5.state);\\r\\n }\\r\\n _this5.focusContainer();\\r\\n }),\\r\\n element,\\r\\n excalidrawContainer: this.excalidrawContainerRef.current,\\r\\n app: this\\r\\n }); // deselect all other elements when inserting text\\r\\n this.deselectElements(); // do an initial update to re-initialize element position since we were\\r\\n // modifying element's x/y for sake of editor (case: syncing to remote)\\r\\n updateElement(element.text, element.originalText, false);\\r\\n }\\r\\n deselectElements() {\\r\\n this.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n getTextElementAtPosition(x, y) {\\r\\n const element = this.getElementAtPosition(x, y, {\\r\\n includeBoundTextElement: true\\r\\n });\\r\\n if (element && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element) && !element.isDeleted) {\\r\\n return element;\\r\\n }\\r\\n return null;\\r\\n }\\r\\n getElementAtPosition(x, y, opts) {\\r\\n const allHitElements = this.getElementsAtPosition(x, y, opts === null || opts === void 0 ? void 0 : opts.includeBoundTextElement, opts === null || opts === void 0 ? void 0 : opts.includeLockedElements);\\r\\n if (allHitElements.length > 1) {\\r\\n if (opts === null || opts === void 0 ? void 0 : opts.preferSelected) {\\r\\n for (let index = allHitElements.length - 1; index > -1; index--) {\\r\\n if (this.state.selectedElementIds[allHitElements[index].id]) {\\r\\n return allHitElements[index];\\r\\n }\\r\\n }\\r\\n }\\r\\n const elementWithHighestZIndex = allHitElements[allHitElements.length - 1]; // If we're hitting element with highest z-index only on its bounding box\\r\\n // while also hitting other element figure, the latter should be considered.\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(elementWithHighestZIndex, this.state, x, y) ? allHitElements[allHitElements.length - 2] : elementWithHighestZIndex;\\r\\n }\\r\\n if (allHitElements.length === 1) {\\r\\n return allHitElements[0];\\r\\n }\\r\\n return null;\\r\\n }\\r\\n getElementsAtPosition(x, y) {\\r\\n var _this6 = this;\\r\\n let includeBoundTextElement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\\r\\n let includeLockedElements = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\\r\\n const elements = includeBoundTextElement && includeLockedElements ? this.scene.getNonDeletedElements() : this.scene.getNonDeletedElements().filter(function (element) {\\r\\n return (includeLockedElements || !element.locked) && (includeBoundTextElement || !((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element) && element.containerId));\\r\\n });\\r\\n return (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsAtPosition)(elements, function (element) {\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.hitTest)(element, _this6.state, x, y);\\r\\n });\\r\\n }\\r\\n maybeCleanupAfterMissingPointerUp(event) {\\r\\n if (lastPointerUp !== null) {\\r\\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\\r\\n // this can happen when a contextual menu or alert is triggered. In order to avoid\\r\\n // being in a weird state, we clean up on the next pointerdown\\r\\n lastPointerUp(event);\\r\\n }\\r\\n } // Returns whether the event is a panning\\r\\n updateGestureOnPointerDown(event) {\\r\\n gesture.pointers.set(event.pointerId, {\\r\\n x: event.clientX,\\r\\n y: event.clientY\\r\\n });\\r\\n if (gesture.pointers.size === 2) {\\r\\n gesture.lastCenter = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\\r\\n gesture.initialScale = this.state.zoom.value;\\r\\n gesture.initialDistance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\\r\\n }\\r\\n }\\r\\n initialPointerDownState(event) {\\r\\n const origin = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\\r\\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\\r\\n return {\\r\\n origin,\\r\\n withCmdOrCtrl: event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD],\\r\\n originInGrid: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(origin.x, origin.y, this.state.gridSize)),\\r\\n scrollbars: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop),\\r\\n // we need to duplicate because we'll be updating this state\\r\\n lastCoords: _objectSpread({}, origin),\\r\\n originalElements: this.scene.getNonDeletedElements().reduce(function (acc, element) {\\r\\n acc.set(element.id, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.deepCopyElement)(element));\\r\\n return acc;\\r\\n }, new Map()),\\r\\n resize: {\\r\\n handleType: false,\\r\\n isResizing: false,\\r\\n offset: {\\r\\n x: 0,\\r\\n y: 0\\r\\n },\\r\\n arrowDirection: \\\"origin\\\",\\r\\n center: {\\r\\n x: (maxX + minX) / 2,\\r\\n y: (maxY + minY) / 2\\r\\n }\\r\\n },\\r\\n hit: {\\r\\n element: null,\\r\\n allHitElements: [],\\r\\n wasAddedToSelection: false,\\r\\n hasBeenDuplicated: false,\\r\\n hasHitCommonBoundingBoxOfSelectedElements: this.isHittingCommonBoundingBoxOfSelectedElements(origin, selectedElements),\\r\\n hasHitElementInside: false\\r\\n },\\r\\n drag: {\\r\\n hasOccurred: false,\\r\\n offset: null\\r\\n },\\r\\n eventListeners: {\\r\\n onMove: null,\\r\\n onUp: null,\\r\\n onKeyUp: null,\\r\\n onKeyDown: null\\r\\n },\\r\\n boxSelection: {\\r\\n hasOccurred: false\\r\\n },\\r\\n elementIdsToErase: {}\\r\\n };\\r\\n } // Returns whether the event is a dragging a scrollbar\\r\\n handleDraggingScrollBar(event, pointerDownState) {\\r\\n var _this7 = this;\\r\\n if (!(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)) {\\r\\n return false;\\r\\n }\\r\\n isDraggingScrollBar = true;\\r\\n pointerDownState.lastCoords.x = event.clientX;\\r\\n pointerDownState.lastCoords.y = event.clientY;\\r\\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdatesThrottled)(function (event) {\\r\\n const target = event.target;\\r\\n if (!(target instanceof HTMLElement)) {\\r\\n return;\\r\\n }\\r\\n _this7.handlePointerMoveOverScrollbars(event, pointerDownState);\\r\\n });\\r\\n const onPointerUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n isDraggingScrollBar = false;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this7.canvas, _this7.state);\\r\\n lastPointerUp = null;\\r\\n _this7.setState({\\r\\n cursorButton: \\\"up\\\"\\r\\n });\\r\\n _this7.savePointer(event.clientX, event.clientY, \\\"up\\\");\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, onPointerUp);\\r\\n onPointerMove.flush();\\r\\n });\\r\\n lastPointerUp = onPointerUp;\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, onPointerUp);\\r\\n return true;\\r\\n }\\r\\n isASelectedElement(hitElement) {\\r\\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\\r\\n }\\r\\n isHittingCommonBoundingBoxOfSelectedElements(point, selectedElements) {\\r\\n if (selectedElements.length < 2) {\\r\\n return false;\\r\\n } // How many pixels off the shape boundary we still consider a hit\\r\\n const threshold = 10 / this.state.zoom.value;\\r\\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\\r\\n return point.x > x1 - threshold && point.x < x2 + threshold && point.y > y1 - threshold && point.y < y2 + threshold;\\r\\n }\\r\\n onKeyDownFromPointerDownHandler(pointerDownState) {\\r\\n var _this8 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n if (_this8.maybeHandleResize(pointerDownState, event)) {\\r\\n return;\\r\\n }\\r\\n _this8.maybeDragNewGenericElement(pointerDownState, event);\\r\\n });\\r\\n }\\r\\n onKeyUpFromPointerDownHandler(pointerDownState) {\\r\\n var _this9 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n // Prevents focus from escaping excalidraw tab\\r\\n event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ALT && event.preventDefault();\\r\\n if (_this9.maybeHandleResize(pointerDownState, event)) {\\r\\n return;\\r\\n }\\r\\n _this9.maybeDragNewGenericElement(pointerDownState, event);\\r\\n });\\r\\n }\\r\\n onPointerMoveFromPointerDownHandler(pointerDownState) {\\r\\n var _this10 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdatesThrottled)(function (event) {\\r\\n var _a, _b;\\r\\n // We need to initialize dragOffsetXY only after we've updated\\r\\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\\r\\n // event handler should hopefully ensure we're already working with\\r\\n // the updated state.\\r\\n if (pointerDownState.drag.offset === null) {\\r\\n pointerDownState.drag.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getDragOffsetXY)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this10.scene.getNonDeletedElements(), _this10.state), pointerDownState.origin.x, pointerDownState.origin.y));\\r\\n }\\r\\n const target = event.target;\\r\\n if (!(target instanceof HTMLElement)) {\\r\\n return;\\r\\n }\\r\\n if (_this10.handlePointerMoveOverScrollbars(event, pointerDownState)) {\\r\\n return;\\r\\n }\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this10.state);\\r\\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_11__.isEraserActive)(_this10.state)) {\\r\\n _this10.handleEraser(event, pointerDownState, pointerCoords);\\r\\n return;\\r\\n }\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, _this10.state.gridSize); // for arrows/lines, don't start dragging until a given threshold\\r\\n // to ensure we don't create a 2-point arrow by mistake when\\r\\n // user clicks mouse in a way that it moves a tiny bit (thus\\r\\n // triggering pointermove)\\r\\n if (!pointerDownState.drag.hasOccurred && (_this10.state.activeTool.type === \\\"arrow\\\" || _this10.state.activeTool.type === \\\"line\\\")) {\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerCoords.x, pointerCoords.y, pointerDownState.origin.x, pointerDownState.origin.y) < _constants__WEBPACK_IMPORTED_MODULE_13__.DRAGGING_THRESHOLD) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n if (pointerDownState.resize.isResizing) {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n if (_this10.maybeHandleResize(pointerDownState, event)) {\\r\\n return true;\\r\\n }\\r\\n }\\r\\n if (_this10.state.editingLinearElement) {\\r\\n const didDrag = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointDragging(_this10.state, function (appState) {\\r\\n return _this10.setState(appState);\\r\\n }, pointerCoords.x, pointerCoords.y, function (element, pointsSceneCoords) {\\r\\n _this10.maybeSuggestBindingsForLinearElementAtCoords(element, pointsSceneCoords);\\r\\n });\\r\\n if (didDrag) {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n return;\\r\\n }\\r\\n }\\r\\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some(function (element) {\\r\\n return _this10.isASelectedElement(element);\\r\\n });\\r\\n if ((hasHitASelectedElement || pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) && ( // this allows for box-selecting points when clicking inside the\\r\\n // line's bounding box\\r\\n !_this10.state.editingLinearElement || !event.shiftKey) && ( // box-selecting without shift when editing line, not clicking on a line\\r\\n !_this10.state.editingLinearElement || ((_a = _this10.state.editingLinearElement) === null || _a === void 0 ? void 0 : _a.elementId) !== ((_b = pointerDownState.hit.element) === null || _b === void 0 ? void 0 : _b.id) || pointerDownState.hit.hasHitElementInside)) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this10.scene.getNonDeletedElements(), _this10.state);\\r\\n if (selectedElements.every(function (element) {\\r\\n return element.locked;\\r\\n })) {\\r\\n return;\\r\\n } // Marking that click was used for dragging to check\\r\\n // if elements should be deselected on pointerup\\r\\n pointerDownState.drag.hasOccurred = true; // prevent dragging even if we're no longer holding cmd/ctrl otherwise\\r\\n // it would have weird results (stuff jumping all over the screen)\\r\\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\\r\\n const [dragX, dragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.drag.offset.x, pointerCoords.y - pointerDownState.drag.offset.y, _this10.state.gridSize);\\r\\n const [dragDistanceX, dragDistanceY] = [Math.abs(pointerCoords.x - pointerDownState.origin.x), Math.abs(pointerCoords.y - pointerDownState.origin.y)]; // We only drag in one direction if shift is pressed\\r\\n const lockDirection = event.shiftKey;\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragSelectedElements)(pointerDownState, selectedElements, dragX, dragY, lockDirection, dragDistanceX, dragDistanceY, _this10.state);\\r\\n _this10.maybeSuggestBindingForAll(selectedElements); // We duplicate the selected element if alt is pressed on pointer move\\r\\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\\r\\n // Move the currently selected elements to the top of the z index stack, and\\r\\n // put the duplicates where the selected elements used to be.\\r\\n // (the origin point where the dragging started)\\r\\n pointerDownState.hit.hasBeenDuplicated = true;\\r\\n const nextElements = [];\\r\\n const elementsToAppend = [];\\r\\n const groupIdMap = new Map();\\r\\n const oldIdToDuplicatedId = new Map();\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n const elements = _this10.scene.getElementsIncludingDeleted();\\r\\n const selectedElementIds = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this10.state, true).map(function (element) {\\r\\n return element.id;\\r\\n });\\r\\n for (const element of elements) {\\r\\n if (selectedElementIds.includes(element.id) || // case: the state.selectedElementIds might not have been\\r\\n // updated yet by the time this mousemove event is fired\\r\\n element.id === (hitElement === null || hitElement === void 0 ? void 0 : hitElement.id) && pointerDownState.hit.wasAddedToSelection) {\\r\\n const duplicatedElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(_this10.state.editingGroupId, groupIdMap, element);\\r\\n const [originDragX, originDragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x - pointerDownState.drag.offset.x, pointerDownState.origin.y - pointerDownState.drag.offset.y, _this10.state.gridSize);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(duplicatedElement, {\\r\\n x: duplicatedElement.x + (originDragX - dragX),\\r\\n y: duplicatedElement.y + (originDragY - dragY)\\r\\n });\\r\\n nextElements.push(duplicatedElement);\\r\\n elementsToAppend.push(element);\\r\\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\\r\\n }\\r\\n else {\\r\\n nextElements.push(element);\\r\\n }\\r\\n }\\r\\n const nextSceneElements = [...nextElements, ...elementsToAppend];\\r\\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.bindTextToShapeAfterDuplication)(nextElements, elementsToAppend, oldIdToDuplicatedId);\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, \\\"duplicatesServeAsOld\\\");\\r\\n _this10.scene.replaceAllElements(nextSceneElements);\\r\\n }\\r\\n return;\\r\\n }\\r\\n } // It is very important to read this.state within each move event,\\r\\n // otherwise we would read a stale one!\\r\\n const draggingElement = _this10.state.draggingElement;\\r\\n if (!draggingElement) {\\r\\n return;\\r\\n }\\r\\n if (draggingElement.type === \\\"freedraw\\\") {\\r\\n const points = draggingElement.points;\\r\\n const dx = pointerCoords.x - draggingElement.x;\\r\\n const dy = pointerCoords.y - draggingElement.y;\\r\\n const lastPoint = points.length > 0 && points[points.length - 1];\\r\\n const discardPoint = lastPoint && lastPoint[0] === dx && lastPoint[1] === dy;\\r\\n if (!discardPoint) {\\r\\n const pressures = draggingElement.simulatePressure ? draggingElement.pressures : [...draggingElement.pressures, event.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]],\\r\\n pressures\\r\\n });\\r\\n }\\r\\n }\\r\\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\\r\\n pointerDownState.drag.hasOccurred = true;\\r\\n const points = draggingElement.points;\\r\\n let dx = gridX - draggingElement.x;\\r\\n let dy = gridY - draggingElement.y;\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldRotateWithDiscreteAngle)(event) && points.length === 2) {\\r\\n ({\\r\\n width: dx,\\r\\n height: dy\\r\\n } = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getLockedLinearCursorAlignSize)(draggingElement.x, draggingElement.y, pointerCoords.x, pointerCoords.y));\\r\\n }\\r\\n if (points.length === 1) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]]\\r\\n });\\r\\n }\\r\\n else if (points.length > 1) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points.slice(0, -1), [dx, dy]]\\r\\n });\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement, false)) {\\r\\n // When creating a linear element by dragging\\r\\n _this10.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [pointerCoords], _this10.state.startBoundElement);\\r\\n }\\r\\n }\\r\\n else {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n _this10.maybeDragNewGenericElement(pointerDownState, event);\\r\\n }\\r\\n if (_this10.state.activeTool.type === \\\"selection\\\") {\\r\\n pointerDownState.boxSelection.hasOccurred = true;\\r\\n const elements = _this10.scene.getNonDeletedElements();\\r\\n if (!event.shiftKey && // allows for box-selecting points (without shift)\\r\\n !_this10.state.editingLinearElement && (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(elements, _this10.state)) {\\r\\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\\r\\n _this10.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: {\\r\\n [pointerDownState.hit.element.id]: true\\r\\n }\\r\\n }), _this10.scene.getNonDeletedElements());\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this10.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n } // box-select line editor points\\r\\n if (_this10.state.editingLinearElement) {\\r\\n _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handleBoxSelection(event, _this10.state, _this10.setState.bind(_this10)); // regular box-select\\r\\n }\\r\\n else {\\r\\n const elementsWithinSelection = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsWithinSelection)(elements, draggingElement);\\r\\n _this10.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread(_objectSpread({}, prevState.selectedElementIds), elementsWithinSelection.reduce(function (acc, element) {\\r\\n acc[element.id] = true;\\r\\n return acc;\\r\\n }, {})), pointerDownState.hit.element ? {\\r\\n // if using ctrl/cmd, select the hitElement only if we\\r\\n // haven't box-selected anything else\\r\\n [pointerDownState.hit.element.id]: !elementsWithinSelection.length\\r\\n } : null),\\r\\n showHyperlinkPopup: elementsWithinSelection.length === 1 && elementsWithinSelection[0].link ? \\\"info\\\" : false\\r\\n }), _this10.scene.getNonDeletedElements());\\r\\n });\\r\\n }\\r\\n }\\r\\n });\\r\\n } // Returns whether the pointer move happened over either scrollbar\\r\\n handlePointerMoveOverScrollbars(event, pointerDownState) {\\r\\n if (pointerDownState.scrollbars.isOverHorizontal) {\\r\\n const x = event.clientX;\\r\\n const dx = x - pointerDownState.lastCoords.x;\\r\\n this.setState({\\r\\n scrollX: this.state.scrollX - dx / this.state.zoom.value\\r\\n });\\r\\n pointerDownState.lastCoords.x = x;\\r\\n return true;\\r\\n }\\r\\n if (pointerDownState.scrollbars.isOverVertical) {\\r\\n const y = event.clientY;\\r\\n const dy = y - pointerDownState.lastCoords.y;\\r\\n this.setState({\\r\\n scrollY: this.state.scrollY - dy / this.state.zoom.value\\r\\n });\\r\\n pointerDownState.lastCoords.y = y;\\r\\n return true;\\r\\n }\\r\\n return false;\\r\\n }\\r\\n onPointerUpFromPointerDownHandler(pointerDownState) {\\r\\n var _this11 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (childEvent) {\\r\\n var _a, _b;\\r\\n const { draggingElement, resizingElement, multiElement, activeTool, isResizing, isRotating } = _this11.state;\\r\\n _this11.setState({\\r\\n isResizing: false,\\r\\n isRotating: false,\\r\\n resizingElement: null,\\r\\n selectionElement: null,\\r\\n cursorButton: \\\"up\\\",\\r\\n // text elements are reset on finalize, and resetting on pointerup\\r\\n // may cause issues with double taps\\r\\n editingElement: multiElement || (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this11.state.editingElement) ? _this11.state.editingElement : null\\r\\n });\\r\\n _this11.savePointer(childEvent.clientX, childEvent.clientY, \\\"up\\\"); // Handle end of dragging a point of a linear element, might close a loop\\r\\n // and sets binding element\\r\\n if (_this11.state.editingLinearElement) {\\r\\n if (!pointerDownState.boxSelection.hasOccurred && (((_b = (_a = pointerDownState.hit) === null || _a === void 0 ? void 0 : _a.element) === null || _b === void 0 ? void 0 : _b.id) !== _this11.state.editingLinearElement.elementId || !pointerDownState.hit.hasHitElementInside)) {\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n }\\r\\n else {\\r\\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerUp(childEvent, _this11.state.editingLinearElement, _this11.state);\\r\\n if (editingLinearElement !== _this11.state.editingLinearElement) {\\r\\n _this11.setState({\\r\\n editingLinearElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n }\\r\\n }\\r\\n lastPointerUp = null;\\r\\n if (pointerDownState.eventListeners.onMove) {\\r\\n pointerDownState.eventListeners.onMove.flush();\\r\\n }\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_MOVE, pointerDownState.eventListeners.onMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, pointerDownState.eventListeners.onUp);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYDOWN, pointerDownState.eventListeners.onKeyDown);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYUP, pointerDownState.eventListeners.onKeyUp);\\r\\n if (_this11.state.pendingImageElementId) {\\r\\n _this11.setState({\\r\\n pendingImageElementId: null\\r\\n });\\r\\n }\\r\\n if ((draggingElement === null || draggingElement === void 0 ? void 0 : draggingElement.type) === \\\"freedraw\\\") {\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, _this11.state);\\r\\n const points = draggingElement.points;\\r\\n let dx = pointerCoords.x - draggingElement.x;\\r\\n let dy = pointerCoords.y - draggingElement.y; // Allows dots to avoid being flagged as infinitely small\\r\\n if (dx === points[0][0] && dy === points[0][1]) {\\r\\n dy += 0.0001;\\r\\n dx += 0.0001;\\r\\n }\\r\\n const pressures = draggingElement.simulatePressure ? [] : [...draggingElement.pressures, childEvent.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]],\\r\\n pressures,\\r\\n lastCommittedPoint: [dx, dy]\\r\\n });\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(draggingElement)) {\\r\\n const imageElement = draggingElement;\\r\\n try {\\r\\n _this11.initializeImageDimensions(imageElement);\\r\\n _this11.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().filter(function (el) {\\r\\n return el.id !== imageElement.id;\\r\\n }));\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n }\\r\\n return;\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\\r\\n if (draggingElement.points.length > 1) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, _this11.state);\\r\\n if (!pointerDownState.drag.hasOccurred && draggingElement && !multiElement) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...draggingElement.points, [pointerCoords.x - draggingElement.x, pointerCoords.y - draggingElement.y]]\\r\\n });\\r\\n _this11.setState({\\r\\n multiElement: draggingElement,\\r\\n editingElement: _this11.state.draggingElement\\r\\n });\\r\\n }\\r\\n else if (pointerDownState.drag.hasOccurred && !multiElement) {\\r\\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this11.state) && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement, false)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(draggingElement, _this11.state, _this11.scene, pointerCoords);\\r\\n }\\r\\n _this11.setState({\\r\\n suggestedBindings: [],\\r\\n startBoundElement: null\\r\\n });\\r\\n if (!activeTool.locked) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this11.canvas);\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n draggingElement: null,\\r\\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateActiveTool)(_this11.state, {\\r\\n type: \\\"selection\\\"\\r\\n }),\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n draggingElement: null,\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n }\\r\\n return;\\r\\n }\\r\\n if (activeTool.type !== \\\"selection\\\" && draggingElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(draggingElement)) {\\r\\n // remove invisible element which was added in onPointerDown\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().slice(0, -1));\\r\\n _this11.setState({\\r\\n draggingElement: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (draggingElement) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getNormalizedDimensions)(draggingElement));\\r\\n }\\r\\n if (resizingElement) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n if (resizingElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(resizingElement)) {\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().filter(function (el) {\\r\\n return el.id !== resizingElement.id;\\r\\n }));\\r\\n } // Code below handles selection when element(s) weren't\\r\\n // drag or added to selection on pointer down phase.\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_11__.isEraserActive)(_this11.state)) {\\r\\n const draggedDistance = (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(_this11.lastPointerDown.clientX, _this11.lastPointerDown.clientY, _this11.lastPointerUp.clientX, _this11.lastPointerUp.clientY);\\r\\n if (draggedDistance === 0) {\\r\\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: _this11.lastPointerUp.clientX,\\r\\n clientY: _this11.lastPointerUp.clientY\\r\\n }, _this11.state);\\r\\n const hitElements = _this11.getElementsAtPosition(scenePointer.x, scenePointer.y);\\r\\n hitElements.forEach(function (hitElement) {\\r\\n return pointerDownState.elementIdsToErase[hitElement.id] = {\\r\\n erase: true,\\r\\n opacity: hitElement.opacity\\r\\n };\\r\\n });\\r\\n }\\r\\n _this11.eraseElements(pointerDownState);\\r\\n return;\\r\\n }\\r\\n else if (Object.keys(pointerDownState.elementIdsToErase).length) {\\r\\n _this11.restoreReadyToEraseElements(pointerDownState);\\r\\n }\\r\\n if (hitElement && !pointerDownState.drag.hasOccurred && !pointerDownState.hit.wasAddedToSelection && ( // if we're editing a line, pointerup shouldn't switch selection if\\r\\n // box selected\\r\\n !_this11.state.editingLinearElement || !pointerDownState.boxSelection.hasOccurred)) {\\r\\n // when inside line editor, shift selects points instead\\r\\n if (childEvent.shiftKey && !_this11.state.editingLinearElement) {\\r\\n if (_this11.state.selectedElementIds[hitElement.id]) {\\r\\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_24__.isSelectedViaGroup)(_this11.state, hitElement)) {\\r\\n // We want to unselect all groups hitElement is part of\\r\\n // as well as all elements that are part of the groups\\r\\n // hitElement is part of\\r\\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds.flatMap(function (groupId) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getElementsInGroup)(_this11.scene.getNonDeletedElements(), groupId);\\r\\n }).map(function (element) {\\r\\n return {\\r\\n [element.id]: false\\r\\n };\\r\\n }).reduce(function (prevId, acc) {\\r\\n return _objectSpread(_objectSpread({}, prevId), acc);\\r\\n }, {});\\r\\n _this11.setState(function (_prevState) {\\r\\n return {\\r\\n selectedGroupIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), hitElement.groupIds.map(function (gId) {\\r\\n return {\\r\\n [gId]: false\\r\\n };\\r\\n }).reduce(function (prev, acc) {\\r\\n return _objectSpread(_objectSpread({}, prev), acc);\\r\\n }, {})),\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), idsOfSelectedElementsThatAreInGroups)\\r\\n };\\r\\n });\\r\\n }\\r\\n else {\\r\\n // remove element from selection while\\r\\n // keeping prev elements selected\\r\\n _this11.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: false\\r\\n })\\r\\n }), _this11.scene.getNonDeletedElements());\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n // add element to selection while\\r\\n // keeping prev elements selected\\r\\n _this11.setState(function (_prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n _this11.setState(function (prevState) {\\r\\n return _objectSpread({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: {\\r\\n [hitElement.id]: true\\r\\n }\\r\\n }), _this11.scene.getNonDeletedElements()));\\r\\n });\\r\\n }\\r\\n }\\r\\n if (!_this11.state.editingLinearElement && !pointerDownState.drag.hasOccurred && !_this11.state.isResizing && (hitElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(hitElement, _this11.state, pointerDownState.origin.x, pointerDownState.origin.y) || !hitElement && pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements)) {\\r\\n // Deselect selected elements\\r\\n _this11.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (!activeTool.locked && activeTool.type !== \\\"freedraw\\\" && draggingElement) {\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n if (activeTool.type !== \\\"selection\\\" || (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(_this11.scene.getNonDeletedElements(), _this11.state)) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\\r\\n ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this11.state) ? _element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements : _element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this11.scene.getNonDeletedElements(), _this11.state));\\r\\n }\\r\\n if (!activeTool.locked && activeTool.type !== \\\"freedraw\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this11.canvas);\\r\\n _this11.setState({\\r\\n draggingElement: null,\\r\\n suggestedBindings: [],\\r\\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateActiveTool)(_this11.state, {\\r\\n type: \\\"selection\\\"\\r\\n })\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this11.setState({\\r\\n draggingElement: null,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n });\\r\\n }\\r\\n maybeSuggestBindingForAll(selectedElements) {\\r\\n const suggestedBindings = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getEligibleElementsForBinding)(selectedElements);\\r\\n this.setState({\\r\\n suggestedBindings\\r\\n });\\r\\n }\\r\\n clearSelection(hitElement) {\\r\\n this.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n // Continue editing the same group if the user selected a different\\r\\n // element from it\\r\\n editingGroupId: prevState.editingGroupId && hitElement != null && (0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, prevState.editingGroupId) ? prevState.editingGroupId : null\\r\\n };\\r\\n });\\r\\n this.setState({\\r\\n selectedElementIds: {},\\r\\n previousSelectedElementIds: this.state.selectedElementIds\\r\\n });\\r\\n }\\r\\n getTextWysiwygSnappedToCenterPosition(x, y, appState, canvas, scale) {\\r\\n const elementClickedInside = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getTextBindableContainerAtPosition)(this.scene.getElementsIncludingDeleted().filter(function (element) {\\r\\n return !(0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element);\\r\\n }), x, y);\\r\\n if (elementClickedInside) {\\r\\n const elementCenterX = elementClickedInside.x + elementClickedInside.width / 2;\\r\\n const elementCenterY = elementClickedInside.y + elementClickedInside.height / 2;\\r\\n const distanceToCenter = Math.hypot(x - elementCenterX, y - elementCenterY);\\r\\n const isSnappedToCenter = distanceToCenter < _constants__WEBPACK_IMPORTED_MODULE_13__.TEXT_TO_CENTER_SNAP_THRESHOLD;\\r\\n if (isSnappedToCenter) {\\r\\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: elementCenterX,\\r\\n sceneY: elementCenterY\\r\\n }, appState);\\r\\n return {\\r\\n viewportX,\\r\\n viewportY,\\r\\n elementCenterX,\\r\\n elementCenterY\\r\\n };\\r\\n }\\r\\n }\\r\\n }\\r\\n getCanvasOffsets() {\\r\\n var _a;\\r\\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\\r\\n const excalidrawContainer = this.excalidrawContainerRef.current;\\r\\n const { left, top } = excalidrawContainer.getBoundingClientRect();\\r\\n return {\\r\\n offsetLeft: left,\\r\\n offsetTop: top\\r\\n };\\r\\n }\\r\\n return {\\r\\n offsetLeft: 0,\\r\\n offsetTop: 0\\r\\n };\\r\\n }\\r\\n updateLanguage() {\\r\\n var _this12 = this;\\r\\n return (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n const currentLang = _i18n__WEBPACK_IMPORTED_MODULE_26__.languages.find(function (lang) {\\r\\n return lang.code === _this12.props.langCode;\\r\\n }) || _i18n__WEBPACK_IMPORTED_MODULE_26__.defaultLang;\\r\\n yield (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.setLanguage)(currentLang);\\r\\n _this12.setAppState({});\\r\\n })();\\r\\n }\\r\\n} // -----------------------------------------------------------------------------\\r\\n// TEST HOOKS\\r\\n// -----------------------------------------------------------------------------\\r\\nApp.defaultProps = {\\r\\n // needed for tests to pass since we directly render App in many tests\\r\\n UIOptions: _constants__WEBPACK_IMPORTED_MODULE_13__.DEFAULT_UI_OPTIONS\\r\\n};\\r\\nvar _initialiseProps = function () {\\r\\n var _this13 = this;\\r\\n this.canvas = null;\\r\\n this.rc = null;\\r\\n this.unmounted = false;\\r\\n this.device = deviceContextInitialValue;\\r\\n this.excalidrawContainerRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createRef();\\r\\n this.files = {};\\r\\n this.imageCache = new Map();\\r\\n this.lastPointerDown = null;\\r\\n this.lastPointerUp = null;\\r\\n this.contextMenuOpen = false;\\r\\n this.lastScenePointer = null;\\r\\n this.allowMobileMode = true;\\r\\n this.focusContainer = function () {\\r\\n var _a;\\r\\n if (_this13.props.autoFocus) {\\r\\n (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.focus();\\r\\n }\\r\\n };\\r\\n this.getSceneElementsIncludingDeleted = function () {\\r\\n return _this13.scene.getElementsIncludingDeleted();\\r\\n };\\r\\n this.getSceneElements = function () {\\r\\n return _this13.scene.getNonDeletedElements();\\r\\n };\\r\\n this.syncActionResult = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (actionResult) {\\r\\n var _a, _b, _c, _d, _e, _f;\\r\\n // Since context menu closes when action triggered so setting to false\\r\\n _this13.contextMenuOpen = false;\\r\\n if (_this13.unmounted || actionResult === false) {\\r\\n return;\\r\\n }\\r\\n let editingElement = null;\\r\\n if (actionResult.elements) {\\r\\n actionResult.elements.forEach(function (element) {\\r\\n var _a;\\r\\n if (((_a = _this13.state.editingElement) === null || _a === void 0 ? void 0 : _a.id) === element.id && _this13.state.editingElement !== element && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\\r\\n editingElement = element;\\r\\n }\\r\\n });\\r\\n _this13.scene.replaceAllElements(actionResult.elements);\\r\\n if (actionResult.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n }\\r\\n if (actionResult.files) {\\r\\n _this13.files = actionResult.replaceFiles ? actionResult.files : _objectSpread(_objectSpread({}, _this13.files), actionResult.files);\\r\\n _this13.addNewImagesToImageCache();\\r\\n }\\r\\n if (actionResult.appState || editingElement) {\\r\\n if (actionResult.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n let viewModeEnabled = ((_a = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _a === void 0 ? void 0 : _a.viewModeEnabled) || false;\\r\\n let zenModeEnabled = ((_b = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _b === void 0 ? void 0 : _b.zenModeEnabled) || false;\\r\\n let gridSize = ((_c = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _c === void 0 ? void 0 : _c.gridSize) || null;\\r\\n let theme = ((_d = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _d === void 0 ? void 0 : _d.theme) || _constants__WEBPACK_IMPORTED_MODULE_13__.THEME.LIGHT;\\r\\n let name = (_f = (_e = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : _this13.state.name;\\r\\n if (typeof _this13.props.viewModeEnabled !== \\\"undefined\\\") {\\r\\n viewModeEnabled = _this13.props.viewModeEnabled;\\r\\n }\\r\\n if (typeof _this13.props.zenModeEnabled !== \\\"undefined\\\") {\\r\\n zenModeEnabled = _this13.props.zenModeEnabled;\\r\\n }\\r\\n if (typeof _this13.props.gridModeEnabled !== \\\"undefined\\\") {\\r\\n gridSize = _this13.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_13__.GRID_SIZE : null;\\r\\n }\\r\\n if (typeof _this13.props.theme !== \\\"undefined\\\") {\\r\\n theme = _this13.props.theme;\\r\\n }\\r\\n if (typeof _this13.props.name !== \\\"undefined\\\") {\\r\\n name = _this13.props.name;\\r\\n }\\r\\n _this13.setState(function (state) {\\r\\n var _a;\\r\\n // using Object.assign instead of spread to fool TS 4.2.2+ into\\r\\n // regarding the resulting type as not containing undefined\\r\\n // (which the following expression will never contain)\\r\\n return Object.assign(actionResult.appState || {}, {\\r\\n editingElement: editingElement || ((_a = actionResult.appState) === null || _a === void 0 ? void 0 : _a.editingElement) || null,\\r\\n viewModeEnabled,\\r\\n zenModeEnabled,\\r\\n gridSize,\\r\\n theme,\\r\\n name\\r\\n });\\r\\n }, function () {\\r\\n if (actionResult.syncHistory) {\\r\\n _this13.history.setCurrentState(_this13.state, _this13.scene.getElementsIncludingDeleted());\\r\\n }\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onBlur = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n isHoldingSpace = false;\\r\\n _this13.setState({\\r\\n isBindingEnabled: true\\r\\n });\\r\\n });\\r\\n this.onUnload = function () {\\r\\n _this13.onBlur();\\r\\n };\\r\\n this.disableEvent = function (event) {\\r\\n event.preventDefault();\\r\\n };\\r\\n this.onFontLoaded = function () {\\r\\n _this13.scene.getElementsIncludingDeleted().forEach(function (element) {\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element)) {\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n }\\r\\n });\\r\\n _this13.onSceneUpdated();\\r\\n };\\r\\n this.resetHistory = function () {\\r\\n _this13.history.clear();\\r\\n };\\r\\n this.resetScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (opts) {\\r\\n _this13.scene.replaceAllElements([]);\\r\\n _this13.setState(function (state) {\\r\\n return _objectSpread(_objectSpread({}, (0,_appState__WEBPACK_IMPORTED_MODULE_11__.getDefaultAppState)()), {}, {\\r\\n isLoading: (opts === null || opts === void 0 ? void 0 : opts.resetLoadingState) ? false : state.isLoading,\\r\\n theme: _this13.state.theme\\r\\n });\\r\\n });\\r\\n _this13.resetHistory();\\r\\n });\\r\\n this.initializeScene = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n var _a;\\r\\n if (\\\"launchQueue\\\" in window && \\\"LaunchParams\\\" in window) {\\r\\n window.launchQueue.setConsumer(/*#__PURE__*/ function () {\\r\\n var _ref5 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (launchParams) {\\r\\n if (!launchParams.files.length) {\\r\\n return;\\r\\n }\\r\\n const fileHandle = launchParams.files[0];\\r\\n const blob = yield fileHandle.getFile();\\r\\n _this13.loadFileToCanvas(new File([blob], blob.name || \\\"\\\", {\\r\\n type: blob.type\\r\\n }), fileHandle);\\r\\n });\\r\\n return function (_x) {\\r\\n return _ref5.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n }\\r\\n if (!_this13.state.isLoading) {\\r\\n _this13.setState({\\r\\n isLoading: true\\r\\n });\\r\\n }\\r\\n let initialData = null;\\r\\n try {\\r\\n initialData = (yield _this13.props.initialData) || null;\\r\\n if (initialData === null || initialData === void 0 ? void 0 : initialData.libraryItems) {\\r\\n _this13.library.updateLibrary({\\r\\n libraryItems: initialData.libraryItems,\\r\\n merge: true\\r\\n }).catch(function (error) {\\r\\n console.error(error);\\r\\n });\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n initialData = {\\r\\n appState: {\\r\\n errorMessage: error.message || \\\"Encountered an error during importing or restoring scene data\\\"\\r\\n }\\r\\n };\\r\\n }\\r\\n const scene = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restore)(initialData, null, null);\\r\\n scene.appState = _objectSpread(_objectSpread({}, scene.appState), {}, {\\r\\n // we're falling back to current (pre-init) state when deciding\\r\\n // whether to open the library, to handle a case where we\\r\\n // update the state outside of initialData (e.g. when loading the app\\r\\n // with a library install link, which should auto-open the library)\\r\\n isLibraryOpen: ((_a = initialData === null || initialData === void 0 ? void 0 : initialData.appState) === null || _a === void 0 ? void 0 : _a.isLibraryOpen) || _this13.state.isLibraryOpen,\\r\\n activeTool: scene.appState.activeTool.type === \\\"image\\\" ? _objectSpread(_objectSpread({}, scene.appState.activeTool), {}, {\\r\\n type: \\\"selection\\\"\\r\\n }) : scene.appState.activeTool,\\r\\n isLoading: false,\\r\\n toast: _this13.state.toast\\r\\n });\\r\\n if (initialData === null || initialData === void 0 ? void 0 : initialData.scrollToContent) {\\r\\n scene.appState = _objectSpread(_objectSpread({}, scene.appState), (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(scene.elements, _objectSpread(_objectSpread({}, scene.appState), {}, {\\r\\n width: _this13.state.width,\\r\\n height: _this13.state.height,\\r\\n offsetTop: _this13.state.offsetTop,\\r\\n offsetLeft: _this13.state.offsetLeft\\r\\n }), null));\\r\\n }\\r\\n _this13.resetHistory();\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n commitToHistory: true\\r\\n }));\\r\\n });\\r\\n this.refreshDeviceState = function (container) {\\r\\n const { width, height } = container.getBoundingClientRect();\\r\\n const sidebarBreakpoint = _this13.props.UIOptions.dockedSidebarBreakpoint != null ? _this13.props.UIOptions.dockedSidebarBreakpoint : _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_RIGHT_SIDEBAR_MIN_WIDTH;\\r\\n _this13.device = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateObject)(_this13.device, {\\r\\n isSmScreen: width < _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_SM_MAX_WIDTH,\\r\\n isMobile: _this13.allowMobileMode && ( //zsviczian\\r\\n width < _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_WIDTH_PORTRAIT || height < _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_HEIGHT_LANDSCAPE && width < _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_WIDTH_LANDSCAPE),\\r\\n canDeviceFitSidebar: width > sidebarBreakpoint\\r\\n });\\r\\n };\\r\\n this.onResize = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n _this13.scene.getElementsIncludingDeleted().forEach(function (element) {\\r\\n return (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n });\\r\\n _this13.setState({});\\r\\n });\\r\\n this.onScroll = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(function () {\\r\\n const { offsetTop, offsetLeft } = _this13.getCanvasOffsets();\\r\\n _this13.setState(function (state) {\\r\\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\\r\\n return null;\\r\\n }\\r\\n return {\\r\\n offsetTop,\\r\\n offsetLeft\\r\\n };\\r\\n });\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_13__.SCROLL_TIMEOUT);\\r\\n this.onCut = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\\r\\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\\r\\n return;\\r\\n }\\r\\n _this13.cutAll();\\r\\n event.preventDefault();\\r\\n event.stopPropagation();\\r\\n });\\r\\n this.onCopy = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\\r\\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\\r\\n return;\\r\\n }\\r\\n _this13.copyAll();\\r\\n event.preventDefault();\\r\\n event.stopPropagation();\\r\\n });\\r\\n this.cutAll = function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionCut, \\\"keyboard\\\");\\r\\n };\\r\\n this.copyAll = function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionCopy, \\\"keyboard\\\");\\r\\n };\\r\\n this.onTapStart = function (event) {\\r\\n // fix for Apple Pencil Scribble\\r\\n // On Android, preventing the event would disable contextMenu on tap-hold\\r\\n if (!_keys__WEBPACK_IMPORTED_MODULE_27__.isAndroid) {\\r\\n event.preventDefault();\\r\\n }\\r\\n if (!didTapTwice) {\\r\\n didTapTwice = true;\\r\\n clearTimeout(tappedTwiceTimer);\\r\\n tappedTwiceTimer = window.setTimeout(App.resetTapTwice, _constants__WEBPACK_IMPORTED_MODULE_13__.TAP_TWICE_TIMEOUT);\\r\\n return;\\r\\n } // insert text only if we tapped twice with a single finger\\r\\n // event.touches.length === 1 will also prevent inserting text when user's zooming\\r\\n if (didTapTwice && event.touches.length === 1) {\\r\\n const [touch] = event.touches; // @ts-ignore\\r\\n _this13.handleCanvasDoubleClick({\\r\\n clientX: touch.clientX,\\r\\n clientY: touch.clientY\\r\\n });\\r\\n didTapTwice = false;\\r\\n clearTimeout(tappedTwiceTimer);\\r\\n }\\r\\n if (_keys__WEBPACK_IMPORTED_MODULE_27__.isAndroid) {\\r\\n event.preventDefault();\\r\\n }\\r\\n if (event.touches.length === 2) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {}\\r\\n });\\r\\n }\\r\\n };\\r\\n this.onTapEnd = function (event) {\\r\\n _this13.resetContextMenuTimer();\\r\\n if (event.touches.length > 0) {\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: {},\\r\\n selectedElementIds: _this13.state.previousSelectedElementIds\\r\\n });\\r\\n }\\r\\n else {\\r\\n gesture.pointers.clear();\\r\\n }\\r\\n };\\r\\n this.pasteFromClipboard = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(/*#__PURE__*/ function () {\\r\\n var _ref6 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (event) {\\r\\n var _a, _b;\\r\\n // #686\\r\\n const target = document.activeElement;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(target);\\r\\n if (!isExcalidrawActive) {\\r\\n return;\\r\\n }\\r\\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\\r\\n if ( // if no ClipboardEvent supplied, assume we're pasting via contextMenu\\r\\n // thus these checks don't make sense\\r\\n event && (!(elementUnderCursor instanceof HTMLCanvasElement) || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(target))) {\\r\\n return;\\r\\n } // must be called in the same frame (thus before any awaits) as the paste\\r\\n // event else some browsers (FF...) will clear the clipboardData\\r\\n // (something something security)\\r\\n let file = (_b = event === null || event === void 0 ? void 0 : event.clipboardData) === null || _b === void 0 ? void 0 : _b.files[0];\\r\\n const data = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_12__.parseClipboard)(event);\\r\\n if (!file && data.text) {\\r\\n const string = data.text.trim();\\r\\n if (string.startsWith(\\\"<svg\\\") && string.endsWith(\\\"</svg>\\\")) {\\r\\n // ignore SVG validation/normalization which will be done during image\\r\\n // initialization\\r\\n file = (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.SVGStringToFile)(string);\\r\\n }\\r\\n } // prefer spreadsheet data over image file (MS Office/Libre Office)\\r\\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(file) && !data.spreadsheet) {\\r\\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: cursorX,\\r\\n clientY: cursorY\\r\\n }, _this13.state);\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX,\\r\\n sceneY\\r\\n });\\r\\n _this13.insertImageElement(imageElement, file);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (_this13.props.onPaste) {\\r\\n try {\\r\\n if ((yield _this13.props.onPaste(data, event)) === false) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n }\\r\\n if (data.errorMessage) {\\r\\n _this13.setState({\\r\\n errorMessage: data.errorMessage\\r\\n });\\r\\n }\\r\\n else if (data.spreadsheet) {\\r\\n _this13.setState({\\r\\n pasteDialog: {\\r\\n data: data.spreadsheet,\\r\\n shown: true\\r\\n }\\r\\n });\\r\\n }\\r\\n else if (data.elements) {\\r\\n _this13.addElementsFromPasteOrLibrary({\\r\\n elements: data.elements,\\r\\n files: data.files || null,\\r\\n position: \\\"cursor\\\"\\r\\n });\\r\\n }\\r\\n else if (data.text) {\\r\\n _this13.addTextFromPaste(data.text);\\r\\n }\\r\\n _this13.setActiveTool({\\r\\n type: \\\"selection\\\"\\r\\n });\\r\\n event === null || event === void 0 ? void 0 : event.preventDefault();\\r\\n });\\r\\n return function (_x2) {\\r\\n return _ref6.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n this.addElementsFromPasteOrLibrary = function (opts) {\\r\\n const elements = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreElements)(opts.elements, null);\\r\\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(elements);\\r\\n const elementsCenterX = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minX, maxX) / 2;\\r\\n const elementsCenterY = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minY, maxY) / 2;\\r\\n const clientX = typeof opts.position === \\\"object\\\" ? opts.position.clientX : opts.position === \\\"cursor\\\" ? cursorX : _this13.state.width / 2 + _this13.state.offsetLeft;\\r\\n const clientY = typeof opts.position === \\\"object\\\" ? opts.position.clientY : opts.position === \\\"cursor\\\" ? cursorY : _this13.state.height / 2 + _this13.state.offsetTop;\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX,\\r\\n clientY\\r\\n }, _this13.state);\\r\\n const dx = x - elementsCenterX;\\r\\n const dy = y - elementsCenterY;\\r\\n const groupIdMap = new Map();\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(dx, dy, _this13.state.gridSize);\\r\\n const oldIdToDuplicatedId = new Map();\\r\\n const newElements = elements.map(function (element) {\\r\\n const newElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(_this13.state.editingGroupId, groupIdMap, element, {\\r\\n x: element.x + gridX - minX,\\r\\n y: element.y + gridY - minY\\r\\n });\\r\\n oldIdToDuplicatedId.set(element.id, newElement.id);\\r\\n return newElement;\\r\\n });\\r\\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.bindTextToShapeAfterDuplication)(newElements, elements, oldIdToDuplicatedId);\\r\\n const nextElements = [..._this13.scene.getElementsIncludingDeleted(), ...newElements];\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextElements, elements, oldIdToDuplicatedId);\\r\\n if (opts.files) {\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), opts.files);\\r\\n }\\r\\n _this13.scene.replaceAllElements(nextElements);\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState((0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, _this13.state), {}, {\\r\\n isLibraryOpen: _this13.state.isLibraryOpen && _this13.device.canDeviceFitSidebar ? _this13.state.isLibraryMenuDocked : false,\\r\\n selectedElementIds: newElements.reduce(function (acc, element) {\\r\\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBoundToContainer)(element)) {\\r\\n acc[element.id] = true;\\r\\n }\\r\\n return acc;\\r\\n }, {}),\\r\\n selectedGroupIds: {}\\r\\n }), _this13.scene.getNonDeletedElements()), function () {\\r\\n if (opts.files) {\\r\\n _this13.addNewImagesToImageCache();\\r\\n }\\r\\n });\\r\\n _this13.setActiveTool({\\r\\n type: \\\"selection\\\"\\r\\n });\\r\\n };\\r\\n this.setAppState = function (obj) {\\r\\n _this13.setState(obj);\\r\\n };\\r\\n this.removePointer = function (event) {\\r\\n if (touchTimeout) {\\r\\n _this13.resetContextMenuTimer();\\r\\n }\\r\\n gesture.pointers.delete(event.pointerId);\\r\\n };\\r\\n this.toggleLock = function () {\\r\\n let source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \\\"ui\\\";\\r\\n if (!_this13.state.activeTool.locked) {\\r\\n (0,_analytics__WEBPACK_IMPORTED_MODULE_10__.trackEvent)(\\\"toolbar\\\", \\\"toggleLock\\\", `${source} (${_this13.device.isMobile ? \\\"mobile\\\" : \\\"desktop\\\"})`);\\r\\n }\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n activeTool: _objectSpread(_objectSpread(_objectSpread({}, prevState.activeTool), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateActiveTool)(_this13.state, prevState.activeTool.locked ? {\\r\\n type: \\\"selection\\\"\\r\\n } : prevState.activeTool)), {}, {\\r\\n locked: !prevState.activeTool.locked\\r\\n })\\r\\n };\\r\\n });\\r\\n };\\r\\n this.togglePenMode = function () {\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n penMode: !prevState.penMode\\r\\n };\\r\\n });\\r\\n };\\r\\n this.scrollToContent = function () {\\r\\n let target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this13.scene.getNonDeletedElements();\\r\\n _this13.setState(_objectSpread({}, (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(Array.isArray(target) ? target : [target], _this13.state, _this13.canvas)));\\r\\n };\\r\\n this.zoomToFit = function () {\\r\\n let target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this13.scene.getNonDeletedElements();\\r\\n let maxZoom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\\r\\n let margin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.03;\\r\\n if (!target) {\\r\\n target = _this13.scene.getNonDeletedElements();\\r\\n }\\r\\n if (target.length === 0) {\\r\\n maxZoom = 1;\\r\\n }\\r\\n _this13.setState((0,_actions__WEBPACK_IMPORTED_MODULE_6__.zoomToFitElements)(target, _this13.state, false, maxZoom, margin).appState);\\r\\n };\\r\\n this.updateContainerSize = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (containers) {\\r\\n containers.forEach(function (el) {\\r\\n const [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.rotate)(el.x + el.width, el.y + el.height, el.x + el.width / 2, el.y + el.height / 2, el.angle);\\r\\n (0,_element_resizeElements__WEBPACK_IMPORTED_MODULE_46__.resizeSingleElement)(new Map().set(el.id, el), true, el, \\\"se\\\", true, x, y);\\r\\n });\\r\\n });\\r\\n this.restore = function (data) {\\r\\n return (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restore)(data, null, null);\\r\\n };\\r\\n this.setToast = function (toast) {\\r\\n _this13.setState({\\r\\n toast\\r\\n });\\r\\n };\\r\\n this.restoreFileFromShare = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n try {\\r\\n const webShareTargetCache = yield caches.open(\\\"web-share-target\\\");\\r\\n const response = yield webShareTargetCache.match(\\\"shared-file\\\");\\r\\n if (response) {\\r\\n const blob = yield response.blob();\\r\\n const file = new File([blob], blob.name || \\\"\\\", {\\r\\n type: blob.type\\r\\n });\\r\\n _this13.loadFileToCanvas(file, null);\\r\\n yield webShareTargetCache.delete(\\\"shared-file\\\");\\r\\n window.history.replaceState(null, _constants__WEBPACK_IMPORTED_MODULE_13__.APP_NAME, window.location.pathname);\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n _this13.setState({\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n });\\r\\n this.addFiles = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (files) {\\r\\n const filesMap = files.reduce(function (acc, fileData) {\\r\\n acc.set(fileData.id, fileData);\\r\\n return acc;\\r\\n }, new Map());\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), Object.fromEntries(filesMap));\\r\\n _this13.scene.getNonDeletedElements().forEach(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(element) && filesMap.has(element.fileId)) {\\r\\n _this13.imageCache.delete(element.fileId);\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n }\\r\\n });\\r\\n _this13.scene.informMutation();\\r\\n _this13.addNewImagesToImageCache();\\r\\n });\\r\\n this.setMobileModeAllowed = function (allow) {\\r\\n const { width, height } = _this13.excalidrawContainerRef.current.getBoundingClientRect();\\r\\n _this13.allowMobileMode = allow;\\r\\n if (allow) {\\r\\n _this13.device = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateObject)(_this13.device, {\\r\\n isMobile: width < _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_WIDTH_PORTRAIT || height < _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_HEIGHT_LANDSCAPE && width < _constants__WEBPACK_IMPORTED_MODULE_13__.MQ_MAX_WIDTH_LANDSCAPE\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.device = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateObject)(_this13.device, {\\r\\n isMobile: false\\r\\n });\\r\\n }\\r\\n _this13.forceUpdate();\\r\\n };\\r\\n this.setLocalFont = function (showOnPanel) {\\r\\n showFourthFont = showOnPanel;\\r\\n };\\r\\n this.selectElements = function (elements) {\\r\\n _this13.updateScene({\\r\\n appState: _objectSpread(_objectSpread({}, _this13.state), {}, {\\r\\n editingGroupId: null,\\r\\n selectedElementIds: elements.reduce(function (map, element) {\\r\\n map[element.id] = true;\\r\\n return map;\\r\\n }, {})\\r\\n }),\\r\\n commitToHistory: true\\r\\n });\\r\\n };\\r\\n this.bringToFront = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_6__.actionBringToFront.perform(_this13.scene.getNonDeletedElements(), _this13.state));\\r\\n };\\r\\n this.bringForward = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_6__.actionBringForward.perform(_this13.scene.getNonDeletedElements(), _this13.state));\\r\\n };\\r\\n this.sendToBack = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_6__.actionSendToBack.perform(_this13.scene.getNonDeletedElements(), _this13.state));\\r\\n };\\r\\n this.sendBackward = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_6__.actionSendBackward.perform(_this13.scene.getNonDeletedElements(), _this13.state));\\r\\n };\\r\\n this.updateScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (sceneData) {\\r\\n if (sceneData.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n if (sceneData.appState) {\\r\\n _this13.setState(sceneData.appState);\\r\\n }\\r\\n if (sceneData.elements) {\\r\\n _this13.scene.replaceAllElements(sceneData.elements);\\r\\n }\\r\\n if (sceneData.collaborators) {\\r\\n _this13.setState({\\r\\n collaborators: sceneData.collaborators\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onSceneUpdated = function () {\\r\\n _this13.setState({});\\r\\n };\\r\\n this.updateCurrentCursorPosition = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n cursorX = event.clientX;\\r\\n cursorY = event.clientY;\\r\\n });\\r\\n this.onKeyDown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n // normalize `event.key` when CapsLock is pressed #2372\\r\\n if (\\\"Proxy\\\" in window && (!event.shiftKey && /^[A-Z]$/.test(event.key) || event.shiftKey && /^[a-z]$/.test(event.key))) {\\r\\n event = new Proxy(event, {\\r\\n get(ev, prop) {\\r\\n const value = ev[prop];\\r\\n if (typeof value === \\\"function\\\") {\\r\\n // fix for Proxies hijacking `this`\\r\\n return value.bind(ev);\\r\\n }\\r\\n return prop === \\\"key\\\" ? // CapsLock inverts capitalization based on ShiftKey, so invert\\r\\n // it back\\r\\n event.shiftKey ? ev.key.toUpperCase() : ev.key.toLowerCase() : value;\\r\\n }\\r\\n });\\r\\n } // prevent browser zoom in input fields\\r\\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\\r\\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_27__.CODES.MINUS || event.code === _keys__WEBPACK_IMPORTED_MODULE_27__.CODES.EQUAL) {\\r\\n event.preventDefault();\\r\\n return;\\r\\n }\\r\\n } // bail if\\r\\n if ( // inside an input\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target) && // unless pressing escape (finalize action)\\r\\n event.key !== _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ESCAPE || // or unless using arrows (to move between buttons)\\r\\n (0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key) && (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isInputLike)(event.target)) {\\r\\n return;\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.QUESTION_MARK) {\\r\\n _this13.setState({\\r\\n showHelpDialog: true\\r\\n });\\r\\n }\\r\\n if (_this13.actionManager.handleKeyDown(event)) {\\r\\n return;\\r\\n }\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n return;\\r\\n }\\r\\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && _this13.state.isBindingEnabled) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: false\\r\\n });\\r\\n }\\r\\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_27__.CODES.ZERO) {\\r\\n const nextState = !_this13.state.isLibraryOpen;\\r\\n _this13.setState({\\r\\n isLibraryOpen: nextState\\r\\n }); // track only openings\\r\\n if (nextState) {\\r\\n (0,_analytics__WEBPACK_IMPORTED_MODULE_10__.trackEvent)(\\\"library\\\", \\\"toggleLibrary (open)\\\", `keyboard (${_this13.device.isMobile ? \\\"mobile\\\" : \\\"desktop\\\"})`);\\r\\n }\\r\\n }\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\\r\\n const step = _this13.state.gridSize && (event.shiftKey ? _constants__WEBPACK_IMPORTED_MODULE_13__.ELEMENT_TRANSLATE_AMOUNT : _this13.state.gridSize) || (event.shiftKey ? _constants__WEBPACK_IMPORTED_MODULE_13__.ELEMENT_SHIFT_TRANSLATE_AMOUNT : _constants__WEBPACK_IMPORTED_MODULE_13__.ELEMENT_TRANSLATE_AMOUNT);\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state, true);\\r\\n let offsetX = 0;\\r\\n let offsetY = 0;\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_LEFT) {\\r\\n offsetX = -step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_RIGHT) {\\r\\n offsetX = step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_UP) {\\r\\n offsetY = -step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_DOWN) {\\r\\n offsetY = step;\\r\\n }\\r\\n selectedElements.forEach(function (element) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n x: element.x + offsetX,\\r\\n y: element.y + offsetY\\r\\n });\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element, {\\r\\n simultaneouslyUpdated: selectedElements\\r\\n });\\r\\n });\\r\\n _this13.maybeSuggestBindingForAll(selectedElements);\\r\\n event.preventDefault();\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ENTER) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n if (selectedElements.length === 1) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n if (!_this13.state.editingLinearElement || _this13.state.editingLinearElement.elementId !== selectedElements[0].id) {\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState({\\r\\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], _this13.scene)\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n const selectedElement = selectedElements[0];\\r\\n _this13.startTextEditing({\\r\\n sceneX: selectedElement.x + selectedElement.width / 2,\\r\\n sceneY: selectedElement.y + selectedElement.height / 2,\\r\\n shouldBind: true\\r\\n });\\r\\n event.preventDefault();\\r\\n return;\\r\\n }\\r\\n }\\r\\n }\\r\\n else if (!event.ctrlKey && !event.altKey && !event.metaKey && _this13.state.draggingElement === null) {\\r\\n const shape = (0,_shapes__WEBPACK_IMPORTED_MODULE_34__.findShapeByKey)(event.key);\\r\\n if (shape) {\\r\\n if (_this13.state.activeTool.type !== shape) {\\r\\n (0,_analytics__WEBPACK_IMPORTED_MODULE_10__.trackEvent)(\\\"toolbar\\\", shape, `keyboard (${_this13.device.isMobile ? \\\"mobile\\\" : \\\"desktop\\\"})`);\\r\\n }\\r\\n _this13.setActiveTool({\\r\\n type: shape\\r\\n });\\r\\n event.stopPropagation();\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.Q) {\\r\\n _this13.toggleLock(\\\"keyboard\\\");\\r\\n event.stopPropagation();\\r\\n }\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE && gesture.pointers.size === 0) {\\r\\n isHoldingSpace = true;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.GRABBING);\\r\\n event.preventDefault();\\r\\n }\\r\\n if ((event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G || event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) && !event.altKey && !event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD]) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n if (_this13.state.activeTool.type === \\\"selection\\\" && !selectedElements.length) {\\r\\n return;\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G && ((0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(_this13.state.activeTool.type) || selectedElements.some(function (element) {\\r\\n return (0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(element.type);\\r\\n }))) {\\r\\n _this13.setState({\\r\\n openPopup: \\\"backgroundColorPicker\\\"\\r\\n });\\r\\n event.stopPropagation();\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) {\\r\\n _this13.setState({\\r\\n openPopup: \\\"strokeColorPicker\\\"\\r\\n });\\r\\n event.stopPropagation();\\r\\n }\\r\\n }\\r\\n });\\r\\n this.onWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n // prevent browser pinch zoom on DOM elements\\r\\n if (!(event.target instanceof HTMLCanvasElement) && event.ctrlKey) {\\r\\n event.preventDefault();\\r\\n }\\r\\n });\\r\\n this.onKeyUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE) {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else if (_this13.state.activeTool.type === \\\"selection\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state);\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n isHoldingSpace = false;\\r\\n }\\r\\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !_this13.state.isBindingEnabled) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: true\\r\\n });\\r\\n }\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this13.state) ? (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements)(selectedElements) : (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)(selectedElements);\\r\\n _this13.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n });\\r\\n this.setActiveTool = function (tool) {\\r\\n const nextActiveTool = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateActiveTool)(_this13.state, tool);\\r\\n if (!isHoldingSpace) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state);\\r\\n }\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_35__.isToolIcon)(document.activeElement)) {\\r\\n _this13.focusContainer();\\r\\n }\\r\\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElementType)(nextActiveTool.type)) {\\r\\n _this13.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n if (nextActiveTool.type === \\\"image\\\") {\\r\\n _this13.onImageAction();\\r\\n }\\r\\n if (nextActiveTool.type !== \\\"selection\\\") {\\r\\n _this13.setState({\\r\\n activeTool: nextActiveTool,\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n activeTool: nextActiveTool\\r\\n });\\r\\n }\\r\\n };\\r\\n this.setCursor = function (cursor) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, cursor);\\r\\n };\\r\\n this.resetCursor = function () {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n };\\r\\n this.isTouchScreenMultiTouchGesture = function () {\\r\\n // we don't want to deselect when using trackpad, and multi-point gestures\\r\\n // only work on touch screens, so checking for >= pointers means we're on a\\r\\n // touchscreen\\r\\n return gesture.pointers.size >= 2;\\r\\n };\\r\\n this.onGestureStart = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault(); // we only want to deselect on touch screens because user may have selected\\r\\n // elements by mistake while zooming\\r\\n if (_this13.isTouchScreenMultiTouchGesture()) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {}\\r\\n });\\r\\n }\\r\\n gesture.initialScale = _this13.state.zoom.value;\\r\\n });\\r\\n this.onGestureChange = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault(); // onGestureChange only has zoom factor but not the center.\\r\\n // If we're on iPad or iPhone, then we recognize multi-touch and will\\r\\n // zoom in at the right location in the touchmove handler\\r\\n // (handleCanvasPointerMove).\\r\\n //\\r\\n // On Macbook trackpad, we don't have those events so will zoom in at the\\r\\n // current location instead.\\r\\n //\\r\\n // As such, bail from this handler on touch devices.\\r\\n if (_this13.isTouchScreenMultiTouchGesture()) {\\r\\n return;\\r\\n }\\r\\n const initialScale = gesture.initialScale;\\r\\n if (initialScale) {\\r\\n _this13.setState(function (state) {\\r\\n return _objectSpread({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getStateForZoom)({\\r\\n viewportX: cursorX,\\r\\n viewportY: cursorY,\\r\\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * event.scale)\\r\\n }, state));\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onGestureEnd = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault(); // reselect elements only on touch screens (see onGestureStart)\\r\\n if (_this13.isTouchScreenMultiTouchGesture()) {\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: {},\\r\\n selectedElementIds: _this13.state.previousSelectedElementIds\\r\\n });\\r\\n }\\r\\n gesture.initialScale = null;\\r\\n });\\r\\n this.startTextEditing = function (_ref8) {\\r\\n var _a, _b;\\r\\n let { sceneX, sceneY, shouldBind, insertAtParentCenter = true } = _ref8;\\r\\n let parentCenterPosition = insertAtParentCenter && _this13.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, _this13.state, _this13.canvas, window.devicePixelRatio);\\r\\n let existingTextElement = null;\\r\\n let container = null;\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n if (selectedElements.length === 1) {\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(selectedElements[0])) {\\r\\n existingTextElement = selectedElements[0];\\r\\n }\\r\\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isTextBindableContainer)(selectedElements[0], false)) {\\r\\n existingTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.getBoundTextElement)(selectedElements[0]);\\r\\n }\\r\\n else {\\r\\n existingTextElement = _this13.getTextElementAtPosition(sceneX, sceneY);\\r\\n }\\r\\n }\\r\\n else {\\r\\n existingTextElement = _this13.getTextElementAtPosition(sceneX, sceneY);\\r\\n } // bind to container when shouldBind is true or\\r\\n // clicked on center of container\\r\\n if (!container && !existingTextElement && (shouldBind || parentCenterPosition)) {\\r\\n container = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getTextBindableContainerAtPosition)(_this13.scene.getNonDeletedElements().filter(function (ele) {\\r\\n return (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isTextBindableContainer)(ele, false) && !(0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.getBoundTextElement)(ele);\\r\\n }), sceneX, sceneY);\\r\\n }\\r\\n if (!existingTextElement && container) {\\r\\n const fontString = {\\r\\n fontSize: _this13.state.currentItemFontSize,\\r\\n fontFamily: _this13.state.currentItemFontFamily\\r\\n };\\r\\n const minWidth = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.getApproxMinLineWidth)((0,_utils__WEBPACK_IMPORTED_MODULE_35__.getFontString)(fontString));\\r\\n const minHeight = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.getApproxMinLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_35__.getFontString)(fontString));\\r\\n const newHeight = Math.max(container.height, minHeight);\\r\\n const newWidth = Math.max(container.width, minWidth);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(container, {\\r\\n height: newHeight,\\r\\n width: newWidth\\r\\n });\\r\\n sceneX = container.x + newWidth / 2;\\r\\n sceneY = container.y + newHeight / 2;\\r\\n if (parentCenterPosition) {\\r\\n parentCenterPosition = _this13.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, _this13.state, _this13.canvas, window.devicePixelRatio);\\r\\n }\\r\\n }\\r\\n const element = existingTextElement ? existingTextElement : (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\\r\\n x: parentCenterPosition ? parentCenterPosition.elementCenterX : sceneX,\\r\\n y: parentCenterPosition ? parentCenterPosition.elementCenterY : sceneY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemStrokeSharpness,\\r\\n text: \\\"\\\",\\r\\n rawText: \\\"\\\",\\r\\n fontSize: _this13.state.currentItemFontSize,\\r\\n fontFamily: _this13.state.currentItemFontFamily,\\r\\n textAlign: parentCenterPosition ? \\\"center\\\" : _this13.state.currentItemTextAlign,\\r\\n verticalAlign: parentCenterPosition ? _constants__WEBPACK_IMPORTED_MODULE_13__.VERTICAL_ALIGN.MIDDLE : _constants__WEBPACK_IMPORTED_MODULE_13__.DEFAULT_VERTICAL_ALIGN,\\r\\n containerId: (_a = container === null || container === void 0 ? void 0 : container.id) !== null && _a !== void 0 ? _a : undefined,\\r\\n groupIds: (_b = container === null || container === void 0 ? void 0 : container.groupIds) !== null && _b !== void 0 ? _b : [],\\r\\n locked: false\\r\\n });\\r\\n _this13.setState({\\r\\n editingElement: element\\r\\n });\\r\\n if (!existingTextElement) {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]); // case: creating new text not centered to parent element → offset Y\\r\\n // so that the text is centered to cursor position\\r\\n if (!parentCenterPosition) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n y: element.y - element.baseline / 2\\r\\n });\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n editingElement: element\\r\\n });\\r\\n _this13.handleTextWysiwyg(element, {\\r\\n isExistingElement: !!existingTextElement\\r\\n });\\r\\n };\\r\\n this.handleCanvasDoubleClick = function (event) {\\r\\n // case: double-clicking with arrow/line tool selected would both create\\r\\n // text and enter multiElement mode\\r\\n if (_this13.state.multiElement) {\\r\\n return;\\r\\n } // we should only be able to double click when mode is selection\\r\\n if (_this13.state.activeTool.type !== \\\"selection\\\") {\\r\\n return;\\r\\n }\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n if (!_this13.state.editingLinearElement || _this13.state.editingLinearElement.elementId !== selectedElements[0].id) {\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState({\\r\\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], _this13.scene)\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n let { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const selectedGroupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIds)(_this13.state);\\r\\n if (selectedGroupIds.length > 0) {\\r\\n const hitElement = _this13.getElementAtPosition(sceneX, sceneY);\\r\\n const selectedGroupId = hitElement && (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIdForElement)(hitElement, _this13.state.selectedGroupIds);\\r\\n if (selectedGroupId) {\\r\\n _this13.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n editingGroupId: selectedGroupId,\\r\\n selectedElementIds: {\\r\\n [hitElement.id]: true\\r\\n },\\r\\n selectedGroupIds: {}\\r\\n }), _this13.scene.getNonDeletedElements());\\r\\n });\\r\\n return;\\r\\n }\\r\\n }\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !_this13.state.viewModeEnabled) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n if (selectedElements.length === 1) {\\r\\n const selectedElement = selectedElements[0];\\r\\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.hasBoundTextElement)(selectedElement);\\r\\n if (canBindText) {\\r\\n sceneX = selectedElement.x + selectedElement.width / 2;\\r\\n sceneY = selectedElement.y + selectedElement.height / 2;\\r\\n }\\r\\n }\\r\\n _this13.startTextEditing({\\r\\n sceneX,\\r\\n sceneY,\\r\\n shouldBind: false,\\r\\n insertAtParentCenter: !event.altKey\\r\\n });\\r\\n }\\r\\n };\\r\\n this.getElementLinkAtPosition = function (scenePointer, hitElement) {\\r\\n // Reversing so we traverse the elements in decreasing order\\r\\n // of z-index\\r\\n const elements = _this13.scene.getNonDeletedElements().slice().reverse();\\r\\n let hitElementIndex = Infinity;\\r\\n return elements.find(function (element, index) {\\r\\n if (hitElement && element.id === hitElement.id) {\\r\\n hitElementIndex = index;\\r\\n }\\r\\n return element.link && index <= hitElementIndex && (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.isPointHittingLinkIcon)(element, _this13.state, [scenePointer.x, scenePointer.y], _this13.device.isMobile);\\r\\n });\\r\\n };\\r\\n this.redirectToLink = function (event, isTouchScreen) {\\r\\n const draggedDistance = (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(_this13.lastPointerDown.clientX, _this13.lastPointerDown.clientY, _this13.lastPointerUp.clientX, _this13.lastPointerUp.clientY);\\r\\n if (!_this13.hitLinkElement || // For touch screen allow dragging threshold else strict check\\r\\n isTouchScreen && draggedDistance > _constants__WEBPACK_IMPORTED_MODULE_13__.DRAGGING_THRESHOLD || !isTouchScreen && draggedDistance !== 0) {\\r\\n return;\\r\\n }\\r\\n const lastPointerDownCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(_this13.lastPointerDown, _this13.state);\\r\\n const lastPointerDownHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.isPointHittingLinkIcon)(_this13.hitLinkElement, _this13.state, [lastPointerDownCoords.x, lastPointerDownCoords.y], _this13.device.isMobile);\\r\\n const lastPointerUpCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(_this13.lastPointerUp, _this13.state);\\r\\n const lastPointerUpHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.isPointHittingLinkIcon)(_this13.hitLinkElement, _this13.state, [lastPointerUpCoords.x, lastPointerUpCoords.y], _this13.device.isMobile);\\r\\n if (lastPointerDownHittingLinkIcon && lastPointerUpHittingLinkIcon) {\\r\\n const url = _this13.hitLinkElement.link;\\r\\n if (url) {\\r\\n let customEvent;\\r\\n if (_this13.props.onLinkOpen) {\\r\\n customEvent = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.wrapEvent)(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.EXCALIDRAW_LINK, event.nativeEvent);\\r\\n _this13.props.onLinkOpen(_this13.hitLinkElement, customEvent);\\r\\n }\\r\\n if (!(customEvent === null || customEvent === void 0 ? void 0 : customEvent.defaultPrevented)) {\\r\\n const target = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.isLocalLink)(url) ? \\\"_self\\\" : \\\"_blank\\\";\\r\\n const newWindow = window.open(undefined, target); // https://mathiasbynens.github.io/rel-noopener/\\r\\n if (newWindow) {\\r\\n newWindow.opener = null;\\r\\n newWindow.location = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.normalizeLink)(url);\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleCanvasPointerMove = function (event) {\\r\\n var _a;\\r\\n _this13.savePointer(event.clientX, event.clientY, _this13.state.cursorButton);\\r\\n if (gesture.pointers.has(event.pointerId)) {\\r\\n gesture.pointers.set(event.pointerId, {\\r\\n x: event.clientX,\\r\\n y: event.clientY\\r\\n });\\r\\n }\\r\\n const initialScale = gesture.initialScale;\\r\\n if (gesture.pointers.size === 2 && gesture.lastCenter && initialScale && gesture.initialDistance) {\\r\\n const center = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\\r\\n const deltaX = center.x - gesture.lastCenter.x;\\r\\n const deltaY = center.y - gesture.lastCenter.y;\\r\\n gesture.lastCenter = center;\\r\\n const distance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\\r\\n const scaleFactor = _this13.state.activeTool.type === \\\"freedraw\\\" && _this13.state.penMode ? 1 : distance / gesture.initialDistance;\\r\\n const nextZoom = scaleFactor ? (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * scaleFactor) : _this13.state.zoom.value;\\r\\n _this13.setState(function (state) {\\r\\n const zoomState = (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getStateForZoom)({\\r\\n viewportX: center.x,\\r\\n viewportY: center.y,\\r\\n nextZoom\\r\\n }, state);\\r\\n return {\\r\\n zoom: zoomState.zoom,\\r\\n scrollX: zoomState.scrollX + deltaX / nextZoom,\\r\\n scrollY: zoomState.scrollY + deltaY / nextZoom,\\r\\n shouldCacheIgnoreZoom: true\\r\\n };\\r\\n });\\r\\n _this13.resetShouldCacheIgnoreZoomDebounced();\\r\\n }\\r\\n else {\\r\\n gesture.lastCenter = gesture.initialDistance = gesture.initialScale = null;\\r\\n }\\r\\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\\r\\n return;\\r\\n }\\r\\n const isPointerOverScrollBars = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - _this13.state.offsetLeft, event.clientY - _this13.state.offsetTop);\\r\\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\\r\\n if (!_this13.state.draggingElement && !_this13.state.multiElement) {\\r\\n if (isOverScrollBar) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state);\\r\\n }\\r\\n }\\r\\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\\r\\n if (_this13.state.editingLinearElement && !_this13.state.editingLinearElement.isDragging) {\\r\\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerMove(event, scenePointerX, scenePointerY, _this13.state.editingLinearElement, _this13.state.gridSize);\\r\\n if (editingLinearElement !== _this13.state.editingLinearElement) {\\r\\n // Since we are reading from previous state which is not possible with\\r\\n // automatic batching in React 18 hence using flush sync to synchronously\\r\\n // update the state. Check https://github.com/excalidraw/excalidraw/pull/5508 for more details.\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.flushSync)(function () {\\r\\n _this13.setState({\\r\\n editingLinearElement\\r\\n });\\r\\n });\\r\\n }\\r\\n if (editingLinearElement.lastUncommittedPoint != null) {\\r\\n _this13.maybeSuggestBindingAtCursor(scenePointer);\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElementType)(_this13.state.activeTool.type)) {\\r\\n // Hovering with a selected tool or creating new linear element via click\\r\\n // and point\\r\\n const { draggingElement } = _this13.state;\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement, false)) {\\r\\n _this13.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [scenePointer], _this13.state.startBoundElement);\\r\\n }\\r\\n else {\\r\\n _this13.maybeSuggestBindingAtCursor(scenePointer);\\r\\n }\\r\\n }\\r\\n if (_this13.state.multiElement) {\\r\\n const { multiElement } = _this13.state;\\r\\n const { x: rx, y: ry } = multiElement;\\r\\n const { points, lastCommittedPoint } = multiElement;\\r\\n const lastPoint = points[points.length - 1];\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state);\\r\\n if (lastPoint === lastCommittedPoint) {\\r\\n // if we haven't yet created a temp point and we're beyond commit-zone\\r\\n // threshold, add a point\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastPoint[0], lastPoint[1]) >= _constants__WEBPACK_IMPORTED_MODULE_13__.LINE_CONFIRM_THRESHOLD) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: [...points, [scenePointerX - rx, scenePointerY - ry]]\\r\\n });\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.POINTER); // in this branch, we're inside the commit zone, and no uncommitted\\r\\n // point exists. Thus do nothing (don't add/remove points).\\r\\n }\\r\\n }\\r\\n else if (points.length > 2 && lastCommittedPoint && (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_13__.LINE_CONFIRM_THRESHOLD) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.POINTER);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: points.slice(0, -1)\\r\\n });\\r\\n }\\r\\n else {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(scenePointerX, scenePointerY, _this13.state.gridSize);\\r\\n const [lastCommittedX, lastCommittedY] = (_a = multiElement === null || multiElement === void 0 ? void 0 : multiElement.lastCommittedPoint) !== null && _a !== void 0 ? _a : [0, 0];\\r\\n let dxFromLastCommitted = gridX - rx - lastCommittedX;\\r\\n let dyFromLastCommitted = gridY - ry - lastCommittedY;\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldRotateWithDiscreteAngle)(event)) {\\r\\n ({\\r\\n width: dxFromLastCommitted,\\r\\n height: dyFromLastCommitted\\r\\n } = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getLockedLinearCursorAlignSize)(// actual coordinate of the last committed point\\r\\n lastCommittedX + rx, lastCommittedY + ry, // cursor-grid coordinate\\r\\n gridX, gridY));\\r\\n }\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(points, _this13.state.zoom.value)) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.POINTER);\\r\\n } // update last uncommitted point\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: [...points.slice(0, -1), [lastCommittedX + dxFromLastCommitted, lastCommittedY + dyFromLastCommitted]]\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n const hasDeselectedButton = Boolean(event.buttons);\\r\\n if (hasDeselectedButton || _this13.state.activeTool.type !== \\\"selection\\\" && _this13.state.activeTool.type !== \\\"text\\\" && _this13.state.activeTool.type !== \\\"eraser\\\") {\\r\\n return;\\r\\n }\\r\\n const elements = _this13.scene.getNonDeletedElements();\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this13.state);\\r\\n if (selectedElements.length === 1 && !isOverScrollBar && !_this13.state.editingLinearElement) {\\r\\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, _this13.state, scenePointerX, scenePointerY, _this13.state.zoom, event.pointerType);\\r\\n if (elementWithTransformHandleType && elementWithTransformHandleType.transformHandleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)(elementWithTransformHandleType));\\r\\n return;\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length > 1 && !isOverScrollBar) {\\r\\n const transformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), scenePointerX, scenePointerY, _this13.state.zoom, event.pointerType);\\r\\n if (transformHandleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\\r\\n transformHandleType\\r\\n }));\\r\\n return;\\r\\n }\\r\\n }\\r\\n const hitElement = _this13.getElementAtPosition(scenePointer.x, scenePointer.y);\\r\\n _this13.hitLinkElement = _this13.getElementLinkAtPosition(scenePointer, hitElement);\\r\\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_11__.isEraserActive)(_this13.state)) {\\r\\n return;\\r\\n }\\r\\n if (_this13.hitLinkElement && !_this13.state.selectedElementIds[_this13.hitLinkElement.id]) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.POINTER);\\r\\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.showHyperlinkTooltip)(_this13.hitLinkElement, _this13.state);\\r\\n if (_this13.props.onLinkHover) {\\r\\n _this13.props.onLinkHover(_this13.hitLinkElement, event);\\r\\n } //zsviczian\\r\\n }\\r\\n else {\\r\\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.hideHyperlinkToolip)();\\r\\n if (hitElement && hitElement.link && _this13.state.selectedElementIds[hitElement.id] && !_this13.contextMenuOpen && !_this13.state.showHyperlinkPopup) {\\r\\n _this13.setState({\\r\\n showHyperlinkPopup: \\\"info\\\"\\r\\n });\\r\\n }\\r\\n else if (_this13.state.activeTool.type === \\\"text\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(hitElement) ? _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.TEXT : _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.CROSSHAIR);\\r\\n }\\r\\n else if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else if (isOverScrollBar) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n else if (_this13.state.editingLinearElement) {\\r\\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.getElement(_this13.state.editingLinearElement.elementId);\\r\\n if (element && (0,_element_collision__WEBPACK_IMPORTED_MODULE_45__.isHittingElementNotConsideringBoundingBox)(element, _this13.state, [scenePointer.x, scenePointer.y])) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.MOVE);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n }\\r\\n else if ( // if using cmd/ctrl, we're not dragging\\r\\n !event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && (hitElement || _this13.isHittingCommonBoundingBoxOfSelectedElements(scenePointer, selectedElements)) && !(hitElement === null || hitElement === void 0 ? void 0 : hitElement.locked)) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.MOVE);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleEraser = function (event, pointerDownState, scenePointer) {\\r\\n const updateElementIds = function (elements) {\\r\\n elements.forEach(function (element) {\\r\\n if (element.locked) {\\r\\n return;\\r\\n }\\r\\n idsToUpdate.push(element.id);\\r\\n if (event.altKey) {\\r\\n if (pointerDownState.elementIdsToErase[element.id] && pointerDownState.elementIdsToErase[element.id].erase) {\\r\\n pointerDownState.elementIdsToErase[element.id].erase = false;\\r\\n }\\r\\n }\\r\\n else if (!pointerDownState.elementIdsToErase[element.id]) {\\r\\n pointerDownState.elementIdsToErase[element.id] = {\\r\\n erase: true,\\r\\n opacity: element.opacity\\r\\n };\\r\\n }\\r\\n });\\r\\n };\\r\\n const idsToUpdate = [];\\r\\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerDownState.lastCoords.x, pointerDownState.lastCoords.y, scenePointer.x, scenePointer.y);\\r\\n const threshold = 10 / _this13.state.zoom.value;\\r\\n const point = _objectSpread({}, pointerDownState.lastCoords);\\r\\n let samplingInterval = 0;\\r\\n while (samplingInterval <= distance) {\\r\\n const hitElements = _this13.getElementsAtPosition(point.x, point.y);\\r\\n updateElementIds(hitElements); // Exit since we reached current point\\r\\n if (samplingInterval === distance) {\\r\\n break;\\r\\n } // Calculate next point in the line at a distance of sampling interval\\r\\n samplingInterval = Math.min(samplingInterval + threshold, distance);\\r\\n const distanceRatio = samplingInterval / distance;\\r\\n const nextX = (1 - distanceRatio) * point.x + distanceRatio * scenePointer.x;\\r\\n const nextY = (1 - distanceRatio) * point.y + distanceRatio * scenePointer.y;\\r\\n point.x = nextX;\\r\\n point.y = nextY;\\r\\n }\\r\\n const elements = _this13.scene.getElementsIncludingDeleted().map(function (ele) {\\r\\n const id = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBoundToContainer)(ele) && idsToUpdate.includes(ele.containerId) ? ele.containerId : ele.id;\\r\\n if (idsToUpdate.includes(id)) {\\r\\n if (event.altKey) {\\r\\n if (pointerDownState.elementIdsToErase[id] && pointerDownState.elementIdsToErase[id].erase === false) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(ele, {\\r\\n opacity: pointerDownState.elementIdsToErase[id].opacity\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(ele, {\\r\\n opacity: _constants__WEBPACK_IMPORTED_MODULE_13__.ELEMENT_READY_TO_ERASE_OPACITY\\r\\n });\\r\\n }\\r\\n }\\r\\n return ele;\\r\\n });\\r\\n _this13.scene.replaceAllElements(elements);\\r\\n pointerDownState.lastCoords.x = scenePointer.x;\\r\\n pointerDownState.lastCoords.y = scenePointer.y;\\r\\n };\\r\\n this.handleTouchMove = function (event) {\\r\\n invalidateContextMenu = true;\\r\\n };\\r\\n this.handleCanvasPointerDown = function (event) {\\r\\n var _a, _b;\\r\\n _this13.focusContainer(); //zsviczian\\r\\n // remove any active selection when we start to interact with canvas\\r\\n // (mainly, we care about removing selection outside the component which\\r\\n // would prevent our copy handling otherwise)\\r\\n const selection = document.getSelection();\\r\\n if (selection === null || selection === void 0 ? void 0 : selection.anchorNode) {\\r\\n selection.removeAllRanges();\\r\\n }\\r\\n _this13.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\\r\\n _this13.maybeCleanupAfterMissingPointerUp(event); //fires only once, if pen is detected, penMode is enabled\\r\\n //the user can disable this by toggling the penMode button\\r\\n if (!_this13.state.penDetected && event.pointerType === \\\"pen\\\") {\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n penMode: true,\\r\\n penDetected: true\\r\\n };\\r\\n });\\r\\n }\\r\\n if (!_this13.device.isTouchScreen && [\\\"pen\\\", \\\"touch\\\"].includes(event.pointerType)) {\\r\\n _this13.device = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateObject)(_this13.device, {\\r\\n isTouchScreen: true\\r\\n });\\r\\n }\\r\\n if (isPanning) {\\r\\n return;\\r\\n }\\r\\n _this13.lastPointerDown = event;\\r\\n _this13.setState({\\r\\n lastPointerDownWith: event.pointerType,\\r\\n cursorButton: \\\"down\\\"\\r\\n });\\r\\n _this13.savePointer(event.clientX, event.clientY, \\\"down\\\");\\r\\n _this13.updateGestureOnPointerDown(event);\\r\\n if (_this13.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\\r\\n return;\\r\\n } // only handle left mouse button or touch\\r\\n if (event.button !== _constants__WEBPACK_IMPORTED_MODULE_13__.POINTER_BUTTON.MAIN && event.button !== _constants__WEBPACK_IMPORTED_MODULE_13__.POINTER_BUTTON.TOUCH) {\\r\\n return;\\r\\n } // don't select while panning\\r\\n if (gesture.pointers.size > 1) {\\r\\n return;\\r\\n } // State for the duration of a pointer interaction, which starts with a\\r\\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\\r\\n const pointerDownState = _this13.initialPointerDownState(event);\\r\\n if (_this13.handleDraggingScrollBar(event, pointerDownState)) {\\r\\n return;\\r\\n } // Since context menu closes on pointer down so setting to false\\r\\n _this13.contextMenuOpen = false;\\r\\n _this13.clearSelectionIfNotUsingSelection();\\r\\n _this13.updateBindingEnabledOnPointerMove(event);\\r\\n if (_this13.handleSelectionOnPointerDown(event, pointerDownState)) {\\r\\n return;\\r\\n }\\r\\n const allowOnPointerDown = !_this13.state.penMode || event.pointerType !== \\\"touch\\\" || _this13.state.activeTool.type === \\\"selection\\\" || _this13.state.activeTool.type === \\\"text\\\" || _this13.state.activeTool.type === \\\"image\\\";\\r\\n if (!allowOnPointerDown) {\\r\\n return;\\r\\n }\\r\\n if (_this13.state.activeTool.type === \\\"text\\\") {\\r\\n _this13.handleTextOnPointerDown(event, pointerDownState);\\r\\n return;\\r\\n }\\r\\n else if (_this13.state.activeTool.type === \\\"arrow\\\" || _this13.state.activeTool.type === \\\"line\\\") {\\r\\n _this13.handleLinearElementOnPointerDown(event, _this13.state.activeTool.type, pointerDownState);\\r\\n }\\r\\n else if (_this13.state.activeTool.type === \\\"image\\\") {\\r\\n // reset image preview on pointerdown\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.CROSSHAIR); // retrieve the latest element as the state may be stale\\r\\n const pendingImageElement = _this13.state.pendingImageElementId && _this13.scene.getElement(_this13.state.pendingImageElementId);\\r\\n if (!pendingImageElement) {\\r\\n return;\\r\\n }\\r\\n _this13.setState({\\r\\n draggingElement: pendingImageElement,\\r\\n editingElement: pendingImageElement,\\r\\n pendingImageElementId: null,\\r\\n multiElement: null\\r\\n });\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(pendingImageElement, {\\r\\n x,\\r\\n y\\r\\n });\\r\\n }\\r\\n else if (_this13.state.activeTool.type === \\\"freedraw\\\") {\\r\\n _this13.handleFreeDrawElementOnPointerDown(event, _this13.state.activeTool.type, pointerDownState);\\r\\n }\\r\\n else if (_this13.state.activeTool.type === \\\"custom\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n else if (_this13.state.activeTool.type !== \\\"eraser\\\") {\\r\\n _this13.createGenericElementOnPointerDown(_this13.state.activeTool.type, pointerDownState);\\r\\n }\\r\\n (_b = (_a = _this13.props) === null || _a === void 0 ? void 0 : _a.onPointerDown) === null || _b === void 0 ? void 0 : _b.call(_a, _this13.state.activeTool, pointerDownState);\\r\\n const onPointerMove = _this13.onPointerMoveFromPointerDownHandler(pointerDownState);\\r\\n const onPointerUp = _this13.onPointerUpFromPointerDownHandler(pointerDownState);\\r\\n const onKeyDown = _this13.onKeyDownFromPointerDownHandler(pointerDownState);\\r\\n const onKeyUp = _this13.onKeyUpFromPointerDownHandler(pointerDownState);\\r\\n lastPointerUp = onPointerUp;\\r\\n if (!_this13.state.viewModeEnabled) {\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, onPointerUp);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYDOWN, onKeyDown);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.KEYUP, onKeyUp);\\r\\n pointerDownState.eventListeners.onMove = onPointerMove;\\r\\n pointerDownState.eventListeners.onUp = onPointerUp;\\r\\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\\r\\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\\r\\n }\\r\\n };\\r\\n this.handleCanvasPointerUp = function (event) {\\r\\n _this13.lastPointerUp = event;\\r\\n if (_this13.device.isTouchScreen) {\\r\\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: event.clientX,\\r\\n clientY: event.clientY\\r\\n }, _this13.state);\\r\\n const hitElement = _this13.getElementAtPosition(scenePointer.x, scenePointer.y);\\r\\n _this13.hitLinkElement = _this13.getElementLinkAtPosition(scenePointer, hitElement);\\r\\n }\\r\\n if (_this13.hitLinkElement && !_this13.state.selectedElementIds[_this13.hitLinkElement.id]) {\\r\\n _this13.redirectToLink(event, _this13.device.isTouchScreen);\\r\\n }\\r\\n _this13.removePointer(event);\\r\\n };\\r\\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices = function (event) {\\r\\n // deal with opening context menu on touch devices\\r\\n if (event.pointerType === \\\"touch\\\") {\\r\\n invalidateContextMenu = false;\\r\\n if (touchTimeout) {\\r\\n // If there's already a touchTimeout, this means that there's another\\r\\n // touch down and we are doing another touch, so we shouldn't open the\\r\\n // context menu.\\r\\n invalidateContextMenu = true;\\r\\n }\\r\\n else {\\r\\n // open the context menu with the first touch's clientX and clientY\\r\\n // if the touch is not moving\\r\\n touchTimeout = window.setTimeout(function () {\\r\\n touchTimeout = 0;\\r\\n if (!invalidateContextMenu) {\\r\\n _this13.handleCanvasContextMenu(event);\\r\\n }\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_13__.TOUCH_CTX_MENU_TIMEOUT);\\r\\n }\\r\\n }\\r\\n };\\r\\n this.resetContextMenuTimer = function () {\\r\\n clearTimeout(touchTimeout);\\r\\n touchTimeout = 0;\\r\\n invalidateContextMenu = false;\\r\\n };\\r\\n this.handleCanvasPanUsingWheelOrSpaceDrag = function (event) {\\r\\n if (!(gesture.pointers.size <= 1 && (event.button === _constants__WEBPACK_IMPORTED_MODULE_13__.POINTER_BUTTON.WHEEL || event.button === _constants__WEBPACK_IMPORTED_MODULE_13__.POINTER_BUTTON.MAIN && isHoldingSpace || _this13.state.viewModeEnabled)) || (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this13.state.editingElement)) {\\r\\n return false;\\r\\n }\\r\\n isPanning = true;\\r\\n event.preventDefault();\\r\\n let nextPastePrevented = false;\\r\\n const isLinux = /Linux/.test(window.navigator.platform);\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.GRABBING);\\r\\n let { clientX: lastX, clientY: lastY } = event;\\r\\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdatesThrottled)(function (event) {\\r\\n const deltaX = lastX - event.clientX;\\r\\n const deltaY = lastY - event.clientY;\\r\\n lastX = event.clientX;\\r\\n lastY = event.clientY;\\r\\n /*\\r\\n * Prevent paste event if we move while middle clicking on Linux.\\r\\n * See issue #1383.\\r\\n */\\r\\n if (isLinux && !nextPastePrevented && (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)) {\\r\\n nextPastePrevented = true;\\r\\n /* Prevent the next paste event */\\r\\n const preventNextPaste = function (event) {\\r\\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.PASTE, preventNextPaste);\\r\\n event.stopPropagation();\\r\\n };\\r\\n /*\\r\\n * Reenable next paste in case of disabled middle click paste for\\r\\n * any reason:\\r\\n * - right click paste\\r\\n * - empty clipboard\\r\\n */\\r\\n const enableNextPaste = function () {\\r\\n setTimeout(function () {\\r\\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.PASTE, preventNextPaste);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, enableNextPaste);\\r\\n }, 100);\\r\\n };\\r\\n document.body.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.PASTE, preventNextPaste);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, enableNextPaste);\\r\\n }\\r\\n _this13.setState({\\r\\n scrollX: _this13.state.scrollX - deltaX / _this13.state.zoom.value,\\r\\n scrollY: _this13.state.scrollY - deltaY / _this13.state.zoom.value\\r\\n });\\r\\n });\\r\\n const teardown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(lastPointerUp = function () {\\r\\n lastPointerUp = null;\\r\\n isPanning = false;\\r\\n if (!isHoldingSpace) {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state);\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n cursorButton: \\\"up\\\"\\r\\n });\\r\\n _this13.savePointer(event.clientX, event.clientY, \\\"up\\\");\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, teardown);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.BLUR, teardown);\\r\\n onPointerMove.flush();\\r\\n });\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.BLUR, teardown);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_MOVE, onPointerMove, {\\r\\n passive: true\\r\\n });\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.POINTER_UP, teardown);\\r\\n return true;\\r\\n };\\r\\n this.clearSelectionIfNotUsingSelection = function () {\\r\\n if (_this13.state.activeTool.type !== \\\"selection\\\") {\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n };\\r\\n this.handleSelectionOnPointerDown = function (event, pointerDownState) {\\r\\n var _a;\\r\\n if (_this13.state.activeTool.type === \\\"selection\\\") {\\r\\n const elements = _this13.scene.getNonDeletedElements();\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this13.state);\\r\\n if (selectedElements.length === 1 && !_this13.state.editingLinearElement) {\\r\\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, _this13.state, pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.zoom, event.pointerType);\\r\\n if (elementWithTransformHandleType != null) {\\r\\n _this13.setState({\\r\\n resizingElement: elementWithTransformHandleType.element\\r\\n });\\r\\n pointerDownState.resize.handleType = elementWithTransformHandleType.transformHandleType;\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length > 1) {\\r\\n pointerDownState.resize.handleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.zoom, event.pointerType);\\r\\n }\\r\\n if (pointerDownState.resize.handleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\\r\\n transformHandleType: pointerDownState.resize.handleType\\r\\n }));\\r\\n pointerDownState.resize.isResizing = true;\\r\\n pointerDownState.resize.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeOffsetXY)(pointerDownState.resize.handleType, selectedElements, pointerDownState.origin.x, pointerDownState.origin.y));\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0]) && selectedElements[0].points.length === 2) {\\r\\n pointerDownState.resize.arrowDirection = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeArrowDirection)(pointerDownState.resize.handleType, selectedElements[0]);\\r\\n }\\r\\n }\\r\\n else {\\r\\n if (_this13.state.editingLinearElement) {\\r\\n const ret = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerDown(event, _this13.state, function (appState) {\\r\\n return _this13.setState(appState);\\r\\n }, _this13.history, pointerDownState.origin);\\r\\n if (ret.hitElement) {\\r\\n pointerDownState.hit.element = ret.hitElement;\\r\\n }\\r\\n if (ret.didAddPoint) {\\r\\n return true;\\r\\n }\\r\\n } // hitElement may already be set above, so check first\\r\\n pointerDownState.hit.element = (_a = pointerDownState.hit.element) !== null && _a !== void 0 ? _a : _this13.getElementAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\\r\\n if (pointerDownState.hit.element) {\\r\\n // Early return if pointer is hitting link icon\\r\\n if ((0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_47__.isPointHittingLinkIcon)(pointerDownState.hit.element, _this13.state, [pointerDownState.origin.x, pointerDownState.origin.y], _this13.device.isMobile)) {\\r\\n return false;\\r\\n }\\r\\n pointerDownState.hit.hasHitElementInside = (0,_element_collision__WEBPACK_IMPORTED_MODULE_45__.isHittingElementNotConsideringBoundingBox)(pointerDownState.hit.element, _this13.state, [pointerDownState.origin.x, pointerDownState.origin.y]);\\r\\n } // For overlapped elements one position may hit\\r\\n // multiple elements\\r\\n pointerDownState.hit.allHitElements = _this13.getElementsAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n const someHitElementIsSelected = pointerDownState.hit.allHitElements.some(function (element) {\\r\\n return _this13.isASelectedElement(element);\\r\\n });\\r\\n if ((hitElement === null || !someHitElementIsSelected) && !event.shiftKey && !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\\r\\n _this13.clearSelection(hitElement);\\r\\n }\\r\\n if (_this13.state.editingLinearElement) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [_this13.state.editingLinearElement.elementId]: true\\r\\n }\\r\\n }); // If we click on something\\r\\n }\\r\\n else if (hitElement != null) {\\r\\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\\r\\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD]) {\\r\\n if (!_this13.state.selectedElementIds[hitElement.id]) {\\r\\n pointerDownState.hit.wasAddedToSelection = true;\\r\\n }\\r\\n _this13.setState(function (prevState) {\\r\\n return _objectSpread(_objectSpread({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.editGroupForSelectedElement)(prevState, hitElement)), {}, {\\r\\n previousSelectedElementIds: _this13.state.selectedElementIds\\r\\n });\\r\\n }); // mark as not completely handled so as to allow dragging etc.\\r\\n return false;\\r\\n } // deselect if item is selected\\r\\n // if shift is not clicked, this will always return true\\r\\n // otherwise, it will trigger selection based on current\\r\\n // state of the box\\r\\n if (!_this13.state.selectedElementIds[hitElement.id]) {\\r\\n // if we are currently editing a group, exiting editing mode and deselect the group.\\r\\n if (_this13.state.editingGroupId && !(0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, _this13.state.editingGroupId)) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n } // Add hit element to selection. At this point if we're not holding\\r\\n // SHIFT the previously selected element(s) were deselected above\\r\\n // (make sure you use setState updater to use latest state)\\r\\n if (!someHitElementIsSelected && !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\\r\\n _this13.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: true\\r\\n }),\\r\\n showHyperlinkPopup: hitElement.link ? \\\"info\\\" : false\\r\\n }), _this13.scene.getNonDeletedElements());\\r\\n });\\r\\n pointerDownState.hit.wasAddedToSelection = true;\\r\\n }\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: _this13.state.selectedElementIds\\r\\n });\\r\\n }\\r\\n }\\r\\n return false;\\r\\n };\\r\\n this.handleTextOnPointerDown = function (event, pointerDownState) {\\r\\n // if we're currently still editing text, clicking outside\\r\\n // should only finalize it, not create another (irrespective\\r\\n // of state.activeTool.locked)\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this13.state.editingElement)) {\\r\\n return;\\r\\n }\\r\\n let sceneX = pointerDownState.origin.x;\\r\\n let sceneY = pointerDownState.origin.y;\\r\\n const element = _this13.getElementAtPosition(sceneX, sceneY, {\\r\\n includeBoundTextElement: true\\r\\n });\\r\\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.hasBoundTextElement)(element);\\r\\n if (canBindText) {\\r\\n sceneX = element.x + element.width / 2;\\r\\n sceneY = element.y + element.height / 2;\\r\\n }\\r\\n _this13.startTextEditing({\\r\\n sceneX,\\r\\n sceneY,\\r\\n shouldBind: false,\\r\\n insertAtParentCenter: !event.altKey\\r\\n });\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n if (!_this13.state.activeTool.locked) {\\r\\n _this13.setState({\\r\\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateActiveTool)(_this13.state, {\\r\\n type: \\\"selection\\\"\\r\\n })\\r\\n });\\r\\n }\\r\\n };\\r\\n this.handleFreeDrawElementOnPointerDown = function (event, elementType, pointerDownState) {\\r\\n // Begin a mark capture. This does not have to update state yet.\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, null);\\r\\n const element = (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.newFreeDrawElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness,\\r\\n simulatePressure: event.pressure === 0.5,\\r\\n locked: false\\r\\n });\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [element.id]: false\\r\\n })\\r\\n };\\r\\n });\\r\\n const pressures = element.simulatePressure ? element.pressures : [...element.pressures, event.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n points: [[0, 0]],\\r\\n pressures\\r\\n });\\r\\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, _this13.scene);\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n draggingElement: element,\\r\\n editingElement: element,\\r\\n startBoundElement: boundElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n };\\r\\n this.createImageElement = function (_ref9) {\\r\\n let { sceneX, sceneY } = _ref9;\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(sceneX, sceneY, _this13.state.gridSize);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newImageElement)({\\r\\n type: \\\"image\\\",\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness,\\r\\n locked: false\\r\\n });\\r\\n return element;\\r\\n };\\r\\n this.handleLinearElementOnPointerDown = function (event, elementType, pointerDownState) {\\r\\n if (_this13.state.multiElement) {\\r\\n const { multiElement } = _this13.state; // finalize if completing a loop\\r\\n if (multiElement.type === \\\"line\\\" && (0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(multiElement.points, _this13.state.zoom.value)) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1]\\r\\n });\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n const { x: rx, y: ry, lastCommittedPoint } = multiElement; // clicking inside commit zone → finalize arrow\\r\\n if (multiElement.points.length > 1 && lastCommittedPoint && (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerDownState.origin.x - rx, pointerDownState.origin.y - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_13__.LINE_CONFIRM_THRESHOLD) {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [multiElement.id]: true\\r\\n })\\r\\n };\\r\\n }); // clicking outside commit zone → update reference for last committed\\r\\n // point\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1]\\r\\n });\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_13__.CURSOR_TYPE.POINTER);\\r\\n }\\r\\n else {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.gridSize);\\r\\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\\r\\n If so, we want it to be null for start and \\\"arrow\\\" for end. If the linear item is not\\r\\n an arrow, we want it to be null for both. Otherwise, we want it to use the\\r\\n values from appState. */\\r\\n const { currentItemStartArrowhead, currentItemEndArrowhead } = _this13.state;\\r\\n const [startArrowhead, endArrowhead] = elementType === \\\"arrow\\\" ? [currentItemStartArrowhead, currentItemEndArrowhead] : [null, null];\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newLinearElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness,\\r\\n startArrowhead,\\r\\n endArrowhead,\\r\\n locked: false\\r\\n });\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [element.id]: false\\r\\n })\\r\\n };\\r\\n });\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n points: [...element.points, [0, 0]]\\r\\n });\\r\\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, _this13.scene);\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n draggingElement: element,\\r\\n editingElement: element,\\r\\n startBoundElement: boundElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n };\\r\\n this.createGenericElementOnPointerDown = function (elementType, pointerDownState) {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.gridSize);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemStrokeSharpness,\\r\\n locked: false\\r\\n });\\r\\n if (element.type === \\\"selection\\\") {\\r\\n _this13.setState({\\r\\n selectionElement: element,\\r\\n draggingElement: element\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n multiElement: null,\\r\\n draggingElement: element,\\r\\n editingElement: element\\r\\n });\\r\\n }\\r\\n };\\r\\n this.restoreReadyToEraseElements = function (pointerDownState) {\\r\\n const elements = _this13.scene.getElementsIncludingDeleted().map(function (ele) {\\r\\n if (pointerDownState.elementIdsToErase[ele.id] && pointerDownState.elementIdsToErase[ele.id].erase) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(ele, {\\r\\n opacity: pointerDownState.elementIdsToErase[ele.id].opacity\\r\\n });\\r\\n }\\r\\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBoundToContainer)(ele) && pointerDownState.elementIdsToErase[ele.containerId] && pointerDownState.elementIdsToErase[ele.containerId].erase) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(ele, {\\r\\n opacity: pointerDownState.elementIdsToErase[ele.containerId].opacity\\r\\n });\\r\\n }\\r\\n return ele;\\r\\n });\\r\\n _this13.scene.replaceAllElements(elements);\\r\\n };\\r\\n this.eraseElements = function (pointerDownState) {\\r\\n const elements = _this13.scene.getElementsIncludingDeleted().map(function (ele) {\\r\\n if (pointerDownState.elementIdsToErase[ele.id] && pointerDownState.elementIdsToErase[ele.id].erase) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(ele, {\\r\\n isDeleted: true\\r\\n });\\r\\n }\\r\\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBoundToContainer)(ele) && pointerDownState.elementIdsToErase[ele.containerId] && pointerDownState.elementIdsToErase[ele.containerId].erase) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(ele, {\\r\\n isDeleted: true\\r\\n });\\r\\n }\\r\\n return ele;\\r\\n });\\r\\n _this13.history.resumeRecording();\\r\\n _this13.scene.replaceAllElements(elements);\\r\\n };\\r\\n this.initializeImage = /*#__PURE__*/ function () {\\r\\n var _ref10 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (_ref11) {\\r\\n var _a, _b, _c, _d;\\r\\n let { imageFile, imageElement: _imageElement, showCursorImagePreview = false } = _ref11;\\r\\n // at this point this should be guaranteed image file, but we do this check\\r\\n // to satisfy TS down the line\\r\\n if (!(0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(imageFile)) {\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.unsupportedFileType\\\"));\\r\\n }\\r\\n const mimeType = imageFile.type;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, \\\"wait\\\");\\r\\n if (mimeType === _constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.svg) {\\r\\n try {\\r\\n imageFile = (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.SVGStringToFile)(yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.normalizeSVG)(yield imageFile.text()), imageFile.name);\\r\\n }\\r\\n catch (error) {\\r\\n console.warn(error);\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.svgImageInsertError\\\"));\\r\\n }\\r\\n } // generate image id (by default the file digest) before any\\r\\n // resizing/compression takes place to keep it more portable\\r\\n const fileId = yield ((_b = (_a = _this13.props).generateIdForFile) === null || _b === void 0 ? void 0 : _b.call(_a, imageFile)) || (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.generateIdFromFile)(imageFile);\\r\\n if (!fileId) {\\r\\n console.warn(\\\"Couldn't generate file id or the supplied `generateIdForFile` didn't resolve to one.\\\");\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\"));\\r\\n }\\r\\n const existingFileData = _this13.files[fileId];\\r\\n if (!(existingFileData === null || existingFileData === void 0 ? void 0 : existingFileData.dataURL)) {\\r\\n try {\\r\\n imageFile = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.resizeImageFile)(imageFile, {\\r\\n maxWidthOrHeight: _constants__WEBPACK_IMPORTED_MODULE_13__.DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(\\\"error trying to resing image file on insertion\\\", error);\\r\\n }\\r\\n if (imageFile.size > _constants__WEBPACK_IMPORTED_MODULE_13__.MAX_ALLOWED_FILE_BYTES) {\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.fileTooBig\\\", {\\r\\n maxSize: `${Math.trunc(_constants__WEBPACK_IMPORTED_MODULE_13__.MAX_ALLOWED_FILE_BYTES / 1024 / 1024)}MB`\\r\\n }));\\r\\n }\\r\\n }\\r\\n if (showCursorImagePreview) {\\r\\n const dataURL = (_c = _this13.files[fileId]) === null || _c === void 0 ? void 0 : _c.dataURL; // optimization so that we don't unnecessarily resize the original\\r\\n // full-size file for cursor preview\\r\\n // (it's much faster to convert the resized dataURL to File)\\r\\n const resizedFile = dataURL && (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.dataURLToFile)(dataURL);\\r\\n _this13.setImagePreviewCursor(resizedFile || imageFile);\\r\\n }\\r\\n const dataURL = ((_d = _this13.files[fileId]) === null || _d === void 0 ? void 0 : _d.dataURL) || (yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.getDataURL)(imageFile));\\r\\n const imageElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(_imageElement, {\\r\\n fileId\\r\\n }, false);\\r\\n return new Promise(/*#__PURE__*/ function () {\\r\\n var _ref12 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (resolve, reject) {\\r\\n var _a;\\r\\n try {\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), {}, {\\r\\n [fileId]: {\\r\\n mimeType,\\r\\n id: fileId,\\r\\n dataURL,\\r\\n created: Date.now()\\r\\n }\\r\\n });\\r\\n const cachedImageData = _this13.imageCache.get(fileId);\\r\\n if (!cachedImageData) {\\r\\n _this13.addNewImagesToImageCache();\\r\\n yield _this13.updateImageCache([imageElement]);\\r\\n }\\r\\n if ((cachedImageData === null || cachedImageData === void 0 ? void 0 : cachedImageData.image) instanceof Promise) {\\r\\n yield cachedImageData.image;\\r\\n }\\r\\n if (_this13.state.pendingImageElementId !== imageElement.id && ((_a = _this13.state.draggingElement) === null || _a === void 0 ? void 0 : _a.id) !== imageElement.id) {\\r\\n _this13.initializeImageDimensions(imageElement, true);\\r\\n }\\r\\n resolve(imageElement);\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n reject(new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\")));\\r\\n }\\r\\n finally {\\r\\n if (!showCursorImagePreview) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n }\\r\\n });\\r\\n return function (_x4, _x5) {\\r\\n return _ref12.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n });\\r\\n return function (_x3) {\\r\\n return _ref10.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.insertImageElement = /*#__PURE__*/ function () {\\r\\n var _ref13 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (imageElement, imageFile, showCursorImagePreview) {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), imageElement]);\\r\\n try {\\r\\n yield _this13.initializeImage({\\r\\n imageFile,\\r\\n imageElement,\\r\\n showCursorImagePreview\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n isDeleted: true\\r\\n });\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n _this13.setState({\\r\\n errorMessage: error.message || (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\")\\r\\n });\\r\\n }\\r\\n });\\r\\n return function (_x6, _x7, _x8) {\\r\\n return _ref13.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.setImagePreviewCursor = /*#__PURE__*/ function () {\\r\\n var _ref14 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (imageFile) {\\r\\n // mustn't be larger than 128 px\\r\\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property\\r\\n const cursorImageSizePx = 96;\\r\\n const imagePreview = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.resizeImageFile)(imageFile, {\\r\\n maxWidthOrHeight: cursorImageSizePx\\r\\n });\\r\\n let previewDataURL = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.getDataURL)(imagePreview); // SVG cannot be resized via `resizeImageFile` so we resize by rendering to\\r\\n // a small canvas\\r\\n if (imageFile.type === _constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.svg) {\\r\\n const img = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.loadHTMLImageElement)(previewDataURL);\\r\\n let height = Math.min(img.height, cursorImageSizePx);\\r\\n let width = height * (img.width / img.height);\\r\\n if (width > cursorImageSizePx) {\\r\\n width = cursorImageSizePx;\\r\\n height = width * (img.height / img.width);\\r\\n }\\r\\n const canvas = document.createElement(\\\"canvas\\\");\\r\\n canvas.height = height;\\r\\n canvas.width = width;\\r\\n const context = canvas.getContext(\\\"2d\\\");\\r\\n context.drawImage(img, 0, 0, width, height);\\r\\n previewDataURL = canvas.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.svg);\\r\\n }\\r\\n if (_this13.state.pendingImageElementId) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, `url(${previewDataURL}) 4 4, auto`);\\r\\n }\\r\\n });\\r\\n return function (_x9) {\\r\\n return _ref14.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.onImageAction = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n let { insertOnCanvasDirectly } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\\r\\n insertOnCanvasDirectly: false\\r\\n };\\r\\n try {\\r\\n const clientX = _this13.state.width / 2 + _this13.state.offsetLeft;\\r\\n const clientY = _this13.state.height / 2 + _this13.state.offsetTop;\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX,\\r\\n clientY\\r\\n }, _this13.state);\\r\\n const imageFile = yield (0,_data_filesystem__WEBPACK_IMPORTED_MODULE_43__.fileOpen)({\\r\\n description: \\\"Image\\\",\\r\\n extensions: [\\\"jpg\\\", \\\"png\\\", \\\"svg\\\", \\\"gif\\\"]\\r\\n });\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX: x,\\r\\n sceneY: y\\r\\n });\\r\\n if (insertOnCanvasDirectly) {\\r\\n _this13.insertImageElement(imageElement, imageFile);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n pendingImageElementId: imageElement.id\\r\\n }, function () {\\r\\n _this13.insertImageElement(imageElement, imageFile, \\r\\n /* showCursorImagePreview */\\r\\n true);\\r\\n });\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n if (error.name !== \\\"AbortError\\\") {\\r\\n console.error(error);\\r\\n }\\r\\n else {\\r\\n console.warn(error);\\r\\n }\\r\\n _this13.setState({\\r\\n pendingImageElementId: null,\\r\\n editingElement: null,\\r\\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.updateActiveTool)(_this13.state, {\\r\\n type: \\\"selection\\\"\\r\\n })\\r\\n }, function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_6__.actionFinalize);\\r\\n });\\r\\n }\\r\\n });\\r\\n this.initializeImageDimensions = function (imageElement) {\\r\\n var _a;\\r\\n let forceNaturalSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\\r\\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(imageElement) && ((_a = _this13.imageCache.get(imageElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\\r\\n if (!image || image instanceof Promise) {\\r\\n if (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_13__.DRAGGING_THRESHOLD / _this13.state.zoom.value && imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_13__.DRAGGING_THRESHOLD / _this13.state.zoom.value) {\\r\\n const placeholderSize = 100 / _this13.state.zoom.value;\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n x: imageElement.x - placeholderSize / 2,\\r\\n y: imageElement.y - placeholderSize / 2,\\r\\n width: placeholderSize,\\r\\n height: placeholderSize\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n if (forceNaturalSize || // if user-created bounding box is below threshold, assume the\\r\\n // intention was to click instead of drag, and use the image's\\r\\n // intrinsic size\\r\\n imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_13__.DRAGGING_THRESHOLD / _this13.state.zoom.value && imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_13__.DRAGGING_THRESHOLD / _this13.state.zoom.value) {\\r\\n const minHeight = Math.max(_this13.state.height - 120, 160); // max 65% of canvas height, clamped to <300px, vh - 120px>\\r\\n const maxHeight = Math.min(minHeight, Math.floor(_this13.state.height * 0.5) / _this13.state.zoom.value);\\r\\n const height = Math.min(image.naturalHeight, maxHeight);\\r\\n const width = height * (image.naturalWidth / image.naturalHeight); // add current imageElement width/height to account for previous centering\\r\\n // of the placeholder image\\r\\n const x = imageElement.x + imageElement.width / 2 - width / 2;\\r\\n const y = imageElement.y + imageElement.height / 2 - height / 2;\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n x,\\r\\n y,\\r\\n width,\\r\\n height\\r\\n });\\r\\n }\\r\\n };\\r\\n this.updateImageCache = /*#__PURE__*/ function () {\\r\\n var _ref16 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (elements) {\\r\\n let files = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this13.files;\\r\\n const { updatedFiles, erroredFiles } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.updateImageCache)({\\r\\n imageCache: _this13.imageCache,\\r\\n fileIds: elements.map(function (element) {\\r\\n return element.fileId;\\r\\n }),\\r\\n files\\r\\n });\\r\\n if (updatedFiles.size || erroredFiles.size) {\\r\\n for (const element of elements) {\\r\\n if (updatedFiles.has(element.fileId)) {\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n }\\r\\n }\\r\\n }\\r\\n if (erroredFiles.size) {\\r\\n _this13.scene.replaceAllElements(_this13.scene.getElementsIncludingDeleted().map(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(element) && erroredFiles.has(element.fileId)) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(element, {\\r\\n status: \\\"error\\\"\\r\\n });\\r\\n }\\r\\n return element;\\r\\n }));\\r\\n }\\r\\n return {\\r\\n updatedFiles,\\r\\n erroredFiles\\r\\n };\\r\\n });\\r\\n return function (_x10) {\\r\\n return _ref16.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.addNewImagesToImageCache = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n let imageElements = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.getInitializedImageElements)(_this13.scene.getNonDeletedElements());\\r\\n let files = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this13.files;\\r\\n const uncachedImageElements = imageElements.filter(function (element) {\\r\\n return !element.isDeleted && !_this13.imageCache.has(element.fileId);\\r\\n });\\r\\n if (uncachedImageElements.length) {\\r\\n const { updatedFiles } = yield _this13.updateImageCache(uncachedImageElements, files);\\r\\n if (updatedFiles.size) {\\r\\n _this13.scene.informMutation();\\r\\n }\\r\\n }\\r\\n });\\r\\n this.scheduleImageRefresh = lodash_throttle__WEBPACK_IMPORTED_MODULE_42___default()(function () {\\r\\n _this13.addNewImagesToImageCache();\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_13__.IMAGE_RENDER_TIMEOUT);\\r\\n this.updateBindingEnabledOnPointerMove = function (event) {\\r\\n const shouldEnableBinding = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.shouldEnableBindingForPointerEvent)(event);\\r\\n if (_this13.state.isBindingEnabled !== shouldEnableBinding) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: shouldEnableBinding\\r\\n });\\r\\n }\\r\\n };\\r\\n this.maybeSuggestBindingAtCursor = function (pointerCoords) {\\r\\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerCoords, _this13.scene);\\r\\n _this13.setState({\\r\\n suggestedBindings: hoveredBindableElement != null ? [hoveredBindableElement] : []\\r\\n });\\r\\n };\\r\\n this.maybeSuggestBindingsForLinearElementAtCoords = function (linearElement, pointerCoords, oppositeBindingBoundElement) {\\r\\n if (!pointerCoords.length) {\\r\\n return;\\r\\n }\\r\\n const suggestedBindings = pointerCoords.reduce(function (acc, coords) {\\r\\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(coords, _this13.scene);\\r\\n if (hoveredBindableElement != null && !(0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isLinearElementSimpleAndAlreadyBound)(linearElement, oppositeBindingBoundElement === null || oppositeBindingBoundElement === void 0 ? void 0 : oppositeBindingBoundElement.id, hoveredBindableElement)) {\\r\\n acc.push(hoveredBindableElement);\\r\\n }\\r\\n return acc;\\r\\n }, []);\\r\\n _this13.setState({\\r\\n suggestedBindings\\r\\n });\\r\\n };\\r\\n this.handleCanvasRef = function (canvas) {\\r\\n var _a, _b, _c;\\r\\n // canvas is null when unmounting\\r\\n if (canvas !== null) {\\r\\n _this13.canvas = canvas;\\r\\n _this13.rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__[\\\"default\\\"].canvas(_this13.canvas);\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.WHEEL, _this13.handleWheel, {\\r\\n passive: false\\r\\n });\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.TOUCH_START, _this13.onTapStart);\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.TOUCH_END, _this13.onTapEnd);\\r\\n }\\r\\n else {\\r\\n (_a = _this13.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.WHEEL, _this13.handleWheel);\\r\\n (_b = _this13.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.TOUCH_START, _this13.onTapStart);\\r\\n (_c = _this13.canvas) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_13__.EVENT.TOUCH_END, _this13.onTapEnd);\\r\\n }\\r\\n };\\r\\n this.handleAppOnDrop = /*#__PURE__*/ function () {\\r\\n var _ref18 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (event) {\\r\\n if (_this13.props.onDrop) {\\r\\n try {\\r\\n if ((yield _this13.props.onDrop(event)) === false) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (e) {\\r\\n console.error(e);\\r\\n }\\r\\n } // must be retrieved first, in the same frame\\r\\n const { file, fileHandle } = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.getFileFromEvent)(event);\\r\\n try {\\r\\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(file)) {\\r\\n // first attempt to decode scene from the image if it's embedded\\r\\n // ---------------------------------------------------------------------\\r\\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.png || (file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.svg) {\\r\\n try {\\r\\n const scene = yield (0,_data__WEBPACK_IMPORTED_MODULE_14__.loadFromBlob)(file, _this13.state, _this13.scene.getElementsIncludingDeleted(), fileHandle);\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, scene.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n replaceFiles: true,\\r\\n commitToHistory: true\\r\\n }));\\r\\n return;\\r\\n }\\r\\n catch (error) {\\r\\n if (error.name !== \\\"EncodingError\\\") {\\r\\n throw error;\\r\\n }\\r\\n }\\r\\n } // if no scene is embedded or we fail for whatever reason, fall back\\r\\n // to importing as regular image\\r\\n // ---------------------------------------------------------------------\\r\\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX,\\r\\n sceneY\\r\\n });\\r\\n _this13.insertImageElement(imageElement, file);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n });\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n return _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n const libraryJSON = event.dataTransfer.getData(_constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.excalidrawlib);\\r\\n if (libraryJSON && typeof libraryJSON === \\\"string\\\") {\\r\\n try {\\r\\n const libraryItems = (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.parseLibraryJSON)(libraryJSON);\\r\\n _this13.addElementsFromPasteOrLibrary({\\r\\n elements: (0,_data_library__WEBPACK_IMPORTED_MODULE_15__.distributeLibraryItemsOnSquareGrid)(libraryItems),\\r\\n position: event,\\r\\n files: null\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n _this13.setState({\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n if (file) {\\r\\n // atetmpt to parse an excalidraw/excalidrawlib file\\r\\n yield _this13.loadFileToCanvas(file, fileHandle);\\r\\n }\\r\\n });\\r\\n return function (_x11) {\\r\\n return _ref18.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.loadFileToCanvas = /*#__PURE__*/ function () {\\r\\n var _ref19 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (file, fileHandle) {\\r\\n file = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.normalizeFile)(file);\\r\\n try {\\r\\n const ret = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.loadSceneOrLibraryFromBlob)(file, _this13.state, _this13.scene.getElementsIncludingDeleted(), fileHandle);\\r\\n if (ret.type === _constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.excalidraw) {\\r\\n _this13.setState({\\r\\n isLoading: true\\r\\n });\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, ret.data), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, ret.data.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n replaceFiles: true,\\r\\n commitToHistory: true\\r\\n }));\\r\\n }\\r\\n else if (ret.type === _constants__WEBPACK_IMPORTED_MODULE_13__.MIME_TYPES.excalidrawlib) {\\r\\n yield _this13.library.updateLibrary({\\r\\n libraryItems: file,\\r\\n merge: true,\\r\\n openLibraryMenu: true\\r\\n }).catch(function (error) {\\r\\n console.error(error);\\r\\n _this13.setState({\\r\\n errorMessage: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.importLibraryError\\\")\\r\\n });\\r\\n });\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n });\\r\\n return function (_x12, _x13) {\\r\\n return _ref19.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.handleCanvasContextMenu = function (event) {\\r\\n event.preventDefault();\\r\\n if ((event.nativeEvent.pointerType === \\\"touch\\\" || event.nativeEvent.pointerType === \\\"pen\\\" && // always allow if user uses a pen secondary button\\r\\n event.button !== _constants__WEBPACK_IMPORTED_MODULE_13__.POINTER_BUTTON.SECONDARY) && _this13.state.activeTool.type !== \\\"selection\\\") {\\r\\n return;\\r\\n }\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const element = _this13.getElementAtPosition(x, y, {\\r\\n preferSelected: true,\\r\\n includeLockedElements: true\\r\\n });\\r\\n const type = element ? \\\"element\\\" : \\\"canvas\\\";\\r\\n const container = _this13.excalidrawContainerRef.current;\\r\\n const { top: offsetTop, left: offsetLeft } = container.getBoundingClientRect();\\r\\n const left = event.clientX - offsetLeft;\\r\\n const top = event.clientY - offsetTop;\\r\\n if (element && !_this13.state.selectedElementIds[element.id]) {\\r\\n _this13.setState((0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, _this13.state), {}, {\\r\\n selectedElementIds: {\\r\\n [element.id]: true\\r\\n }\\r\\n }), _this13.scene.getNonDeletedElements()), function () {\\r\\n _this13._openContextMenu({\\r\\n top,\\r\\n left\\r\\n }, type);\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13._openContextMenu({\\r\\n top,\\r\\n left\\r\\n }, type);\\r\\n }\\r\\n };\\r\\n this.maybeDragNewGenericElement = function (pointerDownState, event) {\\r\\n var _a;\\r\\n const draggingElement = _this13.state.draggingElement;\\r\\n const pointerCoords = pointerDownState.lastCoords;\\r\\n if (!draggingElement) {\\r\\n return;\\r\\n }\\r\\n if (draggingElement.type === \\\"selection\\\" && _this13.state.activeTool.type !== \\\"eraser\\\") {\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, _this13.state.activeTool.type, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.x, pointerCoords.x), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.y, pointerCoords.y), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event));\\r\\n }\\r\\n else {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, _this13.state.gridSize);\\r\\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(draggingElement) && ((_a = _this13.imageCache.get(draggingElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\\r\\n const aspectRatio = image && !(image instanceof Promise) ? image.width / image.height : null;\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, _this13.state.activeTool.type, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.x, gridX), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.y, gridY), (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(draggingElement) ? !(0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event) : (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event), aspectRatio);\\r\\n _this13.maybeSuggestBindingForAll([draggingElement]);\\r\\n }\\r\\n };\\r\\n this.maybeHandleResize = function (pointerDownState, event) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n const transformHandleType = pointerDownState.resize.handleType;\\r\\n _this13.setState({\\r\\n // TODO: rename this state field to \\\"isScaling\\\" to distinguish\\r\\n // it from the generic \\\"isResizing\\\" which includes scaling and\\r\\n // rotating\\r\\n isResizing: transformHandleType && transformHandleType !== \\\"rotation\\\",\\r\\n isRotating: transformHandleType === \\\"rotation\\\"\\r\\n });\\r\\n const pointerCoords = pointerDownState.lastCoords;\\r\\n const [resizeX, resizeY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.resize.offset.x, pointerCoords.y - pointerDownState.resize.offset.y, _this13.state.gridSize);\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.transformElements)(pointerDownState, transformHandleType, selectedElements, pointerDownState.resize.arrowDirection, (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldRotateWithDiscreteAngle)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event), selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(selectedElements[0]) ? !(0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event) : (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {\\r\\n _this13.maybeSuggestBindingForAll(selectedElements);\\r\\n return true;\\r\\n }\\r\\n return false;\\r\\n };\\r\\n this._openContextMenu = function (_ref20, type) {\\r\\n let { left, top } = _ref20;\\r\\n if (_this13.state.showHyperlinkPopup) {\\r\\n _this13.setState({\\r\\n showHyperlinkPopup: false\\r\\n });\\r\\n }\\r\\n _this13.contextMenuOpen = true;\\r\\n const maybeGroupAction = _actions__WEBPACK_IMPORTED_MODULE_6__.actionGroup.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeUngroupAction = _actions__WEBPACK_IMPORTED_MODULE_6__.actionUngroup.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeFlipHorizontal = _actions__WEBPACK_IMPORTED_MODULE_6__.actionFlipHorizontal.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeFlipVertical = _actions__WEBPACK_IMPORTED_MODULE_6__.actionFlipVertical.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const mayBeAllowUnbinding = _actions__WEBPACK_IMPORTED_MODULE_6__.actionUnbindText.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const mayBeAllowBinding = _actions__WEBPACK_IMPORTED_MODULE_6__.actionBindText.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const separator = \\\"separator\\\";\\r\\n const elements = _this13.scene.getNonDeletedElements();\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getNonDeletedElements(), _this13.state);\\r\\n const options = [];\\r\\n if (_clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardBlob && elements.length > 0) {\\r\\n options.push(_actions__WEBPACK_IMPORTED_MODULE_6__.actionCopyAsPng);\\r\\n }\\r\\n if (_clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardWriteText && elements.length > 0) {\\r\\n options.push(_actions__WEBPACK_IMPORTED_MODULE_6__.actionCopyAsSvg);\\r\\n }\\r\\n if (type === \\\"element\\\" && _actions__WEBPACK_IMPORTED_MODULE_6__.copyText.contextItemPredicate(elements, _this13.state) && _clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardWriteText) {\\r\\n options.push(_actions__WEBPACK_IMPORTED_MODULE_6__.copyText);\\r\\n }\\r\\n if (type === \\\"canvas\\\") {\\r\\n const viewModeOptions = [...options, typeof _this13.props.gridModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_6__.actionToggleGridMode,\\r\\n _actions__WEBPACK_IMPORTED_MODULE_6__.actionToggleZenMode,\\r\\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__.actionToggleViewMode, _actions__WEBPACK_IMPORTED_MODULE_6__.actionToggleStats];\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: viewModeOptions,\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n else {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [_this13.device.isMobile && navigator.clipboard && {\\r\\n trackEvent: false,\\r\\n name: \\\"paste\\\",\\r\\n perform: function (elements, appStates) {\\r\\n _this13.pasteFromClipboard(null);\\r\\n return {\\r\\n commitToHistory: false\\r\\n };\\r\\n },\\r\\n contextItemLabel: \\\"labels.paste\\\"\\r\\n }, _this13.device.isMobile && navigator.clipboard && separator, _clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardBlob && elements.length > 0 && _actions__WEBPACK_IMPORTED_MODULE_6__.actionCopyAsPng, _clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardWriteText && elements.length > 0 && _actions__WEBPACK_IMPORTED_MODULE_6__.actionCopyAsSvg, _clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardWriteText && selectedElements.length > 0 && _actions__WEBPACK_IMPORTED_MODULE_6__.copyText, (_clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardBlob && elements.length > 0 || _clipboard__WEBPACK_IMPORTED_MODULE_12__.probablySupportsClipboardWriteText && elements.length > 0) && separator, _actions__WEBPACK_IMPORTED_MODULE_6__.actionSelectAll, separator, typeof _this13.props.gridModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_6__.actionToggleGridMode,\\r\\n _actions__WEBPACK_IMPORTED_MODULE_6__.actionToggleZenMode,\\r\\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__.actionToggleViewMode, _actions__WEBPACK_IMPORTED_MODULE_6__.actionToggleStats],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n }\\r\\n else if (type === \\\"element\\\") {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_6__.actionCopy, ...options],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n else {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [_this13.device.isMobile && _actions__WEBPACK_IMPORTED_MODULE_6__.actionCut, _this13.device.isMobile && navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_6__.actionCopy, _this13.device.isMobile && navigator.clipboard && {\\r\\n name: \\\"paste\\\",\\r\\n trackEvent: false,\\r\\n perform: function (elements, appStates) {\\r\\n _this13.pasteFromClipboard(null);\\r\\n return {\\r\\n commitToHistory: false\\r\\n };\\r\\n },\\r\\n contextItemLabel: \\\"labels.paste\\\"\\r\\n }, _this13.device.isMobile && separator, ...options, separator, _actions__WEBPACK_IMPORTED_MODULE_6__.actionCopyStyles, _actions__WEBPACK_IMPORTED_MODULE_6__.actionPasteStyles, separator, maybeGroupAction && _actions__WEBPACK_IMPORTED_MODULE_6__.actionGroup, mayBeAllowUnbinding && _actions__WEBPACK_IMPORTED_MODULE_6__.actionUnbindText, mayBeAllowBinding && _actions__WEBPACK_IMPORTED_MODULE_6__.actionBindText, maybeUngroupAction && _actions__WEBPACK_IMPORTED_MODULE_6__.actionUngroup, (maybeGroupAction || maybeUngroupAction) && separator, _actions__WEBPACK_IMPORTED_MODULE_6__.actionAddToLibrary, separator, _actions__WEBPACK_IMPORTED_MODULE_6__.actionSendBackward, _actions__WEBPACK_IMPORTED_MODULE_6__.actionBringForward, _actions__WEBPACK_IMPORTED_MODULE_6__.actionSendToBack, _actions__WEBPACK_IMPORTED_MODULE_6__.actionBringToFront, separator, maybeFlipHorizontal && _actions__WEBPACK_IMPORTED_MODULE_6__.actionFlipHorizontal, maybeFlipVertical && _actions__WEBPACK_IMPORTED_MODULE_6__.actionFlipVertical, (maybeFlipHorizontal || maybeFlipVertical) && separator, _actions__WEBPACK_IMPORTED_MODULE_6__.actionLink.contextItemPredicate(elements, _this13.state) && _actions__WEBPACK_IMPORTED_MODULE_6__.actionLink, _actions__WEBPACK_IMPORTED_MODULE_6__.actionDuplicateSelection, _actions__WEBPACK_IMPORTED_MODULE_6__.actionToggleLock, separator, _actions__WEBPACK_IMPORTED_MODULE_6__.actionDeleteSelected],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault();\\r\\n if (isPanning) {\\r\\n return;\\r\\n }\\r\\n const { deltaX, deltaY } = event; // note that event.ctrlKey is necessary to handle pinch zooming\\r\\n if (event.metaKey || event.ctrlKey) {\\r\\n const sign = Math.sign(deltaY);\\r\\n const MAX_STEP = 10;\\r\\n const absDelta = Math.abs(deltaY);\\r\\n let delta = deltaY;\\r\\n if (absDelta > MAX_STEP) {\\r\\n delta = MAX_STEP * sign;\\r\\n }\\r\\n let newZoom = _this13.state.zoom.value - delta / 100; // increase zoom steps the more zoomed-in we are (applies to >100% only)\\r\\n newZoom += Math.log10(Math.max(1, _this13.state.zoom.value)) * -sign * // reduced amplification for small deltas (small movements on a trackpad)\\r\\n Math.min(1, absDelta / 20);\\r\\n _this13.setState(function (state) {\\r\\n return _objectSpread(_objectSpread({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getStateForZoom)({\\r\\n viewportX: cursorX,\\r\\n viewportY: cursorY,\\r\\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(newZoom)\\r\\n }, state)), {}, {\\r\\n shouldCacheIgnoreZoom: true\\r\\n });\\r\\n });\\r\\n _this13.resetShouldCacheIgnoreZoomDebounced();\\r\\n return;\\r\\n } // scroll horizontally when shift pressed\\r\\n if (event.shiftKey) {\\r\\n _this13.setState(function (_ref21) {\\r\\n let { zoom, scrollX } = _ref21;\\r\\n return {\\r\\n // on Mac, shift+wheel tends to result in deltaX\\r\\n scrollX: scrollX - (deltaY || deltaX) / zoom.value\\r\\n };\\r\\n });\\r\\n return;\\r\\n }\\r\\n _this13.setState(function (_ref22) {\\r\\n let { zoom, scrollX, scrollY } = _ref22;\\r\\n return {\\r\\n scrollX: scrollX - deltaX / zoom.value,\\r\\n scrollY: scrollY - deltaY / zoom.value\\r\\n };\\r\\n });\\r\\n });\\r\\n this.savePointer = function (x, y, button) {\\r\\n var _a, _b;\\r\\n if (!x || !y) {\\r\\n return;\\r\\n }\\r\\n const pointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: x,\\r\\n clientY: y\\r\\n }, _this13.state);\\r\\n if (isNaN(pointer.x) || isNaN(pointer.y)) { // sometimes the pointer goes off screen\\r\\n }\\r\\n (_b = (_a = _this13.props).onPointerUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, {\\r\\n pointer,\\r\\n button,\\r\\n pointersMap: gesture.pointers\\r\\n });\\r\\n };\\r\\n this.resetShouldCacheIgnoreZoomDebounced = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(function () {\\r\\n if (!_this13.unmounted) {\\r\\n _this13.setState({\\r\\n shouldCacheIgnoreZoom: false\\r\\n });\\r\\n }\\r\\n }, 300);\\r\\n this.updateDOMRect = function (cb) {\\r\\n var _a;\\r\\n if ((_a = _this13.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\\r\\n const excalidrawContainer = _this13.excalidrawContainerRef.current;\\r\\n const { width, height, left: offsetLeft, top: offsetTop } = excalidrawContainer.getBoundingClientRect();\\r\\n const { width: currentWidth, height: currentHeight, offsetTop: currentOffsetTop, offsetLeft: currentOffsetLeft } = _this13.state;\\r\\n if (width === currentWidth && height === currentHeight && offsetLeft === currentOffsetLeft && offsetTop === currentOffsetTop) {\\r\\n if (cb) {\\r\\n cb();\\r\\n }\\r\\n return;\\r\\n }\\r\\n _this13.setState({\\r\\n width,\\r\\n height,\\r\\n offsetLeft,\\r\\n offsetTop\\r\\n }, function () {\\r\\n cb && cb();\\r\\n });\\r\\n }\\r\\n };\\r\\n this.refresh = function () {\\r\\n _this13.setState(_objectSpread({}, _this13.getCanvasOffsets()));\\r\\n };\\r\\n};\\r\\nif (\\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_13__.ENV.TEST || \\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_13__.ENV.DEVELOPMENT) {\\r\\n window.h = window.h || {};\\r\\n Object.defineProperties(window.h, {\\r\\n elements: {\\r\\n configurable: true,\\r\\n get() {\\r\\n var _a;\\r\\n return (_a = this.app) === null || _a === void 0 ? void 0 : _a.scene.getElementsIncludingDeleted();\\r\\n },\\r\\n set(elements) {\\r\\n var _a;\\r\\n return (_a = this.app) === null || _a === void 0 ? void 0 : _a.scene.replaceAllElements(elements);\\r\\n }\\r\\n }\\r\\n });\\r\\n}\\r\\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QWUsRUFBRTtJQUNqRixNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO1FBQ2hDLFFBQVEsRUFBRTtZQUNSLFlBQVksRUFBRSxJQUFJO1lBRWxCLEdBQUc7O2dCQUNELE9BQU8sVUFBSSxDQUFDLEdBQUcsMENBQUUsS0FBSyxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDdkQsQ0FBQztZQUVELEdBQUcsQ0FBQyxRQUFROztnQkFDVixPQUFPLFVBQUksQ0FBQyxHQUFHLDBDQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0RCxDQUFDO1NBRUY7S0FDRixDQUFDLENBQUM7Q0FDSjtBQUVELGlFQUFlLEdBQUcsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9jb21wb25lbnRzL0FwcC50c3g/MzhlNiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgZmx1c2hTeW5jIH0gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IGNsc3ggZnJvbSBcImNsc3hcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gXCJuYW5vaWRcIjtcbmltcG9ydCB7IGFjdGlvbkFkZFRvTGlicmFyeSwgYWN0aW9uQnJpbmdGb3J3YXJkLCBhY3Rpb25CcmluZ1RvRnJvbnQsIGFjdGlvbkNvcHksIGFjdGlvbkNvcHlBc1BuZywgYWN0aW9uQ29weUFzU3ZnLCBjb3B5VGV4dCwgYWN0aW9uQ29weVN0eWxlcywgYWN0aW9uQ3V0LCBhY3Rpb25EZWxldGVTZWxlY3RlZCwgYWN0aW9uRHVwbGljYXRlU2VsZWN0aW9uLCBhY3Rpb25GaW5hbGl6ZSwgYWN0aW9uRmxpcEhvcml6b250YWwsIGFjdGlvbkZsaXBWZXJ0aWNhbCwgYWN0aW9uR3JvdXAsIGFjdGlvblBhc3RlU3R5bGVzLCBhY3Rpb25TZWxlY3RBbGwsIGFjdGlvblNlbmRCYWNrd2FyZCwgYWN0aW9uU2VuZFRvQmFjaywgYWN0aW9uVG9nZ2xlR3JpZE1vZGUsIGFjdGlvblRvZ2dsZVN0YXRzLCBhY3Rpb25Ub2dnbGVaZW5Nb2RlLCBhY3Rpb25VbmJpbmRUZXh0LCBhY3Rpb25CaW5kVGV4dCwgYWN0aW9uVW5ncm91cCwgem9vbVRvRml0RWxlbWVudHMsIGFjdGlvbkxpbmssIGFjdGlvblRvZ2dsZUxvY2sgfSBmcm9tIFwiLi4vYWN0aW9uc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVkb0FjdGlvbiwgY3JlYXRlVW5kb0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvbkhpc3RvcnlcIjtcbmltcG9ydCB7IEFjdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vYWN0aW9ucy9tYW5hZ2VyXCI7XG5pbXBvcnQgeyBhY3Rpb25zIH0gZnJvbSBcIi4uL2FjdGlvbnMvcmVnaXN0ZXJcIjtcbmltcG9ydCB7IHRyYWNrRXZlbnQgfSBmcm9tIFwiLi4vYW5hbHl0aWNzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUsIGlzRXJhc2VyQWN0aXZlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBwYXJzZUNsaXBib2FyZCwgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IsIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgfSBmcm9tIFwiLi4vY2xpcGJvYXJkXCI7XG5pbXBvcnQgeyBBUFBfTkFNRSwgQ1VSU09SX1RZUEUsIERFRkFVTFRfTUFYX0lNQUdFX1dJRFRIX09SX0hFSUdIVCwgREVGQVVMVF9VSV9PUFRJT05TLCBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLCBEUkFHR0lOR19USFJFU0hPTEQsIEVMRU1FTlRfUkVBRFlfVE9fRVJBU0VfT1BBQ0lUWSwgRUxFTUVOVF9TSElGVF9UUkFOU0xBVEVfQU1PVU5ULCBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlQsIEVOViwgRVZFTlQsIEdSSURfU0laRSwgSU1BR0VfUkVOREVSX1RJTUVPVVQsIExJTkVfQ09ORklSTV9USFJFU0hPTEQsIE1BWF9BTExPV0VEX0ZJTEVfQllURVMsIE1JTUVfVFlQRVMsIE1RX01BWF9IRUlHSFRfTEFORFNDQVBFLCBNUV9NQVhfV0lEVEhfTEFORFNDQVBFLCBNUV9NQVhfV0lEVEhfUE9SVFJBSVQsIE1RX1JJR0hUX1NJREVCQVJfTUlOX1dJRFRILCBNUV9TTV9NQVhfV0lEVEgsIFBPSU5URVJfQlVUVE9OLCBTQ1JPTExfVElNRU9VVCwgVEFQX1RXSUNFX1RJTUVPVVQsIFRFWFRfVE9fQ0VOVEVSX1NOQVBfVEhSRVNIT0xELCBUSEVNRSwgVE9VQ0hfQ1RYX01FTlVfVElNRU9VVCwgVkVSVElDQUxfQUxJR04gfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBsb2FkRnJvbUJsb2IgfSBmcm9tIFwiLi4vZGF0YVwiO1xuaW1wb3J0IExpYnJhcnksIHsgZGlzdHJpYnV0ZUxpYnJhcnlJdGVtc09uU3F1YXJlR3JpZCB9IGZyb20gXCIuLi9kYXRhL2xpYnJhcnlcIjtcbmltcG9ydCB7IHJlc3RvcmUsIHJlc3RvcmVFbGVtZW50cyB9IGZyb20gXCIuLi9kYXRhL3Jlc3RvcmVcIjtcbmltcG9ydCB7IGRyYWdOZXdFbGVtZW50LCBkcmFnU2VsZWN0ZWRFbGVtZW50cywgZHVwbGljYXRlRWxlbWVudCwgZ2V0Q29tbW9uQm91bmRzLCBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQsIGdldERyYWdPZmZzZXRYWSwgZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLCBnZXROb3JtYWxpemVkRGltZW5zaW9ucywgZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24sIGdldFJlc2l6ZU9mZnNldFhZLCBnZXRMb2NrZWRMaW5lYXJDdXJzb3JBbGlnblNpemUsIGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzLCBoaXRUZXN0LCBpc0hpdHRpbmdFbGVtZW50Qm91bmRpbmdCb3hXaXRob3V0SGl0dGluZ0VsZW1lbnQsIGlzSW52aXNpYmx5U21hbGxFbGVtZW50LCBpc05vbkRlbGV0ZWRFbGVtZW50LCBpc1RleHRFbGVtZW50LCBuZXdFbGVtZW50LCBuZXdMaW5lYXJFbGVtZW50LCBuZXdUZXh0RWxlbWVudCwgbmV3SW1hZ2VFbGVtZW50LCB0ZXh0V3lzaXd5ZywgdHJhbnNmb3JtRWxlbWVudHMsIHVwZGF0ZVRleHRFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGJpbmRPclVuYmluZFNlbGVjdGVkRWxlbWVudHMsIGZpeEJpbmRpbmdzQWZ0ZXJEZWxldGlvbiwgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uLCBnZXRFbGlnaWJsZUVsZW1lbnRzRm9yQmluZGluZywgZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nLCBpc0JpbmRpbmdFbmFibGVkLCBpc0xpbmVhckVsZW1lbnRTaW1wbGVBbmRBbHJlYWR5Qm91bmQsIG1heWJlQmluZExpbmVhckVsZW1lbnQsIHNob3VsZEVuYWJsZUJpbmRpbmdGb3JQb2ludGVyRXZlbnQsIHVuYmluZExpbmVhckVsZW1lbnRzLCB1cGRhdGVCb3VuZEVsZW1lbnRzIH0gZnJvbSBcIi4uL2VsZW1lbnQvYmluZGluZ1wiO1xuaW1wb3J0IHsgTGluZWFyRWxlbWVudEVkaXRvciB9IGZyb20gXCIuLi9lbGVtZW50L2xpbmVhckVsZW1lbnRFZGl0b3JcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQsIG5ld0VsZW1lbnRXaXRoIH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgZGVlcENvcHlFbGVtZW50LCBuZXdGcmVlRHJhd0VsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC9uZXdFbGVtZW50XCI7XG5pbXBvcnQgeyBoYXNCb3VuZFRleHRFbGVtZW50LCBpc0JpbmRpbmdFbGVtZW50LCBpc0JpbmRpbmdFbGVtZW50VHlwZSwgaXNCb3VuZFRvQ29udGFpbmVyLCBpc0ltYWdlRWxlbWVudCwgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudCwgaXNMaW5lYXJFbGVtZW50LCBpc0xpbmVhckVsZW1lbnRUeXBlLCBpc1RleHRCaW5kYWJsZUNvbnRhaW5lciB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IGdldENlbnRlciwgZ2V0RGlzdGFuY2UgfSBmcm9tIFwiLi4vZ2VzdHVyZVwiO1xuaW1wb3J0IHsgZWRpdEdyb3VwRm9yU2VsZWN0ZWRFbGVtZW50LCBnZXRFbGVtZW50c0luR3JvdXAsIGdldFNlbGVjdGVkR3JvdXBJZEZvckVsZW1lbnQsIGdldFNlbGVjdGVkR3JvdXBJZHMsIGlzRWxlbWVudEluR3JvdXAsIGlzU2VsZWN0ZWRWaWFHcm91cCwgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gXCIuLi9ncm91cHNcIjtcbmltcG9ydCBIaXN0b3J5IGZyb20gXCIuLi9oaXN0b3J5XCI7XG5pbXBvcnQgeyBkZWZhdWx0TGFuZywgZ2V0TGFuZ3VhZ2UsIGxhbmd1YWdlcywgc2V0TGFuZ3VhZ2UsIHQgfSBmcm9tIFwiLi4vaTE4blwiO1xuaW1wb3J0IHsgQ09ERVMsIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIsIHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8sIHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlLCBpc0Fycm93S2V5LCBLRVlTLCBpc0FuZHJvaWQgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHsgZGlzdGFuY2UyZCwgZ2V0R3JpZFBvaW50LCBpc1BhdGhBTG9vcCwgcm90YXRlIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50IH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlckVsZW1lbnRcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZVNjcm9sbENlbnRlciwgZ2V0VGV4dEJpbmRhYmxlQ29udGFpbmVyQXRQb3NpdGlvbiwgZ2V0RWxlbWVudHNBdFBvc2l0aW9uLCBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbiwgZ2V0Tm9ybWFsaXplZFpvb20sIGdldFNlbGVjdGVkRWxlbWVudHMsIGhhc0JhY2tncm91bmQsIGlzT3ZlclNjcm9sbEJhcnMsIGlzU29tZUVsZW1lbnRTZWxlY3RlZCB9IGZyb20gXCIuLi9zY2VuZVwiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgZ2V0U3RhdGVGb3Jab29tIH0gZnJvbSBcIi4uL3NjZW5lL3pvb21cIjtcbmltcG9ydCB7IGZpbmRTaGFwZUJ5S2V5IH0gZnJvbSBcIi4uL3NoYXBlc1wiO1xuaW1wb3J0IHsgZGVib3VuY2UsIGRpc3RhbmNlLCBnZXRGb250U3RyaW5nLCBnZXROZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lciwgaXNJbnB1dExpa2UsIGlzVG9vbEljb24sIGlzV3JpdGFibGVFbGVtZW50LCByZXNldEN1cnNvciwgcmVzb2x2YWJsZVByb21pc2UsIHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3Jkcywgc2V0Q3Vyc29yLCBzZXRDdXJzb3JGb3JTaGFwZSwgdHVwbGVUb0Nvb3JzLCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMsIHdpdGhCYXRjaGVkVXBkYXRlcywgd3JhcEV2ZW50LCB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQsIHVwZGF0ZU9iamVjdCwgc2V0RXJhc2VyQ3Vyc29yLCB1cGRhdGVBY3RpdmVUb29sIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgQ29udGV4dE1lbnUgZnJvbSBcIi4vQ29udGV4dE1lbnVcIjtcbmltcG9ydCBMYXllclVJIGZyb20gXCIuL0xheWVyVUlcIjtcbmltcG9ydCB7IFRvYXN0IH0gZnJvbSBcIi4vVG9hc3RcIjtcbmltcG9ydCB7IGFjdGlvblRvZ2dsZVZpZXdNb2RlIH0gZnJvbSBcIi4uL2FjdGlvbnMvYWN0aW9uVG9nZ2xlVmlld01vZGVcIjtcbmltcG9ydCB7IGRhdGFVUkxUb0ZpbGUsIGdlbmVyYXRlSWRGcm9tRmlsZSwgZ2V0RGF0YVVSTCwgZ2V0RmlsZUZyb21FdmVudCwgaXNTdXBwb3J0ZWRJbWFnZUZpbGUsIGxvYWRTY2VuZU9yTGlicmFyeUZyb21CbG9iLCBub3JtYWxpemVGaWxlLCBwYXJzZUxpYnJhcnlKU09OLCByZXNpemVJbWFnZUZpbGUsIFNWR1N0cmluZ1RvRmlsZSB9IGZyb20gXCIuLi9kYXRhL2Jsb2JcIjtcbmltcG9ydCB7IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cywgbG9hZEhUTUxJbWFnZUVsZW1lbnQsIG5vcm1hbGl6ZVNWRywgdXBkYXRlSW1hZ2VDYWNoZSBhcyBfdXBkYXRlSW1hZ2VDYWNoZSB9IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSBcImxvZGFzaC50aHJvdHRsZVwiO1xuaW1wb3J0IHsgZmlsZU9wZW4gfSBmcm9tIFwiLi4vZGF0YS9maWxlc3lzdGVtXCI7XG5pbXBvcnQgeyBiaW5kVGV4dFRvU2hhcGVBZnRlckR1cGxpY2F0aW9uLCBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0LCBnZXRBcHByb3hNaW5MaW5lV2lkdGgsIGdldEJvdW5kVGV4dEVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHsgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3ggfSBmcm9tIFwiLi4vZWxlbWVudC9jb2xsaXNpb25cIjtcbmltcG9ydCB7IHJlc2l6ZVNpbmdsZUVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC9yZXNpemVFbGVtZW50c1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplTGluaywgc2hvd0h5cGVybGlua1Rvb2x0aXAsIGhpZGVIeXBlcmxpbmtUb29saXAsIEh5cGVybGluaywgaXNQb2ludEhpdHRpbmdMaW5rSWNvbiwgaXNMb2NhbExpbmsgfSBmcm9tIFwiLi4vZWxlbWVudC9IeXBlcmxpbmtcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG4vL3pzdmljemlhblxuZXhwb3J0IGxldCBzaG93Rm91cnRoRm9udCA9IGZhbHNlO1xuY29uc3QgZGV2aWNlQ29udGV4dEluaXRpYWxWYWx1ZSA9IHtcbiAgaXNTbVNjcmVlbjogZmFsc2UsXG4gIGlzTW9iaWxlOiBmYWxzZSxcbiAgaXNUb3VjaFNjcmVlbjogZmFsc2UsXG4gIGNhbkRldmljZUZpdFNpZGViYXI6IGZhbHNlXG59O1xuY29uc3QgRGV2aWNlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KGRldmljZUNvbnRleHRJbml0aWFsVmFsdWUpO1xuZXhwb3J0IGNvbnN0IHVzZURldmljZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoRGV2aWNlQ29udGV4dCk7XG59O1xuY29uc3QgRXhjYWxpZHJhd0NvbnRhaW5lckNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGNvbnRhaW5lcjogbnVsbCxcbiAgaWQ6IG51bGxcbn0pO1xuZXhwb3J0IGNvbnN0IHVzZUV4Y2FsaWRyYXdDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB1c2VDb250ZXh0KEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0KTtcbn07XG5sZXQgZGlkVGFwVHdpY2UgPSBmYWxzZTtcbmxldCB0YXBwZWRUd2ljZVRpbWVyID0gMDtcbmxldCBjdXJzb3JYID0gMDtcbmxldCBjdXJzb3JZID0gMDtcbmxldCBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xubGV0IGlzUGFubmluZyA9IGZhbHNlO1xubGV0IGlzRHJhZ2dpbmdTY3JvbGxCYXIgPSBmYWxzZTtcbmxldCBjdXJyZW50U2Nyb2xsQmFycyA9IHtcbiAgaG9yaXpvbnRhbDogbnVsbCxcbiAgdmVydGljYWw6IG51bGxcbn07XG5sZXQgdG91Y2hUaW1lb3V0ID0gMDtcbmxldCBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSBmYWxzZTsgLy8gcmVtb3ZlIHRoaXMgaGFjayB3aGVuIHdlIGNhbiBzeW5jIHJlbmRlciAmIHJlc2l6ZU9ic2VydmVyIChzdGF0ZSB1cGRhdGUpXG4vLyB0byByQUYuIFNlZSAjNTQzOVxuXG5sZXQgVEhST1RUTEVfTkVYVF9SRU5ERVIgPSB0cnVlO1xubGV0IGxhc3RQb2ludGVyVXAgPSBudWxsO1xuY29uc3QgZ2VzdHVyZSA9IHtcbiAgcG9pbnRlcnM6IG5ldyBNYXAoKSxcbiAgbGFzdENlbnRlcjogbnVsbCxcbiAgaW5pdGlhbERpc3RhbmNlOiBudWxsLFxuICBpbml0aWFsU2NhbGU6IG51bGxcbn07XG5cbmNsYXNzIEFwcCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIC8venN2aWN6aWFuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgc3VwZXIocHJvcHMpO1xuICAgIF90aGlzID0gdGhpcztcblxuICAgIF9pbml0aWFsaXNlUHJvcHMuY2FsbCh0aGlzKTtcblxuICAgIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGV4Y2FsaWRyYXdSZWYsXG4gICAgICB2aWV3TW9kZUVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIHplbk1vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICBncmlkTW9kZUVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIHRoZW1lID0gZGVmYXVsdEFwcFN0YXRlLnRoZW1lLFxuICAgICAgbmFtZSA9IGRlZmF1bHRBcHBTdGF0ZS5uYW1lLFxuICAgICAgdHJheU1vZGVFbmFibGVkID0gZmFsc2UgLy96c3ZpY3ppYW5cblxuICAgIH0gPSBwcm9wcztcbiAgICB0aGlzLnN0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRBcHBTdGF0ZSksIHt9LCB7XG4gICAgICB0aGVtZSxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZVxuICAgIH0sIHRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpKSwge30sIHtcbiAgICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgIHplbk1vZGVFbmFibGVkLFxuICAgICAgdHJheU1vZGVFbmFibGVkLFxuICAgICAgLy96c3ZpY3ppYW5cbiAgICAgIGdyaWRTaXplOiBncmlkTW9kZUVuYWJsZWQgPyBHUklEX1NJWkUgOiBudWxsLFxuICAgICAgbmFtZSxcbiAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgICAgIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0LFxuICAgICAgc2hvd0h5cGVybGlua1BvcHVwOiBmYWxzZSxcbiAgICAgIGlzTGlicmFyeU1lbnVEb2NrZWQ6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy5pZCA9IG5hbm9pZCgpO1xuICAgIHRoaXMubGlicmFyeSA9IG5ldyBMaWJyYXJ5KHRoaXMpO1xuXG4gICAgaWYgKGV4Y2FsaWRyYXdSZWYpIHtcbiAgICAgIGNvbnN0IHJlYWR5UHJvbWlzZSA9IFwiY3VycmVudFwiIGluIGV4Y2FsaWRyYXdSZWYgJiYgZXhjYWxpZHJhd1JlZi5jdXJyZW50Py5yZWFkeVByb21pc2UgfHwgcmVzb2x2YWJsZVByb21pc2UoKTtcbiAgICAgIGNvbnN0IGFwaSA9IHtcbiAgICAgICAgcmVhZHk6IHRydWUsXG4gICAgICAgIHJlYWR5UHJvbWlzZSxcbiAgICAgICAgdXBkYXRlU2NlbmU6IHRoaXMudXBkYXRlU2NlbmUsXG4gICAgICAgIHVwZGF0ZUxpYnJhcnk6IHRoaXMubGlicmFyeS51cGRhdGVMaWJyYXJ5LFxuICAgICAgICBhZGRGaWxlczogdGhpcy5hZGRGaWxlcyxcbiAgICAgICAgcmVzZXRTY2VuZTogdGhpcy5yZXNldFNjZW5lLFxuICAgICAgICBnZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZDogdGhpcy5nZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCxcbiAgICAgICAgaGlzdG9yeToge1xuICAgICAgICAgIGNsZWFyOiB0aGlzLnJlc2V0SGlzdG9yeVxuICAgICAgICB9LFxuICAgICAgICBzY3JvbGxUb0NvbnRlbnQ6IHRoaXMuc2Nyb2xsVG9Db250ZW50LFxuICAgICAgICB6b29tVG9GaXQ6IHRoaXMuem9vbVRvRml0LFxuICAgICAgICAvL3pzdmljemlhblxuICAgICAgICBnZXRTY2VuZUVsZW1lbnRzOiB0aGlzLmdldFNjZW5lRWxlbWVudHMsXG4gICAgICAgIGdldEFwcFN0YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLnN0YXRlO1xuICAgICAgICB9LFxuICAgICAgICBnZXRGaWxlczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5maWxlcztcbiAgICAgICAgfSxcbiAgICAgICAgcmVmcmVzaDogdGhpcy5yZWZyZXNoLFxuICAgICAgICBzZXRUb2FzdDogdGhpcy5zZXRUb2FzdCxcbiAgICAgICAgdXBkYXRlQ29udGFpbmVyU2l6ZTogdGhpcy51cGRhdGVDb250YWluZXJTaXplLFxuICAgICAgICAvL3pzdmljemlhblxuICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgc2V0TG9jYWxGb250OiB0aGlzLnNldExvY2FsRm9udCxcbiAgICAgICAgLy96c3ZpY3ppYW5cbiAgICAgICAgc2VsZWN0RWxlbWVudHM6IHRoaXMuc2VsZWN0RWxlbWVudHMsXG4gICAgICAgIC8venN2aWN6aWFuXG4gICAgICAgIHNlbmRCYWNrd2FyZDogdGhpcy5zZW5kQmFja3dhcmQsXG4gICAgICAgIC8venN2aWN6aWFuXG4gICAgICAgIGJyaW5nRm9yd2FyZDogdGhpcy5icmluZ0ZvcndhcmQsXG4gICAgICAgIC8venN2aWN6aWFuXG4gICAgICAgIHNlbmRUb0JhY2s6IHRoaXMuc2VuZFRvQmFjayxcbiAgICAgICAgLy96c3ZpY3ppYW5cbiAgICAgICAgYnJpbmdUb0Zyb250OiB0aGlzLmJyaW5nVG9Gcm9udCxcbiAgICAgICAgLy96c3ZpY3ppYW5cbiAgICAgICAgcmVzdG9yZTogdGhpcy5yZXN0b3JlLFxuICAgICAgICAvL3pzdmljemlhblxuICAgICAgICBzZXRNb2JpbGVNb2RlQWxsb3dlZDogdGhpcy5zZXRNb2JpbGVNb2RlQWxsb3dlZCxcbiAgICAgICAgLy96c3ZpY3ppYW5cbiAgICAgICAgc2V0QWN0aXZlVG9vbDogdGhpcy5zZXRBY3RpdmVUb29sLFxuICAgICAgICBzZXRDdXJzb3I6IHRoaXMuc2V0Q3Vyc29yLFxuICAgICAgICByZXNldEN1cnNvcjogdGhpcy5yZXNldEN1cnNvclxuICAgICAgfTtcblxuICAgICAgaWYgKHR5cGVvZiBleGNhbGlkcmF3UmVmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZXhjYWxpZHJhd1JlZihhcGkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhjYWxpZHJhd1JlZi5jdXJyZW50ID0gYXBpO1xuICAgICAgfVxuXG4gICAgICByZWFkeVByb21pc2UucmVzb2x2ZShhcGkpO1xuICAgIH1cblxuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlID0ge1xuICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgIGlkOiB0aGlzLmlkXG4gICAgfTtcbiAgICB0aGlzLnNjZW5lID0gbmV3IFNjZW5lKCk7XG4gICAgdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkoKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIgPSBuZXcgQWN0aW9uTWFuYWdlcih0aGlzLnN5bmNBY3Rpb25SZXN1bHQsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5zdGF0ZTtcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gICAgfSwgdGhpcyk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWxsKGFjdGlvbnMpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5yZWdpc3RlckFjdGlvbihjcmVhdGVVbmRvQWN0aW9uKHRoaXMuaGlzdG9yeSkpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5yZWdpc3RlckFjdGlvbihjcmVhdGVSZWRvQWN0aW9uKHRoaXMuaGlzdG9yeSkpO1xuICB9XG5cbiAgcmVuZGVyQ2FudmFzKCkge1xuICAgIGNvbnN0IGNhbnZhc1NjYWxlID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgaGVpZ2h0OiBjYW52YXNET01IZWlnaHQsXG4gICAgICB2aWV3TW9kZUVuYWJsZWRcbiAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBjYW52YXNXaWR0aCA9IGNhbnZhc0RPTVdpZHRoICogY2FudmFzU2NhbGU7XG4gICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gY2FudmFzRE9NSGVpZ2h0ICogY2FudmFzU2NhbGU7XG5cbiAgICBpZiAodmlld01vZGVFbmFibGVkKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJjYW52YXNcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiZXhjYWxpZHJhd19fY2FudmFzXCIsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0LFxuICAgICAgICAgIGN1cnNvcjogQ1VSU09SX1RZUEUuR1JBQlxuICAgICAgICB9LFxuICAgICAgICB3aWR0aDogY2FudmFzV2lkdGgsXG4gICAgICAgIGhlaWdodDogY2FudmFzSGVpZ2h0LFxuICAgICAgICByZWY6IHRoaXMuaGFuZGxlQ2FudmFzUmVmLFxuICAgICAgICBvbkNvbnRleHRNZW51OiB0aGlzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51LFxuICAgICAgICBvblBvaW50ZXJNb3ZlOiB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlLFxuICAgICAgICBvblBvaW50ZXJVcDogdGhpcy5oYW5kbGVDYW52YXNQb2ludGVyVXAsXG4gICAgICAgIG9uUG9pbnRlckNhbmNlbDogdGhpcy5yZW1vdmVQb2ludGVyLFxuICAgICAgICBvblRvdWNoTW92ZTogdGhpcy5oYW5kbGVUb3VjaE1vdmUsXG4gICAgICAgIG9uUG9pbnRlckRvd246IHRoaXMuaGFuZGxlQ2FudmFzUG9pbnRlckRvd24sXG4gICAgICAgIGNoaWxkcmVuOiB0KFwibGFiZWxzLmRyYXdpbmdDYW52YXNcIilcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImNhbnZhc1wiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiZXhjYWxpZHJhd19fY2FudmFzXCIsXG4gICAgICBzdHlsZToge1xuICAgICAgICB3aWR0aDogY2FudmFzRE9NV2lkdGgsXG4gICAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0XG4gICAgICB9LFxuICAgICAgd2lkdGg6IGNhbnZhc1dpZHRoLFxuICAgICAgaGVpZ2h0OiBjYW52YXNIZWlnaHQsXG4gICAgICByZWY6IHRoaXMuaGFuZGxlQ2FudmFzUmVmLFxuICAgICAgb25Db250ZXh0TWVudTogdGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudSxcbiAgICAgIG9uUG9pbnRlckRvd246IHRoaXMuaGFuZGxlQ2FudmFzUG9pbnRlckRvd24sXG4gICAgICBvbkRvdWJsZUNsaWNrOiB0aGlzLmhhbmRsZUNhbnZhc0RvdWJsZUNsaWNrLFxuICAgICAgb25Qb2ludGVyTW92ZTogdGhpcy5oYW5kbGVDYW52YXNQb2ludGVyTW92ZSxcbiAgICAgIG9uUG9pbnRlclVwOiB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJVcCxcbiAgICAgIG9uUG9pbnRlckNhbmNlbDogdGhpcy5yZW1vdmVQb2ludGVyLFxuICAgICAgb25Ub3VjaE1vdmU6IHRoaXMuaGFuZGxlVG91Y2hNb3ZlLFxuICAgICAgY2hpbGRyZW46IHQoXCJsYWJlbHMuZHJhd2luZ0NhbnZhc1wiKVxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyh0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLCB0aGlzLnN0YXRlKTtcbiAgICBjb25zdCB7XG4gICAgICBvbkNvbGxhYkJ1dHRvbkNsaWNrLFxuICAgICAgcmVuZGVyVG9wUmlnaHRVSSxcbiAgICAgIHJlbmRlckZvb3RlcixcbiAgICAgIHJlbmRlckN1c3RvbVN0YXRzXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xzeChcImV4Y2FsaWRyYXcgZXhjYWxpZHJhdy1jb250YWluZXJcIiwge1xuICAgICAgICBcImV4Y2FsaWRyYXctLXZpZXctbW9kZVwiOiB0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCxcbiAgICAgICAgXCJleGNhbGlkcmF3LS1tb2JpbGVcIjogdGhpcy5kZXZpY2UuaXNNb2JpbGUgfHwgISh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCB8fCB0aGlzLnN0YXRlLnplbk1vZGVFbmFibGVkKSAmJiB0aGlzLnN0YXRlLnRyYXlNb2RlRW5hYmxlZCAvL3pzdmljemlhblxuXG4gICAgICB9KSxcbiAgICAgIHJlZjogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLFxuICAgICAgb25Ecm9wOiB0aGlzLmhhbmRsZUFwcE9uRHJvcCxcbiAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgb25LZXlEb3duOiB0aGlzLnByb3BzLmhhbmRsZUtleWJvYXJkR2xvYmFsbHkgPyB1bmRlZmluZWQgOiB0aGlzLm9uS2V5RG93bixcbiAgICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChFeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZTogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUsXG4gICAgICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeHMoRGV2aWNlQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICAgIHZhbHVlOiB0aGlzLmRldmljZSxcbiAgICAgICAgICBjaGlsZHJlbjogWy8qI19fUFVSRV9fKi9fanN4KExheWVyVUksIHtcbiAgICAgICAgICAgIGNhbnZhczogdGhpcy5jYW52YXMsXG4gICAgICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGZpbGVzOiB0aGlzLmZpbGVzLFxuICAgICAgICAgICAgc2V0QXBwU3RhdGU6IHRoaXMuc2V0QXBwU3RhdGUsXG4gICAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgICBlbGVtZW50czogdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSxcbiAgICAgICAgICAgIG9uQ29sbGFiQnV0dG9uQ2xpY2s6IG9uQ29sbGFiQnV0dG9uQ2xpY2ssXG4gICAgICAgICAgICBvbkxvY2tUb2dnbGU6IHRoaXMudG9nZ2xlTG9jayxcbiAgICAgICAgICAgIG9uUGVuTW9kZVRvZ2dsZTogdGhpcy50b2dnbGVQZW5Nb2RlLFxuICAgICAgICAgICAgb25JbnNlcnRFbGVtZW50czogZnVuY3Rpb24gKGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczIuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgIGZpbGVzOiBudWxsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhbmdDb2RlOiBnZXRMYW5ndWFnZSgpLmNvZGUsXG4gICAgICAgICAgICBpc0NvbGxhYm9yYXRpbmc6IHRoaXMucHJvcHMuaXNDb2xsYWJvcmF0aW5nLFxuICAgICAgICAgICAgcmVuZGVyVG9wUmlnaHRVSTogcmVuZGVyVG9wUmlnaHRVSSxcbiAgICAgICAgICAgIHJlbmRlckN1c3RvbUZvb3RlcjogcmVuZGVyRm9vdGVyLFxuICAgICAgICAgICAgcmVuZGVyQ3VzdG9tU3RhdHM6IHJlbmRlckN1c3RvbVN0YXRzLFxuICAgICAgICAgICAgc2hvd0V4aXRaZW5Nb2RlQnRuOiB0eXBlb2YgdGhpcy5wcm9wcz8uemVuTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgdGhpcy5zdGF0ZS56ZW5Nb2RlRW5hYmxlZCxcbiAgICAgICAgICAgIHNob3dUaGVtZUJ0bjogLy90eXBlb2YgdGhpcy5wcm9wcz8udGhlbWUgPT09IFwidW5kZWZpbmVkXCIgJiYgLy96c3ZpY3ppYW5cbiAgICAgICAgICAgIHRoaXMucHJvcHMuVUlPcHRpb25zLmNhbnZhc0FjdGlvbnMudGhlbWUsXG4gICAgICAgICAgICBsaWJyYXJ5UmV0dXJuVXJsOiB0aGlzLnByb3BzLmxpYnJhcnlSZXR1cm5VcmwsXG4gICAgICAgICAgICBVSU9wdGlvbnM6IHRoaXMucHJvcHMuVUlPcHRpb25zLFxuICAgICAgICAgICAgZm9jdXNDb250YWluZXI6IHRoaXMuZm9jdXNDb250YWluZXIsXG4gICAgICAgICAgICBsaWJyYXJ5OiB0aGlzLmxpYnJhcnksXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIG9uSW1hZ2VBY3Rpb246IHRoaXMub25JbWFnZUFjdGlvblxuICAgICAgICAgIH0pLCAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiZXhjYWxpZHJhdy10ZXh0RWRpdG9yQ29udGFpbmVyXCJcbiAgICAgICAgICB9KSwgLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImV4Y2FsaWRyYXctY29udGV4dE1lbnVDb250YWluZXJcIlxuICAgICAgICAgIH0pLCBzZWxlY3RlZEVsZW1lbnQubGVuZ3RoID09PSAxICYmIHRoaXMuc3RhdGUuc2hvd0h5cGVybGlua1BvcHVwICYmIC8qI19fUFVSRV9fKi9fanN4KEh5cGVybGluaywge1xuICAgICAgICAgICAgZWxlbWVudDogc2VsZWN0ZWRFbGVtZW50WzBdLFxuICAgICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgICBzZXRBcHBTdGF0ZTogdGhpcy5zZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgIG9uTGlua09wZW46IHRoaXMucHJvcHMub25MaW5rT3BlblxuICAgICAgICAgIH0sIHNlbGVjdGVkRWxlbWVudFswXS5pZCksIHRoaXMuc3RhdGUudG9hc3QgIT09IG51bGwgJiYgLyojX19QVVJFX18qL19qc3goVG9hc3QsIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuc3RhdGUudG9hc3QubWVzc2FnZSxcbiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5zZXRUb2FzdChudWxsKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5zdGF0ZS50b2FzdC5kdXJhdGlvbixcbiAgICAgICAgICAgIGNsb3NhYmxlOiB0aGlzLnN0YXRlLnRvYXN0LmNsb3NhYmxlXG4gICAgICAgICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwibWFpblwiLCB7XG4gICAgICAgICAgICBjaGlsZHJlbjogdGhpcy5yZW5kZXJDYW52YXMoKVxuICAgICAgICAgIH0pXVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBfdGhpczMudW5tb3VudGVkID0gZmFsc2U7XG4gICAgICBfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlLmNvbnRhaW5lciA9IF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLlRFU1QgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5ERVZFTE9QTUVOVCkge1xuICAgICAgICBjb25zdCBzZXRTdGF0ZSA9IF90aGlzMy5zZXRTdGF0ZS5iaW5kKF90aGlzMyk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LmgsIHtcbiAgICAgICAgICBzdGF0ZToge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczMuc3RhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXRTdGF0ZToge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5zZXRTdGF0ZSguLi5hcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBwOiB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogX3RoaXMzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBoaXN0b3J5OiB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogX3RoaXMzLmhpc3RvcnlcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBfdGhpczMuc2NlbmUuYWRkQ2FsbGJhY2soX3RoaXMzLm9uU2NlbmVVcGRhdGVkKTtcblxuICAgICAgX3RoaXMzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgIGlmIChfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzMy5mb2N1c0NvbnRhaW5lcigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCAmJiAvLyBib3VuZGluZyByZWN0cyBkb24ndCB3b3JrIGluIHRlc3RzIHNvIHVwZGF0aW5nXG4gICAgICAvLyB0aGUgc3RhdGUgb24gaW5pdCB3b3VsZCByZXN1bHQgaW4gbWFraW5nIHRoZSB0ZXN0IGVudmlybyBydW5cbiAgICAgIC8vIGluIG1vYmlsZSBicmVha3BvaW50ICgwIHdpZHRoL2hlaWdodCksIG1ha2luZyBldmVyeXRoaW5nIGZhaWxcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInRlc3RcIikge1xuICAgICAgICBfdGhpczMucmVmcmVzaERldmljZVN0YXRlKF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXCJSZXNpemVPYnNlcnZlclwiIGluIHdpbmRvdyAmJiBfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZj8uY3VycmVudCkge1xuICAgICAgICBfdGhpczMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIFRIUk9UVExFX05FWFRfUkVOREVSID0gZmFsc2U7IC8vIHJlY29tcHV0ZSBkZXZpY2UgZGltZW5zaW9ucyBzdGF0ZVxuICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICAgICAgX3RoaXMzLnJlZnJlc2hEZXZpY2VTdGF0ZShfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KTsgLy8gcmVmcmVzaCBvZmZzZXRzXG4gICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuICAgICAgICAgIF90aGlzMy51cGRhdGVET01SZWN0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBfdGhpczMucmVzaXplT2JzZXJ2ZXI/Lm9ic2VydmUoX3RoaXMzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCk7XG4gICAgICB9IGVsc2UgaWYgKHdpbmRvdy5tYXRjaE1lZGlhKSB7XG4gICAgICAgIGNvbnN0IG1kU2NyZWVuUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYShgKG1heC13aWR0aDogJHtNUV9NQVhfV0lEVEhfUE9SVFJBSVR9cHgpLCAobWF4LWhlaWdodDogJHtNUV9NQVhfSEVJR0hUX0xBTkRTQ0FQRX1weCkgYW5kIChtYXgtd2lkdGg6ICR7TVFfTUFYX1dJRFRIX0xBTkRTQ0FQRX1weClgKTtcbiAgICAgICAgY29uc3Qgc21TY3JlZW5RdWVyeSA9IHdpbmRvdy5tYXRjaE1lZGlhKGAobWF4LXdpZHRoOiAke01RX1NNX01BWF9XSURUSH1weClgKTtcbiAgICAgICAgY29uc3QgY2FuRGV2aWNlRml0U2lkZWJhck1lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYShgKG1pbi13aWR0aDogJHsvLyBOT1RFIHRoaXMgd29uJ3QgdXBkYXRlIGlmIGEgZGlmZmVyZW50IGJyZWFrcG9pbnQgaXMgc3VwcGxpZWRcbiAgICAgICAgLy8gYWZ0ZXIgbW91bnRcbiAgICAgICAgX3RoaXMzLnByb3BzLlVJT3B0aW9ucy5kb2NrZWRTaWRlYmFyQnJlYWtwb2ludCAhPSBudWxsID8gX3RoaXMzLnByb3BzLlVJT3B0aW9ucy5kb2NrZWRTaWRlYmFyQnJlYWtwb2ludCA6IE1RX1JJR0hUX1NJREVCQVJfTUlOX1dJRFRIfXB4KWApO1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgIF90aGlzMy5kZXZpY2UgPSB1cGRhdGVPYmplY3QoX3RoaXMzLmRldmljZSwge1xuICAgICAgICAgICAgaXNTbVNjcmVlbjogc21TY3JlZW5RdWVyeS5tYXRjaGVzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IG1kU2NyZWVuUXVlcnkubWF0Y2hlcyAmJiBfdGhpczMuYWxsb3dNb2JpbGVNb2RlLFxuICAgICAgICAgICAgLy96c3ZpY3ppYW5cbiAgICAgICAgICAgIGNhbkRldmljZUZpdFNpZGViYXI6IGNhbkRldmljZUZpdFNpZGViYXJNZWRpYVF1ZXJ5Lm1hdGNoZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBtZFNjcmVlblF1ZXJ5LmFkZExpc3RlbmVyKGhhbmRsZXIpO1xuXG4gICAgICAgIF90aGlzMy5kZXRhY2hJc01vYmlsZU1xSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gbWRTY3JlZW5RdWVyeS5yZW1vdmVMaXN0ZW5lcihoYW5kbGVyKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoLnNsaWNlKDEpKTtcblxuICAgICAgaWYgKHNlYXJjaFBhcmFtcy5oYXMoXCJ3ZWItc2hhcmUtdGFyZ2V0XCIpKSB7XG4gICAgICAgIC8vIE9idGFpbiBhIGZpbGUgdGhhdCB3YXMgc2hhcmVkIHZpYSB0aGUgV2ViIFNoYXJlIFRhcmdldCBBUEkuXG4gICAgICAgIF90aGlzMy5yZXN0b3JlRmlsZUZyb21TaGFyZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMzLnVwZGF0ZURPTVJlY3QoX3RoaXMzLmluaXRpYWxpemVTY2VuZSk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuZmlsZXMgPSB7fTtcbiAgICB0aGlzLmltYWdlQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnNjZW5lLmRlc3Ryb3koKTtcbiAgICBjbGVhclRpbWVvdXQodG91Y2hUaW1lb3V0KTtcbiAgICB0b3VjaFRpbWVvdXQgPSAwO1xuICB9XG5cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0aGlzLnJlbW92ZVBvaW50ZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQ09QWSwgdGhpcy5vbkNvcHkpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuV0hFRUwsIHRoaXMub25XaGVlbCk7XG4gICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5TQ1JPTEwsIHRoaXMub25TY3JvbGwpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZRE9XTiwgdGhpcy5vbktleURvd24sIGZhbHNlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULk1PVVNFX01PVkUsIHRoaXMudXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgdGhpcy5vbktleVVwKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5SRVNJWkUsIHRoaXMub25SZXNpemUsIGZhbHNlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5VTkxPQUQsIHRoaXMub25VbmxvYWQsIGZhbHNlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0aGlzLm9uQmx1ciwgZmFsc2UpO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkRSQUdfT1ZFUiwgdGhpcy5kaXNhYmxlRXZlbnQsIGZhbHNlKTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5EUk9QLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9TVEFSVCwgdGhpcy5vbkdlc3R1cmVTdGFydCwgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9DSEFOR0UsIHRoaXMub25HZXN0dXJlQ2hhbmdlLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5HRVNUVVJFX0VORCwgdGhpcy5vbkdlc3R1cmVFbmQsIGZhbHNlKTtcbiAgICB0aGlzLmRldGFjaElzTW9iaWxlTXFIYW5kbGVyPy4oKTtcbiAgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRoaXMucmVtb3ZlUG9pbnRlcik7IC8vICMzNTUzXG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPUFksIHRoaXMub25Db3B5KTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5XSEVFTCwgdGhpcy5vbldoZWVsLCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSkge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCB0aGlzLm9uS2V5RG93biwgZmFsc2UpO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIHRoaXMub25LZXlVcCwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTU9VU0VfTU9WRSwgdGhpcy51cGRhdGVDdXJyZW50Q3Vyc29yUG9zaXRpb24pOyAvLyByZXJlbmRlciB0ZXh0IGVsZW1lbnRzIG9uIGZvbnQgbG9hZCB0byBmaXggIzYzNyAmJiAjMTU1M1xuXG4gICAgZG9jdW1lbnQuZm9udHM/LmFkZEV2ZW50TGlzdGVuZXI/LihcImxvYWRpbmdkb25lXCIsIHRoaXMub25Gb250TG9hZGVkKTsgLy8gU2FmYXJpLW9ubHkgZGVza3RvcCBwaW5jaCB6b29tXG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkdFU1RVUkVfU1RBUlQsIHRoaXMub25HZXN0dXJlU3RhcnQsIGZhbHNlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkdFU1RVUkVfQ0hBTkdFLCB0aGlzLm9uR2VzdHVyZUNoYW5nZSwgZmFsc2UpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9FTkQsIHRoaXMub25HZXN0dXJlRW5kLCBmYWxzZSk7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DVVQsIHRoaXMub25DdXQpO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuZGV0ZWN0U2Nyb2xsKSB7XG4gICAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpO1xuICAgICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlNDUk9MTCwgdGhpcy5vblNjcm9sbCk7XG4gICAgfVxuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUkVTSVpFLCB0aGlzLm9uUmVzaXplLCBmYWxzZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuVU5MT0FELCB0aGlzLm9uVW5sb2FkLCBmYWxzZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQkxVUiwgdGhpcy5vbkJsdXIsIGZhbHNlKTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5EUkFHX09WRVIsIHRoaXMuZGlzYWJsZUV2ZW50LCBmYWxzZSk7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuRFJPUCwgdGhpcy5kaXNhYmxlRXZlbnQsIGZhbHNlKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ICYmIHByZXZQcm9wcy5VSU9wdGlvbnMuZG9ja2VkU2lkZWJhckJyZWFrcG9pbnQgIT09IHRoaXMucHJvcHMuVUlPcHRpb25zLmRvY2tlZFNpZGViYXJCcmVha3BvaW50KSB7XG4gICAgICB0aGlzLnJlZnJlc2hEZXZpY2VTdGF0ZSh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZTdGF0ZS5zY3JvbGxYICE9PSB0aGlzLnN0YXRlLnNjcm9sbFggfHwgcHJldlN0YXRlLnNjcm9sbFkgIT09IHRoaXMuc3RhdGUuc2Nyb2xsWSkge1xuICAgICAgdGhpcy5wcm9wcz8ub25TY3JvbGxDaGFuZ2U/Lih0aGlzLnN0YXRlLnNjcm9sbFgsIHRoaXMuc3RhdGUuc2Nyb2xsWSk7XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKS5sZW5ndGggJiYgaXNFcmFzZXJBY3RpdmUodGhpcy5zdGF0ZSkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBhY3RpdmVUb29sOiB1cGRhdGVBY3RpdmVUb29sKHRoaXMuc3RhdGUsIHtcbiAgICAgICAgICB0eXBlOiBcInNlbGVjdGlvblwiXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwiZXJhc2VyXCIgJiYgcHJldlN0YXRlLnRoZW1lICE9PSB0aGlzLnN0YXRlLnRoZW1lKSB7XG4gICAgICBzZXRFcmFzZXJDdXJzb3IodGhpcy5jYW52YXMsIHRoaXMuc3RhdGUudGhlbWUpO1xuICAgIH0gLy8gSGlkZSBoeXBlcmxpbmsgcG9wdXAgaWYgc2hvd24gd2hlbiBlbGVtZW50IHR5cGUgaXMgbm90IHNlbGVjdGlvblxuXG5cbiAgICBpZiAocHJldlN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIiAmJiB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJiB0aGlzLnN0YXRlLnNob3dIeXBlcmxpbmtQb3B1cCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNob3dIeXBlcmxpbmtQb3B1cDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMubGFuZ0NvZGUgIT09IHRoaXMucHJvcHMubGFuZ0NvZGUpIHtcbiAgICAgIHRoaXMudXBkYXRlTGFuZ3VhZ2UoKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnZpZXdNb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICB2aWV3TW9kZUVuYWJsZWQ6ICEhdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwcmV2U3RhdGUudmlld01vZGVFbmFibGVkICE9PSB0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpO1xuICAgICAgdGhpcy5kZXNlbGVjdEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy56ZW5Nb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHplbk1vZGVFbmFibGVkOiAhIXRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMudGhlbWUgIT09IHRoaXMucHJvcHMudGhlbWUgJiYgdGhpcy5wcm9wcy50aGVtZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHRoZW1lOiB0aGlzLnByb3BzLnRoZW1lXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLmdyaWRNb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBncmlkU2l6ZTogdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPyBHUklEX1NJWkUgOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5uYW1lICYmIHByZXZQcm9wcy5uYW1lICE9PSB0aGlzLnByb3BzLm5hbWUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBuYW1lOiB0aGlzLnByb3BzLm5hbWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jbGFzc0xpc3QudG9nZ2xlKFwidGhlbWUtLWRhcmtcIiwgdGhpcy5zdGF0ZS50aGVtZSA9PT0gXCJkYXJrXCIpO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiYgIXRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW3RoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkXSkge1xuICAgICAgLy8gZGVmZXIgc28gdGhhdCB0aGUgY29tbWl0VG9IaXN0b3J5IGZsYWcgaXNuJ3QgcmVzZXQgdmlhIGN1cnJlbnQgdXBkYXRlXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXM0LmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBtdWx0aUVsZW1lbnRcbiAgICB9ID0gcHJldlN0YXRlO1xuXG4gICAgaWYgKHByZXZTdGF0ZS5hY3RpdmVUb29sICE9PSB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wgJiYgbXVsdGlFbGVtZW50ICE9IG51bGwgJiYgaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKSAmJiBpc0JpbmRpbmdFbGVtZW50KG11bHRpRWxlbWVudCwgZmFsc2UpKSB7XG4gICAgICBtYXliZUJpbmRMaW5lYXJFbGVtZW50KG11bHRpRWxlbWVudCwgdGhpcy5zdGF0ZSwgdGhpcy5zY2VuZSwgdHVwbGVUb0Nvb3JzKExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRBdEluZGV4R2xvYmFsQ29vcmRpbmF0ZXMobXVsdGlFbGVtZW50LCAtMSkpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JCdXR0b24gPSB7fTtcbiAgICBjb25zdCBwb2ludGVyVmlld3BvcnRDb29yZHMgPSB7fTtcbiAgICBjb25zdCByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHMgPSB7fTtcbiAgICBjb25zdCBwb2ludGVyVXNlcm5hbWVzID0ge307XG4gICAgY29uc3QgcG9pbnRlclVzZXJTdGF0ZXMgPSB7fTtcbiAgICB0aGlzLnN0YXRlLmNvbGxhYm9yYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAodXNlciwgc29ja2V0SWQpIHtcbiAgICAgIGlmICh1c2VyLnNlbGVjdGVkRWxlbWVudElkcykge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIE9iamVjdC5rZXlzKHVzZXIuc2VsZWN0ZWRFbGVtZW50SWRzKSkge1xuICAgICAgICAgIGlmICghKGlkIGluIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkcykpIHtcbiAgICAgICAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkc1tpZF0gPSBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHNbaWRdLnB1c2goc29ja2V0SWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXNlci5wb2ludGVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHVzZXIudXNlcm5hbWUpIHtcbiAgICAgICAgcG9pbnRlclVzZXJuYW1lc1tzb2NrZXRJZF0gPSB1c2VyLnVzZXJuYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAodXNlci51c2VyU3RhdGUpIHtcbiAgICAgICAgcG9pbnRlclVzZXJTdGF0ZXNbc29ja2V0SWRdID0gdXNlci51c2VyU3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHBvaW50ZXJWaWV3cG9ydENvb3Jkc1tzb2NrZXRJZF0gPSBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMoe1xuICAgICAgICBzY2VuZVg6IHVzZXIucG9pbnRlci54LFxuICAgICAgICBzY2VuZVk6IHVzZXIucG9pbnRlci55XG4gICAgICB9LCBfdGhpczQuc3RhdGUpO1xuICAgICAgY3Vyc29yQnV0dG9uW3NvY2tldElkXSA9IHVzZXIuYnV0dG9uO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlbmRlcmluZ0VsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKS5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIGlmIChpc0ltYWdlRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBpZiAoIC8vIG5vdCBwbGFjZWQgb24gY2FudmFzIHlldCAoYnV0IGluIGVsZW1lbnRzIGFycmF5KVxuICAgICAgICBfdGhpczQuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudElkID09PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IC8vIGRvbid0IHJlbmRlciB0ZXh0IGVsZW1lbnQgdGhhdCdzIGJlaW5nIGN1cnJlbnRseSBlZGl0ZWQgKGl0J3NcbiAgICAgIC8vIHJlbmRlcmVkIG9uIHJlbW90ZSBvbmx5KVxuXG5cbiAgICAgIHJldHVybiAhX3RoaXM0LnN0YXRlLmVkaXRpbmdFbGVtZW50IHx8IF90aGlzNC5zdGF0ZS5lZGl0aW5nRWxlbWVudC50eXBlICE9PSBcInRleHRcIiB8fCBlbGVtZW50LmlkICE9PSBfdGhpczQuc3RhdGUuZWRpdGluZ0VsZW1lbnQuaWQ7XG4gICAgfSk7XG4gICAgcmVuZGVyU2NlbmUocmVuZGVyaW5nRWxlbWVudHMsIHRoaXMuc3RhdGUsIHRoaXMuc3RhdGUuc2VsZWN0aW9uRWxlbWVudCwgd2luZG93LmRldmljZVBpeGVsUmF0aW8sIHRoaXMucmMsIHRoaXMuY2FudmFzLCB7XG4gICAgICBzY3JvbGxYOiB0aGlzLnN0YXRlLnNjcm9sbFgsXG4gICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFksXG4gICAgICB2aWV3QmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLnZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICB6b29tOiB0aGlzLnN0YXRlLnpvb20sXG4gICAgICByZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHM6IHBvaW50ZXJWaWV3cG9ydENvb3JkcyxcbiAgICAgIHJlbW90ZVBvaW50ZXJCdXR0b246IGN1cnNvckJ1dHRvbixcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgIHJlbW90ZVBvaW50ZXJVc2VybmFtZXM6IHBvaW50ZXJVc2VybmFtZXMsXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczogcG9pbnRlclVzZXJTdGF0ZXMsXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IHRoaXMuc3RhdGUuc2hvdWxkQ2FjaGVJZ25vcmVab29tLFxuICAgICAgdGhlbWU6IHRoaXMuc3RhdGUudGhlbWUsXG4gICAgICBpbWFnZUNhY2hlOiB0aGlzLmltYWdlQ2FjaGUsXG4gICAgICBpc0V4cG9ydGluZzogZmFsc2UsXG4gICAgICByZW5kZXJTY3JvbGxiYXJzOiAhdGhpcy5kZXZpY2UuaXNNb2JpbGVcbiAgICB9LCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgbGV0IHtcbiAgICAgICAgYXRMZWFzdE9uZVZpc2libGVFbGVtZW50LFxuICAgICAgICBzY3JvbGxCYXJzXG4gICAgICB9ID0gX3JlZjtcblxuICAgICAgaWYgKHNjcm9sbEJhcnMpIHtcbiAgICAgICAgY3VycmVudFNjcm9sbEJhcnMgPSBzY3JvbGxCYXJzO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzY3JvbGxlZE91dHNpZGUgPSAvLyBoaWRlIHdoZW4gZWRpdGluZyB0ZXh0XG4gICAgICBpc1RleHRFbGVtZW50KF90aGlzNC5zdGF0ZS5lZGl0aW5nRWxlbWVudCkgPyBmYWxzZSA6ICFhdExlYXN0T25lVmlzaWJsZUVsZW1lbnQgJiYgcmVuZGVyaW5nRWxlbWVudHMubGVuZ3RoID4gMDtcblxuICAgICAgaWYgKF90aGlzNC5zdGF0ZS5zY3JvbGxlZE91dHNpZGUgIT09IHNjcm9sbGVkT3V0c2lkZSkge1xuICAgICAgICBfdGhpczQuc2V0U3RhdGUoe1xuICAgICAgICAgIHNjcm9sbGVkT3V0c2lkZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXM0LnNjaGVkdWxlSW1hZ2VSZWZyZXNoKCk7XG4gICAgfSwgVEhST1RUTEVfTkVYVF9SRU5ERVIgJiYgd2luZG93LkVYQ0FMSURSQVdfVEhST1RUTEVfUkVOREVSID09PSB0cnVlKTtcblxuICAgIGlmICghVEhST1RUTEVfTkVYVF9SRU5ERVIpIHtcbiAgICAgIFRIUk9UVExFX05FWFRfUkVOREVSID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmhpc3RvcnkucmVjb3JkKHRoaXMuc3RhdGUsIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkpOyAvLyBEbyBub3Qgbm90aWZ5IGNvbnN1bWVycyBpZiB3ZSdyZSBzdGlsbCBsb2FkaW5nIHRoZSBzY2VuZS4gQW1vbmcgb3RoZXJcbiAgICAvLyBwb3RlbnRpYWwgaXNzdWVzLCB0aGlzIGZpeGVzIGEgY2FzZSB3aGVyZSB0aGUgdGFiIGlzbid0IGZvY3VzZWQgZHVyaW5nXG4gICAgLy8gaW5pdCwgd2hpY2ggd291bGQgdHJpZ2dlciBvbkNoYW5nZSB3aXRoIGVtcHR5IGVsZW1lbnRzLCB3aGljaCB3b3VsZCB0aGVuXG4gICAgLy8gb3ZlcnJpZGUgd2hhdGV2ZXIgaXMgaW4gbG9jYWxTdG9yYWdlIGN1cnJlbnRseS5cblxuICAgIGlmICghdGhpcy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgIHRoaXMucHJvcHMub25DaGFuZ2U/Lih0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCB0aGlzLnN0YXRlLCB0aGlzLmZpbGVzKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgcmVzZXRUYXBUd2ljZSgpIHtcbiAgICBkaWRUYXBUd2ljZSA9IGZhbHNlO1xuICB9XG5cbiAgYWRkVGV4dEZyb21QYXN0ZSh0ZXh0KSB7XG4gICAgY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHlcbiAgICB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKHtcbiAgICAgIGNsaWVudFg6IGN1cnNvclgsXG4gICAgICBjbGllbnRZOiBjdXJzb3JZXG4gICAgfSwgdGhpcy5zdGF0ZSk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld1RleHRFbGVtZW50KHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgICB0ZXh0LFxuICAgICAgcmF3VGV4dDogdGV4dCxcbiAgICAgIGZvbnRTaXplOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICBmb250RmFtaWx5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgIHRleHRBbGlnbjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVRleHRBbGlnbixcbiAgICAgIHZlcnRpY2FsQWxpZ246IERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gICAgICBsb2NrZWQ6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoWy4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIGVsZW1lbnRdKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICBbZWxlbWVudC5pZF06IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gIH0gLy8gQ29sbGFib3JhdGlvblxuXG5cbiAgaGFuZGxlVGV4dFd5c2l3eWcoZWxlbWVudCwgX3JlZjIpIHtcbiAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgIGxldCB7XG4gICAgICBpc0V4aXN0aW5nRWxlbWVudCA9IGZhbHNlXG4gICAgfSA9IF9yZWYyO1xuXG4gICAgY29uc3QgdXBkYXRlRWxlbWVudCA9IGZ1bmN0aW9uICh0ZXh0LCBvcmlnaW5hbFRleHQsIGlzRGVsZXRlZCwgcmF3VGV4dCwgbGluaykge1xuICAgICAgX3RoaXM1LnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXM1LnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcChmdW5jdGlvbiAoX2VsZW1lbnQpIHtcbiAgICAgICAgaWYgKF9lbGVtZW50LmlkID09PSBlbGVtZW50LmlkICYmIGlzVGV4dEVsZW1lbnQoX2VsZW1lbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZVRleHRFbGVtZW50KF9lbGVtZW50LCB7XG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgaXNEZWxldGVkLFxuICAgICAgICAgICAgb3JpZ2luYWxUZXh0LFxuICAgICAgICAgICAgcmF3VGV4dDogcmF3VGV4dCA/PyBvcmlnaW5hbFRleHQsXG4gICAgICAgICAgICBsaW5rXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX2VsZW1lbnQ7XG4gICAgICB9KV0pO1xuICAgIH07XG5cbiAgICBpZiAoaXNFeGlzdGluZ0VsZW1lbnQgJiYgdGhpcy5wcm9wcy5vbkJlZm9yZVRleHRFZGl0KSB7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5wcm9wcy5vbkJlZm9yZVRleHRFZGl0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5tYXAoZnVuY3Rpb24gKF9lbGVtZW50KSB7XG4gICAgICAgICAgaWYgKF9lbGVtZW50LmlkID09PSBlbGVtZW50LmlkICYmIGlzVGV4dEVsZW1lbnQoX2VsZW1lbnQpKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gdXBkYXRlVGV4dEVsZW1lbnQoX2VsZW1lbnQsIHtcbiAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgaXNEZWxldGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgb3JpZ2luYWxUZXh0OiB0ZXh0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBfZWxlbWVudDtcbiAgICAgICAgfSldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0ZXh0V3lzaXd5Zyh7XG4gICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgIGNhbnZhczogdGhpcy5jYW52YXMsXG4gICAgICBnZXRWaWV3cG9ydENvb3JkczogZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHg6IHZpZXdwb3J0WCxcbiAgICAgICAgICB5OiB2aWV3cG9ydFlcbiAgICAgICAgfSA9IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3Jkcyh7XG4gICAgICAgICAgc2NlbmVYOiB4LFxuICAgICAgICAgIHNjZW5lWTogeVxuICAgICAgICB9LCBfdGhpczUuc3RhdGUpO1xuICAgICAgICByZXR1cm4gW3ZpZXdwb3J0WCAtIF90aGlzNS5zdGF0ZS5vZmZzZXRMZWZ0LCB2aWV3cG9ydFkgLSBfdGhpczUuc3RhdGUub2Zmc2V0VG9wXTtcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZTogd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHVwZGF0ZUVsZW1lbnQodGV4dCwgdGV4dCwgZmFsc2UpO1xuXG4gICAgICAgIGlmIChpc05vbkRlbGV0ZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRFbGVtZW50cyhlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBvblN1Ym1pdDogd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgdmlhS2V5Ym9hcmQsXG4gICAgICAgICAgb3JpZ2luYWxUZXh0XG4gICAgICAgIH0gPSBfcmVmMztcbiAgICAgICAgY29uc3QgaXNEZWxldGVkID0gIXRleHQudHJpbSgpO1xuICAgICAgICBjb25zdCByYXdUZXh0ID0gb3JpZ2luYWxUZXh0OyAvL3Nob3VsZCB0aGlzIGJlIG9yaWdpbmFsVGV4dD8/XG5cbiAgICAgICAgbGV0IGxpbmsgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKF90aGlzNS5wcm9wcy5vbkJlZm9yZVRleHRTdWJtaXQpIHtcbiAgICAgICAgICBjb25zdCBbdXBkYXRlZFRleHQsIHVwZGF0ZWRPcmlnaW5hbFRleHQsIGxdID0gX3RoaXM1LnByb3BzLm9uQmVmb3JlVGV4dFN1Ym1pdChlbGVtZW50LCB0ZXh0LCBvcmlnaW5hbFRleHQsIGlzRGVsZXRlZCk7XG5cbiAgICAgICAgICB0ZXh0ID0gdXBkYXRlZFRleHQgPz8gdGV4dDtcbiAgICAgICAgICBvcmlnaW5hbFRleHQgPSB1cGRhdGVkT3JpZ2luYWxUZXh0ID8/IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgICBsaW5rID0gbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZUVsZW1lbnQodGV4dCwgb3JpZ2luYWxUZXh0LCBpc0RlbGV0ZWQsIHJhd1RleHQsIGxpbmspOyAvLyBzZWxlY3QgdGhlIGNyZWF0ZWQgdGV4dCBlbGVtZW50IG9ubHkgaWYgc3VibWl0dGluZyB2aWEga2V5Ym9hcmRcbiAgICAgICAgLy8gKHdoZW4gc3VibWl0dGluZyB2aWEgY2xpY2sgaXQgc2hvdWxkIGFjdCBhcyBzaWduYWwgdG8gZGVzZWxlY3QpXG5cbiAgICAgICAgaWYgKCFpc0RlbGV0ZWQgJiYgdmlhS2V5Ym9hcmQpIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50SWRUb1NlbGVjdCA9IGVsZW1lbnQuY29udGFpbmVySWQgPyBlbGVtZW50LmNvbnRhaW5lcklkIDogZWxlbWVudC5pZDtcblxuICAgICAgICAgIF90aGlzNS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgICAgW2VsZW1lbnRJZFRvU2VsZWN0XTogdHJ1ZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0RlbGV0ZWQpIHtcbiAgICAgICAgICBmaXhCaW5kaW5nc0FmdGVyRGVsZXRpb24oX3RoaXM1LnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLCBbZWxlbWVudF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0RlbGV0ZWQgfHwgaXNFeGlzdGluZ0VsZW1lbnQpIHtcbiAgICAgICAgICBfdGhpczUuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzNS5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiBudWxsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChfdGhpczUuc3RhdGUuYWN0aXZlVG9vbC5sb2NrZWQpIHtcbiAgICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZShfdGhpczUuY2FudmFzLCBfdGhpczUuc3RhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXM1LmZvY3VzQ29udGFpbmVyKCk7XG4gICAgICB9KSxcbiAgICAgIGVsZW1lbnQsXG4gICAgICBleGNhbGlkcmF3Q29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgIGFwcDogdGhpc1xuICAgIH0pOyAvLyBkZXNlbGVjdCBhbGwgb3RoZXIgZWxlbWVudHMgd2hlbiBpbnNlcnRpbmcgdGV4dFxuXG4gICAgdGhpcy5kZXNlbGVjdEVsZW1lbnRzKCk7IC8vIGRvIGFuIGluaXRpYWwgdXBkYXRlIHRvIHJlLWluaXRpYWxpemUgZWxlbWVudCBwb3NpdGlvbiBzaW5jZSB3ZSB3ZXJlXG4gICAgLy8gbW9kaWZ5aW5nIGVsZW1lbnQncyB4L3kgZm9yIHNha2Ugb2YgZWRpdG9yIChjYXNlOiBzeW5jaW5nIHRvIHJlbW90ZSlcblxuICAgIHVwZGF0ZUVsZW1lbnQoZWxlbWVudC50ZXh0LCBlbGVtZW50Lm9yaWdpbmFsVGV4dCwgZmFsc2UpO1xuICB9XG5cbiAgZGVzZWxlY3RFbGVtZW50cygpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgfSk7XG4gIH1cblxuICBnZXRUZXh0RWxlbWVudEF0UG9zaXRpb24oeCwgeSkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHgsIHksIHtcbiAgICAgIGluY2x1ZGVCb3VuZFRleHRFbGVtZW50OiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZiAoZWxlbWVudCAmJiBpc1RleHRFbGVtZW50KGVsZW1lbnQpICYmICFlbGVtZW50LmlzRGVsZXRlZCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCBvcHRzKSB7XG4gICAgY29uc3QgYWxsSGl0RWxlbWVudHMgPSB0aGlzLmdldEVsZW1lbnRzQXRQb3NpdGlvbih4LCB5LCBvcHRzPy5pbmNsdWRlQm91bmRUZXh0RWxlbWVudCwgb3B0cz8uaW5jbHVkZUxvY2tlZEVsZW1lbnRzKTtcblxuICAgIGlmIChhbGxIaXRFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICBpZiAob3B0cz8ucHJlZmVyU2VsZWN0ZWQpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSBhbGxIaXRFbGVtZW50cy5sZW5ndGggLSAxOyBpbmRleCA+IC0xOyBpbmRleC0tKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2FsbEhpdEVsZW1lbnRzW2luZGV4XS5pZF0pIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxIaXRFbGVtZW50c1tpbmRleF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRXaXRoSGlnaGVzdFpJbmRleCA9IGFsbEhpdEVsZW1lbnRzW2FsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDFdOyAvLyBJZiB3ZSdyZSBoaXR0aW5nIGVsZW1lbnQgd2l0aCBoaWdoZXN0IHotaW5kZXggb25seSBvbiBpdHMgYm91bmRpbmcgYm94XG4gICAgICAvLyB3aGlsZSBhbHNvIGhpdHRpbmcgb3RoZXIgZWxlbWVudCBmaWd1cmUsIHRoZSBsYXR0ZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG5cbiAgICAgIHJldHVybiBpc0hpdHRpbmdFbGVtZW50Qm91bmRpbmdCb3hXaXRob3V0SGl0dGluZ0VsZW1lbnQoZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4LCB0aGlzLnN0YXRlLCB4LCB5KSA/IGFsbEhpdEVsZW1lbnRzW2FsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDJdIDogZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4O1xuICAgIH1cblxuICAgIGlmIChhbGxIaXRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBhbGxIaXRFbGVtZW50c1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldEVsZW1lbnRzQXRQb3NpdGlvbih4LCB5KSB7XG4gICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cbiAgICBsZXQgaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICAgIGxldCBpbmNsdWRlTG9ja2VkRWxlbWVudHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuICAgIGNvbnN0IGVsZW1lbnRzID0gaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQgJiYgaW5jbHVkZUxvY2tlZEVsZW1lbnRzID8gdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSA6IHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gKGluY2x1ZGVMb2NrZWRFbGVtZW50cyB8fCAhZWxlbWVudC5sb2NrZWQpICYmIChpbmNsdWRlQm91bmRUZXh0RWxlbWVudCB8fCAhKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgZWxlbWVudC5jb250YWluZXJJZCkpO1xuICAgIH0pO1xuICAgIHJldHVybiBnZXRFbGVtZW50c0F0UG9zaXRpb24oZWxlbWVudHMsIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gaGl0VGVzdChlbGVtZW50LCBfdGhpczYuc3RhdGUsIHgsIHkpO1xuICAgIH0pO1xuICB9XG5cbiAgbWF5YmVDbGVhbnVwQWZ0ZXJNaXNzaW5nUG9pbnRlclVwKGV2ZW50KSB7XG4gICAgaWYgKGxhc3RQb2ludGVyVXAgIT09IG51bGwpIHtcbiAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHNvbWV0aW1lcyB3ZSBkb24ndCBnZXQgYSBwb2ludGVydXAgYWZ0ZXIgYSBwb2ludGVyZG93bixcbiAgICAgIC8vIHRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29udGV4dHVhbCBtZW51IG9yIGFsZXJ0IGlzIHRyaWdnZXJlZC4gSW4gb3JkZXIgdG8gYXZvaWRcbiAgICAgIC8vIGJlaW5nIGluIGEgd2VpcmQgc3RhdGUsIHdlIGNsZWFuIHVwIG9uIHRoZSBuZXh0IHBvaW50ZXJkb3duXG4gICAgICBsYXN0UG9pbnRlclVwKGV2ZW50KTtcbiAgICB9XG4gIH0gLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIHBhbm5pbmdcblxuXG4gIHVwZGF0ZUdlc3R1cmVPblBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgZ2VzdHVyZS5wb2ludGVycy5zZXQoZXZlbnQucG9pbnRlcklkLCB7XG4gICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgeTogZXZlbnQuY2xpZW50WVxuICAgIH0pO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMikge1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gZ2V0Q2VudGVyKGdlc3R1cmUucG9pbnRlcnMpO1xuICAgICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgICBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9IGdldERpc3RhbmNlKEFycmF5LmZyb20oZ2VzdHVyZS5wb2ludGVycy52YWx1ZXMoKSkpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRpYWxQb2ludGVyRG93blN0YXRlKGV2ZW50KSB7XG4gICAgY29uc3Qgb3JpZ2luID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCB0aGlzLnN0YXRlKTtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyh0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLCB0aGlzLnN0YXRlKTtcbiAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9yaWdpbixcbiAgICAgIHdpdGhDbWRPckN0cmw6IGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdLFxuICAgICAgb3JpZ2luSW5HcmlkOiB0dXBsZVRvQ29vcnMoZ2V0R3JpZFBvaW50KG9yaWdpbi54LCBvcmlnaW4ueSwgdGhpcy5zdGF0ZS5ncmlkU2l6ZSkpLFxuICAgICAgc2Nyb2xsYmFyczogaXNPdmVyU2Nyb2xsQmFycyhjdXJyZW50U2Nyb2xsQmFycywgZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhdGUub2Zmc2V0TGVmdCwgZXZlbnQuY2xpZW50WSAtIHRoaXMuc3RhdGUub2Zmc2V0VG9wKSxcbiAgICAgIC8vIHdlIG5lZWQgdG8gZHVwbGljYXRlIGJlY2F1c2Ugd2UnbGwgYmUgdXBkYXRpbmcgdGhpcyBzdGF0ZVxuICAgICAgbGFzdENvb3JkczogX29iamVjdFNwcmVhZCh7fSwgb3JpZ2luKSxcbiAgICAgIG9yaWdpbmFsRWxlbWVudHM6IHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGVsZW1lbnQpIHtcbiAgICAgICAgYWNjLnNldChlbGVtZW50LmlkLCBkZWVwQ29weUVsZW1lbnQoZWxlbWVudCkpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgbmV3IE1hcCgpKSxcbiAgICAgIHJlc2l6ZToge1xuICAgICAgICBoYW5kbGVUeXBlOiBmYWxzZSxcbiAgICAgICAgaXNSZXNpemluZzogZmFsc2UsXG4gICAgICAgIG9mZnNldDoge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9LFxuICAgICAgICBhcnJvd0RpcmVjdGlvbjogXCJvcmlnaW5cIixcbiAgICAgICAgY2VudGVyOiB7XG4gICAgICAgICAgeDogKG1heFggKyBtaW5YKSAvIDIsXG4gICAgICAgICAgeTogKG1heFkgKyBtaW5ZKSAvIDJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhpdDoge1xuICAgICAgICBlbGVtZW50OiBudWxsLFxuICAgICAgICBhbGxIaXRFbGVtZW50czogW10sXG4gICAgICAgIHdhc0FkZGVkVG9TZWxlY3Rpb246IGZhbHNlLFxuICAgICAgICBoYXNCZWVuRHVwbGljYXRlZDogZmFsc2UsXG4gICAgICAgIGhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzOiB0aGlzLmlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKG9yaWdpbiwgc2VsZWN0ZWRFbGVtZW50cyksXG4gICAgICAgIGhhc0hpdEVsZW1lbnRJbnNpZGU6IGZhbHNlXG4gICAgICB9LFxuICAgICAgZHJhZzoge1xuICAgICAgICBoYXNPY2N1cnJlZDogZmFsc2UsXG4gICAgICAgIG9mZnNldDogbnVsbFxuICAgICAgfSxcbiAgICAgIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgICAgIG9uTW92ZTogbnVsbCxcbiAgICAgICAgb25VcDogbnVsbCxcbiAgICAgICAgb25LZXlVcDogbnVsbCxcbiAgICAgICAgb25LZXlEb3duOiBudWxsXG4gICAgICB9LFxuICAgICAgYm94U2VsZWN0aW9uOiB7XG4gICAgICAgIGhhc09jY3VycmVkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIGVsZW1lbnRJZHNUb0VyYXNlOiB7fVxuICAgIH07XG4gIH0gLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIGRyYWdnaW5nIGEgc2Nyb2xsYmFyXG5cblxuICBoYW5kbGVEcmFnZ2luZ1Njcm9sbEJhcihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgaWYgKCEocG9pbnRlckRvd25TdGF0ZS5zY3JvbGxiYXJzLmlzT3ZlckVpdGhlciAmJiAhdGhpcy5zdGF0ZS5tdWx0aUVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IHRydWU7XG4gICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBldmVudC5jbGllbnRYO1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gd2l0aEJhdGNoZWRVcGRhdGVzVGhyb3R0bGVkKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczcuaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhldmVudCwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfSk7XG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IGZhbHNlO1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXM3LmNhbnZhcywgX3RoaXM3LnN0YXRlKTtcbiAgICAgIGxhc3RQb2ludGVyVXAgPSBudWxsO1xuXG4gICAgICBfdGhpczcuc2V0U3RhdGUoe1xuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIlxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzNy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcInVwXCIpO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgb25Qb2ludGVyVXApO1xuICAgICAgb25Qb2ludGVyTW92ZS5mbHVzaCgpO1xuICAgIH0pO1xuICAgIGxhc3RQb2ludGVyVXAgPSBvblBvaW50ZXJVcDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlzQVNlbGVjdGVkRWxlbWVudChoaXRFbGVtZW50KSB7XG4gICAgcmV0dXJuIGhpdEVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1toaXRFbGVtZW50LmlkXTtcbiAgfVxuXG4gIGlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKHBvaW50LCBzZWxlY3RlZEVsZW1lbnRzKSB7XG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gSG93IG1hbnkgcGl4ZWxzIG9mZiB0aGUgc2hhcGUgYm91bmRhcnkgd2Ugc3RpbGwgY29uc2lkZXIgYSBoaXRcblxuXG4gICAgY29uc3QgdGhyZXNob2xkID0gMTAgLyB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICByZXR1cm4gcG9pbnQueCA+IHgxIC0gdGhyZXNob2xkICYmIHBvaW50LnggPCB4MiArIHRocmVzaG9sZCAmJiBwb2ludC55ID4geTEgLSB0aHJlc2hvbGQgJiYgcG9pbnQueSA8IHkyICsgdGhyZXNob2xkO1xuICB9XG5cbiAgb25LZXlEb3duRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKSB7XG4gICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKF90aGlzOC5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczgubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgb25LZXlVcEZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczkgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIC8vIFByZXZlbnRzIGZvY3VzIGZyb20gZXNjYXBpbmcgZXhjYWxpZHJhdyB0YWJcbiAgICAgIGV2ZW50LmtleSA9PT0gS0VZUy5BTFQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKF90aGlzOS5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczkubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgb25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczEwID0gdGhpcztcblxuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGluaXRpYWxpemUgZHJhZ09mZnNldFhZIG9ubHkgYWZ0ZXIgd2UndmUgdXBkYXRlZFxuICAgICAgLy8gYHN0YXRlLnNlbGVjdGVkRWxlbWVudElkc2Agb24gcG9pbnRlckRvd24uIERvaW5nIGl0IGhlcmUgaW4gcG9pbnRlck1vdmVcbiAgICAgIC8vIGV2ZW50IGhhbmRsZXIgc2hvdWxkIGhvcGVmdWxseSBlbnN1cmUgd2UncmUgYWxyZWFkeSB3b3JraW5nIHdpdGhcbiAgICAgIC8vIHRoZSB1cGRhdGVkIHN0YXRlLlxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQgPT09IG51bGwpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldCA9IHR1cGxlVG9Db29ycyhnZXREcmFnT2Zmc2V0WFkoZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEwLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLCBfdGhpczEwLnN0YXRlKSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEwLmhhbmRsZVBvaW50ZXJNb3ZlT3ZlclNjcm9sbGJhcnMoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMC5zdGF0ZSk7XG5cbiAgICAgIGlmIChpc0VyYXNlckFjdGl2ZShfdGhpczEwLnN0YXRlKSkge1xuICAgICAgICBfdGhpczEwLmhhbmRsZUVyYXNlcihldmVudCwgcG9pbnRlckRvd25TdGF0ZSwgcG9pbnRlckNvb3Jkcyk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgX3RoaXMxMC5zdGF0ZS5ncmlkU2l6ZSk7IC8vIGZvciBhcnJvd3MvbGluZXMsIGRvbid0IHN0YXJ0IGRyYWdnaW5nIHVudGlsIGEgZ2l2ZW4gdGhyZXNob2xkXG4gICAgICAvLyB0byBlbnN1cmUgd2UgZG9uJ3QgY3JlYXRlIGEgMi1wb2ludCBhcnJvdyBieSBtaXN0YWtlIHdoZW5cbiAgICAgIC8vIHVzZXIgY2xpY2tzIG1vdXNlIGluIGEgd2F5IHRoYXQgaXQgbW92ZXMgYSB0aW55IGJpdCAodGh1c1xuICAgICAgLy8gdHJpZ2dlcmluZyBwb2ludGVybW92ZSlcblxuICAgICAgaWYgKCFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiYgKF90aGlzMTAuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImFycm93XCIgfHwgX3RoaXMxMC5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwibGluZVwiKSkge1xuICAgICAgICBpZiAoZGlzdGFuY2UyZChwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSkgPCBEUkFHR0lOR19USFJFU0hPTEQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmlzUmVzaXppbmcpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuXG4gICAgICAgIGlmIChfdGhpczEwLm1heWJlSGFuZGxlUmVzaXplKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEwLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGRpZERyYWcgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50RHJhZ2dpbmcoX3RoaXMxMC5zdGF0ZSwgZnVuY3Rpb24gKGFwcFN0YXRlKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMTAuc2V0U3RhdGUoYXBwU3RhdGUpO1xuICAgICAgICB9LCBwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgZnVuY3Rpb24gKGVsZW1lbnQsIHBvaW50c1NjZW5lQ29vcmRzKSB7XG4gICAgICAgICAgX3RoaXMxMC5tYXliZVN1Z2dlc3RCaW5kaW5nc0ZvckxpbmVhckVsZW1lbnRBdENvb3JkcyhlbGVtZW50LCBwb2ludHNTY2VuZUNvb3Jkcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkaWREcmFnKSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc0hpdEFTZWxlY3RlZEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpczEwLmlzQVNlbGVjdGVkRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoKGhhc0hpdEFTZWxlY3RlZEVsZW1lbnQgfHwgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMpICYmICggLy8gdGhpcyBhbGxvd3MgZm9yIGJveC1zZWxlY3RpbmcgcG9pbnRzIHdoZW4gY2xpY2tpbmcgaW5zaWRlIHRoZVxuICAgICAgLy8gbGluZSdzIGJvdW5kaW5nIGJveFxuICAgICAgIV90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHwgIWV2ZW50LnNoaWZ0S2V5KSAmJiAoIC8vIGJveC1zZWxlY3Rpbmcgd2l0aG91dCBzaGlmdCB3aGVuIGVkaXRpbmcgbGluZSwgbm90IGNsaWNraW5nIG9uIGEgbGluZVxuICAgICAgIV90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHwgX3RoaXMxMC5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudD8uZWxlbWVudElkICE9PSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50Py5pZCB8fCBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRFbGVtZW50SW5zaWRlKSkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEwLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLCBfdGhpczEwLnN0YXRlKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5ldmVyeShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50LmxvY2tlZDtcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gTWFya2luZyB0aGF0IGNsaWNrIHdhcyB1c2VkIGZvciBkcmFnZ2luZyB0byBjaGVja1xuICAgICAgICAvLyBpZiBlbGVtZW50cyBzaG91bGQgYmUgZGVzZWxlY3RlZCBvbiBwb2ludGVydXBcblxuXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCA9IHRydWU7IC8vIHByZXZlbnQgZHJhZ2dpbmcgZXZlbiBpZiB3ZSdyZSBubyBsb25nZXIgaG9sZGluZyBjbWQvY3RybCBvdGhlcndpc2VcbiAgICAgICAgLy8gaXQgd291bGQgaGF2ZSB3ZWlyZCByZXN1bHRzIChzdHVmZiBqdW1waW5nIGFsbCBvdmVyIHRoZSBzY3JlZW4pXG5cbiAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMCAmJiAhcG9pbnRlckRvd25TdGF0ZS53aXRoQ21kT3JDdHJsKSB7XG4gICAgICAgICAgY29uc3QgW2RyYWdYLCBkcmFnWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckNvb3Jkcy54IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC54LCBwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LnksIF90aGlzMTAuc3RhdGUuZ3JpZFNpemUpO1xuICAgICAgICAgIGNvbnN0IFtkcmFnRGlzdGFuY2VYLCBkcmFnRGlzdGFuY2VZXSA9IFtNYXRoLmFicyhwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54KSwgTWF0aC5hYnMocG9pbnRlckNvb3Jkcy55IC0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSldOyAvLyBXZSBvbmx5IGRyYWcgaW4gb25lIGRpcmVjdGlvbiBpZiBzaGlmdCBpcyBwcmVzc2VkXG5cbiAgICAgICAgICBjb25zdCBsb2NrRGlyZWN0aW9uID0gZXZlbnQuc2hpZnRLZXk7XG4gICAgICAgICAgZHJhZ1NlbGVjdGVkRWxlbWVudHMocG9pbnRlckRvd25TdGF0ZSwgc2VsZWN0ZWRFbGVtZW50cywgZHJhZ1gsIGRyYWdZLCBsb2NrRGlyZWN0aW9uLCBkcmFnRGlzdGFuY2VYLCBkcmFnRGlzdGFuY2VZLCBfdGhpczEwLnN0YXRlKTtcblxuICAgICAgICAgIF90aGlzMTAubWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChzZWxlY3RlZEVsZW1lbnRzKTsgLy8gV2UgZHVwbGljYXRlIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlmIGFsdCBpcyBwcmVzc2VkIG9uIHBvaW50ZXIgbW92ZVxuXG5cbiAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5ICYmICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNCZWVuRHVwbGljYXRlZCkge1xuICAgICAgICAgICAgLy8gTW92ZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIHRvIHRoZSB0b3Agb2YgdGhlIHogaW5kZXggc3RhY2ssIGFuZFxuICAgICAgICAgICAgLy8gcHV0IHRoZSBkdXBsaWNhdGVzIHdoZXJlIHRoZSBzZWxlY3RlZCBlbGVtZW50cyB1c2VkIHRvIGJlLlxuICAgICAgICAgICAgLy8gKHRoZSBvcmlnaW4gcG9pbnQgd2hlcmUgdGhlIGRyYWdnaW5nIHN0YXJ0ZWQpXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNCZWVuRHVwbGljYXRlZCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBuZXh0RWxlbWVudHMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzVG9BcHBlbmQgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwSWRNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBvbGRJZFRvRHVwbGljYXRlZElkID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gX3RoaXMxMC5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50SWRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgX3RoaXMxMC5zdGF0ZSwgdHJ1ZSkubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmlkO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50SWRzLmluY2x1ZGVzKGVsZW1lbnQuaWQpIHx8IC8vIGNhc2U6IHRoZSBzdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMgbWlnaHQgbm90IGhhdmUgYmVlblxuICAgICAgICAgICAgICAvLyB1cGRhdGVkIHlldCBieSB0aGUgdGltZSB0aGlzIG1vdXNlbW92ZSBldmVudCBpcyBmaXJlZFxuICAgICAgICAgICAgICBlbGVtZW50LmlkID09PSBoaXRFbGVtZW50Py5pZCAmJiBwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHVwbGljYXRlZEVsZW1lbnQgPSBkdXBsaWNhdGVFbGVtZW50KF90aGlzMTAuc3RhdGUuZWRpdGluZ0dyb3VwSWQsIGdyb3VwSWRNYXAsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IFtvcmlnaW5EcmFnWCwgb3JpZ2luRHJhZ1ldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkgLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LnksIF90aGlzMTAuc3RhdGUuZ3JpZFNpemUpO1xuICAgICAgICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHVwbGljYXRlZEVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgIHg6IGR1cGxpY2F0ZWRFbGVtZW50LnggKyAob3JpZ2luRHJhZ1ggLSBkcmFnWCksXG4gICAgICAgICAgICAgICAgICB5OiBkdXBsaWNhdGVkRWxlbWVudC55ICsgKG9yaWdpbkRyYWdZIC0gZHJhZ1kpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbmV4dEVsZW1lbnRzLnB1c2goZHVwbGljYXRlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzVG9BcHBlbmQucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBvbGRJZFRvRHVwbGljYXRlZElkLnNldChlbGVtZW50LmlkLCBkdXBsaWNhdGVkRWxlbWVudC5pZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV4dEVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmV4dFNjZW5lRWxlbWVudHMgPSBbLi4ubmV4dEVsZW1lbnRzLCAuLi5lbGVtZW50c1RvQXBwZW5kXTtcbiAgICAgICAgICAgIGJpbmRUZXh0VG9TaGFwZUFmdGVyRHVwbGljYXRpb24obmV4dEVsZW1lbnRzLCBlbGVtZW50c1RvQXBwZW5kLCBvbGRJZFRvRHVwbGljYXRlZElkKTtcbiAgICAgICAgICAgIGZpeEJpbmRpbmdzQWZ0ZXJEdXBsaWNhdGlvbihuZXh0U2NlbmVFbGVtZW50cywgZWxlbWVudHNUb0FwcGVuZCwgb2xkSWRUb0R1cGxpY2F0ZWRJZCwgXCJkdXBsaWNhdGVzU2VydmVBc09sZFwiKTtcblxuICAgICAgICAgICAgX3RoaXMxMC5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMobmV4dFNjZW5lRWxlbWVudHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSAvLyBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byByZWFkIHRoaXMuc3RhdGUgd2l0aGluIGVhY2ggbW92ZSBldmVudCxcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSB3b3VsZCByZWFkIGEgc3RhbGUgb25lIVxuXG5cbiAgICAgIGNvbnN0IGRyYWdnaW5nRWxlbWVudCA9IF90aGlzMTAuc3RhdGUuZHJhZ2dpbmdFbGVtZW50O1xuXG4gICAgICBpZiAoIWRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQudHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGNvbnN0IGR4ID0gcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGNvbnN0IGR5ID0gcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG4gICAgICAgIGNvbnN0IGxhc3RQb2ludCA9IHBvaW50cy5sZW5ndGggPiAwICYmIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IGRpc2NhcmRQb2ludCA9IGxhc3RQb2ludCAmJiBsYXN0UG9pbnRbMF0gPT09IGR4ICYmIGxhc3RQb2ludFsxXSA9PT0gZHk7XG5cbiAgICAgICAgaWYgKCFkaXNjYXJkUG9pbnQpIHtcbiAgICAgICAgICBjb25zdCBwcmVzc3VyZXMgPSBkcmFnZ2luZ0VsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZSA/IGRyYWdnaW5nRWxlbWVudC5wcmVzc3VyZXMgOiBbLi4uZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtkeCwgZHldXSxcbiAgICAgICAgICAgIHByZXNzdXJlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGxldCBkeCA9IGdyaWRYIC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGxldCBkeSA9IGdyaWRZIC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgaWYgKHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSAmJiBwb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgKHtcbiAgICAgICAgICAgIHdpZHRoOiBkeCxcbiAgICAgICAgICAgIGhlaWdodDogZHlcbiAgICAgICAgICB9ID0gZ2V0TG9ja2VkTGluZWFyQ3Vyc29yQWxpZ25TaXplKGRyYWdnaW5nRWxlbWVudC54LCBkcmFnZ2luZ0VsZW1lbnQueSwgcG9pbnRlckNvb3Jkcy54LCBwb2ludGVyQ29vcmRzLnkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLnNsaWNlKDAsIC0xKSwgW2R4LCBkeV1dXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNCaW5kaW5nRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIGZhbHNlKSkge1xuICAgICAgICAgIC8vIFdoZW4gY3JlYXRpbmcgYSBsaW5lYXIgZWxlbWVudCBieSBkcmFnZ2luZ1xuICAgICAgICAgIF90aGlzMTAubWF5YmVTdWdnZXN0QmluZGluZ3NGb3JMaW5lYXJFbGVtZW50QXRDb29yZHMoZHJhZ2dpbmdFbGVtZW50LCBbcG9pbnRlckNvb3Jkc10sIF90aGlzMTAuc3RhdGUuc3RhcnRCb3VuZEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG5cbiAgICAgICAgX3RoaXMxMC5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEwLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmJveFNlbGVjdGlvbi5oYXNPY2N1cnJlZCA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEwLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpO1xuXG4gICAgICAgIGlmICghZXZlbnQuc2hpZnRLZXkgJiYgLy8gYWxsb3dzIGZvciBib3gtc2VsZWN0aW5nIHBvaW50cyAod2l0aG91dCBzaGlmdClcbiAgICAgICAgIV90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiYgaXNTb21lRWxlbWVudFNlbGVjdGVkKGVsZW1lbnRzLCBfdGhpczEwLnN0YXRlKSkge1xuICAgICAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLndpdGhDbWRPckN0cmwgJiYgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCkge1xuICAgICAgICAgICAgX3RoaXMxMC5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlKSwge30sIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSksIF90aGlzMTAuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzMTAuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBib3gtc2VsZWN0IGxpbmUgZWRpdG9yIHBvaW50c1xuXG5cbiAgICAgICAgaWYgKF90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZUJveFNlbGVjdGlvbihldmVudCwgX3RoaXMxMC5zdGF0ZSwgX3RoaXMxMC5zZXRTdGF0ZS5iaW5kKF90aGlzMTApKTsgLy8gcmVndWxhciBib3gtc2VsZWN0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24gPSBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbihlbGVtZW50cywgZHJhZ2dpbmdFbGVtZW50KTtcblxuICAgICAgICAgIF90aGlzMTAuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwgZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBhY2NbZWxlbWVudC5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICAgIH0sIHt9KSksIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPyB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdXNpbmcgY3RybC9jbWQsIHNlbGVjdCB0aGUgaGl0RWxlbWVudCBvbmx5IGlmIHdlXG4gICAgICAgICAgICAgICAgLy8gaGF2ZW4ndCBib3gtc2VsZWN0ZWQgYW55dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50LmlkXTogIWVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLmxlbmd0aFxuICAgICAgICAgICAgICB9IDogbnVsbCksXG4gICAgICAgICAgICAgIHNob3dIeXBlcmxpbmtQb3B1cDogZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ubGVuZ3RoID09PSAxICYmIGVsZW1lbnRzV2l0aGluU2VsZWN0aW9uWzBdLmxpbmsgPyBcImluZm9cIiA6IGZhbHNlXG4gICAgICAgICAgICB9KSwgX3RoaXMxMC5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHBvaW50ZXIgbW92ZSBoYXBwZW5lZCBvdmVyIGVpdGhlciBzY3JvbGxiYXJcblxuXG4gIGhhbmRsZVBvaW50ZXJNb3ZlT3ZlclNjcm9sbGJhcnMoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5zY3JvbGxiYXJzLmlzT3Zlckhvcml6b250YWwpIHtcbiAgICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYO1xuICAgICAgY29uc3QgZHggPSB4IC0gcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLng7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsWDogdGhpcy5zdGF0ZS5zY3JvbGxYIC0gZHggLyB0aGlzLnN0YXRlLnpvb20udmFsdWVcbiAgICAgIH0pO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSB4O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuc2Nyb2xsYmFycy5pc092ZXJWZXJ0aWNhbCkge1xuICAgICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICBjb25zdCBkeSA9IHkgLSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFkgLSBkeSAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZVxuICAgICAgfSk7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IHk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvblBvaW50ZXJVcEZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczExID0gdGhpcztcblxuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGNoaWxkRXZlbnQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICByZXNpemluZ0VsZW1lbnQsXG4gICAgICAgIG11bHRpRWxlbWVudCxcbiAgICAgICAgYWN0aXZlVG9vbCxcbiAgICAgICAgaXNSZXNpemluZyxcbiAgICAgICAgaXNSb3RhdGluZ1xuICAgICAgfSA9IF90aGlzMTEuc3RhdGU7XG5cbiAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgaXNSb3RhdGluZzogZmFsc2UsXG4gICAgICAgIHJlc2l6aW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgc2VsZWN0aW9uRWxlbWVudDogbnVsbCxcbiAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCIsXG4gICAgICAgIC8vIHRleHQgZWxlbWVudHMgYXJlIHJlc2V0IG9uIGZpbmFsaXplLCBhbmQgcmVzZXR0aW5nIG9uIHBvaW50ZXJ1cFxuICAgICAgICAvLyBtYXkgY2F1c2UgaXNzdWVzIHdpdGggZG91YmxlIHRhcHNcbiAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IG11bHRpRWxlbWVudCB8fCBpc1RleHRFbGVtZW50KF90aGlzMTEuc3RhdGUuZWRpdGluZ0VsZW1lbnQpID8gX3RoaXMxMS5zdGF0ZS5lZGl0aW5nRWxlbWVudCA6IG51bGxcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczExLnNhdmVQb2ludGVyKGNoaWxkRXZlbnQuY2xpZW50WCwgY2hpbGRFdmVudC5jbGllbnRZLCBcInVwXCIpOyAvLyBIYW5kbGUgZW5kIG9mIGRyYWdnaW5nIGEgcG9pbnQgb2YgYSBsaW5lYXIgZWxlbWVudCwgbWlnaHQgY2xvc2UgYSBsb29wXG4gICAgICAvLyBhbmQgc2V0cyBiaW5kaW5nIGVsZW1lbnRcblxuXG4gICAgICBpZiAoX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBpZiAoIXBvaW50ZXJEb3duU3RhdGUuYm94U2VsZWN0aW9uLmhhc09jY3VycmVkICYmIChwb2ludGVyRG93blN0YXRlLmhpdD8uZWxlbWVudD8uaWQgIT09IF90aGlzMTEuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkIHx8ICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRFbGVtZW50SW5zaWRlKSkge1xuICAgICAgICAgIF90aGlzMTEuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlclVwKGNoaWxkRXZlbnQsIF90aGlzMTEuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQsIF90aGlzMTEuc3RhdGUpO1xuXG4gICAgICAgICAgaWYgKGVkaXRpbmdMaW5lYXJFbGVtZW50ICE9PSBfdGhpczExLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQsXG4gICAgICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQb2ludGVyVXAgPSBudWxsO1xuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbk1vdmUpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbk1vdmUuZmx1c2goKTtcbiAgICAgIH1cblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uVXApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZRE9XTiwgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleURvd24pO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlVcCk7XG5cbiAgICAgIGlmIChfdGhpczExLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnRJZCkge1xuICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICBwZW5kaW5nSW1hZ2VFbGVtZW50SWQ6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQ/LnR5cGUgPT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGNoaWxkRXZlbnQsIF90aGlzMTEuc3RhdGUpO1xuICAgICAgICBjb25zdCBwb2ludHMgPSBkcmFnZ2luZ0VsZW1lbnQucG9pbnRzO1xuICAgICAgICBsZXQgZHggPSBwb2ludGVyQ29vcmRzLnggLSBkcmFnZ2luZ0VsZW1lbnQueDtcbiAgICAgICAgbGV0IGR5ID0gcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50Lnk7IC8vIEFsbG93cyBkb3RzIHRvIGF2b2lkIGJlaW5nIGZsYWdnZWQgYXMgaW5maW5pdGVseSBzbWFsbFxuXG4gICAgICAgIGlmIChkeCA9PT0gcG9pbnRzWzBdWzBdICYmIGR5ID09PSBwb2ludHNbMF1bMV0pIHtcbiAgICAgICAgICBkeSArPSAwLjAwMDE7XG4gICAgICAgICAgZHggKz0gMC4wMDAxO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlc3N1cmVzID0gZHJhZ2dpbmdFbGVtZW50LnNpbXVsYXRlUHJlc3N1cmUgPyBbXSA6IFsuLi5kcmFnZ2luZ0VsZW1lbnQucHJlc3N1cmVzLCBjaGlsZEV2ZW50LnByZXNzdXJlXTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtkeCwgZHldXSxcbiAgICAgICAgICBwcmVzc3VyZXMsXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBbZHgsIGR5XVxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczExLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNJbWFnZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBkcmFnZ2luZ0VsZW1lbnQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBfdGhpczExLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcblxuICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMxMS5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgX3RoaXMxMS5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoX3RoaXMxMS5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gZWwuaWQgIT09IGltYWdlRWxlbWVudC5pZDtcbiAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICBfdGhpczExLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0xpbmVhckVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50LnBvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgX3RoaXMxMS5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhjaGlsZEV2ZW50LCBfdGhpczExLnN0YXRlKTtcblxuICAgICAgICBpZiAoIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJiBkcmFnZ2luZ0VsZW1lbnQgJiYgIW11bHRpRWxlbWVudCkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFsuLi5kcmFnZ2luZ0VsZW1lbnQucG9pbnRzLCBbcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50LngsIHBvaW50ZXJDb29yZHMueSAtIGRyYWdnaW5nRWxlbWVudC55XV1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgICAgbXVsdGlFbGVtZW50OiBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgICBlZGl0aW5nRWxlbWVudDogX3RoaXMxMS5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiYgIW11bHRpRWxlbWVudCkge1xuICAgICAgICAgIGlmIChpc0JpbmRpbmdFbmFibGVkKF90aGlzMTEuc3RhdGUpICYmIGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCBmYWxzZSkpIHtcbiAgICAgICAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCBfdGhpczExLnN0YXRlLCBfdGhpczExLnNjZW5lLCBwb2ludGVyQ29vcmRzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICAgICAgICAgIHN0YXJ0Qm91bmRFbGVtZW50OiBudWxsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIWFjdGl2ZVRvb2wubG9ja2VkKSB7XG4gICAgICAgICAgICByZXNldEN1cnNvcihfdGhpczExLmNhbnZhcyk7XG5cbiAgICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICAgICAgICBhY3RpdmVUb29sOiB1cGRhdGVBY3RpdmVUb29sKF90aGlzMTEuc3RhdGUsIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBbZHJhZ2dpbmdFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgICAgIFtkcmFnZ2luZ0VsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZVRvb2wudHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJiBkcmFnZ2luZ0VsZW1lbnQgJiYgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICAvLyByZW1vdmUgaW52aXNpYmxlIGVsZW1lbnQgd2hpY2ggd2FzIGFkZGVkIGluIG9uUG9pbnRlckRvd25cbiAgICAgICAgX3RoaXMxMS5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoX3RoaXMxMS5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5zbGljZSgwLCAtMSkpO1xuXG4gICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIGdldE5vcm1hbGl6ZWREaW1lbnNpb25zKGRyYWdnaW5nRWxlbWVudCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzaXppbmdFbGVtZW50KSB7XG4gICAgICAgIF90aGlzMTEuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc2l6aW5nRWxlbWVudCAmJiBpc0ludmlzaWJseVNtYWxsRWxlbWVudChyZXNpemluZ0VsZW1lbnQpKSB7XG4gICAgICAgIF90aGlzMTEuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKF90aGlzMTEuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIHJldHVybiBlbC5pZCAhPT0gcmVzaXppbmdFbGVtZW50LmlkO1xuICAgICAgICB9KSk7XG4gICAgICB9IC8vIENvZGUgYmVsb3cgaGFuZGxlcyBzZWxlY3Rpb24gd2hlbiBlbGVtZW50KHMpIHdlcmVuJ3RcbiAgICAgIC8vIGRyYWcgb3IgYWRkZWQgdG8gc2VsZWN0aW9uIG9uIHBvaW50ZXIgZG93biBwaGFzZS5cblxuXG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcblxuICAgICAgaWYgKGlzRXJhc2VyQWN0aXZlKF90aGlzMTEuc3RhdGUpKSB7XG4gICAgICAgIGNvbnN0IGRyYWdnZWREaXN0YW5jZSA9IGRpc3RhbmNlMmQoX3RoaXMxMS5sYXN0UG9pbnRlckRvd24uY2xpZW50WCwgX3RoaXMxMS5sYXN0UG9pbnRlckRvd24uY2xpZW50WSwgX3RoaXMxMS5sYXN0UG9pbnRlclVwLmNsaWVudFgsIF90aGlzMTEubGFzdFBvaW50ZXJVcC5jbGllbnRZKTtcblxuICAgICAgICBpZiAoZHJhZ2dlZERpc3RhbmNlID09PSAwKSB7XG4gICAgICAgICAgY29uc3Qgc2NlbmVQb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKHtcbiAgICAgICAgICAgIGNsaWVudFg6IF90aGlzMTEubGFzdFBvaW50ZXJVcC5jbGllbnRYLFxuICAgICAgICAgICAgY2xpZW50WTogX3RoaXMxMS5sYXN0UG9pbnRlclVwLmNsaWVudFlcbiAgICAgICAgICB9LCBfdGhpczExLnN0YXRlKTtcblxuICAgICAgICAgIGNvbnN0IGhpdEVsZW1lbnRzID0gX3RoaXMxMS5nZXRFbGVtZW50c0F0UG9zaXRpb24oc2NlbmVQb2ludGVyLngsIHNjZW5lUG9pbnRlci55KTtcblxuICAgICAgICAgIGhpdEVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGhpdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2hpdEVsZW1lbnQuaWRdID0ge1xuICAgICAgICAgICAgICBlcmFzZTogdHJ1ZSxcbiAgICAgICAgICAgICAgb3BhY2l0eTogaGl0RWxlbWVudC5vcGFjaXR5XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMxMS5lcmFzZUVsZW1lbnRzKHBvaW50ZXJEb3duU3RhdGUpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoT2JqZWN0LmtleXMocG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZSkubGVuZ3RoKSB7XG4gICAgICAgIF90aGlzMTEucmVzdG9yZVJlYWR5VG9FcmFzZUVsZW1lbnRzKHBvaW50ZXJEb3duU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGl0RWxlbWVudCAmJiAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmICFwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uICYmICggLy8gaWYgd2UncmUgZWRpdGluZyBhIGxpbmUsIHBvaW50ZXJ1cCBzaG91bGRuJ3Qgc3dpdGNoIHNlbGVjdGlvbiBpZlxuICAgICAgLy8gYm94IHNlbGVjdGVkXG4gICAgICAhX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fCAhcG9pbnRlckRvd25TdGF0ZS5ib3hTZWxlY3Rpb24uaGFzT2NjdXJyZWQpKSB7XG4gICAgICAgIC8vIHdoZW4gaW5zaWRlIGxpbmUgZWRpdG9yLCBzaGlmdCBzZWxlY3RzIHBvaW50cyBpbnN0ZWFkXG4gICAgICAgIGlmIChjaGlsZEV2ZW50LnNoaWZ0S2V5ICYmICFfdGhpczExLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKF90aGlzMTEuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICBpZiAoaXNTZWxlY3RlZFZpYUdyb3VwKF90aGlzMTEuc3RhdGUsIGhpdEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gdW5zZWxlY3QgYWxsIGdyb3VwcyBoaXRFbGVtZW50IGlzIHBhcnQgb2ZcbiAgICAgICAgICAgICAgLy8gYXMgd2VsbCBhcyBhbGwgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiB0aGUgZ3JvdXBzXG4gICAgICAgICAgICAgIC8vIGhpdEVsZW1lbnQgaXMgcGFydCBvZlxuICAgICAgICAgICAgICBjb25zdCBpZHNPZlNlbGVjdGVkRWxlbWVudHNUaGF0QXJlSW5Hcm91cHMgPSBoaXRFbGVtZW50Lmdyb3VwSWRzLmZsYXRNYXAoZnVuY3Rpb24gKGdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RWxlbWVudHNJbkdyb3VwKF90aGlzMTEuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIGdyb3VwSWQpO1xuICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgW2VsZW1lbnQuaWRdOiBmYWxzZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAocHJldklkLCBhY2MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2SWQpLCBhY2MpO1xuICAgICAgICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAoX3ByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF9wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwgaGl0RWxlbWVudC5ncm91cElkcy5tYXAoZnVuY3Rpb24gKGdJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIFtnSWRdOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBhY2MpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldiksIGFjYyk7XG4gICAgICAgICAgICAgICAgICB9LCB7fSkpLFxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF9wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwgaWRzT2ZTZWxlY3RlZEVsZW1lbnRzVGhhdEFyZUluR3JvdXBzKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gcmVtb3ZlIGVsZW1lbnQgZnJvbSBzZWxlY3Rpb24gd2hpbGVcbiAgICAgICAgICAgICAgLy8ga2VlcGluZyBwcmV2IGVsZW1lbnRzIHNlbGVjdGVkXG4gICAgICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlKSwge30sIHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KSwgX3RoaXMxMS5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBhZGQgZWxlbWVudCB0byBzZWxlY3Rpb24gd2hpbGVcbiAgICAgICAgICAgIC8vIGtlZXBpbmcgcHJldiBlbGVtZW50cyBzZWxlY3RlZFxuICAgICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAoX3ByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBbaGl0RWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICBbaGl0RWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksIF90aGlzMTEuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCkpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIV90aGlzMTEuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiYgIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJiAhX3RoaXMxMS5zdGF0ZS5pc1Jlc2l6aW5nICYmIChoaXRFbGVtZW50ICYmIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudChoaXRFbGVtZW50LCBfdGhpczExLnN0YXRlLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55KSB8fCAhaGl0RWxlbWVudCAmJiBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cykpIHtcbiAgICAgICAgLy8gRGVzZWxlY3Qgc2VsZWN0ZWQgZWxlbWVudHNcbiAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghYWN0aXZlVG9vbC5sb2NrZWQgJiYgYWN0aXZlVG9vbC50eXBlICE9PSBcImZyZWVkcmF3XCIgJiYgZHJhZ2dpbmdFbGVtZW50KSB7XG4gICAgICAgIF90aGlzMTEuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgIFtkcmFnZ2luZ0VsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aXZlVG9vbC50eXBlICE9PSBcInNlbGVjdGlvblwiIHx8IGlzU29tZUVsZW1lbnRTZWxlY3RlZChfdGhpczExLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLCBfdGhpczExLnN0YXRlKSkge1xuICAgICAgICBfdGhpczExLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgfHwgaXNSZXNpemluZyB8fCBpc1JvdGF0aW5nKSB7XG4gICAgICAgIChpc0JpbmRpbmdFbmFibGVkKF90aGlzMTEuc3RhdGUpID8gYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cyA6IHVuYmluZExpbmVhckVsZW1lbnRzKShnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTEuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIF90aGlzMTEuc3RhdGUpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhY3RpdmVUb29sLmxvY2tlZCAmJiBhY3RpdmVUb29sLnR5cGUgIT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgICByZXNldEN1cnNvcihfdGhpczExLmNhbnZhcyk7XG5cbiAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICAgICAgICBhY3RpdmVUb29sOiB1cGRhdGVBY3RpdmVUb29sKF90aGlzMTEuc3RhdGUsIHtcbiAgICAgICAgICAgIHR5cGU6IFwic2VsZWN0aW9uXCJcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBtYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpIHtcbiAgICBjb25zdCBzdWdnZXN0ZWRCaW5kaW5ncyA9IGdldEVsaWdpYmxlRWxlbWVudHNGb3JCaW5kaW5nKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc3VnZ2VzdGVkQmluZGluZ3NcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0aW9uKGhpdEVsZW1lbnQpIHtcbiAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAvLyBDb250aW51ZSBlZGl0aW5nIHRoZSBzYW1lIGdyb3VwIGlmIHRoZSB1c2VyIHNlbGVjdGVkIGEgZGlmZmVyZW50XG4gICAgICAgIC8vIGVsZW1lbnQgZnJvbSBpdFxuICAgICAgICBlZGl0aW5nR3JvdXBJZDogcHJldlN0YXRlLmVkaXRpbmdHcm91cElkICYmIGhpdEVsZW1lbnQgIT0gbnVsbCAmJiBpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZCkgPyBwcmV2U3RhdGUuZWRpdGluZ0dyb3VwSWQgOiBudWxsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0VGV4dFd5c2l3eWdTbmFwcGVkVG9DZW50ZXJQb3NpdGlvbih4LCB5LCBhcHBTdGF0ZSwgY2FudmFzLCBzY2FsZSkge1xuICAgIGNvbnN0IGVsZW1lbnRDbGlja2VkSW5zaWRlID0gZ2V0VGV4dEJpbmRhYmxlQ29udGFpbmVyQXRQb3NpdGlvbih0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZpbHRlcihmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuICFpc1RleHRFbGVtZW50KGVsZW1lbnQpO1xuICAgIH0pLCB4LCB5KTtcblxuICAgIGlmIChlbGVtZW50Q2xpY2tlZEluc2lkZSkge1xuICAgICAgY29uc3QgZWxlbWVudENlbnRlclggPSBlbGVtZW50Q2xpY2tlZEluc2lkZS54ICsgZWxlbWVudENsaWNrZWRJbnNpZGUud2lkdGggLyAyO1xuICAgICAgY29uc3QgZWxlbWVudENlbnRlclkgPSBlbGVtZW50Q2xpY2tlZEluc2lkZS55ICsgZWxlbWVudENsaWNrZWRJbnNpZGUuaGVpZ2h0IC8gMjtcbiAgICAgIGNvbnN0IGRpc3RhbmNlVG9DZW50ZXIgPSBNYXRoLmh5cG90KHggLSBlbGVtZW50Q2VudGVyWCwgeSAtIGVsZW1lbnRDZW50ZXJZKTtcbiAgICAgIGNvbnN0IGlzU25hcHBlZFRvQ2VudGVyID0gZGlzdGFuY2VUb0NlbnRlciA8IFRFWFRfVE9fQ0VOVEVSX1NOQVBfVEhSRVNIT0xEO1xuXG4gICAgICBpZiAoaXNTbmFwcGVkVG9DZW50ZXIpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHg6IHZpZXdwb3J0WCxcbiAgICAgICAgICB5OiB2aWV3cG9ydFlcbiAgICAgICAgfSA9IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3Jkcyh7XG4gICAgICAgICAgc2NlbmVYOiBlbGVtZW50Q2VudGVyWCxcbiAgICAgICAgICBzY2VuZVk6IGVsZW1lbnRDZW50ZXJZXG4gICAgICAgIH0sIGFwcFN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2aWV3cG9ydFgsXG4gICAgICAgICAgdmlld3BvcnRZLFxuICAgICAgICAgIGVsZW1lbnRDZW50ZXJYLFxuICAgICAgICAgIGVsZW1lbnRDZW50ZXJZXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2FudmFzT2Zmc2V0cygpIHtcbiAgICBpZiAodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmPy5jdXJyZW50KSB7XG4gICAgICBjb25zdCBleGNhbGlkcmF3Q29udGFpbmVyID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGxlZnQsXG4gICAgICAgIHRvcFxuICAgICAgfSA9IGV4Y2FsaWRyYXdDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvZmZzZXRMZWZ0OiBsZWZ0LFxuICAgICAgICBvZmZzZXRUb3A6IHRvcFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgb2Zmc2V0TGVmdDogMCxcbiAgICAgIG9mZnNldFRvcDogMFxuICAgIH07XG4gIH1cblxuICB1cGRhdGVMYW5ndWFnZSgpIHtcbiAgICB2YXIgX3RoaXMxMiA9IHRoaXM7XG5cbiAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gbGFuZ3VhZ2VzLmZpbmQoZnVuY3Rpb24gKGxhbmcpIHtcbiAgICAgICAgcmV0dXJuIGxhbmcuY29kZSA9PT0gX3RoaXMxMi5wcm9wcy5sYW5nQ29kZTtcbiAgICAgIH0pIHx8IGRlZmF1bHRMYW5nO1xuICAgICAgeWllbGQgc2V0TGFuZ3VhZ2UoY3VycmVudExhbmcpO1xuXG4gICAgICBfdGhpczEyLnNldEFwcFN0YXRlKHt9KTtcbiAgICB9KSgpO1xuICB9XG5cbn0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRFU1QgSE9PS1Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuQXBwLmRlZmF1bHRQcm9wcyA9IHtcbiAgLy8gbmVlZGVkIGZvciB0ZXN0cyB0byBwYXNzIHNpbmNlIHdlIGRpcmVjdGx5IHJlbmRlciBBcHAgaW4gbWFueSB0ZXN0c1xuICBVSU9wdGlvbnM6IERFRkFVTFRfVUlfT1BUSU9OU1xufTtcblxudmFyIF9pbml0aWFsaXNlUHJvcHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfdGhpczEzID0gdGhpcztcblxuICB0aGlzLmNhbnZhcyA9IG51bGw7XG4gIHRoaXMucmMgPSBudWxsO1xuICB0aGlzLnVubW91bnRlZCA9IGZhbHNlO1xuICB0aGlzLmRldmljZSA9IGRldmljZUNvbnRleHRJbml0aWFsVmFsdWU7XG4gIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKTtcbiAgdGhpcy5maWxlcyA9IHt9O1xuICB0aGlzLmltYWdlQ2FjaGUgPSBuZXcgTWFwKCk7XG4gIHRoaXMubGFzdFBvaW50ZXJEb3duID0gbnVsbDtcbiAgdGhpcy5sYXN0UG9pbnRlclVwID0gbnVsbDtcbiAgdGhpcy5jb250ZXh0TWVudU9wZW4gPSBmYWxzZTtcbiAgdGhpcy5sYXN0U2NlbmVQb2ludGVyID0gbnVsbDtcbiAgdGhpcy5hbGxvd01vYmlsZU1vZGUgPSB0cnVlO1xuXG4gIHRoaXMuZm9jdXNDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKF90aGlzMTMucHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uZm9jdXMoKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5nZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKTtcbiAgfTtcblxuICB0aGlzLmdldFNjZW5lRWxlbWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCk7XG4gIH07XG5cbiAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChhY3Rpb25SZXN1bHQpIHtcbiAgICAvLyBTaW5jZSBjb250ZXh0IG1lbnUgY2xvc2VzIHdoZW4gYWN0aW9uIHRyaWdnZXJlZCBzbyBzZXR0aW5nIHRvIGZhbHNlXG4gICAgX3RoaXMxMy5jb250ZXh0TWVudU9wZW4gPSBmYWxzZTtcblxuICAgIGlmIChfdGhpczEzLnVubW91bnRlZCB8fCBhY3Rpb25SZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGVkaXRpbmdFbGVtZW50ID0gbnVsbDtcblxuICAgIGlmIChhY3Rpb25SZXN1bHQuZWxlbWVudHMpIHtcbiAgICAgIGFjdGlvblJlc3VsdC5lbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGlmIChfdGhpczEzLnN0YXRlLmVkaXRpbmdFbGVtZW50Py5pZCA9PT0gZWxlbWVudC5pZCAmJiBfdGhpczEzLnN0YXRlLmVkaXRpbmdFbGVtZW50ICE9PSBlbGVtZW50ICYmIGlzTm9uRGVsZXRlZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICBlZGl0aW5nRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhhY3Rpb25SZXN1bHQuZWxlbWVudHMpO1xuXG4gICAgICBpZiAoYWN0aW9uUmVzdWx0LmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgICBfdGhpczEzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvblJlc3VsdC5maWxlcykge1xuICAgICAgX3RoaXMxMy5maWxlcyA9IGFjdGlvblJlc3VsdC5yZXBsYWNlRmlsZXMgPyBhY3Rpb25SZXN1bHQuZmlsZXMgOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzMTMuZmlsZXMpLCBhY3Rpb25SZXN1bHQuZmlsZXMpO1xuXG4gICAgICBfdGhpczEzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb25SZXN1bHQuYXBwU3RhdGUgfHwgZWRpdGluZ0VsZW1lbnQpIHtcbiAgICAgIGlmIChhY3Rpb25SZXN1bHQuY29tbWl0VG9IaXN0b3J5KSB7XG4gICAgICAgIF90aGlzMTMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHZpZXdNb2RlRW5hYmxlZCA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LnZpZXdNb2RlRW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgIGxldCB6ZW5Nb2RlRW5hYmxlZCA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/Lnplbk1vZGVFbmFibGVkIHx8IGZhbHNlO1xuICAgICAgbGV0IGdyaWRTaXplID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8uZ3JpZFNpemUgfHwgbnVsbDtcbiAgICAgIGxldCB0aGVtZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LnRoZW1lIHx8IFRIRU1FLkxJR0hUO1xuICAgICAgbGV0IG5hbWUgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy5uYW1lID8/IF90aGlzMTMuc3RhdGUubmFtZTtcblxuICAgICAgaWYgKHR5cGVvZiBfdGhpczEzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB2aWV3TW9kZUVuYWJsZWQgPSBfdGhpczEzLnByb3BzLnZpZXdNb2RlRW5hYmxlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBfdGhpczEzLnByb3BzLnplbk1vZGVFbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHplbk1vZGVFbmFibGVkID0gX3RoaXMxMy5wcm9wcy56ZW5Nb2RlRW5hYmxlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBfdGhpczEzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBncmlkU2l6ZSA9IF90aGlzMTMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBfdGhpczEzLnByb3BzLnRoZW1lICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHRoZW1lID0gX3RoaXMxMy5wcm9wcy50aGVtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBfdGhpczEzLnByb3BzLm5hbWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgbmFtZSA9IF90aGlzMTMucHJvcHMubmFtZTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgLy8gdXNpbmcgT2JqZWN0LmFzc2lnbiBpbnN0ZWFkIG9mIHNwcmVhZCB0byBmb29sIFRTIDQuMi4yKyBpbnRvXG4gICAgICAgIC8vIHJlZ2FyZGluZyB0aGUgcmVzdWx0aW5nIHR5cGUgYXMgbm90IGNvbnRhaW5pbmcgdW5kZWZpbmVkXG4gICAgICAgIC8vICh3aGljaCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb24gd2lsbCBuZXZlciBjb250YWluKVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY3Rpb25SZXN1bHQuYXBwU3RhdGUgfHwge30sIHtcbiAgICAgICAgICBlZGl0aW5nRWxlbWVudDogZWRpdGluZ0VsZW1lbnQgfHwgYWN0aW9uUmVzdWx0LmFwcFN0YXRlPy5lZGl0aW5nRWxlbWVudCB8fCBudWxsLFxuICAgICAgICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgICAgICBncmlkU2l6ZSxcbiAgICAgICAgICB0aGVtZSxcbiAgICAgICAgICBuYW1lXG4gICAgICAgIH0pO1xuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoYWN0aW9uUmVzdWx0LnN5bmNIaXN0b3J5KSB7XG4gICAgICAgICAgX3RoaXMxMy5oaXN0b3J5LnNldEN1cnJlbnRTdGF0ZShfdGhpczEzLnN0YXRlLCBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgdGhpcy5vbkJsdXIgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgIGlzSG9sZGluZ1NwYWNlID0gZmFsc2U7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIGlzQmluZGluZ0VuYWJsZWQ6IHRydWVcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhpcy5vblVubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLm9uQmx1cigpO1xuICB9O1xuXG4gIHRoaXMuZGlzYWJsZUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfTtcblxuICB0aGlzLm9uRm9udExvYWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLm9uU2NlbmVVcGRhdGVkKCk7XG4gIH07XG5cbiAgdGhpcy5yZXNldEhpc3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5oaXN0b3J5LmNsZWFyKCk7XG4gIH07XG5cbiAgdGhpcy5yZXNldFNjZW5lID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW10pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdldERlZmF1bHRBcHBTdGF0ZSgpKSwge30sIHtcbiAgICAgICAgaXNMb2FkaW5nOiBvcHRzPy5yZXNldExvYWRpbmdTdGF0ZSA/IGZhbHNlIDogc3RhdGUuaXNMb2FkaW5nLFxuICAgICAgICB0aGVtZTogX3RoaXMxMy5zdGF0ZS50aGVtZVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnJlc2V0SGlzdG9yeSgpO1xuICB9KTtcbiAgdGhpcy5pbml0aWFsaXplU2NlbmUgPSAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICBpZiAoXCJsYXVuY2hRdWV1ZVwiIGluIHdpbmRvdyAmJiBcIkxhdW5jaFBhcmFtc1wiIGluIHdpbmRvdykge1xuICAgICAgd2luZG93LmxhdW5jaFF1ZXVlLnNldENvbnN1bWVyKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3JlZjUgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGxhdW5jaFBhcmFtcykge1xuICAgICAgICAgIGlmICghbGF1bmNoUGFyYW1zLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpbGVIYW5kbGUgPSBsYXVuY2hQYXJhbXMuZmlsZXNbMF07XG4gICAgICAgICAgY29uc3QgYmxvYiA9IHlpZWxkIGZpbGVIYW5kbGUuZ2V0RmlsZSgpO1xuXG4gICAgICAgICAgX3RoaXMxMy5sb2FkRmlsZVRvQ2FudmFzKG5ldyBGaWxlKFtibG9iXSwgYmxvYi5uYW1lIHx8IFwiXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IGJsb2IudHlwZVxuICAgICAgICAgIH0pLCBmaWxlSGFuZGxlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeCkge1xuICAgICAgICAgIHJldHVybiBfcmVmNS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSgpKTtcbiAgICB9XG5cbiAgICBpZiAoIV90aGlzMTMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkaW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgaW5pdGlhbERhdGEgPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIGluaXRpYWxEYXRhID0gKHlpZWxkIF90aGlzMTMucHJvcHMuaW5pdGlhbERhdGEpIHx8IG51bGw7XG5cbiAgICAgIGlmIChpbml0aWFsRGF0YT8ubGlicmFyeUl0ZW1zKSB7XG4gICAgICAgIF90aGlzMTMubGlicmFyeS51cGRhdGVMaWJyYXJ5KHtcbiAgICAgICAgICBsaWJyYXJ5SXRlbXM6IGluaXRpYWxEYXRhLmxpYnJhcnlJdGVtcyxcbiAgICAgICAgICBtZXJnZTogdHJ1ZVxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgaW5pdGlhbERhdGEgPSB7XG4gICAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8IFwiRW5jb3VudGVyZWQgYW4gZXJyb3IgZHVyaW5nIGltcG9ydGluZyBvciByZXN0b3Jpbmcgc2NlbmUgZGF0YVwiXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmUgPSByZXN0b3JlKGluaXRpYWxEYXRhLCBudWxsLCBudWxsKTtcbiAgICBzY2VuZS5hcHBTdGF0ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUpLCB7fSwge1xuICAgICAgLy8gd2UncmUgZmFsbGluZyBiYWNrIHRvIGN1cnJlbnQgKHByZS1pbml0KSBzdGF0ZSB3aGVuIGRlY2lkaW5nXG4gICAgICAvLyB3aGV0aGVyIHRvIG9wZW4gdGhlIGxpYnJhcnksIHRvIGhhbmRsZSBhIGNhc2Ugd2hlcmUgd2VcbiAgICAgIC8vIHVwZGF0ZSB0aGUgc3RhdGUgb3V0c2lkZSBvZiBpbml0aWFsRGF0YSAoZS5nLiB3aGVuIGxvYWRpbmcgdGhlIGFwcFxuICAgICAgLy8gd2l0aCBhIGxpYnJhcnkgaW5zdGFsbCBsaW5rLCB3aGljaCBzaG91bGQgYXV0by1vcGVuIHRoZSBsaWJyYXJ5KVxuICAgICAgaXNMaWJyYXJ5T3BlbjogaW5pdGlhbERhdGE/LmFwcFN0YXRlPy5pc0xpYnJhcnlPcGVuIHx8IF90aGlzMTMuc3RhdGUuaXNMaWJyYXJ5T3BlbixcbiAgICAgIGFjdGl2ZVRvb2w6IHNjZW5lLmFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJpbWFnZVwiID8gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzY2VuZS5hcHBTdGF0ZS5hY3RpdmVUb29sKSwge30sIHtcbiAgICAgICAgdHlwZTogXCJzZWxlY3Rpb25cIlxuICAgICAgfSkgOiBzY2VuZS5hcHBTdGF0ZS5hY3RpdmVUb29sLFxuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIHRvYXN0OiBfdGhpczEzLnN0YXRlLnRvYXN0XG4gICAgfSk7XG5cbiAgICBpZiAoaW5pdGlhbERhdGE/LnNjcm9sbFRvQ29udGVudCkge1xuICAgICAgc2NlbmUuYXBwU3RhdGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lLmFwcFN0YXRlKSwgY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKHNjZW5lLmVsZW1lbnRzLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lLmFwcFN0YXRlKSwge30sIHtcbiAgICAgICAgd2lkdGg6IF90aGlzMTMuc3RhdGUud2lkdGgsXG4gICAgICAgIGhlaWdodDogX3RoaXMxMy5zdGF0ZS5oZWlnaHQsXG4gICAgICAgIG9mZnNldFRvcDogX3RoaXMxMy5zdGF0ZS5vZmZzZXRUb3AsXG4gICAgICAgIG9mZnNldExlZnQ6IF90aGlzMTMuc3RhdGUub2Zmc2V0TGVmdFxuICAgICAgfSksIG51bGwpKTtcbiAgICB9XG5cbiAgICBfdGhpczEzLnJlc2V0SGlzdG9yeSgpO1xuXG4gICAgX3RoaXMxMy5zeW5jQWN0aW9uUmVzdWx0KF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUpLCB7fSwge1xuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlXG4gICAgfSkpO1xuICB9KTtcblxuICB0aGlzLnJlZnJlc2hEZXZpY2VTdGF0ZSA9IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgc2lkZWJhckJyZWFrcG9pbnQgPSBfdGhpczEzLnByb3BzLlVJT3B0aW9ucy5kb2NrZWRTaWRlYmFyQnJlYWtwb2ludCAhPSBudWxsID8gX3RoaXMxMy5wcm9wcy5VSU9wdGlvbnMuZG9ja2VkU2lkZWJhckJyZWFrcG9pbnQgOiBNUV9SSUdIVF9TSURFQkFSX01JTl9XSURUSDtcbiAgICBfdGhpczEzLmRldmljZSA9IHVwZGF0ZU9iamVjdChfdGhpczEzLmRldmljZSwge1xuICAgICAgaXNTbVNjcmVlbjogd2lkdGggPCBNUV9TTV9NQVhfV0lEVEgsXG4gICAgICBpc01vYmlsZTogX3RoaXMxMy5hbGxvd01vYmlsZU1vZGUgJiYgKCAvL3pzdmljemlhblxuICAgICAgd2lkdGggPCBNUV9NQVhfV0lEVEhfUE9SVFJBSVQgfHwgaGVpZ2h0IDwgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUgJiYgd2lkdGggPCBNUV9NQVhfV0lEVEhfTEFORFNDQVBFKSxcbiAgICAgIGNhbkRldmljZUZpdFNpZGViYXI6IHdpZHRoID4gc2lkZWJhckJyZWFrcG9pbnRcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLm9uUmVzaXplID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7fSk7XG4gIH0pO1xuICB0aGlzLm9uU2Nyb2xsID0gZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG9mZnNldFRvcCxcbiAgICAgIG9mZnNldExlZnRcbiAgICB9ID0gX3RoaXMxMy5nZXRDYW52YXNPZmZzZXRzKCk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgaWYgKHN0YXRlLm9mZnNldExlZnQgPT09IG9mZnNldExlZnQgJiYgc3RhdGUub2Zmc2V0VG9wID09PSBvZmZzZXRUb3ApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldFRvcCxcbiAgICAgICAgb2Zmc2V0TGVmdFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSwgU0NST0xMX1RJTUVPVVQpO1xuICB0aGlzLm9uQ3V0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlIHx8IGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfdGhpczEzLmN1dEFsbCgpO1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSk7XG4gIHRoaXMub25Db3B5ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlIHx8IGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfdGhpczEzLmNvcHlBbGwoKTtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH0pO1xuXG4gIHRoaXMuY3V0QWxsID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkN1dCwgXCJrZXlib2FyZFwiKTtcbiAgfTtcblxuICB0aGlzLmNvcHlBbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uQ29weSwgXCJrZXlib2FyZFwiKTtcbiAgfTtcblxuICB0aGlzLm9uVGFwU3RhcnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBmaXggZm9yIEFwcGxlIFBlbmNpbCBTY3JpYmJsZVxuICAgIC8vIE9uIEFuZHJvaWQsIHByZXZlbnRpbmcgdGhlIGV2ZW50IHdvdWxkIGRpc2FibGUgY29udGV4dE1lbnUgb24gdGFwLWhvbGRcbiAgICBpZiAoIWlzQW5kcm9pZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBpZiAoIWRpZFRhcFR3aWNlKSB7XG4gICAgICBkaWRUYXBUd2ljZSA9IHRydWU7XG4gICAgICBjbGVhclRpbWVvdXQodGFwcGVkVHdpY2VUaW1lcik7XG4gICAgICB0YXBwZWRUd2ljZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoQXBwLnJlc2V0VGFwVHdpY2UsIFRBUF9UV0lDRV9USU1FT1VUKTtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGluc2VydCB0ZXh0IG9ubHkgaWYgd2UgdGFwcGVkIHR3aWNlIHdpdGggYSBzaW5nbGUgZmluZ2VyXG4gICAgLy8gZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEgd2lsbCBhbHNvIHByZXZlbnQgaW5zZXJ0aW5nIHRleHQgd2hlbiB1c2VyJ3Mgem9vbWluZ1xuXG5cbiAgICBpZiAoZGlkVGFwVHdpY2UgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IFt0b3VjaF0gPSBldmVudC50b3VjaGVzOyAvLyBAdHMtaWdub3JlXG5cbiAgICAgIF90aGlzMTMuaGFuZGxlQ2FudmFzRG91YmxlQ2xpY2soe1xuICAgICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZXG4gICAgICB9KTtcblxuICAgICAgZGlkVGFwVHdpY2UgPSBmYWxzZTtcbiAgICAgIGNsZWFyVGltZW91dCh0YXBwZWRUd2ljZVRpbWVyKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBbmRyb2lkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge31cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLm9uVGFwRW5kID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgX3RoaXMxMy5yZXNldENvbnRleHRNZW51VGltZXIoKTtcblxuICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX3RoaXMxMy5zdGF0ZS5wcmV2aW91c1NlbGVjdGVkRWxlbWVudElkc1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlc3R1cmUucG9pbnRlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5wYXN0ZUZyb21DbGlwYm9hcmQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWY2ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChldmVudCkge1xuICAgICAgLy8gIzY4NlxuICAgICAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyh0YXJnZXQpO1xuXG4gICAgICBpZiAoIWlzRXhjYWxpZHJhd0FjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRVbmRlckN1cnNvciA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoY3Vyc29yWCwgY3Vyc29yWSk7XG5cbiAgICAgIGlmICggLy8gaWYgbm8gQ2xpcGJvYXJkRXZlbnQgc3VwcGxpZWQsIGFzc3VtZSB3ZSdyZSBwYXN0aW5nIHZpYSBjb250ZXh0TWVudVxuICAgICAgLy8gdGh1cyB0aGVzZSBjaGVja3MgZG9uJ3QgbWFrZSBzZW5zZVxuICAgICAgZXZlbnQgJiYgKCEoZWxlbWVudFVuZGVyQ3Vyc29yIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHx8IGlzV3JpdGFibGVFbGVtZW50KHRhcmdldCkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIHNhbWUgZnJhbWUgKHRodXMgYmVmb3JlIGFueSBhd2FpdHMpIGFzIHRoZSBwYXN0ZVxuICAgICAgLy8gZXZlbnQgZWxzZSBzb21lIGJyb3dzZXJzIChGRi4uLikgd2lsbCBjbGVhciB0aGUgY2xpcGJvYXJkRGF0YVxuICAgICAgLy8gKHNvbWV0aGluZyBzb21ldGhpbmcgc2VjdXJpdHkpXG5cblxuICAgICAgbGV0IGZpbGUgPSBldmVudD8uY2xpcGJvYXJkRGF0YT8uZmlsZXNbMF07XG4gICAgICBjb25zdCBkYXRhID0geWllbGQgcGFyc2VDbGlwYm9hcmQoZXZlbnQpO1xuXG4gICAgICBpZiAoIWZpbGUgJiYgZGF0YS50ZXh0KSB7XG4gICAgICAgIGNvbnN0IHN0cmluZyA9IGRhdGEudGV4dC50cmltKCk7XG5cbiAgICAgICAgaWYgKHN0cmluZy5zdGFydHNXaXRoKFwiPHN2Z1wiKSAmJiBzdHJpbmcuZW5kc1dpdGgoXCI8L3N2Zz5cIikpIHtcbiAgICAgICAgICAvLyBpZ25vcmUgU1ZHIHZhbGlkYXRpb24vbm9ybWFsaXphdGlvbiB3aGljaCB3aWxsIGJlIGRvbmUgZHVyaW5nIGltYWdlXG4gICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb25cbiAgICAgICAgICBmaWxlID0gU1ZHU3RyaW5nVG9GaWxlKHN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gcHJlZmVyIHNwcmVhZHNoZWV0IGRhdGEgb3ZlciBpbWFnZSBmaWxlIChNUyBPZmZpY2UvTGlicmUgT2ZmaWNlKVxuXG5cbiAgICAgIGlmIChpc1N1cHBvcnRlZEltYWdlRmlsZShmaWxlKSAmJiAhZGF0YS5zcHJlYWRzaGVldCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeDogc2NlbmVYLFxuICAgICAgICAgIHk6IHNjZW5lWVxuICAgICAgICB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKHtcbiAgICAgICAgICBjbGllbnRYOiBjdXJzb3JYLFxuICAgICAgICAgIGNsaWVudFk6IGN1cnNvcllcbiAgICAgICAgfSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gX3RoaXMxMy5jcmVhdGVJbWFnZUVsZW1lbnQoe1xuICAgICAgICAgIHNjZW5lWCxcbiAgICAgICAgICBzY2VuZVlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMxMy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBmaWxlKTtcblxuICAgICAgICBfdGhpczEzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcblxuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgIFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEzLnByb3BzLm9uUGFzdGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoKHlpZWxkIF90aGlzMTMucHJvcHMub25QYXN0ZShkYXRhLCBldmVudCkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS5lcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBkYXRhLmVycm9yTWVzc2FnZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5zcHJlYWRzaGVldCkge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBwYXN0ZURpYWxvZzoge1xuICAgICAgICAgICAgZGF0YTogZGF0YS5zcHJlYWRzaGVldCxcbiAgICAgICAgICAgIHNob3duOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5lbGVtZW50cykge1xuICAgICAgICBfdGhpczEzLmFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5KHtcbiAgICAgICAgICBlbGVtZW50czogZGF0YS5lbGVtZW50cyxcbiAgICAgICAgICBmaWxlczogZGF0YS5maWxlcyB8fCBudWxsLFxuICAgICAgICAgIHBvc2l0aW9uOiBcImN1cnNvclwiXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnRleHQpIHtcbiAgICAgICAgX3RoaXMxMy5hZGRUZXh0RnJvbVBhc3RlKGRhdGEudGV4dCk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0QWN0aXZlVG9vbCh7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0aW9uXCJcbiAgICAgIH0pO1xuXG4gICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoX3gyKSB7XG4gICAgICByZXR1cm4gX3JlZjYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCkpO1xuXG4gIHRoaXMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkgPSBmdW5jdGlvbiAob3B0cykge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gcmVzdG9yZUVsZW1lbnRzKG9wdHMuZWxlbWVudHMsIG51bGwpO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gICAgY29uc3QgZWxlbWVudHNDZW50ZXJYID0gZGlzdGFuY2UobWluWCwgbWF4WCkgLyAyO1xuICAgIGNvbnN0IGVsZW1lbnRzQ2VudGVyWSA9IGRpc3RhbmNlKG1pblksIG1heFkpIC8gMjtcbiAgICBjb25zdCBjbGllbnRYID0gdHlwZW9mIG9wdHMucG9zaXRpb24gPT09IFwib2JqZWN0XCIgPyBvcHRzLnBvc2l0aW9uLmNsaWVudFggOiBvcHRzLnBvc2l0aW9uID09PSBcImN1cnNvclwiID8gY3Vyc29yWCA6IF90aGlzMTMuc3RhdGUud2lkdGggLyAyICsgX3RoaXMxMy5zdGF0ZS5vZmZzZXRMZWZ0O1xuICAgIGNvbnN0IGNsaWVudFkgPSB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIiA/IG9wdHMucG9zaXRpb24uY2xpZW50WSA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCIgPyBjdXJzb3JZIDogX3RoaXMxMy5zdGF0ZS5oZWlnaHQgLyAyICsgX3RoaXMxMy5zdGF0ZS5vZmZzZXRUb3A7XG4gICAgY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHlcbiAgICB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKHtcbiAgICAgIGNsaWVudFgsXG4gICAgICBjbGllbnRZXG4gICAgfSwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgY29uc3QgZHggPSB4IC0gZWxlbWVudHNDZW50ZXJYO1xuICAgIGNvbnN0IGR5ID0geSAtIGVsZW1lbnRzQ2VudGVyWTtcbiAgICBjb25zdCBncm91cElkTWFwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KGR4LCBkeSwgX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgY29uc3Qgb2xkSWRUb0R1cGxpY2F0ZWRJZCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBuZXdFbGVtZW50cyA9IGVsZW1lbnRzLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgY29uc3QgbmV3RWxlbWVudCA9IGR1cGxpY2F0ZUVsZW1lbnQoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nR3JvdXBJZCwgZ3JvdXBJZE1hcCwgZWxlbWVudCwge1xuICAgICAgICB4OiBlbGVtZW50LnggKyBncmlkWCAtIG1pblgsXG4gICAgICAgIHk6IGVsZW1lbnQueSArIGdyaWRZIC0gbWluWVxuICAgICAgfSk7XG4gICAgICBvbGRJZFRvRHVwbGljYXRlZElkLnNldChlbGVtZW50LmlkLCBuZXdFbGVtZW50LmlkKTtcbiAgICAgIHJldHVybiBuZXdFbGVtZW50O1xuICAgIH0pO1xuICAgIGJpbmRUZXh0VG9TaGFwZUFmdGVyRHVwbGljYXRpb24obmV3RWxlbWVudHMsIGVsZW1lbnRzLCBvbGRJZFRvRHVwbGljYXRlZElkKTtcbiAgICBjb25zdCBuZXh0RWxlbWVudHMgPSBbLi4uX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgLi4ubmV3RWxlbWVudHNdO1xuICAgIGZpeEJpbmRpbmdzQWZ0ZXJEdXBsaWNhdGlvbihuZXh0RWxlbWVudHMsIGVsZW1lbnRzLCBvbGRJZFRvRHVwbGljYXRlZElkKTtcblxuICAgIGlmIChvcHRzLmZpbGVzKSB7XG4gICAgICBfdGhpczEzLmZpbGVzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLmZpbGVzKSwgb3B0cy5maWxlcyk7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMobmV4dEVsZW1lbnRzKTtcblxuICAgIF90aGlzMTMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzMTMuc3RhdGUpLCB7fSwge1xuICAgICAgaXNMaWJyYXJ5T3BlbjogX3RoaXMxMy5zdGF0ZS5pc0xpYnJhcnlPcGVuICYmIF90aGlzMTMuZGV2aWNlLmNhbkRldmljZUZpdFNpZGViYXIgPyBfdGhpczEzLnN0YXRlLmlzTGlicmFyeU1lbnVEb2NrZWQgOiBmYWxzZSxcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczogbmV3RWxlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkpIHtcbiAgICAgICAgICBhY2NbZWxlbWVudC5pZF0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9XG4gICAgfSksIF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCkpLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob3B0cy5maWxlcykge1xuICAgICAgICBfdGhpczEzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5zZXRBY3RpdmVUb29sKHtcbiAgICAgIHR5cGU6IFwic2VsZWN0aW9uXCJcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLnNldEFwcFN0YXRlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIF90aGlzMTMuc2V0U3RhdGUob2JqKTtcbiAgfTtcblxuICB0aGlzLnJlbW92ZVBvaW50ZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAodG91Y2hUaW1lb3V0KSB7XG4gICAgICBfdGhpczEzLnJlc2V0Q29udGV4dE1lbnVUaW1lcigpO1xuICAgIH1cblxuICAgIGdlc3R1cmUucG9pbnRlcnMuZGVsZXRlKGV2ZW50LnBvaW50ZXJJZCk7XG4gIH07XG5cbiAgdGhpcy50b2dnbGVMb2NrID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCBzb3VyY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFwidWlcIjtcblxuICAgIGlmICghX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLmxvY2tlZCkge1xuICAgICAgdHJhY2tFdmVudChcInRvb2xiYXJcIiwgXCJ0b2dnbGVMb2NrXCIsIGAke3NvdXJjZX0gKCR7X3RoaXMxMy5kZXZpY2UuaXNNb2JpbGUgPyBcIm1vYmlsZVwiIDogXCJkZXNrdG9wXCJ9KWApO1xuICAgIH1cblxuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aXZlVG9vbDogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5hY3RpdmVUb29sKSwgdXBkYXRlQWN0aXZlVG9vbChfdGhpczEzLnN0YXRlLCBwcmV2U3RhdGUuYWN0aXZlVG9vbC5sb2NrZWQgPyB7XG4gICAgICAgICAgdHlwZTogXCJzZWxlY3Rpb25cIlxuICAgICAgICB9IDogcHJldlN0YXRlLmFjdGl2ZVRvb2wpKSwge30sIHtcbiAgICAgICAgICBsb2NrZWQ6ICFwcmV2U3RhdGUuYWN0aXZlVG9vbC5sb2NrZWRcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy50b2dnbGVQZW5Nb2RlID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGVuTW9kZTogIXByZXZTdGF0ZS5wZW5Nb2RlXG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuc2Nyb2xsVG9Db250ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCB0YXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKF9vYmplY3RTcHJlYWQoe30sIGNhbGN1bGF0ZVNjcm9sbENlbnRlcihBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQgOiBbdGFyZ2V0XSwgX3RoaXMxMy5zdGF0ZSwgX3RoaXMxMy5jYW52YXMpKSk7XG4gIH07XG5cbiAgdGhpcy56b29tVG9GaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHRhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcbiAgICBsZXQgbWF4Wm9vbSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgICBsZXQgbWFyZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwLjAzO1xuXG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRhcmdldCA9IF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldC5sZW5ndGggPT09IDApIHtcbiAgICAgIG1heFpvb20gPSAxO1xuICAgIH1cblxuICAgIF90aGlzMTMuc2V0U3RhdGUoem9vbVRvRml0RWxlbWVudHModGFyZ2V0LCBfdGhpczEzLnN0YXRlLCBmYWxzZSwgbWF4Wm9vbSwgbWFyZ2luKS5hcHBTdGF0ZSk7XG4gIH07XG5cbiAgdGhpcy51cGRhdGVDb250YWluZXJTaXplID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChjb250YWluZXJzKSB7XG4gICAgY29udGFpbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgY29uc3QgW3gsIHldID0gcm90YXRlKGVsLnggKyBlbC53aWR0aCwgZWwueSArIGVsLmhlaWdodCwgZWwueCArIGVsLndpZHRoIC8gMiwgZWwueSArIGVsLmhlaWdodCAvIDIsIGVsLmFuZ2xlKTtcbiAgICAgIHJlc2l6ZVNpbmdsZUVsZW1lbnQobmV3IE1hcCgpLnNldChlbC5pZCwgZWwpLCB0cnVlLCBlbCwgXCJzZVwiLCB0cnVlLCB4LCB5KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhpcy5yZXN0b3JlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICByZXR1cm4gcmVzdG9yZShkYXRhLCBudWxsLCBudWxsKTtcbiAgfTtcblxuICB0aGlzLnNldFRvYXN0ID0gZnVuY3Rpb24gKHRvYXN0KSB7XG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICB0b2FzdFxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMucmVzdG9yZUZpbGVGcm9tU2hhcmUgPSAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2ViU2hhcmVUYXJnZXRDYWNoZSA9IHlpZWxkIGNhY2hlcy5vcGVuKFwid2ViLXNoYXJlLXRhcmdldFwiKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgd2ViU2hhcmVUYXJnZXRDYWNoZS5tYXRjaChcInNoYXJlZC1maWxlXCIpO1xuXG4gICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgYmxvYiA9IHlpZWxkIHJlc3BvbnNlLmJsb2IoKTtcbiAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgYmxvYi5uYW1lIHx8IFwiXCIsIHtcbiAgICAgICAgICB0eXBlOiBibG9iLnR5cGVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMxMy5sb2FkRmlsZVRvQ2FudmFzKGZpbGUsIG51bGwpO1xuXG4gICAgICAgIHlpZWxkIHdlYlNoYXJlVGFyZ2V0Q2FjaGUuZGVsZXRlKFwic2hhcmVkLWZpbGVcIik7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBBUFBfTkFNRSwgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgdGhpcy5hZGRGaWxlcyA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZmlsZXMpIHtcbiAgICBjb25zdCBmaWxlc01hcCA9IGZpbGVzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBmaWxlRGF0YSkge1xuICAgICAgYWNjLnNldChmaWxlRGF0YS5pZCwgZmlsZURhdGEpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBuZXcgTWFwKCkpO1xuICAgIF90aGlzMTMuZmlsZXMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzMTMuZmlsZXMpLCBPYmplY3QuZnJvbUVudHJpZXMoZmlsZXNNYXApKTtcblxuICAgIF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgaWYgKGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudCkgJiYgZmlsZXNNYXAuaGFzKGVsZW1lbnQuZmlsZUlkKSkge1xuICAgICAgICBfdGhpczEzLmltYWdlQ2FjaGUuZGVsZXRlKGVsZW1lbnQuZmlsZUlkKTtcblxuICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5zY2VuZS5pbmZvcm1NdXRhdGlvbigpO1xuXG4gICAgX3RoaXMxMy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgfSk7XG5cbiAgdGhpcy5zZXRNb2JpbGVNb2RlQWxsb3dlZCA9IGZ1bmN0aW9uIChhbGxvdykge1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgX3RoaXMxMy5hbGxvd01vYmlsZU1vZGUgPSBhbGxvdztcblxuICAgIGlmIChhbGxvdykge1xuICAgICAgX3RoaXMxMy5kZXZpY2UgPSB1cGRhdGVPYmplY3QoX3RoaXMxMy5kZXZpY2UsIHtcbiAgICAgICAgaXNNb2JpbGU6IHdpZHRoIDwgTVFfTUFYX1dJRFRIX1BPUlRSQUlUIHx8IGhlaWdodCA8IE1RX01BWF9IRUlHSFRfTEFORFNDQVBFICYmIHdpZHRoIDwgTVFfTUFYX1dJRFRIX0xBTkRTQ0FQRVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzMTMuZGV2aWNlID0gdXBkYXRlT2JqZWN0KF90aGlzMTMuZGV2aWNlLCB7XG4gICAgICAgIGlzTW9iaWxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5mb3JjZVVwZGF0ZSgpO1xuICB9O1xuXG4gIHRoaXMuc2V0TG9jYWxGb250ID0gZnVuY3Rpb24gKHNob3dPblBhbmVsKSB7XG4gICAgc2hvd0ZvdXJ0aEZvbnQgPSBzaG93T25QYW5lbDtcbiAgfTtcblxuICB0aGlzLnNlbGVjdEVsZW1lbnRzID0gZnVuY3Rpb24gKGVsZW1lbnRzKSB7XG4gICAgX3RoaXMxMy51cGRhdGVTY2VuZSh7XG4gICAgICBhcHBTdGF0ZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLnN0YXRlKSwge30sIHtcbiAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogZWxlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChtYXAsIGVsZW1lbnQpIHtcbiAgICAgICAgICBtYXBbZWxlbWVudC5pZF0gPSB0cnVlO1xuICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIH0sIHt9KVxuICAgICAgfSksXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWVcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLmJyaW5nVG9Gcm9udCA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICAgIF90aGlzMTMuc2VsZWN0RWxlbWVudHMoZWxlbWVudHMpO1xuXG4gICAgX3RoaXMxMy51cGRhdGVTY2VuZShhY3Rpb25CcmluZ1RvRnJvbnQucGVyZm9ybShfdGhpczEzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlKSk7XG4gIH07XG5cbiAgdGhpcy5icmluZ0ZvcndhcmQgPSBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgICBfdGhpczEzLnNlbGVjdEVsZW1lbnRzKGVsZW1lbnRzKTtcblxuICAgIF90aGlzMTMudXBkYXRlU2NlbmUoYWN0aW9uQnJpbmdGb3J3YXJkLnBlcmZvcm0oX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSkpO1xuICB9O1xuXG4gIHRoaXMuc2VuZFRvQmFjayA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICAgIF90aGlzMTMuc2VsZWN0RWxlbWVudHMoZWxlbWVudHMpO1xuXG4gICAgX3RoaXMxMy51cGRhdGVTY2VuZShhY3Rpb25TZW5kVG9CYWNrLnBlcmZvcm0oX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSkpO1xuICB9O1xuXG4gIHRoaXMuc2VuZEJhY2t3YXJkID0gZnVuY3Rpb24gKGVsZW1lbnRzKSB7XG4gICAgX3RoaXMxMy5zZWxlY3RFbGVtZW50cyhlbGVtZW50cyk7XG5cbiAgICBfdGhpczEzLnVwZGF0ZVNjZW5lKGFjdGlvblNlbmRCYWNrd2FyZC5wZXJmb3JtKF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpKTtcbiAgfTtcblxuICB0aGlzLnVwZGF0ZVNjZW5lID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChzY2VuZURhdGEpIHtcbiAgICBpZiAoc2NlbmVEYXRhLmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgIH1cblxuICAgIGlmIChzY2VuZURhdGEuYXBwU3RhdGUpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoc2NlbmVEYXRhLmFwcFN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc2NlbmVEYXRhLmVsZW1lbnRzKSB7XG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhzY2VuZURhdGEuZWxlbWVudHMpO1xuICAgIH1cblxuICAgIGlmIChzY2VuZURhdGEuY29sbGFib3JhdG9ycykge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGNvbGxhYm9yYXRvcnM6IHNjZW5lRGF0YS5jb2xsYWJvcmF0b3JzXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMub25TY2VuZVVwZGF0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7fSk7XG4gIH07XG5cbiAgdGhpcy51cGRhdGVDdXJyZW50Q3Vyc29yUG9zaXRpb24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgY3Vyc29yWCA9IGV2ZW50LmNsaWVudFg7XG4gICAgY3Vyc29yWSA9IGV2ZW50LmNsaWVudFk7XG4gIH0pO1xuICB0aGlzLm9uS2V5RG93biA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBub3JtYWxpemUgYGV2ZW50LmtleWAgd2hlbiBDYXBzTG9jayBpcyBwcmVzc2VkICMyMzcyXG4gICAgaWYgKFwiUHJveHlcIiBpbiB3aW5kb3cgJiYgKCFldmVudC5zaGlmdEtleSAmJiAvXltBLVpdJC8udGVzdChldmVudC5rZXkpIHx8IGV2ZW50LnNoaWZ0S2V5ICYmIC9eW2Etel0kLy50ZXN0KGV2ZW50LmtleSkpKSB7XG4gICAgICBldmVudCA9IG5ldyBQcm94eShldmVudCwge1xuICAgICAgICBnZXQoZXYsIHByb3ApIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV2W3Byb3BdO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAvLyBmaXggZm9yIFByb3hpZXMgaGlqYWNraW5nIGB0aGlzYFxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZXYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBwcm9wID09PSBcImtleVwiID8gLy8gQ2Fwc0xvY2sgaW52ZXJ0cyBjYXBpdGFsaXphdGlvbiBiYXNlZCBvbiBTaGlmdEtleSwgc28gaW52ZXJ0XG4gICAgICAgICAgLy8gaXQgYmFja1xuICAgICAgICAgIGV2ZW50LnNoaWZ0S2V5ID8gZXYua2V5LnRvVXBwZXJDYXNlKCkgOiBldi5rZXkudG9Mb3dlckNhc2UoKSA6IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgIH0pO1xuICAgIH0gLy8gcHJldmVudCBicm93c2VyIHpvb20gaW4gaW5wdXQgZmllbGRzXG5cblxuICAgIGlmIChldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJiBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpKSB7XG4gICAgICBpZiAoZXZlbnQuY29kZSA9PT0gQ09ERVMuTUlOVVMgfHwgZXZlbnQuY29kZSA9PT0gQ09ERVMuRVFVQUwpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gLy8gYmFpbCBpZlxuXG5cbiAgICBpZiAoIC8vIGluc2lkZSBhbiBpbnB1dFxuICAgIGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkgJiYgLy8gdW5sZXNzIHByZXNzaW5nIGVzY2FwZSAoZmluYWxpemUgYWN0aW9uKVxuICAgIGV2ZW50LmtleSAhPT0gS0VZUy5FU0NBUEUgfHwgLy8gb3IgdW5sZXNzIHVzaW5nIGFycm93cyAodG8gbW92ZSBiZXR3ZWVuIGJ1dHRvbnMpXG4gICAgaXNBcnJvd0tleShldmVudC5rZXkpICYmIGlzSW5wdXRMaWtlKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlFVRVNUSU9OX01BUkspIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzaG93SGVscERpYWxvZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKF90aGlzMTMuYWN0aW9uTWFuYWdlci5oYW5kbGVLZXlEb3duKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJiBfdGhpczEzLnN0YXRlLmlzQmluZGluZ0VuYWJsZWQpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBpc0JpbmRpbmdFbmFibGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmNvZGUgPT09IENPREVTLlpFUk8pIHtcbiAgICAgIGNvbnN0IG5leHRTdGF0ZSA9ICFfdGhpczEzLnN0YXRlLmlzTGlicmFyeU9wZW47XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xpYnJhcnlPcGVuOiBuZXh0U3RhdGVcbiAgICAgIH0pOyAvLyB0cmFjayBvbmx5IG9wZW5pbmdzXG5cblxuICAgICAgaWYgKG5leHRTdGF0ZSkge1xuICAgICAgICB0cmFja0V2ZW50KFwibGlicmFyeVwiLCBcInRvZ2dsZUxpYnJhcnkgKG9wZW4pXCIsIGBrZXlib2FyZCAoJHtfdGhpczEzLmRldmljZS5pc01vYmlsZSA/IFwibW9iaWxlXCIgOiBcImRlc2t0b3BcIn0pYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyb3dLZXkoZXZlbnQua2V5KSkge1xuICAgICAgY29uc3Qgc3RlcCA9IF90aGlzMTMuc3RhdGUuZ3JpZFNpemUgJiYgKGV2ZW50LnNoaWZ0S2V5ID8gRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5UIDogX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSkgfHwgKGV2ZW50LnNoaWZ0S2V5ID8gRUxFTUVOVF9TSElGVF9UUkFOU0xBVEVfQU1PVU5UIDogRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5UKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUsIHRydWUpO1xuICAgICAgbGV0IG9mZnNldFggPSAwO1xuICAgICAgbGV0IG9mZnNldFkgPSAwO1xuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX0xFRlQpIHtcbiAgICAgICAgb2Zmc2V0WCA9IC1zdGVwO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfUklHSFQpIHtcbiAgICAgICAgb2Zmc2V0WCA9IHN0ZXA7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5BUlJPV19VUCkge1xuICAgICAgICBvZmZzZXRZID0gLXN0ZXA7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5BUlJPV19ET1dOKSB7XG4gICAgICAgIG9mZnNldFkgPSBzdGVwO1xuICAgICAgfVxuXG4gICAgICBzZWxlY3RlZEVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgICAgeDogZWxlbWVudC54ICsgb2Zmc2V0WCxcbiAgICAgICAgICB5OiBlbGVtZW50LnkgKyBvZmZzZXRZXG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQsIHtcbiAgICAgICAgICBzaW11bHRhbmVvdXNseVVwZGF0ZWQ6IHNlbGVjdGVkRWxlbWVudHNcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkVOVEVSKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlKTtcblxuICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGlmIChpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkpIHtcbiAgICAgICAgICBpZiAoIV90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHwgX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQgIT09IHNlbGVjdGVkRWxlbWVudHNbMF0uaWQpIHtcbiAgICAgICAgICAgIF90aGlzMTMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcblxuICAgICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBuZXcgTGluZWFyRWxlbWVudEVkaXRvcihzZWxlY3RlZEVsZW1lbnRzWzBdLCBfdGhpczEzLnNjZW5lKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHNbMF07XG5cbiAgICAgICAgICBfdGhpczEzLnN0YXJ0VGV4dEVkaXRpbmcoe1xuICAgICAgICAgICAgc2NlbmVYOiBzZWxlY3RlZEVsZW1lbnQueCArIHNlbGVjdGVkRWxlbWVudC53aWR0aCAvIDIsXG4gICAgICAgICAgICBzY2VuZVk6IHNlbGVjdGVkRWxlbWVudC55ICsgc2VsZWN0ZWRFbGVtZW50LmhlaWdodCAvIDIsXG4gICAgICAgICAgICBzaG91bGRCaW5kOiB0cnVlXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQubWV0YUtleSAmJiBfdGhpczEzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgY29uc3Qgc2hhcGUgPSBmaW5kU2hhcGVCeUtleShldmVudC5rZXkpO1xuXG4gICAgICBpZiAoc2hhcGUpIHtcbiAgICAgICAgaWYgKF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlICE9PSBzaGFwZSkge1xuICAgICAgICAgIHRyYWNrRXZlbnQoXCJ0b29sYmFyXCIsIHNoYXBlLCBga2V5Ym9hcmQgKCR7X3RoaXMxMy5kZXZpY2UuaXNNb2JpbGUgPyBcIm1vYmlsZVwiIDogXCJkZXNrdG9wXCJ9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMxMy5zZXRBY3RpdmVUb29sKHtcbiAgICAgICAgICB0eXBlOiBzaGFwZVxuICAgICAgICB9KTtcblxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlEpIHtcbiAgICAgICAgX3RoaXMxMy50b2dnbGVMb2NrKFwia2V5Ym9hcmRcIik7XG5cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TUEFDRSAmJiBnZXN0dXJlLnBvaW50ZXJzLnNpemUgPT09IDApIHtcbiAgICAgIGlzSG9sZGluZ1NwYWNlID0gdHJ1ZTtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQkJJTkcpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBpZiAoKGV2ZW50LmtleSA9PT0gS0VZUy5HIHx8IGV2ZW50LmtleSA9PT0gS0VZUy5TKSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudFtLRVlTLkNUUkxfT1JfQ01EXSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgIGlmIChfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIiAmJiAhc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkcgJiYgKGhhc0JhY2tncm91bmQoX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUpIHx8IHNlbGVjdGVkRWxlbWVudHMuc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gaGFzQmFja2dyb3VuZChlbGVtZW50LnR5cGUpO1xuICAgICAgfSkpKSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIG9wZW5Qb3B1cDogXCJiYWNrZ3JvdW5kQ29sb3JQaWNrZXJcIlxuICAgICAgICB9KTtcblxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TKSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIG9wZW5Qb3B1cDogXCJzdHJva2VDb2xvclBpY2tlclwiXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHRoaXMub25XaGVlbCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBwcmV2ZW50IGJyb3dzZXIgcGluY2ggem9vbSBvbiBET00gZWxlbWVudHNcbiAgICBpZiAoIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkgJiYgZXZlbnQuY3RybEtleSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0pO1xuICB0aGlzLm9uS2V5VXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TUEFDRSkge1xuICAgICAgaWYgKF90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEN1cnNvckZvclNoYXBlKF90aGlzMTMuY2FudmFzLCBfdGhpczEzLnN0YXRlKTtcblxuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgIV90aGlzMTMuc3RhdGUuaXNCaW5kaW5nRW5hYmxlZCkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzQmluZGluZ0VuYWJsZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChpc0Fycm93S2V5KGV2ZW50LmtleSkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpO1xuICAgICAgaXNCaW5kaW5nRW5hYmxlZChfdGhpczEzLnN0YXRlKSA/IGJpbmRPclVuYmluZFNlbGVjdGVkRWxlbWVudHMoc2VsZWN0ZWRFbGVtZW50cykgOiB1bmJpbmRMaW5lYXJFbGVtZW50cyhzZWxlY3RlZEVsZW1lbnRzKTtcblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLnNldEFjdGl2ZVRvb2wgPSBmdW5jdGlvbiAodG9vbCkge1xuICAgIGNvbnN0IG5leHRBY3RpdmVUb29sID0gdXBkYXRlQWN0aXZlVG9vbChfdGhpczEzLnN0YXRlLCB0b29sKTtcblxuICAgIGlmICghaXNIb2xkaW5nU3BhY2UpIHtcbiAgICAgIHNldEN1cnNvckZvclNoYXBlKF90aGlzMTMuY2FudmFzLCBfdGhpczEzLnN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNUb29sSWNvbihkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgX3RoaXMxMy5mb2N1c0NvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIGlmICghaXNMaW5lYXJFbGVtZW50VHlwZShuZXh0QWN0aXZlVG9vbC50eXBlKSkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG5leHRBY3RpdmVUb29sLnR5cGUgPT09IFwiaW1hZ2VcIikge1xuICAgICAgX3RoaXMxMy5vbkltYWdlQWN0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKG5leHRBY3RpdmVUb29sLnR5cGUgIT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBhY3RpdmVUb29sOiBuZXh0QWN0aXZlVG9vbCxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGFjdGl2ZVRvb2w6IG5leHRBY3RpdmVUb29sXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5zZXRDdXJzb3IgPSBmdW5jdGlvbiAoY3Vyc29yKSB7XG4gICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBjdXJzb3IpO1xuICB9O1xuXG4gIHRoaXMucmVzZXRDdXJzb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmVzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMpO1xuICB9O1xuXG4gIHRoaXMuaXNUb3VjaFNjcmVlbk11bHRpVG91Y2hHZXN0dXJlID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gZGVzZWxlY3Qgd2hlbiB1c2luZyB0cmFja3BhZCwgYW5kIG11bHRpLXBvaW50IGdlc3R1cmVzXG4gICAgLy8gb25seSB3b3JrIG9uIHRvdWNoIHNjcmVlbnMsIHNvIGNoZWNraW5nIGZvciA+PSBwb2ludGVycyBtZWFucyB3ZSdyZSBvbiBhXG4gICAgLy8gdG91Y2hzY3JlZW5cbiAgICByZXR1cm4gZ2VzdHVyZS5wb2ludGVycy5zaXplID49IDI7XG4gIH07XG5cbiAgdGhpcy5vbkdlc3R1cmVTdGFydCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyB3ZSBvbmx5IHdhbnQgdG8gZGVzZWxlY3Qgb24gdG91Y2ggc2NyZWVucyBiZWNhdXNlIHVzZXIgbWF5IGhhdmUgc2VsZWN0ZWRcbiAgICAvLyBlbGVtZW50cyBieSBtaXN0YWtlIHdoaWxlIHpvb21pbmdcblxuICAgIGlmIChfdGhpczEzLmlzVG91Y2hTY3JlZW5NdWx0aVRvdWNoR2VzdHVyZSgpKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSBfdGhpczEzLnN0YXRlLnpvb20udmFsdWU7XG4gIH0pO1xuICB0aGlzLm9uR2VzdHVyZUNoYW5nZSA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBvbkdlc3R1cmVDaGFuZ2Ugb25seSBoYXMgem9vbSBmYWN0b3IgYnV0IG5vdCB0aGUgY2VudGVyLlxuICAgIC8vIElmIHdlJ3JlIG9uIGlQYWQgb3IgaVBob25lLCB0aGVuIHdlIHJlY29nbml6ZSBtdWx0aS10b3VjaCBhbmQgd2lsbFxuICAgIC8vIHpvb20gaW4gYXQgdGhlIHJpZ2h0IGxvY2F0aW9uIGluIHRoZSB0b3VjaG1vdmUgaGFuZGxlclxuICAgIC8vIChoYW5kbGVDYW52YXNQb2ludGVyTW92ZSkuXG4gICAgLy9cbiAgICAvLyBPbiBNYWNib29rIHRyYWNrcGFkLCB3ZSBkb24ndCBoYXZlIHRob3NlIGV2ZW50cyBzbyB3aWxsIHpvb20gaW4gYXQgdGhlXG4gICAgLy8gY3VycmVudCBsb2NhdGlvbiBpbnN0ZWFkLlxuICAgIC8vXG4gICAgLy8gQXMgc3VjaCwgYmFpbCBmcm9tIHRoaXMgaGFuZGxlciBvbiB0b3VjaCBkZXZpY2VzLlxuXG4gICAgaWYgKF90aGlzMTMuaXNUb3VjaFNjcmVlbk11bHRpVG91Y2hHZXN0dXJlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0aWFsU2NhbGUgPSBnZXN0dXJlLmluaXRpYWxTY2FsZTtcblxuICAgIGlmIChpbml0aWFsU2NhbGUpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBnZXRTdGF0ZUZvclpvb20oe1xuICAgICAgICAgIHZpZXdwb3J0WDogY3Vyc29yWCxcbiAgICAgICAgICB2aWV3cG9ydFk6IGN1cnNvclksXG4gICAgICAgICAgbmV4dFpvb206IGdldE5vcm1hbGl6ZWRab29tKGluaXRpYWxTY2FsZSAqIGV2ZW50LnNjYWxlKVxuICAgICAgICB9LCBzdGF0ZSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgdGhpcy5vbkdlc3R1cmVFbmQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gcmVzZWxlY3QgZWxlbWVudHMgb25seSBvbiB0b3VjaCBzY3JlZW5zIChzZWUgb25HZXN0dXJlU3RhcnQpXG5cbiAgICBpZiAoX3RoaXMxMy5pc1RvdWNoU2NyZWVuTXVsdGlUb3VjaEdlc3R1cmUoKSkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfdGhpczEzLnN0YXRlLnByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXN0dXJlLmluaXRpYWxTY2FsZSA9IG51bGw7XG4gIH0pO1xuXG4gIHRoaXMuc3RhcnRUZXh0RWRpdGluZyA9IGZ1bmN0aW9uIChfcmVmOCkge1xuICAgIGxldCB7XG4gICAgICBzY2VuZVgsXG4gICAgICBzY2VuZVksXG4gICAgICBzaG91bGRCaW5kLFxuICAgICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXIgPSB0cnVlXG4gICAgfSA9IF9yZWY4O1xuXG4gICAgbGV0IHBhcmVudENlbnRlclBvc2l0aW9uID0gaW5zZXJ0QXRQYXJlbnRDZW50ZXIgJiYgX3RoaXMxMy5nZXRUZXh0V3lzaXd5Z1NuYXBwZWRUb0NlbnRlclBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLmNhbnZhcywgd2luZG93LmRldmljZVBpeGVsUmF0aW8pO1xuXG4gICAgbGV0IGV4aXN0aW5nVGV4dEVsZW1lbnQgPSBudWxsO1xuICAgIGxldCBjb250YWluZXIgPSBudWxsO1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgICBleGlzdGluZ1RleHRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1swXSwgZmFsc2UpKSB7XG4gICAgICAgIGV4aXN0aW5nVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmdUZXh0RWxlbWVudCA9IF90aGlzMTMuZ2V0VGV4dEVsZW1lbnRBdFBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZXhpc3RpbmdUZXh0RWxlbWVudCA9IF90aGlzMTMuZ2V0VGV4dEVsZW1lbnRBdFBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZKTtcbiAgICB9IC8vIGJpbmQgdG8gY29udGFpbmVyIHdoZW4gc2hvdWxkQmluZCBpcyB0cnVlIG9yXG4gICAgLy8gY2xpY2tlZCBvbiBjZW50ZXIgb2YgY29udGFpbmVyXG5cblxuICAgIGlmICghY29udGFpbmVyICYmICFleGlzdGluZ1RleHRFbGVtZW50ICYmIChzaG91bGRCaW5kIHx8IHBhcmVudENlbnRlclBvc2l0aW9uKSkge1xuICAgICAgY29udGFpbmVyID0gZ2V0VGV4dEJpbmRhYmxlQ29udGFpbmVyQXRQb3NpdGlvbihfdGhpczEzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIHJldHVybiBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihlbGUsIGZhbHNlKSAmJiAhZ2V0Qm91bmRUZXh0RWxlbWVudChlbGUpO1xuICAgICAgfSksIHNjZW5lWCwgc2NlbmVZKTtcbiAgICB9XG5cbiAgICBpZiAoIWV4aXN0aW5nVGV4dEVsZW1lbnQgJiYgY29udGFpbmVyKSB7XG4gICAgICBjb25zdCBmb250U3RyaW5nID0ge1xuICAgICAgICBmb250U2l6ZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRTaXplLFxuICAgICAgICBmb250RmFtaWx5OiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseVxuICAgICAgfTtcbiAgICAgIGNvbnN0IG1pbldpZHRoID0gZ2V0QXBwcm94TWluTGluZVdpZHRoKGdldEZvbnRTdHJpbmcoZm9udFN0cmluZykpO1xuICAgICAgY29uc3QgbWluSGVpZ2h0ID0gZ2V0QXBwcm94TWluTGluZUhlaWdodChnZXRGb250U3RyaW5nKGZvbnRTdHJpbmcpKTtcbiAgICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWF4KGNvbnRhaW5lci5oZWlnaHQsIG1pbkhlaWdodCk7XG4gICAgICBjb25zdCBuZXdXaWR0aCA9IE1hdGgubWF4KGNvbnRhaW5lci53aWR0aCwgbWluV2lkdGgpO1xuICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgaGVpZ2h0OiBuZXdIZWlnaHQsXG4gICAgICAgIHdpZHRoOiBuZXdXaWR0aFxuICAgICAgfSk7XG4gICAgICBzY2VuZVggPSBjb250YWluZXIueCArIG5ld1dpZHRoIC8gMjtcbiAgICAgIHNjZW5lWSA9IGNvbnRhaW5lci55ICsgbmV3SGVpZ2h0IC8gMjtcblxuICAgICAgaWYgKHBhcmVudENlbnRlclBvc2l0aW9uKSB7XG4gICAgICAgIHBhcmVudENlbnRlclBvc2l0aW9uID0gX3RoaXMxMy5nZXRUZXh0V3lzaXd5Z1NuYXBwZWRUb0NlbnRlclBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLmNhbnZhcywgd2luZG93LmRldmljZVBpeGVsUmF0aW8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBleGlzdGluZ1RleHRFbGVtZW50ID8gZXhpc3RpbmdUZXh0RWxlbWVudCA6IG5ld1RleHRFbGVtZW50KHtcbiAgICAgIHg6IHBhcmVudENlbnRlclBvc2l0aW9uID8gcGFyZW50Q2VudGVyUG9zaXRpb24uZWxlbWVudENlbnRlclggOiBzY2VuZVgsXG4gICAgICB5OiBwYXJlbnRDZW50ZXJQb3NpdGlvbiA/IHBhcmVudENlbnRlclBvc2l0aW9uLmVsZW1lbnRDZW50ZXJZIDogc2NlbmVZLFxuICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgICB0ZXh0OiBcIlwiLFxuICAgICAgcmF3VGV4dDogXCJcIixcbiAgICAgIGZvbnRTaXplOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICBmb250RmFtaWx5OiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgIHRleHRBbGlnbjogcGFyZW50Q2VudGVyUG9zaXRpb24gPyBcImNlbnRlclwiIDogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVRleHRBbGlnbixcbiAgICAgIHZlcnRpY2FsQWxpZ246IHBhcmVudENlbnRlclBvc2l0aW9uID8gVkVSVElDQUxfQUxJR04uTUlERExFIDogREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgICAgIGNvbnRhaW5lcklkOiBjb250YWluZXI/LmlkID8/IHVuZGVmaW5lZCxcbiAgICAgIGdyb3VwSWRzOiBjb250YWluZXI/Lmdyb3VwSWRzID8/IFtdLFxuICAgICAgbG9ja2VkOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudFxuICAgIH0pO1xuXG4gICAgaWYgKCFleGlzdGluZ1RleHRFbGVtZW50KSB7XG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgZWxlbWVudF0pOyAvLyBjYXNlOiBjcmVhdGluZyBuZXcgdGV4dCBub3QgY2VudGVyZWQgdG8gcGFyZW50IGVsZW1lbnQg4oaSIG9mZnNldCBZXG4gICAgICAvLyBzbyB0aGF0IHRoZSB0ZXh0IGlzIGNlbnRlcmVkIHRvIGN1cnNvciBwb3NpdGlvblxuXG5cbiAgICAgIGlmICghcGFyZW50Q2VudGVyUG9zaXRpb24pIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgICAgeTogZWxlbWVudC55IC0gZWxlbWVudC5iYXNlbGluZSAvIDJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudFxuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5oYW5kbGVUZXh0V3lzaXd5ZyhlbGVtZW50LCB7XG4gICAgICBpc0V4aXN0aW5nRWxlbWVudDogISFleGlzdGluZ1RleHRFbGVtZW50XG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVDYW52YXNEb3VibGVDbGljayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGNhc2U6IGRvdWJsZS1jbGlja2luZyB3aXRoIGFycm93L2xpbmUgdG9vbCBzZWxlY3RlZCB3b3VsZCBib3RoIGNyZWF0ZVxuICAgIC8vIHRleHQgYW5kIGVudGVyIG11bHRpRWxlbWVudCBtb2RlXG4gICAgaWYgKF90aGlzMTMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyB3ZSBzaG91bGQgb25seSBiZSBhYmxlIHRvIGRvdWJsZSBjbGljayB3aGVuIG1vZGUgaXMgc2VsZWN0aW9uXG5cblxuICAgIGlmIChfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmIGlzTGluZWFyRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgaWYgKCFfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8IF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkICE9PSBzZWxlY3RlZEVsZW1lbnRzWzBdLmlkKSB7XG4gICAgICAgIF90aGlzMTMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcblxuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudDogbmV3IExpbmVhckVsZW1lbnRFZGl0b3Ioc2VsZWN0ZWRFbGVtZW50c1swXSwgX3RoaXMxMy5zY2VuZSlcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXNldEN1cnNvcihfdGhpczEzLmNhbnZhcyk7XG4gICAgbGV0IHtcbiAgICAgIHg6IHNjZW5lWCxcbiAgICAgIHk6IHNjZW5lWVxuICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIF90aGlzMTMuc3RhdGUpO1xuICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBJZHMgPSBnZXRTZWxlY3RlZEdyb3VwSWRzKF90aGlzMTMuc3RhdGUpO1xuXG4gICAgaWYgKHNlbGVjdGVkR3JvdXBJZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaGl0RWxlbWVudCA9IF90aGlzMTMuZ2V0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEdyb3VwSWQgPSBoaXRFbGVtZW50ICYmIGdldFNlbGVjdGVkR3JvdXBJZEZvckVsZW1lbnQoaGl0RWxlbWVudCwgX3RoaXMxMy5zdGF0ZS5zZWxlY3RlZEdyb3VwSWRzKTtcblxuICAgICAgaWYgKHNlbGVjdGVkR3JvdXBJZCkge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogc2VsZWN0ZWRHcm91cElkLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtoaXRFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9XG4gICAgICAgICAgfSksIF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMpO1xuXG4gICAgaWYgKCFldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJiAhX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgICAgY29uc3QgY2FuQmluZFRleHQgPSBoYXNCb3VuZFRleHRFbGVtZW50KHNlbGVjdGVkRWxlbWVudCk7XG5cbiAgICAgICAgaWYgKGNhbkJpbmRUZXh0KSB7XG4gICAgICAgICAgc2NlbmVYID0gc2VsZWN0ZWRFbGVtZW50LnggKyBzZWxlY3RlZEVsZW1lbnQud2lkdGggLyAyO1xuICAgICAgICAgIHNjZW5lWSA9IHNlbGVjdGVkRWxlbWVudC55ICsgc2VsZWN0ZWRFbGVtZW50LmhlaWdodCAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgICAgc2NlbmVYLFxuICAgICAgICBzY2VuZVksXG4gICAgICAgIHNob3VsZEJpbmQ6IGZhbHNlLFxuICAgICAgICBpbnNlcnRBdFBhcmVudENlbnRlcjogIWV2ZW50LmFsdEtleVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuZ2V0RWxlbWVudExpbmtBdFBvc2l0aW9uID0gZnVuY3Rpb24gKHNjZW5lUG9pbnRlciwgaGl0RWxlbWVudCkge1xuICAgIC8vIFJldmVyc2luZyBzbyB3ZSB0cmF2ZXJzZSB0aGUgZWxlbWVudHMgaW4gZGVjcmVhc2luZyBvcmRlclxuICAgIC8vIG9mIHotaW5kZXhcbiAgICBjb25zdCBlbGVtZW50cyA9IF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCkuc2xpY2UoKS5yZXZlcnNlKCk7XG5cbiAgICBsZXQgaGl0RWxlbWVudEluZGV4ID0gSW5maW5pdHk7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgICBpZiAoaGl0RWxlbWVudCAmJiBlbGVtZW50LmlkID09PSBoaXRFbGVtZW50LmlkKSB7XG4gICAgICAgIGhpdEVsZW1lbnRJbmRleCA9IGluZGV4O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWxlbWVudC5saW5rICYmIGluZGV4IDw9IGhpdEVsZW1lbnRJbmRleCAmJiBpc1BvaW50SGl0dGluZ0xpbmtJY29uKGVsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtzY2VuZVBvaW50ZXIueCwgc2NlbmVQb2ludGVyLnldLCBfdGhpczEzLmRldmljZS5pc01vYmlsZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5yZWRpcmVjdFRvTGluayA9IGZ1bmN0aW9uIChldmVudCwgaXNUb3VjaFNjcmVlbikge1xuICAgIGNvbnN0IGRyYWdnZWREaXN0YW5jZSA9IGRpc3RhbmNlMmQoX3RoaXMxMy5sYXN0UG9pbnRlckRvd24uY2xpZW50WCwgX3RoaXMxMy5sYXN0UG9pbnRlckRvd24uY2xpZW50WSwgX3RoaXMxMy5sYXN0UG9pbnRlclVwLmNsaWVudFgsIF90aGlzMTMubGFzdFBvaW50ZXJVcC5jbGllbnRZKTtcblxuICAgIGlmICghX3RoaXMxMy5oaXRMaW5rRWxlbWVudCB8fCAvLyBGb3IgdG91Y2ggc2NyZWVuIGFsbG93IGRyYWdnaW5nIHRocmVzaG9sZCBlbHNlIHN0cmljdCBjaGVja1xuICAgIGlzVG91Y2hTY3JlZW4gJiYgZHJhZ2dlZERpc3RhbmNlID4gRFJBR0dJTkdfVEhSRVNIT0xEIHx8ICFpc1RvdWNoU2NyZWVuICYmIGRyYWdnZWREaXN0YW5jZSAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RQb2ludGVyRG93bkNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhfdGhpczEzLmxhc3RQb2ludGVyRG93biwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgY29uc3QgbGFzdFBvaW50ZXJEb3duSGl0dGluZ0xpbmtJY29uID0gaXNQb2ludEhpdHRpbmdMaW5rSWNvbihfdGhpczEzLmhpdExpbmtFbGVtZW50LCBfdGhpczEzLnN0YXRlLCBbbGFzdFBvaW50ZXJEb3duQ29vcmRzLngsIGxhc3RQb2ludGVyRG93bkNvb3Jkcy55XSwgX3RoaXMxMy5kZXZpY2UuaXNNb2JpbGUpO1xuICAgIGNvbnN0IGxhc3RQb2ludGVyVXBDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoX3RoaXMxMy5sYXN0UG9pbnRlclVwLCBfdGhpczEzLnN0YXRlKTtcbiAgICBjb25zdCBsYXN0UG9pbnRlclVwSGl0dGluZ0xpbmtJY29uID0gaXNQb2ludEhpdHRpbmdMaW5rSWNvbihfdGhpczEzLmhpdExpbmtFbGVtZW50LCBfdGhpczEzLnN0YXRlLCBbbGFzdFBvaW50ZXJVcENvb3Jkcy54LCBsYXN0UG9pbnRlclVwQ29vcmRzLnldLCBfdGhpczEzLmRldmljZS5pc01vYmlsZSk7XG5cbiAgICBpZiAobGFzdFBvaW50ZXJEb3duSGl0dGluZ0xpbmtJY29uICYmIGxhc3RQb2ludGVyVXBIaXR0aW5nTGlua0ljb24pIHtcbiAgICAgIGNvbnN0IHVybCA9IF90aGlzMTMuaGl0TGlua0VsZW1lbnQubGluaztcblxuICAgICAgaWYgKHVybCkge1xuICAgICAgICBsZXQgY3VzdG9tRXZlbnQ7XG5cbiAgICAgICAgaWYgKF90aGlzMTMucHJvcHMub25MaW5rT3Blbikge1xuICAgICAgICAgIGN1c3RvbUV2ZW50ID0gd3JhcEV2ZW50KEVWRU5ULkVYQ0FMSURSQVdfTElOSywgZXZlbnQubmF0aXZlRXZlbnQpO1xuXG4gICAgICAgICAgX3RoaXMxMy5wcm9wcy5vbkxpbmtPcGVuKF90aGlzMTMuaGl0TGlua0VsZW1lbnQsIGN1c3RvbUV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY3VzdG9tRXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBpc0xvY2FsTGluayh1cmwpID8gXCJfc2VsZlwiIDogXCJfYmxhbmtcIjtcbiAgICAgICAgICBjb25zdCBuZXdXaW5kb3cgPSB3aW5kb3cub3Blbih1bmRlZmluZWQsIHRhcmdldCk7IC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5naXRodWIuaW8vcmVsLW5vb3BlbmVyL1xuXG4gICAgICAgICAgaWYgKG5ld1dpbmRvdykge1xuICAgICAgICAgICAgbmV3V2luZG93Lm9wZW5lciA9IG51bGw7XG4gICAgICAgICAgICBuZXdXaW5kb3cubG9jYXRpb24gPSBub3JtYWxpemVMaW5rKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzUG9pbnRlck1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBfdGhpczEzLnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIF90aGlzMTMuc3RhdGUuY3Vyc29yQnV0dG9uKTtcblxuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLmhhcyhldmVudC5wb2ludGVySWQpKSB7XG4gICAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFNjYWxlID0gZ2VzdHVyZS5pbml0aWFsU2NhbGU7XG5cbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAyICYmIGdlc3R1cmUubGFzdENlbnRlciAmJiBpbml0aWFsU2NhbGUgJiYgZ2VzdHVyZS5pbml0aWFsRGlzdGFuY2UpIHtcbiAgICAgIGNvbnN0IGNlbnRlciA9IGdldENlbnRlcihnZXN0dXJlLnBvaW50ZXJzKTtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGNlbnRlci54IC0gZ2VzdHVyZS5sYXN0Q2VudGVyLng7XG4gICAgICBjb25zdCBkZWx0YVkgPSBjZW50ZXIueSAtIGdlc3R1cmUubGFzdENlbnRlci55O1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gY2VudGVyO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBnZXREaXN0YW5jZShBcnJheS5mcm9tKGdlc3R1cmUucG9pbnRlcnMudmFsdWVzKCkpKTtcbiAgICAgIGNvbnN0IHNjYWxlRmFjdG9yID0gX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwiZnJlZWRyYXdcIiAmJiBfdGhpczEzLnN0YXRlLnBlbk1vZGUgPyAxIDogZGlzdGFuY2UgLyBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZTtcbiAgICAgIGNvbnN0IG5leHRab29tID0gc2NhbGVGYWN0b3IgPyBnZXROb3JtYWxpemVkWm9vbShpbml0aWFsU2NhbGUgKiBzY2FsZUZhY3RvcikgOiBfdGhpczEzLnN0YXRlLnpvb20udmFsdWU7XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHpvb21TdGF0ZSA9IGdldFN0YXRlRm9yWm9vbSh7XG4gICAgICAgICAgdmlld3BvcnRYOiBjZW50ZXIueCxcbiAgICAgICAgICB2aWV3cG9ydFk6IGNlbnRlci55LFxuICAgICAgICAgIG5leHRab29tXG4gICAgICAgIH0sIHN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB6b29tOiB6b29tU3RhdGUuem9vbSxcbiAgICAgICAgICBzY3JvbGxYOiB6b29tU3RhdGUuc2Nyb2xsWCArIGRlbHRhWCAvIG5leHRab29tLFxuICAgICAgICAgIHNjcm9sbFk6IHpvb21TdGF0ZS5zY3JvbGxZICsgZGVsdGFZIC8gbmV4dFpvb20sXG4gICAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPSBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9IGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoaXNIb2xkaW5nU3BhY2UgfHwgaXNQYW5uaW5nIHx8IGlzRHJhZ2dpbmdTY3JvbGxCYXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycyA9IGlzT3ZlclNjcm9sbEJhcnMoY3VycmVudFNjcm9sbEJhcnMsIGV2ZW50LmNsaWVudFggLSBfdGhpczEzLnN0YXRlLm9mZnNldExlZnQsIGV2ZW50LmNsaWVudFkgLSBfdGhpczEzLnN0YXRlLm9mZnNldFRvcCk7XG4gICAgY29uc3QgaXNPdmVyU2Nyb2xsQmFyID0gaXNQb2ludGVyT3ZlclNjcm9sbEJhcnMuaXNPdmVyRWl0aGVyO1xuXG4gICAgaWYgKCFfdGhpczEzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCAmJiAhX3RoaXMxMy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIGlmIChpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXMxMy5jYW52YXMsIF90aGlzMTMuc3RhdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNjZW5lUG9pbnRlciA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgY29uc3Qge1xuICAgICAgeDogc2NlbmVQb2ludGVyWCxcbiAgICAgIHk6IHNjZW5lUG9pbnRlcllcbiAgICB9ID0gc2NlbmVQb2ludGVyO1xuXG4gICAgaWYgKF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiYgIV90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuaXNEcmFnZ2luZykge1xuICAgICAgY29uc3QgZWRpdGluZ0xpbmVhckVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50ZXJNb3ZlKGV2ZW50LCBzY2VuZVBvaW50ZXJYLCBzY2VuZVBvaW50ZXJZLCBfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LCBfdGhpczEzLnN0YXRlLmdyaWRTaXplKTtcblxuICAgICAgaWYgKGVkaXRpbmdMaW5lYXJFbGVtZW50ICE9PSBfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIC8vIFNpbmNlIHdlIGFyZSByZWFkaW5nIGZyb20gcHJldmlvdXMgc3RhdGUgd2hpY2ggaXMgbm90IHBvc3NpYmxlIHdpdGhcbiAgICAgICAgLy8gYXV0b21hdGljIGJhdGNoaW5nIGluIFJlYWN0IDE4IGhlbmNlIHVzaW5nIGZsdXNoIHN5bmMgdG8gc3luY2hyb25vdXNseVxuICAgICAgICAvLyB1cGRhdGUgdGhlIHN0YXRlLiBDaGVjayBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNTUwOCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlZGl0aW5nTGluZWFyRWxlbWVudC5sYXN0VW5jb21taXR0ZWRQb2ludCAhPSBudWxsKSB7XG4gICAgICAgIF90aGlzMTMubWF5YmVTdWdnZXN0QmluZGluZ0F0Q3Vyc29yKHNjZW5lUG9pbnRlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzQmluZGluZ0VsZW1lbnRUeXBlKF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlKSkge1xuICAgICAgLy8gSG92ZXJpbmcgd2l0aCBhIHNlbGVjdGVkIHRvb2wgb3IgY3JlYXRpbmcgbmV3IGxpbmVhciBlbGVtZW50IHZpYSBjbGlja1xuICAgICAgLy8gYW5kIHBvaW50XG4gICAgICBjb25zdCB7XG4gICAgICAgIGRyYWdnaW5nRWxlbWVudFxuICAgICAgfSA9IF90aGlzMTMuc3RhdGU7XG5cbiAgICAgIGlmIChpc0JpbmRpbmdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwgZmFsc2UpKSB7XG4gICAgICAgIF90aGlzMTMubWF5YmVTdWdnZXN0QmluZGluZ3NGb3JMaW5lYXJFbGVtZW50QXRDb29yZHMoZHJhZ2dpbmdFbGVtZW50LCBbc2NlbmVQb2ludGVyXSwgX3RoaXMxMy5zdGF0ZS5zdGFydEJvdW5kRWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvcihzY2VuZVBvaW50ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChfdGhpczEzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBtdWx0aUVsZW1lbnRcbiAgICAgIH0gPSBfdGhpczEzLnN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICB4OiByeCxcbiAgICAgICAgeTogcnlcbiAgICAgIH0gPSBtdWx0aUVsZW1lbnQ7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBvaW50cyxcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50XG4gICAgICB9ID0gbXVsdGlFbGVtZW50O1xuICAgICAgY29uc3QgbGFzdFBvaW50ID0gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTtcbiAgICAgIHNldEN1cnNvckZvclNoYXBlKF90aGlzMTMuY2FudmFzLCBfdGhpczEzLnN0YXRlKTtcblxuICAgICAgaWYgKGxhc3RQb2ludCA9PT0gbGFzdENvbW1pdHRlZFBvaW50KSB7XG4gICAgICAgIC8vIGlmIHdlIGhhdmVuJ3QgeWV0IGNyZWF0ZWQgYSB0ZW1wIHBvaW50IGFuZCB3ZSdyZSBiZXlvbmQgY29tbWl0LXpvbmVcbiAgICAgICAgLy8gdGhyZXNob2xkLCBhZGQgYSBwb2ludFxuICAgICAgICBpZiAoZGlzdGFuY2UyZChzY2VuZVBvaW50ZXJYIC0gcngsIHNjZW5lUG9pbnRlclkgLSByeSwgbGFzdFBvaW50WzBdLCBsYXN0UG9pbnRbMV0pID49IExJTkVfQ09ORklSTV9USFJFU0hPTEQpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLCBbc2NlbmVQb2ludGVyWCAtIHJ4LCBzY2VuZVBvaW50ZXJZIC0gcnldXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7IC8vIGluIHRoaXMgYnJhbmNoLCB3ZSdyZSBpbnNpZGUgdGhlIGNvbW1pdCB6b25lLCBhbmQgbm8gdW5jb21taXR0ZWRcbiAgICAgICAgICAvLyBwb2ludCBleGlzdHMuIFRodXMgZG8gbm90aGluZyAoZG9uJ3QgYWRkL3JlbW92ZSBwb2ludHMpLlxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBvaW50cy5sZW5ndGggPiAyICYmIGxhc3RDb21taXR0ZWRQb2ludCAmJiBkaXN0YW5jZTJkKHNjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5LCBsYXN0Q29tbWl0dGVkUG9pbnRbMF0sIGxhc3RDb21taXR0ZWRQb2ludFsxXSkgPCBMSU5FX0NPTkZJUk1fVEhSRVNIT0xEKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBwb2ludHMuc2xpY2UoMCwgLTEpXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoc2NlbmVQb2ludGVyWCwgc2NlbmVQb2ludGVyWSwgX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgICAgIGNvbnN0IFtsYXN0Q29tbWl0dGVkWCwgbGFzdENvbW1pdHRlZFldID0gbXVsdGlFbGVtZW50Py5sYXN0Q29tbWl0dGVkUG9pbnQgPz8gWzAsIDBdO1xuICAgICAgICBsZXQgZHhGcm9tTGFzdENvbW1pdHRlZCA9IGdyaWRYIC0gcnggLSBsYXN0Q29tbWl0dGVkWDtcbiAgICAgICAgbGV0IGR5RnJvbUxhc3RDb21taXR0ZWQgPSBncmlkWSAtIHJ5IC0gbGFzdENvbW1pdHRlZFk7XG5cbiAgICAgICAgaWYgKHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSkge1xuICAgICAgICAgICh7XG4gICAgICAgICAgICB3aWR0aDogZHhGcm9tTGFzdENvbW1pdHRlZCxcbiAgICAgICAgICAgIGhlaWdodDogZHlGcm9tTGFzdENvbW1pdHRlZFxuICAgICAgICAgIH0gPSBnZXRMb2NrZWRMaW5lYXJDdXJzb3JBbGlnblNpemUoIC8vIGFjdHVhbCBjb29yZGluYXRlIG9mIHRoZSBsYXN0IGNvbW1pdHRlZCBwb2ludFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRYICsgcngsIGxhc3RDb21taXR0ZWRZICsgcnksIC8vIGN1cnNvci1ncmlkIGNvb3JkaW5hdGVcbiAgICAgICAgICBncmlkWCwgZ3JpZFkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1BhdGhBTG9vcChwb2ludHMsIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSkpIHtcbiAgICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgICB9IC8vIHVwZGF0ZSBsYXN0IHVuY29tbWl0dGVkIHBvaW50XG5cblxuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cy5zbGljZSgwLCAtMSksIFtsYXN0Q29tbWl0dGVkWCArIGR4RnJvbUxhc3RDb21taXR0ZWQsIGxhc3RDb21taXR0ZWRZICsgZHlGcm9tTGFzdENvbW1pdHRlZF1dXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGFzRGVzZWxlY3RlZEJ1dHRvbiA9IEJvb2xlYW4oZXZlbnQuYnV0dG9ucyk7XG5cbiAgICBpZiAoaGFzRGVzZWxlY3RlZEJ1dHRvbiB8fCBfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJiBfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJ0ZXh0XCIgJiYgX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgIT09IFwiZXJhc2VyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50cyA9IF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCk7XG5cbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgIWlzT3ZlclNjcm9sbEJhciAmJiAhX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgY29uc3QgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlID0gZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKGVsZW1lbnRzLCBfdGhpczEzLnN0YXRlLCBzY2VuZVBvaW50ZXJYLCBzY2VuZVBvaW50ZXJZLCBfdGhpczEzLnN0YXRlLnpvb20sIGV2ZW50LnBvaW50ZXJUeXBlKTtcblxuICAgICAgaWYgKGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAmJiBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZSkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudChlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxICYmICFpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyksIHNjZW5lUG9pbnRlclgsIHNjZW5lUG9pbnRlclksIF90aGlzMTMuc3RhdGUuem9vbSwgZXZlbnQucG9pbnRlclR5cGUpO1xuXG4gICAgICBpZiAodHJhbnNmb3JtSGFuZGxlVHlwZSkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudCh7XG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZVxuICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXRFbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVBvaW50ZXIueCwgc2NlbmVQb2ludGVyLnkpO1xuXG4gICAgX3RoaXMxMy5oaXRMaW5rRWxlbWVudCA9IF90aGlzMTMuZ2V0RWxlbWVudExpbmtBdFBvc2l0aW9uKHNjZW5lUG9pbnRlciwgaGl0RWxlbWVudCk7XG5cbiAgICBpZiAoaXNFcmFzZXJBY3RpdmUoX3RoaXMxMy5zdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMxMy5oaXRMaW5rRWxlbWVudCAmJiAhX3RoaXMxMy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbX3RoaXMxMy5oaXRMaW5rRWxlbWVudC5pZF0pIHtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgICBzaG93SHlwZXJsaW5rVG9vbHRpcChfdGhpczEzLmhpdExpbmtFbGVtZW50LCBfdGhpczEzLnN0YXRlKTtcblxuICAgICAgaWYgKF90aGlzMTMucHJvcHMub25MaW5rSG92ZXIpIHtcbiAgICAgICAgX3RoaXMxMy5wcm9wcy5vbkxpbmtIb3ZlcihfdGhpczEzLmhpdExpbmtFbGVtZW50LCBldmVudCk7XG4gICAgICB9IC8venN2aWN6aWFuXG5cbiAgICB9IGVsc2Uge1xuICAgICAgaGlkZUh5cGVybGlua1Rvb2xpcCgpO1xuXG4gICAgICBpZiAoaGl0RWxlbWVudCAmJiBoaXRFbGVtZW50LmxpbmsgJiYgX3RoaXMxMy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0gJiYgIV90aGlzMTMuY29udGV4dE1lbnVPcGVuICYmICFfdGhpczEzLnN0YXRlLnNob3dIeXBlcmxpbmtQb3B1cCkge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IFwiaW5mb1wiXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBpc1RleHRFbGVtZW50KGhpdEVsZW1lbnQpID8gQ1VSU09SX1RZUEUuVEVYVCA6IENVUlNPUl9UWVBFLkNST1NTSEFJUik7XG4gICAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICB9IGVsc2UgaWYgKGlzT3ZlclNjcm9sbEJhcikge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgICAgfSBlbHNlIGlmIChfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVsZW1lbnQoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQpO1xuXG4gICAgICAgIGlmIChlbGVtZW50ICYmIGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94KGVsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtzY2VuZVBvaW50ZXIueCwgc2NlbmVQb2ludGVyLnldKSkge1xuICAgICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5BVVRPKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICggLy8gaWYgdXNpbmcgY21kL2N0cmwsIHdlJ3JlIG5vdCBkcmFnZ2luZ1xuICAgICAgIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmIChoaXRFbGVtZW50IHx8IF90aGlzMTMuaXNIaXR0aW5nQ29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMoc2NlbmVQb2ludGVyLCBzZWxlY3RlZEVsZW1lbnRzKSkgJiYgIWhpdEVsZW1lbnQ/LmxvY2tlZCkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLk1PVkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5BVVRPKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVFcmFzZXIgPSBmdW5jdGlvbiAoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUsIHNjZW5lUG9pbnRlcikge1xuICAgIGNvbnN0IHVwZGF0ZUVsZW1lbnRJZHMgPSBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQubG9ja2VkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWRzVG9VcGRhdGUucHVzaChlbGVtZW50LmlkKTtcblxuICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlbWVudC5pZF0gJiYgcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGVtZW50LmlkXS5lcmFzZSkge1xuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGVtZW50LmlkXS5lcmFzZSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGVtZW50LmlkXSkge1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlbWVudC5pZF0gPSB7XG4gICAgICAgICAgICBlcmFzZTogdHJ1ZSxcbiAgICAgICAgICAgIG9wYWNpdHk6IGVsZW1lbnQub3BhY2l0eVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBpZHNUb1VwZGF0ZSA9IFtdO1xuICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2UyZChwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCwgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnksIHNjZW5lUG9pbnRlci54LCBzY2VuZVBvaW50ZXIueSk7XG4gICAgY29uc3QgdGhyZXNob2xkID0gMTAgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWU7XG5cbiAgICBjb25zdCBwb2ludCA9IF9vYmplY3RTcHJlYWQoe30sIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcyk7XG5cbiAgICBsZXQgc2FtcGxpbmdJbnRlcnZhbCA9IDA7XG5cbiAgICB3aGlsZSAoc2FtcGxpbmdJbnRlcnZhbCA8PSBkaXN0YW5jZSkge1xuICAgICAgY29uc3QgaGl0RWxlbWVudHMgPSBfdGhpczEzLmdldEVsZW1lbnRzQXRQb3NpdGlvbihwb2ludC54LCBwb2ludC55KTtcblxuICAgICAgdXBkYXRlRWxlbWVudElkcyhoaXRFbGVtZW50cyk7IC8vIEV4aXQgc2luY2Ugd2UgcmVhY2hlZCBjdXJyZW50IHBvaW50XG5cbiAgICAgIGlmIChzYW1wbGluZ0ludGVydmFsID09PSBkaXN0YW5jZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gQ2FsY3VsYXRlIG5leHQgcG9pbnQgaW4gdGhlIGxpbmUgYXQgYSBkaXN0YW5jZSBvZiBzYW1wbGluZyBpbnRlcnZhbFxuXG5cbiAgICAgIHNhbXBsaW5nSW50ZXJ2YWwgPSBNYXRoLm1pbihzYW1wbGluZ0ludGVydmFsICsgdGhyZXNob2xkLCBkaXN0YW5jZSk7XG4gICAgICBjb25zdCBkaXN0YW5jZVJhdGlvID0gc2FtcGxpbmdJbnRlcnZhbCAvIGRpc3RhbmNlO1xuICAgICAgY29uc3QgbmV4dFggPSAoMSAtIGRpc3RhbmNlUmF0aW8pICogcG9pbnQueCArIGRpc3RhbmNlUmF0aW8gKiBzY2VuZVBvaW50ZXIueDtcbiAgICAgIGNvbnN0IG5leHRZID0gKDEgLSBkaXN0YW5jZVJhdGlvKSAqIHBvaW50LnkgKyBkaXN0YW5jZVJhdGlvICogc2NlbmVQb2ludGVyLnk7XG4gICAgICBwb2ludC54ID0gbmV4dFg7XG4gICAgICBwb2ludC55ID0gbmV4dFk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICBjb25zdCBpZCA9IGlzQm91bmRUb0NvbnRhaW5lcihlbGUpICYmIGlkc1RvVXBkYXRlLmluY2x1ZGVzKGVsZS5jb250YWluZXJJZCkgPyBlbGUuY29udGFpbmVySWQgOiBlbGUuaWQ7XG5cbiAgICAgIGlmIChpZHNUb1VwZGF0ZS5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2lkXSAmJiBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2lkXS5lcmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGUsIHtcbiAgICAgICAgICAgICAgb3BhY2l0eTogcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtpZF0ub3BhY2l0eVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGUsIHtcbiAgICAgICAgICAgIG9wYWNpdHk6IEVMRU1FTlRfUkVBRFlfVE9fRVJBU0VfT1BBQ0lUWVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbGU7XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhlbGVtZW50cyk7XG5cbiAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHNjZW5lUG9pbnRlci54O1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gc2NlbmVQb2ludGVyLnk7XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVUb3VjaE1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSB0cnVlO1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBfdGhpczEzLmZvY3VzQ29udGFpbmVyKCk7IC8venN2aWN6aWFuXG4gICAgLy8gcmVtb3ZlIGFueSBhY3RpdmUgc2VsZWN0aW9uIHdoZW4gd2Ugc3RhcnQgdG8gaW50ZXJhY3Qgd2l0aCBjYW52YXNcbiAgICAvLyAobWFpbmx5LCB3ZSBjYXJlIGFib3V0IHJlbW92aW5nIHNlbGVjdGlvbiBvdXRzaWRlIHRoZSBjb21wb25lbnQgd2hpY2hcbiAgICAvLyAgd291bGQgcHJldmVudCBvdXIgY29weSBoYW5kbGluZyBvdGhlcndpc2UpXG5cblxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuXG4gICAgaWYgKHNlbGVjdGlvbj8uYW5jaG9yTm9kZSkge1xuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIH1cblxuICAgIF90aGlzMTMubWF5YmVPcGVuQ29udGV4dE1lbnVBZnRlclBvaW50ZXJEb3duT25Ub3VjaERldmljZXMoZXZlbnQpO1xuXG4gICAgX3RoaXMxMy5tYXliZUNsZWFudXBBZnRlck1pc3NpbmdQb2ludGVyVXAoZXZlbnQpOyAvL2ZpcmVzIG9ubHkgb25jZSwgaWYgcGVuIGlzIGRldGVjdGVkLCBwZW5Nb2RlIGlzIGVuYWJsZWRcbiAgICAvL3RoZSB1c2VyIGNhbiBkaXNhYmxlIHRoaXMgYnkgdG9nZ2xpbmcgdGhlIHBlbk1vZGUgYnV0dG9uXG5cblxuICAgIGlmICghX3RoaXMxMy5zdGF0ZS5wZW5EZXRlY3RlZCAmJiBldmVudC5wb2ludGVyVHlwZSA9PT0gXCJwZW5cIikge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGVuTW9kZTogdHJ1ZSxcbiAgICAgICAgICBwZW5EZXRlY3RlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfdGhpczEzLmRldmljZS5pc1RvdWNoU2NyZWVuICYmIFtcInBlblwiLCBcInRvdWNoXCJdLmluY2x1ZGVzKGV2ZW50LnBvaW50ZXJUeXBlKSkge1xuICAgICAgX3RoaXMxMy5kZXZpY2UgPSB1cGRhdGVPYmplY3QoX3RoaXMxMy5kZXZpY2UsIHtcbiAgICAgICAgaXNUb3VjaFNjcmVlbjogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGlzUGFubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF90aGlzMTMubGFzdFBvaW50ZXJEb3duID0gZXZlbnQ7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIGxhc3RQb2ludGVyRG93bldpdGg6IGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgY3Vyc29yQnV0dG9uOiBcImRvd25cIlxuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcImRvd25cIik7XG5cbiAgICBfdGhpczEzLnVwZGF0ZUdlc3R1cmVPblBvaW50ZXJEb3duKGV2ZW50KTtcblxuICAgIGlmIChfdGhpczEzLmhhbmRsZUNhbnZhc1BhblVzaW5nV2hlZWxPclNwYWNlRHJhZyhldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIG9ubHkgaGFuZGxlIGxlZnQgbW91c2UgYnV0dG9uIG9yIHRvdWNoXG5cblxuICAgIGlmIChldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLk1BSU4gJiYgZXZlbnQuYnV0dG9uICE9PSBQT0lOVEVSX0JVVFRPTi5UT1VDSCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZG9uJ3Qgc2VsZWN0IHdoaWxlIHBhbm5pbmdcblxuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA+IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFN0YXRlIGZvciB0aGUgZHVyYXRpb24gb2YgYSBwb2ludGVyIGludGVyYWN0aW9uLCB3aGljaCBzdGFydHMgd2l0aCBhXG4gICAgLy8gcG9pbnRlckRvd24gZXZlbnQsIGVuZHMgd2l0aCBhIHBvaW50ZXJVcCBldmVudCAob3IgYW5vdGhlciBwb2ludGVyRG93bilcblxuXG4gICAgY29uc3QgcG9pbnRlckRvd25TdGF0ZSA9IF90aGlzMTMuaW5pdGlhbFBvaW50ZXJEb3duU3RhdGUoZXZlbnQpO1xuXG4gICAgaWYgKF90aGlzMTMuaGFuZGxlRHJhZ2dpbmdTY3JvbGxCYXIoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBTaW5jZSBjb250ZXh0IG1lbnUgY2xvc2VzIG9uIHBvaW50ZXIgZG93biBzbyBzZXR0aW5nIHRvIGZhbHNlXG5cblxuICAgIF90aGlzMTMuY29udGV4dE1lbnVPcGVuID0gZmFsc2U7XG5cbiAgICBfdGhpczEzLmNsZWFyU2VsZWN0aW9uSWZOb3RVc2luZ1NlbGVjdGlvbigpO1xuXG4gICAgX3RoaXMxMy51cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUoZXZlbnQpO1xuXG4gICAgaWYgKF90aGlzMTMuaGFuZGxlU2VsZWN0aW9uT25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxvd09uUG9pbnRlckRvd24gPSAhX3RoaXMxMy5zdGF0ZS5wZW5Nb2RlIHx8IGV2ZW50LnBvaW50ZXJUeXBlICE9PSBcInRvdWNoXCIgfHwgX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwic2VsZWN0aW9uXCIgfHwgX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwidGV4dFwiIHx8IF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImltYWdlXCI7XG5cbiAgICBpZiAoIWFsbG93T25Qb2ludGVyRG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgIF90aGlzMTMuaGFuZGxlVGV4dE9uUG9pbnRlckRvd24oZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJhcnJvd1wiIHx8IF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImxpbmVcIikge1xuICAgICAgX3RoaXMxMy5oYW5kbGVMaW5lYXJFbGVtZW50T25Qb2ludGVyRG93bihldmVudCwgX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUsIHBvaW50ZXJEb3duU3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwiaW1hZ2VcIikge1xuICAgICAgLy8gcmVzZXQgaW1hZ2UgcHJldmlldyBvbiBwb2ludGVyZG93blxuICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5DUk9TU0hBSVIpOyAvLyByZXRyaWV2ZSB0aGUgbGF0ZXN0IGVsZW1lbnQgYXMgdGhlIHN0YXRlIG1heSBiZSBzdGFsZVxuXG4gICAgICBjb25zdCBwZW5kaW5nSW1hZ2VFbGVtZW50ID0gX3RoaXMxMy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50SWQgJiYgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50KF90aGlzMTMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudElkKTtcblxuICAgICAgaWYgKCFwZW5kaW5nSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nRWxlbWVudDogcGVuZGluZ0ltYWdlRWxlbWVudCxcbiAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IHBlbmRpbmdJbWFnZUVsZW1lbnQsXG4gICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnRJZDogbnVsbCxcbiAgICAgICAgbXVsdGlFbGVtZW50OiBudWxsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCBfdGhpczEzLnN0YXRlKTtcbiAgICAgIG11dGF0ZUVsZW1lbnQocGVuZGluZ0ltYWdlRWxlbWVudCwge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgIF90aGlzMTMuaGFuZGxlRnJlZURyYXdFbGVtZW50T25Qb2ludGVyRG93bihldmVudCwgX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUsIHBvaW50ZXJEb3duU3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwiY3VzdG9tXCIpIHtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuQVVUTyk7XG4gICAgfSBlbHNlIGlmIChfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJlcmFzZXJcIikge1xuICAgICAgX3RoaXMxMy5jcmVhdGVHZW5lcmljRWxlbWVudE9uUG9pbnRlckRvd24oX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUsIHBvaW50ZXJEb3duU3RhdGUpO1xuICAgIH1cblxuICAgIF90aGlzMTMucHJvcHM/Lm9uUG9pbnRlckRvd24/LihfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wsIHBvaW50ZXJEb3duU3RhdGUpO1xuXG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IF90aGlzMTMub25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJVcCA9IF90aGlzMTMub25Qb2ludGVyVXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpO1xuXG4gICAgY29uc3Qgb25LZXlEb3duID0gX3RoaXMxMy5vbktleURvd25Gcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpO1xuXG4gICAgY29uc3Qgb25LZXlVcCA9IF90aGlzMTMub25LZXlVcEZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBsYXN0UG9pbnRlclVwID0gb25Qb2ludGVyVXA7XG5cbiAgICBpZiAoIV90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgb25Qb2ludGVyVXApO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZRE9XTiwgb25LZXlEb3duKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWVVQLCBvbktleVVwKTtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25Nb3ZlID0gb25Qb2ludGVyTW92ZTtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25VcCA9IG9uUG9pbnRlclVwO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleVVwID0gb25LZXlVcDtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlEb3duID0gb25LZXlEb3duO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJVcCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIF90aGlzMTMubGFzdFBvaW50ZXJVcCA9IGV2ZW50O1xuXG4gICAgaWYgKF90aGlzMTMuZGV2aWNlLmlzVG91Y2hTY3JlZW4pIHtcbiAgICAgIGNvbnN0IHNjZW5lUG9pbnRlciA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcyh7XG4gICAgICAgIGNsaWVudFg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IGV2ZW50LmNsaWVudFlcbiAgICAgIH0sIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVBvaW50ZXIueCwgc2NlbmVQb2ludGVyLnkpO1xuXG4gICAgICBfdGhpczEzLmhpdExpbmtFbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50TGlua0F0UG9zaXRpb24oc2NlbmVQb2ludGVyLCBoaXRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMxMy5oaXRMaW5rRWxlbWVudCAmJiAhX3RoaXMxMy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbX3RoaXMxMy5oaXRMaW5rRWxlbWVudC5pZF0pIHtcbiAgICAgIF90aGlzMTMucmVkaXJlY3RUb0xpbmsoZXZlbnQsIF90aGlzMTMuZGV2aWNlLmlzVG91Y2hTY3JlZW4pO1xuICAgIH1cblxuICAgIF90aGlzMTMucmVtb3ZlUG9pbnRlcihldmVudCk7XG4gIH07XG5cbiAgdGhpcy5tYXliZU9wZW5Db250ZXh0TWVudUFmdGVyUG9pbnRlckRvd25PblRvdWNoRGV2aWNlcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGRlYWwgd2l0aCBvcGVuaW5nIGNvbnRleHQgbWVudSBvbiB0b3VjaCBkZXZpY2VzXG4gICAgaWYgKGV2ZW50LnBvaW50ZXJUeXBlID09PSBcInRvdWNoXCIpIHtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xuXG4gICAgICBpZiAodG91Y2hUaW1lb3V0KSB7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYWxyZWFkeSBhIHRvdWNoVGltZW91dCwgdGhpcyBtZWFucyB0aGF0IHRoZXJlJ3MgYW5vdGhlclxuICAgICAgICAvLyB0b3VjaCBkb3duIGFuZCB3ZSBhcmUgZG9pbmcgYW5vdGhlciB0b3VjaCwgc28gd2Ugc2hvdWxkbid0IG9wZW4gdGhlXG4gICAgICAgIC8vIGNvbnRleHQgbWVudS5cbiAgICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG9wZW4gdGhlIGNvbnRleHQgbWVudSB3aXRoIHRoZSBmaXJzdCB0b3VjaCdzIGNsaWVudFggYW5kIGNsaWVudFlcbiAgICAgICAgLy8gaWYgdGhlIHRvdWNoIGlzIG5vdCBtb3ZpbmdcbiAgICAgICAgdG91Y2hUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRvdWNoVGltZW91dCA9IDA7XG5cbiAgICAgICAgICBpZiAoIWludmFsaWRhdGVDb250ZXh0TWVudSkge1xuICAgICAgICAgICAgX3RoaXMxMy5oYW5kbGVDYW52YXNDb250ZXh0TWVudShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBUT1VDSF9DVFhfTUVOVV9USU1FT1VUKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5yZXNldENvbnRleHRNZW51VGltZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRvdWNoVGltZW91dCk7XG4gICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSBmYWxzZTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZUNhbnZhc1BhblVzaW5nV2hlZWxPclNwYWNlRHJhZyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICghKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA8PSAxICYmIChldmVudC5idXR0b24gPT09IFBPSU5URVJfQlVUVE9OLldIRUVMIHx8IGV2ZW50LmJ1dHRvbiA9PT0gUE9JTlRFUl9CVVRUT04uTUFJTiAmJiBpc0hvbGRpbmdTcGFjZSB8fCBfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkpIHx8IGlzVGV4dEVsZW1lbnQoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc1Bhbm5pbmcgPSB0cnVlO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgbGV0IG5leHRQYXN0ZVByZXZlbnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGlzTGludXggPSAvTGludXgvLnRlc3Qod2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSk7XG4gICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5HUkFCQklORyk7XG4gICAgbGV0IHtcbiAgICAgIGNsaWVudFg6IGxhc3RYLFxuICAgICAgY2xpZW50WTogbGFzdFlcbiAgICB9ID0gZXZlbnQ7XG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IHdpdGhCYXRjaGVkVXBkYXRlc1Rocm90dGxlZChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGxhc3RYIC0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGxhc3RZIC0gZXZlbnQuY2xpZW50WTtcbiAgICAgIGxhc3RYID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGxhc3RZID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIC8qXG4gICAgICAgKiBQcmV2ZW50IHBhc3RlIGV2ZW50IGlmIHdlIG1vdmUgd2hpbGUgbWlkZGxlIGNsaWNraW5nIG9uIExpbnV4LlxuICAgICAgICogU2VlIGlzc3VlICMxMzgzLlxuICAgICAgICovXG5cbiAgICAgIGlmIChpc0xpbnV4ICYmICFuZXh0UGFzdGVQcmV2ZW50ZWQgJiYgKE1hdGguYWJzKGRlbHRhWCkgPiAxIHx8IE1hdGguYWJzKGRlbHRhWSkgPiAxKSkge1xuICAgICAgICBuZXh0UGFzdGVQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAvKiBQcmV2ZW50IHRoZSBuZXh0IHBhc3RlIGV2ZW50ICovXG5cbiAgICAgICAgY29uc3QgcHJldmVudE5leHRQYXN0ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgcHJldmVudE5leHRQYXN0ZSk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qXG4gICAgICAgICAqIFJlZW5hYmxlIG5leHQgcGFzdGUgaW4gY2FzZSBvZiBkaXNhYmxlZCBtaWRkbGUgY2xpY2sgcGFzdGUgZm9yXG4gICAgICAgICAqIGFueSByZWFzb246XG4gICAgICAgICAqIC0gcmlnaHQgY2xpY2sgcGFzdGVcbiAgICAgICAgICogLSBlbXB0eSBjbGlwYm9hcmRcbiAgICAgICAgICovXG5cblxuICAgICAgICBjb25zdCBlbmFibGVOZXh0UGFzdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgZW5hYmxlTmV4dFBhc3RlKTtcbiAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgcHJldmVudE5leHRQYXN0ZSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIGVuYWJsZU5leHRQYXN0ZSk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxYOiBfdGhpczEzLnN0YXRlLnNjcm9sbFggLSBkZWx0YVggLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUsXG4gICAgICAgIHNjcm9sbFk6IF90aGlzMTMuc3RhdGUuc2Nyb2xsWSAtIGRlbHRhWSAvIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgdGVhcmRvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMobGFzdFBvaW50ZXJVcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGxhc3RQb2ludGVyVXAgPSBudWxsO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG5cbiAgICAgIGlmICghaXNIb2xkaW5nU3BhY2UpIHtcbiAgICAgICAgaWYgKF90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5HUkFCKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZShfdGhpczEzLmNhbnZhcywgX3RoaXMxMy5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGN1cnNvckJ1dHRvbjogXCJ1cFwiXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcInVwXCIpO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgdGVhcmRvd24pO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQkxVUiwgdGVhcmRvd24pO1xuICAgICAgb25Qb2ludGVyTW92ZS5mbHVzaCgpO1xuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRlYXJkb3duKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUsIHtcbiAgICAgIHBhc3NpdmU6IHRydWVcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0ZWFyZG93bik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgdGhpcy5jbGVhclNlbGVjdGlvbklmTm90VXNpbmdTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVTZWxlY3Rpb25PblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgaWYgKF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBfdGhpczEzLnN0YXRlKTtcblxuICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmICFfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSA9IGdldEVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZShlbGVtZW50cywgX3RoaXMxMy5zdGF0ZSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgX3RoaXMxMy5zdGF0ZS56b29tLCBldmVudC5wb2ludGVyVHlwZSk7XG5cbiAgICAgICAgaWYgKGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAhPSBudWxsKSB7XG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICByZXNpemluZ0VsZW1lbnQ6IGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZS5lbGVtZW50XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlID0gZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLnRyYW5zZm9ybUhhbmRsZVR5cGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyksIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIF90aGlzMTMuc3RhdGUuem9vbSwgZXZlbnQucG9pbnRlclR5cGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudCh7XG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZTogcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZVxuICAgICAgICB9KSk7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmlzUmVzaXppbmcgPSB0cnVlO1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5vZmZzZXQgPSB0dXBsZVRvQ29vcnMoZ2V0UmVzaXplT2Zmc2V0WFkocG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSwgc2VsZWN0ZWRFbGVtZW50cywgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSkpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkgJiYgc2VsZWN0ZWRFbGVtZW50c1swXS5wb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuYXJyb3dEaXJlY3Rpb24gPSBnZXRSZXNpemVBcnJvd0RpcmVjdGlvbihwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlLCBzZWxlY3RlZEVsZW1lbnRzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCByZXQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50ZXJEb3duKGV2ZW50LCBfdGhpczEzLnN0YXRlLCBmdW5jdGlvbiAoYXBwU3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczEzLnNldFN0YXRlKGFwcFN0YXRlKTtcbiAgICAgICAgICB9LCBfdGhpczEzLmhpc3RvcnksIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luKTtcblxuICAgICAgICAgIGlmIChyZXQuaGl0RWxlbWVudCkge1xuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA9IHJldC5oaXRFbGVtZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZXQuZGlkQWRkUG9pbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBoaXRFbGVtZW50IG1heSBhbHJlYWR5IGJlIHNldCBhYm92ZSwgc28gY2hlY2sgZmlyc3RcblxuXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50ID8/IF90aGlzMTMuZ2V0RWxlbWVudEF0UG9zaXRpb24ocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSk7XG5cbiAgICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgcG9pbnRlciBpcyBoaXR0aW5nIGxpbmsgaWNvblxuICAgICAgICAgIGlmIChpc1BvaW50SGl0dGluZ0xpbmtJY29uKHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55XSwgX3RoaXMxMy5kZXZpY2UuaXNNb2JpbGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0RWxlbWVudEluc2lkZSA9IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94KHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55XSk7XG4gICAgICAgIH0gLy8gRm9yIG92ZXJsYXBwZWQgZWxlbWVudHMgb25lIHBvc2l0aW9uIG1heSBoaXRcbiAgICAgICAgLy8gbXVsdGlwbGUgZWxlbWVudHNcblxuXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmFsbEhpdEVsZW1lbnRzID0gX3RoaXMxMy5nZXRFbGVtZW50c0F0UG9zaXRpb24ocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSk7XG4gICAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuICAgICAgICBjb25zdCBzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMTMuaXNBU2VsZWN0ZWRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoKGhpdEVsZW1lbnQgPT09IG51bGwgfHwgIXNvbWVIaXRFbGVtZW50SXNTZWxlY3RlZCkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cykge1xuICAgICAgICAgIF90aGlzMTMuY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZF06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTsgLy8gSWYgd2UgY2xpY2sgb24gc29tZXRoaW5nXG5cbiAgICAgICAgfSBlbHNlIGlmIChoaXRFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBvbiBDTUQvQ1RSTCwgZHJpbGwgZG93biB0byBoaXQgZWxlbWVudCByZWdhcmRsZXNzIG9mIGdyb3VwcyBldGMuXG4gICAgICAgICAgaWYgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdKSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZWRpdEdyb3VwRm9yU2VsZWN0ZWRFbGVtZW50KHByZXZTdGF0ZSwgaGl0RWxlbWVudCkpLCB7fSwge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiBfdGhpczEzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pOyAvLyBtYXJrIGFzIG5vdCBjb21wbGV0ZWx5IGhhbmRsZWQgc28gYXMgdG8gYWxsb3cgZHJhZ2dpbmcgZXRjLlxuXG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IC8vIGRlc2VsZWN0IGlmIGl0ZW0gaXMgc2VsZWN0ZWRcbiAgICAgICAgICAvLyBpZiBzaGlmdCBpcyBub3QgY2xpY2tlZCwgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZVxuICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQgd2lsbCB0cmlnZ2VyIHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50XG4gICAgICAgICAgLy8gc3RhdGUgb2YgdGhlIGJveFxuXG5cbiAgICAgICAgICBpZiAoIV90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICAvLyBpZiB3ZSBhcmUgY3VycmVudGx5IGVkaXRpbmcgYSBncm91cCwgZXhpdGluZyBlZGl0aW5nIG1vZGUgYW5kIGRlc2VsZWN0IHRoZSBncm91cC5cbiAgICAgICAgICAgIGlmIChfdGhpczEzLnN0YXRlLmVkaXRpbmdHcm91cElkICYmICFpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIF90aGlzMTMuc3RhdGUuZWRpdGluZ0dyb3VwSWQpKSB7XG4gICAgICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IC8vIEFkZCBoaXQgZWxlbWVudCB0byBzZWxlY3Rpb24uIEF0IHRoaXMgcG9pbnQgaWYgd2UncmUgbm90IGhvbGRpbmdcbiAgICAgICAgICAgIC8vIFNISUZUIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGVsZW1lbnQocykgd2VyZSBkZXNlbGVjdGVkIGFib3ZlXG4gICAgICAgICAgICAvLyAobWFrZSBzdXJlIHlvdSB1c2Ugc2V0U3RhdGUgdXBkYXRlciB0byB1c2UgbGF0ZXN0IHN0YXRlKVxuXG5cbiAgICAgICAgICAgIGlmICghc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkICYmICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cykge1xuICAgICAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IGhpdEVsZW1lbnQubGluayA/IFwiaW5mb1wiIDogZmFsc2VcbiAgICAgICAgICAgICAgICB9KSwgX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSk7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiBfdGhpczEzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVUZXh0T25Qb2ludGVyRG93biA9IGZ1bmN0aW9uIChldmVudCwgcG9pbnRlckRvd25TdGF0ZSkge1xuICAgIC8vIGlmIHdlJ3JlIGN1cnJlbnRseSBzdGlsbCBlZGl0aW5nIHRleHQsIGNsaWNraW5nIG91dHNpZGVcbiAgICAvLyBzaG91bGQgb25seSBmaW5hbGl6ZSBpdCwgbm90IGNyZWF0ZSBhbm90aGVyIChpcnJlc3BlY3RpdmVcbiAgICAvLyBvZiBzdGF0ZS5hY3RpdmVUb29sLmxvY2tlZClcbiAgICBpZiAoaXNUZXh0RWxlbWVudChfdGhpczEzLnN0YXRlLmVkaXRpbmdFbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzY2VuZVggPSBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54O1xuICAgIGxldCBzY2VuZVkgPSBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55O1xuXG4gICAgY29uc3QgZWxlbWVudCA9IF90aGlzMTMuZ2V0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVksIHtcbiAgICAgIGluY2x1ZGVCb3VuZFRleHRFbGVtZW50OiB0cnVlXG4gICAgfSk7XG5cbiAgICBjb25zdCBjYW5CaW5kVGV4dCA9IGhhc0JvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICBpZiAoY2FuQmluZFRleHQpIHtcbiAgICAgIHNjZW5lWCA9IGVsZW1lbnQueCArIGVsZW1lbnQud2lkdGggLyAyO1xuICAgICAgc2NlbmVZID0gZWxlbWVudC55ICsgZWxlbWVudC5oZWlnaHQgLyAyO1xuICAgIH1cblxuICAgIF90aGlzMTMuc3RhcnRUZXh0RWRpdGluZyh7XG4gICAgICBzY2VuZVgsXG4gICAgICBzY2VuZVksXG4gICAgICBzaG91bGRCaW5kOiBmYWxzZSxcbiAgICAgIGluc2VydEF0UGFyZW50Q2VudGVyOiAhZXZlbnQuYWx0S2V5XG4gICAgfSk7XG5cbiAgICByZXNldEN1cnNvcihfdGhpczEzLmNhbnZhcyk7XG5cbiAgICBpZiAoIV90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC5sb2NrZWQpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBhY3RpdmVUb29sOiB1cGRhdGVBY3RpdmVUb29sKF90aGlzMTMuc3RhdGUsIHtcbiAgICAgICAgICB0eXBlOiBcInNlbGVjdGlvblwiXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVGcmVlRHJhd0VsZW1lbnRPblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50LCBlbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZSkge1xuICAgIC8vIEJlZ2luIGEgbWFyayBjYXB0dXJlLiBUaGlzIGRvZXMgbm90IGhhdmUgdG8gdXBkYXRlIHN0YXRlIHlldC5cbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBudWxsKTtcbiAgICBjb25zdCBlbGVtZW50ID0gbmV3RnJlZURyYXdFbGVtZW50KHtcbiAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgeDogZ3JpZFgsXG4gICAgICB5OiBncmlkWSxcbiAgICAgIHN0cm9rZUNvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgc2ltdWxhdGVQcmVzc3VyZTogZXZlbnQucHJlc3N1cmUgPT09IDAuNSxcbiAgICAgIGxvY2tlZDogZmFsc2VcbiAgICB9KTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgIFtlbGVtZW50LmlkXTogZmFsc2VcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcmVzc3VyZXMgPSBlbGVtZW50LnNpbXVsYXRlUHJlc3N1cmUgPyBlbGVtZW50LnByZXNzdXJlcyA6IFsuLi5lbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgcG9pbnRzOiBbWzAsIDBdXSxcbiAgICAgIHByZXNzdXJlc1xuICAgIH0pO1xuICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhwb2ludGVyRG93blN0YXRlLm9yaWdpbiwgX3RoaXMxMy5zY2VuZSk7XG5cbiAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgZWxlbWVudF0pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIHN0YXJ0Qm91bmRFbGVtZW50OiBib3VuZEVsZW1lbnQsXG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLmNyZWF0ZUltYWdlRWxlbWVudCA9IGZ1bmN0aW9uIChfcmVmOSkge1xuICAgIGxldCB7XG4gICAgICBzY2VuZVgsXG4gICAgICBzY2VuZVlcbiAgICB9ID0gX3JlZjk7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoc2NlbmVYLCBzY2VuZVksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdJbWFnZUVsZW1lbnQoe1xuICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgeDogZ3JpZFgsXG4gICAgICB5OiBncmlkWSxcbiAgICAgIHN0cm9rZUNvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgbG9ja2VkOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlTGluZWFyRWxlbWVudE9uUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXZlbnQsIGVsZW1lbnRUeXBlLCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgaWYgKF90aGlzMTMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG11bHRpRWxlbWVudFxuICAgICAgfSA9IF90aGlzMTMuc3RhdGU7IC8vIGZpbmFsaXplIGlmIGNvbXBsZXRpbmcgYSBsb29wXG5cbiAgICAgIGlmIChtdWx0aUVsZW1lbnQudHlwZSA9PT0gXCJsaW5lXCIgJiYgaXNQYXRoQUxvb3AobXVsdGlFbGVtZW50LnBvaW50cywgX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlKSkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDogbXVsdGlFbGVtZW50LnBvaW50c1ttdWx0aUVsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDFdXG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMTMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeDogcngsXG4gICAgICAgIHk6IHJ5LFxuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnRcbiAgICAgIH0gPSBtdWx0aUVsZW1lbnQ7IC8vIGNsaWNraW5nIGluc2lkZSBjb21taXQgem9uZSDihpIgZmluYWxpemUgYXJyb3dcblxuICAgICAgaWYgKG11bHRpRWxlbWVudC5wb2ludHMubGVuZ3RoID4gMSAmJiBsYXN0Q29tbWl0dGVkUG9pbnQgJiYgZGlzdGFuY2UyZChwb2ludGVyRG93blN0YXRlLm9yaWdpbi54IC0gcngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkgLSByeSwgbGFzdENvbW1pdHRlZFBvaW50WzBdLCBsYXN0Q29tbWl0dGVkUG9pbnRbMV0pIDwgTElORV9DT05GSVJNX1RIUkVTSE9MRCkge1xuICAgICAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICBbbXVsdGlFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICB9KTsgLy8gY2xpY2tpbmcgb3V0c2lkZSBjb21taXQgem9uZSDihpIgdXBkYXRlIHJlZmVyZW5jZSBmb3IgbGFzdCBjb21taXR0ZWRcbiAgICAgIC8vIHBvaW50XG5cblxuICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBtdWx0aUVsZW1lbnQucG9pbnRzW211bHRpRWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV1cbiAgICAgIH0pO1xuICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgICAvKiBJZiBhcnJvdyBpcyBwcmUtYXJyb3doZWFkcywgaXQgd2lsbCBoYXZlIHVuZGVmaW5lZCBmb3IgYm90aCBzdGFydCBhbmQgZW5kIGFycm93aGVhZHMuXG4gICAgICBJZiBzbywgd2Ugd2FudCBpdCB0byBiZSBudWxsIGZvciBzdGFydCBhbmQgXCJhcnJvd1wiIGZvciBlbmQuIElmIHRoZSBsaW5lYXIgaXRlbSBpcyBub3RcbiAgICAgIGFuIGFycm93LCB3ZSB3YW50IGl0IHRvIGJlIG51bGwgZm9yIGJvdGguIE90aGVyd2lzZSwgd2Ugd2FudCBpdCB0byB1c2UgdGhlXG4gICAgICB2YWx1ZXMgZnJvbSBhcHBTdGF0ZS4gKi9cblxuICAgICAgY29uc3Qge1xuICAgICAgICBjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLFxuICAgICAgICBjdXJyZW50SXRlbUVuZEFycm93aGVhZFxuICAgICAgfSA9IF90aGlzMTMuc3RhdGU7XG4gICAgICBjb25zdCBbc3RhcnRBcnJvd2hlYWQsIGVuZEFycm93aGVhZF0gPSBlbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiID8gW2N1cnJlbnRJdGVtU3RhcnRBcnJvd2hlYWQsIGN1cnJlbnRJdGVtRW5kQXJyb3doZWFkXSA6IFtudWxsLCBudWxsXTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdMaW5lYXJFbGVtZW50KHtcbiAgICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIHg6IGdyaWRYLFxuICAgICAgICB5OiBncmlkWSxcbiAgICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgICBmaWxsU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICAgIHN0cm9rZVdpZHRoOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICAgIHN0cm9rZVN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICAgIHJvdWdobmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgICAgb3BhY2l0eTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICAgIHN0cm9rZVNoYXJwbmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgICAgc3RhcnRBcnJvd2hlYWQsXG4gICAgICAgIGVuZEFycm93aGVhZCxcbiAgICAgICAgbG9ja2VkOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgIFtlbGVtZW50LmlkXTogZmFsc2VcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICBwb2ludHM6IFsuLi5lbGVtZW50LnBvaW50cywgWzAsIDBdXVxuICAgICAgfSk7XG4gICAgICBjb25zdCBib3VuZEVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4sIF90aGlzMTMuc2NlbmUpO1xuXG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgZWxlbWVudF0pO1xuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgc3RhcnRCb3VuZEVsZW1lbnQ6IGJvdW5kRWxlbWVudCxcbiAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5jcmVhdGVHZW5lcmljRWxlbWVudE9uUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZWxlbWVudFR5cGUsIHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBfdGhpczEzLnN0YXRlLmdyaWRTaXplKTtcbiAgICBjb25zdCBlbGVtZW50ID0gbmV3RWxlbWVudCh7XG4gICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIGxvY2tlZDogZmFsc2VcbiAgICB9KTtcblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3Rpb25FbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgZWxlbWVudF0pO1xuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgbXVsdGlFbGVtZW50OiBudWxsLFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5yZXN0b3JlUmVhZHlUb0VyYXNlRWxlbWVudHMgPSBmdW5jdGlvbiAocG9pbnRlckRvd25TdGF0ZSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5tYXAoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmlkXSAmJiBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZS5pZF0uZXJhc2UpIHtcbiAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKGVsZSwge1xuICAgICAgICAgIG9wYWNpdHk6IHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmlkXS5vcGFjaXR5XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChpc0JvdW5kVG9Db250YWluZXIoZWxlKSAmJiBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZS5jb250YWluZXJJZF0gJiYgcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGUuY29udGFpbmVySWRdLmVyYXNlKSB7XG4gICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGUsIHtcbiAgICAgICAgICBvcGFjaXR5OiBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZS5jb250YWluZXJJZF0ub3BhY2l0eVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVsZTtcbiAgICB9KTtcblxuICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgfTtcblxuICB0aGlzLmVyYXNlRWxlbWVudHMgPSBmdW5jdGlvbiAocG9pbnRlckRvd25TdGF0ZSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5tYXAoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmlkXSAmJiBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZS5pZF0uZXJhc2UpIHtcbiAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKGVsZSwge1xuICAgICAgICAgIGlzRGVsZXRlZDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNCb3VuZFRvQ29udGFpbmVyKGVsZSkgJiYgcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGUuY29udGFpbmVySWRdICYmIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmNvbnRhaW5lcklkXS5lcmFzZSkge1xuICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7XG4gICAgICAgICAgaXNEZWxldGVkOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWxlO1xuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuXG4gICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoZWxlbWVudHMpO1xuICB9O1xuXG4gIHRoaXMuaW5pdGlhbGl6ZUltYWdlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjEwID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChfcmVmMTEpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIGltYWdlRmlsZSxcbiAgICAgICAgaW1hZ2VFbGVtZW50OiBfaW1hZ2VFbGVtZW50LFxuICAgICAgICBzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3ID0gZmFsc2VcbiAgICAgIH0gPSBfcmVmMTE7XG5cbiAgICAgIC8vIGF0IHRoaXMgcG9pbnQgdGhpcyBzaG91bGQgYmUgZ3VhcmFudGVlZCBpbWFnZSBmaWxlLCBidXQgd2UgZG8gdGhpcyBjaGVja1xuICAgICAgLy8gdG8gc2F0aXNmeSBUUyBkb3duIHRoZSBsaW5lXG4gICAgICBpZiAoIWlzU3VwcG9ydGVkSW1hZ2VGaWxlKGltYWdlRmlsZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQoXCJlcnJvcnMudW5zdXBwb3J0ZWRGaWxlVHlwZVwiKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1pbWVUeXBlID0gaW1hZ2VGaWxlLnR5cGU7XG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIFwid2FpdFwiKTtcblxuICAgICAgaWYgKG1pbWVUeXBlID09PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGltYWdlRmlsZSA9IFNWR1N0cmluZ1RvRmlsZSh5aWVsZCBub3JtYWxpemVTVkcoeWllbGQgaW1hZ2VGaWxlLnRleHQoKSksIGltYWdlRmlsZS5uYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcih0KFwiZXJyb3JzLnN2Z0ltYWdlSW5zZXJ0RXJyb3JcIikpO1xuICAgICAgICB9XG4gICAgICB9IC8vIGdlbmVyYXRlIGltYWdlIGlkIChieSBkZWZhdWx0IHRoZSBmaWxlIGRpZ2VzdCkgYmVmb3JlIGFueVxuICAgICAgLy8gcmVzaXppbmcvY29tcHJlc3Npb24gdGFrZXMgcGxhY2UgdG8ga2VlcCBpdCBtb3JlIHBvcnRhYmxlXG5cblxuICAgICAgY29uc3QgZmlsZUlkID0geWllbGQgX3RoaXMxMy5wcm9wcy5nZW5lcmF0ZUlkRm9yRmlsZT8uKGltYWdlRmlsZSkgfHwgZ2VuZXJhdGVJZEZyb21GaWxlKGltYWdlRmlsZSk7XG5cbiAgICAgIGlmICghZmlsZUlkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkNvdWxkbid0IGdlbmVyYXRlIGZpbGUgaWQgb3IgdGhlIHN1cHBsaWVkIGBnZW5lcmF0ZUlkRm9yRmlsZWAgZGlkbid0IHJlc29sdmUgdG8gb25lLlwiKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQoXCJlcnJvcnMuaW1hZ2VJbnNlcnRFcnJvclwiKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZURhdGEgPSBfdGhpczEzLmZpbGVzW2ZpbGVJZF07XG5cbiAgICAgIGlmICghZXhpc3RpbmdGaWxlRGF0YT8uZGF0YVVSTCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGltYWdlRmlsZSA9IHlpZWxkIHJlc2l6ZUltYWdlRmlsZShpbWFnZUZpbGUsIHtcbiAgICAgICAgICAgIG1heFdpZHRoT3JIZWlnaHQ6IERFRkFVTFRfTUFYX0lNQUdFX1dJRFRIX09SX0hFSUdIVFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciB0cnlpbmcgdG8gcmVzaW5nIGltYWdlIGZpbGUgb24gaW5zZXJ0aW9uXCIsIGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbWFnZUZpbGUuc2l6ZSA+IE1BWF9BTExPV0VEX0ZJTEVfQllURVMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy5maWxlVG9vQmlnXCIsIHtcbiAgICAgICAgICAgIG1heFNpemU6IGAke01hdGgudHJ1bmMoTUFYX0FMTE9XRURfRklMRV9CWVRFUyAvIDEwMjQgLyAxMDI0KX1NQmBcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3dDdXJzb3JJbWFnZVByZXZpZXcpIHtcbiAgICAgICAgY29uc3QgZGF0YVVSTCA9IF90aGlzMTMuZmlsZXNbZmlsZUlkXT8uZGF0YVVSTDsgLy8gb3B0aW1pemF0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgdW5uZWNlc3NhcmlseSByZXNpemUgdGhlIG9yaWdpbmFsXG4gICAgICAgIC8vIGZ1bGwtc2l6ZSBmaWxlIGZvciBjdXJzb3IgcHJldmlld1xuICAgICAgICAvLyAoaXQncyBtdWNoIGZhc3RlciB0byBjb252ZXJ0IHRoZSByZXNpemVkIGRhdGFVUkwgdG8gRmlsZSlcblxuICAgICAgICBjb25zdCByZXNpemVkRmlsZSA9IGRhdGFVUkwgJiYgZGF0YVVSTFRvRmlsZShkYXRhVVJMKTtcblxuICAgICAgICBfdGhpczEzLnNldEltYWdlUHJldmlld0N1cnNvcihyZXNpemVkRmlsZSB8fCBpbWFnZUZpbGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhVVJMID0gX3RoaXMxMy5maWxlc1tmaWxlSWRdPy5kYXRhVVJMIHx8ICh5aWVsZCBnZXREYXRhVVJMKGltYWdlRmlsZSkpO1xuICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gbXV0YXRlRWxlbWVudChfaW1hZ2VFbGVtZW50LCB7XG4gICAgICAgIGZpbGVJZFxuICAgICAgfSwgZmFsc2UpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3JlZjEyID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgX3RoaXMxMy5maWxlcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMxMy5maWxlcyksIHt9LCB7XG4gICAgICAgICAgICAgIFtmaWxlSWRdOiB7XG4gICAgICAgICAgICAgICAgbWltZVR5cGUsXG4gICAgICAgICAgICAgICAgaWQ6IGZpbGVJZCxcbiAgICAgICAgICAgICAgICBkYXRhVVJMLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWQ6IERhdGUubm93KClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZEltYWdlRGF0YSA9IF90aGlzMTMuaW1hZ2VDYWNoZS5nZXQoZmlsZUlkKTtcblxuICAgICAgICAgICAgaWYgKCFjYWNoZWRJbWFnZURhdGEpIHtcbiAgICAgICAgICAgICAgX3RoaXMxMy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcblxuICAgICAgICAgICAgICB5aWVsZCBfdGhpczEzLnVwZGF0ZUltYWdlQ2FjaGUoW2ltYWdlRWxlbWVudF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2FjaGVkSW1hZ2VEYXRhPy5pbWFnZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgeWllbGQgY2FjaGVkSW1hZ2VEYXRhLmltYWdlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50SWQgIT09IGltYWdlRWxlbWVudC5pZCAmJiBfdGhpczEzLnN0YXRlLmRyYWdnaW5nRWxlbWVudD8uaWQgIT09IGltYWdlRWxlbWVudC5pZCkge1xuICAgICAgICAgICAgICBfdGhpczEzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZShpbWFnZUVsZW1lbnQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpKSk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICghc2hvd0N1cnNvckltYWdlUHJldmlldykge1xuICAgICAgICAgICAgICByZXNldEN1cnNvcihfdGhpczEzLmNhbnZhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF94NCwgX3g1KSB7XG4gICAgICAgICAgcmV0dXJuIF9yZWYxMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSgpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoX3gzKSB7XG4gICAgICByZXR1cm4gX3JlZjEwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSgpO1xuXG4gIHRoaXMuaW5zZXJ0SW1hZ2VFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjEzID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChpbWFnZUVsZW1lbnQsIGltYWdlRmlsZSwgc2hvd0N1cnNvckltYWdlUHJldmlldykge1xuICAgICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoWy4uLl90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIGltYWdlRWxlbWVudF0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICB5aWVsZCBfdGhpczEzLmluaXRpYWxpemVJbWFnZSh7XG4gICAgICAgICAgaW1hZ2VGaWxlLFxuICAgICAgICAgIGltYWdlRWxlbWVudCxcbiAgICAgICAgICBzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChpbWFnZUVsZW1lbnQsIHtcbiAgICAgICAgICBpc0RlbGV0ZWQ6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZSB8fCB0KFwiZXJyb3JzLmltYWdlSW5zZXJ0RXJyb3JcIilcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94NiwgX3g3LCBfeDgpIHtcbiAgICAgIHJldHVybiBfcmVmMTMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5zZXRJbWFnZVByZXZpZXdDdXJzb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTQgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGltYWdlRmlsZSkge1xuICAgICAgLy8gbXVzdG4ndCBiZSBsYXJnZXIgdGhhbiAxMjggcHhcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfQmFzaWNfVXNlcl9JbnRlcmZhY2UvVXNpbmdfVVJMX3ZhbHVlc19mb3JfdGhlX2N1cnNvcl9wcm9wZXJ0eVxuICAgICAgY29uc3QgY3Vyc29ySW1hZ2VTaXplUHggPSA5NjtcbiAgICAgIGNvbnN0IGltYWdlUHJldmlldyA9IHlpZWxkIHJlc2l6ZUltYWdlRmlsZShpbWFnZUZpbGUsIHtcbiAgICAgICAgbWF4V2lkdGhPckhlaWdodDogY3Vyc29ySW1hZ2VTaXplUHhcbiAgICAgIH0pO1xuICAgICAgbGV0IHByZXZpZXdEYXRhVVJMID0geWllbGQgZ2V0RGF0YVVSTChpbWFnZVByZXZpZXcpOyAvLyBTVkcgY2Fubm90IGJlIHJlc2l6ZWQgdmlhIGByZXNpemVJbWFnZUZpbGVgIHNvIHdlIHJlc2l6ZSBieSByZW5kZXJpbmcgdG9cbiAgICAgIC8vIGEgc21hbGwgY2FudmFzXG5cbiAgICAgIGlmIChpbWFnZUZpbGUudHlwZSA9PT0gTUlNRV9UWVBFUy5zdmcpIHtcbiAgICAgICAgY29uc3QgaW1nID0geWllbGQgbG9hZEhUTUxJbWFnZUVsZW1lbnQocHJldmlld0RhdGFVUkwpO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gTWF0aC5taW4oaW1nLmhlaWdodCwgY3Vyc29ySW1hZ2VTaXplUHgpO1xuICAgICAgICBsZXQgd2lkdGggPSBoZWlnaHQgKiAoaW1nLndpZHRoIC8gaW1nLmhlaWdodCk7XG5cbiAgICAgICAgaWYgKHdpZHRoID4gY3Vyc29ySW1hZ2VTaXplUHgpIHtcbiAgICAgICAgICB3aWR0aCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgICAgICAgIGhlaWdodCA9IHdpZHRoICogKGltZy5oZWlnaHQgLyBpbWcud2lkdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBwcmV2aWV3RGF0YVVSTCA9IGNhbnZhcy50b0RhdGFVUkwoTUlNRV9UWVBFUy5zdmcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50SWQpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBgdXJsKCR7cHJldmlld0RhdGFVUkx9KSA0IDQsIGF1dG9gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoX3g5KSB7XG4gICAgICByZXR1cm4gX3JlZjE0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSgpO1xuXG4gIHRoaXMub25JbWFnZUFjdGlvbiA9IC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgIGxldCB7XG4gICAgICBpbnNlcnRPbkNhbnZhc0RpcmVjdGx5XG4gICAgfSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge1xuICAgICAgaW5zZXJ0T25DYW52YXNEaXJlY3RseTogZmFsc2VcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaWVudFggPSBfdGhpczEzLnN0YXRlLndpZHRoIC8gMiArIF90aGlzMTMuc3RhdGUub2Zmc2V0TGVmdDtcbiAgICAgIGNvbnN0IGNsaWVudFkgPSBfdGhpczEzLnN0YXRlLmhlaWdodCAvIDIgKyBfdGhpczEzLnN0YXRlLm9mZnNldFRvcDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcyh7XG4gICAgICAgIGNsaWVudFgsXG4gICAgICAgIGNsaWVudFlcbiAgICAgIH0sIF90aGlzMTMuc3RhdGUpO1xuICAgICAgY29uc3QgaW1hZ2VGaWxlID0geWllbGQgZmlsZU9wZW4oe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJJbWFnZVwiLFxuICAgICAgICBleHRlbnNpb25zOiBbXCJqcGdcIiwgXCJwbmdcIiwgXCJzdmdcIiwgXCJnaWZcIl1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBfdGhpczEzLmNyZWF0ZUltYWdlRWxlbWVudCh7XG4gICAgICAgIHNjZW5lWDogeCxcbiAgICAgICAgc2NlbmVZOiB5XG4gICAgICB9KTtcblxuICAgICAgaWYgKGluc2VydE9uQ2FudmFzRGlyZWN0bHkpIHtcbiAgICAgICAgX3RoaXMxMy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBpbWFnZUZpbGUpO1xuXG4gICAgICAgIF90aGlzMTMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgW2ltYWdlRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcGVuZGluZ0ltYWdlRWxlbWVudElkOiBpbWFnZUVsZW1lbnQuaWRcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMTMuaW5zZXJ0SW1hZ2VFbGVtZW50KGltYWdlRWxlbWVudCwgaW1hZ2VGaWxlLFxuICAgICAgICAgIC8qIHNob3dDdXJzb3JJbWFnZVByZXZpZXcgKi9cbiAgICAgICAgICB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5uYW1lICE9PSBcIkFib3J0RXJyb3JcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBwZW5kaW5nSW1hZ2VFbGVtZW50SWQ6IG51bGwsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICBhY3RpdmVUb29sOiB1cGRhdGVBY3RpdmVUb29sKF90aGlzMTMuc3RhdGUsIHtcbiAgICAgICAgICB0eXBlOiBcInNlbGVjdGlvblwiXG4gICAgICAgIH0pXG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMTMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zID0gZnVuY3Rpb24gKGltYWdlRWxlbWVudCkge1xuICAgIGxldCBmb3JjZU5hdHVyYWxTaXplID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICBjb25zdCBpbWFnZSA9IGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50KSAmJiBfdGhpczEzLmltYWdlQ2FjaGUuZ2V0KGltYWdlRWxlbWVudC5maWxlSWQpPy5pbWFnZTtcblxuICAgIGlmICghaW1hZ2UgfHwgaW1hZ2UgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICBpZiAoaW1hZ2VFbGVtZW50LndpZHRoIDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlICYmIGltYWdlRWxlbWVudC5oZWlnaHQgPCBEUkFHR0lOR19USFJFU0hPTEQgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUpIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJTaXplID0gMTAwIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlO1xuICAgICAgICBtdXRhdGVFbGVtZW50KGltYWdlRWxlbWVudCwge1xuICAgICAgICAgIHg6IGltYWdlRWxlbWVudC54IC0gcGxhY2Vob2xkZXJTaXplIC8gMixcbiAgICAgICAgICB5OiBpbWFnZUVsZW1lbnQueSAtIHBsYWNlaG9sZGVyU2l6ZSAvIDIsXG4gICAgICAgICAgd2lkdGg6IHBsYWNlaG9sZGVyU2l6ZSxcbiAgICAgICAgICBoZWlnaHQ6IHBsYWNlaG9sZGVyU2l6ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmb3JjZU5hdHVyYWxTaXplIHx8IC8vIGlmIHVzZXItY3JlYXRlZCBib3VuZGluZyBib3ggaXMgYmVsb3cgdGhyZXNob2xkLCBhc3N1bWUgdGhlXG4gICAgLy8gaW50ZW50aW9uIHdhcyB0byBjbGljayBpbnN0ZWFkIG9mIGRyYWcsIGFuZCB1c2UgdGhlIGltYWdlJ3NcbiAgICAvLyBpbnRyaW5zaWMgc2l6ZVxuICAgIGltYWdlRWxlbWVudC53aWR0aCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSAmJiBpbWFnZUVsZW1lbnQuaGVpZ2h0IDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlKSB7XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPSBNYXRoLm1heChfdGhpczEzLnN0YXRlLmhlaWdodCAtIDEyMCwgMTYwKTsgLy8gbWF4IDY1JSBvZiBjYW52YXMgaGVpZ2h0LCBjbGFtcGVkIHRvIDwzMDBweCwgdmggLSAxMjBweD5cblxuICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5taW4obWluSGVpZ2h0LCBNYXRoLmZsb29yKF90aGlzMTMuc3RhdGUuaGVpZ2h0ICogMC41KSAvIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSk7XG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1pbihpbWFnZS5uYXR1cmFsSGVpZ2h0LCBtYXhIZWlnaHQpO1xuICAgICAgY29uc3Qgd2lkdGggPSBoZWlnaHQgKiAoaW1hZ2UubmF0dXJhbFdpZHRoIC8gaW1hZ2UubmF0dXJhbEhlaWdodCk7IC8vIGFkZCBjdXJyZW50IGltYWdlRWxlbWVudCB3aWR0aC9oZWlnaHQgdG8gYWNjb3VudCBmb3IgcHJldmlvdXMgY2VudGVyaW5nXG4gICAgICAvLyBvZiB0aGUgcGxhY2Vob2xkZXIgaW1hZ2VcblxuICAgICAgY29uc3QgeCA9IGltYWdlRWxlbWVudC54ICsgaW1hZ2VFbGVtZW50LndpZHRoIC8gMiAtIHdpZHRoIC8gMjtcbiAgICAgIGNvbnN0IHkgPSBpbWFnZUVsZW1lbnQueSArIGltYWdlRWxlbWVudC5oZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMjtcbiAgICAgIG11dGF0ZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnVwZGF0ZUltYWdlQ2FjaGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGVsZW1lbnRzKSB7XG4gICAgICBsZXQgZmlsZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IF90aGlzMTMuZmlsZXM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHVwZGF0ZWRGaWxlcyxcbiAgICAgICAgZXJyb3JlZEZpbGVzXG4gICAgICB9ID0geWllbGQgX3VwZGF0ZUltYWdlQ2FjaGUoe1xuICAgICAgICBpbWFnZUNhY2hlOiBfdGhpczEzLmltYWdlQ2FjaGUsXG4gICAgICAgIGZpbGVJZHM6IGVsZW1lbnRzLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50LmZpbGVJZDtcbiAgICAgICAgfSksXG4gICAgICAgIGZpbGVzXG4gICAgICB9KTtcblxuICAgICAgaWYgKHVwZGF0ZWRGaWxlcy5zaXplIHx8IGVycm9yZWRGaWxlcy5zaXplKSB7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICAgIGlmICh1cGRhdGVkRmlsZXMuaGFzKGVsZW1lbnQuZmlsZUlkKSkge1xuICAgICAgICAgICAgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGVycm9yZWRGaWxlcy5zaXplKSB7XG4gICAgICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgaWYgKGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudCkgJiYgZXJyb3JlZEZpbGVzLmhhcyhlbGVtZW50LmZpbGVJZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGVtZW50LCB7XG4gICAgICAgICAgICAgIHN0YXR1czogXCJlcnJvclwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB1cGRhdGVkRmlsZXMsXG4gICAgICAgIGVycm9yZWRGaWxlc1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoX3gxMCkge1xuICAgICAgcmV0dXJuIF9yZWYxNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSA9IC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgIGxldCBpbWFnZUVsZW1lbnRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSk7XG4gICAgbGV0IGZpbGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBfdGhpczEzLmZpbGVzO1xuICAgIGNvbnN0IHVuY2FjaGVkSW1hZ2VFbGVtZW50cyA9IGltYWdlRWxlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gIWVsZW1lbnQuaXNEZWxldGVkICYmICFfdGhpczEzLmltYWdlQ2FjaGUuaGFzKGVsZW1lbnQuZmlsZUlkKTtcbiAgICB9KTtcblxuICAgIGlmICh1bmNhY2hlZEltYWdlRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHVwZGF0ZWRGaWxlc1xuICAgICAgfSA9IHlpZWxkIF90aGlzMTMudXBkYXRlSW1hZ2VDYWNoZSh1bmNhY2hlZEltYWdlRWxlbWVudHMsIGZpbGVzKTtcblxuICAgICAgaWYgKHVwZGF0ZWRGaWxlcy5zaXplKSB7XG4gICAgICAgIF90aGlzMTMuc2NlbmUuaW5mb3JtTXV0YXRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB0aGlzLnNjaGVkdWxlSW1hZ2VSZWZyZXNoID0gdGhyb3R0bGUoZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gIH0sIElNQUdFX1JFTkRFUl9USU1FT1VUKTtcblxuICB0aGlzLnVwZGF0ZUJpbmRpbmdFbmFibGVkT25Qb2ludGVyTW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IHNob3VsZEVuYWJsZUJpbmRpbmcgPSBzaG91bGRFbmFibGVCaW5kaW5nRm9yUG9pbnRlckV2ZW50KGV2ZW50KTtcblxuICAgIGlmIChfdGhpczEzLnN0YXRlLmlzQmluZGluZ0VuYWJsZWQgIT09IHNob3VsZEVuYWJsZUJpbmRpbmcpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBpc0JpbmRpbmdFbmFibGVkOiBzaG91bGRFbmFibGVCaW5kaW5nXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nQXRDdXJzb3IgPSBmdW5jdGlvbiAocG9pbnRlckNvb3Jkcykge1xuICAgIGNvbnN0IGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcocG9pbnRlckNvb3JkcywgX3RoaXMxMy5zY2VuZSk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBob3ZlcmVkQmluZGFibGVFbGVtZW50ICE9IG51bGwgPyBbaG92ZXJlZEJpbmRhYmxlRWxlbWVudF0gOiBbXVxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ3NGb3JMaW5lYXJFbGVtZW50QXRDb29yZHMgPSBmdW5jdGlvbiAobGluZWFyRWxlbWVudCwgcG9pbnRlckNvb3Jkcywgb3Bwb3NpdGVCaW5kaW5nQm91bmRFbGVtZW50KSB7XG4gICAgaWYgKCFwb2ludGVyQ29vcmRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN1Z2dlc3RlZEJpbmRpbmdzID0gcG9pbnRlckNvb3Jkcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgY29vcmRzKSB7XG4gICAgICBjb25zdCBob3ZlcmVkQmluZGFibGVFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKGNvb3JkcywgX3RoaXMxMy5zY2VuZSk7XG5cbiAgICAgIGlmIChob3ZlcmVkQmluZGFibGVFbGVtZW50ICE9IG51bGwgJiYgIWlzTGluZWFyRWxlbWVudFNpbXBsZUFuZEFscmVhZHlCb3VuZChsaW5lYXJFbGVtZW50LCBvcHBvc2l0ZUJpbmRpbmdCb3VuZEVsZW1lbnQ/LmlkLCBob3ZlcmVkQmluZGFibGVFbGVtZW50KSkge1xuICAgICAgICBhY2MucHVzaChob3ZlcmVkQmluZGFibGVFbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzXG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVDYW52YXNSZWYgPSBmdW5jdGlvbiAoY2FudmFzKSB7XG4gICAgLy8gY2FudmFzIGlzIG51bGwgd2hlbiB1bm1vdW50aW5nXG4gICAgaWYgKGNhbnZhcyAhPT0gbnVsbCkge1xuICAgICAgX3RoaXMxMy5jYW52YXMgPSBjYW52YXM7XG4gICAgICBfdGhpczEzLnJjID0gcm91Z2guY2FudmFzKF90aGlzMTMuY2FudmFzKTtcblxuICAgICAgX3RoaXMxMy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5XSEVFTCwgX3RoaXMxMy5oYW5kbGVXaGVlbCwge1xuICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzMTMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfU1RBUlQsIF90aGlzMTMub25UYXBTdGFydCk7XG5cbiAgICAgIF90aGlzMTMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfRU5ELCBfdGhpczEzLm9uVGFwRW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMxMy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuV0hFRUwsIF90aGlzMTMuaGFuZGxlV2hlZWwpO1xuICAgICAgX3RoaXMxMy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfU1RBUlQsIF90aGlzMTMub25UYXBTdGFydCk7XG4gICAgICBfdGhpczEzLmNhbnZhcz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5UT1VDSF9FTkQsIF90aGlzMTMub25UYXBFbmQpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLmhhbmRsZUFwcE9uRHJvcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYxOCA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoZXZlbnQpIHtcbiAgICAgIGlmIChfdGhpczEzLnByb3BzLm9uRHJvcCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICgoeWllbGQgX3RoaXMxMy5wcm9wcy5vbkRyb3AoZXZlbnQpKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIG11c3QgYmUgcmV0cmlldmVkIGZpcnN0LCBpbiB0aGUgc2FtZSBmcmFtZVxuXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZmlsZSxcbiAgICAgICAgZmlsZUhhbmRsZVxuICAgICAgfSA9IHlpZWxkIGdldEZpbGVGcm9tRXZlbnQoZXZlbnQpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaXNTdXBwb3J0ZWRJbWFnZUZpbGUoZmlsZSkpIHtcbiAgICAgICAgICAvLyBmaXJzdCBhdHRlbXB0IHRvIGRlY29kZSBzY2VuZSBmcm9tIHRoZSBpbWFnZSBpZiBpdCdzIGVtYmVkZGVkXG4gICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAgaWYgKGZpbGU/LnR5cGUgPT09IE1JTUVfVFlQRVMucG5nIHx8IGZpbGU/LnR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBzY2VuZSA9IHlpZWxkIGxvYWRGcm9tQmxvYihmaWxlLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBmaWxlSGFuZGxlKTtcblxuICAgICAgICAgICAgICBfdGhpczEzLnN5bmNBY3Rpb25SZXN1bHQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzY2VuZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgYXBwU3RhdGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUgfHwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZVxuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgIT09IFwiRW5jb2RpbmdFcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIGlmIG5vIHNjZW5lIGlzIGVtYmVkZGVkIG9yIHdlIGZhaWwgZm9yIHdoYXRldmVyIHJlYXNvbiwgZmFsbCBiYWNrXG4gICAgICAgICAgLy8gdG8gaW1wb3J0aW5nIGFzIHJlZ3VsYXIgaW1hZ2VcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgeDogc2NlbmVYLFxuICAgICAgICAgICAgeTogc2NlbmVZXG4gICAgICAgICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBfdGhpczEzLmNyZWF0ZUltYWdlRWxlbWVudCh7XG4gICAgICAgICAgICBzY2VuZVgsXG4gICAgICAgICAgICBzY2VuZVlcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIF90aGlzMTMuaW5zZXJ0SW1hZ2VFbGVtZW50KGltYWdlRWxlbWVudCwgZmlsZSk7XG5cbiAgICAgICAgICBfdGhpczEzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcblxuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGlicmFyeUpTT04gPSBldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShNSU1FX1RZUEVTLmV4Y2FsaWRyYXdsaWIpO1xuXG4gICAgICBpZiAobGlicmFyeUpTT04gJiYgdHlwZW9mIGxpYnJhcnlKU09OID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbGlicmFyeUl0ZW1zID0gcGFyc2VMaWJyYXJ5SlNPTihsaWJyYXJ5SlNPTik7XG5cbiAgICAgICAgICBfdGhpczEzLmFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5KHtcbiAgICAgICAgICAgIGVsZW1lbnRzOiBkaXN0cmlidXRlTGlicmFyeUl0ZW1zT25TcXVhcmVHcmlkKGxpYnJhcnlJdGVtcyksXG4gICAgICAgICAgICBwb3NpdGlvbjogZXZlbnQsXG4gICAgICAgICAgICBmaWxlczogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgIC8vIGF0ZXRtcHQgdG8gcGFyc2UgYW4gZXhjYWxpZHJhdy9leGNhbGlkcmF3bGliIGZpbGVcbiAgICAgICAgeWllbGQgX3RoaXMxMy5sb2FkRmlsZVRvQ2FudmFzKGZpbGUsIGZpbGVIYW5kbGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDExKSB7XG4gICAgICByZXR1cm4gX3JlZjE4LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSgpO1xuXG4gIHRoaXMubG9hZEZpbGVUb0NhbnZhcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYxOSA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoZmlsZSwgZmlsZUhhbmRsZSkge1xuICAgICAgZmlsZSA9IHlpZWxkIG5vcm1hbGl6ZUZpbGUoZmlsZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJldCA9IHlpZWxkIGxvYWRTY2VuZU9yTGlicmFyeUZyb21CbG9iKGZpbGUsIF90aGlzMTMuc3RhdGUsIF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIGZpbGVIYW5kbGUpO1xuXG4gICAgICAgIGlmIChyZXQudHlwZSA9PT0gTUlNRV9UWVBFUy5leGNhbGlkcmF3KSB7XG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpc0xvYWRpbmc6IHRydWVcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIF90aGlzMTMuc3luY0FjdGlvblJlc3VsdChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJldC5kYXRhKSwge30sIHtcbiAgICAgICAgICAgIGFwcFN0YXRlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJldC5kYXRhLmFwcFN0YXRlIHx8IF90aGlzMTMuc3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHJlcGxhY2VGaWxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXQudHlwZSA9PT0gTUlNRV9UWVBFUy5leGNhbGlkcmF3bGliKSB7XG4gICAgICAgICAgeWllbGQgX3RoaXMxMy5saWJyYXJ5LnVwZGF0ZUxpYnJhcnkoe1xuICAgICAgICAgICAgbGlicmFyeUl0ZW1zOiBmaWxlLFxuICAgICAgICAgICAgbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBvcGVuTGlicmFyeU1lbnU6IHRydWVcbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiB0KFwiZXJyb3JzLmltcG9ydExpYnJhcnlFcnJvclwiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDEyLCBfeDEzKSB7XG4gICAgICByZXR1cm4gX3JlZjE5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSgpO1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKChldmVudC5uYXRpdmVFdmVudC5wb2ludGVyVHlwZSA9PT0gXCJ0b3VjaFwiIHx8IGV2ZW50Lm5hdGl2ZUV2ZW50LnBvaW50ZXJUeXBlID09PSBcInBlblwiICYmIC8vIGFsd2F5cyBhbGxvdyBpZiB1c2VyIHVzZXMgYSBwZW4gc2Vjb25kYXJ5IGJ1dHRvblxuICAgIGV2ZW50LmJ1dHRvbiAhPT0gUE9JTlRFUl9CVVRUT04uU0VDT05EQVJZKSAmJiBfdGhpczEzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7XG4gICAgICBwcmVmZXJTZWxlY3RlZDogdHJ1ZSxcbiAgICAgIGluY2x1ZGVMb2NrZWRFbGVtZW50czogdHJ1ZVxuICAgIH0pO1xuXG4gICAgY29uc3QgdHlwZSA9IGVsZW1lbnQgPyBcImVsZW1lbnRcIiA6IFwiY2FudmFzXCI7XG4gICAgY29uc3QgY29udGFpbmVyID0gX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgY29uc3Qge1xuICAgICAgdG9wOiBvZmZzZXRUb3AsXG4gICAgICBsZWZ0OiBvZmZzZXRMZWZ0XG4gICAgfSA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBsZWZ0ID0gZXZlbnQuY2xpZW50WCAtIG9mZnNldExlZnQ7XG4gICAgY29uc3QgdG9wID0gZXZlbnQuY2xpZW50WSAtIG9mZnNldFRvcDtcblxuICAgIGlmIChlbGVtZW50ICYmICFfdGhpczEzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXSkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgIFtlbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KSwgX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMxMy5fb3BlbkNvbnRleHRNZW51KHtcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdFxuICAgICAgICB9LCB0eXBlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpczEzLl9vcGVuQ29udGV4dE1lbnUoe1xuICAgICAgICB0b3AsXG4gICAgICAgIGxlZnRcbiAgICAgIH0sIHR5cGUpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLm1heWJlRHJhZ05ld0dlbmVyaWNFbGVtZW50ID0gZnVuY3Rpb24gKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSB7XG4gICAgY29uc3QgZHJhZ2dpbmdFbGVtZW50ID0gX3RoaXMxMy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQ7XG4gICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3JkcztcblxuICAgIGlmICghZHJhZ2dpbmdFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRyYWdnaW5nRWxlbWVudC50eXBlID09PSBcInNlbGVjdGlvblwiICYmIF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlICE9PSBcImVyYXNlclwiKSB7XG4gICAgICBkcmFnTmV3RWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIF90aGlzMTMuc3RhdGUuYWN0aXZlVG9vbC50eXBlLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckNvb3Jkcy54KSwgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgcG9pbnRlckNvb3Jkcy55KSwgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudCksIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIoZXZlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckNvb3Jkcy54LCBwb2ludGVyQ29vcmRzLnksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuICAgICAgY29uc3QgaW1hZ2UgPSBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkgJiYgX3RoaXMxMy5pbWFnZUNhY2hlLmdldChkcmFnZ2luZ0VsZW1lbnQuZmlsZUlkKT8uaW1hZ2U7XG4gICAgICBjb25zdCBhc3BlY3RSYXRpbyA9IGltYWdlICYmICEoaW1hZ2UgaW5zdGFuY2VvZiBQcm9taXNlKSA/IGltYWdlLndpZHRoIC8gaW1hZ2UuaGVpZ2h0IDogbnVsbDtcbiAgICAgIGRyYWdOZXdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwgX3RoaXMxMy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLnksIGdyaWRYLCBncmlkWSwgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueCwgZ3JpZFgpLCBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC55LCBncmlkWSksIGlzSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkgPyAhc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudCkgOiBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSwgc2hvdWxkUmVzaXplRnJvbUNlbnRlcihldmVudCksIGFzcGVjdFJhdGlvKTtcblxuICAgICAgX3RoaXMxMy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKFtkcmFnZ2luZ0VsZW1lbnRdKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5tYXliZUhhbmRsZVJlc2l6ZSA9IGZ1bmN0aW9uIChwb2ludGVyRG93blN0YXRlLCBldmVudCkge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpO1xuICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAvLyBUT0RPOiByZW5hbWUgdGhpcyBzdGF0ZSBmaWVsZCB0byBcImlzU2NhbGluZ1wiIHRvIGRpc3Rpbmd1aXNoXG4gICAgICAvLyBpdCBmcm9tIHRoZSBnZW5lcmljIFwiaXNSZXNpemluZ1wiIHdoaWNoIGluY2x1ZGVzIHNjYWxpbmcgYW5kXG4gICAgICAvLyByb3RhdGluZ1xuICAgICAgaXNSZXNpemluZzogdHJhbnNmb3JtSGFuZGxlVHlwZSAmJiB0cmFuc2Zvcm1IYW5kbGVUeXBlICE9PSBcInJvdGF0aW9uXCIsXG4gICAgICBpc1JvdGF0aW5nOiB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcInJvdGF0aW9uXCJcbiAgICB9KTtcblxuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG4gICAgY29uc3QgW3Jlc2l6ZVgsIHJlc2l6ZVldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJDb29yZHMueCAtIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLm9mZnNldC54LCBwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5vZmZzZXQueSwgX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSk7XG5cbiAgICBpZiAodHJhbnNmb3JtRWxlbWVudHMocG9pbnRlckRvd25TdGF0ZSwgdHJhbnNmb3JtSGFuZGxlVHlwZSwgc2VsZWN0ZWRFbGVtZW50cywgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuYXJyb3dEaXJlY3Rpb24sIHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSwgc2hvdWxkUmVzaXplRnJvbUNlbnRlcihldmVudCksIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmIGlzSW1hZ2VFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pID8gIXNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpIDogc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudCksIHJlc2l6ZVgsIHJlc2l6ZVksIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmNlbnRlci54LCBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5jZW50ZXIueSkpIHtcbiAgICAgIF90aGlzMTMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChzZWxlY3RlZEVsZW1lbnRzKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHRoaXMuX29wZW5Db250ZXh0TWVudSA9IGZ1bmN0aW9uIChfcmVmMjAsIHR5cGUpIHtcbiAgICBsZXQge1xuICAgICAgbGVmdCxcbiAgICAgIHRvcFxuICAgIH0gPSBfcmVmMjA7XG5cbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5zaG93SHlwZXJsaW5rUG9wdXApIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBfdGhpczEzLmNvbnRleHRNZW51T3BlbiA9IHRydWU7XG4gICAgY29uc3QgbWF5YmVHcm91cEFjdGlvbiA9IGFjdGlvbkdyb3VwLmNvbnRleHRJdGVtUHJlZGljYXRlKF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEFwcFN0YXRlKCkpO1xuICAgIGNvbnN0IG1heWJlVW5ncm91cEFjdGlvbiA9IGFjdGlvblVuZ3JvdXAuY29udGV4dEl0ZW1QcmVkaWNhdGUoX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSk7XG4gICAgY29uc3QgbWF5YmVGbGlwSG9yaXpvbnRhbCA9IGFjdGlvbkZsaXBIb3Jpem9udGFsLmNvbnRleHRJdGVtUHJlZGljYXRlKF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEFwcFN0YXRlKCkpO1xuICAgIGNvbnN0IG1heWJlRmxpcFZlcnRpY2FsID0gYWN0aW9uRmxpcFZlcnRpY2FsLmNvbnRleHRJdGVtUHJlZGljYXRlKF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEFwcFN0YXRlKCkpO1xuICAgIGNvbnN0IG1heUJlQWxsb3dVbmJpbmRpbmcgPSBhY3Rpb25VbmJpbmRUZXh0LmNvbnRleHRJdGVtUHJlZGljYXRlKF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEFwcFN0YXRlKCkpO1xuICAgIGNvbnN0IG1heUJlQWxsb3dCaW5kaW5nID0gYWN0aW9uQmluZFRleHQuY29udGV4dEl0ZW1QcmVkaWNhdGUoX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSk7XG4gICAgY29uc3Qgc2VwYXJhdG9yID0gXCJzZXBhcmF0b3JcIjtcblxuICAgIGNvbnN0IGVsZW1lbnRzID0gX3RoaXMxMy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBbXTtcblxuICAgIGlmIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBvcHRpb25zLnB1c2goYWN0aW9uQ29weUFzUG5nKTtcbiAgICB9XG5cbiAgICBpZiAocHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZFdyaXRlVGV4dCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBvcHRpb25zLnB1c2goYWN0aW9uQ29weUFzU3ZnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJlbGVtZW50XCIgJiYgY29weVRleHQuY29udGV4dEl0ZW1QcmVkaWNhdGUoZWxlbWVudHMsIF90aGlzMTMuc3RhdGUpICYmIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQpIHtcbiAgICAgIG9wdGlvbnMucHVzaChjb3B5VGV4dCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IFwiY2FudmFzXCIpIHtcbiAgICAgIGNvbnN0IHZpZXdNb2RlT3B0aW9ucyA9IFsuLi5vcHRpb25zLCB0eXBlb2YgX3RoaXMxMy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlR3JpZE1vZGUsIC8vdHlwZW9mIHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgIC8venN2aWN6aWFuXG4gICAgICBhY3Rpb25Ub2dnbGVaZW5Nb2RlLCAvL3R5cGVvZiB0aGlzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiAgLy96c3ZpY3ppYW5cbiAgICAgIGFjdGlvblRvZ2dsZVZpZXdNb2RlLCBhY3Rpb25Ub2dnbGVTdGF0c107XG5cbiAgICAgIGlmIChfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBDb250ZXh0TWVudS5wdXNoKHtcbiAgICAgICAgICBvcHRpb25zOiB2aWV3TW9kZU9wdGlvbnMsXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgYWN0aW9uTWFuYWdlcjogX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICAgIGFwcFN0YXRlOiBfdGhpczEzLnN0YXRlLFxuICAgICAgICAgIGNvbnRhaW5lcjogX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgICAgICAgZWxlbWVudHNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDb250ZXh0TWVudS5wdXNoKHtcbiAgICAgICAgICBvcHRpb25zOiBbX3RoaXMxMy5kZXZpY2UuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiB7XG4gICAgICAgICAgICB0cmFja0V2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWU6IFwicGFzdGVcIixcbiAgICAgICAgICAgIHBlcmZvcm06IGZ1bmN0aW9uIChlbGVtZW50cywgYXBwU3RhdGVzKSB7XG4gICAgICAgICAgICAgIF90aGlzMTMucGFzdGVGcm9tQ2xpcGJvYXJkKG51bGwpO1xuXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiBmYWxzZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLnBhc3RlXCJcbiAgICAgICAgICB9LCBfdGhpczEzLmRldmljZS5pc01vYmlsZSAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHNlcGFyYXRvciwgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiYgZWxlbWVudHMubGVuZ3RoID4gMCAmJiBhY3Rpb25Db3B5QXNQbmcsIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgZWxlbWVudHMubGVuZ3RoID4gMCAmJiBhY3Rpb25Db3B5QXNTdmcsIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwICYmIGNvcHlUZXh0LCAocHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiYgZWxlbWVudHMubGVuZ3RoID4gMCB8fCBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApICYmIHNlcGFyYXRvciwgYWN0aW9uU2VsZWN0QWxsLCBzZXBhcmF0b3IsIHR5cGVvZiBfdGhpczEzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiBhY3Rpb25Ub2dnbGVHcmlkTW9kZSwgLy90eXBlb2YgdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiAvL3pzdmljemlhblxuICAgICAgICAgIGFjdGlvblRvZ2dsZVplbk1vZGUsIC8vdHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIC8venN2aWN6aWFuXG4gICAgICAgICAgYWN0aW9uVG9nZ2xlVmlld01vZGUsIGFjdGlvblRvZ2dsZVN0YXRzXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiBfdGhpczEzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IF90aGlzMTMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgICAgICBlbGVtZW50c1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiZWxlbWVudFwiKSB7XG4gICAgICBpZiAoX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW25hdmlnYXRvci5jbGlwYm9hcmQgJiYgYWN0aW9uQ29weSwgLi4ub3B0aW9uc10sXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgYWN0aW9uTWFuYWdlcjogX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICAgIGFwcFN0YXRlOiBfdGhpczEzLnN0YXRlLFxuICAgICAgICAgIGNvbnRhaW5lcjogX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgICAgICAgZWxlbWVudHNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDb250ZXh0TWVudS5wdXNoKHtcbiAgICAgICAgICBvcHRpb25zOiBbX3RoaXMxMy5kZXZpY2UuaXNNb2JpbGUgJiYgYWN0aW9uQ3V0LCBfdGhpczEzLmRldmljZS5pc01vYmlsZSAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIGFjdGlvbkNvcHksIF90aGlzMTMuZGV2aWNlLmlzTW9iaWxlICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYge1xuICAgICAgICAgICAgbmFtZTogXCJwYXN0ZVwiLFxuICAgICAgICAgICAgdHJhY2tFdmVudDogZmFsc2UsXG4gICAgICAgICAgICBwZXJmb3JtOiBmdW5jdGlvbiAoZWxlbWVudHMsIGFwcFN0YXRlcykge1xuICAgICAgICAgICAgICBfdGhpczEzLnBhc3RlRnJvbUNsaXBib2FyZChudWxsKTtcblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2VcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZXh0SXRlbUxhYmVsOiBcImxhYmVscy5wYXN0ZVwiXG4gICAgICAgICAgfSwgX3RoaXMxMy5kZXZpY2UuaXNNb2JpbGUgJiYgc2VwYXJhdG9yLCAuLi5vcHRpb25zLCBzZXBhcmF0b3IsIGFjdGlvbkNvcHlTdHlsZXMsIGFjdGlvblBhc3RlU3R5bGVzLCBzZXBhcmF0b3IsIG1heWJlR3JvdXBBY3Rpb24gJiYgYWN0aW9uR3JvdXAsIG1heUJlQWxsb3dVbmJpbmRpbmcgJiYgYWN0aW9uVW5iaW5kVGV4dCwgbWF5QmVBbGxvd0JpbmRpbmcgJiYgYWN0aW9uQmluZFRleHQsIG1heWJlVW5ncm91cEFjdGlvbiAmJiBhY3Rpb25Vbmdyb3VwLCAobWF5YmVHcm91cEFjdGlvbiB8fCBtYXliZVVuZ3JvdXBBY3Rpb24pICYmIHNlcGFyYXRvciwgYWN0aW9uQWRkVG9MaWJyYXJ5LCBzZXBhcmF0b3IsIGFjdGlvblNlbmRCYWNrd2FyZCwgYWN0aW9uQnJpbmdGb3J3YXJkLCBhY3Rpb25TZW5kVG9CYWNrLCBhY3Rpb25CcmluZ1RvRnJvbnQsIHNlcGFyYXRvciwgbWF5YmVGbGlwSG9yaXpvbnRhbCAmJiBhY3Rpb25GbGlwSG9yaXpvbnRhbCwgbWF5YmVGbGlwVmVydGljYWwgJiYgYWN0aW9uRmxpcFZlcnRpY2FsLCAobWF5YmVGbGlwSG9yaXpvbnRhbCB8fCBtYXliZUZsaXBWZXJ0aWNhbCkgJiYgc2VwYXJhdG9yLCBhY3Rpb25MaW5rLmNvbnRleHRJdGVtUHJlZGljYXRlKGVsZW1lbnRzLCBfdGhpczEzLnN0YXRlKSAmJiBhY3Rpb25MaW5rLCBhY3Rpb25EdXBsaWNhdGVTZWxlY3Rpb24sIGFjdGlvblRvZ2dsZUxvY2ssIHNlcGFyYXRvciwgYWN0aW9uRGVsZXRlU2VsZWN0ZWRdLFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IF90aGlzMTMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICBhcHBTdGF0ZTogX3RoaXMxMy5zdGF0ZSxcbiAgICAgICAgICBjb250YWluZXI6IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgICAgIGVsZW1lbnRzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB0aGlzLmhhbmRsZVdoZWVsID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgZGVsdGFYLFxuICAgICAgZGVsdGFZXG4gICAgfSA9IGV2ZW50OyAvLyBub3RlIHRoYXQgZXZlbnQuY3RybEtleSBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIHBpbmNoIHpvb21pbmdcblxuICAgIGlmIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgIGNvbnN0IHNpZ24gPSBNYXRoLnNpZ24oZGVsdGFZKTtcbiAgICAgIGNvbnN0IE1BWF9TVEVQID0gMTA7XG4gICAgICBjb25zdCBhYnNEZWx0YSA9IE1hdGguYWJzKGRlbHRhWSk7XG4gICAgICBsZXQgZGVsdGEgPSBkZWx0YVk7XG5cbiAgICAgIGlmIChhYnNEZWx0YSA+IE1BWF9TVEVQKSB7XG4gICAgICAgIGRlbHRhID0gTUFYX1NURVAgKiBzaWduO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3Wm9vbSA9IF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSAtIGRlbHRhIC8gMTAwOyAvLyBpbmNyZWFzZSB6b29tIHN0ZXBzIHRoZSBtb3JlIHpvb21lZC1pbiB3ZSBhcmUgKGFwcGxpZXMgdG8gPjEwMCUgb25seSlcblxuICAgICAgbmV3Wm9vbSArPSBNYXRoLmxvZzEwKE1hdGgubWF4KDEsIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSkpICogLXNpZ24gKiAvLyByZWR1Y2VkIGFtcGxpZmljYXRpb24gZm9yIHNtYWxsIGRlbHRhcyAoc21hbGwgbW92ZW1lbnRzIG9uIGEgdHJhY2twYWQpXG4gICAgICBNYXRoLm1pbigxLCBhYnNEZWx0YSAvIDIwKTtcblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0U3RhdGVGb3Jab29tKHtcbiAgICAgICAgICB2aWV3cG9ydFg6IGN1cnNvclgsXG4gICAgICAgICAgdmlld3BvcnRZOiBjdXJzb3JZLFxuICAgICAgICAgIG5leHRab29tOiBnZXROb3JtYWxpemVkWm9vbShuZXdab29tKVxuICAgICAgICB9LCBzdGF0ZSkpLCB7fSwge1xuICAgICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLnJlc2V0U2hvdWxkQ2FjaGVJZ25vcmVab29tRGVib3VuY2VkKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHNjcm9sbCBob3Jpem9udGFsbHkgd2hlbiBzaGlmdCBwcmVzc2VkXG5cblxuICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZjIxKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgem9vbSxcbiAgICAgICAgICBzY3JvbGxYXG4gICAgICAgIH0gPSBfcmVmMjE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLy8gb24gTWFjLCBzaGlmdCt3aGVlbCB0ZW5kcyB0byByZXN1bHQgaW4gZGVsdGFYXG4gICAgICAgICAgc2Nyb2xsWDogc2Nyb2xsWCAtIChkZWx0YVkgfHwgZGVsdGFYKSAvIHpvb20udmFsdWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZjIyKSB7XG4gICAgICBsZXQge1xuICAgICAgICB6b29tLFxuICAgICAgICBzY3JvbGxYLFxuICAgICAgICBzY3JvbGxZXG4gICAgICB9ID0gX3JlZjIyO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2Nyb2xsWDogc2Nyb2xsWCAtIGRlbHRhWCAvIHpvb20udmFsdWUsXG4gICAgICAgIHNjcm9sbFk6IHNjcm9sbFkgLSBkZWx0YVkgLyB6b29tLnZhbHVlXG4gICAgICB9O1xuICAgIH0pO1xuICB9KTtcblxuICB0aGlzLnNhdmVQb2ludGVyID0gZnVuY3Rpb24gKHgsIHksIGJ1dHRvbikge1xuICAgIGlmICgheCB8fCAheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvaW50ZXIgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgICAgY2xpZW50WDogeCxcbiAgICAgIGNsaWVudFk6IHlcbiAgICB9LCBfdGhpczEzLnN0YXRlKTtcblxuICAgIGlmIChpc05hTihwb2ludGVyLngpIHx8IGlzTmFOKHBvaW50ZXIueSkpIHsvLyBzb21ldGltZXMgdGhlIHBvaW50ZXIgZ29lcyBvZmYgc2NyZWVuXG4gICAgfVxuXG4gICAgX3RoaXMxMy5wcm9wcy5vblBvaW50ZXJVcGRhdGU/Lih7XG4gICAgICBwb2ludGVyLFxuICAgICAgYnV0dG9uLFxuICAgICAgcG9pbnRlcnNNYXA6IGdlc3R1cmUucG9pbnRlcnNcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLnJlc2V0U2hvdWxkQ2FjaGVJZ25vcmVab29tRGVib3VuY2VkID0gZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgIGlmICghX3RoaXMxMy51bm1vdW50ZWQpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIDMwMCk7XG5cbiAgdGhpcy51cGRhdGVET01SZWN0ID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgaWYgKF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZj8uY3VycmVudCkge1xuICAgICAgY29uc3QgZXhjYWxpZHJhd0NvbnRhaW5lciA9IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgICAgY29uc3Qge1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBsZWZ0OiBvZmZzZXRMZWZ0LFxuICAgICAgICB0b3A6IG9mZnNldFRvcFxuICAgICAgfSA9IGV4Y2FsaWRyYXdDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHdpZHRoOiBjdXJyZW50V2lkdGgsXG4gICAgICAgIGhlaWdodDogY3VycmVudEhlaWdodCxcbiAgICAgICAgb2Zmc2V0VG9wOiBjdXJyZW50T2Zmc2V0VG9wLFxuICAgICAgICBvZmZzZXRMZWZ0OiBjdXJyZW50T2Zmc2V0TGVmdFxuICAgICAgfSA9IF90aGlzMTMuc3RhdGU7XG5cbiAgICAgIGlmICh3aWR0aCA9PT0gY3VycmVudFdpZHRoICYmIGhlaWdodCA9PT0gY3VycmVudEhlaWdodCAmJiBvZmZzZXRMZWZ0ID09PSBjdXJyZW50T2Zmc2V0TGVmdCAmJiBvZmZzZXRUb3AgPT09IGN1cnJlbnRPZmZzZXRUb3ApIHtcbiAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIG9mZnNldExlZnQsXG4gICAgICAgIG9mZnNldFRvcFxuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjYiAmJiBjYigpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLnNldFN0YXRlKF9vYmplY3RTcHJlYWQoe30sIF90aGlzMTMuZ2V0Q2FudmFzT2Zmc2V0cygpKSk7XG4gIH07XG59O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5URVNUIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuREVWRUxPUE1FTlQpIHtcbiAgd2luZG93LmggPSB3aW5kb3cuaCB8fCB7fTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LmgsIHtcbiAgICBlbGVtZW50czoge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuXG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcD8uc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gICAgICB9LFxuXG4gICAgICBzZXQoZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwPy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoZWxlbWVudHMpO1xuICAgICAgfVxuXG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQXBwOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../components/App.tsx\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../components/App.tsx?");
|
|
1953
1953
|
|
|
1954
1954
|
/***/ }),
|
|
1955
1955
|
|
|
@@ -2081,7 +2081,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
2081
2081
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2082
2082
|
|
|
2083
2083
|
"use strict";
|
|
2084
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"Dialog\\\": () => (/* binding */ Dialog)\\n/* harmony export */ });\\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! clsx */ \\\"../../../node_modules/clsx/dist/clsx.m.js\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\\n/* harmony import */ var _hooks_useCallbackRefState__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../hooks/useCallbackRefState */ \\\"../../hooks/useCallbackRefState.ts\\\");\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/App */ \\\"../../components/App.tsx\\\");\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../keys */ \\\"../../keys.ts\\\");\\n/* harmony import */ var _Dialog_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Dialog.scss */ \\\"../../components/Dialog.scss\\\");\\n/* harmony import */ var _Dialog_scss__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_Dialog_scss__WEBPACK_IMPORTED_MODULE_6__);\\n/* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./icons */ \\\"../../components/icons.tsx\\\");\\n/* harmony import */ var _Island__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Island */ \\\"../../components/Island.tsx\\\");\\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Modal */ \\\"../../components/Modal.tsx\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst Dialog = function (props) {\\r\\n const [islandNode, setIslandNode] = (0,_hooks_useCallbackRefState__WEBPACK_IMPORTED_MODULE_2__.useCallbackRefState)();\\r\\n const [lastActiveElement] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(document.activeElement);\\r\\n const { id } = (0,_components_App__WEBPACK_IMPORTED_MODULE_4__.useExcalidrawContainer)();\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () {\\r\\n if (!islandNode) {\\r\\n return;\\r\\n }\\r\\n const focusableElements = (0,_utils__WEBPACK_IMPORTED_MODULE_10__.queryFocusableElements)(islandNode);\\r\\n if (focusableElements.length > 0 && props.autofocus !== false) {\\r\\n // If there's an element other than close, focus it.\\r\\n (focusableElements[1] || focusableElements[0]).focus();\\r\\n }\\r\\n const handleKeyDown = function (event) {\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_5__.KEYS.TAB) {\\r\\n const focusableElements = (0,_utils__WEBPACK_IMPORTED_MODULE_10__.queryFocusableElements)(islandNode);\\r\\n const { activeElement } = document;\\r\\n const currentIndex = focusableElements.findIndex(function (element) {\\r\\n return element === activeElement;\\r\\n });\\r\\n if (currentIndex === 0 && event.shiftKey) {\\r\\n focusableElements[focusableElements.length - 1].focus();\\r\\n event.preventDefault();\\r\\n }\\r\\n else if (currentIndex === focusableElements.length - 1 && !event.shiftKey) {\\r\\n focusableElements[0].focus();\\r\\n event.preventDefault();\\r\\n }\\r\\n }\\r\\n };\\r\\n islandNode.addEventListener(\\\"keydown\\\", handleKeyDown);\\r\\n return function () {\\r\\n return islandNode.removeEventListener(\\\"keydown\\\", handleKeyDown);\\r\\n };\\r\\n }, [islandNode, props.autofocus]);\\r\\n const onClose = function () {\\r\\n lastActiveElement.focus();\\r\\n props.onCloseRequest();\\r\\n };\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_Modal__WEBPACK_IMPORTED_MODULE_9__.Modal, {\\r\\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(\\\"Dialog\\\", props.className),\\r\\n labelledBy: \\\"dialog-title\\\",\\r\\n maxWidth: props.small ? 550 : 800,\\r\\n onCloseRequest: onClose,\\r\\n theme: props.theme,\\r\\n closeOnClickOutside: props.closeOnClickOutside,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(_Island__WEBPACK_IMPORTED_MODULE_8__.Island, {\\r\\n ref: setIslandNode,\\r\\n children: [/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(\\\"h2\\\", {\\r\\n id: `${id}-dialog-title`,\\r\\n className: \\\"Dialog__title\\\",\\r\\n children: [/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\\\"span\\\", {\\r\\n className: \\\"Dialog__titleContent\\\",\\r\\n children: props.title\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\\\"button\\\", {\\r\\n className: \\\"Modal__close\\\",\\r\\n onClick: onClose,\\r\\n \\\"aria-label\\\": (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(\\\"buttons.close\\\"),\\r\\n children: (0,_components_App__WEBPACK_IMPORTED_MODULE_4__.useDevice)().isMobile ? _icons__WEBPACK_IMPORTED_MODULE_7__.back : _icons__WEBPACK_IMPORTED_MODULE_7__.close\\r\\n })]\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\\\"div\\\", {\\r\\n className: \\\"Dialog__content\\\",\\r\\n children: props.children\\r\\n })]\\r\\n })\\r\\n });\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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bEIsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtRQUM5QyxRQUFRLEVBQUUsYUFBYSx5REFBSyxDQUFDLDJDQUFNLEVBQUU7WUFDbkMsR0FBRyxFQUFFLGFBQWE7WUFDbEIsUUFBUSxFQUFFLENBQUMsYUFBYSx5REFBSyxDQUFDLElBQUksRUFBRTtvQkFDbEMsRUFBRSxFQUFFLEdBQUcsRUFBRSxlQUFlO29CQUN4QixTQUFTLEVBQUUsZUFBZTtvQkFDMUIsUUFBUSxFQUFFLENBQUMsYUFBYSx3REFBSSxDQUFDLE1BQU0sRUFBRTs0QkFDbkMsU0FBUyxFQUFFLHNCQUFzQjs0QkFDakMsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLO3lCQUN0QixDQUFDLEVBQUUsYUFBYSx3REFBSSxDQUFDLFFBQVEsRUFBRTs0QkFDOUIsU0FBUyxFQUFFLGNBQWM7NEJBQ3pCLE9BQU8sRUFBRSxPQUFPOzRCQUNoQixZQUFZLEVBQUUsd0NBQUMsQ0FBQyxlQUFlLENBQUM7NEJBQ2hDLFFBQVEsRUFBRSwwREFBUyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyx3Q0FBSSxDQUFDLENBQUMsQ0FBQyx5Q0FBSzt5QkFDOUMsQ0FBQyxDQUFDO2lCQUNKLENBQUMsRUFBRSxhQUFhLHdEQUFJLENBQUMsS0FBSyxFQUFFO29CQUMzQixTQUFTLEVBQUUsaUJBQWlCO29CQUM1QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7aUJBQ3pCLENBQUMsQ0FBQztTQUNKLENBQUM7S0FDSCxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vY29tcG9uZW50cy9EaWFsb2cudHN4PzYyNmQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNsc3ggZnJvbSBcImNsc3hcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFja1JlZlN0YXRlIH0gZnJvbSBcIi4uL2hvb2tzL3VzZUNhbGxiYWNrUmVmU3RhdGVcIjtcbmltcG9ydCB7IHQgfSBmcm9tIFwiLi4vaTE4blwiO1xuaW1wb3J0IHsgdXNlRXhjYWxpZHJhd0NvbnRhaW5lciwgdXNlRGV2aWNlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvQXBwXCI7XG5pbXBvcnQgeyBLRVlTIH0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCBcIi4vRGlhbG9nLnNjc3NcIjtcbmltcG9ydCB7IGJhY2ssIGNsb3NlIH0gZnJvbSBcIi4vaWNvbnNcIjtcbmltcG9ydCB7IElzbGFuZCB9IGZyb20gXCIuL0lzbGFuZFwiO1xuaW1wb3J0IHsgTW9kYWwgfSBmcm9tIFwiLi9Nb2RhbFwiO1xuaW1wb3J0IHsgcXVlcnlGb2N1c2FibGVFbGVtZW50cyB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBjb25zdCBEaWFsb2cgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgY29uc3QgW2lzbGFuZE5vZGUsIHNldElzbGFuZE5vZGVdID0gdXNlQ2FsbGJhY2tSZWZTdGF0ZSgpO1xuICBjb25zdCBbbGFzdEFjdGl2ZUVsZW1lbnRdID0gdXNlU3RhdGUoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIGNvbnN0IHtcbiAgICBpZFxuICB9ID0gdXNlRXhjYWxpZHJhd0NvbnRhaW5lcigpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghaXNsYW5kTm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gcXVlcnlGb2N1c2FibGVFbGVtZW50cyhpc2xhbmROb2RlKTtcblxuICAgIGlmIChmb2N1c2FibGVFbGVtZW50cy5sZW5ndGggPiAwICYmIHByb3BzLmF1dG9mb2N1cyAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIElmIHRoZXJlJ3MgYW4gZWxlbWVudCBvdGhlciB0aGFuIGNsb3NlLCBmb2N1cyBpdC5cbiAgICAgIChmb2N1c2FibGVFbGVtZW50c1sxXSB8fCBmb2N1c2FibGVFbGVtZW50c1swXSkuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlRBQikge1xuICAgICAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IHF1ZXJ5Rm9jdXNhYmxlRWxlbWVudHMoaXNsYW5kTm9kZSk7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBhY3RpdmVFbGVtZW50XG4gICAgICAgIH0gPSBkb2N1bWVudDtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gZm9jdXNhYmxlRWxlbWVudHMuZmluZEluZGV4KGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQgPT09IGFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IDAgJiYgZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBmb2N1c2FibGVFbGVtZW50c1tmb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxXS5mb2N1cygpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEluZGV4ID09PSBmb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGZvY3VzYWJsZUVsZW1lbnRzWzBdLmZvY3VzKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpc2xhbmROb2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaXNsYW5kTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcbiAgICB9O1xuICB9LCBbaXNsYW5kTm9kZSwgcHJvcHMuYXV0b2ZvY3VzXSk7XG5cbiAgY29uc3Qgb25DbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsYXN0QWN0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIHByb3BzLm9uQ2xvc2VSZXF1ZXN0KCk7XG4gIH07XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KE1vZGFsLCB7XG4gICAgY2xhc3NOYW1lOiBjbHN4KFwiRGlhbG9nXCIsIHByb3BzLmNsYXNzTmFtZSksXG4gICAgbGFiZWxsZWRCeTogXCJkaWFsb2ctdGl0bGVcIixcbiAgICBtYXhXaWR0aDogcHJvcHMuc21hbGwgPyA1NTAgOiA4MDAsXG4gICAgb25DbG9zZVJlcXVlc3Q6IG9uQ2xvc2UsXG4gICAgdGhlbWU6IHByb3BzLnRoZW1lLFxuICAgIGNsb3NlT25DbGlja091dHNpZGU6IHByb3BzLmNsb3NlT25DbGlja091dHNpZGUsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4cyhJc2xhbmQsIHtcbiAgICAgIHJlZjogc2V0SXNsYW5kTm9kZSxcbiAgICAgIGNoaWxkcmVuOiBbLyojX19QVVJFX18qL19qc3hzKFwiaDJcIiwge1xuICAgICAgICBpZDogYCR7aWR9LWRpYWxvZy10aXRsZWAsXG4gICAgICAgIGNsYXNzTmFtZTogXCJEaWFsb2dfX3RpdGxlXCIsXG4gICAgICAgIGNoaWxkcmVuOiBbLyojX19QVVJFX18qL19qc3goXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiRGlhbG9nX190aXRsZUNvbnRlbnRcIixcbiAgICAgICAgICBjaGlsZHJlbjogcHJvcHMudGl0bGVcbiAgICAgICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiTW9kYWxfX2Nsb3NlXCIsXG4gICAgICAgICAgb25DbGljazogb25DbG9zZSxcbiAgICAgICAgICBcImFyaWEtbGFiZWxcIjogdChcImJ1dHRvbnMuY2xvc2VcIiksXG4gICAgICAgICAgY2hpbGRyZW46IHVzZURldmljZSgpLmlzTW9iaWxlID8gYmFjayA6IGNsb3NlXG4gICAgICAgIH0pXVxuICAgICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIkRpYWxvZ19fY29udGVudFwiLFxuICAgICAgICBjaGlsZHJlbjogcHJvcHMuY2hpbGRyZW5cbiAgICAgIH0pXVxuICAgIH0pXG4gIH0pO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///../../components/Dialog.tsx\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../components/Dialog.tsx?");
|
|
2084
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"Dialog\\\": () => (/* binding */ Dialog)\\n/* harmony export */ });\\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! clsx */ \\\"../../../node_modules/clsx/dist/clsx.m.js\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\\n/* harmony import */ var _hooks_useCallbackRefState__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../hooks/useCallbackRefState */ \\\"../../hooks/useCallbackRefState.ts\\\");\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/App */ \\\"../../components/App.tsx\\\");\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../keys */ \\\"../../keys.ts\\\");\\n/* harmony import */ var _Dialog_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Dialog.scss */ \\\"../../components/Dialog.scss\\\");\\n/* harmony import */ var _Dialog_scss__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_Dialog_scss__WEBPACK_IMPORTED_MODULE_6__);\\n/* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./icons */ \\\"../../components/icons.tsx\\\");\\n/* harmony import */ var _Island__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Island */ \\\"../../components/Island.tsx\\\");\\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Modal */ \\\"../../components/Modal.tsx\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst Dialog = function (props) {\\r\\n const [islandNode, setIslandNode] = (0,_hooks_useCallbackRefState__WEBPACK_IMPORTED_MODULE_2__.useCallbackRefState)();\\r\\n const [lastActiveElement] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(document.activeElement);\\r\\n const { id } = (0,_components_App__WEBPACK_IMPORTED_MODULE_4__.useExcalidrawContainer)();\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () {\\r\\n if (!islandNode) {\\r\\n return;\\r\\n }\\r\\n const focusableElements = (0,_utils__WEBPACK_IMPORTED_MODULE_10__.queryFocusableElements)(islandNode);\\r\\n if (focusableElements.length > 0 && props.autofocus !== false) {\\r\\n // If there's an element other than close, focus it.\\r\\n (focusableElements[1] || focusableElements[0]).focus();\\r\\n }\\r\\n const handleKeyDown = function (event) {\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_5__.KEYS.TAB) {\\r\\n const focusableElements = (0,_utils__WEBPACK_IMPORTED_MODULE_10__.queryFocusableElements)(islandNode);\\r\\n const { activeElement } = document;\\r\\n const currentIndex = focusableElements.findIndex(function (element) {\\r\\n return element === activeElement;\\r\\n });\\r\\n if (currentIndex === 0 && event.shiftKey) {\\r\\n focusableElements[focusableElements.length - 1].focus();\\r\\n event.preventDefault();\\r\\n }\\r\\n else if (currentIndex === focusableElements.length - 1 && !event.shiftKey) {\\r\\n focusableElements[0].focus();\\r\\n event.preventDefault();\\r\\n }\\r\\n }\\r\\n };\\r\\n islandNode.addEventListener(\\\"keydown\\\", handleKeyDown);\\r\\n return function () {\\r\\n return islandNode.removeEventListener(\\\"keydown\\\", handleKeyDown);\\r\\n };\\r\\n }, [islandNode, props.autofocus]);\\r\\n const onClose = function () {\\r\\n lastActiveElement.focus();\\r\\n props.onCloseRequest();\\r\\n };\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_Modal__WEBPACK_IMPORTED_MODULE_9__.Modal, {\\r\\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(\\\"Dialog\\\", props.className),\\r\\n labelledBy: \\\"dialog-title\\\",\\r\\n maxWidth: props.small ? 550 : 800,\\r\\n onCloseRequest: onClose,\\r\\n theme: props.theme,\\r\\n closeOnClickOutside: props.closeOnClickOutside,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(_Island__WEBPACK_IMPORTED_MODULE_8__.Island, {\\r\\n ref: setIslandNode,\\r\\n children: [/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(\\\"h2\\\", {\\r\\n id: `${id}-dialog-title`,\\r\\n className: \\\"Dialog__title\\\",\\r\\n children: [/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\\\"span\\\", {\\r\\n className: \\\"Dialog__titleContent\\\",\\r\\n children: props.title\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\\\"button\\\", {\\r\\n className: \\\"Modal__close\\\",\\r\\n onClick: onClose,\\r\\n title: (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(\\\"buttons.close\\\"),\\r\\n \\\"aria-label\\\": (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(\\\"buttons.close\\\"),\\r\\n children: (0,_components_App__WEBPACK_IMPORTED_MODULE_4__.useDevice)().isMobile ? _icons__WEBPACK_IMPORTED_MODULE_7__.back : _icons__WEBPACK_IMPORTED_MODULE_7__.close\\r\\n })]\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\\\"div\\\", {\\r\\n className: \\\"Dialog__content\\\",\\r\\n children: props.children\\r\\n })]\\r\\n })\\r\\n });\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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bEIsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtRQUM5QyxRQUFRLEVBQUUsYUFBYSx5REFBSyxDQUFDLDJDQUFNLEVBQUU7WUFDbkMsR0FBRyxFQUFFLGFBQWE7WUFDbEIsUUFBUSxFQUFFLENBQUMsYUFBYSx5REFBSyxDQUFDLElBQUksRUFBRTtvQkFDbEMsRUFBRSxFQUFFLEdBQUcsRUFBRSxlQUFlO29CQUN4QixTQUFTLEVBQUUsZUFBZTtvQkFDMUIsUUFBUSxFQUFFLENBQUMsYUFBYSx3REFBSSxDQUFDLE1BQU0sRUFBRTs0QkFDbkMsU0FBUyxFQUFFLHNCQUFzQjs0QkFDakMsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLO3lCQUN0QixDQUFDLEVBQUUsYUFBYSx3REFBSSxDQUFDLFFBQVEsRUFBRTs0QkFDOUIsU0FBUyxFQUFFLGNBQWM7NEJBQ3pCLE9BQU8sRUFBRSxPQUFPOzRCQUNoQixLQUFLLEVBQUUsd0NBQUMsQ0FBQyxlQUFlLENBQUM7NEJBQ3pCLFlBQVksRUFBRSx3Q0FBQyxDQUFDLGVBQWUsQ0FBQzs0QkFDaEMsUUFBUSxFQUFFLDBEQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLHdDQUFJLENBQUMsQ0FBQyxDQUFDLHlDQUFLO3lCQUM5QyxDQUFDLENBQUM7aUJBQ0osQ0FBQyxFQUFFLGFBQWEsd0RBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQzNCLFNBQVMsRUFBRSxpQkFBaUI7b0JBQzVCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtpQkFDekIsQ0FBQyxDQUFDO1NBQ0osQ0FBQztLQUNILENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9jb21wb25lbnRzL0RpYWxvZy50c3g/NjI2ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2xzeCBmcm9tIFwiY2xzeFwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrUmVmU3RhdGUgfSBmcm9tIFwiLi4vaG9va3MvdXNlQ2FsbGJhY2tSZWZTdGF0ZVwiO1xuaW1wb3J0IHsgdCB9IGZyb20gXCIuLi9pMThuXCI7XG5pbXBvcnQgeyB1c2VFeGNhbGlkcmF3Q29udGFpbmVyLCB1c2VEZXZpY2UgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9BcHBcIjtcbmltcG9ydCB7IEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IFwiLi9EaWFsb2cuc2Nzc1wiO1xuaW1wb3J0IHsgYmFjaywgY2xvc2UgfSBmcm9tIFwiLi9pY29uc1wiO1xuaW1wb3J0IHsgSXNsYW5kIH0gZnJvbSBcIi4vSXNsYW5kXCI7XG5pbXBvcnQgeyBNb2RhbCB9IGZyb20gXCIuL01vZGFsXCI7XG5pbXBvcnQgeyBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZXhwb3J0IGNvbnN0IERpYWxvZyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBjb25zdCBbaXNsYW5kTm9kZSwgc2V0SXNsYW5kTm9kZV0gPSB1c2VDYWxsYmFja1JlZlN0YXRlKCk7XG4gIGNvbnN0IFtsYXN0QWN0aXZlRWxlbWVudF0gPSB1c2VTdGF0ZShkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgY29uc3Qge1xuICAgIGlkXG4gIH0gPSB1c2VFeGNhbGlkcmF3Q29udGFpbmVyKCk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFpc2xhbmROb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzKGlzbGFuZE5vZGUpO1xuXG4gICAgaWYgKGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgcHJvcHMuYXV0b2ZvY3VzICE9PSBmYWxzZSkge1xuICAgICAgLy8gSWYgdGhlcmUncyBhbiBlbGVtZW50IG90aGVyIHRoYW4gY2xvc2UsIGZvY3VzIGl0LlxuICAgICAgKGZvY3VzYWJsZUVsZW1lbnRzWzFdIHx8IGZvY3VzYWJsZUVsZW1lbnRzWzBdKS5mb2N1cygpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuVEFCKSB7XG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gcXVlcnlGb2N1c2FibGVFbGVtZW50cyhpc2xhbmROb2RlKTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRcbiAgICAgICAgfSA9IGRvY3VtZW50O1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBmb2N1c2FibGVFbGVtZW50cy5maW5kSW5kZXgoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudCA9PT0gYWN0aXZlRWxlbWVudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gMCAmJiBldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGZvY3VzYWJsZUVsZW1lbnRzW2ZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCAtIDFdLmZvY3VzKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50SW5kZXggPT09IGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCAtIDEgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZm9jdXNhYmxlRWxlbWVudHNbMF0uZm9jdXMoKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlzbGFuZE5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBpc2xhbmROb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24pO1xuICAgIH07XG4gIH0sIFtpc2xhbmROb2RlLCBwcm9wcy5hdXRvZm9jdXNdKTtcblxuICBjb25zdCBvbkNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAgIGxhc3RBY3RpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgcHJvcHMub25DbG9zZVJlcXVlc3QoKTtcbiAgfTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goTW9kYWwsIHtcbiAgICBjbGFzc05hbWU6IGNsc3goXCJEaWFsb2dcIiwgcHJvcHMuY2xhc3NOYW1lKSxcbiAgICBsYWJlbGxlZEJ5OiBcImRpYWxvZy10aXRsZVwiLFxuICAgIG1heFdpZHRoOiBwcm9wcy5zbWFsbCA/IDU1MCA6IDgwMCxcbiAgICBvbkNsb3NlUmVxdWVzdDogb25DbG9zZSxcbiAgICB0aGVtZTogcHJvcHMudGhlbWUsXG4gICAgY2xvc2VPbkNsaWNrT3V0c2lkZTogcHJvcHMuY2xvc2VPbkNsaWNrT3V0c2lkZSxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3hzKElzbGFuZCwge1xuICAgICAgcmVmOiBzZXRJc2xhbmROb2RlLFxuICAgICAgY2hpbGRyZW46IFsvKiNfX1BVUkVfXyovX2pzeHMoXCJoMlwiLCB7XG4gICAgICAgIGlkOiBgJHtpZH0tZGlhbG9nLXRpdGxlYCxcbiAgICAgICAgY2xhc3NOYW1lOiBcIkRpYWxvZ19fdGl0bGVcIixcbiAgICAgICAgY2hpbGRyZW46IFsvKiNfX1BVUkVfXyovX2pzeChcInNwYW5cIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJEaWFsb2dfX3RpdGxlQ29udGVudFwiLFxuICAgICAgICAgIGNoaWxkcmVuOiBwcm9wcy50aXRsZVxuICAgICAgICB9KSwgLyojX19QVVJFX18qL19qc3goXCJidXR0b25cIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJNb2RhbF9fY2xvc2VcIixcbiAgICAgICAgICBvbkNsaWNrOiBvbkNsb3NlLFxuICAgICAgICAgIHRpdGxlOiB0KFwiYnV0dG9ucy5jbG9zZVwiKSxcbiAgICAgICAgICBcImFyaWEtbGFiZWxcIjogdChcImJ1dHRvbnMuY2xvc2VcIiksXG4gICAgICAgICAgY2hpbGRyZW46IHVzZURldmljZSgpLmlzTW9iaWxlID8gYmFjayA6IGNsb3NlXG4gICAgICAgIH0pXVxuICAgICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIkRpYWxvZ19fY29udGVudFwiLFxuICAgICAgICBjaGlsZHJlbjogcHJvcHMuY2hpbGRyZW5cbiAgICAgIH0pXVxuICAgIH0pXG4gIH0pO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///../../components/Dialog.tsx\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../components/Dialog.tsx?");
|
|
2085
2085
|
|
|
2086
2086
|
/***/ }),
|
|
2087
2087
|
|
|
@@ -2323,7 +2323,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
2323
2323
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2324
2324
|
|
|
2325
2325
|
"use strict";
|
|
2326
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"Popover\\\": () => (/* binding */ Popover)\\n/* harmony export */ });\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\\n/* harmony import */ var _Popover_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Popover.scss */ \\\"../../components/Popover.scss\\\");\\n/* harmony import */ var _Popover_scss__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_Popover_scss__WEBPACK_IMPORTED_MODULE_1__);\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-dom */ \\\"react-dom\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../keys */ \\\"../../keys.ts\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst Popover = function (_ref) {\\r\\n let { children, left, top, onCloseRequest, fitInViewport = false, offsetLeft = 0, offsetTop = 0, viewportWidth = window.innerWidth, viewportHeight = window.innerHeight } = _ref;\\r\\n const popoverRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\\r\\n const container = popoverRef.current;\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\\r\\n if (!container) {\\r\\n return;\\r\\n }\\r\\n const handleKeyDown = function (event) {\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_4__.KEYS.TAB) {\\r\\n const focusableElements = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.queryFocusableElements)(container);\\r\\n const { activeElement } = document;\\r\\n const currentIndex = focusableElements.findIndex(function (element) {\\r\\n return element === activeElement;\\r\\n });\\r\\n if (currentIndex === 0 && event.shiftKey) {\\r\\n focusableElements[focusableElements.length - 1].focus();\\r\\n event.preventDefault();\\r\\n event.stopImmediatePropagation();\\r\\n }\\r\\n else if (currentIndex === focusableElements.length - 1 && !event.shiftKey) {\\r\\n focusableElements[0].focus();\\r\\n event.preventDefault();\\r\\n event.stopImmediatePropagation();\\r\\n }\\r\\n }\\r\\n };\\r\\n container.addEventListener(\\\"keydown\\\", handleKeyDown);\\r\\n return function () {\\r\\n return container.removeEventListener(\\\"keydown\\\", handleKeyDown);\\r\\n };\\r\\n }, [container]); // ensure the popover doesn't overflow the viewport\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect)(function () {\\r\\n if (fitInViewport && popoverRef.current) {\\r\\n const element = popoverRef.current;\\r\\n const { x, y, width, height } = element.getBoundingClientRect(); // const { innerWidth: viewportWidth, innerHeight: viewportHeight } = window;\\r\\n //Position correctly when clicked on rightmost part or the bottom part of viewport\\r\\n if (x + width - offsetLeft > viewportWidth) {\\r\\n element.style.left = `${viewportWidth - width - 10}px`;\\r\\n }\\r\\n if (y + height - offsetTop > viewportHeight) {\\r\\n element.style.top = `${viewportHeight - height}px`;\\r\\n } //Resize to fit viewport on smaller screens\\r\\n if (height >= viewportHeight) {\\r\\n element.style.height = `${viewportHeight - 20}px`;\\r\\n element.style.top = \\\"10px\\\";\\r\\n element.style.overflowY = \\\"scroll\\\";\\r\\n }\\r\\n if (width >= viewportWidth) {\\r\\n element.style.width = `${viewportWidth}px`;\\r\\n element.style.left = \\\"0px\\\";\\r\\n element.style.overflowX = \\\"scroll\\\";\\r\\n }\\r\\n }\\r\\n }, [fitInViewport, viewportWidth, viewportHeight, offsetLeft, offsetTop]);\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\\r\\n if (onCloseRequest) {\\r\\n const handler = function (event) {\\r\\n var _a;\\r\\n if (!((_a = popoverRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target))) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_2__.unstable_batchedUpdates)(function () {\\r\\n return onCloseRequest(event);\\r\\n });\\r\\n }\\r\\n };\\r\\n document.addEventListener(\\\"pointerdown\\\", handler, false);\\r\\n return function () {\\r\\n return document.removeEventListener(\\\"pointerdown\\\", handler, false);\\r\\n };\\r\\n }\\r\\n }, [onCloseRequest]);\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\\\"div\\\", {\\r\\n className: \\\"popover\\\",\\r\\n style: {\\r\\n top,\\r\\n left\\r\\n },\\r\\n ref: popoverRef,\\r\\n children: children\\r\\n });\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxDQUFDO1NBQ0g7SUFDSCxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sYUFBYSx1REFBSSxDQUFDLEtBQUssRUFBRTtRQUM5QixTQUFTLEVBQUUsU0FBUztRQUNwQixLQUFLLEVBQUU7WUFDTCxHQUFHO1lBQ0gsSUFBSTtTQUNMO1FBQ0QsR0FBRyxFQUFFLFVBQVU7UUFDZixRQUFRLEVBQUUsUUFBUTtLQUNuQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vY29tcG9uZW50cy9Qb3BvdmVyLnRzeD82ZTk1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VMYXlvdXRFZmZlY3QsIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgXCIuL1BvcG92ZXIuc2Nzc1wiO1xuaW1wb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgfSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBLRVlTIH0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5leHBvcnQgY29uc3QgUG9wb3ZlciA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gIGxldCB7XG4gICAgY2hpbGRyZW4sXG4gICAgbGVmdCxcbiAgICB0b3AsXG4gICAgb25DbG9zZVJlcXVlc3QsXG4gICAgZml0SW5WaWV3cG9ydCA9IGZhbHNlLFxuICAgIG9mZnNldExlZnQgPSAwLFxuICAgIG9mZnNldFRvcCA9IDAsXG4gICAgdmlld3BvcnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgIHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0XG4gIH0gPSBfcmVmO1xuICBjb25zdCBwb3BvdmVyUmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBjb250YWluZXIgPSBwb3BvdmVyUmVmLmN1cnJlbnQ7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlRBQikge1xuICAgICAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IHF1ZXJ5Rm9jdXNhYmxlRWxlbWVudHMoY29udGFpbmVyKTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRcbiAgICAgICAgfSA9IGRvY3VtZW50O1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBmb2N1c2FibGVFbGVtZW50cy5maW5kSW5kZXgoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudCA9PT0gYWN0aXZlRWxlbWVudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gMCAmJiBldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGZvY3VzYWJsZUVsZW1lbnRzW2ZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCAtIDFdLmZvY3VzKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50SW5kZXggPT09IGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCAtIDEgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZm9jdXNhYmxlRWxlbWVudHNbMF0uZm9jdXMoKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcbiAgICB9O1xuICB9LCBbY29udGFpbmVyXSk7IC8vIGVuc3VyZSB0aGUgcG9wb3ZlciBkb2Vzbid0IG92ZXJmbG93IHRoZSB2aWV3cG9ydFxuXG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGZpdEluVmlld3BvcnQgJiYgcG9wb3ZlclJlZi5jdXJyZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gcG9wb3ZlclJlZi5jdXJyZW50O1xuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgLy8gICAgICBjb25zdCB7IGlubmVyV2lkdGg6IHZpZXdwb3J0V2lkdGgsIGlubmVySGVpZ2h0OiB2aWV3cG9ydEhlaWdodCB9ID0gd2luZG93O1xuICAgICAgLy9Qb3NpdGlvbiBjb3JyZWN0bHkgd2hlbiBjbGlja2VkIG9uIHJpZ2h0bW9zdCBwYXJ0IG9yIHRoZSBib3R0b20gcGFydCBvZiB2aWV3cG9ydFxuXG4gICAgICBpZiAoeCArIHdpZHRoIC0gb2Zmc2V0TGVmdCA+IHZpZXdwb3J0V2lkdGgpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7dmlld3BvcnRXaWR0aCAtIHdpZHRoIC0gMTB9cHhgO1xuICAgICAgfVxuXG4gICAgICBpZiAoeSArIGhlaWdodCAtIG9mZnNldFRvcCA+IHZpZXdwb3J0SGVpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gYCR7dmlld3BvcnRIZWlnaHQgLSBoZWlnaHR9cHhgO1xuICAgICAgfSAvL1Jlc2l6ZSB0byBmaXQgdmlld3BvcnQgb24gc21hbGxlciBzY3JlZW5zXG5cblxuICAgICAgaWYgKGhlaWdodCA+PSB2aWV3cG9ydEhlaWdodCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3ZpZXdwb3J0SGVpZ2h0IC0gMjB9cHhgO1xuICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9IFwiMTBweFwiO1xuICAgICAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IFwic2Nyb2xsXCI7XG4gICAgICB9XG5cbiAgICAgIGlmICh3aWR0aCA+PSB2aWV3cG9ydFdpZHRoKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt2aWV3cG9ydFdpZHRofXB4YDtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gXCIwcHhcIjtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvd1ggPSBcInNjcm9sbFwiO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW2ZpdEluVmlld3BvcnQsIHZpZXdwb3J0V2lkdGgsIHZpZXdwb3J0SGVpZ2h0LCBvZmZzZXRMZWZ0LCBvZmZzZXRUb3BdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAob25DbG9zZVJlcXVlc3QpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKCFwb3BvdmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gb25DbG9zZVJlcXVlc3QoZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW29uQ2xvc2VSZXF1ZXN0XSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcInBvcG92ZXJcIixcbiAgICBzdHlsZToge1xuICAgICAgdG9wLFxuICAgICAgbGVmdFxuICAgIH0sXG4gICAgcmVmOiBwb3BvdmVyUmVmLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICB9KTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///../../components/Popover.tsx\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../components/Popover.tsx?");
|
|
2326
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"Popover\\\": () => (/* binding */ Popover)\\n/* harmony export */ });\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\\n/* harmony import */ var _Popover_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Popover.scss */ \\\"../../components/Popover.scss\\\");\\n/* harmony import */ var _Popover_scss__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_Popover_scss__WEBPACK_IMPORTED_MODULE_1__);\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-dom */ \\\"react-dom\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../keys */ \\\"../../keys.ts\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst Popover = function (_ref) {\\r\\n let { children, left, top, onCloseRequest, fitInViewport = false, offsetLeft = 0, offsetTop = 0, viewportWidth = window.innerWidth, viewportHeight = window.innerHeight } = _ref;\\r\\n const popoverRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\\r\\n const container = popoverRef.current;\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\\r\\n if (!container) {\\r\\n return;\\r\\n }\\r\\n const handleKeyDown = function (event) {\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_4__.KEYS.TAB) {\\r\\n const focusableElements = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.queryFocusableElements)(container);\\r\\n const { activeElement } = document;\\r\\n const currentIndex = focusableElements.findIndex(function (element) {\\r\\n return element === activeElement;\\r\\n });\\r\\n if (currentIndex === 0 && event.shiftKey) {\\r\\n focusableElements[focusableElements.length - 1].focus();\\r\\n event.preventDefault();\\r\\n event.stopImmediatePropagation();\\r\\n }\\r\\n else if (currentIndex === focusableElements.length - 1 && !event.shiftKey) {\\r\\n focusableElements[0].focus();\\r\\n event.preventDefault();\\r\\n event.stopImmediatePropagation();\\r\\n }\\r\\n }\\r\\n };\\r\\n container.addEventListener(\\\"keydown\\\", handleKeyDown);\\r\\n return function () {\\r\\n return container.removeEventListener(\\\"keydown\\\", handleKeyDown);\\r\\n };\\r\\n }, [container]); // ensure the popover doesn't overflow the viewport\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect)(function () {\\r\\n if (fitInViewport && popoverRef.current) {\\r\\n const element = popoverRef.current;\\r\\n const { x, y, width, height } = element.getBoundingClientRect(); //Position correctly when clicked on rightmost part or the bottom part of viewport\\r\\n if (x + width - offsetLeft > viewportWidth) {\\r\\n element.style.left = `${viewportWidth - width - 10}px`;\\r\\n }\\r\\n if (y + height - offsetTop > viewportHeight) {\\r\\n element.style.top = `${viewportHeight - height}px`;\\r\\n } //Resize to fit viewport on smaller screens\\r\\n if (height >= viewportHeight) {\\r\\n element.style.height = `${viewportHeight - 20}px`;\\r\\n element.style.top = \\\"10px\\\";\\r\\n element.style.overflowY = \\\"scroll\\\";\\r\\n }\\r\\n if (width >= viewportWidth) {\\r\\n element.style.width = `${viewportWidth}px`;\\r\\n element.style.left = \\\"0px\\\";\\r\\n element.style.overflowX = \\\"scroll\\\";\\r\\n }\\r\\n }\\r\\n }, [fitInViewport, viewportWidth, viewportHeight, offsetLeft, offsetTop]);\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\\r\\n if (onCloseRequest) {\\r\\n const handler = function (event) {\\r\\n var _a;\\r\\n if (!((_a = popoverRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target))) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_2__.unstable_batchedUpdates)(function () {\\r\\n return onCloseRequest(event);\\r\\n });\\r\\n }\\r\\n };\\r\\n document.addEventListener(\\\"pointerdown\\\", handler, false);\\r\\n return function () {\\r\\n return document.removeEventListener(\\\"pointerdown\\\", handler, false);\\r\\n };\\r\\n }\\r\\n }, [onCloseRequest]);\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\\\"div\\\", {\\r\\n className: \\\"popover\\\",\\r\\n style: {\\r\\n top,\\r\\n left\\r\\n },\\r\\n ref: popoverRef,\\r\\n children: children\\r\\n });\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNILENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDckIsT0FBTyxhQUFhLHVEQUFJLENBQUMsS0FBSyxFQUFFO1FBQzlCLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLEtBQUssRUFBRTtZQUNMLEdBQUc7WUFDSCxJQUFJO1NBQ0w7UUFDRCxHQUFHLEVBQUUsVUFBVTtRQUNmLFFBQVEsRUFBRSxRQUFRO0tBQ25CLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9jb21wb25lbnRzL1BvcG92ZXIudHN4PzZlOTUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUxheW91dEVmZmVjdCwgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBcIi4vUG9wb3Zlci5zY3NzXCI7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IHF1ZXJ5Rm9jdXNhYmxlRWxlbWVudHMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBjb25zdCBQb3BvdmVyID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBjaGlsZHJlbixcbiAgICBsZWZ0LFxuICAgIHRvcCxcbiAgICBvbkNsb3NlUmVxdWVzdCxcbiAgICBmaXRJblZpZXdwb3J0ID0gZmFsc2UsXG4gICAgb2Zmc2V0TGVmdCA9IDAsXG4gICAgb2Zmc2V0VG9wID0gMCxcbiAgICB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGgsXG4gICAgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHBvcG92ZXJSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IGNvbnRhaW5lciA9IHBvcG92ZXJSZWYuY3VycmVudDtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuVEFCKSB7XG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gcXVlcnlGb2N1c2FibGVFbGVtZW50cyhjb250YWluZXIpO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudFxuICAgICAgICB9ID0gZG9jdW1lbnQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZvY3VzYWJsZUVsZW1lbnRzLmZpbmRJbmRleChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50ID09PSBhY3RpdmVFbGVtZW50O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSAwICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZm9jdXNhYmxlRWxlbWVudHNbZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMV0uZm9jdXMoKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PT0gZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMSAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBmb2N1c2FibGVFbGVtZW50c1swXS5mb2N1cygpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24pO1xuICAgIH07XG4gIH0sIFtjb250YWluZXJdKTsgLy8gZW5zdXJlIHRoZSBwb3BvdmVyIGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIHZpZXdwb3J0XG5cbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZml0SW5WaWV3cG9ydCAmJiBwb3BvdmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBwb3BvdmVyUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH0gPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyAvL1Bvc2l0aW9uIGNvcnJlY3RseSB3aGVuIGNsaWNrZWQgb24gcmlnaHRtb3N0IHBhcnQgb3IgdGhlIGJvdHRvbSBwYXJ0IG9mIHZpZXdwb3J0XG5cbiAgICAgIGlmICh4ICsgd2lkdGggLSBvZmZzZXRMZWZ0ID4gdmlld3BvcnRXaWR0aCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBgJHt2aWV3cG9ydFdpZHRoIC0gd2lkdGggLSAxMH1weGA7XG4gICAgICB9XG5cbiAgICAgIGlmICh5ICsgaGVpZ2h0IC0gb2Zmc2V0VG9wID4gdmlld3BvcnRIZWlnaHQpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPSBgJHt2aWV3cG9ydEhlaWdodCAtIGhlaWdodH1weGA7XG4gICAgICB9IC8vUmVzaXplIHRvIGZpdCB2aWV3cG9ydCBvbiBzbWFsbGVyIHNjcmVlbnNcblxuXG4gICAgICBpZiAoaGVpZ2h0ID49IHZpZXdwb3J0SGVpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dmlld3BvcnRIZWlnaHQgLSAyMH1weGA7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gXCIxMHB4XCI7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gXCJzY3JvbGxcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKHdpZHRoID49IHZpZXdwb3J0V2lkdGgpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3ZpZXdwb3J0V2lkdGh9cHhgO1xuICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBcIjBweFwiO1xuICAgICAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93WCA9IFwic2Nyb2xsXCI7XG4gICAgICB9XG4gICAgfVxuICB9LCBbZml0SW5WaWV3cG9ydCwgdmlld3BvcnRXaWR0aCwgdmlld3BvcnRIZWlnaHQsIG9mZnNldExlZnQsIG9mZnNldFRvcF0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChvbkNsb3NlUmVxdWVzdCkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoIXBvcG92ZXJSZWYuY3VycmVudD8uY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBvbkNsb3NlUmVxdWVzdChldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbb25DbG9zZVJlcXVlc3RdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwicG9wb3ZlclwiLFxuICAgIHN0eWxlOiB7XG4gICAgICB0b3AsXG4gICAgICBsZWZ0XG4gICAgfSxcbiAgICByZWY6IHBvcG92ZXJSZWYsXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gIH0pO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///../../components/Popover.tsx\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../components/Popover.tsx?");
|
|
2327
2327
|
|
|
2328
2328
|
/***/ }),
|
|
2329
2329
|
|
|
@@ -2653,7 +2653,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
2653
2653
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2654
2654
|
|
|
2655
2655
|
"use strict";
|
|
2656
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"dragNewElement\\\": () => (/* binding */ dragNewElement),\\n/* harmony export */ \\\"dragSelectedElements\\\": () => (/* binding */ dragSelectedElements),\\n/* harmony export */ \\\"getDragOffsetXY\\\": () => (/* binding */ getDragOffsetXY)\\n/* harmony export */ });\\n/* harmony import */ var _binding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./binding */ \\\"../../element/binding.ts\\\");\\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bounds */ \\\"../../element/bounds.ts\\\");\\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _sizeHelpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sizeHelpers */ \\\"../../element/sizeHelpers.ts\\\");\\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./textElement */ \\\"../../element/textElement.ts\\\");\\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../groups */ \\\"../../groups.ts\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst dragSelectedElements = function (pointerDownState, selectedElements, pointerX, pointerY) {\\r\\n let lockDirection = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\\r\\n let distanceX = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\\r\\n let distanceY = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;\\r\\n let appState = arguments.length > 7 ? arguments[7] : undefined;\\r\\n const [x1, y1] = (0,_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(selectedElements);\\r\\n const offset = {\\r\\n x: pointerX - x1,\\r\\n y: pointerY - y1\\r\\n };\\r\\n selectedElements.forEach(function (element) {\\r\\n updateElementCoords(lockDirection, distanceX, distanceY, pointerDownState, element, offset); // update coords of bound text only if we're dragging the container directly\\r\\n // (we don't drag the group that it's part of)\\r\\n if ( // container isn't part of any group\\r\\n // (perf optim so we don't check `isSelectedViaGroup()` in every case)\\r\\n !element.groupIds.length || // container is part of a group, but we're dragging the container directly\\r\\n appState.editingGroupId && !(0,_groups__WEBPACK_IMPORTED_MODULE_5__.isSelectedViaGroup)(appState, element)) {\\r\\n const textElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_4__.getBoundTextElement)(element);\\r\\n if (textElement) {\\r\\n updateElementCoords(lockDirection, distanceX, distanceY, pointerDownState, textElement, offset);\\r\\n }\\r\\n }\\r\\n (0,_binding__WEBPACK_IMPORTED_MODULE_0__.updateBoundElements)(element, {\\r\\n simultaneouslyUpdated: selectedElements\\r\\n });\\r\\n });\\r\\n};\\r\\nconst updateElementCoords = function (lockDirection, distanceX, distanceY, pointerDownState, element, offset) {\\r\\n let x;\\r\\n let y;\\r\\n if (lockDirection) {\\r\\n const lockX = lockDirection && distanceX < distanceY;\\r\\n const lockY = lockDirection && distanceX > distanceY;\\r\\n const original = pointerDownState.originalElements.get(element.id);\\r\\n x = lockX && original ? original.x : element.x + offset.x;\\r\\n y = lockY && original ? original.y : element.y + offset.y;\\r\\n }\\r\\n else {\\r\\n x = element.x + offset.x;\\r\\n y = element.y + offset.y;\\r\\n }\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(element, {\\r\\n x,\\r\\n y\\r\\n });\\r\\n};\\r\\nconst getDragOffsetXY = function (selectedElements, x, y) {\\r\\n const [x1, y1] = (0,_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(selectedElements);\\r\\n return [x - x1, y - y1];\\r\\n};\\r\\nconst dragNewElement = function (draggingElement, elementType, originX, originY, x, y, width, height, shouldMaintainAspectRatio, shouldResizeFromCenter, widthAspectRatio) {\\r\\n if (shouldMaintainAspectRatio) {\\r\\n if (widthAspectRatio) {\\r\\n height = width / widthAspectRatio;\\r\\n }\\r\\n else {\\r\\n // Depending on where the cursor is at (x, y) relative to where the starting point is\\r\\n // (originX, originY), we use ONLY width or height to control size increase.\\r\\n // This allows the cursor to always \\\"stick\\\" to one of the sides of the bounding box.\\r\\n if (Math.abs(y - originY) > Math.abs(x - originX)) {\\r\\n ({\\r\\n width,\\r\\n height\\r\\n } = (0,_sizeHelpers__WEBPACK_IMPORTED_MODULE_3__.getPerfectElementSize)(elementType, height, x < originX ? -width : width));\\r\\n }\\r\\n else {\\r\\n ({\\r\\n width,\\r\\n height\\r\\n } = (0,_sizeHelpers__WEBPACK_IMPORTED_MODULE_3__.getPerfectElementSize)(elementType, width, y < originY ? -height : height));\\r\\n }\\r\\n if (height < 0) {\\r\\n height = -height;\\r\\n }\\r\\n }\\r\\n }\\r\\n let newX = x < originX ? originX - width : originX;\\r\\n let newY = y < originY ? originY - height : originY;\\r\\n if (shouldResizeFromCenter) {\\r\\n width += width;\\r\\n height += height;\\r\\n newX = originX - width / 2;\\r\\n newY = originY - height / 2;\\r\\n }\\r\\n if (width !== 0 && height !== 0) {\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(draggingElement, {\\r\\n x: newX,\\r\\n y: newY,\\r\\n width,\\r\\n height\\r\\n });\\r\\n }\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEVBQUUsSUFBSTtZQUNQLENBQUMsRUFBRSxJQUFJO1lBQ1AsS0FBSztZQUNMLE1BQU07U0FDUCxDQUFDLENBQUM7S0FDSjtBQUNILENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L2RyYWdFbGVtZW50cy50cz8wOGYxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVwZGF0ZUJvdW5kRWxlbWVudHMgfSBmcm9tIFwiLi9iaW5kaW5nXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi9ib3VuZHNcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQgfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXRQZXJmZWN0RWxlbWVudFNpemUgfSBmcm9tIFwiLi9zaXplSGVscGVyc1wiO1xuaW1wb3J0IHsgZ2V0Qm91bmRUZXh0RWxlbWVudCB9IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBpc1NlbGVjdGVkVmlhR3JvdXAgfSBmcm9tIFwiLi4vZ3JvdXBzXCI7XG5leHBvcnQgY29uc3QgZHJhZ1NlbGVjdGVkRWxlbWVudHMgPSBmdW5jdGlvbiAocG9pbnRlckRvd25TdGF0ZSwgc2VsZWN0ZWRFbGVtZW50cywgcG9pbnRlclgsIHBvaW50ZXJZKSB7XG4gIGxldCBsb2NrRGlyZWN0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBmYWxzZTtcbiAgbGV0IGRpc3RhbmNlWCA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogMDtcbiAgbGV0IGRpc3RhbmNlWSA9IGFyZ3VtZW50cy5sZW5ndGggPiA2ICYmIGFyZ3VtZW50c1s2XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzZdIDogMDtcbiAgbGV0IGFwcFN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDcgPyBhcmd1bWVudHNbN10gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IFt4MSwgeTFdID0gZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpO1xuICBjb25zdCBvZmZzZXQgPSB7XG4gICAgeDogcG9pbnRlclggLSB4MSxcbiAgICB5OiBwb2ludGVyWSAtIHkxXG4gIH07XG4gIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHVwZGF0ZUVsZW1lbnRDb29yZHMobG9ja0RpcmVjdGlvbiwgZGlzdGFuY2VYLCBkaXN0YW5jZVksIHBvaW50ZXJEb3duU3RhdGUsIGVsZW1lbnQsIG9mZnNldCk7IC8vIHVwZGF0ZSBjb29yZHMgb2YgYm91bmQgdGV4dCBvbmx5IGlmIHdlJ3JlIGRyYWdnaW5nIHRoZSBjb250YWluZXIgZGlyZWN0bHlcbiAgICAvLyAod2UgZG9uJ3QgZHJhZyB0aGUgZ3JvdXAgdGhhdCBpdCdzIHBhcnQgb2YpXG5cbiAgICBpZiAoIC8vIGNvbnRhaW5lciBpc24ndCBwYXJ0IG9mIGFueSBncm91cFxuICAgIC8vIChwZXJmIG9wdGltIHNvIHdlIGRvbid0IGNoZWNrIGBpc1NlbGVjdGVkVmlhR3JvdXAoKWAgaW4gZXZlcnkgY2FzZSlcbiAgICAhZWxlbWVudC5ncm91cElkcy5sZW5ndGggfHwgLy8gY29udGFpbmVyIGlzIHBhcnQgb2YgYSBncm91cCwgYnV0IHdlJ3JlIGRyYWdnaW5nIHRoZSBjb250YWluZXIgZGlyZWN0bHlcbiAgICBhcHBTdGF0ZS5lZGl0aW5nR3JvdXBJZCAmJiAhaXNTZWxlY3RlZFZpYUdyb3VwKGFwcFN0YXRlLCBlbGVtZW50KSkge1xuICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICBpZiAodGV4dEVsZW1lbnQpIHtcbiAgICAgICAgdXBkYXRlRWxlbWVudENvb3Jkcyhsb2NrRGlyZWN0aW9uLCBkaXN0YW5jZVgsIGRpc3RhbmNlWSwgcG9pbnRlckRvd25TdGF0ZSwgdGV4dEVsZW1lbnQsIG9mZnNldCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlQm91bmRFbGVtZW50cyhlbGVtZW50LCB7XG4gICAgICBzaW11bHRhbmVvdXNseVVwZGF0ZWQ6IHNlbGVjdGVkRWxlbWVudHNcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5jb25zdCB1cGRhdGVFbGVtZW50Q29vcmRzID0gZnVuY3Rpb24gKGxvY2tEaXJlY3Rpb24sIGRpc3RhbmNlWCwgZGlzdGFuY2VZLCBwb2ludGVyRG93blN0YXRlLCBlbGVtZW50LCBvZmZzZXQpIHtcbiAgbGV0IHg7XG4gIGxldCB5O1xuXG4gIGlmIChsb2NrRGlyZWN0aW9uKSB7XG4gICAgY29uc3QgbG9ja1ggPSBsb2NrRGlyZWN0aW9uICYmIGRpc3RhbmNlWCA8IGRpc3RhbmNlWTtcbiAgICBjb25zdCBsb2NrWSA9IGxvY2tEaXJlY3Rpb24gJiYgZGlzdGFuY2VYID4gZGlzdGFuY2VZO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5hbEVsZW1lbnRzLmdldChlbGVtZW50LmlkKTtcbiAgICB4ID0gbG9ja1ggJiYgb3JpZ2luYWwgPyBvcmlnaW5hbC54IDogZWxlbWVudC54ICsgb2Zmc2V0Lng7XG4gICAgeSA9IGxvY2tZICYmIG9yaWdpbmFsID8gb3JpZ2luYWwueSA6IGVsZW1lbnQueSArIG9mZnNldC55O1xuICB9IGVsc2Uge1xuICAgIHggPSBlbGVtZW50LnggKyBvZmZzZXQueDtcbiAgICB5ID0gZWxlbWVudC55ICsgb2Zmc2V0Lnk7XG4gIH1cblxuICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICB4LFxuICAgIHlcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RHJhZ09mZnNldFhZID0gZnVuY3Rpb24gKHNlbGVjdGVkRWxlbWVudHMsIHgsIHkpIHtcbiAgY29uc3QgW3gxLCB5MV0gPSBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyk7XG4gIHJldHVybiBbeCAtIHgxLCB5IC0geTFdO1xufTtcbmV4cG9ydCBjb25zdCBkcmFnTmV3RWxlbWVudCA9IGZ1bmN0aW9uIChkcmFnZ2luZ0VsZW1lbnQsIGVsZW1lbnRUeXBlLCBvcmlnaW5YLCBvcmlnaW5ZLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvLCBzaG91bGRSZXNpemVGcm9tQ2VudGVyLCB3aWR0aEFzcGVjdFJhdGlvKSB7XG4gIGlmIChzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKSB7XG4gICAgaWYgKHdpZHRoQXNwZWN0UmF0aW8pIHtcbiAgICAgIGhlaWdodCA9IHdpZHRoIC8gd2lkdGhBc3BlY3RSYXRpbztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBjdXJzb3IgaXMgYXQgKHgsIHkpIHJlbGF0aXZlIHRvIHdoZXJlIHRoZSBzdGFydGluZyBwb2ludCBpc1xuICAgICAgLy8gKG9yaWdpblgsIG9yaWdpblkpLCB3ZSB1c2UgT05MWSB3aWR0aCBvciBoZWlnaHQgdG8gY29udHJvbCBzaXplIGluY3JlYXNlLlxuICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIGN1cnNvciB0byBhbHdheXMgXCJzdGlja1wiIHRvIG9uZSBvZiB0aGUgc2lkZXMgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgIGlmIChNYXRoLmFicyh5IC0gb3JpZ2luWSkgPiBNYXRoLmFicyh4IC0gb3JpZ2luWCkpIHtcbiAgICAgICAgKHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHRcbiAgICAgICAgfSA9IGdldFBlcmZlY3RFbGVtZW50U2l6ZShlbGVtZW50VHlwZSwgaGVpZ2h0LCB4IDwgb3JpZ2luWCA/IC13aWR0aCA6IHdpZHRoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAoe1xuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodFxuICAgICAgICB9ID0gZ2V0UGVyZmVjdEVsZW1lbnRTaXplKGVsZW1lbnRUeXBlLCB3aWR0aCwgeSA8IG9yaWdpblkgPyAtaGVpZ2h0IDogaGVpZ2h0KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoZWlnaHQgPCAwKSB7XG4gICAgICAgIGhlaWdodCA9IC1oZWlnaHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IG5ld1ggPSB4IDwgb3JpZ2luWCA/IG9yaWdpblggLSB3aWR0aCA6IG9yaWdpblg7XG4gIGxldCBuZXdZID0geSA8IG9yaWdpblkgPyBvcmlnaW5ZIC0gaGVpZ2h0IDogb3JpZ2luWTtcblxuICBpZiAoc2hvdWxkUmVzaXplRnJvbUNlbnRlcikge1xuICAgIHdpZHRoICs9IHdpZHRoO1xuICAgIGhlaWdodCArPSBoZWlnaHQ7XG4gICAgbmV3WCA9IG9yaWdpblggLSB3aWR0aCAvIDI7XG4gICAgbmV3WSA9IG9yaWdpblkgLSBoZWlnaHQgLyAyO1xuICB9XG5cbiAgaWYgKHdpZHRoICE9PSAwICYmIGhlaWdodCAhPT0gMCkge1xuICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICB4OiBuZXdYLFxuICAgICAgeTogbmV3WSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSk7XG4gIH1cbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///../../element/dragElements.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../element/dragElements.ts?");
|
|
2656
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"dragNewElement\\\": () => (/* binding */ dragNewElement),\\n/* harmony export */ \\\"dragSelectedElements\\\": () => (/* binding */ dragSelectedElements),\\n/* harmony export */ \\\"getDragOffsetXY\\\": () => (/* binding */ getDragOffsetXY)\\n/* harmony export */ });\\n/* harmony import */ var _binding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./binding */ \\\"../../element/binding.ts\\\");\\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bounds */ \\\"../../element/bounds.ts\\\");\\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _sizeHelpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sizeHelpers */ \\\"../../element/sizeHelpers.ts\\\");\\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./textElement */ \\\"../../element/textElement.ts\\\");\\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../groups */ \\\"../../groups.ts\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst dragSelectedElements = function (pointerDownState, selectedElements, pointerX, pointerY) {\\r\\n let lockDirection = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\\r\\n let distanceX = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\\r\\n let distanceY = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;\\r\\n let appState = arguments.length > 7 ? arguments[7] : undefined;\\r\\n const [x1, y1] = (0,_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(selectedElements);\\r\\n const offset = {\\r\\n x: pointerX - x1,\\r\\n y: pointerY - y1\\r\\n };\\r\\n selectedElements.forEach(function (element) {\\r\\n updateElementCoords(lockDirection, distanceX, distanceY, pointerDownState, element, offset); // update coords of bound text only if we're dragging the container directly\\r\\n // (we don't drag the group that it's part of)\\r\\n if ( // container isn't part of any group\\r\\n // (perf optim so we don't check `isSelectedViaGroup()` in every case)\\r\\n !element.groupIds.length || // container is part of a group, but we're dragging the container directly\\r\\n appState.editingGroupId && !(0,_groups__WEBPACK_IMPORTED_MODULE_5__.isSelectedViaGroup)(appState, element)) {\\r\\n const textElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_4__.getBoundTextElement)(element);\\r\\n if (textElement) {\\r\\n updateElementCoords(lockDirection, distanceX, distanceY, pointerDownState, textElement, offset);\\r\\n }\\r\\n }\\r\\n (0,_binding__WEBPACK_IMPORTED_MODULE_0__.updateBoundElements)(element, {\\r\\n simultaneouslyUpdated: selectedElements\\r\\n });\\r\\n });\\r\\n};\\r\\nconst updateElementCoords = function (lockDirection, distanceX, distanceY, pointerDownState, element, offset) {\\r\\n let x;\\r\\n let y;\\r\\n if (lockDirection) {\\r\\n const lockX = lockDirection && distanceX < distanceY;\\r\\n const lockY = lockDirection && distanceX > distanceY;\\r\\n const original = pointerDownState.originalElements.get(element.id);\\r\\n x = lockX && original ? original.x : element.x + offset.x;\\r\\n y = lockY && original ? original.y : element.y + offset.y;\\r\\n }\\r\\n else {\\r\\n x = element.x + offset.x;\\r\\n y = element.y + offset.y;\\r\\n }\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(element, {\\r\\n x,\\r\\n y\\r\\n });\\r\\n};\\r\\nconst getDragOffsetXY = function (selectedElements, x, y) {\\r\\n const [x1, y1] = (0,_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(selectedElements);\\r\\n return [x - x1, y - y1];\\r\\n};\\r\\nconst dragNewElement = function (draggingElement, elementType, originX, originY, x, y, width, height, shouldMaintainAspectRatio, shouldResizeFromCenter, widthAspectRatio) {\\r\\n if (shouldMaintainAspectRatio && draggingElement.type !== \\\"selection\\\") {\\r\\n if (widthAspectRatio) {\\r\\n height = width / widthAspectRatio;\\r\\n }\\r\\n else {\\r\\n // Depending on where the cursor is at (x, y) relative to where the starting point is\\r\\n // (originX, originY), we use ONLY width or height to control size increase.\\r\\n // This allows the cursor to always \\\"stick\\\" to one of the sides of the bounding box.\\r\\n if (Math.abs(y - originY) > Math.abs(x - originX)) {\\r\\n ({\\r\\n width,\\r\\n height\\r\\n } = (0,_sizeHelpers__WEBPACK_IMPORTED_MODULE_3__.getPerfectElementSize)(elementType, height, x < originX ? -width : width));\\r\\n }\\r\\n else {\\r\\n ({\\r\\n width,\\r\\n height\\r\\n } = (0,_sizeHelpers__WEBPACK_IMPORTED_MODULE_3__.getPerfectElementSize)(elementType, width, y < originY ? -height : height));\\r\\n }\\r\\n if (height < 0) {\\r\\n height = -height;\\r\\n }\\r\\n }\\r\\n }\\r\\n let newX = x < originX ? originX - width : originX;\\r\\n let newY = y < originY ? originY - height : originY;\\r\\n if (shouldResizeFromCenter) {\\r\\n width += width;\\r\\n height += height;\\r\\n newX = originX - width / 2;\\r\\n newY = originY - height / 2;\\r\\n }\\r\\n if (width !== 0 && height !== 0) {\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(draggingElement, {\\r\\n x: newX,\\r\\n y: newY,\\r\\n width,\\r\\n height\\r\\n });\\r\\n }\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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REFBYSxDQUFDLGVBQWUsRUFBRTtZQUM3QixDQUFDLEVBQUUsSUFBSTtZQUNQLENBQUMsRUFBRSxJQUFJO1lBQ1AsS0FBSztZQUNMLE1BQU07U0FDUCxDQUFDLENBQUM7S0FDSjtBQUNILENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L2RyYWdFbGVtZW50cy50cz8wOGYxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVwZGF0ZUJvdW5kRWxlbWVudHMgfSBmcm9tIFwiLi9iaW5kaW5nXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi9ib3VuZHNcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQgfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXRQZXJmZWN0RWxlbWVudFNpemUgfSBmcm9tIFwiLi9zaXplSGVscGVyc1wiO1xuaW1wb3J0IHsgZ2V0Qm91bmRUZXh0RWxlbWVudCB9IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBpc1NlbGVjdGVkVmlhR3JvdXAgfSBmcm9tIFwiLi4vZ3JvdXBzXCI7XG5leHBvcnQgY29uc3QgZHJhZ1NlbGVjdGVkRWxlbWVudHMgPSBmdW5jdGlvbiAocG9pbnRlckRvd25TdGF0ZSwgc2VsZWN0ZWRFbGVtZW50cywgcG9pbnRlclgsIHBvaW50ZXJZKSB7XG4gIGxldCBsb2NrRGlyZWN0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBmYWxzZTtcbiAgbGV0IGRpc3RhbmNlWCA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogMDtcbiAgbGV0IGRpc3RhbmNlWSA9IGFyZ3VtZW50cy5sZW5ndGggPiA2ICYmIGFyZ3VtZW50c1s2XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzZdIDogMDtcbiAgbGV0IGFwcFN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDcgPyBhcmd1bWVudHNbN10gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IFt4MSwgeTFdID0gZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpO1xuICBjb25zdCBvZmZzZXQgPSB7XG4gICAgeDogcG9pbnRlclggLSB4MSxcbiAgICB5OiBwb2ludGVyWSAtIHkxXG4gIH07XG4gIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHVwZGF0ZUVsZW1lbnRDb29yZHMobG9ja0RpcmVjdGlvbiwgZGlzdGFuY2VYLCBkaXN0YW5jZVksIHBvaW50ZXJEb3duU3RhdGUsIGVsZW1lbnQsIG9mZnNldCk7IC8vIHVwZGF0ZSBjb29yZHMgb2YgYm91bmQgdGV4dCBvbmx5IGlmIHdlJ3JlIGRyYWdnaW5nIHRoZSBjb250YWluZXIgZGlyZWN0bHlcbiAgICAvLyAod2UgZG9uJ3QgZHJhZyB0aGUgZ3JvdXAgdGhhdCBpdCdzIHBhcnQgb2YpXG5cbiAgICBpZiAoIC8vIGNvbnRhaW5lciBpc24ndCBwYXJ0IG9mIGFueSBncm91cFxuICAgIC8vIChwZXJmIG9wdGltIHNvIHdlIGRvbid0IGNoZWNrIGBpc1NlbGVjdGVkVmlhR3JvdXAoKWAgaW4gZXZlcnkgY2FzZSlcbiAgICAhZWxlbWVudC5ncm91cElkcy5sZW5ndGggfHwgLy8gY29udGFpbmVyIGlzIHBhcnQgb2YgYSBncm91cCwgYnV0IHdlJ3JlIGRyYWdnaW5nIHRoZSBjb250YWluZXIgZGlyZWN0bHlcbiAgICBhcHBTdGF0ZS5lZGl0aW5nR3JvdXBJZCAmJiAhaXNTZWxlY3RlZFZpYUdyb3VwKGFwcFN0YXRlLCBlbGVtZW50KSkge1xuICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICBpZiAodGV4dEVsZW1lbnQpIHtcbiAgICAgICAgdXBkYXRlRWxlbWVudENvb3Jkcyhsb2NrRGlyZWN0aW9uLCBkaXN0YW5jZVgsIGRpc3RhbmNlWSwgcG9pbnRlckRvd25TdGF0ZSwgdGV4dEVsZW1lbnQsIG9mZnNldCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlQm91bmRFbGVtZW50cyhlbGVtZW50LCB7XG4gICAgICBzaW11bHRhbmVvdXNseVVwZGF0ZWQ6IHNlbGVjdGVkRWxlbWVudHNcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5jb25zdCB1cGRhdGVFbGVtZW50Q29vcmRzID0gZnVuY3Rpb24gKGxvY2tEaXJlY3Rpb24sIGRpc3RhbmNlWCwgZGlzdGFuY2VZLCBwb2ludGVyRG93blN0YXRlLCBlbGVtZW50LCBvZmZzZXQpIHtcbiAgbGV0IHg7XG4gIGxldCB5O1xuXG4gIGlmIChsb2NrRGlyZWN0aW9uKSB7XG4gICAgY29uc3QgbG9ja1ggPSBsb2NrRGlyZWN0aW9uICYmIGRpc3RhbmNlWCA8IGRpc3RhbmNlWTtcbiAgICBjb25zdCBsb2NrWSA9IGxvY2tEaXJlY3Rpb24gJiYgZGlzdGFuY2VYID4gZGlzdGFuY2VZO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5hbEVsZW1lbnRzLmdldChlbGVtZW50LmlkKTtcbiAgICB4ID0gbG9ja1ggJiYgb3JpZ2luYWwgPyBvcmlnaW5hbC54IDogZWxlbWVudC54ICsgb2Zmc2V0Lng7XG4gICAgeSA9IGxvY2tZICYmIG9yaWdpbmFsID8gb3JpZ2luYWwueSA6IGVsZW1lbnQueSArIG9mZnNldC55O1xuICB9IGVsc2Uge1xuICAgIHggPSBlbGVtZW50LnggKyBvZmZzZXQueDtcbiAgICB5ID0gZWxlbWVudC55ICsgb2Zmc2V0Lnk7XG4gIH1cblxuICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICB4LFxuICAgIHlcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RHJhZ09mZnNldFhZID0gZnVuY3Rpb24gKHNlbGVjdGVkRWxlbWVudHMsIHgsIHkpIHtcbiAgY29uc3QgW3gxLCB5MV0gPSBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyk7XG4gIHJldHVybiBbeCAtIHgxLCB5IC0geTFdO1xufTtcbmV4cG9ydCBjb25zdCBkcmFnTmV3RWxlbWVudCA9IGZ1bmN0aW9uIChkcmFnZ2luZ0VsZW1lbnQsIGVsZW1lbnRUeXBlLCBvcmlnaW5YLCBvcmlnaW5ZLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvLCBzaG91bGRSZXNpemVGcm9tQ2VudGVyLCB3aWR0aEFzcGVjdFJhdGlvKSB7XG4gIGlmIChzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvICYmIGRyYWdnaW5nRWxlbWVudC50eXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgaWYgKHdpZHRoQXNwZWN0UmF0aW8pIHtcbiAgICAgIGhlaWdodCA9IHdpZHRoIC8gd2lkdGhBc3BlY3RSYXRpbztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBjdXJzb3IgaXMgYXQgKHgsIHkpIHJlbGF0aXZlIHRvIHdoZXJlIHRoZSBzdGFydGluZyBwb2ludCBpc1xuICAgICAgLy8gKG9yaWdpblgsIG9yaWdpblkpLCB3ZSB1c2UgT05MWSB3aWR0aCBvciBoZWlnaHQgdG8gY29udHJvbCBzaXplIGluY3JlYXNlLlxuICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIGN1cnNvciB0byBhbHdheXMgXCJzdGlja1wiIHRvIG9uZSBvZiB0aGUgc2lkZXMgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgIGlmIChNYXRoLmFicyh5IC0gb3JpZ2luWSkgPiBNYXRoLmFicyh4IC0gb3JpZ2luWCkpIHtcbiAgICAgICAgKHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHRcbiAgICAgICAgfSA9IGdldFBlcmZlY3RFbGVtZW50U2l6ZShlbGVtZW50VHlwZSwgaGVpZ2h0LCB4IDwgb3JpZ2luWCA/IC13aWR0aCA6IHdpZHRoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAoe1xuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodFxuICAgICAgICB9ID0gZ2V0UGVyZmVjdEVsZW1lbnRTaXplKGVsZW1lbnRUeXBlLCB3aWR0aCwgeSA8IG9yaWdpblkgPyAtaGVpZ2h0IDogaGVpZ2h0KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoZWlnaHQgPCAwKSB7XG4gICAgICAgIGhlaWdodCA9IC1oZWlnaHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IG5ld1ggPSB4IDwgb3JpZ2luWCA/IG9yaWdpblggLSB3aWR0aCA6IG9yaWdpblg7XG4gIGxldCBuZXdZID0geSA8IG9yaWdpblkgPyBvcmlnaW5ZIC0gaGVpZ2h0IDogb3JpZ2luWTtcblxuICBpZiAoc2hvdWxkUmVzaXplRnJvbUNlbnRlcikge1xuICAgIHdpZHRoICs9IHdpZHRoO1xuICAgIGhlaWdodCArPSBoZWlnaHQ7XG4gICAgbmV3WCA9IG9yaWdpblggLSB3aWR0aCAvIDI7XG4gICAgbmV3WSA9IG9yaWdpblkgLSBoZWlnaHQgLyAyO1xuICB9XG5cbiAgaWYgKHdpZHRoICE9PSAwICYmIGhlaWdodCAhPT0gMCkge1xuICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICB4OiBuZXdYLFxuICAgICAgeTogbmV3WSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSk7XG4gIH1cbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///../../element/dragElements.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../element/dragElements.ts?");
|
|
2657
2657
|
|
|
2658
2658
|
/***/ }),
|
|
2659
2659
|
|
|
@@ -2675,7 +2675,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
2675
2675
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2676
2676
|
|
|
2677
2677
|
"use strict";
|
|
2678
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"OMIT_SIDES_FOR_MULTIPLE_ELEMENTS\\\": () => (/* reexport safe */ _transformHandles__WEBPACK_IMPORTED_MODULE_5__.OMIT_SIDES_FOR_MULTIPLE_ELEMENTS),\\n/* harmony export */ \\\"clearElementsForDatabase\\\": () => (/* binding */ clearElementsForDatabase),\\n/* harmony export */ \\\"clearElementsForExport\\\": () => (/* binding */ clearElementsForExport),\\n/* harmony export */ \\\"clearElementsForLocalStorage\\\": () => (/* binding */ clearElementsForLocalStorage),\\n/* harmony export */ \\\"dragNewElement\\\": () => (/* reexport safe */ _dragElements__WEBPACK_IMPORTED_MODULE_9__.dragNewElement),\\n/* harmony export */ \\\"dragSelectedElements\\\": () => (/* reexport safe */ _dragElements__WEBPACK_IMPORTED_MODULE_9__.dragSelectedElements),\\n/* harmony export */ \\\"duplicateElement\\\": () => (/* reexport safe */ _newElement__WEBPACK_IMPORTED_MODULE_3__.duplicateElement),\\n/* harmony export */ \\\"getArrowheadPoints\\\": () => (/* reexport safe */ _bounds__WEBPACK_IMPORTED_MODULE_4__.getArrowheadPoints),\\n/* harmony export */ \\\"getClosestElementBounds\\\": () => (/* reexport safe */ _bounds__WEBPACK_IMPORTED_MODULE_4__.getClosestElementBounds),\\n/* harmony export */ \\\"getCommonBounds\\\": () => (/* reexport safe */ _bounds__WEBPACK_IMPORTED_MODULE_4__.getCommonBounds),\\n/* harmony export */ \\\"getCursorForResizingElement\\\": () => (/* reexport safe */ _resizeTest__WEBPACK_IMPORTED_MODULE_7__.getCursorForResizingElement),\\n/* harmony export */ \\\"getDiamondPoints\\\": () => (/* reexport safe */ _bounds__WEBPACK_IMPORTED_MODULE_4__.getDiamondPoints),\\n/* harmony export */ \\\"getDragOffsetXY\\\": () => (/* reexport safe */ _dragElements__WEBPACK_IMPORTED_MODULE_9__.getDragOffsetXY),\\n/* harmony export */ \\\"getElementAbsoluteCoords\\\": () => (/* reexport safe */ _bounds__WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords),\\n/* harmony export */ \\\"getElementBounds\\\": () => (/* reexport safe */ _bounds__WEBPACK_IMPORTED_MODULE_4__.getElementBounds),\\n/* harmony export */ \\\"getElementWithTransformHandleType\\\": () => (/* reexport safe */ _resizeTest__WEBPACK_IMPORTED_MODULE_7__.getElementWithTransformHandleType),\\n/* harmony export */ \\\"getNonDeletedElements\\\": () => (/* binding */ getNonDeletedElements),\\n/* harmony export */ \\\"getNormalizedDimensions\\\": () => (/* reexport safe */ _sizeHelpers__WEBPACK_IMPORTED_MODULE_1__.getNormalizedDimensions),\\n/* harmony export */ \\\"getPerfectElementSize\\\": () => (/* reexport safe */ _sizeHelpers__WEBPACK_IMPORTED_MODULE_1__.getPerfectElementSize),\\n/* harmony export */ \\\"getResizeArrowDirection\\\": () => (/* reexport safe */ _resizeElements__WEBPACK_IMPORTED_MODULE_8__.getResizeArrowDirection),\\n/* harmony export */ \\\"getResizeOffsetXY\\\": () => (/* reexport safe */ _resizeElements__WEBPACK_IMPORTED_MODULE_8__.getResizeOffsetXY),\\n/* harmony export */ \\\"getSceneVersion\\\": () => (/* binding */ getSceneVersion),\\n/* harmony export */ \\\"getTransformHandleTypeFromCoords\\\": () => (/* reexport safe */ _resizeTest__WEBPACK_IMPORTED_MODULE_7__.getTransformHandleTypeFromCoords),\\n/* harmony export */ \\\"getTransformHandles\\\": () => (/* reexport safe */ _transformHandles__WEBPACK_IMPORTED_MODULE_5__.getTransformHandles),\\n/* harmony export */ \\\"getTransformHandlesFromCoords\\\": () => (/* reexport safe */ _transformHandles__WEBPACK_IMPORTED_MODULE_5__.getTransformHandlesFromCoords),\\n/* harmony export */ \\\"getVisibleElements\\\": () => (/* binding */ getVisibleElements),\\n/* harmony export */ \\\"hitTest\\\": () => (/* reexport safe */ _collision__WEBPACK_IMPORTED_MODULE_6__.hitTest),\\n/* harmony export */ \\\"isExcalidrawElement\\\": () => (/* reexport safe */ _typeChecks__WEBPACK_IMPORTED_MODULE_2__.isExcalidrawElement),\\n/* harmony export */ \\\"isHittingElementBoundingBoxWithoutHittingElement\\\": () => (/* reexport safe */ _collision__WEBPACK_IMPORTED_MODULE_6__.isHittingElementBoundingBoxWithoutHittingElement),\\n/* harmony export */ \\\"isInvisiblySmallElement\\\": () => (/* reexport safe */ _sizeHelpers__WEBPACK_IMPORTED_MODULE_1__.isInvisiblySmallElement),\\n/* harmony export */ \\\"isNonDeletedElement\\\": () => (/* binding */ isNonDeletedElement),\\n/* harmony export */ \\\"isTextElement\\\": () => (/* reexport safe */ _typeChecks__WEBPACK_IMPORTED_MODULE_2__.isTextElement),\\n/* harmony export */ \\\"newElement\\\": () => (/* reexport safe */ _newElement__WEBPACK_IMPORTED_MODULE_3__.newElement),\\n/* harmony export */ \\\"newImageElement\\\": () => (/* reexport safe */ _newElement__WEBPACK_IMPORTED_MODULE_3__.newImageElement),\\n/* harmony export */ \\\"newLinearElement\\\": () => (/* reexport safe */ _newElement__WEBPACK_IMPORTED_MODULE_3__.newLinearElement),\\n/* harmony export */ \\\"newTextElement\\\": () => (/* reexport safe */ _newElement__WEBPACK_IMPORTED_MODULE_3__.newTextElement),\\n/* harmony export */ \\\"redrawTextBoundingBox\\\": () => (/* reexport safe */ _textElement__WEBPACK_IMPORTED_MODULE_11__.redrawTextBoundingBox),\\n/* harmony export */ \\\"resizePerfectLineForNWHandler\\\": () => (/* reexport safe */ _sizeHelpers__WEBPACK_IMPORTED_MODULE_1__.resizePerfectLineForNWHandler),\\n/* harmony export */ \\\"resizeTest\\\": () => (/* reexport safe */ _resizeTest__WEBPACK_IMPORTED_MODULE_7__.resizeTest),\\n/* harmony export */ \\\"showSelectedShapeActions\\\": () => (/* reexport safe */ _showSelectedShapeActions__WEBPACK_IMPORTED_MODULE_12__.showSelectedShapeActions),\\n/* harmony export */ \\\"textWysiwyg\\\": () => (/* reexport safe */ _textWysiwyg__WEBPACK_IMPORTED_MODULE_10__.textWysiwyg),\\n/* harmony export */ \\\"transformElements\\\": () => (/* reexport safe */ _resizeElements__WEBPACK_IMPORTED_MODULE_8__.transformElements),\\n/* harmony export */ \\\"updateTextElement\\\": () => (/* reexport safe */ _newElement__WEBPACK_IMPORTED_MODULE_3__.updateTextElement)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\\\");\\n/* harmony import */ var _sizeHelpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sizeHelpers */ \\\"../../element/sizeHelpers.ts\\\");\\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _newElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./newElement */ \\\"../../element/newElement.ts\\\");\\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./bounds */ \\\"../../element/bounds.ts\\\");\\n/* harmony import */ var _transformHandles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./transformHandles */ \\\"../../element/transformHandles.ts\\\");\\n/* harmony import */ var _collision__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./collision */ \\\"../../element/collision.ts\\\");\\n/* harmony import */ var _resizeTest__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./resizeTest */ \\\"../../element/resizeTest.ts\\\");\\n/* harmony import */ var _resizeElements__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./resizeElements */ \\\"../../element/resizeElements.ts\\\");\\n/* harmony import */ var _dragElements__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./dragElements */ \\\"../../element/dragElements.ts\\\");\\n/* harmony import */ var _textWysiwyg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./textWysiwyg */ \\\"../../element/textWysiwyg.tsx\\\");\\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./textElement */ \\\"../../element/textElement.ts\\\");\\n/* harmony import */ var _showSelectedShapeActions__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./showSelectedShapeActions */ \\\"../../element/showSelectedShapeActions.ts\\\");\\n\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst getSceneVersion = function (elements) {\\r\\n return elements.reduce(function (acc, el) {\\r\\n return acc + el.version;\\r\\n }, 0);\\r\\n};\\r\\nconst getVisibleElements = function (elements) {\\r\\n return elements.filter(function (el) {\\r\\n return !el.isDeleted && !(0,_sizeHelpers__WEBPACK_IMPORTED_MODULE_1__.isInvisiblySmallElement)(el);\\r\\n });\\r\\n};\\r\\nconst getNonDeletedElements = function (elements) {\\r\\n return elements.filter(function (element) {\\r\\n return !element.isDeleted;\\r\\n });\\r\\n};\\r\\nconst isNonDeletedElement = function (element) {\\r\\n return !element.isDeleted;\\r\\n};\\r\\nconst _clearElements = function (elements) {\\r\\n return getNonDeletedElements(elements).map(function (element) {\\r\\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_2__.isLinearElementType)(element.type) ? _objectSpread(_objectSpread({}, element), {}, {\\r\\n lastCommittedPoint: null\\r\\n }) : element;\\r\\n });\\r\\n};\\r\\nconst clearElementsForDatabase = function (elements) {\\r\\n return _clearElements(elements);\\r\\n};\\r\\nconst clearElementsForExport = function (elements) {\\r\\n return _clearElements(elements);\\r\\n};\\r\\nconst clearElementsForLocalStorage = function (elements) {\\r\\n return _clearElements(elements);\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZWxlbWVudC9pbmRleC50cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFvRTtBQUVwRSxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsY0FBYyxJQUFJLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRTtJQUFFLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUFDLGNBQWMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLE9BQU8sTUFBTSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztDQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBRXJWLFNBQVMsYUFBYSxDQUFDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUFFLElBQUksTUFBTSxHQUFHLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxpRkFBZSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUFFLENBQUMsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBRWxjO0FBQ0w7QUFDK0U7QUFDb0I7QUFDNUI7QUFDbEM7QUFDb0Q7QUFDM0M7QUFDVjtBQUNyQjtBQUN0QjtBQUNVO0FBQ2lGO0FBQ2pFO0FBQy9ELE1BQU0sZUFBZSxHQUFHLFVBQVUsUUFBUTtJQUMvQyxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLEVBQUUsRUFBRTtRQUN0QyxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQzFCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNSLENBQUMsQ0FBQztBQUNLLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxRQUFRO0lBQ2xELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7UUFDakMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLElBQUksQ0FBQyxxRUFBdUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUNLLE1BQU0scUJBQXFCLEdBQUcsVUFBVSxRQUFRO0lBQ3JELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLE9BQU87UUFDdEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFDSyxNQUFNLG1CQUFtQixHQUFHLFVBQVUsT0FBTztJQUNsRCxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUM1QixDQUFDLENBQUM7QUFFRixNQUFNLGNBQWMsR0FBRyxVQUFVLFFBQVE7SUFDdkMsT0FBTyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxPQUFPO1FBQzFELE9BQU8sZ0VBQW1CLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDdkYsa0JBQWtCLEVBQUUsSUFBSTtTQUN6QixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUNmLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUssTUFBTSx3QkFBd0IsR0FBRyxVQUFVLFFBQVE7SUFDeEQsT0FBTyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxzQkFBc0IsR0FBRyxVQUFVLFFBQVE7SUFDdEQsT0FBTyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBQ0ssTUFBTSw0QkFBNEIsR0FBRyxVQUFVLFFBQVE7SUFDNUQsT0FBTyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvaW5kZXgudHM/ZTVmYSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IGlzSW52aXNpYmx5U21hbGxFbGVtZW50IH0gZnJvbSBcIi4vc2l6ZUhlbHBlcnNcIjtcbmltcG9ydCB7IGlzTGluZWFyRWxlbWVudFR5cGUgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5leHBvcnQgeyBuZXdFbGVtZW50LCBuZXdUZXh0RWxlbWVudCwgdXBkYXRlVGV4dEVsZW1lbnQsIG5ld0xpbmVhckVsZW1lbnQsIG5ld0ltYWdlRWxlbWVudCwgZHVwbGljYXRlRWxlbWVudCB9IGZyb20gXCIuL25ld0VsZW1lbnRcIjtcbmV4cG9ydCB7IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcywgZ2V0RWxlbWVudEJvdW5kcywgZ2V0Q29tbW9uQm91bmRzLCBnZXREaWFtb25kUG9pbnRzLCBnZXRBcnJvd2hlYWRQb2ludHMsIGdldENsb3Nlc3RFbGVtZW50Qm91bmRzIH0gZnJvbSBcIi4vYm91bmRzXCI7XG5leHBvcnQgeyBPTUlUX1NJREVTX0ZPUl9NVUxUSVBMRV9FTEVNRU5UUywgZ2V0VHJhbnNmb3JtSGFuZGxlc0Zyb21Db29yZHMsIGdldFRyYW5zZm9ybUhhbmRsZXMgfSBmcm9tIFwiLi90cmFuc2Zvcm1IYW5kbGVzXCI7XG5leHBvcnQgeyBoaXRUZXN0LCBpc0hpdHRpbmdFbGVtZW50Qm91bmRpbmdCb3hXaXRob3V0SGl0dGluZ0VsZW1lbnQgfSBmcm9tIFwiLi9jb2xsaXNpb25cIjtcbmV4cG9ydCB7IHJlc2l6ZVRlc3QsIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudCwgZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLCBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyB9IGZyb20gXCIuL3Jlc2l6ZVRlc3RcIjtcbmV4cG9ydCB7IHRyYW5zZm9ybUVsZW1lbnRzLCBnZXRSZXNpemVPZmZzZXRYWSwgZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24gfSBmcm9tIFwiLi9yZXNpemVFbGVtZW50c1wiO1xuZXhwb3J0IHsgZHJhZ1NlbGVjdGVkRWxlbWVudHMsIGdldERyYWdPZmZzZXRYWSwgZHJhZ05ld0VsZW1lbnQgfSBmcm9tIFwiLi9kcmFnRWxlbWVudHNcIjtcbmV4cG9ydCB7IGlzVGV4dEVsZW1lbnQsIGlzRXhjYWxpZHJhd0VsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5leHBvcnQgeyB0ZXh0V3lzaXd5ZyB9IGZyb20gXCIuL3RleHRXeXNpd3lnXCI7XG5leHBvcnQgeyByZWRyYXdUZXh0Qm91bmRpbmdCb3ggfSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuZXhwb3J0IHsgZ2V0UGVyZmVjdEVsZW1lbnRTaXplLCBpc0ludmlzaWJseVNtYWxsRWxlbWVudCwgcmVzaXplUGVyZmVjdExpbmVGb3JOV0hhbmRsZXIsIGdldE5vcm1hbGl6ZWREaW1lbnNpb25zIH0gZnJvbSBcIi4vc2l6ZUhlbHBlcnNcIjtcbmV4cG9ydCB7IHNob3dTZWxlY3RlZFNoYXBlQWN0aW9ucyB9IGZyb20gXCIuL3Nob3dTZWxlY3RlZFNoYXBlQWN0aW9uc1wiO1xuZXhwb3J0IGNvbnN0IGdldFNjZW5lVmVyc2lvbiA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICByZXR1cm4gZWxlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGVsKSB7XG4gICAgcmV0dXJuIGFjYyArIGVsLnZlcnNpb247XG4gIH0sIDApO1xufTtcbmV4cG9ydCBjb25zdCBnZXRWaXNpYmxlRWxlbWVudHMgPSBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgcmV0dXJuIGVsZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcbiAgICByZXR1cm4gIWVsLmlzRGVsZXRlZCAmJiAhaXNJbnZpc2libHlTbWFsbEVsZW1lbnQoZWwpO1xuICB9KTtcbn07XG5leHBvcnQgY29uc3QgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzID0gZnVuY3Rpb24gKGVsZW1lbnRzKSB7XG4gIHJldHVybiBlbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gIWVsZW1lbnQuaXNEZWxldGVkO1xuICB9KTtcbn07XG5leHBvcnQgY29uc3QgaXNOb25EZWxldGVkRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIHJldHVybiAhZWxlbWVudC5pc0RlbGV0ZWQ7XG59O1xuXG5jb25zdCBfY2xlYXJFbGVtZW50cyA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICByZXR1cm4gZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKGVsZW1lbnRzKS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gaXNMaW5lYXJFbGVtZW50VHlwZShlbGVtZW50LnR5cGUpID8gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBlbGVtZW50KSwge30sIHtcbiAgICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbFxuICAgIH0pIDogZWxlbWVudDtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYXJFbGVtZW50c0ZvckRhdGFiYXNlID0gZnVuY3Rpb24gKGVsZW1lbnRzKSB7XG4gIHJldHVybiBfY2xlYXJFbGVtZW50cyhlbGVtZW50cyk7XG59O1xuZXhwb3J0IGNvbnN0IGNsZWFyRWxlbWVudHNGb3JFeHBvcnQgPSBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgcmV0dXJuIF9jbGVhckVsZW1lbnRzKGVsZW1lbnRzKTtcbn07XG5leHBvcnQgY29uc3QgY2xlYXJFbGVtZW50c0ZvckxvY2FsU3RvcmFnZSA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICByZXR1cm4gX2NsZWFyRWxlbWVudHMoZWxlbWVudHMpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///../../element/index.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../element/index.ts?");
|
|
2678
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"OMIT_SIDES_FOR_MULTIPLE_ELEMENTS\\\": () => (/* reexport safe */ _transformHandles__WEBPACK_IMPORTED_MODULE_5__.OMIT_SIDES_FOR_MULTIPLE_ELEMENTS),\\n/* harmony export */ \\\"clearElementsForDatabase\\\": () => (/* binding */ clearElementsForDatabase),\\n/* harmony export */ \\\"clearElementsForExport\\\": () => (/* binding */ clearElementsForExport),\\n/* harmony export */ \\\"clearElementsForLocalStorage\\\": () => (/* binding */ clearElementsForLocalStorage),\\n/* harmony export */ \\\"dragNewElement\\\": () => (/* reexport safe */ _dragElements__WEBPACK_IMPORTED_MODULE_9__.dragNewElement),\\n/* harmony export */ \\\"dragSelectedElements\\\": () => (/* reexport safe */ _dragElements__WEBPACK_IMPORTED_MODULE_9__.dragSelectedElements),\\n/* harmony export */ \\\"duplicateElement\\\": () => (/* reexport safe */ _newElement__WEBPACK_IMPORTED_MODULE_3__.duplicateElement),\\n/* harmony export */ \\\"getArrowheadPoints\\\": () => (/* reexport safe */ _bounds__WEBPACK_IMPORTED_MODULE_4__.getArrowheadPoints),\\n/* harmony export */ \\\"getClosestElementBounds\\\": () => (/* reexport safe */ _bounds__WEBPACK_IMPORTED_MODULE_4__.getClosestElementBounds),\\n/* harmony export */ \\\"getCommonBounds\\\": () => (/* reexport safe */ _bounds__WEBPACK_IMPORTED_MODULE_4__.getCommonBounds),\\n/* harmony export */ \\\"getCursorForResizingElement\\\": () => (/* reexport safe */ _resizeTest__WEBPACK_IMPORTED_MODULE_7__.getCursorForResizingElement),\\n/* harmony export */ \\\"getDiamondPoints\\\": () => (/* reexport safe */ _bounds__WEBPACK_IMPORTED_MODULE_4__.getDiamondPoints),\\n/* harmony export */ \\\"getDragOffsetXY\\\": () => (/* reexport safe */ _dragElements__WEBPACK_IMPORTED_MODULE_9__.getDragOffsetXY),\\n/* harmony export */ \\\"getElementAbsoluteCoords\\\": () => (/* reexport safe */ _bounds__WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords),\\n/* harmony export */ \\\"getElementBounds\\\": () => (/* reexport safe */ _bounds__WEBPACK_IMPORTED_MODULE_4__.getElementBounds),\\n/* harmony export */ \\\"getElementWithTransformHandleType\\\": () => (/* reexport safe */ _resizeTest__WEBPACK_IMPORTED_MODULE_7__.getElementWithTransformHandleType),\\n/* harmony export */ \\\"getLockedLinearCursorAlignSize\\\": () => (/* reexport safe */ _sizeHelpers__WEBPACK_IMPORTED_MODULE_1__.getLockedLinearCursorAlignSize),\\n/* harmony export */ \\\"getNonDeletedElements\\\": () => (/* binding */ getNonDeletedElements),\\n/* harmony export */ \\\"getNormalizedDimensions\\\": () => (/* reexport safe */ _sizeHelpers__WEBPACK_IMPORTED_MODULE_1__.getNormalizedDimensions),\\n/* harmony export */ \\\"getPerfectElementSize\\\": () => (/* reexport safe */ _sizeHelpers__WEBPACK_IMPORTED_MODULE_1__.getPerfectElementSize),\\n/* harmony export */ \\\"getResizeArrowDirection\\\": () => (/* reexport safe */ _resizeElements__WEBPACK_IMPORTED_MODULE_8__.getResizeArrowDirection),\\n/* harmony export */ \\\"getResizeOffsetXY\\\": () => (/* reexport safe */ _resizeElements__WEBPACK_IMPORTED_MODULE_8__.getResizeOffsetXY),\\n/* harmony export */ \\\"getSceneVersion\\\": () => (/* binding */ getSceneVersion),\\n/* harmony export */ \\\"getTransformHandleTypeFromCoords\\\": () => (/* reexport safe */ _resizeTest__WEBPACK_IMPORTED_MODULE_7__.getTransformHandleTypeFromCoords),\\n/* harmony export */ \\\"getTransformHandles\\\": () => (/* reexport safe */ _transformHandles__WEBPACK_IMPORTED_MODULE_5__.getTransformHandles),\\n/* harmony export */ \\\"getTransformHandlesFromCoords\\\": () => (/* reexport safe */ _transformHandles__WEBPACK_IMPORTED_MODULE_5__.getTransformHandlesFromCoords),\\n/* harmony export */ \\\"getVisibleElements\\\": () => (/* binding */ getVisibleElements),\\n/* harmony export */ \\\"hitTest\\\": () => (/* reexport safe */ _collision__WEBPACK_IMPORTED_MODULE_6__.hitTest),\\n/* harmony export */ \\\"isExcalidrawElement\\\": () => (/* reexport safe */ _typeChecks__WEBPACK_IMPORTED_MODULE_2__.isExcalidrawElement),\\n/* harmony export */ \\\"isHittingElementBoundingBoxWithoutHittingElement\\\": () => (/* reexport safe */ _collision__WEBPACK_IMPORTED_MODULE_6__.isHittingElementBoundingBoxWithoutHittingElement),\\n/* harmony export */ \\\"isInvisiblySmallElement\\\": () => (/* reexport safe */ _sizeHelpers__WEBPACK_IMPORTED_MODULE_1__.isInvisiblySmallElement),\\n/* harmony export */ \\\"isNonDeletedElement\\\": () => (/* binding */ isNonDeletedElement),\\n/* harmony export */ \\\"isTextElement\\\": () => (/* reexport safe */ _typeChecks__WEBPACK_IMPORTED_MODULE_2__.isTextElement),\\n/* harmony export */ \\\"newElement\\\": () => (/* reexport safe */ _newElement__WEBPACK_IMPORTED_MODULE_3__.newElement),\\n/* harmony export */ \\\"newImageElement\\\": () => (/* reexport safe */ _newElement__WEBPACK_IMPORTED_MODULE_3__.newImageElement),\\n/* harmony export */ \\\"newLinearElement\\\": () => (/* reexport safe */ _newElement__WEBPACK_IMPORTED_MODULE_3__.newLinearElement),\\n/* harmony export */ \\\"newTextElement\\\": () => (/* reexport safe */ _newElement__WEBPACK_IMPORTED_MODULE_3__.newTextElement),\\n/* harmony export */ \\\"redrawTextBoundingBox\\\": () => (/* reexport safe */ _textElement__WEBPACK_IMPORTED_MODULE_11__.redrawTextBoundingBox),\\n/* harmony export */ \\\"resizePerfectLineForNWHandler\\\": () => (/* reexport safe */ _sizeHelpers__WEBPACK_IMPORTED_MODULE_1__.resizePerfectLineForNWHandler),\\n/* harmony export */ \\\"resizeTest\\\": () => (/* reexport safe */ _resizeTest__WEBPACK_IMPORTED_MODULE_7__.resizeTest),\\n/* harmony export */ \\\"showSelectedShapeActions\\\": () => (/* reexport safe */ _showSelectedShapeActions__WEBPACK_IMPORTED_MODULE_12__.showSelectedShapeActions),\\n/* harmony export */ \\\"textWysiwyg\\\": () => (/* reexport safe */ _textWysiwyg__WEBPACK_IMPORTED_MODULE_10__.textWysiwyg),\\n/* harmony export */ \\\"transformElements\\\": () => (/* reexport safe */ _resizeElements__WEBPACK_IMPORTED_MODULE_8__.transformElements),\\n/* harmony export */ \\\"updateTextElement\\\": () => (/* reexport safe */ _newElement__WEBPACK_IMPORTED_MODULE_3__.updateTextElement)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\\\");\\n/* harmony import */ var _sizeHelpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sizeHelpers */ \\\"../../element/sizeHelpers.ts\\\");\\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _newElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./newElement */ \\\"../../element/newElement.ts\\\");\\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./bounds */ \\\"../../element/bounds.ts\\\");\\n/* harmony import */ var _transformHandles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./transformHandles */ \\\"../../element/transformHandles.ts\\\");\\n/* harmony import */ var _collision__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./collision */ \\\"../../element/collision.ts\\\");\\n/* harmony import */ var _resizeTest__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./resizeTest */ \\\"../../element/resizeTest.ts\\\");\\n/* harmony import */ var _resizeElements__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./resizeElements */ \\\"../../element/resizeElements.ts\\\");\\n/* harmony import */ var _dragElements__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./dragElements */ \\\"../../element/dragElements.ts\\\");\\n/* harmony import */ var _textWysiwyg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./textWysiwyg */ \\\"../../element/textWysiwyg.tsx\\\");\\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./textElement */ \\\"../../element/textElement.ts\\\");\\n/* harmony import */ var _showSelectedShapeActions__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./showSelectedShapeActions */ \\\"../../element/showSelectedShapeActions.ts\\\");\\n\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst getSceneVersion = function (elements) {\\r\\n return elements.reduce(function (acc, el) {\\r\\n return acc + el.version;\\r\\n }, 0);\\r\\n};\\r\\nconst getVisibleElements = function (elements) {\\r\\n return elements.filter(function (el) {\\r\\n return !el.isDeleted && !(0,_sizeHelpers__WEBPACK_IMPORTED_MODULE_1__.isInvisiblySmallElement)(el);\\r\\n });\\r\\n};\\r\\nconst getNonDeletedElements = function (elements) {\\r\\n return elements.filter(function (element) {\\r\\n return !element.isDeleted;\\r\\n });\\r\\n};\\r\\nconst isNonDeletedElement = function (element) {\\r\\n return !element.isDeleted;\\r\\n};\\r\\nconst _clearElements = function (elements) {\\r\\n return getNonDeletedElements(elements).map(function (element) {\\r\\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_2__.isLinearElementType)(element.type) ? _objectSpread(_objectSpread({}, element), {}, {\\r\\n lastCommittedPoint: null\\r\\n }) : element;\\r\\n });\\r\\n};\\r\\nconst clearElementsForDatabase = function (elements) {\\r\\n return _clearElements(elements);\\r\\n};\\r\\nconst clearElementsForExport = function (elements) {\\r\\n return _clearElements(elements);\\r\\n};\\r\\nconst clearElementsForLocalStorage = function (elements) {\\r\\n return _clearElements(elements);\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q3RDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxtQkFBbUIsR0FBRyxVQUFVLE9BQU87SUFDbEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFDNUIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsVUFBVSxRQUFRO0lBQ3ZDLE9BQU8scUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsT0FBTztRQUMxRCxPQUFPLGdFQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3ZGLGtCQUFrQixFQUFFLElBQUk7U0FDekIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDZixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVLLE1BQU0sd0JBQXdCLEdBQUcsVUFBVSxRQUFRO0lBQ3hELE9BQU8sY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2xDLENBQUMsQ0FBQztBQUNLLE1BQU0sc0JBQXNCLEdBQUcsVUFBVSxRQUFRO0lBQ3RELE9BQU8sY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2xDLENBQUMsQ0FBQztBQUNLLE1BQU0sNEJBQTRCLEdBQUcsVUFBVSxRQUFRO0lBQzVELE9BQU8sY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2xDLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L2luZGV4LnRzP2U1ZmEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgeyBpc0ludmlzaWJseVNtYWxsRWxlbWVudCB9IGZyb20gXCIuL3NpemVIZWxwZXJzXCI7XG5pbXBvcnQgeyBpc0xpbmVhckVsZW1lbnRUeXBlIH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuZXhwb3J0IHsgbmV3RWxlbWVudCwgbmV3VGV4dEVsZW1lbnQsIHVwZGF0ZVRleHRFbGVtZW50LCBuZXdMaW5lYXJFbGVtZW50LCBuZXdJbWFnZUVsZW1lbnQsIGR1cGxpY2F0ZUVsZW1lbnQgfSBmcm9tIFwiLi9uZXdFbGVtZW50XCI7XG5leHBvcnQgeyBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMsIGdldEVsZW1lbnRCb3VuZHMsIGdldENvbW1vbkJvdW5kcywgZ2V0RGlhbW9uZFBvaW50cywgZ2V0QXJyb3doZWFkUG9pbnRzLCBnZXRDbG9zZXN0RWxlbWVudEJvdW5kcyB9IGZyb20gXCIuL2JvdW5kc1wiO1xuZXhwb3J0IHsgT01JVF9TSURFU19GT1JfTVVMVElQTEVfRUxFTUVOVFMsIGdldFRyYW5zZm9ybUhhbmRsZXNGcm9tQ29vcmRzLCBnZXRUcmFuc2Zvcm1IYW5kbGVzIH0gZnJvbSBcIi4vdHJhbnNmb3JtSGFuZGxlc1wiO1xuZXhwb3J0IHsgaGl0VGVzdCwgaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50IH0gZnJvbSBcIi4vY29sbGlzaW9uXCI7XG5leHBvcnQgeyByZXNpemVUZXN0LCBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQsIGdldEVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSwgZ2V0VHJhbnNmb3JtSGFuZGxlVHlwZUZyb21Db29yZHMgfSBmcm9tIFwiLi9yZXNpemVUZXN0XCI7XG5leHBvcnQgeyB0cmFuc2Zvcm1FbGVtZW50cywgZ2V0UmVzaXplT2Zmc2V0WFksIGdldFJlc2l6ZUFycm93RGlyZWN0aW9uIH0gZnJvbSBcIi4vcmVzaXplRWxlbWVudHNcIjtcbmV4cG9ydCB7IGRyYWdTZWxlY3RlZEVsZW1lbnRzLCBnZXREcmFnT2Zmc2V0WFksIGRyYWdOZXdFbGVtZW50IH0gZnJvbSBcIi4vZHJhZ0VsZW1lbnRzXCI7XG5leHBvcnQgeyBpc1RleHRFbGVtZW50LCBpc0V4Y2FsaWRyYXdFbGVtZW50IH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuZXhwb3J0IHsgdGV4dFd5c2l3eWcgfSBmcm9tIFwiLi90ZXh0V3lzaXd5Z1wiO1xuZXhwb3J0IHsgcmVkcmF3VGV4dEJvdW5kaW5nQm94IH0gZnJvbSBcIi4vdGV4dEVsZW1lbnRcIjtcbmV4cG9ydCB7IGdldFBlcmZlY3RFbGVtZW50U2l6ZSwgZ2V0TG9ja2VkTGluZWFyQ3Vyc29yQWxpZ25TaXplLCBpc0ludmlzaWJseVNtYWxsRWxlbWVudCwgcmVzaXplUGVyZmVjdExpbmVGb3JOV0hhbmRsZXIsIGdldE5vcm1hbGl6ZWREaW1lbnNpb25zIH0gZnJvbSBcIi4vc2l6ZUhlbHBlcnNcIjtcbmV4cG9ydCB7IHNob3dTZWxlY3RlZFNoYXBlQWN0aW9ucyB9IGZyb20gXCIuL3Nob3dTZWxlY3RlZFNoYXBlQWN0aW9uc1wiO1xuZXhwb3J0IGNvbnN0IGdldFNjZW5lVmVyc2lvbiA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICByZXR1cm4gZWxlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGVsKSB7XG4gICAgcmV0dXJuIGFjYyArIGVsLnZlcnNpb247XG4gIH0sIDApO1xufTtcbmV4cG9ydCBjb25zdCBnZXRWaXNpYmxlRWxlbWVudHMgPSBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgcmV0dXJuIGVsZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcbiAgICByZXR1cm4gIWVsLmlzRGVsZXRlZCAmJiAhaXNJbnZpc2libHlTbWFsbEVsZW1lbnQoZWwpO1xuICB9KTtcbn07XG5leHBvcnQgY29uc3QgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzID0gZnVuY3Rpb24gKGVsZW1lbnRzKSB7XG4gIHJldHVybiBlbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gIWVsZW1lbnQuaXNEZWxldGVkO1xuICB9KTtcbn07XG5leHBvcnQgY29uc3QgaXNOb25EZWxldGVkRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIHJldHVybiAhZWxlbWVudC5pc0RlbGV0ZWQ7XG59O1xuXG5jb25zdCBfY2xlYXJFbGVtZW50cyA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICByZXR1cm4gZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKGVsZW1lbnRzKS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gaXNMaW5lYXJFbGVtZW50VHlwZShlbGVtZW50LnR5cGUpID8gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBlbGVtZW50KSwge30sIHtcbiAgICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbFxuICAgIH0pIDogZWxlbWVudDtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYXJFbGVtZW50c0ZvckRhdGFiYXNlID0gZnVuY3Rpb24gKGVsZW1lbnRzKSB7XG4gIHJldHVybiBfY2xlYXJFbGVtZW50cyhlbGVtZW50cyk7XG59O1xuZXhwb3J0IGNvbnN0IGNsZWFyRWxlbWVudHNGb3JFeHBvcnQgPSBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgcmV0dXJuIF9jbGVhckVsZW1lbnRzKGVsZW1lbnRzKTtcbn07XG5leHBvcnQgY29uc3QgY2xlYXJFbGVtZW50c0ZvckxvY2FsU3RvcmFnZSA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICByZXR1cm4gX2NsZWFyRWxlbWVudHMoZWxlbWVudHMpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///../../element/index.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../element/index.ts?");
|
|
2679
2679
|
|
|
2680
2680
|
/***/ }),
|
|
2681
2681
|
|
|
@@ -2752,7 +2752,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
2752
2752
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2753
2753
|
|
|
2754
2754
|
"use strict";
|
|
2755
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"getNormalizedDimensions\\\": () => (/* binding */ getNormalizedDimensions),\\n/* harmony export */ \\\"getPerfectElementSize\\\": () => (/* binding */ getPerfectElementSize),\\n/* harmony export */ \\\"isInvisiblySmallElement\\\": () => (/* binding */ isInvisiblySmallElement),\\n/* harmony export */ \\\"resizePerfectLineForNWHandler\\\": () => (/* binding */ resizePerfectLineForNWHandler)\\n/* harmony export */ });\\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n\\r\\n\\r\\n\\r\\nconst isInvisiblySmallElement = function (element) {\\r\\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isFreeDrawElement)(element)) {\\r\\n return element.points.length < 2;\\r\\n }\\r\\n return element.width === 0 && element.height === 0;\\r\\n};\\r\\n/**\\r\\n * Makes a perfect shape or diagonal/horizontal/vertical line\\r\\n */\\r\\nconst getPerfectElementSize = function (elementType, width, height) {\\r\\n const absWidth = Math.abs(width);\\r\\n const absHeight = Math.abs(height);\\r\\n if (elementType === \\\"line\\\" || elementType === \\\"arrow\\\" || elementType === \\\"freedraw\\\") {\\r\\n const lockedAngle = Math.round(Math.atan(absHeight / absWidth) / _constants__WEBPACK_IMPORTED_MODULE_2__.SHIFT_LOCKING_ANGLE) * _constants__WEBPACK_IMPORTED_MODULE_2__.SHIFT_LOCKING_ANGLE;\\r\\n if (lockedAngle === 0) {\\r\\n height = 0;\\r\\n }\\r\\n else if (lockedAngle === Math.PI / 2) {\\r\\n width = 0;\\r\\n }\\r\\n else {\\r\\n height = Math.round(absWidth * Math.tan(lockedAngle)) * Math.sign(height) || height;\\r\\n }\\r\\n }\\r\\n else if (elementType !== \\\"selection\\\") {\\r\\n height = absWidth * Math.sign(height);\\r\\n }\\r\\n return {\\r\\n width,\\r\\n height\\r\\n };\\r\\n};\\r\\nconst resizePerfectLineForNWHandler = function (element, x, y) {\\r\\n const anchorX = element.x + element.width;\\r\\n const anchorY = element.y + element.height;\\r\\n const distanceToAnchorX = x - anchorX;\\r\\n const distanceToAnchorY = y - anchorY;\\r\\n if (Math.abs(distanceToAnchorX) < Math.abs(distanceToAnchorY) / 2) {\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_0__.mutateElement)(element, {\\r\\n x: anchorX,\\r\\n width: 0,\\r\\n y,\\r\\n height: -distanceToAnchorY\\r\\n });\\r\\n }\\r\\n else if (Math.abs(distanceToAnchorY) < Math.abs(element.width) / 2) {\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_0__.mutateElement)(element, {\\r\\n y: anchorY,\\r\\n height: 0\\r\\n });\\r\\n }\\r\\n else {\\r\\n const nextHeight = Math.sign(distanceToAnchorY) * Math.sign(distanceToAnchorX) * element.width;\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_0__.mutateElement)(element, {\\r\\n x,\\r\\n y: anchorY - nextHeight,\\r\\n width: -distanceToAnchorX,\\r\\n height: nextHeight\\r\\n });\\r\\n }\\r\\n};\\r\\nconst getNormalizedDimensions = function (element) {\\r\\n const ret = {\\r\\n width: element.width,\\r\\n height: element.height,\\r\\n x: element.x,\\r\\n y: element.y\\r\\n };\\r\\n if (element.width < 0) {\\r\\n const nextWidth = Math.abs(element.width);\\r\\n ret.width = nextWidth;\\r\\n ret.x = element.x - nextWidth;\\r\\n }\\r\\n if (element.height < 0) {\\r\\n const nextHeight = Math.abs(element.height);\\r\\n ret.height = nextHeight;\\r\\n ret.y = element.y - nextHeight;\\r\\n }\\r\\n return ret;\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC9zaXplSGVscGVycy50cz83MWExIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG11dGF0ZUVsZW1lbnQgfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBpc0ZyZWVEcmF3RWxlbWVudCwgaXNMaW5lYXJFbGVtZW50IH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgU0hJRlRfTE9DS0lOR19BTkdMRSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmV4cG9ydCBjb25zdCBpc0ludmlzaWJseVNtYWxsRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIGlmIChpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgfHwgaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gZWxlbWVudC5wb2ludHMubGVuZ3RoIDwgMjtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50LndpZHRoID09PSAwICYmIGVsZW1lbnQuaGVpZ2h0ID09PSAwO1xufTtcbi8qKlxuICogTWFrZXMgYSBwZXJmZWN0IHNoYXBlIG9yIGRpYWdvbmFsL2hvcml6b250YWwvdmVydGljYWwgbGluZVxuICovXG5cbmV4cG9ydCBjb25zdCBnZXRQZXJmZWN0RWxlbWVudFNpemUgPSBmdW5jdGlvbiAoZWxlbWVudFR5cGUsIHdpZHRoLCBoZWlnaHQpIHtcbiAgY29uc3QgYWJzV2lkdGggPSBNYXRoLmFicyh3aWR0aCk7XG4gIGNvbnN0IGFic0hlaWdodCA9IE1hdGguYWJzKGhlaWdodCk7XG5cbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImxpbmVcIiB8fCBlbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiIHx8IGVsZW1lbnRUeXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICBjb25zdCBsb2NrZWRBbmdsZSA9IE1hdGgucm91bmQoTWF0aC5hdGFuKGFic0hlaWdodCAvIGFic1dpZHRoKSAvIFNISUZUX0xPQ0tJTkdfQU5HTEUpICogU0hJRlRfTE9DS0lOR19BTkdMRTtcblxuICAgIGlmIChsb2NrZWRBbmdsZSA9PT0gMCkge1xuICAgICAgaGVpZ2h0ID0gMDtcbiAgICB9IGVsc2UgaWYgKGxvY2tlZEFuZ2xlID09PSBNYXRoLlBJIC8gMikge1xuICAgICAgd2lkdGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKGFic1dpZHRoICogTWF0aC50YW4obG9ja2VkQW5nbGUpKSAqIE1hdGguc2lnbihoZWlnaHQpIHx8IGhlaWdodDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICBoZWlnaHQgPSBhYnNXaWR0aCAqIE1hdGguc2lnbihoZWlnaHQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfTtcbn07XG5leHBvcnQgY29uc3QgcmVzaXplUGVyZmVjdExpbmVGb3JOV0hhbmRsZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgeCwgeSkge1xuICBjb25zdCBhbmNob3JYID0gZWxlbWVudC54ICsgZWxlbWVudC53aWR0aDtcbiAgY29uc3QgYW5jaG9yWSA9IGVsZW1lbnQueSArIGVsZW1lbnQuaGVpZ2h0O1xuICBjb25zdCBkaXN0YW5jZVRvQW5jaG9yWCA9IHggLSBhbmNob3JYO1xuICBjb25zdCBkaXN0YW5jZVRvQW5jaG9yWSA9IHkgLSBhbmNob3JZO1xuXG4gIGlmIChNYXRoLmFicyhkaXN0YW5jZVRvQW5jaG9yWCkgPCBNYXRoLmFicyhkaXN0YW5jZVRvQW5jaG9yWSkgLyAyKSB7XG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICB4OiBhbmNob3JYLFxuICAgICAgd2lkdGg6IDAsXG4gICAgICB5LFxuICAgICAgaGVpZ2h0OiAtZGlzdGFuY2VUb0FuY2hvcllcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChNYXRoLmFicyhkaXN0YW5jZVRvQW5jaG9yWSkgPCBNYXRoLmFicyhlbGVtZW50LndpZHRoKSAvIDIpIHtcbiAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgIHk6IGFuY2hvclksXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBuZXh0SGVpZ2h0ID0gTWF0aC5zaWduKGRpc3RhbmNlVG9BbmNob3JZKSAqIE1hdGguc2lnbihkaXN0YW5jZVRvQW5jaG9yWCkgKiBlbGVtZW50LndpZHRoO1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgeCxcbiAgICAgIHk6IGFuY2hvclkgLSBuZXh0SGVpZ2h0LFxuICAgICAgd2lkdGg6IC1kaXN0YW5jZVRvQW5jaG9yWCxcbiAgICAgIGhlaWdodDogbmV4dEhlaWdodFxuICAgIH0pO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IGdldE5vcm1hbGl6ZWREaW1lbnNpb25zID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgY29uc3QgcmV0ID0ge1xuICAgIHdpZHRoOiBlbGVtZW50LndpZHRoLFxuICAgIGhlaWdodDogZWxlbWVudC5oZWlnaHQsXG4gICAgeDogZWxlbWVudC54LFxuICAgIHk6IGVsZW1lbnQueVxuICB9O1xuXG4gIGlmIChlbGVtZW50LndpZHRoIDwgMCkge1xuICAgIGNvbnN0IG5leHRXaWR0aCA9IE1hdGguYWJzKGVsZW1lbnQud2lkdGgpO1xuICAgIHJldC53aWR0aCA9IG5leHRXaWR0aDtcbiAgICByZXQueCA9IGVsZW1lbnQueCAtIG5leHRXaWR0aDtcbiAgfVxuXG4gIGlmIChlbGVtZW50LmhlaWdodCA8IDApIHtcbiAgICBjb25zdCBuZXh0SGVpZ2h0ID0gTWF0aC5hYnMoZWxlbWVudC5oZWlnaHQpO1xuICAgIHJldC5oZWlnaHQgPSBuZXh0SGVpZ2h0O1xuICAgIHJldC55ID0gZWxlbWVudC55IC0gbmV4dEhlaWdodDtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../element/sizeHelpers.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../element/sizeHelpers.ts?");
|
|
2755
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"getLockedLinearCursorAlignSize\\\": () => (/* binding */ getLockedLinearCursorAlignSize),\\n/* harmony export */ \\\"getNormalizedDimensions\\\": () => (/* binding */ getNormalizedDimensions),\\n/* harmony export */ \\\"getPerfectElementSize\\\": () => (/* binding */ getPerfectElementSize),\\n/* harmony export */ \\\"isInvisiblySmallElement\\\": () => (/* binding */ isInvisiblySmallElement),\\n/* harmony export */ \\\"resizePerfectLineForNWHandler\\\": () => (/* binding */ resizePerfectLineForNWHandler)\\n/* harmony export */ });\\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n\\r\\n\\r\\n\\r\\nconst isInvisiblySmallElement = function (element) {\\r\\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isFreeDrawElement)(element)) {\\r\\n return element.points.length < 2;\\r\\n }\\r\\n return element.width === 0 && element.height === 0;\\r\\n};\\r\\n/**\\r\\n * Makes a perfect shape or diagonal/horizontal/vertical line\\r\\n */\\r\\nconst getPerfectElementSize = function (elementType, width, height) {\\r\\n const absWidth = Math.abs(width);\\r\\n const absHeight = Math.abs(height);\\r\\n if (elementType === \\\"line\\\" || elementType === \\\"arrow\\\" || elementType === \\\"freedraw\\\") {\\r\\n const lockedAngle = Math.round(Math.atan(absHeight / absWidth) / _constants__WEBPACK_IMPORTED_MODULE_2__.SHIFT_LOCKING_ANGLE) * _constants__WEBPACK_IMPORTED_MODULE_2__.SHIFT_LOCKING_ANGLE;\\r\\n if (lockedAngle === 0) {\\r\\n height = 0;\\r\\n }\\r\\n else if (lockedAngle === Math.PI / 2) {\\r\\n width = 0;\\r\\n }\\r\\n else {\\r\\n height = Math.round(absWidth * Math.tan(lockedAngle)) * Math.sign(height) || height;\\r\\n }\\r\\n }\\r\\n else if (elementType !== \\\"selection\\\") {\\r\\n height = absWidth * Math.sign(height);\\r\\n }\\r\\n return {\\r\\n width,\\r\\n height\\r\\n };\\r\\n};\\r\\nconst getLockedLinearCursorAlignSize = function (originX, originY, x, y) {\\r\\n let width = x - originX;\\r\\n let height = y - originY;\\r\\n const lockedAngle = Math.round(Math.atan(height / width) / _constants__WEBPACK_IMPORTED_MODULE_2__.SHIFT_LOCKING_ANGLE) * _constants__WEBPACK_IMPORTED_MODULE_2__.SHIFT_LOCKING_ANGLE;\\r\\n if (lockedAngle === 0) {\\r\\n height = 0;\\r\\n }\\r\\n else if (lockedAngle === Math.PI / 2) {\\r\\n width = 0;\\r\\n }\\r\\n else {\\r\\n // locked angle line, y = mx + b => mx - y + b = 0\\r\\n const a1 = Math.tan(lockedAngle);\\r\\n const b1 = -1;\\r\\n const c1 = originY - a1 * originX; // line through cursor, perpendicular to locked angle line\\r\\n const a2 = -1 / a1;\\r\\n const b2 = -1;\\r\\n const c2 = y - a2 * x; // intersection of the two lines above\\r\\n const intersectX = Math.round((b1 * c2 - b2 * c1) / (a1 * b2 - a2 * b1));\\r\\n const intersectY = Math.round((c1 * a2 - c2 * a1) / (a1 * b2 - a2 * b1)); // delta\\r\\n width = intersectX - originX;\\r\\n height = intersectY - originY;\\r\\n }\\r\\n return {\\r\\n width,\\r\\n height\\r\\n };\\r\\n};\\r\\nconst resizePerfectLineForNWHandler = function (element, x, y) {\\r\\n const anchorX = element.x + element.width;\\r\\n const anchorY = element.y + element.height;\\r\\n const distanceToAnchorX = x - anchorX;\\r\\n const distanceToAnchorY = y - anchorY;\\r\\n if (Math.abs(distanceToAnchorX) < Math.abs(distanceToAnchorY) / 2) {\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_0__.mutateElement)(element, {\\r\\n x: anchorX,\\r\\n width: 0,\\r\\n y,\\r\\n height: -distanceToAnchorY\\r\\n });\\r\\n }\\r\\n else if (Math.abs(distanceToAnchorY) < Math.abs(element.width) / 2) {\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_0__.mutateElement)(element, {\\r\\n y: anchorY,\\r\\n height: 0\\r\\n });\\r\\n }\\r\\n else {\\r\\n const nextHeight = Math.sign(distanceToAnchorY) * Math.sign(distanceToAnchorX) * element.width;\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_0__.mutateElement)(element, {\\r\\n x,\\r\\n y: anchorY - nextHeight,\\r\\n width: -distanceToAnchorX,\\r\\n height: nextHeight\\r\\n });\\r\\n }\\r\\n};\\r\\nconst getNormalizedDimensions = function (element) {\\r\\n const ret = {\\r\\n width: element.width,\\r\\n height: element.height,\\r\\n x: element.x,\\r\\n y: element.y\\r\\n };\\r\\n if (element.width < 0) {\\r\\n const nextWidth = Math.abs(element.width);\\r\\n ret.width = nextWidth;\\r\\n ret.x = element.x - nextWidth;\\r\\n }\\r\\n if (element.height < 0) {\\r\\n const nextHeight = Math.abs(element.height);\\r\\n ret.height = nextHeight;\\r\\n ret.y = element.y - nextHeight;\\r\\n }\\r\\n return ret;\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFHLFNBQVMsQ0FBQztLQUMvQjtJQUVELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDdEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFDeEIsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztLQUNoQztJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvc2l6ZUhlbHBlcnMudHM/NzFhMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgaXNGcmVlRHJhd0VsZW1lbnQsIGlzTGluZWFyRWxlbWVudCB9IGZyb20gXCIuL3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IFNISUZUX0xPQ0tJTkdfQU5HTEUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5leHBvcnQgY29uc3QgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBpZiAoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpIHx8IGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQucG9pbnRzLmxlbmd0aCA8IDI7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudC53aWR0aCA9PT0gMCAmJiBlbGVtZW50LmhlaWdodCA9PT0gMDtcbn07XG4vKipcbiAqIE1ha2VzIGEgcGVyZmVjdCBzaGFwZSBvciBkaWFnb25hbC9ob3Jpem9udGFsL3ZlcnRpY2FsIGxpbmVcbiAqL1xuXG5leHBvcnQgY29uc3QgZ2V0UGVyZmVjdEVsZW1lbnRTaXplID0gZnVuY3Rpb24gKGVsZW1lbnRUeXBlLCB3aWR0aCwgaGVpZ2h0KSB7XG4gIGNvbnN0IGFic1dpZHRoID0gTWF0aC5hYnMod2lkdGgpO1xuICBjb25zdCBhYnNIZWlnaHQgPSBNYXRoLmFicyhoZWlnaHQpO1xuXG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJsaW5lXCIgfHwgZWxlbWVudFR5cGUgPT09IFwiYXJyb3dcIiB8fCBlbGVtZW50VHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgY29uc3QgbG9ja2VkQW5nbGUgPSBNYXRoLnJvdW5kKE1hdGguYXRhbihhYnNIZWlnaHQgLyBhYnNXaWR0aCkgLyBTSElGVF9MT0NLSU5HX0FOR0xFKSAqIFNISUZUX0xPQ0tJTkdfQU5HTEU7XG5cbiAgICBpZiAobG9ja2VkQW5nbGUgPT09IDApIHtcbiAgICAgIGhlaWdodCA9IDA7XG4gICAgfSBlbHNlIGlmIChsb2NrZWRBbmdsZSA9PT0gTWF0aC5QSSAvIDIpIHtcbiAgICAgIHdpZHRoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVpZ2h0ID0gTWF0aC5yb3VuZChhYnNXaWR0aCAqIE1hdGgudGFuKGxvY2tlZEFuZ2xlKSkgKiBNYXRoLnNpZ24oaGVpZ2h0KSB8fCBoZWlnaHQ7XG4gICAgfVxuICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgaGVpZ2h0ID0gYWJzV2lkdGggKiBNYXRoLnNpZ24oaGVpZ2h0KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH07XG59O1xuZXhwb3J0IGNvbnN0IGdldExvY2tlZExpbmVhckN1cnNvckFsaWduU2l6ZSA9IGZ1bmN0aW9uIChvcmlnaW5YLCBvcmlnaW5ZLCB4LCB5KSB7XG4gIGxldCB3aWR0aCA9IHggLSBvcmlnaW5YO1xuICBsZXQgaGVpZ2h0ID0geSAtIG9yaWdpblk7XG4gIGNvbnN0IGxvY2tlZEFuZ2xlID0gTWF0aC5yb3VuZChNYXRoLmF0YW4oaGVpZ2h0IC8gd2lkdGgpIC8gU0hJRlRfTE9DS0lOR19BTkdMRSkgKiBTSElGVF9MT0NLSU5HX0FOR0xFO1xuXG4gIGlmIChsb2NrZWRBbmdsZSA9PT0gMCkge1xuICAgIGhlaWdodCA9IDA7XG4gIH0gZWxzZSBpZiAobG9ja2VkQW5nbGUgPT09IE1hdGguUEkgLyAyKSB7XG4gICAgd2lkdGggPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIGxvY2tlZCBhbmdsZSBsaW5lLCB5ID0gbXggKyBiID0+IG14IC0geSArIGIgPSAwXG4gICAgY29uc3QgYTEgPSBNYXRoLnRhbihsb2NrZWRBbmdsZSk7XG4gICAgY29uc3QgYjEgPSAtMTtcbiAgICBjb25zdCBjMSA9IG9yaWdpblkgLSBhMSAqIG9yaWdpblg7IC8vIGxpbmUgdGhyb3VnaCBjdXJzb3IsIHBlcnBlbmRpY3VsYXIgdG8gbG9ja2VkIGFuZ2xlIGxpbmVcblxuICAgIGNvbnN0IGEyID0gLTEgLyBhMTtcbiAgICBjb25zdCBiMiA9IC0xO1xuICAgIGNvbnN0IGMyID0geSAtIGEyICogeDsgLy8gaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gbGluZXMgYWJvdmVcblxuICAgIGNvbnN0IGludGVyc2VjdFggPSBNYXRoLnJvdW5kKChiMSAqIGMyIC0gYjIgKiBjMSkgLyAoYTEgKiBiMiAtIGEyICogYjEpKTtcbiAgICBjb25zdCBpbnRlcnNlY3RZID0gTWF0aC5yb3VuZCgoYzEgKiBhMiAtIGMyICogYTEpIC8gKGExICogYjIgLSBhMiAqIGIxKSk7IC8vIGRlbHRhXG5cbiAgICB3aWR0aCA9IGludGVyc2VjdFggLSBvcmlnaW5YO1xuICAgIGhlaWdodCA9IGludGVyc2VjdFkgLSBvcmlnaW5ZO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfTtcbn07XG5leHBvcnQgY29uc3QgcmVzaXplUGVyZmVjdExpbmVGb3JOV0hhbmRsZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgeCwgeSkge1xuICBjb25zdCBhbmNob3JYID0gZWxlbWVudC54ICsgZWxlbWVudC53aWR0aDtcbiAgY29uc3QgYW5jaG9yWSA9IGVsZW1lbnQueSArIGVsZW1lbnQuaGVpZ2h0O1xuICBjb25zdCBkaXN0YW5jZVRvQW5jaG9yWCA9IHggLSBhbmNob3JYO1xuICBjb25zdCBkaXN0YW5jZVRvQW5jaG9yWSA9IHkgLSBhbmNob3JZO1xuXG4gIGlmIChNYXRoLmFicyhkaXN0YW5jZVRvQW5jaG9yWCkgPCBNYXRoLmFicyhkaXN0YW5jZVRvQW5jaG9yWSkgLyAyKSB7XG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICB4OiBhbmNob3JYLFxuICAgICAgd2lkdGg6IDAsXG4gICAgICB5LFxuICAgICAgaGVpZ2h0OiAtZGlzdGFuY2VUb0FuY2hvcllcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChNYXRoLmFicyhkaXN0YW5jZVRvQW5jaG9yWSkgPCBNYXRoLmFicyhlbGVtZW50LndpZHRoKSAvIDIpIHtcbiAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgIHk6IGFuY2hvclksXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBuZXh0SGVpZ2h0ID0gTWF0aC5zaWduKGRpc3RhbmNlVG9BbmNob3JZKSAqIE1hdGguc2lnbihkaXN0YW5jZVRvQW5jaG9yWCkgKiBlbGVtZW50LndpZHRoO1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgeCxcbiAgICAgIHk6IGFuY2hvclkgLSBuZXh0SGVpZ2h0LFxuICAgICAgd2lkdGg6IC1kaXN0YW5jZVRvQW5jaG9yWCxcbiAgICAgIGhlaWdodDogbmV4dEhlaWdodFxuICAgIH0pO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IGdldE5vcm1hbGl6ZWREaW1lbnNpb25zID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgY29uc3QgcmV0ID0ge1xuICAgIHdpZHRoOiBlbGVtZW50LndpZHRoLFxuICAgIGhlaWdodDogZWxlbWVudC5oZWlnaHQsXG4gICAgeDogZWxlbWVudC54LFxuICAgIHk6IGVsZW1lbnQueVxuICB9O1xuXG4gIGlmIChlbGVtZW50LndpZHRoIDwgMCkge1xuICAgIGNvbnN0IG5leHRXaWR0aCA9IE1hdGguYWJzKGVsZW1lbnQud2lkdGgpO1xuICAgIHJldC53aWR0aCA9IG5leHRXaWR0aDtcbiAgICByZXQueCA9IGVsZW1lbnQueCAtIG5leHRXaWR0aDtcbiAgfVxuXG4gIGlmIChlbGVtZW50LmhlaWdodCA8IDApIHtcbiAgICBjb25zdCBuZXh0SGVpZ2h0ID0gTWF0aC5hYnMoZWxlbWVudC5oZWlnaHQpO1xuICAgIHJldC5oZWlnaHQgPSBuZXh0SGVpZ2h0O1xuICAgIHJldC55ID0gZWxlbWVudC55IC0gbmV4dEhlaWdodDtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../element/sizeHelpers.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../element/sizeHelpers.ts?");
|
|
2756
2756
|
|
|
2757
2757
|
/***/ }),
|
|
2758
2758
|
|
|
@@ -2972,7 +2972,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
2972
2972
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2973
2973
|
|
|
2974
2974
|
"use strict";
|
|
2975
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"Excalidraw\\\": () => (/* binding */ Excalidraw),\\n/* harmony export */ \\\"FONT_FAMILY\\\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_8__.FONT_FAMILY),\\n/* harmony export */ \\\"MIME_TYPES\\\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_8__.MIME_TYPES),\\n/* harmony export */ \\\"THEME\\\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_8__.THEME),\\n/* harmony export */ \\\"bumpVersion\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_16__.bumpVersion),\\n/* harmony export */ \\\"defaultLang\\\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_7__.defaultLang),\\n/* harmony export */ \\\"determineFocusDistance\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.determineFocusDistance),\\n/* harmony export */ \\\"exportToBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.exportToBlob),\\n/* harmony export */ \\\"exportToCanvas\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.exportToCanvas),\\n/* harmony export */ \\\"exportToClipboard\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.exportToClipboard),\\n/* harmony export */ \\\"exportToSvg\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.exportToSvg),\\n/* harmony export */ \\\"getCommonBoundingBox\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.getCommonBoundingBox),\\n/* harmony export */ \\\"getFreeDrawSvgPath\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.getFreeDrawSvgPath),\\n/* harmony export */ \\\"getMaximumGroups\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.getMaximumGroups),\\n/* harmony export */ \\\"getNonDeletedElements\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_12__.getNonDeletedElements),\\n/* harmony export */ \\\"getSceneVersion\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_12__.getSceneVersion),\\n/* harmony export */ \\\"intersectElementWithLine\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.intersectElementWithLine),\\n/* harmony export */ \\\"isInvisiblySmallElement\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_12__.isInvisiblySmallElement),\\n/* harmony export */ \\\"isLinearElement\\\": () => (/* reexport safe */ _element_typeChecks__WEBPACK_IMPORTED_MODULE_15__.isLinearElement),\\n/* harmony export */ \\\"languages\\\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_7__.languages),\\n/* harmony export */ \\\"loadFromBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.loadFromBlob),\\n/* harmony export */ \\\"loadLibraryFromBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.loadLibraryFromBlob),\\n/* harmony export */ \\\"loadSceneOrLibraryFromBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.loadSceneOrLibraryFromBlob),\\n/* harmony export */ \\\"measureText\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.measureText),\\n/* harmony export */ \\\"mergeLibraryItems\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.mergeLibraryItems),\\n/* harmony export */ \\\"mutateElement\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_16__.mutateElement),\\n/* harmony export */ \\\"newElementWith\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_16__.newElementWith),\\n/* harmony export */ \\\"parseLibraryTokensFromUrl\\\": () => (/* reexport safe */ _data_library__WEBPACK_IMPORTED_MODULE_17__.parseLibraryTokensFromUrl),\\n/* harmony export */ \\\"restore\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_13__.restore),\\n/* harmony export */ \\\"restoreAppState\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_13__.restoreAppState),\\n/* harmony export */ \\\"restoreElements\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_13__.restoreElements),\\n/* harmony export */ \\\"restoreLibraryItems\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_13__.restoreLibraryItems),\\n/* harmony export */ \\\"sceneCoordsToViewportCoords\\\": () => (/* reexport safe */ _utils__WEBPACK_IMPORTED_MODULE_18__.sceneCoordsToViewportCoords),\\n/* harmony export */ \\\"serializeAsJSON\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.serializeAsJSON),\\n/* harmony export */ \\\"serializeLibraryAsJSON\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.serializeLibraryAsJSON),\\n/* harmony export */ \\\"useHandleLibrary\\\": () => (/* reexport safe */ _data_library__WEBPACK_IMPORTED_MODULE_17__.useHandleLibrary),\\n/* harmony export */ \\\"viewportCoordsToSceneCoords\\\": () => (/* reexport safe */ _utils__WEBPACK_IMPORTED_MODULE_18__.viewportCoordsToSceneCoords)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ \\\"./node_modules/@babel/runtime/helpers/objectWithoutProperties.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__);\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"./node_modules/@babel/runtime/helpers/defineProperty.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var _components_InitializeApp__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/InitializeApp */ \\\"../../components/InitializeApp.tsx\\\");\\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/App */ \\\"../../components/App.tsx\\\");\\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../css/app.scss */ \\\"../../css/app.scss\\\");\\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_css_app_scss__WEBPACK_IMPORTED_MODULE_5__);\\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../css/styles.scss */ \\\"../../css/styles.scss\\\");\\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_css_styles_scss__WEBPACK_IMPORTED_MODULE_6__);\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var jotai__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jotai */ \\\"../../../node_modules/jotai/esm/index.js\\\");\\n/* harmony import */ var _jotai__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../jotai */ \\\"../../jotai.ts\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../element */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../data/restore */ \\\"../../data/restore.ts\\\");\\n/* harmony import */ var _packages_utils__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../packages/utils */ \\\"../utils.ts\\\");\\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../element/typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../element/mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../data/library */ \\\"../../data/library.ts\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../utils */ \\\"../../utils.ts\\\");\\n\\r\\n\\r\\nconst _excluded = [\\\"initialData\\\", \\\"UIOptions\\\"], _excluded2 = [\\\"initialData\\\", \\\"UIOptions\\\"];\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst ExcalidrawBase = function (props) {\\r\\n var _a, _b, _c;\\r\\n const { onChange, initialData, excalidrawRef, onCollabButtonClick, isCollaborating = false, onPointerUpdate, renderTopRightUI, renderFooter, langCode = _i18n__WEBPACK_IMPORTED_MODULE_7__.defaultLang.code, viewModeEnabled, zenModeEnabled, gridModeEnabled, libraryReturnUrl, theme, name, renderCustomStats, onPaste, onDrop, \\r\\n //zsviczian\\r\\n detectScroll = true, handleKeyboardGlobally = false, onLibraryChange, autoFocus = false, onBeforeTextEdit, \\r\\n //zsviczian\\r\\n onBeforeTextSubmit, \\r\\n //zsviczian\\r\\n generateIdForFile, onThemeChange, \\r\\n //zsviczian\\r\\n onLinkOpen, onLinkHover, \\r\\n //zsviczian\\r\\n onViewModeChange, \\r\\n //zsviczian\\r\\n onPointerDown, onScrollChange } = props;\\r\\n const canvasActions = (_a = props.UIOptions) === null || _a === void 0 ? void 0 : _a.canvasActions;\\r\\n const UIOptions = _objectSpread(_objectSpread({}, props.UIOptions), {}, {\\r\\n canvasActions: _objectSpread(_objectSpread({}, _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_UI_OPTIONS.canvasActions), canvasActions)\\r\\n });\\r\\n if (canvasActions === null || canvasActions === void 0 ? void 0 : canvasActions.export) {\\r\\n UIOptions.canvasActions.export.saveFileToDisk = (_c = (_b = canvasActions.export) === null || _b === void 0 ? void 0 : _b.saveFileToDisk) !== null && _c !== void 0 ? _c : _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_UI_OPTIONS.canvasActions[\\\"export\\\"].saveFileToDisk;\\r\\n }\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(function () {\\r\\n // Block pinch-zooming on iOS outside of the content area\\r\\n const handleTouchMove = function (event) {\\r\\n // @ts-ignore\\r\\n if (typeof event.scale === \\\"number\\\" && event.scale !== 1) {\\r\\n event.preventDefault();\\r\\n }\\r\\n };\\r\\n document.addEventListener(\\\"touchmove\\\", handleTouchMove, {\\r\\n passive: false\\r\\n });\\r\\n return function () {\\r\\n document.removeEventListener(\\\"touchmove\\\", handleTouchMove);\\r\\n };\\r\\n }, []);\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_components_InitializeApp__WEBPACK_IMPORTED_MODULE_3__.InitializeApp, {\\r\\n langCode: langCode,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(jotai__WEBPACK_IMPORTED_MODULE_11__.Provider, {\\r\\n unstable_createStore: function () {\\r\\n return _jotai__WEBPACK_IMPORTED_MODULE_9__.jotaiStore;\\r\\n },\\r\\n scope: _jotai__WEBPACK_IMPORTED_MODULE_9__.jotaiScope,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_components_App__WEBPACK_IMPORTED_MODULE_4__[\\\"default\\\"], {\\r\\n onChange: onChange,\\r\\n initialData: initialData,\\r\\n excalidrawRef: excalidrawRef,\\r\\n onCollabButtonClick: onCollabButtonClick,\\r\\n isCollaborating: isCollaborating,\\r\\n onPointerUpdate: onPointerUpdate,\\r\\n renderTopRightUI: renderTopRightUI,\\r\\n renderFooter: renderFooter,\\r\\n langCode: langCode,\\r\\n viewModeEnabled: viewModeEnabled,\\r\\n zenModeEnabled: zenModeEnabled,\\r\\n gridModeEnabled: gridModeEnabled,\\r\\n libraryReturnUrl: libraryReturnUrl,\\r\\n theme: theme,\\r\\n name: name,\\r\\n renderCustomStats: renderCustomStats,\\r\\n UIOptions: UIOptions,\\r\\n onPaste: onPaste,\\r\\n onDrop: onDrop //zsviczian\\r\\n ,\\r\\n detectScroll: detectScroll,\\r\\n handleKeyboardGlobally: handleKeyboardGlobally,\\r\\n onLibraryChange: onLibraryChange,\\r\\n autoFocus: autoFocus,\\r\\n onBeforeTextEdit: onBeforeTextEdit //zsviczian\\r\\n ,\\r\\n onBeforeTextSubmit: onBeforeTextSubmit //zsviczian\\r\\n ,\\r\\n generateIdForFile: generateIdForFile,\\r\\n onThemeChange: onThemeChange //zsviczian\\r\\n ,\\r\\n onLinkOpen: onLinkOpen,\\r\\n onLinkHover: onLinkHover //zsviczian\\r\\n ,\\r\\n onViewModeChange: onViewModeChange //zsviczian\\r\\n ,\\r\\n onPointerDown: onPointerDown,\\r\\n onScrollChange: onScrollChange\\r\\n })\\r\\n })\\r\\n });\\r\\n};\\r\\nconst areEqual = function (prevProps, nextProps) {\\r\\n const { initialData: prevInitialData, UIOptions: prevUIOptions = {} } = prevProps, prev = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(prevProps, _excluded);\\r\\n const { initialData: nextInitialData, UIOptions: nextUIOptions = {} } = nextProps, next = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(nextProps, _excluded2); // comparing UIOptions\\r\\n const prevUIOptionsKeys = Object.keys(prevUIOptions);\\r\\n const nextUIOptionsKeys = Object.keys(nextUIOptions);\\r\\n if (prevUIOptionsKeys.length !== nextUIOptionsKeys.length) {\\r\\n return false;\\r\\n }\\r\\n const isUIOptionsSame = prevUIOptionsKeys.every(function (key) {\\r\\n if (key === \\\"canvasActions\\\") {\\r\\n const canvasOptionKeys = Object.keys(prevUIOptions.canvasActions);\\r\\n canvasOptionKeys.every(function (key) {\\r\\n var _a, _b, _c, _d;\\r\\n if (key === \\\"export\\\" && ((_a = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _a === void 0 ? void 0 : _a.export) && ((_b = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _b === void 0 ? void 0 : _b.export)) {\\r\\n return prevUIOptions.canvasActions.export.saveFileToDisk === nextUIOptions.canvasActions.export.saveFileToDisk;\\r\\n }\\r\\n return ((_c = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _c === void 0 ? void 0 : _c[key]) === ((_d = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _d === void 0 ? void 0 : _d[key]);\\r\\n });\\r\\n }\\r\\n return true;\\r\\n });\\r\\n const prevKeys = Object.keys(prevProps);\\r\\n const nextKeys = Object.keys(nextProps);\\r\\n return isUIOptionsSame && prevKeys.length === nextKeys.length && prevKeys.every(function (key) {\\r\\n return prev[key] === next[key];\\r\\n });\\r\\n};\\r\\nconst forwardedRefComp = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_2__.forwardRef)(function (props, ref) {\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(ExcalidrawBase, _objectSpread(_objectSpread({}, props), {}, {\\r\\n excalidrawRef: ref\\r\\n }));\\r\\n});\\r\\nconst Excalidraw = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().memo(forwardedRefComp, areEqual);\\r\\nExcalidraw.displayName = \\\"Excalidraw\\\";\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyxDQUFDO0FBQ0ksTUFBTSxVQUFVLEdBQUcsYUFBYSxrREFBVSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzlFLFVBQVUsQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDO0FBQzBEO0FBQzVDO0FBQ2dEO0FBTWpDO0FBQ1I7QUFDTTtBQUN3QjtBQUNSO0FBQ00iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbmRleC50c3g/Y2U3NCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5jb25zdCBfZXhjbHVkZWQgPSBbXCJpbml0aWFsRGF0YVwiLCBcIlVJT3B0aW9uc1wiXSxcbiAgICAgIF9leGNsdWRlZDIgPSBbXCJpbml0aWFsRGF0YVwiLCBcIlVJT3B0aW9uc1wiXTtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgZm9yd2FyZFJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgSW5pdGlhbGl6ZUFwcCB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL0luaXRpYWxpemVBcHBcIjtcbmltcG9ydCBBcHAgZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvQXBwXCI7XG5pbXBvcnQgXCIuLi8uLi9jc3MvYXBwLnNjc3NcIjtcbmltcG9ydCBcIi4uLy4uL2Nzcy9zdHlsZXMuc2Nzc1wiO1xuaW1wb3J0IHsgZGVmYXVsdExhbmcgfSBmcm9tIFwiLi4vLi4vaTE4blwiO1xuaW1wb3J0IHsgREVGQVVMVF9VSV9PUFRJT05TIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7IGpvdGFpU2NvcGUsIGpvdGFpU3RvcmUgfSBmcm9tIFwiLi4vLi4vam90YWlcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5cbmNvbnN0IEV4Y2FsaWRyYXdCYXNlID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBvbkNoYW5nZSxcbiAgICBpbml0aWFsRGF0YSxcbiAgICBleGNhbGlkcmF3UmVmLFxuICAgIG9uQ29sbGFiQnV0dG9uQ2xpY2ssXG4gICAgaXNDb2xsYWJvcmF0aW5nID0gZmFsc2UsXG4gICAgb25Qb2ludGVyVXBkYXRlLFxuICAgIHJlbmRlclRvcFJpZ2h0VUksXG4gICAgcmVuZGVyRm9vdGVyLFxuICAgIGxhbmdDb2RlID0gZGVmYXVsdExhbmcuY29kZSxcbiAgICB2aWV3TW9kZUVuYWJsZWQsXG4gICAgemVuTW9kZUVuYWJsZWQsXG4gICAgZ3JpZE1vZGVFbmFibGVkLFxuICAgIGxpYnJhcnlSZXR1cm5VcmwsXG4gICAgdGhlbWUsXG4gICAgbmFtZSxcbiAgICByZW5kZXJDdXN0b21TdGF0cyxcbiAgICBvblBhc3RlLFxuICAgIG9uRHJvcCxcbiAgICAvL3pzdmljemlhblxuICAgIGRldGVjdFNjcm9sbCA9IHRydWUsXG4gICAgaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSA9IGZhbHNlLFxuICAgIG9uTGlicmFyeUNoYW5nZSxcbiAgICBhdXRvRm9jdXMgPSBmYWxzZSxcbiAgICBvbkJlZm9yZVRleHRFZGl0LFxuICAgIC8venN2aWN6aWFuXG4gICAgb25CZWZvcmVUZXh0U3VibWl0LFxuICAgIC8venN2aWN6aWFuXG4gICAgZ2VuZXJhdGVJZEZvckZpbGUsXG4gICAgb25UaGVtZUNoYW5nZSxcbiAgICAvL3pzdmljemlhblxuICAgIG9uTGlua09wZW4sXG4gICAgb25MaW5rSG92ZXIsXG4gICAgLy96c3ZpY3ppYW5cbiAgICBvblZpZXdNb2RlQ2hhbmdlLFxuICAgIC8venN2aWN6aWFuXG4gICAgb25Qb2ludGVyRG93bixcbiAgICBvblNjcm9sbENoYW5nZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGNhbnZhc0FjdGlvbnMgPSBwcm9wcy5VSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM7XG5cbiAgY29uc3QgVUlPcHRpb25zID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcy5VSU9wdGlvbnMpLCB7fSwge1xuICAgIGNhbnZhc0FjdGlvbnM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgREVGQVVMVF9VSV9PUFRJT05TLmNhbnZhc0FjdGlvbnMpLCBjYW52YXNBY3Rpb25zKVxuICB9KTtcblxuICBpZiAoY2FudmFzQWN0aW9ucz8uZXhwb3J0KSB7XG4gICAgVUlPcHRpb25zLmNhbnZhc0FjdGlvbnMuZXhwb3J0LnNhdmVGaWxlVG9EaXNrID0gY2FudmFzQWN0aW9ucy5leHBvcnQ/LnNhdmVGaWxlVG9EaXNrID8/IERFRkFVTFRfVUlfT1BUSU9OUy5jYW52YXNBY3Rpb25zLmV4cG9ydC5zYXZlRmlsZVRvRGlzaztcbiAgfVxuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gQmxvY2sgcGluY2gtem9vbWluZyBvbiBpT1Mgb3V0c2lkZSBvZiB0aGUgY29udGVudCBhcmVhXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpZiAodHlwZW9mIGV2ZW50LnNjYWxlID09PSBcIm51bWJlclwiICYmIGV2ZW50LnNjYWxlICE9PSAxKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlLCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goSW5pdGlhbGl6ZUFwcCwge1xuICAgIGxhbmdDb2RlOiBsYW5nQ29kZSxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goUHJvdmlkZXIsIHtcbiAgICAgIHVuc3RhYmxlX2NyZWF0ZVN0b3JlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBqb3RhaVN0b3JlO1xuICAgICAgfSxcbiAgICAgIHNjb3BlOiBqb3RhaVNjb3BlLFxuICAgICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KEFwcCwge1xuICAgICAgICBvbkNoYW5nZTogb25DaGFuZ2UsXG4gICAgICAgIGluaXRpYWxEYXRhOiBpbml0aWFsRGF0YSxcbiAgICAgICAgZXhjYWxpZHJhd1JlZjogZXhjYWxpZHJhd1JlZixcbiAgICAgICAgb25Db2xsYWJCdXR0b25DbGljazogb25Db2xsYWJCdXR0b25DbGljayxcbiAgICAgICAgaXNDb2xsYWJvcmF0aW5nOiBpc0NvbGxhYm9yYXRpbmcsXG4gICAgICAgIG9uUG9pbnRlclVwZGF0ZTogb25Qb2ludGVyVXBkYXRlLFxuICAgICAgICByZW5kZXJUb3BSaWdodFVJOiByZW5kZXJUb3BSaWdodFVJLFxuICAgICAgICByZW5kZXJGb290ZXI6IHJlbmRlckZvb3RlcixcbiAgICAgICAgbGFuZ0NvZGU6IGxhbmdDb2RlLFxuICAgICAgICB2aWV3TW9kZUVuYWJsZWQ6IHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgICAgemVuTW9kZUVuYWJsZWQ6IHplbk1vZGVFbmFibGVkLFxuICAgICAgICBncmlkTW9kZUVuYWJsZWQ6IGdyaWRNb2RlRW5hYmxlZCxcbiAgICAgICAgbGlicmFyeVJldHVyblVybDogbGlicmFyeVJldHVyblVybCxcbiAgICAgICAgdGhlbWU6IHRoZW1lLFxuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICByZW5kZXJDdXN0b21TdGF0czogcmVuZGVyQ3VzdG9tU3RhdHMsXG4gICAgICAgIFVJT3B0aW9uczogVUlPcHRpb25zLFxuICAgICAgICBvblBhc3RlOiBvblBhc3RlLFxuICAgICAgICBvbkRyb3A6IG9uRHJvcCAvL3pzdmljemlhblxuICAgICAgICAsXG4gICAgICAgIGRldGVjdFNjcm9sbDogZGV0ZWN0U2Nyb2xsLFxuICAgICAgICBoYW5kbGVLZXlib2FyZEdsb2JhbGx5OiBoYW5kbGVLZXlib2FyZEdsb2JhbGx5LFxuICAgICAgICBvbkxpYnJhcnlDaGFuZ2U6IG9uTGlicmFyeUNoYW5nZSxcbiAgICAgICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgICAgIG9uQmVmb3JlVGV4dEVkaXQ6IG9uQmVmb3JlVGV4dEVkaXQgLy96c3ZpY3ppYW5cbiAgICAgICAgLFxuICAgICAgICBvbkJlZm9yZVRleHRTdWJtaXQ6IG9uQmVmb3JlVGV4dFN1Ym1pdCAvL3pzdmljemlhblxuICAgICAgICAsXG4gICAgICAgIGdlbmVyYXRlSWRGb3JGaWxlOiBnZW5lcmF0ZUlkRm9yRmlsZSxcbiAgICAgICAgb25UaGVtZUNoYW5nZTogb25UaGVtZUNoYW5nZSAvL3pzdmljemlhblxuICAgICAgICAsXG4gICAgICAgIG9uTGlua09wZW46IG9uTGlua09wZW4sXG4gICAgICAgIG9uTGlua0hvdmVyOiBvbkxpbmtIb3ZlciAvL3pzdmljemlhblxuICAgICAgICAsXG4gICAgICAgIG9uVmlld01vZGVDaGFuZ2U6IG9uVmlld01vZGVDaGFuZ2UgLy96c3ZpY3ppYW5cbiAgICAgICAgLFxuICAgICAgICBvblBvaW50ZXJEb3duOiBvblBvaW50ZXJEb3duLFxuICAgICAgICBvblNjcm9sbENoYW5nZTogb25TY3JvbGxDaGFuZ2VcbiAgICAgIH0pXG4gICAgfSlcbiAgfSk7XG59O1xuXG5jb25zdCBhcmVFcXVhbCA9IGZ1bmN0aW9uIChwcmV2UHJvcHMsIG5leHRQcm9wcykge1xuICBjb25zdCB7XG4gICAgaW5pdGlhbERhdGE6IHByZXZJbml0aWFsRGF0YSxcbiAgICBVSU9wdGlvbnM6IHByZXZVSU9wdGlvbnMgPSB7fVxuICB9ID0gcHJldlByb3BzLFxuICAgICAgICBwcmV2ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByZXZQcm9wcywgX2V4Y2x1ZGVkKTtcblxuICBjb25zdCB7XG4gICAgaW5pdGlhbERhdGE6IG5leHRJbml0aWFsRGF0YSxcbiAgICBVSU9wdGlvbnM6IG5leHRVSU9wdGlvbnMgPSB7fVxuICB9ID0gbmV4dFByb3BzLFxuICAgICAgICBuZXh0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG5leHRQcm9wcywgX2V4Y2x1ZGVkMik7IC8vIGNvbXBhcmluZyBVSU9wdGlvbnNcblxuXG4gIGNvbnN0IHByZXZVSU9wdGlvbnNLZXlzID0gT2JqZWN0LmtleXMocHJldlVJT3B0aW9ucyk7XG4gIGNvbnN0IG5leHRVSU9wdGlvbnNLZXlzID0gT2JqZWN0LmtleXMobmV4dFVJT3B0aW9ucyk7XG5cbiAgaWYgKHByZXZVSU9wdGlvbnNLZXlzLmxlbmd0aCAhPT0gbmV4dFVJT3B0aW9uc0tleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaXNVSU9wdGlvbnNTYW1lID0gcHJldlVJT3B0aW9uc0tleXMuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChrZXkgPT09IFwiY2FudmFzQWN0aW9uc1wiKSB7XG4gICAgICBjb25zdCBjYW52YXNPcHRpb25LZXlzID0gT2JqZWN0LmtleXMocHJldlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zKTtcbiAgICAgIGNhbnZhc09wdGlvbktleXMuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcImV4cG9ydFwiICYmIHByZXZVSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM/LmV4cG9ydCAmJiBuZXh0VUlPcHRpb25zPy5jYW52YXNBY3Rpb25zPy5leHBvcnQpIHtcbiAgICAgICAgICByZXR1cm4gcHJldlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zLmV4cG9ydC5zYXZlRmlsZVRvRGlzayA9PT0gbmV4dFVJT3B0aW9ucy5jYW52YXNBY3Rpb25zLmV4cG9ydC5zYXZlRmlsZVRvRGlzaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmV2VUlPcHRpb25zPy5jYW52YXNBY3Rpb25zPy5ba2V5XSA9PT0gbmV4dFVJT3B0aW9ucz8uY2FudmFzQWN0aW9ucz8uW2tleV07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG4gIGNvbnN0IHByZXZLZXlzID0gT2JqZWN0LmtleXMocHJldlByb3BzKTtcbiAgY29uc3QgbmV4dEtleXMgPSBPYmplY3Qua2V5cyhuZXh0UHJvcHMpO1xuICByZXR1cm4gaXNVSU9wdGlvbnNTYW1lICYmIHByZXZLZXlzLmxlbmd0aCA9PT0gbmV4dEtleXMubGVuZ3RoICYmIHByZXZLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gcHJldltrZXldID09PSBuZXh0W2tleV07XG4gIH0pO1xufTtcblxuY29uc3QgZm9yd2FyZGVkUmVmQ29tcCA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChFeGNhbGlkcmF3QmFzZSwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgZXhjYWxpZHJhd1JlZjogcmVmXG4gIH0pKTtcbn0pO1xuZXhwb3J0IGNvbnN0IEV4Y2FsaWRyYXcgPSAvKiNfX1BVUkVfXyovUmVhY3QubWVtbyhmb3J3YXJkZWRSZWZDb21wLCBhcmVFcXVhbCk7XG5FeGNhbGlkcmF3LmRpc3BsYXlOYW1lID0gXCJFeGNhbGlkcmF3XCI7XG5leHBvcnQgeyBnZXRTY2VuZVZlcnNpb24sIGlzSW52aXNpYmx5U21hbGxFbGVtZW50LCBnZXROb25EZWxldGVkRWxlbWVudHMgfSBmcm9tIFwiLi4vLi4vZWxlbWVudFwiO1xuZXhwb3J0IHsgZGVmYXVsdExhbmcsIGxhbmd1YWdlcyB9IGZyb20gXCIuLi8uLi9pMThuXCI7XG5leHBvcnQgeyByZXN0b3JlLCByZXN0b3JlQXBwU3RhdGUsIHJlc3RvcmVFbGVtZW50cywgcmVzdG9yZUxpYnJhcnlJdGVtcyB9IGZyb20gXCIuLi8uLi9kYXRhL3Jlc3RvcmVcIjtcbmV4cG9ydCB7IGV4cG9ydFRvQ2FudmFzLCBleHBvcnRUb0Jsb2IsIGV4cG9ydFRvU3ZnLCBzZXJpYWxpemVBc0pTT04sIHNlcmlhbGl6ZUxpYnJhcnlBc0pTT04sIGxvYWRMaWJyYXJ5RnJvbUJsb2IsIGxvYWRGcm9tQmxvYiwgbG9hZFNjZW5lT3JMaWJyYXJ5RnJvbUJsb2IsIGdldEZyZWVEcmF3U3ZnUGF0aCwgZ2V0Q29tbW9uQm91bmRpbmdCb3gsIC8venN2aWN6aWFuXG5nZXRNYXhpbXVtR3JvdXBzLCAvL3pzdmljemlhblxuaW50ZXJzZWN0RWxlbWVudFdpdGhMaW5lLCAvL3pzdmljemlhblxuZGV0ZXJtaW5lRm9jdXNEaXN0YW5jZSwgLy96c3ZpY3ppYW5cbm1lYXN1cmVUZXh0LCAvL3pzdmljemlhblxuZXhwb3J0VG9DbGlwYm9hcmQsIG1lcmdlTGlicmFyeUl0ZW1zIH0gZnJvbSBcIi4uLy4uL3BhY2thZ2VzL3V0aWxzXCI7XG5leHBvcnQgeyBpc0xpbmVhckVsZW1lbnQgfSBmcm9tIFwiLi4vLi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5leHBvcnQgeyBGT05UX0ZBTUlMWSwgVEhFTUUsIE1JTUVfVFlQRVMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5leHBvcnQgeyBtdXRhdGVFbGVtZW50LCBuZXdFbGVtZW50V2l0aCwgYnVtcFZlcnNpb24gfSBmcm9tIFwiLi4vLi4vZWxlbWVudC9tdXRhdGVFbGVtZW50XCI7XG5leHBvcnQgeyBwYXJzZUxpYnJhcnlUb2tlbnNGcm9tVXJsLCB1c2VIYW5kbGVMaWJyYXJ5IH0gZnJvbSBcIi4uLy4uL2RhdGEvbGlicmFyeVwiO1xuZXhwb3J0IHsgc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzLCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///./index.tsx\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/./index.tsx?");
|
|
2975
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"Excalidraw\\\": () => (/* binding */ Excalidraw),\\n/* harmony export */ \\\"FONT_FAMILY\\\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_8__.FONT_FAMILY),\\n/* harmony export */ \\\"MIME_TYPES\\\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_8__.MIME_TYPES),\\n/* harmony export */ \\\"THEME\\\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_8__.THEME),\\n/* harmony export */ \\\"bumpVersion\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_16__.bumpVersion),\\n/* harmony export */ \\\"defaultLang\\\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_7__.defaultLang),\\n/* harmony export */ \\\"determineFocusDistance\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.determineFocusDistance),\\n/* harmony export */ \\\"exportToBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.exportToBlob),\\n/* harmony export */ \\\"exportToCanvas\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.exportToCanvas),\\n/* harmony export */ \\\"exportToClipboard\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.exportToClipboard),\\n/* harmony export */ \\\"exportToSvg\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.exportToSvg),\\n/* harmony export */ \\\"getCommonBoundingBox\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.getCommonBoundingBox),\\n/* harmony export */ \\\"getFreeDrawSvgPath\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.getFreeDrawSvgPath),\\n/* harmony export */ \\\"getMaximumGroups\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.getMaximumGroups),\\n/* harmony export */ \\\"getNonDeletedElements\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_12__.getNonDeletedElements),\\n/* harmony export */ \\\"getSceneVersion\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_12__.getSceneVersion),\\n/* harmony export */ \\\"intersectElementWithLine\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.intersectElementWithLine),\\n/* harmony export */ \\\"isInvisiblySmallElement\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_12__.isInvisiblySmallElement),\\n/* harmony export */ \\\"isLinearElement\\\": () => (/* reexport safe */ _element_typeChecks__WEBPACK_IMPORTED_MODULE_15__.isLinearElement),\\n/* harmony export */ \\\"languages\\\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_7__.languages),\\n/* harmony export */ \\\"loadFromBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.loadFromBlob),\\n/* harmony export */ \\\"loadLibraryFromBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.loadLibraryFromBlob),\\n/* harmony export */ \\\"loadSceneOrLibraryFromBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.loadSceneOrLibraryFromBlob),\\n/* harmony export */ \\\"measureText\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.measureText),\\n/* harmony export */ \\\"mergeLibraryItems\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.mergeLibraryItems),\\n/* harmony export */ \\\"mutateElement\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_16__.mutateElement),\\n/* harmony export */ \\\"newElementWith\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_16__.newElementWith),\\n/* harmony export */ \\\"parseLibraryTokensFromUrl\\\": () => (/* reexport safe */ _data_library__WEBPACK_IMPORTED_MODULE_17__.parseLibraryTokensFromUrl),\\n/* harmony export */ \\\"restore\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_13__.restore),\\n/* harmony export */ \\\"restoreAppState\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_13__.restoreAppState),\\n/* harmony export */ \\\"restoreElements\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_13__.restoreElements),\\n/* harmony export */ \\\"restoreLibraryItems\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_13__.restoreLibraryItems),\\n/* harmony export */ \\\"sceneCoordsToViewportCoords\\\": () => (/* reexport safe */ _utils__WEBPACK_IMPORTED_MODULE_18__.sceneCoordsToViewportCoords),\\n/* harmony export */ \\\"serializeAsJSON\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.serializeAsJSON),\\n/* harmony export */ \\\"serializeLibraryAsJSON\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_14__.serializeLibraryAsJSON),\\n/* harmony export */ \\\"useHandleLibrary\\\": () => (/* reexport safe */ _data_library__WEBPACK_IMPORTED_MODULE_17__.useHandleLibrary),\\n/* harmony export */ \\\"viewportCoordsToSceneCoords\\\": () => (/* reexport safe */ _utils__WEBPACK_IMPORTED_MODULE_18__.viewportCoordsToSceneCoords)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ \\\"./node_modules/@babel/runtime/helpers/objectWithoutProperties.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__);\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"./node_modules/@babel/runtime/helpers/defineProperty.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var _components_InitializeApp__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/InitializeApp */ \\\"../../components/InitializeApp.tsx\\\");\\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/App */ \\\"../../components/App.tsx\\\");\\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../css/app.scss */ \\\"../../css/app.scss\\\");\\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_css_app_scss__WEBPACK_IMPORTED_MODULE_5__);\\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../css/styles.scss */ \\\"../../css/styles.scss\\\");\\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_css_styles_scss__WEBPACK_IMPORTED_MODULE_6__);\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var jotai__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jotai */ \\\"../../../node_modules/jotai/esm/index.js\\\");\\n/* harmony import */ var _jotai__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../jotai */ \\\"../../jotai.ts\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../element */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../data/restore */ \\\"../../data/restore.ts\\\");\\n/* harmony import */ var _packages_utils__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../packages/utils */ \\\"../utils.ts\\\");\\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../element/typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../element/mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../data/library */ \\\"../../data/library.ts\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../utils */ \\\"../../utils.ts\\\");\\n\\r\\n\\r\\nconst _excluded = [\\\"initialData\\\", \\\"UIOptions\\\"], _excluded2 = [\\\"initialData\\\", \\\"UIOptions\\\"];\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst ExcalidrawBase = function (props) {\\r\\n var _a, _b, _c;\\r\\n const { onChange, initialData, excalidrawRef, onCollabButtonClick, isCollaborating = false, onPointerUpdate, renderTopRightUI, renderFooter, langCode = _i18n__WEBPACK_IMPORTED_MODULE_7__.defaultLang.code, viewModeEnabled, zenModeEnabled, gridModeEnabled, trayModeEnabled, \\r\\n //zsviczian\\r\\n libraryReturnUrl, theme, name, renderCustomStats, onPaste, onDrop, \\r\\n //zsviczian\\r\\n detectScroll = true, handleKeyboardGlobally = false, onLibraryChange, autoFocus = false, onBeforeTextEdit, \\r\\n //zsviczian\\r\\n onBeforeTextSubmit, \\r\\n //zsviczian\\r\\n generateIdForFile, onThemeChange, \\r\\n //zsviczian\\r\\n onLinkOpen, onLinkHover, \\r\\n //zsviczian\\r\\n onViewModeChange, \\r\\n //zsviczian\\r\\n onPointerDown, onScrollChange } = props;\\r\\n const canvasActions = (_a = props.UIOptions) === null || _a === void 0 ? void 0 : _a.canvasActions;\\r\\n const UIOptions = _objectSpread(_objectSpread({}, props.UIOptions), {}, {\\r\\n canvasActions: _objectSpread(_objectSpread({}, _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_UI_OPTIONS.canvasActions), canvasActions)\\r\\n });\\r\\n if (canvasActions === null || canvasActions === void 0 ? void 0 : canvasActions.export) {\\r\\n UIOptions.canvasActions.export.saveFileToDisk = (_c = (_b = canvasActions.export) === null || _b === void 0 ? void 0 : _b.saveFileToDisk) !== null && _c !== void 0 ? _c : _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_UI_OPTIONS.canvasActions[\\\"export\\\"].saveFileToDisk;\\r\\n }\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(function () {\\r\\n // Block pinch-zooming on iOS outside of the content area\\r\\n const handleTouchMove = function (event) {\\r\\n // @ts-ignore\\r\\n if (typeof event.scale === \\\"number\\\" && event.scale !== 1) {\\r\\n event.preventDefault();\\r\\n }\\r\\n };\\r\\n document.addEventListener(\\\"touchmove\\\", handleTouchMove, {\\r\\n passive: false\\r\\n });\\r\\n return function () {\\r\\n document.removeEventListener(\\\"touchmove\\\", handleTouchMove);\\r\\n };\\r\\n }, []);\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_components_InitializeApp__WEBPACK_IMPORTED_MODULE_3__.InitializeApp, {\\r\\n langCode: langCode,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(jotai__WEBPACK_IMPORTED_MODULE_11__.Provider, {\\r\\n unstable_createStore: function () {\\r\\n return _jotai__WEBPACK_IMPORTED_MODULE_9__.jotaiStore;\\r\\n },\\r\\n scope: _jotai__WEBPACK_IMPORTED_MODULE_9__.jotaiScope,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_components_App__WEBPACK_IMPORTED_MODULE_4__[\\\"default\\\"], {\\r\\n onChange: onChange,\\r\\n initialData: initialData,\\r\\n excalidrawRef: excalidrawRef,\\r\\n onCollabButtonClick: onCollabButtonClick,\\r\\n isCollaborating: isCollaborating,\\r\\n onPointerUpdate: onPointerUpdate,\\r\\n renderTopRightUI: renderTopRightUI,\\r\\n renderFooter: renderFooter,\\r\\n langCode: langCode,\\r\\n viewModeEnabled: viewModeEnabled,\\r\\n zenModeEnabled: zenModeEnabled,\\r\\n gridModeEnabled: gridModeEnabled,\\r\\n trayModeEnabled: trayModeEnabled //zsviczian\\r\\n ,\\r\\n libraryReturnUrl: libraryReturnUrl,\\r\\n theme: theme,\\r\\n name: name,\\r\\n renderCustomStats: renderCustomStats,\\r\\n UIOptions: UIOptions,\\r\\n onPaste: onPaste,\\r\\n onDrop: onDrop //zsviczian\\r\\n ,\\r\\n detectScroll: detectScroll,\\r\\n handleKeyboardGlobally: handleKeyboardGlobally,\\r\\n onLibraryChange: onLibraryChange,\\r\\n autoFocus: autoFocus,\\r\\n onBeforeTextEdit: onBeforeTextEdit //zsviczian\\r\\n ,\\r\\n onBeforeTextSubmit: onBeforeTextSubmit //zsviczian\\r\\n ,\\r\\n generateIdForFile: generateIdForFile,\\r\\n onThemeChange: onThemeChange //zsviczian\\r\\n ,\\r\\n onLinkOpen: onLinkOpen,\\r\\n onLinkHover: onLinkHover //zsviczian\\r\\n ,\\r\\n onViewModeChange: onViewModeChange //zsviczian\\r\\n ,\\r\\n onPointerDown: onPointerDown,\\r\\n onScrollChange: onScrollChange\\r\\n })\\r\\n })\\r\\n });\\r\\n};\\r\\nconst areEqual = function (prevProps, nextProps) {\\r\\n const { initialData: prevInitialData, UIOptions: prevUIOptions = {} } = prevProps, prev = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(prevProps, _excluded);\\r\\n const { initialData: nextInitialData, UIOptions: nextUIOptions = {} } = nextProps, next = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(nextProps, _excluded2); // comparing UIOptions\\r\\n const prevUIOptionsKeys = Object.keys(prevUIOptions);\\r\\n const nextUIOptionsKeys = Object.keys(nextUIOptions);\\r\\n if (prevUIOptionsKeys.length !== nextUIOptionsKeys.length) {\\r\\n return false;\\r\\n }\\r\\n const isUIOptionsSame = prevUIOptionsKeys.every(function (key) {\\r\\n if (key === \\\"canvasActions\\\") {\\r\\n const canvasOptionKeys = Object.keys(prevUIOptions.canvasActions);\\r\\n canvasOptionKeys.every(function (key) {\\r\\n var _a, _b, _c, _d;\\r\\n if (key === \\\"export\\\" && ((_a = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _a === void 0 ? void 0 : _a.export) && ((_b = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _b === void 0 ? void 0 : _b.export)) {\\r\\n return prevUIOptions.canvasActions.export.saveFileToDisk === nextUIOptions.canvasActions.export.saveFileToDisk;\\r\\n }\\r\\n return ((_c = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _c === void 0 ? void 0 : _c[key]) === ((_d = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _d === void 0 ? void 0 : _d[key]);\\r\\n });\\r\\n }\\r\\n return true;\\r\\n });\\r\\n const prevKeys = Object.keys(prevProps);\\r\\n const nextKeys = Object.keys(nextProps);\\r\\n return isUIOptionsSame && prevKeys.length === nextKeys.length && prevKeys.every(function (key) {\\r\\n return prev[key] === next[key];\\r\\n });\\r\\n};\\r\\nconst forwardedRefComp = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_2__.forwardRef)(function (props, ref) {\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(ExcalidrawBase, _objectSpread(_objectSpread({}, props), {}, {\\r\\n excalidrawRef: ref\\r\\n }));\\r\\n});\\r\\nconst Excalidraw = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().memo(forwardedRefComp, areEqual);\\r\\nExcalidraw.displayName = \\\"Excalidraw\\\";\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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S0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFO1FBQ25GLGFBQWEsRUFBRSxHQUFHO0tBQ25CLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUM7QUFDSSxNQUFNLFVBQVUsR0FBRyxhQUFhLGtEQUFVLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDOUUsVUFBVSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7QUFDMEQ7QUFDNUM7QUFDZ0Q7QUFNakM7QUFDUjtBQUNNO0FBQ3dCO0FBQ1I7QUFDTSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL2luZGV4LnRzeD9jZTc0Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmNvbnN0IF9leGNsdWRlZCA9IFtcImluaXRpYWxEYXRhXCIsIFwiVUlPcHRpb25zXCJdLFxuICAgICAgX2V4Y2x1ZGVkMiA9IFtcImluaXRpYWxEYXRhXCIsIFwiVUlPcHRpb25zXCJdO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCBmb3J3YXJkUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBJbml0aWFsaXplQXBwIH0gZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvSW5pdGlhbGl6ZUFwcFwiO1xuaW1wb3J0IEFwcCBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9BcHBcIjtcbmltcG9ydCBcIi4uLy4uL2Nzcy9hcHAuc2Nzc1wiO1xuaW1wb3J0IFwiLi4vLi4vY3NzL3N0eWxlcy5zY3NzXCI7XG5pbXBvcnQgeyBkZWZhdWx0TGFuZyB9IGZyb20gXCIuLi8uLi9pMThuXCI7XG5pbXBvcnQgeyBERUZBVUxUX1VJX09QVElPTlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gXCJqb3RhaVwiO1xuaW1wb3J0IHsgam90YWlTY29wZSwgam90YWlTdG9yZSB9IGZyb20gXCIuLi8uLi9qb3RhaVwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcblxuY29uc3QgRXhjYWxpZHJhd0Jhc2UgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIG9uQ2hhbmdlLFxuICAgIGluaXRpYWxEYXRhLFxuICAgIGV4Y2FsaWRyYXdSZWYsXG4gICAgb25Db2xsYWJCdXR0b25DbGljayxcbiAgICBpc0NvbGxhYm9yYXRpbmcgPSBmYWxzZSxcbiAgICBvblBvaW50ZXJVcGRhdGUsXG4gICAgcmVuZGVyVG9wUmlnaHRVSSxcbiAgICByZW5kZXJGb290ZXIsXG4gICAgbGFuZ0NvZGUgPSBkZWZhdWx0TGFuZy5jb2RlLFxuICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICB6ZW5Nb2RlRW5hYmxlZCxcbiAgICBncmlkTW9kZUVuYWJsZWQsXG4gICAgdHJheU1vZGVFbmFibGVkLFxuICAgIC8venN2aWN6aWFuXG4gICAgbGlicmFyeVJldHVyblVybCxcbiAgICB0aGVtZSxcbiAgICBuYW1lLFxuICAgIHJlbmRlckN1c3RvbVN0YXRzLFxuICAgIG9uUGFzdGUsXG4gICAgb25Ecm9wLFxuICAgIC8venN2aWN6aWFuXG4gICAgZGV0ZWN0U2Nyb2xsID0gdHJ1ZSxcbiAgICBoYW5kbGVLZXlib2FyZEdsb2JhbGx5ID0gZmFsc2UsXG4gICAgb25MaWJyYXJ5Q2hhbmdlLFxuICAgIGF1dG9Gb2N1cyA9IGZhbHNlLFxuICAgIG9uQmVmb3JlVGV4dEVkaXQsXG4gICAgLy96c3ZpY3ppYW5cbiAgICBvbkJlZm9yZVRleHRTdWJtaXQsXG4gICAgLy96c3ZpY3ppYW5cbiAgICBnZW5lcmF0ZUlkRm9yRmlsZSxcbiAgICBvblRoZW1lQ2hhbmdlLFxuICAgIC8venN2aWN6aWFuXG4gICAgb25MaW5rT3BlbixcbiAgICBvbkxpbmtIb3ZlcixcbiAgICAvL3pzdmljemlhblxuICAgIG9uVmlld01vZGVDaGFuZ2UsXG4gICAgLy96c3ZpY3ppYW5cbiAgICBvblBvaW50ZXJEb3duLFxuICAgIG9uU2Nyb2xsQ2hhbmdlXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgY2FudmFzQWN0aW9ucyA9IHByb3BzLlVJT3B0aW9ucz8uY2FudmFzQWN0aW9ucztcblxuICBjb25zdCBVSU9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzLlVJT3B0aW9ucyksIHt9LCB7XG4gICAgY2FudmFzQWN0aW9uczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBERUZBVUxUX1VJX09QVElPTlMuY2FudmFzQWN0aW9ucyksIGNhbnZhc0FjdGlvbnMpXG4gIH0pO1xuXG4gIGlmIChjYW52YXNBY3Rpb25zPy5leHBvcnQpIHtcbiAgICBVSU9wdGlvbnMuY2FudmFzQWN0aW9ucy5leHBvcnQuc2F2ZUZpbGVUb0Rpc2sgPSBjYW52YXNBY3Rpb25zLmV4cG9ydD8uc2F2ZUZpbGVUb0Rpc2sgPz8gREVGQVVMVF9VSV9PUFRJT05TLmNhbnZhc0FjdGlvbnMuZXhwb3J0LnNhdmVGaWxlVG9EaXNrO1xuICB9XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBCbG9jayBwaW5jaC16b29taW5nIG9uIGlPUyBvdXRzaWRlIG9mIHRoZSBjb250ZW50IGFyZWFcbiAgICBjb25zdCBoYW5kbGVUb3VjaE1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICh0eXBlb2YgZXZlbnQuc2NhbGUgPT09IFwibnVtYmVyXCIgJiYgZXZlbnQuc2NhbGUgIT09IDEpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUsIHtcbiAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChJbml0aWFsaXplQXBwLCB7XG4gICAgbGFuZ0NvZGU6IGxhbmdDb2RlLFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChQcm92aWRlciwge1xuICAgICAgdW5zdGFibGVfY3JlYXRlU3RvcmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGpvdGFpU3RvcmU7XG4gICAgICB9LFxuICAgICAgc2NvcGU6IGpvdGFpU2NvcGUsXG4gICAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goQXBwLCB7XG4gICAgICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSxcbiAgICAgICAgaW5pdGlhbERhdGE6IGluaXRpYWxEYXRhLFxuICAgICAgICBleGNhbGlkcmF3UmVmOiBleGNhbGlkcmF3UmVmLFxuICAgICAgICBvbkNvbGxhYkJ1dHRvbkNsaWNrOiBvbkNvbGxhYkJ1dHRvbkNsaWNrLFxuICAgICAgICBpc0NvbGxhYm9yYXRpbmc6IGlzQ29sbGFib3JhdGluZyxcbiAgICAgICAgb25Qb2ludGVyVXBkYXRlOiBvblBvaW50ZXJVcGRhdGUsXG4gICAgICAgIHJlbmRlclRvcFJpZ2h0VUk6IHJlbmRlclRvcFJpZ2h0VUksXG4gICAgICAgIHJlbmRlckZvb3RlcjogcmVuZGVyRm9vdGVyLFxuICAgICAgICBsYW5nQ29kZTogbGFuZ0NvZGUsXG4gICAgICAgIHZpZXdNb2RlRW5hYmxlZDogdmlld01vZGVFbmFibGVkLFxuICAgICAgICB6ZW5Nb2RlRW5hYmxlZDogemVuTW9kZUVuYWJsZWQsXG4gICAgICAgIGdyaWRNb2RlRW5hYmxlZDogZ3JpZE1vZGVFbmFibGVkLFxuICAgICAgICB0cmF5TW9kZUVuYWJsZWQ6IHRyYXlNb2RlRW5hYmxlZCAvL3pzdmljemlhblxuICAgICAgICAsXG4gICAgICAgIGxpYnJhcnlSZXR1cm5Vcmw6IGxpYnJhcnlSZXR1cm5VcmwsXG4gICAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgcmVuZGVyQ3VzdG9tU3RhdHM6IHJlbmRlckN1c3RvbVN0YXRzLFxuICAgICAgICBVSU9wdGlvbnM6IFVJT3B0aW9ucyxcbiAgICAgICAgb25QYXN0ZTogb25QYXN0ZSxcbiAgICAgICAgb25Ecm9wOiBvbkRyb3AgLy96c3ZpY3ppYW5cbiAgICAgICAgLFxuICAgICAgICBkZXRlY3RTY3JvbGw6IGRldGVjdFNjcm9sbCxcbiAgICAgICAgaGFuZGxlS2V5Ym9hcmRHbG9iYWxseTogaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSxcbiAgICAgICAgb25MaWJyYXJ5Q2hhbmdlOiBvbkxpYnJhcnlDaGFuZ2UsXG4gICAgICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgICAgICBvbkJlZm9yZVRleHRFZGl0OiBvbkJlZm9yZVRleHRFZGl0IC8venN2aWN6aWFuXG4gICAgICAgICxcbiAgICAgICAgb25CZWZvcmVUZXh0U3VibWl0OiBvbkJlZm9yZVRleHRTdWJtaXQgLy96c3ZpY3ppYW5cbiAgICAgICAgLFxuICAgICAgICBnZW5lcmF0ZUlkRm9yRmlsZTogZ2VuZXJhdGVJZEZvckZpbGUsXG4gICAgICAgIG9uVGhlbWVDaGFuZ2U6IG9uVGhlbWVDaGFuZ2UgLy96c3ZpY3ppYW5cbiAgICAgICAgLFxuICAgICAgICBvbkxpbmtPcGVuOiBvbkxpbmtPcGVuLFxuICAgICAgICBvbkxpbmtIb3Zlcjogb25MaW5rSG92ZXIgLy96c3ZpY3ppYW5cbiAgICAgICAgLFxuICAgICAgICBvblZpZXdNb2RlQ2hhbmdlOiBvblZpZXdNb2RlQ2hhbmdlIC8venN2aWN6aWFuXG4gICAgICAgICxcbiAgICAgICAgb25Qb2ludGVyRG93bjogb25Qb2ludGVyRG93bixcbiAgICAgICAgb25TY3JvbGxDaGFuZ2U6IG9uU2Nyb2xsQ2hhbmdlXG4gICAgICB9KVxuICAgIH0pXG4gIH0pO1xufTtcblxuY29uc3QgYXJlRXF1YWwgPSBmdW5jdGlvbiAocHJldlByb3BzLCBuZXh0UHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIGluaXRpYWxEYXRhOiBwcmV2SW5pdGlhbERhdGEsXG4gICAgVUlPcHRpb25zOiBwcmV2VUlPcHRpb25zID0ge31cbiAgfSA9IHByZXZQcm9wcyxcbiAgICAgICAgcHJldiA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcmV2UHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgY29uc3Qge1xuICAgIGluaXRpYWxEYXRhOiBuZXh0SW5pdGlhbERhdGEsXG4gICAgVUlPcHRpb25zOiBuZXh0VUlPcHRpb25zID0ge31cbiAgfSA9IG5leHRQcm9wcyxcbiAgICAgICAgbmV4dCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhuZXh0UHJvcHMsIF9leGNsdWRlZDIpOyAvLyBjb21wYXJpbmcgVUlPcHRpb25zXG5cblxuICBjb25zdCBwcmV2VUlPcHRpb25zS2V5cyA9IE9iamVjdC5rZXlzKHByZXZVSU9wdGlvbnMpO1xuICBjb25zdCBuZXh0VUlPcHRpb25zS2V5cyA9IE9iamVjdC5rZXlzKG5leHRVSU9wdGlvbnMpO1xuXG4gIGlmIChwcmV2VUlPcHRpb25zS2V5cy5sZW5ndGggIT09IG5leHRVSU9wdGlvbnNLZXlzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGlzVUlPcHRpb25zU2FtZSA9IHByZXZVSU9wdGlvbnNLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoa2V5ID09PSBcImNhbnZhc0FjdGlvbnNcIikge1xuICAgICAgY29uc3QgY2FudmFzT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHByZXZVSU9wdGlvbnMuY2FudmFzQWN0aW9ucyk7XG4gICAgICBjYW52YXNPcHRpb25LZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJleHBvcnRcIiAmJiBwcmV2VUlPcHRpb25zPy5jYW52YXNBY3Rpb25zPy5leHBvcnQgJiYgbmV4dFVJT3B0aW9ucz8uY2FudmFzQWN0aW9ucz8uZXhwb3J0KSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZVSU9wdGlvbnMuY2FudmFzQWN0aW9ucy5leHBvcnQuc2F2ZUZpbGVUb0Rpc2sgPT09IG5leHRVSU9wdGlvbnMuY2FudmFzQWN0aW9ucy5leHBvcnQuc2F2ZUZpbGVUb0Rpc2s7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJldlVJT3B0aW9ucz8uY2FudmFzQWN0aW9ucz8uW2tleV0gPT09IG5leHRVSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM/LltrZXldO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuICBjb25zdCBwcmV2S2V5cyA9IE9iamVjdC5rZXlzKHByZXZQcm9wcyk7XG4gIGNvbnN0IG5leHRLZXlzID0gT2JqZWN0LmtleXMobmV4dFByb3BzKTtcbiAgcmV0dXJuIGlzVUlPcHRpb25zU2FtZSAmJiBwcmV2S2V5cy5sZW5ndGggPT09IG5leHRLZXlzLmxlbmd0aCAmJiBwcmV2S2V5cy5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHByZXZba2V5XSA9PT0gbmV4dFtrZXldO1xuICB9KTtcbn07XG5cbmNvbnN0IGZvcndhcmRlZFJlZkNvbXAgPSAvKiNfX1BVUkVfXyovZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goRXhjYWxpZHJhd0Jhc2UsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIGV4Y2FsaWRyYXdSZWY6IHJlZlxuICB9KSk7XG59KTtcbmV4cG9ydCBjb25zdCBFeGNhbGlkcmF3ID0gLyojX19QVVJFX18qL1JlYWN0Lm1lbW8oZm9yd2FyZGVkUmVmQ29tcCwgYXJlRXF1YWwpO1xuRXhjYWxpZHJhdy5kaXNwbGF5TmFtZSA9IFwiRXhjYWxpZHJhd1wiO1xuZXhwb3J0IHsgZ2V0U2NlbmVWZXJzaW9uLCBpc0ludmlzaWJseVNtYWxsRWxlbWVudCwgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzIH0gZnJvbSBcIi4uLy4uL2VsZW1lbnRcIjtcbmV4cG9ydCB7IGRlZmF1bHRMYW5nLCBsYW5ndWFnZXMgfSBmcm9tIFwiLi4vLi4vaTE4blwiO1xuZXhwb3J0IHsgcmVzdG9yZSwgcmVzdG9yZUFwcFN0YXRlLCByZXN0b3JlRWxlbWVudHMsIHJlc3RvcmVMaWJyYXJ5SXRlbXMgfSBmcm9tIFwiLi4vLi4vZGF0YS9yZXN0b3JlXCI7XG5leHBvcnQgeyBleHBvcnRUb0NhbnZhcywgZXhwb3J0VG9CbG9iLCBleHBvcnRUb1N2Zywgc2VyaWFsaXplQXNKU09OLCBzZXJpYWxpemVMaWJyYXJ5QXNKU09OLCBsb2FkTGlicmFyeUZyb21CbG9iLCBsb2FkRnJvbUJsb2IsIGxvYWRTY2VuZU9yTGlicmFyeUZyb21CbG9iLCBnZXRGcmVlRHJhd1N2Z1BhdGgsIGdldENvbW1vbkJvdW5kaW5nQm94LCAvL3pzdmljemlhblxuZ2V0TWF4aW11bUdyb3VwcywgLy96c3ZpY3ppYW5cbmludGVyc2VjdEVsZW1lbnRXaXRoTGluZSwgLy96c3ZpY3ppYW5cbmRldGVybWluZUZvY3VzRGlzdGFuY2UsIC8venN2aWN6aWFuXG5tZWFzdXJlVGV4dCwgLy96c3ZpY3ppYW5cbmV4cG9ydFRvQ2xpcGJvYXJkLCBtZXJnZUxpYnJhcnlJdGVtcyB9IGZyb20gXCIuLi8uLi9wYWNrYWdlcy91dGlsc1wiO1xuZXhwb3J0IHsgaXNMaW5lYXJFbGVtZW50IH0gZnJvbSBcIi4uLy4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuZXhwb3J0IHsgRk9OVF9GQU1JTFksIFRIRU1FLCBNSU1FX1RZUEVTIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuZXhwb3J0IHsgbXV0YXRlRWxlbWVudCwgbmV3RWxlbWVudFdpdGgsIGJ1bXBWZXJzaW9uIH0gZnJvbSBcIi4uLy4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuZXhwb3J0IHsgcGFyc2VMaWJyYXJ5VG9rZW5zRnJvbVVybCwgdXNlSGFuZGxlTGlicmFyeSB9IGZyb20gXCIuLi8uLi9kYXRhL2xpYnJhcnlcIjtcbmV4cG9ydCB7IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3Jkcywgdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///./index.tsx\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/./index.tsx?");
|
|
2976
2976
|
|
|
2977
2977
|
/***/ }),
|
|
2978
2978
|
|
|
@@ -2983,7 +2983,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
2983
2983
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2984
2984
|
|
|
2985
2985
|
"use strict";
|
|
2986
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \\\"../../constants.ts\\\");\\n\\r\\nif (\\\"development\\\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\\r\\n /* eslint-disable */\\r\\n /* global __webpack_public_path__:writable */\\r\\n __webpack_require__.p = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\\\"@zsviczian/excalidraw\\\"}@${\\\"0.12.0-obsidian-
|
|
2986
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \\\"../../constants.ts\\\");\\n\\r\\nif (\\\"development\\\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\\r\\n /* eslint-disable */\\r\\n /* global __webpack_public_path__:writable */\\r\\n __webpack_require__.p = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\\\"@zsviczian/excalidraw\\\"}@${\\\"0.12.0-obsidian-1\\\"}/dist/`;\\r\\n}\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBRXRDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUVwQiw2Q0FBNkM7SUFDN0MscUJBQXVCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixJQUFJLHFCQUFxQix1QkFBb0IsSUFBSSxtQkFBdUIsUUFBUSxDQUFDO0NBQ3hJIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcHVibGljUGF0aC5qcz8xMTVkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVOViB9IGZyb20gXCIuLi8uLi9jb25zdGFudHNcIjtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuVEVTVCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG4gIC8qIGdsb2JhbCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXzp3cml0YWJsZSAqL1xuICBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyA9IHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHwgYGh0dHBzOi8vdW5wa2cuY29tLyR7cHJvY2Vzcy5lbnYuUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuUEtHX1ZFUlNJT059L2Rpc3QvYDtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///./publicPath.js\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/./publicPath.js?");
|
|
2987
2987
|
|
|
2988
2988
|
/***/ }),
|
|
2989
2989
|
|
|
@@ -3082,7 +3082,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
3082
3082
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3083
3083
|
|
|
3084
3084
|
"use strict";
|
|
3085
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"SVG_EXPORT_TAG\\\": () => (/* binding */ SVG_EXPORT_TAG),\\n/* harmony export */ \\\"exportToCanvas\\\": () => (/* binding */ exportToCanvas),\\n/* harmony export */ \\\"exportToSvg\\\": () => (/* binding */ exportToSvg),\\n/* harmony export */ \\\"getExportSize\\\": () => (/* binding */ getExportSize)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \\\"../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\\\");\\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! roughjs/bin/rough */ \\\"../../../node_modules/roughjs/bin/rough.js\\\");\\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element/bounds */ \\\"../../element/bounds.ts\\\");\\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../renderer/renderScene */ \\\"../../renderer/renderScene.ts\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../appState */ \\\"../../appState.ts\\\");\\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../data/json */ \\\"../../data/json.ts\\\");\\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../element/image */ \\\"../../element/image.ts\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\\r\\nconst exportToCanvas = /*#__PURE__*/ function () {\\r\\n var _ref = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (elements, appState, files, _ref2) {\\r\\n let { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_EXPORT_PADDING, viewBackgroundColor } = _ref2;\\r\\n let createCanvas = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function (width, height) {\\r\\n const canvas = document.createElement(\\\"canvas\\\");\\r\\n canvas.width = width * appState.exportScale;\\r\\n canvas.height = height * appState.exportScale;\\r\\n return {\\r\\n canvas,\\r\\n scale: appState.exportScale\\r\\n };\\r\\n };\\r\\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\\r\\n const { canvas, scale = 1 } = createCanvas(width, height);\\r\\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_6__.getDefaultAppState)();\\r\\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_8__.updateImageCache)({\\r\\n imageCache: new Map(),\\r\\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_8__.getInitializedImageElements)(elements).map(function (element) {\\r\\n return element.fileId;\\r\\n }),\\r\\n files\\r\\n });\\r\\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_3__.renderScene)(elements, appState, null, scale, roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"].canvas(canvas), canvas, {\\r\\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\\r\\n scrollX: -minX + exportPadding,\\r\\n scrollY: -minY + exportPadding,\\r\\n zoom: defaultAppState.zoom,\\r\\n remotePointerViewportCoords: {},\\r\\n remoteSelectedElementIds: {},\\r\\n shouldCacheIgnoreZoom: false,\\r\\n remotePointerUsernames: {},\\r\\n remotePointerUserStates: {},\\r\\n theme: appState.exportWithDarkMode ? \\\"dark\\\" : \\\"light\\\",\\r\\n imageCache,\\r\\n renderScrollbars: false,\\r\\n renderSelection: false,\\r\\n renderGrid: false,\\r\\n isExporting: true\\r\\n });\\r\\n return canvas;\\r\\n });\\r\\n return function exportToCanvas(_x, _x2, _x3, _x4) {\\r\\n return _ref.apply(this, arguments);\\r\\n };\\r\\n}();\\r\\nconst exportToSvg = /*#__PURE__*/ function () {\\r\\n var _ref3 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (elements, appState, files) {\\r\\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene } = appState;\\r\\n let metadata = \\\"\\\";\\r\\n if (exportEmbedScene) {\\r\\n try {\\r\\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \\\"../../data/image.ts\\\"))).encodeSvgMetadata({\\r\\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_7__.serializeAsJSON)(elements, appState, files || {}, \\\"local\\\")\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n }\\r\\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding); // initialize SVG root\\r\\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_5__.SVG_NS, \\\"svg\\\");\\r\\n svgRoot.setAttribute(\\\"version\\\", \\\"1.1\\\");\\r\\n svgRoot.setAttribute(\\\"xmlns\\\", _constants__WEBPACK_IMPORTED_MODULE_5__.SVG_NS);\\r\\n svgRoot.setAttribute(\\\"viewBox\\\", `0 0 ${width} ${height}`);\\r\\n svgRoot.setAttribute(\\\"width\\\", `${width * exportScale}`);\\r\\n svgRoot.setAttribute(\\\"height\\\", `${height * exportScale}`);\\r\\n if (appState.exportWithDarkMode) {\\r\\n svgRoot.setAttribute(\\\"filter\\\", _constants__WEBPACK_IMPORTED_MODULE_5__.THEME_FILTER);\\r\\n }\\r\\n let assetPath = \\\"https://excalidraw.com/\\\"; // Asset path needs to be determined only when using package\\r\\n if (true) {\\r\\n assetPath = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\\\"@zsviczian/excalidraw\\\"}@${\\\"0.12.0-obsidian-0\\\"}`;\\r\\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\\\"/\\\")) {\\r\\n assetPath = assetPath.replace(\\\"/\\\", `${window.location.origin}/`);\\r\\n }\\r\\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\\r\\n }\\r\\n svgRoot.innerHTML = `\\n ${SVG_EXPORT_TAG}\\n ${metadata}\\n <defs>\\n <style>\\n @font-face {\\n font-family: \\\"Virgil\\\";\\n src: url(\\\"${assetPath}Virgil.woff2\\\");\\n }\\n @font-face {\\n font-family: \\\"Cascadia\\\";\\n src: url(\\\"${assetPath}Cascadia.woff2\\\");\\n }\\n </style>\\n </defs>\\n `; // render background rect\\r\\n if (appState.exportBackground && viewBackgroundColor) {\\r\\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_5__.SVG_NS, \\\"rect\\\");\\r\\n rect.setAttribute(\\\"x\\\", \\\"0\\\");\\r\\n rect.setAttribute(\\\"y\\\", \\\"0\\\");\\r\\n rect.setAttribute(\\\"width\\\", `${width}`);\\r\\n rect.setAttribute(\\\"height\\\", `${height}`);\\r\\n rect.setAttribute(\\\"fill\\\", viewBackgroundColor);\\r\\n svgRoot.appendChild(rect);\\r\\n }\\r\\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"].svg(svgRoot);\\r\\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_3__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\\r\\n offsetX: -minX + exportPadding,\\r\\n offsetY: -minY + exportPadding,\\r\\n exportWithDarkMode: appState.exportWithDarkMode\\r\\n });\\r\\n return svgRoot;\\r\\n });\\r\\n return function exportToSvg(_x5, _x6, _x7) {\\r\\n return _ref3.apply(this, arguments);\\r\\n };\\r\\n}(); // calculate smallest area to fit the contents in\\r\\nconst getCanvasSize = function (elements, exportPadding) {\\r\\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_2__.getCommonBounds)(elements);\\r\\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.distance)(minX, maxX) + exportPadding * 2;\\r\\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.distance)(minY, maxY) + exportPadding + exportPadding;\\r\\n return [minX, minY, width, height];\\r\\n};\\r\\nconst getExportSize = function (elements, exportPadding, scale) {\\r\\n const [, , width, height] = getCanvasSize(elements, exportPadding).map(function (dimension) {\\r\\n return Math.trunc(dimension * scale);\\r\\n });\\r\\n return [width, height];\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEVBQUUsSUFBSSxDQUFDLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztJQUN2RCxNQUFNLE1BQU0sR0FBRyxnREFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUM7QUFFSyxNQUFNLGFBQWEsR0FBRyxVQUFVLFFBQVEsRUFBRSxhQUFhLEVBQUUsS0FBSztJQUNuRSxNQUFNLENBQUMsRUFBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLFNBQVM7UUFDdkYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz8yNTM4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9FWFBPUlRfUEFERElORywgU1ZHX05TLCBUSEVNRV9GSUxURVIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7IHNlcmlhbGl6ZUFzSlNPTiB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCB7IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cywgdXBkYXRlSW1hZ2VDYWNoZSB9IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5leHBvcnQgY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDtcbmV4cG9ydCBjb25zdCBleHBvcnRUb0NhbnZhcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzLCBfcmVmMikge1xuICAgIGxldCB7XG4gICAgICBleHBvcnRCYWNrZ3JvdW5kLFxuICAgICAgZXhwb3J0UGFkZGluZyA9IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsXG4gICAgICB2aWV3QmFja2dyb3VuZENvbG9yXG4gICAgfSA9IF9yZWYyO1xuICAgIGxldCBjcmVhdGVDYW52YXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgY2FudmFzLndpZHRoID0gd2lkdGggKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhbnZhcyxcbiAgICAgICAgc2NhbGU6IGFwcFN0YXRlLmV4cG9ydFNjYWxlXG4gICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7XG4gICAgY29uc3Qge1xuICAgICAgY2FudmFzLFxuICAgICAgc2NhbGUgPSAxXG4gICAgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcbiAgICBjb25zdCB7XG4gICAgICBpbWFnZUNhY2hlXG4gICAgfSA9IHlpZWxkIHVwZGF0ZUltYWdlQ2FjaGUoe1xuICAgICAgaW1hZ2VDYWNoZTogbmV3IE1hcCgpLFxuICAgICAgZmlsZUlkczogZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKGVsZW1lbnRzKS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZmlsZUlkO1xuICAgICAgfSksXG4gICAgICBmaWxlc1xuICAgIH0pO1xuICAgIHJlbmRlclNjZW5lKGVsZW1lbnRzLCBhcHBTdGF0ZSwgbnVsbCwgc2NhbGUsIHJvdWdoLmNhbnZhcyhjYW52YXMpLCBjYW52YXMsIHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczoge30sXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogZmFsc2UsXG4gICAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydGluZzogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBjYW52YXM7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiBleHBvcnRUb0NhbnZhcyhfeCwgX3gyLCBfeDMsIF94NCkge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjMgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgZmlsZXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBleHBvcnRTY2FsZSA9IDEsXG4gICAgICBleHBvcnRFbWJlZFNjZW5lXG4gICAgfSA9IGFwcFN0YXRlO1xuICAgIGxldCBtZXRhZGF0YSA9IFwiXCI7XG5cbiAgICBpZiAoZXhwb3J0RW1iZWRTY2VuZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWV0YWRhdGEgPSB5aWVsZCAoeWllbGQgaW1wb3J0KFxuICAgICAgICAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImltYWdlXCIgKi9cbiAgICAgICAgXCIuLi8uLi9zcmMvZGF0YS9pbWFnZVwiKSkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICAgIHRleHQ6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7IC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcblxuICAgIGNvbnN0IHN2Z1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ4bWxuc1wiLCBTVkdfTlMpO1xuICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHQgKiBleHBvcnRTY2FsZX1gKTtcblxuICAgIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiZmlsdGVyXCIsIFRIRU1FX0ZJTFRFUik7XG4gICAgfVxuXG4gICAgbGV0IGFzc2V0UGF0aCA9IFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9cIjsgLy8gQXNzZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIG9ubHkgd2hlbiB1c2luZyBwYWNrYWdlXG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuSVNfRVhDQUxJRFJBV19OUE1fUEFDS0FHRSkge1xuICAgICAgYXNzZXRQYXRoID0gd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fCBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5QS0dfVkVSU0lPTn1gO1xuXG4gICAgICBpZiAoYXNzZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgICB9XG5cbiAgICAgIGFzc2V0UGF0aCA9IGAke2Fzc2V0UGF0aH0vZGlzdC9leGNhbGlkcmF3LWFzc2V0cy9gO1xuICAgIH1cblxuICAgIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGU+XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiVmlyZ2lsXCI7XG4gICAgICAgIHNyYzogdXJsKFwiJHthc3NldFBhdGh9VmlyZ2lsLndvZmYyXCIpO1xuICAgICAgfVxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIkNhc2NhZGlhXCI7XG4gICAgICAgIHNyYzogdXJsKFwiJHthc3NldFBhdGh9Q2FzY2FkaWEud29mZjJcIik7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC9kZWZzPlxuICBgOyAvLyByZW5kZXIgYmFja2dyb3VuZCByZWN0XG5cbiAgICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgICBjb25zdCByZWN0ID0gc3ZnUm9vdC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwicmVjdFwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcInlcIiwgXCIwXCIpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1gKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB2aWV3QmFja2dyb3VuZENvbG9yKTtcbiAgICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQocmVjdCk7XG4gICAgfVxuXG4gICAgY29uc3QgcnN2ZyA9IHJvdWdoLnN2ZyhzdmdSb290KTtcbiAgICByZW5kZXJTY2VuZVRvU3ZnKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcyB8fCB7fSwge1xuICAgICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgICAgb2Zmc2V0WTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgICAgZXhwb3J0V2l0aERhcmtNb2RlOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGVcbiAgICB9KTtcbiAgICByZXR1cm4gc3ZnUm9vdDtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGV4cG9ydFRvU3ZnKF94NSwgX3g2LCBfeDcpIHtcbiAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTsgLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuXG5jb25zdCBnZXRDYW52YXNTaXplID0gZnVuY3Rpb24gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKSB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICsgZXhwb3J0UGFkZGluZztcbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFeHBvcnRTaXplID0gZnVuY3Rpb24gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nLCBzY2FsZSkge1xuICBjb25zdCBbLCwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoZnVuY3Rpb24gKGRpbWVuc2lvbikge1xuICAgIHJldHVybiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKTtcbiAgfSk7XG4gIHJldHVybiBbd2lkdGgsIGhlaWdodF07XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../scene/export.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../scene/export.ts?");
|
|
3085
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"SVG_EXPORT_TAG\\\": () => (/* binding */ SVG_EXPORT_TAG),\\n/* harmony export */ \\\"exportToCanvas\\\": () => (/* binding */ exportToCanvas),\\n/* harmony export */ \\\"exportToSvg\\\": () => (/* binding */ exportToSvg),\\n/* harmony export */ \\\"getExportSize\\\": () => (/* binding */ getExportSize)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \\\"../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\\\");\\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! roughjs/bin/rough */ \\\"../../../node_modules/roughjs/bin/rough.js\\\");\\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element/bounds */ \\\"../../element/bounds.ts\\\");\\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../renderer/renderScene */ \\\"../../renderer/renderScene.ts\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../appState */ \\\"../../appState.ts\\\");\\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../data/json */ \\\"../../data/json.ts\\\");\\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../element/image */ \\\"../../element/image.ts\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\\r\\nconst exportToCanvas = /*#__PURE__*/ function () {\\r\\n var _ref = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (elements, appState, files, _ref2) {\\r\\n let { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_EXPORT_PADDING, viewBackgroundColor } = _ref2;\\r\\n let createCanvas = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function (width, height) {\\r\\n const canvas = document.createElement(\\\"canvas\\\");\\r\\n canvas.width = width * appState.exportScale;\\r\\n canvas.height = height * appState.exportScale;\\r\\n return {\\r\\n canvas,\\r\\n scale: appState.exportScale\\r\\n };\\r\\n };\\r\\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\\r\\n const { canvas, scale = 1 } = createCanvas(width, height);\\r\\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_6__.getDefaultAppState)();\\r\\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_8__.updateImageCache)({\\r\\n imageCache: new Map(),\\r\\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_8__.getInitializedImageElements)(elements).map(function (element) {\\r\\n return element.fileId;\\r\\n }),\\r\\n files\\r\\n });\\r\\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_3__.renderScene)(elements, appState, null, scale, roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"].canvas(canvas), canvas, {\\r\\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\\r\\n scrollX: -minX + exportPadding,\\r\\n scrollY: -minY + exportPadding,\\r\\n zoom: defaultAppState.zoom,\\r\\n remotePointerViewportCoords: {},\\r\\n remoteSelectedElementIds: {},\\r\\n shouldCacheIgnoreZoom: false,\\r\\n remotePointerUsernames: {},\\r\\n remotePointerUserStates: {},\\r\\n theme: appState.exportWithDarkMode ? \\\"dark\\\" : \\\"light\\\",\\r\\n imageCache,\\r\\n renderScrollbars: false,\\r\\n renderSelection: false,\\r\\n renderGrid: false,\\r\\n isExporting: true\\r\\n });\\r\\n return canvas;\\r\\n });\\r\\n return function exportToCanvas(_x, _x2, _x3, _x4) {\\r\\n return _ref.apply(this, arguments);\\r\\n };\\r\\n}();\\r\\nconst exportToSvg = /*#__PURE__*/ function () {\\r\\n var _ref3 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (elements, appState, files) {\\r\\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene } = appState;\\r\\n let metadata = \\\"\\\";\\r\\n if (exportEmbedScene) {\\r\\n try {\\r\\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \\\"../../data/image.ts\\\"))).encodeSvgMetadata({\\r\\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_7__.serializeAsJSON)(elements, appState, files || {}, \\\"local\\\")\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n }\\r\\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding); // initialize SVG root\\r\\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_5__.SVG_NS, \\\"svg\\\");\\r\\n svgRoot.setAttribute(\\\"version\\\", \\\"1.1\\\");\\r\\n svgRoot.setAttribute(\\\"xmlns\\\", _constants__WEBPACK_IMPORTED_MODULE_5__.SVG_NS);\\r\\n svgRoot.setAttribute(\\\"viewBox\\\", `0 0 ${width} ${height}`);\\r\\n svgRoot.setAttribute(\\\"width\\\", `${width * exportScale}`);\\r\\n svgRoot.setAttribute(\\\"height\\\", `${height * exportScale}`);\\r\\n if (appState.exportWithDarkMode) {\\r\\n svgRoot.setAttribute(\\\"filter\\\", _constants__WEBPACK_IMPORTED_MODULE_5__.THEME_FILTER);\\r\\n }\\r\\n let assetPath = \\\"https://excalidraw.com/\\\"; // Asset path needs to be determined only when using package\\r\\n if (true) {\\r\\n assetPath = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\\\"@zsviczian/excalidraw\\\"}@${\\\"0.12.0-obsidian-1\\\"}`;\\r\\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\\\"/\\\")) {\\r\\n assetPath = assetPath.replace(\\\"/\\\", `${window.location.origin}/`);\\r\\n }\\r\\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\\r\\n }\\r\\n svgRoot.innerHTML = `\\n ${SVG_EXPORT_TAG}\\n ${metadata}\\n <defs>\\n <style>\\n @font-face {\\n font-family: \\\"Virgil\\\";\\n src: url(\\\"${assetPath}Virgil.woff2\\\");\\n }\\n @font-face {\\n font-family: \\\"Cascadia\\\";\\n src: url(\\\"${assetPath}Cascadia.woff2\\\");\\n }\\n </style>\\n </defs>\\n `; // render background rect\\r\\n if (appState.exportBackground && viewBackgroundColor) {\\r\\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_5__.SVG_NS, \\\"rect\\\");\\r\\n rect.setAttribute(\\\"x\\\", \\\"0\\\");\\r\\n rect.setAttribute(\\\"y\\\", \\\"0\\\");\\r\\n rect.setAttribute(\\\"width\\\", `${width}`);\\r\\n rect.setAttribute(\\\"height\\\", `${height}`);\\r\\n rect.setAttribute(\\\"fill\\\", viewBackgroundColor);\\r\\n svgRoot.appendChild(rect);\\r\\n }\\r\\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"].svg(svgRoot);\\r\\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_3__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\\r\\n offsetX: -minX + exportPadding,\\r\\n offsetY: -minY + exportPadding,\\r\\n exportWithDarkMode: appState.exportWithDarkMode\\r\\n });\\r\\n return svgRoot;\\r\\n });\\r\\n return function exportToSvg(_x5, _x6, _x7) {\\r\\n return _ref3.apply(this, arguments);\\r\\n };\\r\\n}(); // calculate smallest area to fit the contents in\\r\\nconst getCanvasSize = function (elements, exportPadding) {\\r\\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_2__.getCommonBounds)(elements);\\r\\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.distance)(minX, maxX) + exportPadding * 2;\\r\\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.distance)(minY, maxY) + exportPadding + exportPadding;\\r\\n return [minX, minY, width, height];\\r\\n};\\r\\nconst getExportSize = function (elements, exportPadding, scale) {\\r\\n const [, , width, height] = getCanvasSize(elements, exportPadding).map(function (dimension) {\\r\\n return Math.trunc(dimension * scale);\\r\\n });\\r\\n return [width, height];\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEVBQUUsSUFBSSxDQUFDLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztJQUN2RCxNQUFNLE1BQU0sR0FBRyxnREFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUM7QUFFSyxNQUFNLGFBQWEsR0FBRyxVQUFVLFFBQVEsRUFBRSxhQUFhLEVBQUUsS0FBSztJQUNuRSxNQUFNLENBQUMsRUFBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLFNBQVM7UUFDdkYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz8yNTM4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9FWFBPUlRfUEFERElORywgU1ZHX05TLCBUSEVNRV9GSUxURVIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7IHNlcmlhbGl6ZUFzSlNPTiB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCB7IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cywgdXBkYXRlSW1hZ2VDYWNoZSB9IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5leHBvcnQgY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDtcbmV4cG9ydCBjb25zdCBleHBvcnRUb0NhbnZhcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzLCBfcmVmMikge1xuICAgIGxldCB7XG4gICAgICBleHBvcnRCYWNrZ3JvdW5kLFxuICAgICAgZXhwb3J0UGFkZGluZyA9IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsXG4gICAgICB2aWV3QmFja2dyb3VuZENvbG9yXG4gICAgfSA9IF9yZWYyO1xuICAgIGxldCBjcmVhdGVDYW52YXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgY2FudmFzLndpZHRoID0gd2lkdGggKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhbnZhcyxcbiAgICAgICAgc2NhbGU6IGFwcFN0YXRlLmV4cG9ydFNjYWxlXG4gICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7XG4gICAgY29uc3Qge1xuICAgICAgY2FudmFzLFxuICAgICAgc2NhbGUgPSAxXG4gICAgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcbiAgICBjb25zdCB7XG4gICAgICBpbWFnZUNhY2hlXG4gICAgfSA9IHlpZWxkIHVwZGF0ZUltYWdlQ2FjaGUoe1xuICAgICAgaW1hZ2VDYWNoZTogbmV3IE1hcCgpLFxuICAgICAgZmlsZUlkczogZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKGVsZW1lbnRzKS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZmlsZUlkO1xuICAgICAgfSksXG4gICAgICBmaWxlc1xuICAgIH0pO1xuICAgIHJlbmRlclNjZW5lKGVsZW1lbnRzLCBhcHBTdGF0ZSwgbnVsbCwgc2NhbGUsIHJvdWdoLmNhbnZhcyhjYW52YXMpLCBjYW52YXMsIHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczoge30sXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogZmFsc2UsXG4gICAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydGluZzogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBjYW52YXM7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiBleHBvcnRUb0NhbnZhcyhfeCwgX3gyLCBfeDMsIF94NCkge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjMgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgZmlsZXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBleHBvcnRTY2FsZSA9IDEsXG4gICAgICBleHBvcnRFbWJlZFNjZW5lXG4gICAgfSA9IGFwcFN0YXRlO1xuICAgIGxldCBtZXRhZGF0YSA9IFwiXCI7XG5cbiAgICBpZiAoZXhwb3J0RW1iZWRTY2VuZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWV0YWRhdGEgPSB5aWVsZCAoeWllbGQgaW1wb3J0KFxuICAgICAgICAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImltYWdlXCIgKi9cbiAgICAgICAgXCIuLi8uLi9zcmMvZGF0YS9pbWFnZVwiKSkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICAgIHRleHQ6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7IC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcblxuICAgIGNvbnN0IHN2Z1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ4bWxuc1wiLCBTVkdfTlMpO1xuICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHQgKiBleHBvcnRTY2FsZX1gKTtcblxuICAgIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiZmlsdGVyXCIsIFRIRU1FX0ZJTFRFUik7XG4gICAgfVxuXG4gICAgbGV0IGFzc2V0UGF0aCA9IFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9cIjsgLy8gQXNzZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIG9ubHkgd2hlbiB1c2luZyBwYWNrYWdlXG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuSVNfRVhDQUxJRFJBV19OUE1fUEFDS0FHRSkge1xuICAgICAgYXNzZXRQYXRoID0gd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fCBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5QS0dfVkVSU0lPTn1gO1xuXG4gICAgICBpZiAoYXNzZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgICB9XG5cbiAgICAgIGFzc2V0UGF0aCA9IGAke2Fzc2V0UGF0aH0vZGlzdC9leGNhbGlkcmF3LWFzc2V0cy9gO1xuICAgIH1cblxuICAgIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGU+XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiVmlyZ2lsXCI7XG4gICAgICAgIHNyYzogdXJsKFwiJHthc3NldFBhdGh9VmlyZ2lsLndvZmYyXCIpO1xuICAgICAgfVxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIkNhc2NhZGlhXCI7XG4gICAgICAgIHNyYzogdXJsKFwiJHthc3NldFBhdGh9Q2FzY2FkaWEud29mZjJcIik7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC9kZWZzPlxuICBgOyAvLyByZW5kZXIgYmFja2dyb3VuZCByZWN0XG5cbiAgICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgICBjb25zdCByZWN0ID0gc3ZnUm9vdC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwicmVjdFwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcInlcIiwgXCIwXCIpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1gKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB2aWV3QmFja2dyb3VuZENvbG9yKTtcbiAgICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQocmVjdCk7XG4gICAgfVxuXG4gICAgY29uc3QgcnN2ZyA9IHJvdWdoLnN2ZyhzdmdSb290KTtcbiAgICByZW5kZXJTY2VuZVRvU3ZnKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcyB8fCB7fSwge1xuICAgICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgICAgb2Zmc2V0WTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgICAgZXhwb3J0V2l0aERhcmtNb2RlOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGVcbiAgICB9KTtcbiAgICByZXR1cm4gc3ZnUm9vdDtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGV4cG9ydFRvU3ZnKF94NSwgX3g2LCBfeDcpIHtcbiAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTsgLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuXG5jb25zdCBnZXRDYW52YXNTaXplID0gZnVuY3Rpb24gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKSB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICsgZXhwb3J0UGFkZGluZztcbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFeHBvcnRTaXplID0gZnVuY3Rpb24gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nLCBzY2FsZSkge1xuICBjb25zdCBbLCwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoZnVuY3Rpb24gKGRpbWVuc2lvbikge1xuICAgIHJldHVybiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKTtcbiAgfSk7XG4gIHJldHVybiBbd2lkdGgsIGhlaWdodF07XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../scene/export.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../scene/export.ts?");
|
|
3086
3086
|
|
|
3087
3087
|
/***/ }),
|
|
3088
3088
|
|
|
@@ -3170,7 +3170,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
|
|
|
3170
3170
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3171
3171
|
|
|
3172
3172
|
"use strict";
|
|
3173
|
-
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"allowFullScreen\\\": () => (/* binding */ allowFullScreen),\\n/* harmony export */ \\\"arrayToMap\\\": () => (/* binding */ arrayToMap),\\n/* harmony export */ \\\"bytesToHexString\\\": () => (/* binding */ bytesToHexString),\\n/* harmony export */ \\\"capitalizeString\\\": () => (/* binding */ capitalizeString),\\n/* harmony export */ \\\"chunk\\\": () => (/* binding */ chunk),\\n/* harmony export */ \\\"debounce\\\": () => (/* binding */ debounce),\\n/* harmony export */ \\\"distance\\\": () => (/* binding */ distance),\\n/* harmony export */ \\\"exitFullScreen\\\": () => (/* binding */ exitFullScreen),\\n/* harmony export */ \\\"findIndex\\\": () => (/* binding */ findIndex),\\n/* harmony export */ \\\"findLastIndex\\\": () => (/* binding */ findLastIndex),\\n/* harmony export */ \\\"focusNearestParent\\\": () => (/* binding */ focusNearestParent),\\n/* harmony export */ \\\"getDateTime\\\": () => (/* binding */ getDateTime),\\n/* harmony export */ \\\"getFontFamilyString\\\": () => (/* binding */ getFontFamilyString),\\n/* harmony export */ \\\"getFontString\\\": () => (/* binding */ getFontString),\\n/* harmony export */ \\\"getFrame\\\": () => (/* binding */ getFrame),\\n/* harmony export */ \\\"getGlobalCSSVariable\\\": () => (/* binding */ getGlobalCSSVariable),\\n/* harmony export */ \\\"getNearestScrollableContainer\\\": () => (/* binding */ getNearestScrollableContainer),\\n/* harmony export */ \\\"getShortcutKey\\\": () => (/* binding */ getShortcutKey),\\n/* harmony export */ \\\"getUpdatedTimestamp\\\": () => (/* binding */ getUpdatedTimestamp),\\n/* harmony export */ \\\"getVersion\\\": () => (/* binding */ getVersion),\\n/* harmony export */ \\\"isFullScreen\\\": () => (/* binding */ isFullScreen),\\n/* harmony export */ \\\"isInputLike\\\": () => (/* binding */ isInputLike),\\n/* harmony export */ \\\"isPrimitive\\\": () => (/* binding */ isPrimitive),\\n/* harmony export */ \\\"isProdEnv\\\": () => (/* binding */ isProdEnv),\\n/* harmony export */ \\\"isPromiseLike\\\": () => (/* binding */ isPromiseLike),\\n/* harmony export */ \\\"isRTL\\\": () => (/* binding */ isRTL),\\n/* harmony export */ \\\"isTestEnv\\\": () => (/* binding */ isTestEnv),\\n/* harmony export */ \\\"isToolIcon\\\": () => (/* binding */ isToolIcon),\\n/* harmony export */ \\\"isTransparent\\\": () => (/* binding */ isTransparent),\\n/* harmony export */ \\\"isWritableElement\\\": () => (/* binding */ isWritableElement),\\n/* harmony export */ \\\"muteFSAbortError\\\": () => (/* binding */ muteFSAbortError),\\n/* harmony export */ \\\"nFormatter\\\": () => (/* binding */ nFormatter),\\n/* harmony export */ \\\"preventUnload\\\": () => (/* binding */ preventUnload),\\n/* harmony export */ \\\"queryFocusableElements\\\": () => (/* binding */ queryFocusableElements),\\n/* harmony export */ \\\"removeSelection\\\": () => (/* binding */ removeSelection),\\n/* harmony export */ \\\"resetCursor\\\": () => (/* binding */ resetCursor),\\n/* harmony export */ \\\"resolvablePromise\\\": () => (/* binding */ resolvablePromise),\\n/* harmony export */ \\\"sceneCoordsToViewportCoords\\\": () => (/* binding */ sceneCoordsToViewportCoords),\\n/* harmony export */ \\\"selectNode\\\": () => (/* binding */ selectNode),\\n/* harmony export */ \\\"setCursor\\\": () => (/* binding */ setCursor),\\n/* harmony export */ \\\"setCursorForShape\\\": () => (/* binding */ setCursorForShape),\\n/* harmony export */ \\\"setDateTimeForTests\\\": () => (/* binding */ setDateTimeForTests),\\n/* harmony export */ \\\"setEraserCursor\\\": () => (/* binding */ setEraserCursor),\\n/* harmony export */ \\\"supportsEmoji\\\": () => (/* binding */ supportsEmoji),\\n/* harmony export */ \\\"throttleRAF\\\": () => (/* binding */ throttleRAF),\\n/* harmony export */ \\\"tupleToCoors\\\": () => (/* binding */ tupleToCoors),\\n/* harmony export */ \\\"updateActiveTool\\\": () => (/* binding */ updateActiveTool),\\n/* harmony export */ \\\"updateObject\\\": () => (/* binding */ updateObject),\\n/* harmony export */ \\\"viewportCoordsToSceneCoords\\\": () => (/* binding */ viewportCoordsToSceneCoords),\\n/* harmony export */ \\\"withBatchedUpdates\\\": () => (/* binding */ withBatchedUpdates),\\n/* harmony export */ \\\"withBatchedUpdatesThrottled\\\": () => (/* binding */ withBatchedUpdatesThrottled),\\n/* harmony export */ \\\"wrapEvent\\\": () => (/* binding */ wrapEvent)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\\\");\\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! open-color */ \\\"../../../node_modules/open-color/open-color.json\\\");\\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./colors */ \\\"../../colors.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \\\"react-dom\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./keys */ \\\"../../keys.ts\\\");\\n\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nlet mockDateTime = null;\\r\\nconst setDateTimeForTests = function (dateTime) {\\r\\n mockDateTime = dateTime;\\r\\n};\\r\\nconst getDateTime = function () {\\r\\n if (mockDateTime) {\\r\\n return mockDateTime;\\r\\n }\\r\\n const date = new Date();\\r\\n const year = date.getFullYear();\\r\\n const month = `${date.getMonth() + 1}`.padStart(2, \\\"0\\\");\\r\\n const day = `${date.getDate()}`.padStart(2, \\\"0\\\");\\r\\n const hr = `${date.getHours()}`.padStart(2, \\\"0\\\");\\r\\n const min = `${date.getMinutes()}`.padStart(2, \\\"0\\\");\\r\\n return `${year}-${month}-${day}-${hr}${min}`;\\r\\n};\\r\\nconst capitalizeString = function (str) {\\r\\n return str.charAt(0).toUpperCase() + str.slice(1);\\r\\n};\\r\\nconst isToolIcon = function (target) {\\r\\n return target instanceof HTMLElement && target.className.includes(\\\"ToolIcon\\\");\\r\\n};\\r\\nconst isInputLike = function (target) {\\r\\n return target instanceof HTMLElement && target.dataset.type === \\\"wysiwyg\\\" || target instanceof HTMLBRElement || // newline in wysiwyg\\r\\n target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement;\\r\\n};\\r\\nconst isWritableElement = function (target) {\\r\\n return target instanceof HTMLElement && target.dataset.type === \\\"wysiwyg\\\" || target instanceof HTMLBRElement || // newline in wysiwyg\\r\\n target instanceof HTMLTextAreaElement || target instanceof HTMLInputElement && (target.type === \\\"text\\\" || target.type === \\\"number\\\");\\r\\n};\\r\\nconst getFontFamilyString = function (_ref) {\\r\\n let { fontFamily } = _ref;\\r\\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY)) {\\r\\n if (id === fontFamily) {\\r\\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_3__.WINDOWS_EMOJI_FALLBACK_FONT}`;\\r\\n }\\r\\n }\\r\\n return _constants__WEBPACK_IMPORTED_MODULE_3__.WINDOWS_EMOJI_FALLBACK_FONT;\\r\\n};\\r\\n/** returns fontSize+fontFamily string for assignment to DOM elements */\\r\\nconst getFontString = function (_ref2) {\\r\\n let { fontSize, fontFamily } = _ref2;\\r\\n return `${fontSize}px ${getFontFamilyString({\\r\\n fontFamily\\r\\n })}`;\\r\\n};\\r\\nconst debounce = function (fn, timeout) {\\r\\n let handle = 0;\\r\\n let lastArgs = null;\\r\\n const ret = function () {\\r\\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\\r\\n args[_key] = arguments[_key];\\r\\n }\\r\\n lastArgs = args;\\r\\n clearTimeout(handle);\\r\\n handle = window.setTimeout(function () {\\r\\n lastArgs = null;\\r\\n fn(...args);\\r\\n }, timeout);\\r\\n };\\r\\n ret.flush = function () {\\r\\n clearTimeout(handle);\\r\\n if (lastArgs) {\\r\\n const _lastArgs = lastArgs;\\r\\n lastArgs = null;\\r\\n fn(..._lastArgs);\\r\\n }\\r\\n };\\r\\n ret.cancel = function () {\\r\\n lastArgs = null;\\r\\n clearTimeout(handle);\\r\\n };\\r\\n return ret;\\r\\n}; // throttle callback to execute once per animation frame\\r\\nconst throttleRAF = function (fn, opts) {\\r\\n let timerId = null;\\r\\n let lastArgs = null;\\r\\n let lastArgsTrailing = null;\\r\\n const scheduleFunc = function (args) {\\r\\n timerId = window.requestAnimationFrame(function () {\\r\\n timerId = null;\\r\\n fn(...args);\\r\\n lastArgs = null;\\r\\n if (lastArgsTrailing) {\\r\\n lastArgs = lastArgsTrailing;\\r\\n lastArgsTrailing = null;\\r\\n scheduleFunc(lastArgs);\\r\\n }\\r\\n });\\r\\n };\\r\\n const ret = function () {\\r\\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\\r\\n args[_key2] = arguments[_key2];\\r\\n }\\r\\n if (false) {}\\r\\n lastArgs = args;\\r\\n if (timerId === null) {\\r\\n scheduleFunc(lastArgs);\\r\\n }\\r\\n else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\\r\\n lastArgsTrailing = args;\\r\\n }\\r\\n };\\r\\n ret.flush = function () {\\r\\n if (timerId !== null) {\\r\\n cancelAnimationFrame(timerId);\\r\\n timerId = null;\\r\\n }\\r\\n if (lastArgs) {\\r\\n fn(...(lastArgsTrailing || lastArgs));\\r\\n lastArgs = lastArgsTrailing = null;\\r\\n }\\r\\n };\\r\\n ret.cancel = function () {\\r\\n lastArgs = lastArgsTrailing = null;\\r\\n if (timerId !== null) {\\r\\n cancelAnimationFrame(timerId);\\r\\n timerId = null;\\r\\n }\\r\\n };\\r\\n return ret;\\r\\n}; // https://github.com/lodash/lodash/blob/es/chunk.js\\r\\nconst chunk = function (array, size) {\\r\\n if (!array.length || size < 1) {\\r\\n return [];\\r\\n }\\r\\n let index = 0;\\r\\n let resIndex = 0;\\r\\n const result = Array(Math.ceil(array.length / size));\\r\\n while (index < array.length) {\\r\\n result[resIndex++] = array.slice(index, index += size);\\r\\n }\\r\\n return result;\\r\\n};\\r\\nconst selectNode = function (node) {\\r\\n const selection = window.getSelection();\\r\\n if (selection) {\\r\\n const range = document.createRange();\\r\\n range.selectNodeContents(node);\\r\\n selection.removeAllRanges();\\r\\n selection.addRange(range);\\r\\n }\\r\\n};\\r\\nconst removeSelection = function () {\\r\\n const selection = window.getSelection();\\r\\n if (selection) {\\r\\n selection.removeAllRanges();\\r\\n }\\r\\n};\\r\\nconst distance = function (x, y) {\\r\\n return Math.abs(x - y);\\r\\n};\\r\\nconst updateActiveTool = function (appState, data) {\\r\\n if (data.type === \\\"custom\\\") {\\r\\n return _objectSpread(_objectSpread({}, appState.activeTool), {}, {\\r\\n type: \\\"custom\\\",\\r\\n customType: data.customType\\r\\n });\\r\\n }\\r\\n return _objectSpread(_objectSpread({}, appState.activeTool), {}, {\\r\\n lastActiveToolBeforeEraser: data.lastActiveToolBeforeEraser === undefined ? appState.activeTool.lastActiveToolBeforeEraser : data.lastActiveToolBeforeEraser,\\r\\n type: data.type,\\r\\n customType: null\\r\\n });\\r\\n};\\r\\nconst resetCursor = function (canvas) {\\r\\n if (canvas) {\\r\\n canvas.style.cursor = \\\"\\\";\\r\\n }\\r\\n};\\r\\nconst setCursor = function (canvas, cursor) {\\r\\n if (canvas) {\\r\\n canvas.style.cursor = cursor;\\r\\n }\\r\\n};\\r\\nlet eraserCanvasCache;\\r\\nlet previewDataURL;\\r\\nconst setEraserCursor = function (canvas, theme) {\\r\\n const cursorImageSizePx = 20;\\r\\n const drawCanvas = function () {\\r\\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_3__.THEME.DARK;\\r\\n eraserCanvasCache = document.createElement(\\\"canvas\\\");\\r\\n eraserCanvasCache.theme = theme;\\r\\n eraserCanvasCache.height = cursorImageSizePx;\\r\\n eraserCanvasCache.width = cursorImageSizePx;\\r\\n const context = eraserCanvasCache.getContext(\\\"2d\\\");\\r\\n context.lineWidth = 1;\\r\\n context.beginPath();\\r\\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\\r\\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_1__.black : open_color__WEBPACK_IMPORTED_MODULE_1__.white;\\r\\n context.fill();\\r\\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_1__.white : open_color__WEBPACK_IMPORTED_MODULE_1__.black;\\r\\n context.stroke();\\r\\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_3__.MIME_TYPES.svg);\\r\\n };\\r\\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\\r\\n drawCanvas();\\r\\n }\\r\\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\\r\\n};\\r\\nconst setCursorForShape = function (canvas, appState) {\\r\\n if (!canvas) {\\r\\n return;\\r\\n }\\r\\n if (appState.activeTool.type === \\\"selection\\\") {\\r\\n resetCursor(canvas);\\r\\n }\\r\\n else if (appState.activeTool.type === \\\"eraser\\\") {\\r\\n setEraserCursor(canvas, appState.theme); // do nothing if image tool is selected which suggests there's\\r\\n // a image-preview set as the cursor\\r\\n // Ignore custom type as well and let host decide\\r\\n }\\r\\n else if (![\\\"image\\\", \\\"custom\\\"].includes(appState.activeTool.type)) {\\r\\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_3__.CURSOR_TYPE.CROSSHAIR;\\r\\n }\\r\\n};\\r\\nconst isFullScreen = function () {\\r\\n var _a;\\r\\n return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \\\"HTML\\\";\\r\\n};\\r\\nconst allowFullScreen = function () {\\r\\n return document.documentElement.requestFullscreen();\\r\\n};\\r\\nconst exitFullScreen = function () {\\r\\n return document.exitFullscreen();\\r\\n};\\r\\nconst getShortcutKey = function (shortcut) {\\r\\n shortcut = shortcut.replace(/\\\\bAlt\\\\b/i, \\\"Alt\\\").replace(/\\\\bShift\\\\b/i, \\\"Shift\\\").replace(/\\\\b(Enter|Return)\\\\b/i, \\\"Enter\\\").replace(/\\\\bDel\\\\b/i, \\\"Delete\\\");\\r\\n if (_keys__WEBPACK_IMPORTED_MODULE_5__.isDarwin) {\\r\\n return shortcut.replace(/\\\\bCtrlOrCmd\\\\b/i, \\\"Cmd\\\").replace(/\\\\bAlt\\\\b/i, \\\"Option\\\");\\r\\n }\\r\\n return shortcut.replace(/\\\\bCtrlOrCmd\\\\b/i, \\\"Ctrl\\\");\\r\\n};\\r\\nconst viewportCoordsToSceneCoords = function (_ref3, _ref4) {\\r\\n let { clientX, clientY } = _ref3;\\r\\n let { zoom, offsetLeft, offsetTop, scrollX, scrollY } = _ref4;\\r\\n const invScale = 1 / zoom.value;\\r\\n const x = (clientX - offsetLeft) * invScale - scrollX;\\r\\n const y = (clientY - offsetTop) * invScale - scrollY;\\r\\n return {\\r\\n x,\\r\\n y\\r\\n };\\r\\n};\\r\\nconst sceneCoordsToViewportCoords = function (_ref5, _ref6) {\\r\\n let { sceneX, sceneY } = _ref5;\\r\\n let { zoom, offsetLeft, offsetTop, scrollX, scrollY } = _ref6;\\r\\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\\r\\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\\r\\n return {\\r\\n x,\\r\\n y\\r\\n };\\r\\n};\\r\\nconst getGlobalCSSVariable = function (name) {\\r\\n return getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\\r\\n};\\r\\nconst RS_LTR_CHARS = \\\"A-Za-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02B8\\\\u0300-\\\\u0590\\\\u0800-\\\\u1FFF\\\" + \\\"\\\\u2C00-\\\\uFB1C\\\\uFDFE-\\\\uFE6F\\\\uFEFD-\\\\uFFFF\\\";\\r\\nconst RS_RTL_CHARS = \\\"\\\\u0591-\\\\u07FF\\\\uFB1D-\\\\uFDFD\\\\uFE70-\\\\uFEFC\\\";\\r\\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\\r\\n/**\\r\\n * Checks whether first directional character is RTL. Meaning whether it starts\\r\\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\\r\\n * RTL.\\r\\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\\r\\n */\\r\\nconst isRTL = function (text) {\\r\\n return RE_RTL_CHECK.test(text);\\r\\n};\\r\\nconst tupleToCoors = function (xyTuple) {\\r\\n const [x, y] = xyTuple;\\r\\n return {\\r\\n x,\\r\\n y\\r\\n };\\r\\n};\\r\\n/** use as a rejectionHandler to mute filesystem Abort errors */\\r\\nconst muteFSAbortError = function (error) {\\r\\n if ((error === null || error === void 0 ? void 0 : error.name) === \\\"AbortError\\\") {\\r\\n console.warn(error);\\r\\n return;\\r\\n }\\r\\n throw error;\\r\\n};\\r\\nconst findIndex = function (array, cb) {\\r\\n let fromIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\\r\\n if (fromIndex < 0) {\\r\\n fromIndex = array.length + fromIndex;\\r\\n }\\r\\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\\r\\n let index = fromIndex - 1;\\r\\n while (++index < array.length) {\\r\\n if (cb(array[index], index, array)) {\\r\\n return index;\\r\\n }\\r\\n }\\r\\n return -1;\\r\\n};\\r\\nconst findLastIndex = function (array, cb) {\\r\\n let fromIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : array.length - 1;\\r\\n if (fromIndex < 0) {\\r\\n fromIndex = array.length + fromIndex;\\r\\n }\\r\\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\\r\\n let index = fromIndex + 1;\\r\\n while (--index > -1) {\\r\\n if (cb(array[index], index, array)) {\\r\\n return index;\\r\\n }\\r\\n }\\r\\n return -1;\\r\\n};\\r\\nconst isTransparent = function (color) {\\r\\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \\\"0\\\";\\r\\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \\\"00\\\";\\r\\n return isRGBTransparent || isRRGGBBTransparent || color === _colors__WEBPACK_IMPORTED_MODULE_2__[\\\"default\\\"].elementBackground[0];\\r\\n};\\r\\nconst resolvablePromise = function () {\\r\\n let resolve;\\r\\n let reject;\\r\\n const promise = new Promise(function (_resolve, _reject) {\\r\\n resolve = _resolve;\\r\\n reject = _reject;\\r\\n });\\r\\n promise.resolve = resolve;\\r\\n promise.reject = reject;\\r\\n return promise;\\r\\n};\\r\\n/**\\r\\n * @param func handler taking at most single parameter (event).\\r\\n */\\r\\nconst withBatchedUpdates = function (func) {\\r\\n return function (event) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_4__.unstable_batchedUpdates)(func, event);\\r\\n };\\r\\n};\\r\\n/**\\r\\n * barches React state updates and throttles the calls to a single call per\\r\\n * animation frame\\r\\n */\\r\\nconst withBatchedUpdatesThrottled = function (func) {\\r\\n // @ts-ignore\\r\\n return throttleRAF(function (event) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_4__.unstable_batchedUpdates)(func, event);\\r\\n });\\r\\n}; //https://stackoverflow.com/a/9462382/8418\\r\\nconst nFormatter = function (num, digits) {\\r\\n const si = [{\\r\\n value: 1,\\r\\n symbol: \\\"b\\\"\\r\\n }, {\\r\\n value: 1e3,\\r\\n symbol: \\\"k\\\"\\r\\n }, {\\r\\n value: 1e6,\\r\\n symbol: \\\"M\\\"\\r\\n }, {\\r\\n value: 1e9,\\r\\n symbol: \\\"G\\\"\\r\\n }];\\r\\n const rx = /\\\\.0+$|(\\\\.[0-9]*[1-9])0+$/;\\r\\n let index;\\r\\n for (index = si.length - 1; index > 0; index--) {\\r\\n if (num >= si[index].value) {\\r\\n break;\\r\\n }\\r\\n }\\r\\n return (num / si[index].value).toFixed(digits).replace(rx, \\\"$1\\\") + si[index].symbol;\\r\\n};\\r\\nconst getVersion = function () {\\r\\n var _a;\\r\\n return ((_a = document.querySelector('meta[name=\\\"version\\\"]')) === null || _a === void 0 ? void 0 : _a.content) || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_VERSION;\\r\\n}; // Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\\r\\nconst supportsEmoji = function () {\\r\\n const canvas = document.createElement(\\\"canvas\\\");\\r\\n const ctx = canvas.getContext(\\\"2d\\\");\\r\\n if (!ctx) {\\r\\n return false;\\r\\n }\\r\\n const offset = 12;\\r\\n ctx.fillStyle = \\\"#f00\\\";\\r\\n ctx.textBaseline = \\\"top\\\";\\r\\n ctx.font = \\\"32px Arial\\\"; // Modernizr used 🐨, but it is sort of supported on Windows 7.\\r\\n // Luckily 😀 isn't supported.\\r\\n ctx.fillText(\\\"😀\\\", 0, 0);\\r\\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\\r\\n};\\r\\nconst getNearestScrollableContainer = function (element) {\\r\\n let parent = element.parentElement;\\r\\n while (parent) {\\r\\n if (parent === document.body) {\\r\\n return document;\\r\\n }\\r\\n const { overflowY } = window.getComputedStyle(parent);\\r\\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\\r\\n if (hasScrollableContent && (overflowY === \\\"auto\\\" || overflowY === \\\"scroll\\\" || overflowY === \\\"overlay\\\")) {\\r\\n return parent;\\r\\n }\\r\\n parent = parent.parentElement;\\r\\n }\\r\\n return document;\\r\\n};\\r\\nconst focusNearestParent = function (element) {\\r\\n let parent = element.parentElement;\\r\\n while (parent) {\\r\\n if (parent.tabIndex > -1) {\\r\\n parent.focus();\\r\\n return;\\r\\n }\\r\\n parent = parent.parentElement;\\r\\n }\\r\\n};\\r\\nconst preventUnload = function (event) {\\r\\n event.preventDefault(); // NOTE: modern browsers no longer allow showing a custom message here\\r\\n event.returnValue = \\\"\\\";\\r\\n};\\r\\nconst bytesToHexString = function (bytes) {\\r\\n return Array.from(bytes).map(function (byte) {\\r\\n return `0${byte.toString(16)}`.slice(-2);\\r\\n }).join(\\\"\\\");\\r\\n};\\r\\nconst getUpdatedTimestamp = function () {\\r\\n return isTestEnv() ? 1 : Date.now();\\r\\n};\\r\\n/**\\r\\n * Transforms array of objects containing `id` attribute,\\r\\n * or array of ids (strings), into a Map, keyd by `id`.\\r\\n */\\r\\nconst arrayToMap = function (items) {\\r\\n return items.reduce(function (acc, element) {\\r\\n acc.set(typeof element === \\\"string\\\" ? element : element.id, element);\\r\\n return acc;\\r\\n }, new Map());\\r\\n};\\r\\nconst isTestEnv = function () {\\r\\n var _a;\\r\\n return typeof process !== \\\"undefined\\\" && ((_a = ({\\\"REACT_APP_BACKEND_V2_GET_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/\\\",\\\"REACT_APP_BACKEND_V2_POST_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/post/\\\",\\\"REACT_APP_LIBRARY_URL\\\":\\\"https://libraries.excalidraw.com\\\",\\\"REACT_APP_LIBRARY_BACKEND\\\":\\\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\\\",\\\"REACT_APP_WS_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_PORTAL_URL\\\":\\\"\\\",\\\"REACT_APP_FIREBASE_CONFIG\\\":\\\"{\\\\\\\"apiKey\\\\\\\":\\\\\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\\\\\",\\\\\\\"authDomain\\\\\\\":\\\\\\\"excalidraw-oss-dev.firebaseapp.com\\\\\\\",\\\\\\\"projectId\\\\\\\":\\\\\\\"excalidraw-oss-dev\\\\\\\",\\\\\\\"storageBucket\\\\\\\":\\\\\\\"excalidraw-oss-dev.appspot.com\\\\\\\",\\\\\\\"messagingSenderId\\\\\\\":\\\\\\\"664559512677\\\\\\\",\\\\\\\"appId\\\\\\\":\\\\\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\\\\\"}\\\",\\\"REACT_APP_DEV_ENABLE_SW\\\":\\\"\\\",\\\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\\\":\\\"\\\",\\\"PKG_NAME\\\":\\\"@zsviczian/excalidraw\\\",\\\"PKG_VERSION\\\":\\\"0.12.0-obsidian-0\\\",\\\"IS_EXCALIDRAW_NPM_PACKAGE\\\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \\\"test\\\";\\r\\n};\\r\\nconst isProdEnv = function () {\\r\\n var _a;\\r\\n return typeof process !== \\\"undefined\\\" && ((_a = ({\\\"REACT_APP_BACKEND_V2_GET_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/\\\",\\\"REACT_APP_BACKEND_V2_POST_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/post/\\\",\\\"REACT_APP_LIBRARY_URL\\\":\\\"https://libraries.excalidraw.com\\\",\\\"REACT_APP_LIBRARY_BACKEND\\\":\\\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\\\",\\\"REACT_APP_WS_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_PORTAL_URL\\\":\\\"\\\",\\\"REACT_APP_FIREBASE_CONFIG\\\":\\\"{\\\\\\\"apiKey\\\\\\\":\\\\\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\\\\\",\\\\\\\"authDomain\\\\\\\":\\\\\\\"excalidraw-oss-dev.firebaseapp.com\\\\\\\",\\\\\\\"projectId\\\\\\\":\\\\\\\"excalidraw-oss-dev\\\\\\\",\\\\\\\"storageBucket\\\\\\\":\\\\\\\"excalidraw-oss-dev.appspot.com\\\\\\\",\\\\\\\"messagingSenderId\\\\\\\":\\\\\\\"664559512677\\\\\\\",\\\\\\\"appId\\\\\\\":\\\\\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\\\\\"}\\\",\\\"REACT_APP_DEV_ENABLE_SW\\\":\\\"\\\",\\\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\\\":\\\"\\\",\\\"PKG_NAME\\\":\\\"@zsviczian/excalidraw\\\",\\\"PKG_VERSION\\\":\\\"0.12.0-obsidian-0\\\",\\\"IS_EXCALIDRAW_NPM_PACKAGE\\\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \\\"production\\\";\\r\\n};\\r\\nconst wrapEvent = function (name, nativeEvent) {\\r\\n return new CustomEvent(name, {\\r\\n detail: {\\r\\n nativeEvent\\r\\n },\\r\\n cancelable: true\\r\\n });\\r\\n};\\r\\nconst updateObject = function (obj, updates) {\\r\\n let didChange = false;\\r\\n for (const key in updates) {\\r\\n const value = updates[key];\\r\\n if (typeof value !== \\\"undefined\\\") {\\r\\n if (obj[key] === value && ( // if object, always update because its attrs could have changed\\r\\n typeof value !== \\\"object\\\" || value === null)) {\\r\\n continue;\\r\\n }\\r\\n didChange = true;\\r\\n }\\r\\n }\\r\\n if (!didChange) {\\r\\n return obj;\\r\\n }\\r\\n return _objectSpread(_objectSpread({}, obj), updates);\\r\\n};\\r\\nconst isPrimitive = function (val) {\\r\\n const type = typeof val;\\r\\n return val == null || type !== \\\"object\\\" && type !== \\\"function\\\";\\r\\n};\\r\\nconst getFrame = function () {\\r\\n try {\\r\\n return window.self === window.top ? \\\"top\\\" : \\\"iframe\\\";\\r\\n }\\r\\n catch (error) {\\r\\n return \\\"iframe\\\";\\r\\n }\\r\\n};\\r\\nconst isPromiseLike = function (value) {\\r\\n return !!value && typeof value === \\\"object\\\" && \\\"then\\\" in value && \\\"catch\\\" in value && \\\"finally\\\" in value;\\r\\n};\\r\\nconst queryFocusableElements = function (container) {\\r\\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\\\"button, a, input, select, textarea, div[tabindex], label[tabindex]\\\");\\r\\n return focusableElements ? Array.from(focusableElements).filter(function (element) {\\r\\n return element.tabIndex > -1 && !element.disabled;\\r\\n }) : [];\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q2pCO0FBQ0gsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxhQUFhLEdBQUcsVUFBVSxLQUFLO0lBQzFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLEtBQUssSUFBSSxPQUFPLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxLQUFLLENBQUM7QUFDM0csQ0FBQyxDQUFDO0FBQ0ssTUFBTSxzQkFBc0IsR0FBRyxVQUFVLFNBQVM7SUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsZ0JBQWdCLENBQUMsb0VBQW9FLENBQUMsQ0FBQztJQUM1SCxPQUFPLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsT0FBTztRQUMvRSxPQUFPLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDVixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vdXRpbHMudHM/YjFkYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBvYyBmcm9tIFwib3Blbi1jb2xvclwiO1xuaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi9jb2xvcnNcIjtcbmltcG9ydCB7IENVUlNPUl9UWVBFLCBERUZBVUxUX1ZFUlNJT04sIEZPTlRfRkFNSUxZLCBNSU1FX1RZUEVTLCBUSEVNRSwgV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IGlzRGFyd2luIH0gZnJvbSBcIi4va2V5c1wiO1xubGV0IG1vY2tEYXRlVGltZSA9IG51bGw7XG5leHBvcnQgY29uc3Qgc2V0RGF0ZVRpbWVGb3JUZXN0cyA9IGZ1bmN0aW9uIChkYXRlVGltZSkge1xuICBtb2NrRGF0ZVRpbWUgPSBkYXRlVGltZTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RGF0ZVRpbWUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChtb2NrRGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gbW9ja0RhdGVUaW1lO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IG1vbnRoID0gYCR7ZGF0ZS5nZXRNb250aCgpICsgMX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgZGF5ID0gYCR7ZGF0ZS5nZXREYXRlKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IGhyID0gYCR7ZGF0ZS5nZXRIb3VycygpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBtaW4gPSBgJHtkYXRlLmdldE1pbnV0ZXMoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fS0ke2hyfSR7bWlufWA7XG59O1xuZXhwb3J0IGNvbnN0IGNhcGl0YWxpemVTdHJpbmcgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG59O1xuZXhwb3J0IGNvbnN0IGlzVG9vbEljb24gPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY2xhc3NOYW1lLmluY2x1ZGVzKFwiVG9vbEljb25cIik7XG59O1xuZXhwb3J0IGNvbnN0IGlzSW5wdXRMaWtlID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8IHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50O1xufTtcbmV4cG9ydCBjb25zdCBpc1dyaXRhYmxlRWxlbWVudCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5kYXRhc2V0LnR5cGUgPT09IFwid3lzaXd5Z1wiIHx8IHRhcmdldCBpbnN0YW5jZW9mIEhUTUxCUkVsZW1lbnQgfHwgLy8gbmV3bGluZSBpbiB3eXNpd3lnXG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiAodGFyZ2V0LnR5cGUgPT09IFwidGV4dFwiIHx8IHRhcmdldC50eXBlID09PSBcIm51bWJlclwiKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0Rm9udEZhbWlseVN0cmluZyA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gIGxldCB7XG4gICAgZm9udEZhbWlseVxuICB9ID0gX3JlZjtcblxuICBmb3IgKGNvbnN0IFtmb250RmFtaWx5U3RyaW5nLCBpZF0gb2YgT2JqZWN0LmVudHJpZXMoRk9OVF9GQU1JTFkpKSB7XG4gICAgaWYgKGlkID09PSBmb250RmFtaWx5KSB7XG4gICAgICByZXR1cm4gYCR7Zm9udEZhbWlseVN0cmluZ30sICR7V0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UfWA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFdJTkRPV1NfRU1PSklfRkFMTEJBQ0tfRk9OVDtcbn07XG4vKiogcmV0dXJucyBmb250U2l6ZStmb250RmFtaWx5IHN0cmluZyBmb3IgYXNzaWdubWVudCB0byBET00gZWxlbWVudHMgKi9cblxuZXhwb3J0IGNvbnN0IGdldEZvbnRTdHJpbmcgPSBmdW5jdGlvbiAoX3JlZjIpIHtcbiAgbGV0IHtcbiAgICBmb250U2l6ZSxcbiAgICBmb250RmFtaWx5XG4gIH0gPSBfcmVmMjtcbiAgcmV0dXJuIGAke2ZvbnRTaXplfXB4ICR7Z2V0Rm9udEZhbWlseVN0cmluZyh7XG4gICAgZm9udEZhbWlseVxuICB9KX1gO1xufTtcbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IGZ1bmN0aW9uIChmbiwgdGltZW91dCkge1xuICBsZXQgaGFuZGxlID0gMDtcbiAgbGV0IGxhc3RBcmdzID0gbnVsbDtcblxuICBjb25zdCByZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGxhc3RBcmdzID0gYXJncztcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBoYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfTtcblxuICByZXQuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG5cbiAgICBpZiAobGFzdEFyZ3MpIHtcbiAgICAgIGNvbnN0IF9sYXN0QXJncyA9IGxhc3RBcmdzO1xuICAgICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgICAgZm4oLi4uX2xhc3RBcmdzKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0LmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gIH07XG5cbiAgcmV0dXJuIHJldDtcbn07IC8vIHRocm90dGxlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgb25jZSBwZXIgYW5pbWF0aW9uIGZyYW1lXG5cbmV4cG9ydCBjb25zdCB0aHJvdHRsZVJBRiA9IGZ1bmN0aW9uIChmbiwgb3B0cykge1xuICBsZXQgdGltZXJJZCA9IG51bGw7XG4gIGxldCBsYXN0QXJncyA9IG51bGw7XG4gIGxldCBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcblxuICBjb25zdCBzY2hlZHVsZUZ1bmMgPSBmdW5jdGlvbiAoYXJncykge1xuICAgIHRpbWVySWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG5cbiAgICAgIGlmIChsYXN0QXJnc1RyYWlsaW5nKSB7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdEFyZ3NUcmFpbGluZztcbiAgICAgICAgbGFzdEFyZ3NUcmFpbGluZyA9IG51bGw7XG4gICAgICAgIHNjaGVkdWxlRnVuYyhsYXN0QXJncyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcmV0ID0gZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxhc3RBcmdzID0gYXJncztcblxuICAgIGlmICh0aW1lcklkID09PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgIH0gZWxzZSBpZiAob3B0cz8udHJhaWxpbmcpIHtcbiAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBhcmdzO1xuICAgIH1cbiAgfTtcblxuICByZXQuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRpbWVySWQpO1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBmbiguLi4obGFzdEFyZ3NUcmFpbGluZyB8fCBsYXN0QXJncykpO1xuICAgICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgcmV0LmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuXG4gICAgaWYgKHRpbWVySWQgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRpbWVySWQpO1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiByZXQ7XG59OyAvLyBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL2VzL2NodW5rLmpzXG5cbmV4cG9ydCBjb25zdCBjaHVuayA9IGZ1bmN0aW9uIChhcnJheSwgc2l6ZSkge1xuICBpZiAoIWFycmF5Lmxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCByZXNJbmRleCA9IDA7XG4gIGNvbnN0IHJlc3VsdCA9IEFycmF5KE1hdGguY2VpbChhcnJheS5sZW5ndGggLyBzaXplKSk7XG5cbiAgd2hpbGUgKGluZGV4IDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYXJyYXkuc2xpY2UoaW5kZXgsIGluZGV4ICs9IHNpemUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnQgY29uc3Qgc2VsZWN0Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCByZW1vdmVTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IGRpc3RhbmNlID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHggLSB5KTtcbn07XG5leHBvcnQgY29uc3QgdXBkYXRlQWN0aXZlVG9vbCA9IGZ1bmN0aW9uIChhcHBTdGF0ZSwgZGF0YSkge1xuICBpZiAoZGF0YS50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYXBwU3RhdGUuYWN0aXZlVG9vbCksIHt9LCB7XG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgY3VzdG9tVHlwZTogZGF0YS5jdXN0b21UeXBlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBhcHBTdGF0ZS5hY3RpdmVUb29sKSwge30sIHtcbiAgICBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcjogZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciA9PT0gdW5kZWZpbmVkID8gYXBwU3RhdGUuYWN0aXZlVG9vbC5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciA6IGRhdGEubGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXIsXG4gICAgdHlwZTogZGF0YS50eXBlLFxuICAgIGN1c3RvbVR5cGU6IG51bGxcbiAgfSk7XG59O1xuZXhwb3J0IGNvbnN0IHJlc2V0Q3Vyc29yID0gZnVuY3Rpb24gKGNhbnZhcykge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yID0gZnVuY3Rpb24gKGNhbnZhcywgY3Vyc29yKSB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xubGV0IGVyYXNlckNhbnZhc0NhY2hlO1xubGV0IHByZXZpZXdEYXRhVVJMO1xuZXhwb3J0IGNvbnN0IHNldEVyYXNlckN1cnNvciA9IGZ1bmN0aW9uIChjYW52YXMsIHRoZW1lKSB7XG4gIGNvbnN0IGN1cnNvckltYWdlU2l6ZVB4ID0gMjA7XG5cbiAgY29uc3QgZHJhd0NhbnZhcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpc0RhcmtUaGVtZSA9IHRoZW1lID09PSBUSEVNRS5EQVJLO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSA9IHRoZW1lO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgY29uc3QgY29udGV4dCA9IGVyYXNlckNhbnZhc0NhY2hlLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDE7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0LmFyYyhlcmFzZXJDYW52YXNDYWNoZS53aWR0aCAvIDIsIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCAvIDIsIDUsIDAsIDIgKiBNYXRoLlBJKTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGlzRGFya1RoZW1lID8gb2MuYmxhY2sgOiBvYy53aGl0ZTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy53aGl0ZSA6IG9jLmJsYWNrO1xuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgcHJldmlld0RhdGFVUkwgPSBlcmFzZXJDYW52YXNDYWNoZS50b0RhdGFVUkwoTUlNRV9UWVBFUy5zdmcpO1xuICB9O1xuXG4gIGlmICghZXJhc2VyQ2FudmFzQ2FjaGUgfHwgZXJhc2VyQ2FudmFzQ2FjaGUudGhlbWUgIT09IHRoZW1lKSB7XG4gICAgZHJhd0NhbnZhcygpO1xuICB9XG5cbiAgc2V0Q3Vyc29yKGNhbnZhcywgYHVybCgke3ByZXZpZXdEYXRhVVJMfSkgJHtjdXJzb3JJbWFnZVNpemVQeCAvIDJ9ICR7Y3Vyc29ySW1hZ2VTaXplUHggLyAyfSwgYXV0b2ApO1xufTtcbmV4cG9ydCBjb25zdCBzZXRDdXJzb3JGb3JTaGFwZSA9IGZ1bmN0aW9uIChjYW52YXMsIGFwcFN0YXRlKSB7XG4gIGlmICghY2FudmFzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gIH0gZWxzZSBpZiAoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImVyYXNlclwiKSB7XG4gICAgc2V0RXJhc2VyQ3Vyc29yKGNhbnZhcywgYXBwU3RhdGUudGhlbWUpOyAvLyBkbyBub3RoaW5nIGlmIGltYWdlIHRvb2wgaXMgc2VsZWN0ZWQgd2hpY2ggc3VnZ2VzdHMgdGhlcmUnc1xuICAgIC8vIGEgaW1hZ2UtcHJldmlldyBzZXQgYXMgdGhlIGN1cnNvclxuICAgIC8vIElnbm9yZSBjdXN0b20gdHlwZSBhcyB3ZWxsIGFuZCBsZXQgaG9zdCBkZWNpZGVcbiAgfSBlbHNlIGlmICghW1wiaW1hZ2VcIiwgXCJjdXN0b21cIl0uaW5jbHVkZXMoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlKSkge1xuICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSBDVVJTT1JfVFlQRS5DUk9TU0hBSVI7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgaXNGdWxsU2NyZWVuID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQ/Lm5vZGVOYW1lID09PSBcIkhUTUxcIjtcbn07XG5leHBvcnQgY29uc3QgYWxsb3dGdWxsU2NyZWVuID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKCk7XG59O1xuZXhwb3J0IGNvbnN0IGV4aXRGdWxsU2NyZWVuID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0U2hvcnRjdXRLZXkgPSBmdW5jdGlvbiAoc2hvcnRjdXQpIHtcbiAgc2hvcnRjdXQgPSBzaG9ydGN1dC5yZXBsYWNlKC9cXGJBbHRcXGIvaSwgXCJBbHRcIikucmVwbGFjZSgvXFxiU2hpZnRcXGIvaSwgXCJTaGlmdFwiKS5yZXBsYWNlKC9cXGIoRW50ZXJ8UmV0dXJuKVxcYi9pLCBcIkVudGVyXCIpLnJlcGxhY2UoL1xcYkRlbFxcYi9pLCBcIkRlbGV0ZVwiKTtcblxuICBpZiAoaXNEYXJ3aW4pIHtcbiAgICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2ksIFwiQ21kXCIpLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIk9wdGlvblwiKTtcbiAgfVxuXG4gIHJldHVybiBzaG9ydGN1dC5yZXBsYWNlKC9cXGJDdHJsT3JDbWRcXGIvaSwgXCJDdHJsXCIpO1xufTtcbmV4cG9ydCBjb25zdCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMgPSBmdW5jdGlvbiAoX3JlZjMsIF9yZWY0KSB7XG4gIGxldCB7XG4gICAgY2xpZW50WCxcbiAgICBjbGllbnRZXG4gIH0gPSBfcmVmMztcbiAgbGV0IHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWVxuICB9ID0gX3JlZjQ7XG4gIGNvbnN0IGludlNjYWxlID0gMSAvIHpvb20udmFsdWU7XG4gIGNvbnN0IHggPSAoY2xpZW50WCAtIG9mZnNldExlZnQpICogaW52U2NhbGUgLSBzY3JvbGxYO1xuICBjb25zdCB5ID0gKGNsaWVudFkgLSBvZmZzZXRUb3ApICogaW52U2NhbGUgLSBzY3JvbGxZO1xuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMgPSBmdW5jdGlvbiAoX3JlZjUsIF9yZWY2KSB7XG4gIGxldCB7XG4gICAgc2NlbmVYLFxuICAgIHNjZW5lWVxuICB9ID0gX3JlZjU7XG4gIGxldCB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFlcbiAgfSA9IF9yZWY2O1xuICBjb25zdCB4ID0gKHNjZW5lWCArIHNjcm9sbFgpICogem9vbS52YWx1ZSArIG9mZnNldExlZnQ7XG4gIGNvbnN0IHkgPSAoc2NlbmVZICsgc2Nyb2xsWSkgKiB6b29tLnZhbHVlICsgb2Zmc2V0VG9wO1xuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBnZXRHbG9iYWxDU1NWYXJpYWJsZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShgLS0ke25hbWV9YCk7XG59O1xuY29uc3QgUlNfTFRSX0NIQVJTID0gXCJBLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyQjhcXHUwMzAwLVxcdTA1OTBcXHUwODAwLVxcdTFGRkZcIiArIFwiXFx1MkMwMC1cXHVGQjFDXFx1RkRGRS1cXHVGRTZGXFx1RkVGRC1cXHVGRkZGXCI7XG5jb25zdCBSU19SVExfQ0hBUlMgPSBcIlxcdTA1OTEtXFx1MDdGRlxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ1wiO1xuY29uc3QgUkVfUlRMX0NIRUNLID0gbmV3IFJlZ0V4cChgXlteJHtSU19MVFJfQ0hBUlN9XSpbJHtSU19SVExfQ0hBUlN9XWApO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBmaXJzdCBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIgaXMgUlRMLiBNZWFuaW5nIHdoZXRoZXIgaXQgc3RhcnRzXG4gKiAgd2l0aCBSVEwgY2hhcmFjdGVycywgb3IgaW5kZXRlcm1pbmF0ZSAobnVtYmVycyBldGMuKSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5XG4gKiAgUlRMLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC8xNzIyI2Rpc2N1c3Npb25fcjQzNjM0MDE3MVxuICovXG5cbmV4cG9ydCBjb25zdCBpc1JUTCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIHJldHVybiBSRV9SVExfQ0hFQ0sudGVzdCh0ZXh0KTtcbn07XG5leHBvcnQgY29uc3QgdHVwbGVUb0Nvb3JzID0gZnVuY3Rpb24gKHh5VHVwbGUpIHtcbiAgY29uc3QgW3gsIHldID0geHlUdXBsZTtcbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHlcbiAgfTtcbn07XG4vKiogdXNlIGFzIGEgcmVqZWN0aW9uSGFuZGxlciB0byBtdXRlIGZpbGVzeXN0ZW0gQWJvcnQgZXJyb3JzICovXG5cbmV4cG9ydCBjb25zdCBtdXRlRlNBYm9ydEVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gIGlmIChlcnJvcj8ubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHtcbiAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IGVycm9yO1xufTtcbmV4cG9ydCBjb25zdCBmaW5kSW5kZXggPSBmdW5jdGlvbiAoYXJyYXksIGNiKSB7XG4gIGxldCBmcm9tSW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7XG5cbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cblxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGgsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggLSAxO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgaWYgKGNiKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn07XG5leHBvcnQgY29uc3QgZmluZExhc3RJbmRleCA9IGZ1bmN0aW9uIChhcnJheSwgY2IpIHtcbiAgbGV0IGZyb21JbmRleCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyYXkubGVuZ3RoIC0gMTtcblxuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuXG4gIGZyb21JbmRleCA9IE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuXG4gIHdoaWxlICgtLWluZGV4ID4gLTEpIHtcbiAgICBpZiAoY2IoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufTtcbmV4cG9ydCBjb25zdCBpc1RyYW5zcGFyZW50ID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gIGNvbnN0IGlzUkdCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDUgJiYgY29sb3Iuc3Vic3RyKDQsIDEpID09PSBcIjBcIjtcbiAgY29uc3QgaXNSUkdHQkJUcmFuc3BhcmVudCA9IGNvbG9yLmxlbmd0aCA9PT0gOSAmJiBjb2xvci5zdWJzdHIoNywgMikgPT09IFwiMDBcIjtcbiAgcmV0dXJuIGlzUkdCVHJhbnNwYXJlbnQgfHwgaXNSUkdHQkJUcmFuc3BhcmVudCB8fCBjb2xvciA9PT0gY29sb3JzLmVsZW1lbnRCYWNrZ3JvdW5kWzBdO1xufTtcbmV4cG9ydCBjb25zdCByZXNvbHZhYmxlUHJvbWlzZSA9IGZ1bmN0aW9uICgpIHtcbiAgbGV0IHJlc29sdmU7XG4gIGxldCByZWplY3Q7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAoX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIHByb21pc2UucmVzb2x2ZSA9IHJlc29sdmU7XG4gIHByb21pc2UucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZTtcbn07XG4vKipcbiAqIEBwYXJhbSBmdW5jIGhhbmRsZXIgdGFraW5nIGF0IG1vc3Qgc2luZ2xlIHBhcmFtZXRlciAoZXZlbnQpLlxuICovXG5cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXMgPSBmdW5jdGlvbiAoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYywgZXZlbnQpO1xuICB9O1xufTtcbi8qKlxuICogYmFyY2hlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIGFuZCB0aHJvdHRsZXMgdGhlIGNhbGxzIHRvIGEgc2luZ2xlIGNhbGwgcGVyXG4gKiBhbmltYXRpb24gZnJhbWVcbiAqL1xuXG5leHBvcnQgY29uc3Qgd2l0aEJhdGNoZWRVcGRhdGVzVGhyb3R0bGVkID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gdGhyb3R0bGVSQUYoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYywgZXZlbnQpO1xuICB9KTtcbn07IC8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuXG5leHBvcnQgY29uc3QgbkZvcm1hdHRlciA9IGZ1bmN0aW9uIChudW0sIGRpZ2l0cykge1xuICBjb25zdCBzaSA9IFt7XG4gICAgdmFsdWU6IDEsXG4gICAgc3ltYm9sOiBcImJcIlxuICB9LCB7XG4gICAgdmFsdWU6IDFlMyxcbiAgICBzeW1ib2w6IFwia1wiXG4gIH0sIHtcbiAgICB2YWx1ZTogMWU2LFxuICAgIHN5bWJvbDogXCJNXCJcbiAgfSwge1xuICAgIHZhbHVlOiAxZTksXG4gICAgc3ltYm9sOiBcIkdcIlxuICB9XTtcbiAgY29uc3QgcnggPSAvXFwuMCskfChcXC5bMC05XSpbMS05XSkwKyQvO1xuICBsZXQgaW5kZXg7XG5cbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKG51bSAvIHNpW2luZGV4XS52YWx1ZSkudG9GaXhlZChkaWdpdHMpLnJlcGxhY2UocngsIFwiJDFcIikgKyBzaVtpbmRleF0uc3ltYm9sO1xufTtcbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8IERFRkFVTFRfVkVSU0lPTjtcbn07IC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvZW1vamkuanNcblxuZXhwb3J0IGNvbnN0IHN1cHBvcnRzRW1vamkgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSAxMjtcbiAgY3R4LmZpbGxTdHlsZSA9IFwiI2YwMFwiO1xuICBjdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcbiAgY3R4LmZvbnQgPSBcIjMycHggQXJpYWxcIjsgLy8gTW9kZXJuaXpyIHVzZWQg8J+QqCwgYnV0IGl0IGlzIHNvcnQgb2Ygc3VwcG9ydGVkIG9uIFdpbmRvd3MgNy5cbiAgLy8gTHVja2lseSDwn5iAIGlzbid0IHN1cHBvcnRlZC5cblxuICBjdHguZmlsbFRleHQoXCLwn5iAXCIsIDAsIDApO1xuICByZXR1cm4gY3R4LmdldEltYWdlRGF0YShvZmZzZXQsIG9mZnNldCwgMSwgMSkuZGF0YVswXSAhPT0gMDtcbn07XG5leHBvcnQgY29uc3QgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgb3ZlcmZsb3dZXG4gICAgfSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudCk7XG4gICAgY29uc3QgaGFzU2Nyb2xsYWJsZUNvbnRlbnQgPSBwYXJlbnQuc2Nyb2xsSGVpZ2h0ID4gcGFyZW50LmNsaWVudEhlaWdodDtcblxuICAgIGlmIChoYXNTY3JvbGxhYmxlQ29udGVudCAmJiAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fCBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHwgb3ZlcmZsb3dZID09PSBcIm92ZXJsYXlcIikpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gZG9jdW1lbnQ7XG59O1xuZXhwb3J0IGNvbnN0IGZvY3VzTmVhcmVzdFBhcmVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGlmIChwYXJlbnQudGFiSW5kZXggPiAtMSkge1xuICAgICAgcGFyZW50LmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgcHJldmVudFVubG9hZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBOT1RFOiBtb2Rlcm4gYnJvd3NlcnMgbm8gbG9uZ2VyIGFsbG93IHNob3dpbmcgYSBjdXN0b20gbWVzc2FnZSBoZXJlXG5cbiAgZXZlbnQucmV0dXJuVmFsdWUgPSBcIlwiO1xufTtcbmV4cG9ydCBjb25zdCBieXRlc1RvSGV4U3RyaW5nID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKS5tYXAoZnVuY3Rpb24gKGJ5dGUpIHtcbiAgICByZXR1cm4gYDAke2J5dGUudG9TdHJpbmcoMTYpfWAuc2xpY2UoLTIpO1xuICB9KS5qb2luKFwiXCIpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRVcGRhdGVkVGltZXN0YW1wID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaXNUZXN0RW52KCkgPyAxIDogRGF0ZS5ub3coKTtcbn07XG4vKipcbiAqIFRyYW5zZm9ybXMgYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGBpZGAgYXR0cmlidXRlLFxuICogb3IgYXJyYXkgb2YgaWRzIChzdHJpbmdzKSwgaW50byBhIE1hcCwga2V5ZCBieSBgaWRgLlxuICovXG5cbmV4cG9ydCBjb25zdCBhcnJheVRvTWFwID0gZnVuY3Rpb24gKGl0ZW1zKSB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZWxlbWVudCkge1xuICAgIGFjYy5zZXQodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIgPyBlbGVtZW50IDogZWxlbWVudC5pZCwgZWxlbWVudCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgbmV3IE1hcCgpKTtcbn07XG5leHBvcnQgY29uc3QgaXNUZXN0RW52ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInRlc3RcIjtcbn07XG5leHBvcnQgY29uc3QgaXNQcm9kRW52ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIjtcbn07XG5leHBvcnQgY29uc3Qgd3JhcEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBuZXcgQ3VzdG9tRXZlbnQobmFtZSwge1xuICAgIGRldGFpbDoge1xuICAgICAgbmF0aXZlRXZlbnRcbiAgICB9LFxuICAgIGNhbmNlbGFibGU6IHRydWVcbiAgfSk7XG59O1xuZXhwb3J0IGNvbnN0IHVwZGF0ZU9iamVjdCA9IGZ1bmN0aW9uIChvYmosIHVwZGF0ZXMpIHtcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHVwZGF0ZXNba2V5XTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChvYmpba2V5XSA9PT0gdmFsdWUgJiYgKCAvLyBpZiBvYmplY3QsIGFsd2F5cyB1cGRhdGUgYmVjYXVzZSBpdHMgYXR0cnMgY291bGQgaGF2ZSBjaGFuZ2VkXG4gICAgICB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9iaiksIHVwZGF0ZXMpO1xufTtcbmV4cG9ydCBjb25zdCBpc1ByaW1pdGl2ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCB0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwiZnVuY3Rpb25cIjtcbn07XG5leHBvcnQgY29uc3QgZ2V0RnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5zZWxmID09PSB3aW5kb3cudG9wID8gXCJ0b3BcIiA6IFwiaWZyYW1lXCI7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFwiaWZyYW1lXCI7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgaXNQcm9taXNlTGlrZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJ0aGVuXCIgaW4gdmFsdWUgJiYgXCJjYXRjaFwiIGluIHZhbHVlICYmIFwiZmluYWxseVwiIGluIHZhbHVlO1xufTtcbmV4cG9ydCBjb25zdCBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbChcImJ1dHRvbiwgYSwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGRpdlt0YWJpbmRleF0sIGxhYmVsW3RhYmluZGV4XVwiKTtcbiAgcmV0dXJuIGZvY3VzYWJsZUVsZW1lbnRzID8gQXJyYXkuZnJvbShmb2N1c2FibGVFbGVtZW50cykuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQudGFiSW5kZXggPiAtMSAmJiAhZWxlbWVudC5kaXNhYmxlZDtcbiAgfSkgOiBbXTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///../../utils.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../utils.ts?");
|
|
3173
|
+
eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"allowFullScreen\\\": () => (/* binding */ allowFullScreen),\\n/* harmony export */ \\\"arrayToMap\\\": () => (/* binding */ arrayToMap),\\n/* harmony export */ \\\"bytesToHexString\\\": () => (/* binding */ bytesToHexString),\\n/* harmony export */ \\\"capitalizeString\\\": () => (/* binding */ capitalizeString),\\n/* harmony export */ \\\"chunk\\\": () => (/* binding */ chunk),\\n/* harmony export */ \\\"debounce\\\": () => (/* binding */ debounce),\\n/* harmony export */ \\\"distance\\\": () => (/* binding */ distance),\\n/* harmony export */ \\\"exitFullScreen\\\": () => (/* binding */ exitFullScreen),\\n/* harmony export */ \\\"findIndex\\\": () => (/* binding */ findIndex),\\n/* harmony export */ \\\"findLastIndex\\\": () => (/* binding */ findLastIndex),\\n/* harmony export */ \\\"focusNearestParent\\\": () => (/* binding */ focusNearestParent),\\n/* harmony export */ \\\"getDateTime\\\": () => (/* binding */ getDateTime),\\n/* harmony export */ \\\"getFontFamilyString\\\": () => (/* binding */ getFontFamilyString),\\n/* harmony export */ \\\"getFontString\\\": () => (/* binding */ getFontString),\\n/* harmony export */ \\\"getFrame\\\": () => (/* binding */ getFrame),\\n/* harmony export */ \\\"getGlobalCSSVariable\\\": () => (/* binding */ getGlobalCSSVariable),\\n/* harmony export */ \\\"getNearestScrollableContainer\\\": () => (/* binding */ getNearestScrollableContainer),\\n/* harmony export */ \\\"getShortcutKey\\\": () => (/* binding */ getShortcutKey),\\n/* harmony export */ \\\"getUpdatedTimestamp\\\": () => (/* binding */ getUpdatedTimestamp),\\n/* harmony export */ \\\"getVersion\\\": () => (/* binding */ getVersion),\\n/* harmony export */ \\\"isFullScreen\\\": () => (/* binding */ isFullScreen),\\n/* harmony export */ \\\"isInputLike\\\": () => (/* binding */ isInputLike),\\n/* harmony export */ \\\"isPrimitive\\\": () => (/* binding */ isPrimitive),\\n/* harmony export */ \\\"isProdEnv\\\": () => (/* binding */ isProdEnv),\\n/* harmony export */ \\\"isPromiseLike\\\": () => (/* binding */ isPromiseLike),\\n/* harmony export */ \\\"isRTL\\\": () => (/* binding */ isRTL),\\n/* harmony export */ \\\"isTestEnv\\\": () => (/* binding */ isTestEnv),\\n/* harmony export */ \\\"isToolIcon\\\": () => (/* binding */ isToolIcon),\\n/* harmony export */ \\\"isTransparent\\\": () => (/* binding */ isTransparent),\\n/* harmony export */ \\\"isWritableElement\\\": () => (/* binding */ isWritableElement),\\n/* harmony export */ \\\"muteFSAbortError\\\": () => (/* binding */ muteFSAbortError),\\n/* harmony export */ \\\"nFormatter\\\": () => (/* binding */ nFormatter),\\n/* harmony export */ \\\"preventUnload\\\": () => (/* binding */ preventUnload),\\n/* harmony export */ \\\"queryFocusableElements\\\": () => (/* binding */ queryFocusableElements),\\n/* harmony export */ \\\"removeSelection\\\": () => (/* binding */ removeSelection),\\n/* harmony export */ \\\"resetCursor\\\": () => (/* binding */ resetCursor),\\n/* harmony export */ \\\"resolvablePromise\\\": () => (/* binding */ resolvablePromise),\\n/* harmony export */ \\\"sceneCoordsToViewportCoords\\\": () => (/* binding */ sceneCoordsToViewportCoords),\\n/* harmony export */ \\\"selectNode\\\": () => (/* binding */ selectNode),\\n/* harmony export */ \\\"setCursor\\\": () => (/* binding */ setCursor),\\n/* harmony export */ \\\"setCursorForShape\\\": () => (/* binding */ setCursorForShape),\\n/* harmony export */ \\\"setDateTimeForTests\\\": () => (/* binding */ setDateTimeForTests),\\n/* harmony export */ \\\"setEraserCursor\\\": () => (/* binding */ setEraserCursor),\\n/* harmony export */ \\\"supportsEmoji\\\": () => (/* binding */ supportsEmoji),\\n/* harmony export */ \\\"throttleRAF\\\": () => (/* binding */ throttleRAF),\\n/* harmony export */ \\\"tupleToCoors\\\": () => (/* binding */ tupleToCoors),\\n/* harmony export */ \\\"updateActiveTool\\\": () => (/* binding */ updateActiveTool),\\n/* harmony export */ \\\"updateObject\\\": () => (/* binding */ updateObject),\\n/* harmony export */ \\\"viewportCoordsToSceneCoords\\\": () => (/* binding */ viewportCoordsToSceneCoords),\\n/* harmony export */ \\\"withBatchedUpdates\\\": () => (/* binding */ withBatchedUpdates),\\n/* harmony export */ \\\"withBatchedUpdatesThrottled\\\": () => (/* binding */ withBatchedUpdatesThrottled),\\n/* harmony export */ \\\"wrapEvent\\\": () => (/* binding */ wrapEvent)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\\\");\\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! open-color */ \\\"../../../node_modules/open-color/open-color.json\\\");\\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./colors */ \\\"../../colors.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \\\"react-dom\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./keys */ \\\"../../keys.ts\\\");\\n\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nlet mockDateTime = null;\\r\\nconst setDateTimeForTests = function (dateTime) {\\r\\n mockDateTime = dateTime;\\r\\n};\\r\\nconst getDateTime = function () {\\r\\n if (mockDateTime) {\\r\\n return mockDateTime;\\r\\n }\\r\\n const date = new Date();\\r\\n const year = date.getFullYear();\\r\\n const month = `${date.getMonth() + 1}`.padStart(2, \\\"0\\\");\\r\\n const day = `${date.getDate()}`.padStart(2, \\\"0\\\");\\r\\n const hr = `${date.getHours()}`.padStart(2, \\\"0\\\");\\r\\n const min = `${date.getMinutes()}`.padStart(2, \\\"0\\\");\\r\\n return `${year}-${month}-${day}-${hr}${min}`;\\r\\n};\\r\\nconst capitalizeString = function (str) {\\r\\n return str.charAt(0).toUpperCase() + str.slice(1);\\r\\n};\\r\\nconst isToolIcon = function (target) {\\r\\n return target instanceof HTMLElement && target.className.includes(\\\"ToolIcon\\\");\\r\\n};\\r\\nconst isInputLike = function (target) {\\r\\n return target instanceof HTMLElement && target.dataset.type === \\\"wysiwyg\\\" || target instanceof HTMLBRElement || // newline in wysiwyg\\r\\n target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement;\\r\\n};\\r\\nconst isWritableElement = function (target) {\\r\\n return target instanceof HTMLElement && target.dataset.type === \\\"wysiwyg\\\" || target instanceof HTMLBRElement || // newline in wysiwyg\\r\\n target instanceof HTMLTextAreaElement || target instanceof HTMLInputElement && (target.type === \\\"text\\\" || target.type === \\\"number\\\");\\r\\n};\\r\\nconst getFontFamilyString = function (_ref) {\\r\\n let { fontFamily } = _ref;\\r\\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY)) {\\r\\n if (id === fontFamily) {\\r\\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_3__.WINDOWS_EMOJI_FALLBACK_FONT}`;\\r\\n }\\r\\n }\\r\\n return _constants__WEBPACK_IMPORTED_MODULE_3__.WINDOWS_EMOJI_FALLBACK_FONT;\\r\\n};\\r\\n/** returns fontSize+fontFamily string for assignment to DOM elements */\\r\\nconst getFontString = function (_ref2) {\\r\\n let { fontSize, fontFamily } = _ref2;\\r\\n return `${fontSize}px ${getFontFamilyString({\\r\\n fontFamily\\r\\n })}`;\\r\\n};\\r\\nconst debounce = function (fn, timeout) {\\r\\n let handle = 0;\\r\\n let lastArgs = null;\\r\\n const ret = function () {\\r\\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\\r\\n args[_key] = arguments[_key];\\r\\n }\\r\\n lastArgs = args;\\r\\n clearTimeout(handle);\\r\\n handle = window.setTimeout(function () {\\r\\n lastArgs = null;\\r\\n fn(...args);\\r\\n }, timeout);\\r\\n };\\r\\n ret.flush = function () {\\r\\n clearTimeout(handle);\\r\\n if (lastArgs) {\\r\\n const _lastArgs = lastArgs;\\r\\n lastArgs = null;\\r\\n fn(..._lastArgs);\\r\\n }\\r\\n };\\r\\n ret.cancel = function () {\\r\\n lastArgs = null;\\r\\n clearTimeout(handle);\\r\\n };\\r\\n return ret;\\r\\n}; // throttle callback to execute once per animation frame\\r\\nconst throttleRAF = function (fn, opts) {\\r\\n let timerId = null;\\r\\n let lastArgs = null;\\r\\n let lastArgsTrailing = null;\\r\\n const scheduleFunc = function (args) {\\r\\n timerId = window.requestAnimationFrame(function () {\\r\\n timerId = null;\\r\\n fn(...args);\\r\\n lastArgs = null;\\r\\n if (lastArgsTrailing) {\\r\\n lastArgs = lastArgsTrailing;\\r\\n lastArgsTrailing = null;\\r\\n scheduleFunc(lastArgs);\\r\\n }\\r\\n });\\r\\n };\\r\\n const ret = function () {\\r\\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\\r\\n args[_key2] = arguments[_key2];\\r\\n }\\r\\n if (false) {}\\r\\n lastArgs = args;\\r\\n if (timerId === null) {\\r\\n scheduleFunc(lastArgs);\\r\\n }\\r\\n else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\\r\\n lastArgsTrailing = args;\\r\\n }\\r\\n };\\r\\n ret.flush = function () {\\r\\n if (timerId !== null) {\\r\\n cancelAnimationFrame(timerId);\\r\\n timerId = null;\\r\\n }\\r\\n if (lastArgs) {\\r\\n fn(...(lastArgsTrailing || lastArgs));\\r\\n lastArgs = lastArgsTrailing = null;\\r\\n }\\r\\n };\\r\\n ret.cancel = function () {\\r\\n lastArgs = lastArgsTrailing = null;\\r\\n if (timerId !== null) {\\r\\n cancelAnimationFrame(timerId);\\r\\n timerId = null;\\r\\n }\\r\\n };\\r\\n return ret;\\r\\n}; // https://github.com/lodash/lodash/blob/es/chunk.js\\r\\nconst chunk = function (array, size) {\\r\\n if (!array.length || size < 1) {\\r\\n return [];\\r\\n }\\r\\n let index = 0;\\r\\n let resIndex = 0;\\r\\n const result = Array(Math.ceil(array.length / size));\\r\\n while (index < array.length) {\\r\\n result[resIndex++] = array.slice(index, index += size);\\r\\n }\\r\\n return result;\\r\\n};\\r\\nconst selectNode = function (node) {\\r\\n const selection = window.getSelection();\\r\\n if (selection) {\\r\\n const range = document.createRange();\\r\\n range.selectNodeContents(node);\\r\\n selection.removeAllRanges();\\r\\n selection.addRange(range);\\r\\n }\\r\\n};\\r\\nconst removeSelection = function () {\\r\\n const selection = window.getSelection();\\r\\n if (selection) {\\r\\n selection.removeAllRanges();\\r\\n }\\r\\n};\\r\\nconst distance = function (x, y) {\\r\\n return Math.abs(x - y);\\r\\n};\\r\\nconst updateActiveTool = function (appState, data) {\\r\\n if (data.type === \\\"custom\\\") {\\r\\n return _objectSpread(_objectSpread({}, appState.activeTool), {}, {\\r\\n type: \\\"custom\\\",\\r\\n customType: data.customType\\r\\n });\\r\\n }\\r\\n return _objectSpread(_objectSpread({}, appState.activeTool), {}, {\\r\\n lastActiveToolBeforeEraser: data.lastActiveToolBeforeEraser === undefined ? appState.activeTool.lastActiveToolBeforeEraser : data.lastActiveToolBeforeEraser,\\r\\n type: data.type,\\r\\n customType: null\\r\\n });\\r\\n};\\r\\nconst resetCursor = function (canvas) {\\r\\n if (canvas) {\\r\\n canvas.style.cursor = \\\"\\\";\\r\\n }\\r\\n};\\r\\nconst setCursor = function (canvas, cursor) {\\r\\n if (canvas) {\\r\\n canvas.style.cursor = cursor;\\r\\n }\\r\\n};\\r\\nlet eraserCanvasCache;\\r\\nlet previewDataURL;\\r\\nconst setEraserCursor = function (canvas, theme) {\\r\\n const cursorImageSizePx = 20;\\r\\n const drawCanvas = function () {\\r\\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_3__.THEME.DARK;\\r\\n eraserCanvasCache = document.createElement(\\\"canvas\\\");\\r\\n eraserCanvasCache.theme = theme;\\r\\n eraserCanvasCache.height = cursorImageSizePx;\\r\\n eraserCanvasCache.width = cursorImageSizePx;\\r\\n const context = eraserCanvasCache.getContext(\\\"2d\\\");\\r\\n context.lineWidth = 1;\\r\\n context.beginPath();\\r\\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\\r\\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_1__.black : open_color__WEBPACK_IMPORTED_MODULE_1__.white;\\r\\n context.fill();\\r\\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_1__.white : open_color__WEBPACK_IMPORTED_MODULE_1__.black;\\r\\n context.stroke();\\r\\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_3__.MIME_TYPES.svg);\\r\\n };\\r\\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\\r\\n drawCanvas();\\r\\n }\\r\\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\\r\\n};\\r\\nconst setCursorForShape = function (canvas, appState) {\\r\\n if (!canvas) {\\r\\n return;\\r\\n }\\r\\n if (appState.activeTool.type === \\\"selection\\\") {\\r\\n resetCursor(canvas);\\r\\n }\\r\\n else if (appState.activeTool.type === \\\"eraser\\\") {\\r\\n setEraserCursor(canvas, appState.theme); // do nothing if image tool is selected which suggests there's\\r\\n // a image-preview set as the cursor\\r\\n // Ignore custom type as well and let host decide\\r\\n }\\r\\n else if (![\\\"image\\\", \\\"custom\\\"].includes(appState.activeTool.type)) {\\r\\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_3__.CURSOR_TYPE.CROSSHAIR;\\r\\n }\\r\\n};\\r\\nconst isFullScreen = function () {\\r\\n var _a;\\r\\n return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \\\"HTML\\\";\\r\\n};\\r\\nconst allowFullScreen = function () {\\r\\n return document.documentElement.requestFullscreen();\\r\\n};\\r\\nconst exitFullScreen = function () {\\r\\n return document.exitFullscreen();\\r\\n};\\r\\nconst getShortcutKey = function (shortcut) {\\r\\n shortcut = shortcut.replace(/\\\\bAlt\\\\b/i, \\\"Alt\\\").replace(/\\\\bShift\\\\b/i, \\\"Shift\\\").replace(/\\\\b(Enter|Return)\\\\b/i, \\\"Enter\\\").replace(/\\\\bDel\\\\b/i, \\\"Delete\\\");\\r\\n if (_keys__WEBPACK_IMPORTED_MODULE_5__.isDarwin) {\\r\\n return shortcut.replace(/\\\\bCtrlOrCmd\\\\b/i, \\\"Cmd\\\").replace(/\\\\bAlt\\\\b/i, \\\"Option\\\");\\r\\n }\\r\\n return shortcut.replace(/\\\\bCtrlOrCmd\\\\b/i, \\\"Ctrl\\\");\\r\\n};\\r\\nconst viewportCoordsToSceneCoords = function (_ref3, _ref4) {\\r\\n let { clientX, clientY } = _ref3;\\r\\n let { zoom, offsetLeft, offsetTop, scrollX, scrollY } = _ref4;\\r\\n const invScale = 1 / zoom.value;\\r\\n const x = (clientX - offsetLeft) * invScale - scrollX;\\r\\n const y = (clientY - offsetTop) * invScale - scrollY;\\r\\n return {\\r\\n x,\\r\\n y\\r\\n };\\r\\n};\\r\\nconst sceneCoordsToViewportCoords = function (_ref5, _ref6) {\\r\\n let { sceneX, sceneY } = _ref5;\\r\\n let { zoom, offsetLeft, offsetTop, scrollX, scrollY } = _ref6;\\r\\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\\r\\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\\r\\n return {\\r\\n x,\\r\\n y\\r\\n };\\r\\n};\\r\\nconst getGlobalCSSVariable = function (name) {\\r\\n return getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\\r\\n};\\r\\nconst RS_LTR_CHARS = \\\"A-Za-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02B8\\\\u0300-\\\\u0590\\\\u0800-\\\\u1FFF\\\" + \\\"\\\\u2C00-\\\\uFB1C\\\\uFDFE-\\\\uFE6F\\\\uFEFD-\\\\uFFFF\\\";\\r\\nconst RS_RTL_CHARS = \\\"\\\\u0591-\\\\u07FF\\\\uFB1D-\\\\uFDFD\\\\uFE70-\\\\uFEFC\\\";\\r\\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\\r\\n/**\\r\\n * Checks whether first directional character is RTL. Meaning whether it starts\\r\\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\\r\\n * RTL.\\r\\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\\r\\n */\\r\\nconst isRTL = function (text) {\\r\\n return RE_RTL_CHECK.test(text);\\r\\n};\\r\\nconst tupleToCoors = function (xyTuple) {\\r\\n const [x, y] = xyTuple;\\r\\n return {\\r\\n x,\\r\\n y\\r\\n };\\r\\n};\\r\\n/** use as a rejectionHandler to mute filesystem Abort errors */\\r\\nconst muteFSAbortError = function (error) {\\r\\n if ((error === null || error === void 0 ? void 0 : error.name) === \\\"AbortError\\\") {\\r\\n console.warn(error);\\r\\n return;\\r\\n }\\r\\n throw error;\\r\\n};\\r\\nconst findIndex = function (array, cb) {\\r\\n let fromIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\\r\\n if (fromIndex < 0) {\\r\\n fromIndex = array.length + fromIndex;\\r\\n }\\r\\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\\r\\n let index = fromIndex - 1;\\r\\n while (++index < array.length) {\\r\\n if (cb(array[index], index, array)) {\\r\\n return index;\\r\\n }\\r\\n }\\r\\n return -1;\\r\\n};\\r\\nconst findLastIndex = function (array, cb) {\\r\\n let fromIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : array.length - 1;\\r\\n if (fromIndex < 0) {\\r\\n fromIndex = array.length + fromIndex;\\r\\n }\\r\\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\\r\\n let index = fromIndex + 1;\\r\\n while (--index > -1) {\\r\\n if (cb(array[index], index, array)) {\\r\\n return index;\\r\\n }\\r\\n }\\r\\n return -1;\\r\\n};\\r\\nconst isTransparent = function (color) {\\r\\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \\\"0\\\";\\r\\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \\\"00\\\";\\r\\n return isRGBTransparent || isRRGGBBTransparent || color === _colors__WEBPACK_IMPORTED_MODULE_2__[\\\"default\\\"].elementBackground[0];\\r\\n};\\r\\nconst resolvablePromise = function () {\\r\\n let resolve;\\r\\n let reject;\\r\\n const promise = new Promise(function (_resolve, _reject) {\\r\\n resolve = _resolve;\\r\\n reject = _reject;\\r\\n });\\r\\n promise.resolve = resolve;\\r\\n promise.reject = reject;\\r\\n return promise;\\r\\n};\\r\\n/**\\r\\n * @param func handler taking at most single parameter (event).\\r\\n */\\r\\nconst withBatchedUpdates = function (func) {\\r\\n return function (event) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_4__.unstable_batchedUpdates)(func, event);\\r\\n };\\r\\n};\\r\\n/**\\r\\n * barches React state updates and throttles the calls to a single call per\\r\\n * animation frame\\r\\n */\\r\\nconst withBatchedUpdatesThrottled = function (func) {\\r\\n // @ts-ignore\\r\\n return throttleRAF(function (event) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_4__.unstable_batchedUpdates)(func, event);\\r\\n });\\r\\n}; //https://stackoverflow.com/a/9462382/8418\\r\\nconst nFormatter = function (num, digits) {\\r\\n const si = [{\\r\\n value: 1,\\r\\n symbol: \\\"b\\\"\\r\\n }, {\\r\\n value: 1e3,\\r\\n symbol: \\\"k\\\"\\r\\n }, {\\r\\n value: 1e6,\\r\\n symbol: \\\"M\\\"\\r\\n }, {\\r\\n value: 1e9,\\r\\n symbol: \\\"G\\\"\\r\\n }];\\r\\n const rx = /\\\\.0+$|(\\\\.[0-9]*[1-9])0+$/;\\r\\n let index;\\r\\n for (index = si.length - 1; index > 0; index--) {\\r\\n if (num >= si[index].value) {\\r\\n break;\\r\\n }\\r\\n }\\r\\n return (num / si[index].value).toFixed(digits).replace(rx, \\\"$1\\\") + si[index].symbol;\\r\\n};\\r\\nconst getVersion = function () {\\r\\n var _a;\\r\\n return ((_a = document.querySelector('meta[name=\\\"version\\\"]')) === null || _a === void 0 ? void 0 : _a.content) || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_VERSION;\\r\\n}; // Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\\r\\nconst supportsEmoji = function () {\\r\\n const canvas = document.createElement(\\\"canvas\\\");\\r\\n const ctx = canvas.getContext(\\\"2d\\\");\\r\\n if (!ctx) {\\r\\n return false;\\r\\n }\\r\\n const offset = 12;\\r\\n ctx.fillStyle = \\\"#f00\\\";\\r\\n ctx.textBaseline = \\\"top\\\";\\r\\n ctx.font = \\\"32px Arial\\\"; // Modernizr used 🐨, but it is sort of supported on Windows 7.\\r\\n // Luckily 😀 isn't supported.\\r\\n ctx.fillText(\\\"😀\\\", 0, 0);\\r\\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\\r\\n};\\r\\nconst getNearestScrollableContainer = function (element) {\\r\\n let parent = element.parentElement;\\r\\n while (parent) {\\r\\n if (parent === document.body) {\\r\\n return document;\\r\\n }\\r\\n const { overflowY } = window.getComputedStyle(parent);\\r\\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\\r\\n if (hasScrollableContent && (overflowY === \\\"auto\\\" || overflowY === \\\"scroll\\\" || overflowY === \\\"overlay\\\")) {\\r\\n return parent;\\r\\n }\\r\\n parent = parent.parentElement;\\r\\n }\\r\\n return document;\\r\\n};\\r\\nconst focusNearestParent = function (element) {\\r\\n let parent = element.parentElement;\\r\\n while (parent) {\\r\\n if (parent.tabIndex > -1) {\\r\\n parent.focus();\\r\\n return;\\r\\n }\\r\\n parent = parent.parentElement;\\r\\n }\\r\\n};\\r\\nconst preventUnload = function (event) {\\r\\n event.preventDefault(); // NOTE: modern browsers no longer allow showing a custom message here\\r\\n event.returnValue = \\\"\\\";\\r\\n};\\r\\nconst bytesToHexString = function (bytes) {\\r\\n return Array.from(bytes).map(function (byte) {\\r\\n return `0${byte.toString(16)}`.slice(-2);\\r\\n }).join(\\\"\\\");\\r\\n};\\r\\nconst getUpdatedTimestamp = function () {\\r\\n return isTestEnv() ? 1 : Date.now();\\r\\n};\\r\\n/**\\r\\n * Transforms array of objects containing `id` attribute,\\r\\n * or array of ids (strings), into a Map, keyd by `id`.\\r\\n */\\r\\nconst arrayToMap = function (items) {\\r\\n return items.reduce(function (acc, element) {\\r\\n acc.set(typeof element === \\\"string\\\" ? element : element.id, element);\\r\\n return acc;\\r\\n }, new Map());\\r\\n};\\r\\nconst isTestEnv = function () {\\r\\n var _a;\\r\\n return typeof process !== \\\"undefined\\\" && ((_a = ({\\\"REACT_APP_BACKEND_V2_GET_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/\\\",\\\"REACT_APP_BACKEND_V2_POST_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/post/\\\",\\\"REACT_APP_LIBRARY_URL\\\":\\\"https://libraries.excalidraw.com\\\",\\\"REACT_APP_LIBRARY_BACKEND\\\":\\\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\\\",\\\"REACT_APP_WS_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_PORTAL_URL\\\":\\\"\\\",\\\"REACT_APP_FIREBASE_CONFIG\\\":\\\"{\\\\\\\"apiKey\\\\\\\":\\\\\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\\\\\",\\\\\\\"authDomain\\\\\\\":\\\\\\\"excalidraw-oss-dev.firebaseapp.com\\\\\\\",\\\\\\\"projectId\\\\\\\":\\\\\\\"excalidraw-oss-dev\\\\\\\",\\\\\\\"storageBucket\\\\\\\":\\\\\\\"excalidraw-oss-dev.appspot.com\\\\\\\",\\\\\\\"messagingSenderId\\\\\\\":\\\\\\\"664559512677\\\\\\\",\\\\\\\"appId\\\\\\\":\\\\\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\\\\\"}\\\",\\\"REACT_APP_DEV_ENABLE_SW\\\":\\\"\\\",\\\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\\\":\\\"\\\",\\\"PKG_NAME\\\":\\\"@zsviczian/excalidraw\\\",\\\"PKG_VERSION\\\":\\\"0.12.0-obsidian-1\\\",\\\"IS_EXCALIDRAW_NPM_PACKAGE\\\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \\\"test\\\";\\r\\n};\\r\\nconst isProdEnv = function () {\\r\\n var _a;\\r\\n return typeof process !== \\\"undefined\\\" && ((_a = ({\\\"REACT_APP_BACKEND_V2_GET_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/\\\",\\\"REACT_APP_BACKEND_V2_POST_URL\\\":\\\"https://json-dev.excalidraw.com/api/v2/post/\\\",\\\"REACT_APP_LIBRARY_URL\\\":\\\"https://libraries.excalidraw.com\\\",\\\"REACT_APP_LIBRARY_BACKEND\\\":\\\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\\\",\\\"REACT_APP_WS_SERVER_URL\\\":\\\"http://localhost:3002\\\",\\\"REACT_APP_PORTAL_URL\\\":\\\"\\\",\\\"REACT_APP_FIREBASE_CONFIG\\\":\\\"{\\\\\\\"apiKey\\\\\\\":\\\\\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\\\\\",\\\\\\\"authDomain\\\\\\\":\\\\\\\"excalidraw-oss-dev.firebaseapp.com\\\\\\\",\\\\\\\"projectId\\\\\\\":\\\\\\\"excalidraw-oss-dev\\\\\\\",\\\\\\\"storageBucket\\\\\\\":\\\\\\\"excalidraw-oss-dev.appspot.com\\\\\\\",\\\\\\\"messagingSenderId\\\\\\\":\\\\\\\"664559512677\\\\\\\",\\\\\\\"appId\\\\\\\":\\\\\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\\\\\"}\\\",\\\"REACT_APP_DEV_ENABLE_SW\\\":\\\"\\\",\\\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\\\":\\\"\\\",\\\"PKG_NAME\\\":\\\"@zsviczian/excalidraw\\\",\\\"PKG_VERSION\\\":\\\"0.12.0-obsidian-1\\\",\\\"IS_EXCALIDRAW_NPM_PACKAGE\\\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \\\"production\\\";\\r\\n};\\r\\nconst wrapEvent = function (name, nativeEvent) {\\r\\n return new CustomEvent(name, {\\r\\n detail: {\\r\\n nativeEvent\\r\\n },\\r\\n cancelable: true\\r\\n });\\r\\n};\\r\\nconst updateObject = function (obj, updates) {\\r\\n let didChange = false;\\r\\n for (const key in updates) {\\r\\n const value = updates[key];\\r\\n if (typeof value !== \\\"undefined\\\") {\\r\\n if (obj[key] === value && ( // if object, always update because its attrs could have changed\\r\\n typeof value !== \\\"object\\\" || value === null)) {\\r\\n continue;\\r\\n }\\r\\n didChange = true;\\r\\n }\\r\\n }\\r\\n if (!didChange) {\\r\\n return obj;\\r\\n }\\r\\n return _objectSpread(_objectSpread({}, obj), updates);\\r\\n};\\r\\nconst isPrimitive = function (val) {\\r\\n const type = typeof val;\\r\\n return val == null || type !== \\\"object\\\" && type !== \\\"function\\\";\\r\\n};\\r\\nconst getFrame = function () {\\r\\n try {\\r\\n return window.self === window.top ? \\\"top\\\" : \\\"iframe\\\";\\r\\n }\\r\\n catch (error) {\\r\\n return \\\"iframe\\\";\\r\\n }\\r\\n};\\r\\nconst isPromiseLike = function (value) {\\r\\n return !!value && typeof value === \\\"object\\\" && \\\"then\\\" in value && \\\"catch\\\" in value && \\\"finally\\\" in value;\\r\\n};\\r\\nconst queryFocusableElements = function (container) {\\r\\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\\\"button, a, input, select, textarea, div[tabindex], label[tabindex]\\\");\\r\\n return focusableElements ? Array.from(focusableElements).filter(function (element) {\\r\\n return element.tabIndex > -1 && !element.disabled;\\r\\n }) : [];\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q2pCO0FBQ0gsQ0FBQyxDQUFDO0FBQ0ssTUFBTSxhQUFhLEdBQUcsVUFBVSxLQUFLO0lBQzFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLEtBQUssSUFBSSxPQUFPLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxLQUFLLENBQUM7QUFDM0csQ0FBQyxDQUFDO0FBQ0ssTUFBTSxzQkFBc0IsR0FBRyxVQUFVLFNBQVM7SUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsZ0JBQWdCLENBQUMsb0VBQW9FLENBQUMsQ0FBQztJQUM1SCxPQUFPLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsT0FBTztRQUMvRSxPQUFPLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDVixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vdXRpbHMudHM/YjFkYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBvYyBmcm9tIFwib3Blbi1jb2xvclwiO1xuaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi9jb2xvcnNcIjtcbmltcG9ydCB7IENVUlNPUl9UWVBFLCBERUZBVUxUX1ZFUlNJT04sIEZPTlRfRkFNSUxZLCBNSU1FX1RZUEVTLCBUSEVNRSwgV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IGlzRGFyd2luIH0gZnJvbSBcIi4va2V5c1wiO1xubGV0IG1vY2tEYXRlVGltZSA9IG51bGw7XG5leHBvcnQgY29uc3Qgc2V0RGF0ZVRpbWVGb3JUZXN0cyA9IGZ1bmN0aW9uIChkYXRlVGltZSkge1xuICBtb2NrRGF0ZVRpbWUgPSBkYXRlVGltZTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RGF0ZVRpbWUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChtb2NrRGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gbW9ja0RhdGVUaW1lO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IG1vbnRoID0gYCR7ZGF0ZS5nZXRNb250aCgpICsgMX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgZGF5ID0gYCR7ZGF0ZS5nZXREYXRlKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IGhyID0gYCR7ZGF0ZS5nZXRIb3VycygpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBtaW4gPSBgJHtkYXRlLmdldE1pbnV0ZXMoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fS0ke2hyfSR7bWlufWA7XG59O1xuZXhwb3J0IGNvbnN0IGNhcGl0YWxpemVTdHJpbmcgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG59O1xuZXhwb3J0IGNvbnN0IGlzVG9vbEljb24gPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY2xhc3NOYW1lLmluY2x1ZGVzKFwiVG9vbEljb25cIik7XG59O1xuZXhwb3J0IGNvbnN0IGlzSW5wdXRMaWtlID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8IHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50O1xufTtcbmV4cG9ydCBjb25zdCBpc1dyaXRhYmxlRWxlbWVudCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5kYXRhc2V0LnR5cGUgPT09IFwid3lzaXd5Z1wiIHx8IHRhcmdldCBpbnN0YW5jZW9mIEhUTUxCUkVsZW1lbnQgfHwgLy8gbmV3bGluZSBpbiB3eXNpd3lnXG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiAodGFyZ2V0LnR5cGUgPT09IFwidGV4dFwiIHx8IHRhcmdldC50eXBlID09PSBcIm51bWJlclwiKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0Rm9udEZhbWlseVN0cmluZyA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gIGxldCB7XG4gICAgZm9udEZhbWlseVxuICB9ID0gX3JlZjtcblxuICBmb3IgKGNvbnN0IFtmb250RmFtaWx5U3RyaW5nLCBpZF0gb2YgT2JqZWN0LmVudHJpZXMoRk9OVF9GQU1JTFkpKSB7XG4gICAgaWYgKGlkID09PSBmb250RmFtaWx5KSB7XG4gICAgICByZXR1cm4gYCR7Zm9udEZhbWlseVN0cmluZ30sICR7V0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UfWA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFdJTkRPV1NfRU1PSklfRkFMTEJBQ0tfRk9OVDtcbn07XG4vKiogcmV0dXJucyBmb250U2l6ZStmb250RmFtaWx5IHN0cmluZyBmb3IgYXNzaWdubWVudCB0byBET00gZWxlbWVudHMgKi9cblxuZXhwb3J0IGNvbnN0IGdldEZvbnRTdHJpbmcgPSBmdW5jdGlvbiAoX3JlZjIpIHtcbiAgbGV0IHtcbiAgICBmb250U2l6ZSxcbiAgICBmb250RmFtaWx5XG4gIH0gPSBfcmVmMjtcbiAgcmV0dXJuIGAke2ZvbnRTaXplfXB4ICR7Z2V0Rm9udEZhbWlseVN0cmluZyh7XG4gICAgZm9udEZhbWlseVxuICB9KX1gO1xufTtcbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IGZ1bmN0aW9uIChmbiwgdGltZW91dCkge1xuICBsZXQgaGFuZGxlID0gMDtcbiAgbGV0IGxhc3RBcmdzID0gbnVsbDtcblxuICBjb25zdCByZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGxhc3RBcmdzID0gYXJncztcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBoYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfTtcblxuICByZXQuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG5cbiAgICBpZiAobGFzdEFyZ3MpIHtcbiAgICAgIGNvbnN0IF9sYXN0QXJncyA9IGxhc3RBcmdzO1xuICAgICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgICAgZm4oLi4uX2xhc3RBcmdzKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0LmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gIH07XG5cbiAgcmV0dXJuIHJldDtcbn07IC8vIHRocm90dGxlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgb25jZSBwZXIgYW5pbWF0aW9uIGZyYW1lXG5cbmV4cG9ydCBjb25zdCB0aHJvdHRsZVJBRiA9IGZ1bmN0aW9uIChmbiwgb3B0cykge1xuICBsZXQgdGltZXJJZCA9IG51bGw7XG4gIGxldCBsYXN0QXJncyA9IG51bGw7XG4gIGxldCBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcblxuICBjb25zdCBzY2hlZHVsZUZ1bmMgPSBmdW5jdGlvbiAoYXJncykge1xuICAgIHRpbWVySWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG5cbiAgICAgIGlmIChsYXN0QXJnc1RyYWlsaW5nKSB7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdEFyZ3NUcmFpbGluZztcbiAgICAgICAgbGFzdEFyZ3NUcmFpbGluZyA9IG51bGw7XG4gICAgICAgIHNjaGVkdWxlRnVuYyhsYXN0QXJncyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcmV0ID0gZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxhc3RBcmdzID0gYXJncztcblxuICAgIGlmICh0aW1lcklkID09PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgIH0gZWxzZSBpZiAob3B0cz8udHJhaWxpbmcpIHtcbiAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBhcmdzO1xuICAgIH1cbiAgfTtcblxuICByZXQuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRpbWVySWQpO1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBmbiguLi4obGFzdEFyZ3NUcmFpbGluZyB8fCBsYXN0QXJncykpO1xuICAgICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgcmV0LmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuXG4gICAgaWYgKHRpbWVySWQgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRpbWVySWQpO1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiByZXQ7XG59OyAvLyBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL2VzL2NodW5rLmpzXG5cbmV4cG9ydCBjb25zdCBjaHVuayA9IGZ1bmN0aW9uIChhcnJheSwgc2l6ZSkge1xuICBpZiAoIWFycmF5Lmxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCByZXNJbmRleCA9IDA7XG4gIGNvbnN0IHJlc3VsdCA9IEFycmF5KE1hdGguY2VpbChhcnJheS5sZW5ndGggLyBzaXplKSk7XG5cbiAgd2hpbGUgKGluZGV4IDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYXJyYXkuc2xpY2UoaW5kZXgsIGluZGV4ICs9IHNpemUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnQgY29uc3Qgc2VsZWN0Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCByZW1vdmVTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IGRpc3RhbmNlID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHggLSB5KTtcbn07XG5leHBvcnQgY29uc3QgdXBkYXRlQWN0aXZlVG9vbCA9IGZ1bmN0aW9uIChhcHBTdGF0ZSwgZGF0YSkge1xuICBpZiAoZGF0YS50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYXBwU3RhdGUuYWN0aXZlVG9vbCksIHt9LCB7XG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgY3VzdG9tVHlwZTogZGF0YS5jdXN0b21UeXBlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBhcHBTdGF0ZS5hY3RpdmVUb29sKSwge30sIHtcbiAgICBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcjogZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciA9PT0gdW5kZWZpbmVkID8gYXBwU3RhdGUuYWN0aXZlVG9vbC5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciA6IGRhdGEubGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXIsXG4gICAgdHlwZTogZGF0YS50eXBlLFxuICAgIGN1c3RvbVR5cGU6IG51bGxcbiAgfSk7XG59O1xuZXhwb3J0IGNvbnN0IHJlc2V0Q3Vyc29yID0gZnVuY3Rpb24gKGNhbnZhcykge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yID0gZnVuY3Rpb24gKGNhbnZhcywgY3Vyc29yKSB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xubGV0IGVyYXNlckNhbnZhc0NhY2hlO1xubGV0IHByZXZpZXdEYXRhVVJMO1xuZXhwb3J0IGNvbnN0IHNldEVyYXNlckN1cnNvciA9IGZ1bmN0aW9uIChjYW52YXMsIHRoZW1lKSB7XG4gIGNvbnN0IGN1cnNvckltYWdlU2l6ZVB4ID0gMjA7XG5cbiAgY29uc3QgZHJhd0NhbnZhcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpc0RhcmtUaGVtZSA9IHRoZW1lID09PSBUSEVNRS5EQVJLO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSA9IHRoZW1lO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgY29uc3QgY29udGV4dCA9IGVyYXNlckNhbnZhc0NhY2hlLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDE7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0LmFyYyhlcmFzZXJDYW52YXNDYWNoZS53aWR0aCAvIDIsIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCAvIDIsIDUsIDAsIDIgKiBNYXRoLlBJKTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGlzRGFya1RoZW1lID8gb2MuYmxhY2sgOiBvYy53aGl0ZTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy53aGl0ZSA6IG9jLmJsYWNrO1xuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgcHJldmlld0RhdGFVUkwgPSBlcmFzZXJDYW52YXNDYWNoZS50b0RhdGFVUkwoTUlNRV9UWVBFUy5zdmcpO1xuICB9O1xuXG4gIGlmICghZXJhc2VyQ2FudmFzQ2FjaGUgfHwgZXJhc2VyQ2FudmFzQ2FjaGUudGhlbWUgIT09IHRoZW1lKSB7XG4gICAgZHJhd0NhbnZhcygpO1xuICB9XG5cbiAgc2V0Q3Vyc29yKGNhbnZhcywgYHVybCgke3ByZXZpZXdEYXRhVVJMfSkgJHtjdXJzb3JJbWFnZVNpemVQeCAvIDJ9ICR7Y3Vyc29ySW1hZ2VTaXplUHggLyAyfSwgYXV0b2ApO1xufTtcbmV4cG9ydCBjb25zdCBzZXRDdXJzb3JGb3JTaGFwZSA9IGZ1bmN0aW9uIChjYW52YXMsIGFwcFN0YXRlKSB7XG4gIGlmICghY2FudmFzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gIH0gZWxzZSBpZiAoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImVyYXNlclwiKSB7XG4gICAgc2V0RXJhc2VyQ3Vyc29yKGNhbnZhcywgYXBwU3RhdGUudGhlbWUpOyAvLyBkbyBub3RoaW5nIGlmIGltYWdlIHRvb2wgaXMgc2VsZWN0ZWQgd2hpY2ggc3VnZ2VzdHMgdGhlcmUnc1xuICAgIC8vIGEgaW1hZ2UtcHJldmlldyBzZXQgYXMgdGhlIGN1cnNvclxuICAgIC8vIElnbm9yZSBjdXN0b20gdHlwZSBhcyB3ZWxsIGFuZCBsZXQgaG9zdCBkZWNpZGVcbiAgfSBlbHNlIGlmICghW1wiaW1hZ2VcIiwgXCJjdXN0b21cIl0uaW5jbHVkZXMoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlKSkge1xuICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSBDVVJTT1JfVFlQRS5DUk9TU0hBSVI7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgaXNGdWxsU2NyZWVuID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQ/Lm5vZGVOYW1lID09PSBcIkhUTUxcIjtcbn07XG5leHBvcnQgY29uc3QgYWxsb3dGdWxsU2NyZWVuID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKCk7XG59O1xuZXhwb3J0IGNvbnN0IGV4aXRGdWxsU2NyZWVuID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0U2hvcnRjdXRLZXkgPSBmdW5jdGlvbiAoc2hvcnRjdXQpIHtcbiAgc2hvcnRjdXQgPSBzaG9ydGN1dC5yZXBsYWNlKC9cXGJBbHRcXGIvaSwgXCJBbHRcIikucmVwbGFjZSgvXFxiU2hpZnRcXGIvaSwgXCJTaGlmdFwiKS5yZXBsYWNlKC9cXGIoRW50ZXJ8UmV0dXJuKVxcYi9pLCBcIkVudGVyXCIpLnJlcGxhY2UoL1xcYkRlbFxcYi9pLCBcIkRlbGV0ZVwiKTtcblxuICBpZiAoaXNEYXJ3aW4pIHtcbiAgICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2ksIFwiQ21kXCIpLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIk9wdGlvblwiKTtcbiAgfVxuXG4gIHJldHVybiBzaG9ydGN1dC5yZXBsYWNlKC9cXGJDdHJsT3JDbWRcXGIvaSwgXCJDdHJsXCIpO1xufTtcbmV4cG9ydCBjb25zdCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMgPSBmdW5jdGlvbiAoX3JlZjMsIF9yZWY0KSB7XG4gIGxldCB7XG4gICAgY2xpZW50WCxcbiAgICBjbGllbnRZXG4gIH0gPSBfcmVmMztcbiAgbGV0IHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWVxuICB9ID0gX3JlZjQ7XG4gIGNvbnN0IGludlNjYWxlID0gMSAvIHpvb20udmFsdWU7XG4gIGNvbnN0IHggPSAoY2xpZW50WCAtIG9mZnNldExlZnQpICogaW52U2NhbGUgLSBzY3JvbGxYO1xuICBjb25zdCB5ID0gKGNsaWVudFkgLSBvZmZzZXRUb3ApICogaW52U2NhbGUgLSBzY3JvbGxZO1xuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMgPSBmdW5jdGlvbiAoX3JlZjUsIF9yZWY2KSB7XG4gIGxldCB7XG4gICAgc2NlbmVYLFxuICAgIHNjZW5lWVxuICB9ID0gX3JlZjU7XG4gIGxldCB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFlcbiAgfSA9IF9yZWY2O1xuICBjb25zdCB4ID0gKHNjZW5lWCArIHNjcm9sbFgpICogem9vbS52YWx1ZSArIG9mZnNldExlZnQ7XG4gIGNvbnN0IHkgPSAoc2NlbmVZICsgc2Nyb2xsWSkgKiB6b29tLnZhbHVlICsgb2Zmc2V0VG9wO1xuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBnZXRHbG9iYWxDU1NWYXJpYWJsZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShgLS0ke25hbWV9YCk7XG59O1xuY29uc3QgUlNfTFRSX0NIQVJTID0gXCJBLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyQjhcXHUwMzAwLVxcdTA1OTBcXHUwODAwLVxcdTFGRkZcIiArIFwiXFx1MkMwMC1cXHVGQjFDXFx1RkRGRS1cXHVGRTZGXFx1RkVGRC1cXHVGRkZGXCI7XG5jb25zdCBSU19SVExfQ0hBUlMgPSBcIlxcdTA1OTEtXFx1MDdGRlxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ1wiO1xuY29uc3QgUkVfUlRMX0NIRUNLID0gbmV3IFJlZ0V4cChgXlteJHtSU19MVFJfQ0hBUlN9XSpbJHtSU19SVExfQ0hBUlN9XWApO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBmaXJzdCBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIgaXMgUlRMLiBNZWFuaW5nIHdoZXRoZXIgaXQgc3RhcnRzXG4gKiAgd2l0aCBSVEwgY2hhcmFjdGVycywgb3IgaW5kZXRlcm1pbmF0ZSAobnVtYmVycyBldGMuKSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5XG4gKiAgUlRMLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC8xNzIyI2Rpc2N1c3Npb25fcjQzNjM0MDE3MVxuICovXG5cbmV4cG9ydCBjb25zdCBpc1JUTCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIHJldHVybiBSRV9SVExfQ0hFQ0sudGVzdCh0ZXh0KTtcbn07XG5leHBvcnQgY29uc3QgdHVwbGVUb0Nvb3JzID0gZnVuY3Rpb24gKHh5VHVwbGUpIHtcbiAgY29uc3QgW3gsIHldID0geHlUdXBsZTtcbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHlcbiAgfTtcbn07XG4vKiogdXNlIGFzIGEgcmVqZWN0aW9uSGFuZGxlciB0byBtdXRlIGZpbGVzeXN0ZW0gQWJvcnQgZXJyb3JzICovXG5cbmV4cG9ydCBjb25zdCBtdXRlRlNBYm9ydEVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gIGlmIChlcnJvcj8ubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHtcbiAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IGVycm9yO1xufTtcbmV4cG9ydCBjb25zdCBmaW5kSW5kZXggPSBmdW5jdGlvbiAoYXJyYXksIGNiKSB7XG4gIGxldCBmcm9tSW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7XG5cbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cblxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGgsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggLSAxO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgaWYgKGNiKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn07XG5leHBvcnQgY29uc3QgZmluZExhc3RJbmRleCA9IGZ1bmN0aW9uIChhcnJheSwgY2IpIHtcbiAgbGV0IGZyb21JbmRleCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyYXkubGVuZ3RoIC0gMTtcblxuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuXG4gIGZyb21JbmRleCA9IE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuXG4gIHdoaWxlICgtLWluZGV4ID4gLTEpIHtcbiAgICBpZiAoY2IoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufTtcbmV4cG9ydCBjb25zdCBpc1RyYW5zcGFyZW50ID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gIGNvbnN0IGlzUkdCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDUgJiYgY29sb3Iuc3Vic3RyKDQsIDEpID09PSBcIjBcIjtcbiAgY29uc3QgaXNSUkdHQkJUcmFuc3BhcmVudCA9IGNvbG9yLmxlbmd0aCA9PT0gOSAmJiBjb2xvci5zdWJzdHIoNywgMikgPT09IFwiMDBcIjtcbiAgcmV0dXJuIGlzUkdCVHJhbnNwYXJlbnQgfHwgaXNSUkdHQkJUcmFuc3BhcmVudCB8fCBjb2xvciA9PT0gY29sb3JzLmVsZW1lbnRCYWNrZ3JvdW5kWzBdO1xufTtcbmV4cG9ydCBjb25zdCByZXNvbHZhYmxlUHJvbWlzZSA9IGZ1bmN0aW9uICgpIHtcbiAgbGV0IHJlc29sdmU7XG4gIGxldCByZWplY3Q7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAoX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIHByb21pc2UucmVzb2x2ZSA9IHJlc29sdmU7XG4gIHByb21pc2UucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZTtcbn07XG4vKipcbiAqIEBwYXJhbSBmdW5jIGhhbmRsZXIgdGFraW5nIGF0IG1vc3Qgc2luZ2xlIHBhcmFtZXRlciAoZXZlbnQpLlxuICovXG5cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXMgPSBmdW5jdGlvbiAoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYywgZXZlbnQpO1xuICB9O1xufTtcbi8qKlxuICogYmFyY2hlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIGFuZCB0aHJvdHRsZXMgdGhlIGNhbGxzIHRvIGEgc2luZ2xlIGNhbGwgcGVyXG4gKiBhbmltYXRpb24gZnJhbWVcbiAqL1xuXG5leHBvcnQgY29uc3Qgd2l0aEJhdGNoZWRVcGRhdGVzVGhyb3R0bGVkID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gdGhyb3R0bGVSQUYoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYywgZXZlbnQpO1xuICB9KTtcbn07IC8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuXG5leHBvcnQgY29uc3QgbkZvcm1hdHRlciA9IGZ1bmN0aW9uIChudW0sIGRpZ2l0cykge1xuICBjb25zdCBzaSA9IFt7XG4gICAgdmFsdWU6IDEsXG4gICAgc3ltYm9sOiBcImJcIlxuICB9LCB7XG4gICAgdmFsdWU6IDFlMyxcbiAgICBzeW1ib2w6IFwia1wiXG4gIH0sIHtcbiAgICB2YWx1ZTogMWU2LFxuICAgIHN5bWJvbDogXCJNXCJcbiAgfSwge1xuICAgIHZhbHVlOiAxZTksXG4gICAgc3ltYm9sOiBcIkdcIlxuICB9XTtcbiAgY29uc3QgcnggPSAvXFwuMCskfChcXC5bMC05XSpbMS05XSkwKyQvO1xuICBsZXQgaW5kZXg7XG5cbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKG51bSAvIHNpW2luZGV4XS52YWx1ZSkudG9GaXhlZChkaWdpdHMpLnJlcGxhY2UocngsIFwiJDFcIikgKyBzaVtpbmRleF0uc3ltYm9sO1xufTtcbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8IERFRkFVTFRfVkVSU0lPTjtcbn07IC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvZW1vamkuanNcblxuZXhwb3J0IGNvbnN0IHN1cHBvcnRzRW1vamkgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSAxMjtcbiAgY3R4LmZpbGxTdHlsZSA9IFwiI2YwMFwiO1xuICBjdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcbiAgY3R4LmZvbnQgPSBcIjMycHggQXJpYWxcIjsgLy8gTW9kZXJuaXpyIHVzZWQg8J+QqCwgYnV0IGl0IGlzIHNvcnQgb2Ygc3VwcG9ydGVkIG9uIFdpbmRvd3MgNy5cbiAgLy8gTHVja2lseSDwn5iAIGlzbid0IHN1cHBvcnRlZC5cblxuICBjdHguZmlsbFRleHQoXCLwn5iAXCIsIDAsIDApO1xuICByZXR1cm4gY3R4LmdldEltYWdlRGF0YShvZmZzZXQsIG9mZnNldCwgMSwgMSkuZGF0YVswXSAhPT0gMDtcbn07XG5leHBvcnQgY29uc3QgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgb3ZlcmZsb3dZXG4gICAgfSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudCk7XG4gICAgY29uc3QgaGFzU2Nyb2xsYWJsZUNvbnRlbnQgPSBwYXJlbnQuc2Nyb2xsSGVpZ2h0ID4gcGFyZW50LmNsaWVudEhlaWdodDtcblxuICAgIGlmIChoYXNTY3JvbGxhYmxlQ29udGVudCAmJiAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fCBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHwgb3ZlcmZsb3dZID09PSBcIm92ZXJsYXlcIikpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gZG9jdW1lbnQ7XG59O1xuZXhwb3J0IGNvbnN0IGZvY3VzTmVhcmVzdFBhcmVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGlmIChwYXJlbnQudGFiSW5kZXggPiAtMSkge1xuICAgICAgcGFyZW50LmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgcHJldmVudFVubG9hZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBOT1RFOiBtb2Rlcm4gYnJvd3NlcnMgbm8gbG9uZ2VyIGFsbG93IHNob3dpbmcgYSBjdXN0b20gbWVzc2FnZSBoZXJlXG5cbiAgZXZlbnQucmV0dXJuVmFsdWUgPSBcIlwiO1xufTtcbmV4cG9ydCBjb25zdCBieXRlc1RvSGV4U3RyaW5nID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKS5tYXAoZnVuY3Rpb24gKGJ5dGUpIHtcbiAgICByZXR1cm4gYDAke2J5dGUudG9TdHJpbmcoMTYpfWAuc2xpY2UoLTIpO1xuICB9KS5qb2luKFwiXCIpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRVcGRhdGVkVGltZXN0YW1wID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaXNUZXN0RW52KCkgPyAxIDogRGF0ZS5ub3coKTtcbn07XG4vKipcbiAqIFRyYW5zZm9ybXMgYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGBpZGAgYXR0cmlidXRlLFxuICogb3IgYXJyYXkgb2YgaWRzIChzdHJpbmdzKSwgaW50byBhIE1hcCwga2V5ZCBieSBgaWRgLlxuICovXG5cbmV4cG9ydCBjb25zdCBhcnJheVRvTWFwID0gZnVuY3Rpb24gKGl0ZW1zKSB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZWxlbWVudCkge1xuICAgIGFjYy5zZXQodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIgPyBlbGVtZW50IDogZWxlbWVudC5pZCwgZWxlbWVudCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgbmV3IE1hcCgpKTtcbn07XG5leHBvcnQgY29uc3QgaXNUZXN0RW52ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInRlc3RcIjtcbn07XG5leHBvcnQgY29uc3QgaXNQcm9kRW52ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIjtcbn07XG5leHBvcnQgY29uc3Qgd3JhcEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBuZXcgQ3VzdG9tRXZlbnQobmFtZSwge1xuICAgIGRldGFpbDoge1xuICAgICAgbmF0aXZlRXZlbnRcbiAgICB9LFxuICAgIGNhbmNlbGFibGU6IHRydWVcbiAgfSk7XG59O1xuZXhwb3J0IGNvbnN0IHVwZGF0ZU9iamVjdCA9IGZ1bmN0aW9uIChvYmosIHVwZGF0ZXMpIHtcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHVwZGF0ZXNba2V5XTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChvYmpba2V5XSA9PT0gdmFsdWUgJiYgKCAvLyBpZiBvYmplY3QsIGFsd2F5cyB1cGRhdGUgYmVjYXVzZSBpdHMgYXR0cnMgY291bGQgaGF2ZSBjaGFuZ2VkXG4gICAgICB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9iaiksIHVwZGF0ZXMpO1xufTtcbmV4cG9ydCBjb25zdCBpc1ByaW1pdGl2ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCB0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwiZnVuY3Rpb25cIjtcbn07XG5leHBvcnQgY29uc3QgZ2V0RnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5zZWxmID09PSB3aW5kb3cudG9wID8gXCJ0b3BcIiA6IFwiaWZyYW1lXCI7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFwiaWZyYW1lXCI7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgaXNQcm9taXNlTGlrZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJ0aGVuXCIgaW4gdmFsdWUgJiYgXCJjYXRjaFwiIGluIHZhbHVlICYmIFwiZmluYWxseVwiIGluIHZhbHVlO1xufTtcbmV4cG9ydCBjb25zdCBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbChcImJ1dHRvbiwgYSwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGRpdlt0YWJpbmRleF0sIGxhYmVsW3RhYmluZGV4XVwiKTtcbiAgcmV0dXJuIGZvY3VzYWJsZUVsZW1lbnRzID8gQXJyYXkuZnJvbShmb2N1c2FibGVFbGVtZW50cykuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQudGFiSW5kZXggPiAtMSAmJiAhZWxlbWVudC5kaXNhYmxlZDtcbiAgfSkgOiBbXTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///../../utils.ts\\n\");\n\n//# sourceURL=webpack://ExcalidrawLib/../../utils.ts?");
|
|
3174
3174
|
|
|
3175
3175
|
/***/ }),
|
|
3176
3176
|
|