@dwelle/excalidraw 0.3.23 → 0.3.27
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.
- package/CHANGELOG.md +10 -4
- package/README.md +2 -0
- package/dist/excalidraw-assets/image-2be1c869cd5bacebdc3c.js +1 -0
- package/dist/excalidraw.development.js +16 -16
- package/dist/excalidraw.production.min.js +2 -1
- package/package.json +4 -5
- package/types/components/LayerUI.d.ts +1 -1
- package/types/components/MobileMenu.d.ts +1 -1
- package/types/packages/excalidraw/dist/excalidraw-assets/image-2be1c869cd5bacebdc3c.d.ts +0 -0
- package/types/packages/excalidraw/webpack.dev.config.d.ts +5 -7
- package/types/packages/excalidraw/webpack.prod.config.d.ts +7 -7
- package/types/types.d.ts +2 -1
- package/dist/0adeb55dfbca17fad22e.woff2 +0 -1
- package/dist/be42d56e500bdd14ae50.woff2 +0 -1
- package/dist/d9454a7bea9e32f0c282.woff2 +0 -1
- package/dist/edf7912ad1921efb0e5c.woff2 +0 -1
- package/dist/excalidraw-assets/image-02a1f3ecd6baf42daaa6.js +0 -1
- package/dist/excalidraw-assets/image-0db17e06143a31f9772b.js +0 -1
- package/dist/excalidraw-assets/image-46f5e8e621bfedbf6d91.js +0 -1
- package/dist/excalidraw-assets/image-6f8d3b9873832b5f7a67.js +0 -1
- package/dist/excalidraw-assets/image-8e0c265e832504f62477.js +0 -1
- package/dist/excalidraw-assets/image-9592159c56d563857679.js +0 -1
- package/dist/excalidraw-assets/image-98a7b39bd21998c69c4b.js +0 -1
- package/dist/excalidraw-assets/image-a26261fb8a718f15853e.js +0 -1
- package/dist/excalidraw-assets/image-a97adda58b4c4d8d0107.js +0 -1
- package/dist/excalidraw-assets/image-af02967a8a4c328f2713.js +0 -1
- package/dist/excalidraw-assets/image-bd5991c772b4867c8d27.js +0 -1
- package/dist/excalidraw-assets/image-c198828284ec0dba28dc.js +0 -1
- package/dist/excalidraw-assets/image-eac20119cbc2ceb81523.js +0 -1
- package/dist/excalidraw-assets/image-eafab0c39ce13f7fea67.js +0 -1
- package/dist/excalidraw-assets/vendor-1018b0a7e7e60d808384.js +0 -2
- package/dist/excalidraw-assets/vendor-1018b0a7e7e60d808384.js.LICENSE.txt +0 -14
- package/dist/excalidraw-assets/vendor-405364e1fdefedf5d3d7.js +0 -2
- package/dist/excalidraw-assets/vendor-405364e1fdefedf5d3d7.js.LICENSE.txt +0 -14
- package/dist/excalidraw-assets/vendor-448ccb79e58765b61834.js +0 -2
- package/dist/excalidraw-assets/vendor-448ccb79e58765b61834.js.LICENSE.txt +0 -1
- package/dist/excalidraw-assets/vendor-585a4c89d479fd91edeb.js +0 -2
- package/dist/excalidraw-assets/vendor-585a4c89d479fd91edeb.js.LICENSE.txt +0 -1
- package/dist/excalidraw-assets/vendor-807e23d7531555236936.js +0 -2
- package/dist/excalidraw-assets/vendor-807e23d7531555236936.js.LICENSE.txt +0 -14
- package/dist/excalidraw-assets/vendor-b088910ac1ba8853a571.js +0 -2
- package/dist/excalidraw-assets/vendor-b088910ac1ba8853a571.js.LICENSE.txt +0 -8
- package/dist/excalidraw-assets/vendor-cb708a4580b007d81177.js +0 -2
- package/dist/excalidraw-assets/vendor-cb708a4580b007d81177.js.LICENSE.txt +0 -1
- package/dist/excalidraw-assets/vendor-ce466849186c701b6c48.js +0 -2
- package/dist/excalidraw-assets/vendor-ce466849186c701b6c48.js.LICENSE.txt +0 -14
- package/dist/excalidraw-assets/vendor-e5c6cd57013e8e575a61.js +0 -1
- package/dist/excalidraw-assets-dev/image-028ba554a42cc8a4995a.js +0 -42
- package/dist/excalidraw-assets-dev/image-664005f0b02c93342b89.js +0 -42
- package/dist/excalidraw-assets-dev/image-821afe7d20de2d2ca898.js +0 -42
- package/dist/excalidraw-assets-dev/image-9f771c114a0a3ad7b334.js +0 -42
- package/dist/excalidraw-assets-dev/image-a98d24ea9aa42940a0df.js +0 -42
- package/dist/excalidraw-assets-dev/image-b2befe1e2a0424a41fb3.js +0 -42
- package/dist/excalidraw-assets-dev/image-cacb3d0c02eb2e346ecc.js +0 -33
- package/dist/excalidraw-assets-dev/image-d7e941a51c2e0a7b3c23.js +0 -42
- package/dist/excalidraw-assets-dev/vendor-0454f90696ac835aeb45.js +0 -356
- package/dist/excalidraw-assets-dev/vendor-26ccabf52930f0ce0ffd.js +0 -334
- package/dist/excalidraw-assets-dev/vendor-5d1c4700bd0fa2109ab5.js +0 -334
- package/dist/excalidraw-assets-dev/vendor-7664c12c379862ed98a5.js +0 -356
- package/dist/excalidraw-assets-dev/vendor-7fcb99cece261da4983f.js +0 -344
- package/dist/excalidraw-assets-dev/vendor-bb07a412033591d5470d.js +0 -344
- package/dist/excalidraw-assets-dev/vendor-ec7db14ff9ba640888c4.js +0 -344
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkExcalidraw=self.webpackChunkExcalidraw||[]).push([[9],{673:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "decodePngMetadata": () => (/* binding */ decodePngMetadata),\n "decodeSvgMetadata": () => (/* binding */ decodeSvgMetadata),\n "encodePngMetadata": () => (/* binding */ encodePngMetadata),\n "encodeSvgMetadata": () => (/* binding */ encodeSvgMetadata),\n "getTEXtChunk": () => (/* binding */ getTEXtChunk)\n});\n\n// EXTERNAL MODULE: ../../../node_modules/png-chunks-extract/index.js\nvar png_chunks_extract = __webpack_require__(2983);\nvar png_chunks_extract_default = /*#__PURE__*/__webpack_require__.n(png_chunks_extract);\n// EXTERNAL MODULE: ../../../node_modules/png-chunk-text/index.js\nvar png_chunk_text = __webpack_require__(1194);\n// EXTERNAL MODULE: ../../../node_modules/png-chunks-encode/index.js\nvar png_chunks_encode = __webpack_require__(3434);\nvar png_chunks_encode_default = /*#__PURE__*/__webpack_require__.n(png_chunks_encode);\n// EXTERNAL MODULE: ../../../node_modules/pako/index.js\nvar pako = __webpack_require__(2744);\n// EXTERNAL MODULE: ../../constants.ts\nvar constants = __webpack_require__(8288);\n;// CONCATENATED MODULE: ../../data/encryption.ts\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (undefined && undefined.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError("Generator is already executing.");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\n\r\nvar IV_LENGTH_BYTES = 12;\r\nvar createIV = function () {\r\n var arr = new Uint8Array(IV_LENGTH_BYTES);\r\n return window.crypto.getRandomValues(arr);\r\n};\r\nvar generateEncryptionKey = function (returnAs) { return __awaiter(void 0, void 0, void 0, function () {\r\n var key, _a;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0: return [4 /*yield*/, window.crypto.subtle.generateKey({\r\n name: "AES-GCM",\r\n length: ENCRYPTION_KEY_BITS\r\n }, true, // extractable\r\n ["encrypt", "decrypt"])];\r\n case 1:\r\n key = _b.sent();\r\n if (!(returnAs === "cryptoKey")) return [3 /*break*/, 2];\r\n _a = key;\r\n return [3 /*break*/, 4];\r\n case 2: return [4 /*yield*/, window.crypto.subtle.exportKey("jwk", key)];\r\n case 3:\r\n _a = (_b.sent()).k;\r\n _b.label = 4;\r\n case 4: return [2 /*return*/, _a];\r\n }\r\n });\r\n}); };\r\nvar getCryptoKey = function (key, usage) { return window.crypto.subtle.importKey("jwk", {\r\n alg: "A128GCM",\r\n ext: true,\r\n k: key,\r\n key_ops: ["encrypt", "decrypt"],\r\n kty: "oct"\r\n}, {\r\n name: "AES-GCM",\r\n length: ENCRYPTION_KEY_BITS\r\n}, false, // extractable\r\n[usage]); };\r\nvar encryption_encryptData = function (key, data) { return __awaiter(void 0, void 0, void 0, function () {\r\n var importedKey, _a, iv, buffer, _b, _c, _d, encryptedBuffer;\r\n return __generator(this, function (_e) {\r\n switch (_e.label) {\r\n case 0:\r\n if (!(typeof key === "string")) return [3 /*break*/, 2];\r\n return [4 /*yield*/, getCryptoKey(key, "encrypt")];\r\n case 1:\r\n _a = _e.sent();\r\n return [3 /*break*/, 3];\r\n case 2:\r\n _a = key;\r\n _e.label = 3;\r\n case 3:\r\n importedKey = _a;\r\n iv = createIV();\r\n if (!(typeof data === "string")) return [3 /*break*/, 4];\r\n _b = new TextEncoder().encode(data);\r\n return [3 /*break*/, 10];\r\n case 4:\r\n if (!(data instanceof Uint8Array)) return [3 /*break*/, 5];\r\n _c = data;\r\n return [3 /*break*/, 9];\r\n case 5:\r\n if (!(data instanceof Blob)) return [3 /*break*/, 7];\r\n return [4 /*yield*/, data.arrayBuffer()];\r\n case 6:\r\n _d = _e.sent();\r\n return [3 /*break*/, 8];\r\n case 7:\r\n _d = data;\r\n _e.label = 8;\r\n case 8:\r\n _c = _d;\r\n _e.label = 9;\r\n case 9:\r\n _b = _c;\r\n _e.label = 10;\r\n case 10:\r\n buffer = _b;\r\n return [4 /*yield*/, window.crypto.subtle.encrypt({\r\n name: "AES-GCM",\r\n iv: iv\r\n }, importedKey, buffer)];\r\n case 11:\r\n encryptedBuffer = _e.sent();\r\n return [2 /*return*/, {\r\n encryptedBuffer: encryptedBuffer,\r\n iv: iv\r\n }];\r\n }\r\n });\r\n}); };\r\nvar encryption_decryptData = function (iv, encrypted, privateKey) { return __awaiter(void 0, void 0, void 0, function () {\r\n var key;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, getCryptoKey(privateKey, "decrypt")];\r\n case 1:\r\n key = _a.sent();\r\n return [2 /*return*/, window.crypto.subtle.decrypt({\r\n name: "AES-GCM",\r\n iv: iv\r\n }, key, encrypted)];\r\n }\r\n });\r\n}); };\r\n\n;// CONCATENATED MODULE: ../../data/encode.ts\nvar encode_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar encode_generator = (undefined && undefined.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError("Generator is already executing.");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\n\r\n // -----------------------------------------------------------------------------\r\n// byte (binary) strings\r\n// -----------------------------------------------------------------------------\r\n// fast, Buffer-compatible implem\r\nvar toByteString = function (data) {\r\n return new Promise(function (resolve, reject) {\r\n var blob = typeof data === "string" ? new Blob([new TextEncoder().encode(data)]) : new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)]);\r\n var reader = new FileReader();\r\n reader.onload = function (event) {\r\n if (!event.target || typeof event.target.result !== "string") {\r\n return reject(new Error("couldn\'t convert to byte string"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsBinaryString(blob);\r\n });\r\n};\r\nvar byteStringToArrayBuffer = function (byteString) {\r\n var buffer = new ArrayBuffer(byteString.length);\r\n var bufferView = new Uint8Array(buffer);\r\n for (var i = 0, len = byteString.length; i < len; i++) {\r\n bufferView[i] = byteString.charCodeAt(i);\r\n }\r\n return buffer;\r\n};\r\nvar byteStringToString = function (byteString) {\r\n return new TextDecoder("utf-8").decode(byteStringToArrayBuffer(byteString));\r\n}; // -----------------------------------------------------------------------------\r\n// base64\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * @param isByteString set to true if already byte string to prevent bloat\r\n * due to reencoding\r\n */\r\nvar stringToBase64 = function (str) {\r\n return encode_awaiter(this, arguments, void 0, function () {\r\n var isByteString, _a, _b, _c;\r\n return encode_generator(this, function (_d) {\r\n switch (_d.label) {\r\n case 0:\r\n isByteString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\r\n if (!isByteString) return [3 /*break*/, 1];\r\n _a = window.btoa(str);\r\n return [3 /*break*/, 3];\r\n case 1:\r\n _c = (_b = window).btoa;\r\n return [4 /*yield*/, toByteString(str)];\r\n case 2:\r\n _a = _c.apply(_b, [_d.sent()]);\r\n _d.label = 3;\r\n case 3: return [2 /*return*/, _a];\r\n }\r\n });\r\n });\r\n}; // async to align with stringToBase64\r\nvar base64ToString = function (base64) {\r\n return encode_awaiter(this, arguments, void 0, function () {\r\n var isByteString;\r\n return encode_generator(this, function (_a) {\r\n isByteString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\r\n return [2 /*return*/, isByteString ? window.atob(base64) : byteStringToString(window.atob(base64))];\r\n });\r\n });\r\n}; // -----------------------------------------------------------------------------\r\n// text encoding\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * Encodes (and potentially compresses via zlib) text to byte string\r\n */\r\nvar encode = function (_ref) { return encode_awaiter(void 0, void 0, void 0, function () {\r\n var text, compress, deflated, error_1, _a;\r\n var _b;\r\n return encode_generator(this, function (_c) {\r\n switch (_c.label) {\r\n case 0:\r\n text = _ref.text, compress = _ref.compress;\r\n if (!(compress !== false)) return [3 /*break*/, 4];\r\n _c.label = 1;\r\n case 1:\r\n _c.trys.push([1, 3, , 4]);\r\n return [4 /*yield*/, toByteString((0,pako.deflate)(text))];\r\n case 2:\r\n deflated = _c.sent();\r\n return [3 /*break*/, 4];\r\n case 3:\r\n error_1 = _c.sent();\r\n console.error("encode: cannot deflate", error_1);\r\n return [3 /*break*/, 4];\r\n case 4:\r\n _b = {\r\n version: "1",\r\n encoding: "bstring",\r\n compressed: !!deflated\r\n };\r\n _a = deflated;\r\n if (_a) return [3 /*break*/, 6];\r\n return [4 /*yield*/, toByteString(text)];\r\n case 5:\r\n _a = (_c.sent());\r\n _c.label = 6;\r\n case 6: return [2 /*return*/, (_b.encoded = _a,\r\n _b)];\r\n }\r\n });\r\n}); };\r\nvar decode = function (data) { return encode_awaiter(void 0, void 0, void 0, function () {\r\n var decoded, _a, _b;\r\n return encode_generator(this, function (_c) {\r\n switch (_c.label) {\r\n case 0:\r\n _a = data.encoding;\r\n switch (_a) {\r\n case "bstring": return [3 /*break*/, 1];\r\n }\r\n return [3 /*break*/, 5];\r\n case 1:\r\n if (!data.compressed) return [3 /*break*/, 2];\r\n _b = data.encoded;\r\n return [3 /*break*/, 4];\r\n case 2: return [4 /*yield*/, byteStringToString(data.encoded)];\r\n case 3:\r\n _b = _c.sent();\r\n _c.label = 4;\r\n case 4:\r\n // if compressed, do not double decode the bstring\r\n decoded = _b;\r\n return [3 /*break*/, 6];\r\n case 5: throw new Error("decode: unknown encoding \\"".concat(data.encoding, "\\""));\r\n case 6:\r\n if (data.compressed) {\r\n return [2 /*return*/, (0,pako.inflate)(new Uint8Array(byteStringToArrayBuffer(decoded)), {\r\n to: "string"\r\n })];\r\n }\r\n return [2 /*return*/, decoded];\r\n }\r\n });\r\n}); }; // -----------------------------------------------------------------------------\r\n// binary encoding\r\n// -----------------------------------------------------------------------------\r\n// -----------------------------------------------------------------------------\r\nvar CONCAT_BUFFERS_VERSION = 1;\r\n/** how many bytes we use to encode how many bytes the next chunk has.\r\n * Corresponds to DataView setter methods (setUint32, setUint16, etc).\r\n *\r\n * NOTE ! values must not be changed, which would be backwards incompatible !\r\n */\r\nvar VERSION_DATAVIEW_BYTES = 4;\r\nvar NEXT_CHUNK_SIZE_DATAVIEW_BYTES = 4; // -----------------------------------------------------------------------------\r\nvar DATA_VIEW_BITS_MAP = {\r\n 1: 8,\r\n 2: 16,\r\n 4: 32\r\n}; // getter\r\n/**\r\n * abstraction over DataView that serves as a typed getter/setter in case\r\n * you\'re using constants for the byte size and want to ensure there\'s no\r\n * discrepenancy in the encoding across refactors.\r\n *\r\n * DataView serves for an endian-agnostic handling of numbers in ArrayBuffers.\r\n */\r\nfunction dataView(buffer, bytes, offset, value) {\r\n if (value != null) {\r\n if (value > Math.pow(2, DATA_VIEW_BITS_MAP[bytes]) - 1) {\r\n throw new Error("attempting to set value higher than the allocated bytes (value: ".concat(value, ", bytes: ").concat(bytes, ")"));\r\n }\r\n var method_1 = "setUint".concat(DATA_VIEW_BITS_MAP[bytes]);\r\n new DataView(buffer.buffer)[method_1](offset, value);\r\n return buffer;\r\n }\r\n var method = "getUint".concat(DATA_VIEW_BITS_MAP[bytes]);\r\n return new DataView(buffer.buffer)[method](offset);\r\n} // -----------------------------------------------------------------------------\r\n/**\r\n * Resulting concatenated buffer has this format:\r\n *\r\n * [\r\n * VERSION chunk (4 bytes)\r\n * LENGTH chunk 1 (4 bytes)\r\n * DATA chunk 1 (up to 2^32 bits)\r\n * LENGTH chunk 2 (4 bytes)\r\n * DATA chunk 2 (up to 2^32 bits)\r\n * ...\r\n * ]\r\n *\r\n * @param buffers each buffer (chunk) must be at most 2^32 bits large (~4GB)\r\n */\r\nvar concatBuffers = function () {\r\n for (var _len = arguments.length, buffers = new Array(_len), _key = 0; _key < _len; _key++) {\r\n buffers[_key] = arguments[_key];\r\n }\r\n var bufferView = new Uint8Array(VERSION_DATAVIEW_BYTES + NEXT_CHUNK_SIZE_DATAVIEW_BYTES * buffers.length + buffers.reduce(function (acc, buffer) { return acc + buffer.byteLength; }, 0));\r\n var cursor = 0; // as the first chunk we\'ll encode the version for backwards compatibility\r\n dataView(bufferView, VERSION_DATAVIEW_BYTES, cursor, CONCAT_BUFFERS_VERSION);\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n for (var _i = 0, buffers_1 = buffers; _i < buffers_1.length; _i++) {\r\n var buffer = buffers_1[_i];\r\n dataView(bufferView, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor, buffer.byteLength);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n bufferView.set(buffer, cursor);\r\n cursor += buffer.byteLength;\r\n }\r\n return bufferView;\r\n};\r\n/** can only be used on buffers created via `concatBuffers()` */\r\nvar splitBuffers = function (concatenatedBuffer) {\r\n var buffers = [];\r\n var cursor = 0; // first chunk is the version\r\n var version = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor); // If version is outside of the supported versions, throw an error.\r\n // This usually means the buffer wasn\'t encoded using this API, so we\'d only\r\n // waste compute.\r\n if (version > CONCAT_BUFFERS_VERSION) {\r\n throw new Error("invalid version ".concat(version));\r\n }\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n while (true) {\r\n var chunkSize = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n buffers.push(concatenatedBuffer.slice(cursor, cursor + chunkSize));\r\n cursor += chunkSize;\r\n if (cursor >= concatenatedBuffer.byteLength) {\r\n break;\r\n }\r\n }\r\n return buffers;\r\n}; // helpers for (de)compressing data with JSON metadata including encryption\r\n// -----------------------------------------------------------------------------\r\n/** @private */\r\nvar _encryptAndCompress = function (data, encryptionKey) { return encode_awaiter(void 0, void 0, void 0, function () {\r\n var _a, encryptedBuffer, iv;\r\n return encode_generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0: return [4 /*yield*/, encryptData(encryptionKey, deflate(data))];\r\n case 1:\r\n _a = _b.sent(), encryptedBuffer = _a.encryptedBuffer, iv = _a.iv;\r\n return [2 /*return*/, {\r\n iv: iv,\r\n buffer: new Uint8Array(encryptedBuffer)\r\n }];\r\n }\r\n });\r\n}); };\r\n/**\r\n * The returned buffer has following format:\r\n * `[]` refers to a buffers wrapper (see `concatBuffers`)\r\n *\r\n * [\r\n * encodingMetadataBuffer,\r\n * iv,\r\n * [\r\n * contentsMetadataBuffer\r\n * contentsBuffer\r\n * ]\r\n * ]\r\n */\r\nvar compressData = function (dataBuffer, options) { return encode_awaiter(void 0, void 0, void 0, function () {\r\n var fileInfo, encodingMetadataBuffer, contentsMetadataBuffer, _a, iv, buffer;\r\n return encode_generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n fileInfo = {\r\n version: 2,\r\n compression: "pako@1",\r\n encryption: "AES-GCM"\r\n };\r\n encodingMetadataBuffer = new TextEncoder().encode(JSON.stringify(fileInfo));\r\n contentsMetadataBuffer = new TextEncoder().encode(JSON.stringify(options.metadata || null));\r\n return [4 /*yield*/, _encryptAndCompress(concatBuffers(contentsMetadataBuffer, dataBuffer), options.encryptionKey)];\r\n case 1:\r\n _a = _b.sent(), iv = _a.iv, buffer = _a.buffer;\r\n return [2 /*return*/, concatBuffers(encodingMetadataBuffer, iv, buffer)];\r\n }\r\n });\r\n}); };\r\n/** @private */\r\nvar _decryptAndDecompress = function (iv, decryptedBuffer, decryptionKey, isCompressed) { return encode_awaiter(void 0, void 0, void 0, function () {\r\n var _a;\r\n return encode_generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n _a = Uint8Array.bind;\r\n return [4 /*yield*/, decryptData(iv, decryptedBuffer, decryptionKey)];\r\n case 1:\r\n decryptedBuffer = new (_a.apply(Uint8Array, [void 0, _b.sent()]))();\r\n if (isCompressed) {\r\n return [2 /*return*/, inflate(decryptedBuffer)];\r\n }\r\n return [2 /*return*/, decryptedBuffer];\r\n }\r\n });\r\n}); };\r\nvar decompressData = function (bufferView, options) { return encode_awaiter(void 0, void 0, void 0, function () {\r\n var _a, encodingMetadataBuffer, iv, buffer, encodingMetadata, _b, contentsMetadataBuffer, contentsBuffer, _c, metadata, error_2;\r\n return encode_generator(this, function (_d) {\r\n switch (_d.label) {\r\n case 0:\r\n _a = splitBuffers(bufferView), encodingMetadataBuffer = _a[0], iv = _a[1], buffer = _a[2];\r\n encodingMetadata = JSON.parse(new TextDecoder().decode(encodingMetadataBuffer));\r\n _d.label = 1;\r\n case 1:\r\n _d.trys.push([1, 3, , 4]);\r\n _c = splitBuffers;\r\n return [4 /*yield*/, _decryptAndDecompress(iv, buffer, options.decryptionKey, !!encodingMetadata.compression)];\r\n case 2:\r\n _b = _c.apply(void 0, [_d.sent()]), contentsMetadataBuffer = _b[0], contentsBuffer = _b[1];\r\n metadata = JSON.parse(new TextDecoder().decode(contentsMetadataBuffer));\r\n return [2 /*return*/, {\r\n /** metadata source is always JSON so we can decode it here */\r\n metadata: metadata,\r\n /** data can be anything so the caller must decode it */\r\n data: contentsBuffer\r\n }];\r\n case 3:\r\n error_2 = _d.sent();\r\n console.error("Error during decompressing and decrypting the file.", encodingMetadata);\r\n throw error_2;\r\n case 4: return [2 /*return*/];\r\n }\r\n });\r\n}); }; // -----------------------------------------------------------------------------\r\n\n;// CONCATENATED MODULE: ../../data/image.ts\nvar image_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar image_generator = (undefined && undefined.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError("Generator is already executing.");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\n\r\n\r\n\r\n\r\n // -----------------------------------------------------------------------------\r\n// PNG\r\n// -----------------------------------------------------------------------------\r\nvar blobToArrayBuffer = function (blob) {\r\n if ("arrayBuffer" in blob) {\r\n return blob.arrayBuffer();\r\n } // Safari\r\n return new Promise(function (resolve, reject) {\r\n var reader = new FileReader();\r\n reader.onload = function (event) {\r\n var _event$target;\r\n if (!((_event$target = event.target) !== null && _event$target !== void 0 && _event$target.result)) {\r\n return reject(new Error("couldn\'t convert blob to ArrayBuffer"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsArrayBuffer(blob);\r\n });\r\n};\r\nvar getTEXtChunk = function (blob) { return image_awaiter(void 0, void 0, void 0, function () {\r\n var chunks, _a, _b, metadataChunk;\r\n return image_generator(this, function (_c) {\r\n switch (_c.label) {\r\n case 0:\r\n _a = (png_chunks_extract_default());\r\n _b = Uint8Array.bind;\r\n return [4 /*yield*/, blobToArrayBuffer(blob)];\r\n case 1:\r\n chunks = _a.apply(void 0, [new (_b.apply(Uint8Array, [void 0, _c.sent()]))()]);\r\n metadataChunk = chunks.find(function (chunk) { return chunk.name === "tEXt"; });\r\n if (metadataChunk) {\r\n return [2 /*return*/, png_chunk_text.decode(metadataChunk.data)];\r\n }\r\n return [2 /*return*/, null];\r\n }\r\n });\r\n}); };\r\nvar encodePngMetadata = function (_ref) { return image_awaiter(void 0, void 0, void 0, function () {\r\n var blob, metadata, chunks, _a, _b, metadataChunk, _c, _d, _e, _f, _g;\r\n return image_generator(this, function (_h) {\r\n switch (_h.label) {\r\n case 0:\r\n blob = _ref.blob, metadata = _ref.metadata;\r\n _a = (png_chunks_extract_default());\r\n _b = Uint8Array.bind;\r\n return [4 /*yield*/, blobToArrayBuffer(blob)];\r\n case 1:\r\n chunks = _a.apply(void 0, [new (_b.apply(Uint8Array, [void 0, _h.sent()]))()]);\r\n _d = (_c = png_chunk_text).encode;\r\n _e = [constants/* MIME_TYPES.excalidraw */.LO.excalidraw];\r\n _g = (_f = JSON).stringify;\r\n return [4 /*yield*/, encode({\r\n text: metadata,\r\n compress: true\r\n })];\r\n case 2:\r\n metadataChunk = _d.apply(_c, _e.concat([_g.apply(_f, [_h.sent()])]));\r\n chunks.splice(-1, 0, metadataChunk);\r\n return [2 /*return*/, new Blob([png_chunks_encode_default()(chunks)], {\r\n type: constants/* MIME_TYPES.png */.LO.png\r\n })];\r\n }\r\n });\r\n}); };\r\nvar decodePngMetadata = function (blob) { return image_awaiter(void 0, void 0, void 0, function () {\r\n var metadata, encodedData, error_1;\r\n return image_generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, getTEXtChunk(blob)];\r\n case 1:\r\n metadata = _a.sent();\r\n if (!((metadata === null || metadata === void 0 ? void 0 : metadata.keyword) === constants/* MIME_TYPES.excalidraw */.LO.excalidraw)) return [3 /*break*/, 5];\r\n _a.label = 2;\r\n case 2:\r\n _a.trys.push([2, 4, , 5]);\r\n encodedData = JSON.parse(metadata.text);\r\n if (!("encoded" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if ("type" in encodedData && encodedData.type === constants/* EXPORT_DATA_TYPES.excalidraw */.r8.excalidraw) {\r\n return [2 /*return*/, metadata.text];\r\n }\r\n throw new Error("FAILED");\r\n }\r\n return [4 /*yield*/, decode(encodedData)];\r\n case 3: return [2 /*return*/, _a.sent()];\r\n case 4:\r\n error_1 = _a.sent();\r\n console.error(error_1);\r\n throw new Error("FAILED");\r\n case 5: throw new Error("INVALID");\r\n }\r\n });\r\n}); }; // -----------------------------------------------------------------------------\r\n// SVG\r\n// -----------------------------------------------------------------------------\r\nvar encodeSvgMetadata = function (_ref2) { return image_awaiter(void 0, void 0, void 0, function () {\r\n var text, base64, _a, _b, _c, metadata;\r\n return image_generator(this, function (_d) {\r\n switch (_d.label) {\r\n case 0:\r\n text = _ref2.text;\r\n _a = stringToBase64;\r\n _c = (_b = JSON).stringify;\r\n return [4 /*yield*/, encode({\r\n text: text\r\n })];\r\n case 1: return [4 /*yield*/, _a.apply(void 0, [_c.apply(_b, [_d.sent()]), true\r\n /* is already byte string */\r\n ])];\r\n case 2:\r\n base64 = _d.sent();\r\n metadata = "";\r\n metadata += "\x3c!-- payload-type:".concat(constants/* MIME_TYPES.excalidraw */.LO.excalidraw, " --\x3e");\r\n metadata += "\x3c!-- payload-version:2 --\x3e";\r\n metadata += "\x3c!-- payload-start --\x3e";\r\n metadata += base64;\r\n metadata += "\x3c!-- payload-end --\x3e";\r\n return [2 /*return*/, metadata];\r\n }\r\n });\r\n}); };\r\nvar decodeSvgMetadata = function (_ref3) { return image_awaiter(void 0, void 0, void 0, function () {\r\n var svg, match, versionMatch, version, isByteString, json, encodedData, error_2;\r\n return image_generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n svg = _ref3.svg;\r\n if (!svg.includes("payload-type:".concat(constants/* MIME_TYPES.excalidraw */.LO.excalidraw))) return [3 /*break*/, 5];\r\n match = svg.match(/\x3c!-- payload-start --\x3e(.+?)\x3c!-- payload-end --\x3e/);\r\n if (!match) {\r\n throw new Error("INVALID");\r\n }\r\n versionMatch = svg.match(/\x3c!-- payload-version:(\\d+) --\x3e/);\r\n version = (versionMatch === null || versionMatch === void 0 ? void 0 : versionMatch[1]) || "1";\r\n isByteString = version !== "1";\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 4, , 5]);\r\n return [4 /*yield*/, base64ToString(match[1], isByteString)];\r\n case 2:\r\n json = _a.sent();\r\n encodedData = JSON.parse(json);\r\n if (!("encoded" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if ("type" in encodedData && encodedData.type === constants/* EXPORT_DATA_TYPES.excalidraw */.r8.excalidraw) {\r\n return [2 /*return*/, json];\r\n }\r\n throw new Error("FAILED");\r\n }\r\n return [4 /*yield*/, decode(encodedData)];\r\n case 3: return [2 /*return*/, _a.sent()];\r\n case 4:\r\n error_2 = _a.sent();\r\n console.error(error_2);\r\n throw new Error("FAILED");\r\n case 5: throw new Error("INVALID");\r\n }\r\n });\r\n}); };\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0EscUNBQXFDLE1BQU07QUFDM0M7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELGtEQUFxQjtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQztBQUNNLDJDQUEyQyxPQUFPLGFBQVM7QUFDbEU7QUFDQSxXQUFXLGVBQVc7QUFDdEI7QUFDQTtBQUNBO0FBQ0EseURBQXlELGtEQUFxQjtBQUM5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxjQUFjO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0UseURBQTRCO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLE1BQU07QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9kYXRhL2VuY3J5cHRpb24udHM/MDI3MiIsIndlYnBhY2s6Ly8vLi4vLi4vZGF0YS9lbmNvZGUudHM/MzFlYyIsIndlYnBhY2s6Ly8vLi4vLi4vZGF0YS9pbWFnZS50cz85MTYxIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufTtcclxudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59O1xyXG5pbXBvcnQgeyBFTkNSWVBUSU9OX0tFWV9CSVRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5leHBvcnQgdmFyIElWX0xFTkdUSF9CWVRFUyA9IDEyO1xyXG5leHBvcnQgdmFyIGNyZWF0ZUlWID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KElWX0xFTkdUSF9CWVRFUyk7XHJcbiAgICByZXR1cm4gd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcclxufTtcclxuZXhwb3J0IHZhciBnZW5lcmF0ZUVuY3J5cHRpb25LZXkgPSBmdW5jdGlvbiAocmV0dXJuQXMpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIga2V5LCBfYTtcclxuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcclxuICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgd2luZG93LmNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoe1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aDogRU5DUllQVElPTl9LRVlfQklUU1xyXG4gICAgICAgICAgICAgICAgfSwgdHJ1ZSwgLy8gZXh0cmFjdGFibGVcclxuICAgICAgICAgICAgICAgIFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCJdKV07XHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIGtleSA9IF9iLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgIGlmICghKHJldHVybkFzID09PSBcImNyeXB0b0tleVwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XHJcbiAgICAgICAgICAgICAgICBfYSA9IGtleTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xyXG4gICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbNCAvKnlpZWxkKi8sIHdpbmRvdy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleShcImp3a1wiLCBrZXkpXTtcclxuICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgX2EgPSAoX2Iuc2VudCgpKS5rO1xyXG4gICAgICAgICAgICAgICAgX2IubGFiZWwgPSA0O1xyXG4gICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovLCBfYV07XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pOyB9O1xyXG5leHBvcnQgdmFyIGdldENyeXB0b0tleSA9IGZ1bmN0aW9uIChrZXksIHVzYWdlKSB7IHJldHVybiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXCJqd2tcIiwge1xyXG4gICAgYWxnOiBcIkExMjhHQ01cIixcclxuICAgIGV4dDogdHJ1ZSxcclxuICAgIGs6IGtleSxcclxuICAgIGtleV9vcHM6IFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCJdLFxyXG4gICAga3R5OiBcIm9jdFwiXHJcbn0sIHtcclxuICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxyXG4gICAgbGVuZ3RoOiBFTkNSWVBUSU9OX0tFWV9CSVRTXHJcbn0sIGZhbHNlLCAvLyBleHRyYWN0YWJsZVxyXG5bdXNhZ2VdKTsgfTtcclxuZXhwb3J0IHZhciBlbmNyeXB0RGF0YSA9IGZ1bmN0aW9uIChrZXksIGRhdGEpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgaW1wb3J0ZWRLZXksIF9hLCBpdiwgYnVmZmVyLCBfYiwgX2MsIF9kLCBlbmNyeXB0ZWRCdWZmZXI7XHJcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XHJcbiAgICAgICAgc3dpdGNoIChfZS5sYWJlbCkge1xyXG4gICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICBpZiAoISh0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBnZXRDcnlwdG9LZXkoa2V5LCBcImVuY3J5cHRcIildO1xyXG4gICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICBfYSA9IF9lLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xyXG4gICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICBfYSA9IGtleTtcclxuICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMztcclxuICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgaW1wb3J0ZWRLZXkgPSBfYTtcclxuICAgICAgICAgICAgICAgIGl2ID0gY3JlYXRlSVYoKTtcclxuICAgICAgICAgICAgICAgIGlmICghKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XHJcbiAgICAgICAgICAgICAgICBfYiA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShkYXRhKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcclxuICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcclxuICAgICAgICAgICAgICAgIF9jID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xyXG4gICAgICAgICAgICBjYXNlIDU6XHJcbiAgICAgICAgICAgICAgICBpZiAoIShkYXRhIGluc3RhbmNlb2YgQmxvYikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZGF0YS5hcnJheUJ1ZmZlcigpXTtcclxuICAgICAgICAgICAgY2FzZSA2OlxyXG4gICAgICAgICAgICAgICAgX2QgPSBfZS5zZW50KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcclxuICAgICAgICAgICAgY2FzZSA3OlxyXG4gICAgICAgICAgICAgICAgX2QgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgX2UubGFiZWwgPSA4O1xyXG4gICAgICAgICAgICBjYXNlIDg6XHJcbiAgICAgICAgICAgICAgICBfYyA9IF9kO1xyXG4gICAgICAgICAgICAgICAgX2UubGFiZWwgPSA5O1xyXG4gICAgICAgICAgICBjYXNlIDk6XHJcbiAgICAgICAgICAgICAgICBfYiA9IF9jO1xyXG4gICAgICAgICAgICAgICAgX2UubGFiZWwgPSAxMDtcclxuICAgICAgICAgICAgY2FzZSAxMDpcclxuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IF9iO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgd2luZG93LmNyeXB0by5zdWJ0bGUuZW5jcnlwdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdjogaXZcclxuICAgICAgICAgICAgICAgICAgICB9LCBpbXBvcnRlZEtleSwgYnVmZmVyKV07XHJcbiAgICAgICAgICAgIGNhc2UgMTE6XHJcbiAgICAgICAgICAgICAgICBlbmNyeXB0ZWRCdWZmZXIgPSBfZS5zZW50KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRCdWZmZXI6IGVuY3J5cHRlZEJ1ZmZlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXY6IGl2XHJcbiAgICAgICAgICAgICAgICAgICAgfV07XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pOyB9O1xyXG5leHBvcnQgdmFyIGRlY3J5cHREYXRhID0gZnVuY3Rpb24gKGl2LCBlbmNyeXB0ZWQsIHByaXZhdGVLZXkpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIga2V5O1xyXG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xyXG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcclxuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBnZXRDcnlwdG9LZXkocHJpdmF0ZUtleSwgXCJkZWNyeXB0XCIpXTtcclxuICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAga2V5ID0gX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHdpbmRvdy5jcnlwdG8uc3VidGxlLmRlY3J5cHQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkFFUy1HQ01cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXY6IGl2XHJcbiAgICAgICAgICAgICAgICAgICAgfSwga2V5LCBlbmNyeXB0ZWQpXTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSk7IH07XHJcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufTtcclxudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59O1xyXG5pbXBvcnQgeyBkZWZsYXRlLCBpbmZsYXRlIH0gZnJvbSBcInBha29cIjtcclxuaW1wb3J0IHsgZW5jcnlwdERhdGEsIGRlY3J5cHREYXRhIH0gZnJvbSBcIi4vZW5jcnlwdGlvblwiOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBieXRlIChiaW5hcnkpIHN0cmluZ3NcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gZmFzdCwgQnVmZmVyLWNvbXBhdGlibGUgaW1wbGVtXHJcbmV4cG9ydCB2YXIgdG9CeXRlU3RyaW5nID0gZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgdmFyIGJsb2IgPSB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IG5ldyBCbG9iKFtuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZGF0YSldKSA6IG5ldyBCbG9iKFtkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGRhdGEgOiBuZXcgVWludDhBcnJheShkYXRhKV0pO1xyXG4gICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQgfHwgdHlwZW9mIGV2ZW50LnRhcmdldC5yZXN1bHQgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKFwiY291bGRuJ3QgY29udmVydCB0byBieXRlIHN0cmluZ1wiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzb2x2ZShldmVudC50YXJnZXQucmVzdWx0KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoYmxvYik7XHJcbiAgICB9KTtcclxufTtcclxudmFyIGJ5dGVTdHJpbmdUb0FycmF5QnVmZmVyID0gZnVuY3Rpb24gKGJ5dGVTdHJpbmcpIHtcclxuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpO1xyXG4gICAgdmFyIGJ1ZmZlclZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJ5dGVTdHJpbmcubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICBidWZmZXJWaWV3W2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ1ZmZlcjtcclxufTtcclxudmFyIGJ5dGVTdHJpbmdUb1N0cmluZyA9IGZ1bmN0aW9uIChieXRlU3RyaW5nKSB7XHJcbiAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIikuZGVjb2RlKGJ5dGVTdHJpbmdUb0FycmF5QnVmZmVyKGJ5dGVTdHJpbmcpKTtcclxufTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gYmFzZTY0XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8qKlxyXG4gKiBAcGFyYW0gaXNCeXRlU3RyaW5nIHNldCB0byB0cnVlIGlmIGFscmVhZHkgYnl0ZSBzdHJpbmcgdG8gcHJldmVudCBibG9hdFxyXG4gKiAgZHVlIHRvIHJlZW5jb2RpbmdcclxuICovXHJcbmV4cG9ydCB2YXIgc3RyaW5nVG9CYXNlNjQgPSBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGlzQnl0ZVN0cmluZywgX2EsIF9iLCBfYztcclxuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgICAgICBpc0J5dGVTdHJpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNCeXRlU3RyaW5nKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcclxuICAgICAgICAgICAgICAgICAgICBfYSA9IHdpbmRvdy5idG9hKHN0cik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgX2MgPSAoX2IgPSB3aW5kb3cpLmJ0b2E7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdG9CeXRlU3RyaW5nKHN0cildO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgIF9hID0gX2MuYXBwbHkoX2IsIFtfZC5zZW50KCldKTtcclxuICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDM7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovLCBfYV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59OyAvLyBhc3luYyB0byBhbGlnbiB3aXRoIHN0cmluZ1RvQmFzZTY0XHJcbmV4cG9ydCB2YXIgYmFzZTY0VG9TdHJpbmcgPSBmdW5jdGlvbiAoYmFzZTY0KSB7XHJcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGlzQnl0ZVN0cmluZztcclxuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XHJcbiAgICAgICAgICAgIGlzQnl0ZVN0cmluZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBpc0J5dGVTdHJpbmcgPyB3aW5kb3cuYXRvYihiYXNlNjQpIDogYnl0ZVN0cmluZ1RvU3RyaW5nKHdpbmRvdy5hdG9iKGJhc2U2NCkpXTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59OyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyB0ZXh0IGVuY29kaW5nXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8qKlxyXG4gKiBFbmNvZGVzIChhbmQgcG90ZW50aWFsbHkgY29tcHJlc3NlcyB2aWEgemxpYikgdGV4dCB0byBieXRlIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IHZhciBlbmNvZGUgPSBmdW5jdGlvbiAoX3JlZikgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciB0ZXh0LCBjb21wcmVzcywgZGVmbGF0ZWQsIGVycm9yXzEsIF9hO1xyXG4gICAgdmFyIF9iO1xyXG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xyXG4gICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcclxuICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgdGV4dCA9IF9yZWYudGV4dCwgY29tcHJlc3MgPSBfcmVmLmNvbXByZXNzO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoY29tcHJlc3MgIT09IGZhbHNlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XHJcbiAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDE7XHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIF9jLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0b0J5dGVTdHJpbmcoZGVmbGF0ZSh0ZXh0KSldO1xyXG4gICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICBkZWZsYXRlZCA9IF9jLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xyXG4gICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Muc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcImVuY29kZTogY2Fubm90IGRlZmxhdGVcIiwgZXJyb3JfMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcclxuICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgX2IgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogXCIxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwiYnN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWQ6ICEhZGVmbGF0ZWRcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBfYSA9IGRlZmxhdGVkO1xyXG4gICAgICAgICAgICAgICAgaWYgKF9hKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRvQnl0ZVN0cmluZyh0ZXh0KV07XHJcbiAgICAgICAgICAgIGNhc2UgNTpcclxuICAgICAgICAgICAgICAgIF9hID0gKF9jLnNlbnQoKSk7XHJcbiAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDY7XHJcbiAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIChfYi5lbmNvZGVkID0gX2EsXHJcbiAgICAgICAgICAgICAgICAgICAgX2IpXTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSk7IH07XHJcbmV4cG9ydCB2YXIgZGVjb2RlID0gZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZGVjb2RlZCwgX2EsIF9iO1xyXG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xyXG4gICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcclxuICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgX2EgPSBkYXRhLmVuY29kaW5nO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJic3RyaW5nXCI6IHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIGlmICghZGF0YS5jb21wcmVzc2VkKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcclxuICAgICAgICAgICAgICAgIF9iID0gZGF0YS5lbmNvZGVkO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XHJcbiAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFs0IC8qeWllbGQqLywgYnl0ZVN0cmluZ1RvU3RyaW5nKGRhdGEuZW5jb2RlZCldO1xyXG4gICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICBfYiA9IF9jLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gNDtcclxuICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgLy8gaWYgY29tcHJlc3NlZCwgZG8gbm90IGRvdWJsZSBkZWNvZGUgdGhlIGJzdHJpbmdcclxuICAgICAgICAgICAgICAgIGRlY29kZWQgPSBfYjtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xyXG4gICAgICAgICAgICBjYXNlIDU6IHRocm93IG5ldyBFcnJvcihcImRlY29kZTogdW5rbm93biBlbmNvZGluZyBcXFwiXCIuY29uY2F0KGRhdGEuZW5jb2RpbmcsIFwiXFxcIlwiKSk7XHJcbiAgICAgICAgICAgIGNhc2UgNjpcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbXByZXNzZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgaW5mbGF0ZShuZXcgVWludDhBcnJheShieXRlU3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKSksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvOiBcInN0cmluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkZWNvZGVkXTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSk7IH07IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIGJpbmFyeSBlbmNvZGluZ1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG52YXIgQ09OQ0FUX0JVRkZFUlNfVkVSU0lPTiA9IDE7XHJcbi8qKiBob3cgbWFueSBieXRlcyB3ZSB1c2UgdG8gZW5jb2RlIGhvdyBtYW55IGJ5dGVzIHRoZSBuZXh0IGNodW5rIGhhcy5cclxuICogQ29ycmVzcG9uZHMgdG8gRGF0YVZpZXcgc2V0dGVyIG1ldGhvZHMgKHNldFVpbnQzMiwgc2V0VWludDE2LCBldGMpLlxyXG4gKlxyXG4gKiBOT1RFICEgdmFsdWVzIG11c3Qgbm90IGJlIGNoYW5nZWQsIHdoaWNoIHdvdWxkIGJlIGJhY2t3YXJkcyBpbmNvbXBhdGlibGUgIVxyXG4gKi9cclxudmFyIFZFUlNJT05fREFUQVZJRVdfQllURVMgPSA0O1xyXG52YXIgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTID0gNDsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxudmFyIERBVEFfVklFV19CSVRTX01BUCA9IHtcclxuICAgIDE6IDgsXHJcbiAgICAyOiAxNixcclxuICAgIDQ6IDMyXHJcbn07IC8vIGdldHRlclxyXG4vKipcclxuICogYWJzdHJhY3Rpb24gb3ZlciBEYXRhVmlldyB0aGF0IHNlcnZlcyBhcyBhIHR5cGVkIGdldHRlci9zZXR0ZXIgaW4gY2FzZVxyXG4gKiB5b3UncmUgdXNpbmcgY29uc3RhbnRzIGZvciB0aGUgYnl0ZSBzaXplIGFuZCB3YW50IHRvIGVuc3VyZSB0aGVyZSdzIG5vXHJcbiAqIGRpc2NyZXBlbmFuY3kgaW4gdGhlIGVuY29kaW5nIGFjcm9zcyByZWZhY3RvcnMuXHJcbiAqXHJcbiAqIERhdGFWaWV3IHNlcnZlcyBmb3IgYW4gZW5kaWFuLWFnbm9zdGljIGhhbmRsaW5nIG9mIG51bWJlcnMgaW4gQXJyYXlCdWZmZXJzLlxyXG4gKi9cclxuZnVuY3Rpb24gZGF0YVZpZXcoYnVmZmVyLCBieXRlcywgb2Zmc2V0LCB2YWx1ZSkge1xyXG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICBpZiAodmFsdWUgPiBNYXRoLnBvdygyLCBEQVRBX1ZJRVdfQklUU19NQVBbYnl0ZXNdKSAtIDEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXR0ZW1wdGluZyB0byBzZXQgdmFsdWUgaGlnaGVyIHRoYW4gdGhlIGFsbG9jYXRlZCBieXRlcyAodmFsdWU6IFwiLmNvbmNhdCh2YWx1ZSwgXCIsIGJ5dGVzOiBcIikuY29uY2F0KGJ5dGVzLCBcIilcIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbWV0aG9kXzEgPSBcInNldFVpbnRcIi5jb25jYXQoREFUQV9WSUVXX0JJVFNfTUFQW2J5dGVzXSk7XHJcbiAgICAgICAgbmV3IERhdGFWaWV3KGJ1ZmZlci5idWZmZXIpW21ldGhvZF8xXShvZmZzZXQsIHZhbHVlKTtcclxuICAgICAgICByZXR1cm4gYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgdmFyIG1ldGhvZCA9IFwiZ2V0VWludFwiLmNvbmNhdChEQVRBX1ZJRVdfQklUU19NQVBbYnl0ZXNdKTtcclxuICAgIHJldHVybiBuZXcgRGF0YVZpZXcoYnVmZmVyLmJ1ZmZlcilbbWV0aG9kXShvZmZzZXQpO1xyXG59IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8qKlxyXG4gKiBSZXN1bHRpbmcgY29uY2F0ZW5hdGVkIGJ1ZmZlciBoYXMgdGhpcyBmb3JtYXQ6XHJcbiAqXHJcbiAqIFtcclxuICogICBWRVJTSU9OIGNodW5rICg0IGJ5dGVzKVxyXG4gKiAgIExFTkdUSCBjaHVuayAxICg0IGJ5dGVzKVxyXG4gKiAgIERBVEEgY2h1bmsgMSAodXAgdG8gMl4zMiBiaXRzKVxyXG4gKiAgIExFTkdUSCBjaHVuayAyICg0IGJ5dGVzKVxyXG4gKiAgIERBVEEgY2h1bmsgMiAodXAgdG8gMl4zMiBiaXRzKVxyXG4gKiAgIC4uLlxyXG4gKiBdXHJcbiAqXHJcbiAqIEBwYXJhbSBidWZmZXJzIGVhY2ggYnVmZmVyIChjaHVuaykgbXVzdCBiZSBhdCBtb3N0IDJeMzIgYml0cyBsYXJnZSAofjRHQilcclxuICovXHJcbnZhciBjb25jYXRCdWZmZXJzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGJ1ZmZlcnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XHJcbiAgICAgICAgYnVmZmVyc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcclxuICAgIH1cclxuICAgIHZhciBidWZmZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoVkVSU0lPTl9EQVRBVklFV19CWVRFUyArIE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUyAqIGJ1ZmZlcnMubGVuZ3RoICsgYnVmZmVycy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgYnVmZmVyKSB7IHJldHVybiBhY2MgKyBidWZmZXIuYnl0ZUxlbmd0aDsgfSwgMCkpO1xyXG4gICAgdmFyIGN1cnNvciA9IDA7IC8vIGFzIHRoZSBmaXJzdCBjaHVuayB3ZSdsbCBlbmNvZGUgdGhlIHZlcnNpb24gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XHJcbiAgICBkYXRhVmlldyhidWZmZXJWaWV3LCBWRVJTSU9OX0RBVEFWSUVXX0JZVEVTLCBjdXJzb3IsIENPTkNBVF9CVUZGRVJTX1ZFUlNJT04pO1xyXG4gICAgY3Vyc29yICs9IFZFUlNJT05fREFUQVZJRVdfQllURVM7XHJcbiAgICBmb3IgKHZhciBfaSA9IDAsIGJ1ZmZlcnNfMSA9IGJ1ZmZlcnM7IF9pIDwgYnVmZmVyc18xLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgIHZhciBidWZmZXIgPSBidWZmZXJzXzFbX2ldO1xyXG4gICAgICAgIGRhdGFWaWV3KGJ1ZmZlclZpZXcsIE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUywgY3Vyc29yLCBidWZmZXIuYnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgY3Vyc29yICs9IE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUztcclxuICAgICAgICBidWZmZXJWaWV3LnNldChidWZmZXIsIGN1cnNvcik7XHJcbiAgICAgICAgY3Vyc29yICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ1ZmZlclZpZXc7XHJcbn07XHJcbi8qKiBjYW4gb25seSBiZSB1c2VkIG9uIGJ1ZmZlcnMgY3JlYXRlZCB2aWEgYGNvbmNhdEJ1ZmZlcnMoKWAgKi9cclxudmFyIHNwbGl0QnVmZmVycyA9IGZ1bmN0aW9uIChjb25jYXRlbmF0ZWRCdWZmZXIpIHtcclxuICAgIHZhciBidWZmZXJzID0gW107XHJcbiAgICB2YXIgY3Vyc29yID0gMDsgLy8gZmlyc3QgY2h1bmsgaXMgdGhlIHZlcnNpb25cclxuICAgIHZhciB2ZXJzaW9uID0gZGF0YVZpZXcoY29uY2F0ZW5hdGVkQnVmZmVyLCBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMsIGN1cnNvcik7IC8vIElmIHZlcnNpb24gaXMgb3V0c2lkZSBvZiB0aGUgc3VwcG9ydGVkIHZlcnNpb25zLCB0aHJvdyBhbiBlcnJvci5cclxuICAgIC8vIFRoaXMgdXN1YWxseSBtZWFucyB0aGUgYnVmZmVyIHdhc24ndCBlbmNvZGVkIHVzaW5nIHRoaXMgQVBJLCBzbyB3ZSdkIG9ubHlcclxuICAgIC8vIHdhc3RlIGNvbXB1dGUuXHJcbiAgICBpZiAodmVyc2lvbiA+IENPTkNBVF9CVUZGRVJTX1ZFUlNJT04pIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHZlcnNpb24gXCIuY29uY2F0KHZlcnNpb24pKTtcclxuICAgIH1cclxuICAgIGN1cnNvciArPSBWRVJTSU9OX0RBVEFWSUVXX0JZVEVTO1xyXG4gICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgICB2YXIgY2h1bmtTaXplID0gZGF0YVZpZXcoY29uY2F0ZW5hdGVkQnVmZmVyLCBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMsIGN1cnNvcik7XHJcbiAgICAgICAgY3Vyc29yICs9IE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUztcclxuICAgICAgICBidWZmZXJzLnB1c2goY29uY2F0ZW5hdGVkQnVmZmVyLnNsaWNlKGN1cnNvciwgY3Vyc29yICsgY2h1bmtTaXplKSk7XHJcbiAgICAgICAgY3Vyc29yICs9IGNodW5rU2l6ZTtcclxuICAgICAgICBpZiAoY3Vyc29yID49IGNvbmNhdGVuYXRlZEJ1ZmZlci5ieXRlTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBidWZmZXJzO1xyXG59OyAvLyBoZWxwZXJzIGZvciAoZGUpY29tcHJlc3NpbmcgZGF0YSB3aXRoIEpTT04gbWV0YWRhdGEgaW5jbHVkaW5nIGVuY3J5cHRpb25cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLyoqIEBwcml2YXRlICovXHJcbnZhciBfZW5jcnlwdEFuZENvbXByZXNzID0gZnVuY3Rpb24gKGRhdGEsIGVuY3J5cHRpb25LZXkpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgX2EsIGVuY3J5cHRlZEJ1ZmZlciwgaXY7XHJcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XHJcbiAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xyXG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGVuY3J5cHREYXRhKGVuY3J5cHRpb25LZXksIGRlZmxhdGUoZGF0YSkpXTtcclxuICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCksIGVuY3J5cHRlZEJ1ZmZlciA9IF9hLmVuY3J5cHRlZEJ1ZmZlciwgaXYgPSBfYS5pdjtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl2OiBpdixcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyOiBuZXcgVWludDhBcnJheShlbmNyeXB0ZWRCdWZmZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgfV07XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pOyB9O1xyXG4vKipcclxuICogVGhlIHJldHVybmVkIGJ1ZmZlciBoYXMgZm9sbG93aW5nIGZvcm1hdDpcclxuICogYFtdYCByZWZlcnMgdG8gYSBidWZmZXJzIHdyYXBwZXIgKHNlZSBgY29uY2F0QnVmZmVyc2ApXHJcbiAqXHJcbiAqIFtcclxuICogICBlbmNvZGluZ01ldGFkYXRhQnVmZmVyLFxyXG4gKiAgIGl2LFxyXG4gKiAgIFtcclxuICogICAgICBjb250ZW50c01ldGFkYXRhQnVmZmVyXHJcbiAqICAgICAgY29udGVudHNCdWZmZXJcclxuICogICBdXHJcbiAqIF1cclxuICovXHJcbmV4cG9ydCB2YXIgY29tcHJlc3NEYXRhID0gZnVuY3Rpb24gKGRhdGFCdWZmZXIsIG9wdGlvbnMpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZmlsZUluZm8sIGVuY29kaW5nTWV0YWRhdGFCdWZmZXIsIGNvbnRlbnRzTWV0YWRhdGFCdWZmZXIsIF9hLCBpdiwgYnVmZmVyO1xyXG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xyXG4gICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcclxuICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgZmlsZUluZm8gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogMixcclxuICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbjogXCJwYWtvQDFcIixcclxuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uOiBcIkFFUy1HQ01cIlxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGVuY29kaW5nTWV0YWRhdGFCdWZmZXIgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoZmlsZUluZm8pKTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRzTWV0YWRhdGFCdWZmZXIgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5tZXRhZGF0YSB8fCBudWxsKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBfZW5jcnlwdEFuZENvbXByZXNzKGNvbmNhdEJ1ZmZlcnMoY29udGVudHNNZXRhZGF0YUJ1ZmZlciwgZGF0YUJ1ZmZlciksIG9wdGlvbnMuZW5jcnlwdGlvbktleSldO1xyXG4gICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKSwgaXYgPSBfYS5pdiwgYnVmZmVyID0gX2EuYnVmZmVyO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbmNhdEJ1ZmZlcnMoZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlciwgaXYsIGJ1ZmZlcildO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59KTsgfTtcclxuLyoqIEBwcml2YXRlICovXHJcbnZhciBfZGVjcnlwdEFuZERlY29tcHJlc3MgPSBmdW5jdGlvbiAoaXYsIGRlY3J5cHRlZEJ1ZmZlciwgZGVjcnlwdGlvbktleSwgaXNDb21wcmVzc2VkKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xyXG4gICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcclxuICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgX2EgPSBVaW50OEFycmF5LmJpbmQ7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBkZWNyeXB0RGF0YShpdiwgZGVjcnlwdGVkQnVmZmVyLCBkZWNyeXB0aW9uS2V5KV07XHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIGRlY3J5cHRlZEJ1ZmZlciA9IG5ldyAoX2EuYXBwbHkoVWludDhBcnJheSwgW3ZvaWQgMCwgX2Iuc2VudCgpXSkpKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGluZmxhdGUoZGVjcnlwdGVkQnVmZmVyKV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGVjcnlwdGVkQnVmZmVyXTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSk7IH07XHJcbmV4cG9ydCB2YXIgZGVjb21wcmVzc0RhdGEgPSBmdW5jdGlvbiAoYnVmZmVyVmlldywgb3B0aW9ucykgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBfYSwgZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlciwgaXYsIGJ1ZmZlciwgZW5jb2RpbmdNZXRhZGF0YSwgX2IsIGNvbnRlbnRzTWV0YWRhdGFCdWZmZXIsIGNvbnRlbnRzQnVmZmVyLCBfYywgbWV0YWRhdGEsIGVycm9yXzI7XHJcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XHJcbiAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xyXG4gICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICBfYSA9IHNwbGl0QnVmZmVycyhidWZmZXJWaWV3KSwgZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlciA9IF9hWzBdLCBpdiA9IF9hWzFdLCBidWZmZXIgPSBfYVsyXTtcclxuICAgICAgICAgICAgICAgIGVuY29kaW5nTWV0YWRhdGEgPSBKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShlbmNvZGluZ01ldGFkYXRhQnVmZmVyKSk7XHJcbiAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDE7XHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIF9kLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XHJcbiAgICAgICAgICAgICAgICBfYyA9IHNwbGl0QnVmZmVycztcclxuICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIF9kZWNyeXB0QW5kRGVjb21wcmVzcyhpdiwgYnVmZmVyLCBvcHRpb25zLmRlY3J5cHRpb25LZXksICEhZW5jb2RpbmdNZXRhZGF0YS5jb21wcmVzc2lvbildO1xyXG4gICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICBfYiA9IF9jLmFwcGx5KHZvaWQgMCwgW19kLnNlbnQoKV0pLCBjb250ZW50c01ldGFkYXRhQnVmZmVyID0gX2JbMF0sIGNvbnRlbnRzQnVmZmVyID0gX2JbMV07XHJcbiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IEpTT04ucGFyc2UobmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnRzTWV0YWRhdGFCdWZmZXIpKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBtZXRhZGF0YSBzb3VyY2UgaXMgYWx3YXlzIEpTT04gc28gd2UgY2FuIGRlY29kZSBpdCBoZXJlICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLyoqIGRhdGEgY2FuIGJlIGFueXRoaW5nIHNvIHRoZSBjYWxsZXIgbXVzdCBkZWNvZGUgaXQgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogY29udGVudHNCdWZmZXJcclxuICAgICAgICAgICAgICAgICAgICB9XTtcclxuICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgZXJyb3JfMiA9IF9kLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgZGVjb21wcmVzc2luZyBhbmQgZGVjcnlwdGluZyB0aGUgZmlsZS5cIiwgZW5jb2RpbmdNZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcl8yO1xyXG4gICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSk7IH07IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufTtcclxudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59O1xyXG5pbXBvcnQgZGVjb2RlUG5nIGZyb20gXCJwbmctY2h1bmtzLWV4dHJhY3RcIjtcclxuaW1wb3J0IHRFWHQgZnJvbSBcInBuZy1jaHVuay10ZXh0XCI7XHJcbmltcG9ydCBlbmNvZGVQbmcgZnJvbSBcInBuZy1jaHVua3MtZW5jb2RlXCI7XHJcbmltcG9ydCB7IHN0cmluZ1RvQmFzZTY0LCBlbmNvZGUsIGRlY29kZSwgYmFzZTY0VG9TdHJpbmcgfSBmcm9tIFwiLi9lbmNvZGVcIjtcclxuaW1wb3J0IHsgRVhQT1JUX0RBVEFfVFlQRVMsIE1JTUVfVFlQRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFBOR1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG52YXIgYmxvYlRvQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiAoYmxvYikge1xyXG4gICAgaWYgKFwiYXJyYXlCdWZmZXJcIiBpbiBibG9iKSB7XHJcbiAgICAgICAgcmV0dXJuIGJsb2IuYXJyYXlCdWZmZXIoKTtcclxuICAgIH0gLy8gU2FmYXJpXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgdmFyIF9ldmVudCR0YXJnZXQ7XHJcbiAgICAgICAgICAgIGlmICghKChfZXZlbnQkdGFyZ2V0ID0gZXZlbnQudGFyZ2V0KSAhPT0gbnVsbCAmJiBfZXZlbnQkdGFyZ2V0ICE9PSB2b2lkIDAgJiYgX2V2ZW50JHRhcmdldC5yZXN1bHQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcImNvdWxkbid0IGNvbnZlcnQgYmxvYiB0byBBcnJheUJ1ZmZlclwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzb2x2ZShldmVudC50YXJnZXQucmVzdWx0KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcclxuICAgIH0pO1xyXG59O1xyXG5leHBvcnQgdmFyIGdldFRFWHRDaHVuayA9IGZ1bmN0aW9uIChibG9iKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGNodW5rcywgX2EsIF9iLCBtZXRhZGF0YUNodW5rO1xyXG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xyXG4gICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcclxuICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgX2EgPSBkZWNvZGVQbmc7XHJcbiAgICAgICAgICAgICAgICBfYiA9IFVpbnQ4QXJyYXkuYmluZDtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGJsb2JUb0FycmF5QnVmZmVyKGJsb2IpXTtcclxuICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgY2h1bmtzID0gX2EuYXBwbHkodm9pZCAwLCBbbmV3IChfYi5hcHBseShVaW50OEFycmF5LCBbdm9pZCAwLCBfYy5zZW50KCldKSkoKV0pO1xyXG4gICAgICAgICAgICAgICAgbWV0YWRhdGFDaHVuayA9IGNodW5rcy5maW5kKGZ1bmN0aW9uIChjaHVuaykgeyByZXR1cm4gY2h1bmsubmFtZSA9PT0gXCJ0RVh0XCI7IH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhQ2h1bmspIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdEVYdC5kZWNvZGUobWV0YWRhdGFDaHVuay5kYXRhKV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbnVsbF07XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pOyB9O1xyXG5leHBvcnQgdmFyIGVuY29kZVBuZ01ldGFkYXRhID0gZnVuY3Rpb24gKF9yZWYpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgYmxvYiwgbWV0YWRhdGEsIGNodW5rcywgX2EsIF9iLCBtZXRhZGF0YUNodW5rLCBfYywgX2QsIF9lLCBfZiwgX2c7XHJcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9oKSB7XHJcbiAgICAgICAgc3dpdGNoIChfaC5sYWJlbCkge1xyXG4gICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICBibG9iID0gX3JlZi5ibG9iLCBtZXRhZGF0YSA9IF9yZWYubWV0YWRhdGE7XHJcbiAgICAgICAgICAgICAgICBfYSA9IGRlY29kZVBuZztcclxuICAgICAgICAgICAgICAgIF9iID0gVWludDhBcnJheS5iaW5kO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYmxvYlRvQXJyYXlCdWZmZXIoYmxvYildO1xyXG4gICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICBjaHVua3MgPSBfYS5hcHBseSh2b2lkIDAsIFtuZXcgKF9iLmFwcGx5KFVpbnQ4QXJyYXksIFt2b2lkIDAsIF9oLnNlbnQoKV0pKSgpXSk7XHJcbiAgICAgICAgICAgICAgICBfZCA9IChfYyA9IHRFWHQpLmVuY29kZTtcclxuICAgICAgICAgICAgICAgIF9lID0gW01JTUVfVFlQRVMuZXhjYWxpZHJhd107XHJcbiAgICAgICAgICAgICAgICBfZyA9IChfZiA9IEpTT04pLnN0cmluZ2lmeTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGVuY29kZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IG1ldGFkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzczogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXTtcclxuICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgbWV0YWRhdGFDaHVuayA9IF9kLmFwcGx5KF9jLCBfZS5jb25jYXQoW19nLmFwcGx5KF9mLCBbX2guc2VudCgpXSldKSk7XHJcbiAgICAgICAgICAgICAgICBjaHVua3Muc3BsaWNlKC0xLCAwLCBtZXRhZGF0YUNodW5rKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgQmxvYihbZW5jb2RlUG5nKGNodW5rcyldLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE1JTUVfVFlQRVMucG5nXHJcbiAgICAgICAgICAgICAgICAgICAgfSldO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59KTsgfTtcclxuZXhwb3J0IHZhciBkZWNvZGVQbmdNZXRhZGF0YSA9IGZ1bmN0aW9uIChibG9iKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIG1ldGFkYXRhLCBlbmNvZGVkRGF0YSwgZXJyb3JfMTtcclxuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgZ2V0VEVYdENodW5rKGJsb2IpXTtcclxuICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBfYS5zZW50KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoISgobWV0YWRhdGEgPT09IG51bGwgfHwgbWV0YWRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1ldGFkYXRhLmtleXdvcmQpID09PSBNSU1FX1RZUEVTLmV4Y2FsaWRyYXcpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcclxuICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcclxuICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsyLCA0LCAsIDVdKTtcclxuICAgICAgICAgICAgICAgIGVuY29kZWREYXRhID0gSlNPTi5wYXJzZShtZXRhZGF0YS50ZXh0KTtcclxuICAgICAgICAgICAgICAgIGlmICghKFwiZW5jb2RlZFwiIGluIGVuY29kZWREYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSwgdW4tZW5jb2RlZCBzY2VuZSBKU09OXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwidHlwZVwiIGluIGVuY29kZWREYXRhICYmIGVuY29kZWREYXRhLnR5cGUgPT09IEVYUE9SVF9EQVRBX1RZUEVTLmV4Y2FsaWRyYXcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG1ldGFkYXRhLnRleHRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGQUlMRURcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBkZWNvZGUoZW5jb2RlZERhdGEpXTtcclxuICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgX2Euc2VudCgpXTtcclxuICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgZXJyb3JfMSA9IF9hLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3JfMSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGQUlMRURcIik7XHJcbiAgICAgICAgICAgIGNhc2UgNTogdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSk7IH07IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFNWR1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5leHBvcnQgdmFyIGVuY29kZVN2Z01ldGFkYXRhID0gZnVuY3Rpb24gKF9yZWYyKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIHRleHQsIGJhc2U2NCwgX2EsIF9iLCBfYywgbWV0YWRhdGE7XHJcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XHJcbiAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xyXG4gICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gX3JlZjIudGV4dDtcclxuICAgICAgICAgICAgICAgIF9hID0gc3RyaW5nVG9CYXNlNjQ7XHJcbiAgICAgICAgICAgICAgICBfYyA9IChfYiA9IEpTT04pLnN0cmluZ2lmeTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGVuY29kZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHRleHRcclxuICAgICAgICAgICAgICAgICAgICB9KV07XHJcbiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgX2EuYXBwbHkodm9pZCAwLCBbX2MuYXBwbHkoX2IsIFtfZC5zZW50KCldKSwgdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIC8qIGlzIGFscmVhZHkgYnl0ZSBzdHJpbmcgKi9cclxuICAgICAgICAgICAgICAgIF0pXTtcclxuICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgYmFzZTY0ID0gX2Quc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgbWV0YWRhdGEgKz0gXCI8IS0tIHBheWxvYWQtdHlwZTpcIi5jb25jYXQoTUlNRV9UWVBFUy5leGNhbGlkcmF3LCBcIiAtLT5cIik7XHJcbiAgICAgICAgICAgICAgICBtZXRhZGF0YSArPSBcIjwhLS0gcGF5bG9hZC12ZXJzaW9uOjIgLS0+XCI7XHJcbiAgICAgICAgICAgICAgICBtZXRhZGF0YSArPSBcIjwhLS0gcGF5bG9hZC1zdGFydCAtLT5cIjtcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhICs9IGJhc2U2NDtcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhICs9IFwiPCEtLSBwYXlsb2FkLWVuZCAtLT5cIjtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBtZXRhZGF0YV07XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pOyB9O1xyXG5leHBvcnQgdmFyIGRlY29kZVN2Z01ldGFkYXRhID0gZnVuY3Rpb24gKF9yZWYzKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIHN2ZywgbWF0Y2gsIHZlcnNpb25NYXRjaCwgdmVyc2lvbiwgaXNCeXRlU3RyaW5nLCBqc29uLCBlbmNvZGVkRGF0YSwgZXJyb3JfMjtcclxuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgIHN2ZyA9IF9yZWYzLnN2ZztcclxuICAgICAgICAgICAgICAgIGlmICghc3ZnLmluY2x1ZGVzKFwicGF5bG9hZC10eXBlOlwiLmNvbmNhdChNSU1FX1RZUEVTLmV4Y2FsaWRyYXcpKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XHJcbiAgICAgICAgICAgICAgICBtYXRjaCA9IHN2Zy5tYXRjaCgvPCEtLSBwYXlsb2FkLXN0YXJ0IC0tPiguKz8pPCEtLSBwYXlsb2FkLWVuZCAtLT4vKTtcclxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJTlZBTElEXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmVyc2lvbk1hdGNoID0gc3ZnLm1hdGNoKC88IS0tIHBheWxvYWQtdmVyc2lvbjooXFxkKykgLS0+Lyk7XHJcbiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gKHZlcnNpb25NYXRjaCA9PT0gbnVsbCB8fCB2ZXJzaW9uTWF0Y2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZlcnNpb25NYXRjaFsxXSkgfHwgXCIxXCI7XHJcbiAgICAgICAgICAgICAgICBpc0J5dGVTdHJpbmcgPSB2ZXJzaW9uICE9PSBcIjFcIjtcclxuICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcclxuICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCA0LCAsIDVdKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGJhc2U2NFRvU3RyaW5nKG1hdGNoWzFdLCBpc0J5dGVTdHJpbmcpXTtcclxuICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAganNvbiA9IF9hLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgIGVuY29kZWREYXRhID0gSlNPTi5wYXJzZShqc29uKTtcclxuICAgICAgICAgICAgICAgIGlmICghKFwiZW5jb2RlZFwiIGluIGVuY29kZWREYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSwgdW4tZW5jb2RlZCBzY2VuZSBKU09OXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwidHlwZVwiIGluIGVuY29kZWREYXRhICYmIGVuY29kZWREYXRhLnR5cGUgPT09IEVYUE9SVF9EQVRBX1RZUEVTLmV4Y2FsaWRyYXcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGpzb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGQUlMRURcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBkZWNvZGUoZW5jb2RlZERhdGEpXTtcclxuICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgX2Euc2VudCgpXTtcclxuICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgZXJyb3JfMiA9IF9hLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3JfMik7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGQUlMRURcIik7XHJcbiAgICAgICAgICAgIGNhc2UgNTogdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSk7IH07XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///673\n')}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkExcalidraw=self.webpackChunkExcalidraw||[]).push([[9],{673:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "decodePngMetadata": () => (/* binding */ decodePngMetadata),\n "decodeSvgMetadata": () => (/* binding */ decodeSvgMetadata),\n "encodePngMetadata": () => (/* binding */ encodePngMetadata),\n "encodeSvgMetadata": () => (/* binding */ encodeSvgMetadata),\n "getTEXtChunk": () => (/* binding */ getTEXtChunk)\n});\n\n// EXTERNAL MODULE: ../../../node_modules/png-chunks-extract/index.js\nvar png_chunks_extract = __webpack_require__(2983);\nvar png_chunks_extract_default = /*#__PURE__*/__webpack_require__.n(png_chunks_extract);\n// EXTERNAL MODULE: ../../../node_modules/png-chunk-text/index.js\nvar png_chunk_text = __webpack_require__(1194);\n// EXTERNAL MODULE: ../../../node_modules/png-chunks-encode/index.js\nvar png_chunks_encode = __webpack_require__(3434);\nvar png_chunks_encode_default = /*#__PURE__*/__webpack_require__.n(png_chunks_encode);\n// EXTERNAL MODULE: ../../../node_modules/pako/index.js\nvar pako = __webpack_require__(2744);\n// EXTERNAL MODULE: ../../constants.ts\nvar constants = __webpack_require__(8288);\n;// CONCATENATED MODULE: ../../data/encryption.ts\n\r\nconst IV_LENGTH_BYTES = 12;\r\nconst createIV = () => {\r\n const arr = new Uint8Array(IV_LENGTH_BYTES);\r\n return window.crypto.getRandomValues(arr);\r\n};\r\nconst generateEncryptionKey = async (returnAs) => {\r\n const key = await window.crypto.subtle.generateKey({\r\n name: "AES-GCM",\r\n length: ENCRYPTION_KEY_BITS\r\n }, true, // extractable\r\n ["encrypt", "decrypt"]);\r\n return returnAs === "cryptoKey" ? key : (await window.crypto.subtle.exportKey("jwk", key)).k;\r\n};\r\nconst getCryptoKey = (key, usage) => window.crypto.subtle.importKey("jwk", {\r\n alg: "A128GCM",\r\n ext: true,\r\n k: key,\r\n key_ops: ["encrypt", "decrypt"],\r\n kty: "oct"\r\n}, {\r\n name: "AES-GCM",\r\n length: ENCRYPTION_KEY_BITS\r\n}, false, // extractable\r\n[usage]);\r\nconst encryption_encryptData = async (key, data) => {\r\n const importedKey = typeof key === "string" ? await getCryptoKey(key, "encrypt") : key;\r\n const iv = createIV();\r\n const buffer = typeof data === "string" ? new TextEncoder().encode(data) : data instanceof Uint8Array ? data : data instanceof Blob ? await data.arrayBuffer() : data; // We use symmetric encryption. AES-GCM is the recommended algorithm and\r\n // includes checks that the ciphertext has not been modified by an attacker.\r\n const encryptedBuffer = await window.crypto.subtle.encrypt({\r\n name: "AES-GCM",\r\n iv\r\n }, importedKey, buffer);\r\n return {\r\n encryptedBuffer,\r\n iv\r\n };\r\n};\r\nconst encryption_decryptData = async (iv, encrypted, privateKey) => {\r\n const key = await getCryptoKey(privateKey, "decrypt");\r\n return window.crypto.subtle.decrypt({\r\n name: "AES-GCM",\r\n iv\r\n }, key, encrypted);\r\n};\r\n\n;// CONCATENATED MODULE: ../../data/encode.ts\n\r\n // -----------------------------------------------------------------------------\r\n// byte (binary) strings\r\n// -----------------------------------------------------------------------------\r\n// fast, Buffer-compatible implem\r\nconst toByteString = data => {\r\n return new Promise((resolve, reject) => {\r\n const blob = typeof data === "string" ? new Blob([new TextEncoder().encode(data)]) : new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)]);\r\n const reader = new FileReader();\r\n reader.onload = event => {\r\n if (!event.target || typeof event.target.result !== "string") {\r\n return reject(new Error("couldn\'t convert to byte string"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsBinaryString(blob);\r\n });\r\n};\r\nconst byteStringToArrayBuffer = byteString => {\r\n const buffer = new ArrayBuffer(byteString.length);\r\n const bufferView = new Uint8Array(buffer);\r\n for (let i = 0, len = byteString.length; i < len; i++) {\r\n bufferView[i] = byteString.charCodeAt(i);\r\n }\r\n return buffer;\r\n};\r\nconst byteStringToString = byteString => {\r\n return new TextDecoder("utf-8").decode(byteStringToArrayBuffer(byteString));\r\n}; // -----------------------------------------------------------------------------\r\n// base64\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * @param isByteString set to true if already byte string to prevent bloat\r\n * due to reencoding\r\n */\r\nconst stringToBase64 = async function (str) {\r\n let isByteString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\r\n return isByteString ? window.btoa(str) : window.btoa(await toByteString(str));\r\n}; // async to align with stringToBase64\r\nconst base64ToString = async function (base64) {\r\n let isByteString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\r\n return isByteString ? window.atob(base64) : byteStringToString(window.atob(base64));\r\n}; // -----------------------------------------------------------------------------\r\n// text encoding\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * Encodes (and potentially compresses via zlib) text to byte string\r\n */\r\nconst encode = async (_ref) => {\r\n let { text, compress } = _ref;\r\n let deflated;\r\n if (compress !== false) {\r\n try {\r\n deflated = await toByteString((0,pako.deflate)(text));\r\n }\r\n catch (error) {\r\n console.error("encode: cannot deflate", error);\r\n }\r\n }\r\n return {\r\n version: "1",\r\n encoding: "bstring",\r\n compressed: !!deflated,\r\n encoded: deflated || (await toByteString(text))\r\n };\r\n};\r\nconst decode = async (data) => {\r\n let decoded;\r\n switch (data.encoding) {\r\n case "bstring":\r\n // if compressed, do not double decode the bstring\r\n decoded = data.compressed ? data.encoded : await byteStringToString(data.encoded);\r\n break;\r\n default:\r\n throw new Error("decode: unknown encoding \\"".concat(data.encoding, "\\""));\r\n }\r\n if (data.compressed) {\r\n return (0,pako.inflate)(new Uint8Array(byteStringToArrayBuffer(decoded)), {\r\n to: "string"\r\n });\r\n }\r\n return decoded;\r\n}; // -----------------------------------------------------------------------------\r\n// binary encoding\r\n// -----------------------------------------------------------------------------\r\n// -----------------------------------------------------------------------------\r\nconst CONCAT_BUFFERS_VERSION = 1;\r\n/** how many bytes we use to encode how many bytes the next chunk has.\r\n * Corresponds to DataView setter methods (setUint32, setUint16, etc).\r\n *\r\n * NOTE ! values must not be changed, which would be backwards incompatible !\r\n */\r\nconst VERSION_DATAVIEW_BYTES = 4;\r\nconst NEXT_CHUNK_SIZE_DATAVIEW_BYTES = 4; // -----------------------------------------------------------------------------\r\nconst DATA_VIEW_BITS_MAP = {\r\n 1: 8,\r\n 2: 16,\r\n 4: 32\r\n}; // getter\r\n/**\r\n * abstraction over DataView that serves as a typed getter/setter in case\r\n * you\'re using constants for the byte size and want to ensure there\'s no\r\n * discrepenancy in the encoding across refactors.\r\n *\r\n * DataView serves for an endian-agnostic handling of numbers in ArrayBuffers.\r\n */\r\nfunction dataView(buffer, bytes, offset, value) {\r\n if (value != null) {\r\n if (value > Math.pow(2, DATA_VIEW_BITS_MAP[bytes]) - 1) {\r\n throw new Error("attempting to set value higher than the allocated bytes (value: ".concat(value, ", bytes: ").concat(bytes, ")"));\r\n }\r\n const method = "setUint".concat(DATA_VIEW_BITS_MAP[bytes]);\r\n new DataView(buffer.buffer)[method](offset, value);\r\n return buffer;\r\n }\r\n const method = "getUint".concat(DATA_VIEW_BITS_MAP[bytes]);\r\n return new DataView(buffer.buffer)[method](offset);\r\n} // -----------------------------------------------------------------------------\r\n/**\r\n * Resulting concatenated buffer has this format:\r\n *\r\n * [\r\n * VERSION chunk (4 bytes)\r\n * LENGTH chunk 1 (4 bytes)\r\n * DATA chunk 1 (up to 2^32 bits)\r\n * LENGTH chunk 2 (4 bytes)\r\n * DATA chunk 2 (up to 2^32 bits)\r\n * ...\r\n * ]\r\n *\r\n * @param buffers each buffer (chunk) must be at most 2^32 bits large (~4GB)\r\n */\r\nconst concatBuffers = function () {\r\n for (var _len = arguments.length, buffers = new Array(_len), _key = 0; _key < _len; _key++) {\r\n buffers[_key] = arguments[_key];\r\n }\r\n const bufferView = new Uint8Array(VERSION_DATAVIEW_BYTES + NEXT_CHUNK_SIZE_DATAVIEW_BYTES * buffers.length + buffers.reduce((acc, buffer) => acc + buffer.byteLength, 0));\r\n let cursor = 0; // as the first chunk we\'ll encode the version for backwards compatibility\r\n dataView(bufferView, VERSION_DATAVIEW_BYTES, cursor, CONCAT_BUFFERS_VERSION);\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n for (const buffer of buffers) {\r\n dataView(bufferView, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor, buffer.byteLength);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n bufferView.set(buffer, cursor);\r\n cursor += buffer.byteLength;\r\n }\r\n return bufferView;\r\n};\r\n/** can only be used on buffers created via `concatBuffers()` */\r\nconst splitBuffers = concatenatedBuffer => {\r\n const buffers = [];\r\n let cursor = 0; // first chunk is the version\r\n const version = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor); // If version is outside of the supported versions, throw an error.\r\n // This usually means the buffer wasn\'t encoded using this API, so we\'d only\r\n // waste compute.\r\n if (version > CONCAT_BUFFERS_VERSION) {\r\n throw new Error("invalid version ".concat(version));\r\n }\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n while (true) {\r\n const chunkSize = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n buffers.push(concatenatedBuffer.slice(cursor, cursor + chunkSize));\r\n cursor += chunkSize;\r\n if (cursor >= concatenatedBuffer.byteLength) {\r\n break;\r\n }\r\n }\r\n return buffers;\r\n}; // helpers for (de)compressing data with JSON metadata including encryption\r\n// -----------------------------------------------------------------------------\r\n/** @private */\r\nconst _encryptAndCompress = async (data, encryptionKey) => {\r\n const { encryptedBuffer, iv } = await encryptData(encryptionKey, deflate(data));\r\n return {\r\n iv,\r\n buffer: new Uint8Array(encryptedBuffer)\r\n };\r\n};\r\n/**\r\n * The returned buffer has following format:\r\n * `[]` refers to a buffers wrapper (see `concatBuffers`)\r\n *\r\n * [\r\n * encodingMetadataBuffer,\r\n * iv,\r\n * [\r\n * contentsMetadataBuffer\r\n * contentsBuffer\r\n * ]\r\n * ]\r\n */\r\nconst compressData = async (dataBuffer, options) => {\r\n const fileInfo = {\r\n version: 2,\r\n compression: "pako@1",\r\n encryption: "AES-GCM"\r\n };\r\n const encodingMetadataBuffer = new TextEncoder().encode(JSON.stringify(fileInfo));\r\n const contentsMetadataBuffer = new TextEncoder().encode(JSON.stringify(options.metadata || null));\r\n const { iv, buffer } = await _encryptAndCompress(concatBuffers(contentsMetadataBuffer, dataBuffer), options.encryptionKey);\r\n return concatBuffers(encodingMetadataBuffer, iv, buffer);\r\n};\r\n/** @private */\r\nconst _decryptAndDecompress = async (iv, decryptedBuffer, decryptionKey, isCompressed) => {\r\n decryptedBuffer = new Uint8Array(await decryptData(iv, decryptedBuffer, decryptionKey));\r\n if (isCompressed) {\r\n return inflate(decryptedBuffer);\r\n }\r\n return decryptedBuffer;\r\n};\r\nconst decompressData = async (bufferView, options) => {\r\n // first chunk is encoding metadata (ignored for now)\r\n const [encodingMetadataBuffer, iv, buffer] = splitBuffers(bufferView);\r\n const encodingMetadata = JSON.parse(new TextDecoder().decode(encodingMetadataBuffer));\r\n try {\r\n const [contentsMetadataBuffer, contentsBuffer] = splitBuffers(await _decryptAndDecompress(iv, buffer, options.decryptionKey, !!encodingMetadata.compression));\r\n const metadata = JSON.parse(new TextDecoder().decode(contentsMetadataBuffer));\r\n return {\r\n /** metadata source is always JSON so we can decode it here */\r\n metadata,\r\n /** data can be anything so the caller must decode it */\r\n data: contentsBuffer\r\n };\r\n }\r\n catch (error) {\r\n console.error("Error during decompressing and decrypting the file.", encodingMetadata);\r\n throw error;\r\n }\r\n}; // -----------------------------------------------------------------------------\r\n\n;// CONCATENATED MODULE: ../../data/image.ts\n\r\n\r\n\r\n\r\n // -----------------------------------------------------------------------------\r\n// PNG\r\n// -----------------------------------------------------------------------------\r\nconst blobToArrayBuffer = blob => {\r\n if ("arrayBuffer" in blob) {\r\n return blob.arrayBuffer();\r\n } // Safari\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = event => {\r\n var _event$target;\r\n if (!((_event$target = event.target) !== null && _event$target !== void 0 && _event$target.result)) {\r\n return reject(new Error("couldn\'t convert blob to ArrayBuffer"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsArrayBuffer(blob);\r\n });\r\n};\r\nconst getTEXtChunk = async (blob) => {\r\n const chunks = png_chunks_extract_default()(new Uint8Array(await blobToArrayBuffer(blob)));\r\n const metadataChunk = chunks.find(chunk => chunk.name === "tEXt");\r\n if (metadataChunk) {\r\n return png_chunk_text.decode(metadataChunk.data);\r\n }\r\n return null;\r\n};\r\nconst encodePngMetadata = async (_ref) => {\r\n let { blob, metadata } = _ref;\r\n const chunks = png_chunks_extract_default()(new Uint8Array(await blobToArrayBuffer(blob)));\r\n const metadataChunk = png_chunk_text.encode(constants/* MIME_TYPES.excalidraw */.LO.excalidraw, JSON.stringify(await encode({\r\n text: metadata,\r\n compress: true\r\n }))); // insert metadata before last chunk (iEND)\r\n chunks.splice(-1, 0, metadataChunk);\r\n return new Blob([png_chunks_encode_default()(chunks)], {\r\n type: constants/* MIME_TYPES.png */.LO.png\r\n });\r\n};\r\nconst decodePngMetadata = async (blob) => {\r\n const metadata = await getTEXtChunk(blob);\r\n if ((metadata === null || metadata === void 0 ? void 0 : metadata.keyword) === constants/* MIME_TYPES.excalidraw */.LO.excalidraw) {\r\n try {\r\n const encodedData = JSON.parse(metadata.text);\r\n if (!("encoded" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if ("type" in encodedData && encodedData.type === constants/* EXPORT_DATA_TYPES.excalidraw */.r8.excalidraw) {\r\n return metadata.text;\r\n }\r\n throw new Error("FAILED");\r\n }\r\n return await decode(encodedData);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n throw new Error("FAILED");\r\n }\r\n }\r\n throw new Error("INVALID");\r\n}; // -----------------------------------------------------------------------------\r\n// SVG\r\n// -----------------------------------------------------------------------------\r\nconst encodeSvgMetadata = async (_ref2) => {\r\n let { text } = _ref2;\r\n const base64 = await stringToBase64(JSON.stringify(await encode({\r\n text\r\n })), true\r\n /* is already byte string */\r\n );\r\n let metadata = "";\r\n metadata += "\x3c!-- payload-type:".concat(constants/* MIME_TYPES.excalidraw */.LO.excalidraw, " --\x3e");\r\n metadata += "\x3c!-- payload-version:2 --\x3e";\r\n metadata += "\x3c!-- payload-start --\x3e";\r\n metadata += base64;\r\n metadata += "\x3c!-- payload-end --\x3e";\r\n return metadata;\r\n};\r\nconst decodeSvgMetadata = async (_ref3) => {\r\n let { svg } = _ref3;\r\n if (svg.includes("payload-type:".concat(constants/* MIME_TYPES.excalidraw */.LO.excalidraw))) {\r\n const match = svg.match(/\x3c!-- payload-start --\x3e(.+?)\x3c!-- payload-end --\x3e/);\r\n if (!match) {\r\n throw new Error("INVALID");\r\n }\r\n const versionMatch = svg.match(/\x3c!-- payload-version:(\\d+) --\x3e/);\r\n const version = (versionMatch === null || versionMatch === void 0 ? void 0 : versionMatch[1]) || "1";\r\n const isByteString = version !== "1";\r\n try {\r\n const json = await base64ToString(match[1], isByteString);\r\n const encodedData = JSON.parse(json);\r\n if (!("encoded" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if ("type" in encodedData && encodedData.type === constants/* EXPORT_DATA_TYPES.excalidraw */.r8.excalidraw) {\r\n return json;\r\n }\r\n throw new Error("FAILED");\r\n }\r\n return await decode(encodedData);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n throw new Error("FAILED");\r\n }\r\n }\r\n throw new Error("INVALID");\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjczLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBbUQ7QUFDNUM7QUFDQTtBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ08sTUFBTSxzQkFBVztBQUN4QjtBQUNBO0FBQ0EsMktBQTJLO0FBQzNLO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxNQUFNLHNCQUFXO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUM3Q3dDO0FBQ2dCLENBQUM7QUFDekQ7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxTQUFTO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxHQUFHO0FBQ0k7QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLFVBQVUsaUJBQWlCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxnQkFBTztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQkFBTztBQUN0QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsYUFBYTtBQUN4RjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsMEZBQTBGO0FBQzFGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLFlBQVksc0JBQXNCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGFBQWE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUNyT3dDO0FBQ1Q7QUFDUTtBQUNnQztBQUNiLENBQUM7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1AsbUJBQW1CLDRCQUFTO0FBQzVCO0FBQ0E7QUFDQSxlQUFlLHFCQUFXO0FBQzFCO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsVUFBVSxpQkFBaUI7QUFDM0IsbUJBQW1CLDRCQUFTO0FBQzVCLDBCQUEwQixxQkFBVyxDQUFDLGtEQUFxQix1QkFBdUIsTUFBTTtBQUN4RjtBQUNBO0FBQ0EsS0FBSyxLQUFLO0FBQ1Y7QUFDQSxxQkFBcUIsMkJBQVM7QUFDOUIsY0FBYyxvQ0FBYztBQUM1QixLQUFLO0FBQ0w7QUFDTztBQUNQO0FBQ0EsbUZBQW1GLGtEQUFxQjtBQUN4RztBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRSx5REFBNEI7QUFDOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsTUFBTTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ087QUFDUCxVQUFVLE9BQU87QUFDakIseUJBQXlCLGNBQWMsc0JBQXNCLE1BQU07QUFDbkU7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLGtEQUFxQjtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLFVBQVUsTUFBTTtBQUNoQiw0Q0FBNEMsa0RBQXFCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsY0FBYztBQUM3QztBQUNBO0FBQ0E7QUFDQSxrRUFBa0UseURBQTRCO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLE1BQU07QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9kYXRhL2VuY3J5cHRpb24udHM/MDI3MiIsIndlYnBhY2s6Ly8vLi4vLi4vZGF0YS9lbmNvZGUudHM/MzFlYyIsIndlYnBhY2s6Ly8vLi4vLi4vZGF0YS9pbWFnZS50cz85MTYxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVOQ1JZUFRJT05fS0VZX0JJVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmV4cG9ydCBjb25zdCBJVl9MRU5HVEhfQllURVMgPSAxMjtcclxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlWID0gKCkgPT4ge1xyXG4gICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoSVZfTEVOR1RIX0JZVEVTKTtcclxuICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnIpO1xyXG59O1xyXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVFbmNyeXB0aW9uS2V5ID0gYXN5bmMgKHJldHVybkFzKSA9PiB7XHJcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB3aW5kb3cuY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleSh7XHJcbiAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXHJcbiAgICAgICAgbGVuZ3RoOiBFTkNSWVBUSU9OX0tFWV9CSVRTXHJcbiAgICB9LCB0cnVlLCAvLyBleHRyYWN0YWJsZVxyXG4gICAgW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIl0pO1xyXG4gICAgcmV0dXJuIHJldHVybkFzID09PSBcImNyeXB0b0tleVwiID8ga2V5IDogKGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleShcImp3a1wiLCBrZXkpKS5rO1xyXG59O1xyXG5leHBvcnQgY29uc3QgZ2V0Q3J5cHRvS2V5ID0gKGtleSwgdXNhZ2UpID0+IHdpbmRvdy5jcnlwdG8uc3VidGxlLmltcG9ydEtleShcImp3a1wiLCB7XHJcbiAgICBhbGc6IFwiQTEyOEdDTVwiLFxyXG4gICAgZXh0OiB0cnVlLFxyXG4gICAgazoga2V5LFxyXG4gICAga2V5X29wczogW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIl0sXHJcbiAgICBrdHk6IFwib2N0XCJcclxufSwge1xyXG4gICAgbmFtZTogXCJBRVMtR0NNXCIsXHJcbiAgICBsZW5ndGg6IEVOQ1JZUFRJT05fS0VZX0JJVFNcclxufSwgZmFsc2UsIC8vIGV4dHJhY3RhYmxlXHJcblt1c2FnZV0pO1xyXG5leHBvcnQgY29uc3QgZW5jcnlwdERhdGEgPSBhc3luYyAoa2V5LCBkYXRhKSA9PiB7XHJcbiAgICBjb25zdCBpbXBvcnRlZEtleSA9IHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgPyBhd2FpdCBnZXRDcnlwdG9LZXkoa2V5LCBcImVuY3J5cHRcIikgOiBrZXk7XHJcbiAgICBjb25zdCBpdiA9IGNyZWF0ZUlWKCk7XHJcbiAgICBjb25zdCBidWZmZXIgPSB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShkYXRhKSA6IGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gZGF0YSA6IGRhdGEgaW5zdGFuY2VvZiBCbG9iID8gYXdhaXQgZGF0YS5hcnJheUJ1ZmZlcigpIDogZGF0YTsgLy8gV2UgdXNlIHN5bW1ldHJpYyBlbmNyeXB0aW9uLiBBRVMtR0NNIGlzIHRoZSByZWNvbW1lbmRlZCBhbGdvcml0aG0gYW5kXHJcbiAgICAvLyBpbmNsdWRlcyBjaGVja3MgdGhhdCB0aGUgY2lwaGVydGV4dCBoYXMgbm90IGJlZW4gbW9kaWZpZWQgYnkgYW4gYXR0YWNrZXIuXHJcbiAgICBjb25zdCBlbmNyeXB0ZWRCdWZmZXIgPSBhd2FpdCB3aW5kb3cuY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHtcclxuICAgICAgICBuYW1lOiBcIkFFUy1HQ01cIixcclxuICAgICAgICBpdlxyXG4gICAgfSwgaW1wb3J0ZWRLZXksIGJ1ZmZlcik7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGVuY3J5cHRlZEJ1ZmZlcixcclxuICAgICAgICBpdlxyXG4gICAgfTtcclxufTtcclxuZXhwb3J0IGNvbnN0IGRlY3J5cHREYXRhID0gYXN5bmMgKGl2LCBlbmNyeXB0ZWQsIHByaXZhdGVLZXkpID0+IHtcclxuICAgIGNvbnN0IGtleSA9IGF3YWl0IGdldENyeXB0b0tleShwcml2YXRlS2V5LCBcImRlY3J5cHRcIik7XHJcbiAgICByZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuZGVjcnlwdCh7XHJcbiAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXHJcbiAgICAgICAgaXZcclxuICAgIH0sIGtleSwgZW5jcnlwdGVkKTtcclxufTtcclxuIiwiaW1wb3J0IHsgZGVmbGF0ZSwgaW5mbGF0ZSB9IGZyb20gXCJwYWtvXCI7XHJcbmltcG9ydCB7IGVuY3J5cHREYXRhLCBkZWNyeXB0RGF0YSB9IGZyb20gXCIuL2VuY3J5cHRpb25cIjsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gYnl0ZSAoYmluYXJ5KSBzdHJpbmdzXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIGZhc3QsIEJ1ZmZlci1jb21wYXRpYmxlIGltcGxlbVxyXG5leHBvcnQgY29uc3QgdG9CeXRlU3RyaW5nID0gZGF0YSA9PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJsb2IgPSB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IG5ldyBCbG9iKFtuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZGF0YSldKSA6IG5ldyBCbG9iKFtkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGRhdGEgOiBuZXcgVWludDhBcnJheShkYXRhKV0pO1xyXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQgfHwgdHlwZW9mIGV2ZW50LnRhcmdldC5yZXN1bHQgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKFwiY291bGRuJ3QgY29udmVydCB0byBieXRlIHN0cmluZ1wiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzb2x2ZShldmVudC50YXJnZXQucmVzdWx0KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoYmxvYik7XHJcbiAgICB9KTtcclxufTtcclxuY29uc3QgYnl0ZVN0cmluZ1RvQXJyYXlCdWZmZXIgPSBieXRlU3RyaW5nID0+IHtcclxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XHJcbiAgICBjb25zdCBidWZmZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBieXRlU3RyaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgYnVmZmVyVmlld1tpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBidWZmZXI7XHJcbn07XHJcbmNvbnN0IGJ5dGVTdHJpbmdUb1N0cmluZyA9IGJ5dGVTdHJpbmcgPT4ge1xyXG4gICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpLmRlY29kZShieXRlU3RyaW5nVG9BcnJheUJ1ZmZlcihieXRlU3RyaW5nKSk7XHJcbn07IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIGJhc2U2NFxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vKipcclxuICogQHBhcmFtIGlzQnl0ZVN0cmluZyBzZXQgdG8gdHJ1ZSBpZiBhbHJlYWR5IGJ5dGUgc3RyaW5nIHRvIHByZXZlbnQgYmxvYXRcclxuICogIGR1ZSB0byByZWVuY29kaW5nXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc3RyaW5nVG9CYXNlNjQgPSBhc3luYyBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICBsZXQgaXNCeXRlU3RyaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcclxuICAgIHJldHVybiBpc0J5dGVTdHJpbmcgPyB3aW5kb3cuYnRvYShzdHIpIDogd2luZG93LmJ0b2EoYXdhaXQgdG9CeXRlU3RyaW5nKHN0cikpO1xyXG59OyAvLyBhc3luYyB0byBhbGlnbiB3aXRoIHN0cmluZ1RvQmFzZTY0XHJcbmV4cG9ydCBjb25zdCBiYXNlNjRUb1N0cmluZyA9IGFzeW5jIGZ1bmN0aW9uIChiYXNlNjQpIHtcclxuICAgIGxldCBpc0J5dGVTdHJpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xyXG4gICAgcmV0dXJuIGlzQnl0ZVN0cmluZyA/IHdpbmRvdy5hdG9iKGJhc2U2NCkgOiBieXRlU3RyaW5nVG9TdHJpbmcod2luZG93LmF0b2IoYmFzZTY0KSk7XHJcbn07IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIHRleHQgZW5jb2RpbmdcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLyoqXHJcbiAqIEVuY29kZXMgKGFuZCBwb3RlbnRpYWxseSBjb21wcmVzc2VzIHZpYSB6bGliKSB0ZXh0IHRvIGJ5dGUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZW5jb2RlID0gYXN5bmMgKF9yZWYpID0+IHtcclxuICAgIGxldCB7IHRleHQsIGNvbXByZXNzIH0gPSBfcmVmO1xyXG4gICAgbGV0IGRlZmxhdGVkO1xyXG4gICAgaWYgKGNvbXByZXNzICE9PSBmYWxzZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGRlZmxhdGVkID0gYXdhaXQgdG9CeXRlU3RyaW5nKGRlZmxhdGUodGV4dCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcImVuY29kZTogY2Fubm90IGRlZmxhdGVcIiwgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgdmVyc2lvbjogXCIxXCIsXHJcbiAgICAgICAgZW5jb2Rpbmc6IFwiYnN0cmluZ1wiLFxyXG4gICAgICAgIGNvbXByZXNzZWQ6ICEhZGVmbGF0ZWQsXHJcbiAgICAgICAgZW5jb2RlZDogZGVmbGF0ZWQgfHwgKGF3YWl0IHRvQnl0ZVN0cmluZyh0ZXh0KSlcclxuICAgIH07XHJcbn07XHJcbmV4cG9ydCBjb25zdCBkZWNvZGUgPSBhc3luYyAoZGF0YSkgPT4ge1xyXG4gICAgbGV0IGRlY29kZWQ7XHJcbiAgICBzd2l0Y2ggKGRhdGEuZW5jb2RpbmcpIHtcclxuICAgICAgICBjYXNlIFwiYnN0cmluZ1wiOlxyXG4gICAgICAgICAgICAvLyBpZiBjb21wcmVzc2VkLCBkbyBub3QgZG91YmxlIGRlY29kZSB0aGUgYnN0cmluZ1xyXG4gICAgICAgICAgICBkZWNvZGVkID0gZGF0YS5jb21wcmVzc2VkID8gZGF0YS5lbmNvZGVkIDogYXdhaXQgYnl0ZVN0cmluZ1RvU3RyaW5nKGRhdGEuZW5jb2RlZCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImRlY29kZTogdW5rbm93biBlbmNvZGluZyBcXFwiXCIuY29uY2F0KGRhdGEuZW5jb2RpbmcsIFwiXFxcIlwiKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoZGF0YS5jb21wcmVzc2VkKSB7XHJcbiAgICAgICAgcmV0dXJuIGluZmxhdGUobmV3IFVpbnQ4QXJyYXkoYnl0ZVN0cmluZ1RvQXJyYXlCdWZmZXIoZGVjb2RlZCkpLCB7XHJcbiAgICAgICAgICAgIHRvOiBcInN0cmluZ1wiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGVjb2RlZDtcclxufTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gYmluYXJ5IGVuY29kaW5nXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmNvbnN0IENPTkNBVF9CVUZGRVJTX1ZFUlNJT04gPSAxO1xyXG4vKiogaG93IG1hbnkgYnl0ZXMgd2UgdXNlIHRvIGVuY29kZSBob3cgbWFueSBieXRlcyB0aGUgbmV4dCBjaHVuayBoYXMuXHJcbiAqIENvcnJlc3BvbmRzIHRvIERhdGFWaWV3IHNldHRlciBtZXRob2RzIChzZXRVaW50MzIsIHNldFVpbnQxNiwgZXRjKS5cclxuICpcclxuICogTk9URSAhIHZhbHVlcyBtdXN0IG5vdCBiZSBjaGFuZ2VkLCB3aGljaCB3b3VsZCBiZSBiYWNrd2FyZHMgaW5jb21wYXRpYmxlICFcclxuICovXHJcbmNvbnN0IFZFUlNJT05fREFUQVZJRVdfQllURVMgPSA0O1xyXG5jb25zdCBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMgPSA0OyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5jb25zdCBEQVRBX1ZJRVdfQklUU19NQVAgPSB7XHJcbiAgICAxOiA4LFxyXG4gICAgMjogMTYsXHJcbiAgICA0OiAzMlxyXG59OyAvLyBnZXR0ZXJcclxuLyoqXHJcbiAqIGFic3RyYWN0aW9uIG92ZXIgRGF0YVZpZXcgdGhhdCBzZXJ2ZXMgYXMgYSB0eXBlZCBnZXR0ZXIvc2V0dGVyIGluIGNhc2VcclxuICogeW91J3JlIHVzaW5nIGNvbnN0YW50cyBmb3IgdGhlIGJ5dGUgc2l6ZSBhbmQgd2FudCB0byBlbnN1cmUgdGhlcmUncyBub1xyXG4gKiBkaXNjcmVwZW5hbmN5IGluIHRoZSBlbmNvZGluZyBhY3Jvc3MgcmVmYWN0b3JzLlxyXG4gKlxyXG4gKiBEYXRhVmlldyBzZXJ2ZXMgZm9yIGFuIGVuZGlhbi1hZ25vc3RpYyBoYW5kbGluZyBvZiBudW1iZXJzIGluIEFycmF5QnVmZmVycy5cclxuICovXHJcbmZ1bmN0aW9uIGRhdGFWaWV3KGJ1ZmZlciwgYnl0ZXMsIG9mZnNldCwgdmFsdWUpIHtcclxuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID4gTWF0aC5wb3coMiwgREFUQV9WSUVXX0JJVFNfTUFQW2J5dGVzXSkgLSAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImF0dGVtcHRpbmcgdG8gc2V0IHZhbHVlIGhpZ2hlciB0aGFuIHRoZSBhbGxvY2F0ZWQgYnl0ZXMgKHZhbHVlOiBcIi5jb25jYXQodmFsdWUsIFwiLCBieXRlczogXCIpLmNvbmNhdChieXRlcywgXCIpXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbWV0aG9kID0gXCJzZXRVaW50XCIuY29uY2F0KERBVEFfVklFV19CSVRTX01BUFtieXRlc10pO1xyXG4gICAgICAgIG5ldyBEYXRhVmlldyhidWZmZXIuYnVmZmVyKVttZXRob2RdKG9mZnNldCwgdmFsdWUpO1xyXG4gICAgICAgIHJldHVybiBidWZmZXI7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtZXRob2QgPSBcImdldFVpbnRcIi5jb25jYXQoREFUQV9WSUVXX0JJVFNfTUFQW2J5dGVzXSk7XHJcbiAgICByZXR1cm4gbmV3IERhdGFWaWV3KGJ1ZmZlci5idWZmZXIpW21ldGhvZF0ob2Zmc2V0KTtcclxufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vKipcclxuICogUmVzdWx0aW5nIGNvbmNhdGVuYXRlZCBidWZmZXIgaGFzIHRoaXMgZm9ybWF0OlxyXG4gKlxyXG4gKiBbXHJcbiAqICAgVkVSU0lPTiBjaHVuayAoNCBieXRlcylcclxuICogICBMRU5HVEggY2h1bmsgMSAoNCBieXRlcylcclxuICogICBEQVRBIGNodW5rIDEgKHVwIHRvIDJeMzIgYml0cylcclxuICogICBMRU5HVEggY2h1bmsgMiAoNCBieXRlcylcclxuICogICBEQVRBIGNodW5rIDIgKHVwIHRvIDJeMzIgYml0cylcclxuICogICAuLi5cclxuICogXVxyXG4gKlxyXG4gKiBAcGFyYW0gYnVmZmVycyBlYWNoIGJ1ZmZlciAoY2h1bmspIG11c3QgYmUgYXQgbW9zdCAyXjMyIGJpdHMgbGFyZ2UgKH40R0IpXHJcbiAqL1xyXG5jb25zdCBjb25jYXRCdWZmZXJzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGJ1ZmZlcnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XHJcbiAgICAgICAgYnVmZmVyc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcclxuICAgIH1cclxuICAgIGNvbnN0IGJ1ZmZlclZpZXcgPSBuZXcgVWludDhBcnJheShWRVJTSU9OX0RBVEFWSUVXX0JZVEVTICsgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTICogYnVmZmVycy5sZW5ndGggKyBidWZmZXJzLnJlZHVjZSgoYWNjLCBidWZmZXIpID0+IGFjYyArIGJ1ZmZlci5ieXRlTGVuZ3RoLCAwKSk7XHJcbiAgICBsZXQgY3Vyc29yID0gMDsgLy8gYXMgdGhlIGZpcnN0IGNodW5rIHdlJ2xsIGVuY29kZSB0aGUgdmVyc2lvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuICAgIGRhdGFWaWV3KGJ1ZmZlclZpZXcsIFZFUlNJT05fREFUQVZJRVdfQllURVMsIGN1cnNvciwgQ09OQ0FUX0JVRkZFUlNfVkVSU0lPTik7XHJcbiAgICBjdXJzb3IgKz0gVkVSU0lPTl9EQVRBVklFV19CWVRFUztcclxuICAgIGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcnMpIHtcclxuICAgICAgICBkYXRhVmlldyhidWZmZXJWaWV3LCBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMsIGN1cnNvciwgYnVmZmVyLmJ5dGVMZW5ndGgpO1xyXG4gICAgICAgIGN1cnNvciArPSBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVM7XHJcbiAgICAgICAgYnVmZmVyVmlldy5zZXQoYnVmZmVyLCBjdXJzb3IpO1xyXG4gICAgICAgIGN1cnNvciArPSBidWZmZXIuYnl0ZUxlbmd0aDtcclxuICAgIH1cclxuICAgIHJldHVybiBidWZmZXJWaWV3O1xyXG59O1xyXG4vKiogY2FuIG9ubHkgYmUgdXNlZCBvbiBidWZmZXJzIGNyZWF0ZWQgdmlhIGBjb25jYXRCdWZmZXJzKClgICovXHJcbmNvbnN0IHNwbGl0QnVmZmVycyA9IGNvbmNhdGVuYXRlZEJ1ZmZlciA9PiB7XHJcbiAgICBjb25zdCBidWZmZXJzID0gW107XHJcbiAgICBsZXQgY3Vyc29yID0gMDsgLy8gZmlyc3QgY2h1bmsgaXMgdGhlIHZlcnNpb25cclxuICAgIGNvbnN0IHZlcnNpb24gPSBkYXRhVmlldyhjb25jYXRlbmF0ZWRCdWZmZXIsIE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUywgY3Vyc29yKTsgLy8gSWYgdmVyc2lvbiBpcyBvdXRzaWRlIG9mIHRoZSBzdXBwb3J0ZWQgdmVyc2lvbnMsIHRocm93IGFuIGVycm9yLlxyXG4gICAgLy8gVGhpcyB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgd2Fzbid0IGVuY29kZWQgdXNpbmcgdGhpcyBBUEksIHNvIHdlJ2Qgb25seVxyXG4gICAgLy8gd2FzdGUgY29tcHV0ZS5cclxuICAgIGlmICh2ZXJzaW9uID4gQ09OQ0FUX0JVRkZFUlNfVkVSU0lPTikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgdmVyc2lvbiBcIi5jb25jYXQodmVyc2lvbikpO1xyXG4gICAgfVxyXG4gICAgY3Vyc29yICs9IFZFUlNJT05fREFUQVZJRVdfQllURVM7XHJcbiAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IGRhdGFWaWV3KGNvbmNhdGVuYXRlZEJ1ZmZlciwgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTLCBjdXJzb3IpO1xyXG4gICAgICAgIGN1cnNvciArPSBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVM7XHJcbiAgICAgICAgYnVmZmVycy5wdXNoKGNvbmNhdGVuYXRlZEJ1ZmZlci5zbGljZShjdXJzb3IsIGN1cnNvciArIGNodW5rU2l6ZSkpO1xyXG4gICAgICAgIGN1cnNvciArPSBjaHVua1NpemU7XHJcbiAgICAgICAgaWYgKGN1cnNvciA+PSBjb25jYXRlbmF0ZWRCdWZmZXIuYnl0ZUxlbmd0aCkge1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnVmZmVycztcclxufTsgLy8gaGVscGVycyBmb3IgKGRlKWNvbXByZXNzaW5nIGRhdGEgd2l0aCBKU09OIG1ldGFkYXRhIGluY2x1ZGluZyBlbmNyeXB0aW9uXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8qKiBAcHJpdmF0ZSAqL1xyXG5jb25zdCBfZW5jcnlwdEFuZENvbXByZXNzID0gYXN5bmMgKGRhdGEsIGVuY3J5cHRpb25LZXkpID0+IHtcclxuICAgIGNvbnN0IHsgZW5jcnlwdGVkQnVmZmVyLCBpdiB9ID0gYXdhaXQgZW5jcnlwdERhdGEoZW5jcnlwdGlvbktleSwgZGVmbGF0ZShkYXRhKSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGl2LFxyXG4gICAgICAgIGJ1ZmZlcjogbmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkQnVmZmVyKVxyXG4gICAgfTtcclxufTtcclxuLyoqXHJcbiAqIFRoZSByZXR1cm5lZCBidWZmZXIgaGFzIGZvbGxvd2luZyBmb3JtYXQ6XHJcbiAqIGBbXWAgcmVmZXJzIHRvIGEgYnVmZmVycyB3cmFwcGVyIChzZWUgYGNvbmNhdEJ1ZmZlcnNgKVxyXG4gKlxyXG4gKiBbXHJcbiAqICAgZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlcixcclxuICogICBpdixcclxuICogICBbXHJcbiAqICAgICAgY29udGVudHNNZXRhZGF0YUJ1ZmZlclxyXG4gKiAgICAgIGNvbnRlbnRzQnVmZmVyXHJcbiAqICAgXVxyXG4gKiBdXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29tcHJlc3NEYXRhID0gYXN5bmMgKGRhdGFCdWZmZXIsIG9wdGlvbnMpID0+IHtcclxuICAgIGNvbnN0IGZpbGVJbmZvID0ge1xyXG4gICAgICAgIHZlcnNpb246IDIsXHJcbiAgICAgICAgY29tcHJlc3Npb246IFwicGFrb0AxXCIsXHJcbiAgICAgICAgZW5jcnlwdGlvbjogXCJBRVMtR0NNXCJcclxuICAgIH07XHJcbiAgICBjb25zdCBlbmNvZGluZ01ldGFkYXRhQnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGZpbGVJbmZvKSk7XHJcbiAgICBjb25zdCBjb250ZW50c01ldGFkYXRhQnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KG9wdGlvbnMubWV0YWRhdGEgfHwgbnVsbCkpO1xyXG4gICAgY29uc3QgeyBpdiwgYnVmZmVyIH0gPSBhd2FpdCBfZW5jcnlwdEFuZENvbXByZXNzKGNvbmNhdEJ1ZmZlcnMoY29udGVudHNNZXRhZGF0YUJ1ZmZlciwgZGF0YUJ1ZmZlciksIG9wdGlvbnMuZW5jcnlwdGlvbktleSk7XHJcbiAgICByZXR1cm4gY29uY2F0QnVmZmVycyhlbmNvZGluZ01ldGFkYXRhQnVmZmVyLCBpdiwgYnVmZmVyKTtcclxufTtcclxuLyoqIEBwcml2YXRlICovXHJcbmNvbnN0IF9kZWNyeXB0QW5kRGVjb21wcmVzcyA9IGFzeW5jIChpdiwgZGVjcnlwdGVkQnVmZmVyLCBkZWNyeXB0aW9uS2V5LCBpc0NvbXByZXNzZWQpID0+IHtcclxuICAgIGRlY3J5cHRlZEJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGF3YWl0IGRlY3J5cHREYXRhKGl2LCBkZWNyeXB0ZWRCdWZmZXIsIGRlY3J5cHRpb25LZXkpKTtcclxuICAgIGlmIChpc0NvbXByZXNzZWQpIHtcclxuICAgICAgICByZXR1cm4gaW5mbGF0ZShkZWNyeXB0ZWRCdWZmZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRlY3J5cHRlZEJ1ZmZlcjtcclxufTtcclxuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NEYXRhID0gYXN5bmMgKGJ1ZmZlclZpZXcsIG9wdGlvbnMpID0+IHtcclxuICAgIC8vIGZpcnN0IGNodW5rIGlzIGVuY29kaW5nIG1ldGFkYXRhIChpZ25vcmVkIGZvciBub3cpXHJcbiAgICBjb25zdCBbZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlciwgaXYsIGJ1ZmZlcl0gPSBzcGxpdEJ1ZmZlcnMoYnVmZmVyVmlldyk7XHJcbiAgICBjb25zdCBlbmNvZGluZ01ldGFkYXRhID0gSlNPTi5wYXJzZShuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlcikpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBbY29udGVudHNNZXRhZGF0YUJ1ZmZlciwgY29udGVudHNCdWZmZXJdID0gc3BsaXRCdWZmZXJzKGF3YWl0IF9kZWNyeXB0QW5kRGVjb21wcmVzcyhpdiwgYnVmZmVyLCBvcHRpb25zLmRlY3J5cHRpb25LZXksICEhZW5jb2RpbmdNZXRhZGF0YS5jb21wcmVzc2lvbikpO1xyXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gSlNPTi5wYXJzZShuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoY29udGVudHNNZXRhZGF0YUJ1ZmZlcikpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC8qKiBtZXRhZGF0YSBzb3VyY2UgaXMgYWx3YXlzIEpTT04gc28gd2UgY2FuIGRlY29kZSBpdCBoZXJlICovXHJcbiAgICAgICAgICAgIG1ldGFkYXRhLFxyXG4gICAgICAgICAgICAvKiogZGF0YSBjYW4gYmUgYW55dGhpbmcgc28gdGhlIGNhbGxlciBtdXN0IGRlY29kZSBpdCAqL1xyXG4gICAgICAgICAgICBkYXRhOiBjb250ZW50c0J1ZmZlclxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIGRlY29tcHJlc3NpbmcgYW5kIGRlY3J5cHRpbmcgdGhlIGZpbGUuXCIsIGVuY29kaW5nTWV0YWRhdGEpO1xyXG4gICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfVxyXG59OyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4iLCJpbXBvcnQgZGVjb2RlUG5nIGZyb20gXCJwbmctY2h1bmtzLWV4dHJhY3RcIjtcclxuaW1wb3J0IHRFWHQgZnJvbSBcInBuZy1jaHVuay10ZXh0XCI7XHJcbmltcG9ydCBlbmNvZGVQbmcgZnJvbSBcInBuZy1jaHVua3MtZW5jb2RlXCI7XHJcbmltcG9ydCB7IHN0cmluZ1RvQmFzZTY0LCBlbmNvZGUsIGRlY29kZSwgYmFzZTY0VG9TdHJpbmcgfSBmcm9tIFwiLi9lbmNvZGVcIjtcclxuaW1wb3J0IHsgRVhQT1JUX0RBVEFfVFlQRVMsIE1JTUVfVFlQRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFBOR1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5jb25zdCBibG9iVG9BcnJheUJ1ZmZlciA9IGJsb2IgPT4ge1xyXG4gICAgaWYgKFwiYXJyYXlCdWZmZXJcIiBpbiBibG9iKSB7XHJcbiAgICAgICAgcmV0dXJuIGJsb2IuYXJyYXlCdWZmZXIoKTtcclxuICAgIH0gLy8gU2FmYXJpXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgdmFyIF9ldmVudCR0YXJnZXQ7XHJcbiAgICAgICAgICAgIGlmICghKChfZXZlbnQkdGFyZ2V0ID0gZXZlbnQudGFyZ2V0KSAhPT0gbnVsbCAmJiBfZXZlbnQkdGFyZ2V0ICE9PSB2b2lkIDAgJiYgX2V2ZW50JHRhcmdldC5yZXN1bHQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcImNvdWxkbid0IGNvbnZlcnQgYmxvYiB0byBBcnJheUJ1ZmZlclwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzb2x2ZShldmVudC50YXJnZXQucmVzdWx0KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcclxuICAgIH0pO1xyXG59O1xyXG5leHBvcnQgY29uc3QgZ2V0VEVYdENodW5rID0gYXN5bmMgKGJsb2IpID0+IHtcclxuICAgIGNvbnN0IGNodW5rcyA9IGRlY29kZVBuZyhuZXcgVWludDhBcnJheShhd2FpdCBibG9iVG9BcnJheUJ1ZmZlcihibG9iKSkpO1xyXG4gICAgY29uc3QgbWV0YWRhdGFDaHVuayA9IGNodW5rcy5maW5kKGNodW5rID0+IGNodW5rLm5hbWUgPT09IFwidEVYdFwiKTtcclxuICAgIGlmIChtZXRhZGF0YUNodW5rKSB7XHJcbiAgICAgICAgcmV0dXJuIHRFWHQuZGVjb2RlKG1ldGFkYXRhQ2h1bmsuZGF0YSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuZXhwb3J0IGNvbnN0IGVuY29kZVBuZ01ldGFkYXRhID0gYXN5bmMgKF9yZWYpID0+IHtcclxuICAgIGxldCB7IGJsb2IsIG1ldGFkYXRhIH0gPSBfcmVmO1xyXG4gICAgY29uc3QgY2h1bmtzID0gZGVjb2RlUG5nKG5ldyBVaW50OEFycmF5KGF3YWl0IGJsb2JUb0FycmF5QnVmZmVyKGJsb2IpKSk7XHJcbiAgICBjb25zdCBtZXRhZGF0YUNodW5rID0gdEVYdC5lbmNvZGUoTUlNRV9UWVBFUy5leGNhbGlkcmF3LCBKU09OLnN0cmluZ2lmeShhd2FpdCBlbmNvZGUoe1xyXG4gICAgICAgIHRleHQ6IG1ldGFkYXRhLFxyXG4gICAgICAgIGNvbXByZXNzOiB0cnVlXHJcbiAgICB9KSkpOyAvLyBpbnNlcnQgbWV0YWRhdGEgYmVmb3JlIGxhc3QgY2h1bmsgKGlFTkQpXHJcbiAgICBjaHVua3Muc3BsaWNlKC0xLCAwLCBtZXRhZGF0YUNodW5rKTtcclxuICAgIHJldHVybiBuZXcgQmxvYihbZW5jb2RlUG5nKGNodW5rcyldLCB7XHJcbiAgICAgICAgdHlwZTogTUlNRV9UWVBFUy5wbmdcclxuICAgIH0pO1xyXG59O1xyXG5leHBvcnQgY29uc3QgZGVjb2RlUG5nTWV0YWRhdGEgPSBhc3luYyAoYmxvYikgPT4ge1xyXG4gICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBnZXRURVh0Q2h1bmsoYmxvYik7XHJcbiAgICBpZiAoKG1ldGFkYXRhID09PSBudWxsIHx8IG1ldGFkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXRhZGF0YS5rZXl3b3JkKSA9PT0gTUlNRV9UWVBFUy5leGNhbGlkcmF3KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgZW5jb2RlZERhdGEgPSBKU09OLnBhcnNlKG1ldGFkYXRhLnRleHQpO1xyXG4gICAgICAgICAgICBpZiAoIShcImVuY29kZWRcIiBpbiBlbmNvZGVkRGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSwgdW4tZW5jb2RlZCBzY2VuZSBKU09OXHJcbiAgICAgICAgICAgICAgICBpZiAoXCJ0eXBlXCIgaW4gZW5jb2RlZERhdGEgJiYgZW5jb2RlZERhdGEudHlwZSA9PT0gRVhQT1JUX0RBVEFfVFlQRVMuZXhjYWxpZHJhdykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS50ZXh0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRkFJTEVEXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkZWNvZGUoZW5jb2RlZERhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZBSUxFRFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJTlZBTElEXCIpO1xyXG59OyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBTVkdcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZXhwb3J0IGNvbnN0IGVuY29kZVN2Z01ldGFkYXRhID0gYXN5bmMgKF9yZWYyKSA9PiB7XHJcbiAgICBsZXQgeyB0ZXh0IH0gPSBfcmVmMjtcclxuICAgIGNvbnN0IGJhc2U2NCA9IGF3YWl0IHN0cmluZ1RvQmFzZTY0KEpTT04uc3RyaW5naWZ5KGF3YWl0IGVuY29kZSh7XHJcbiAgICAgICAgdGV4dFxyXG4gICAgfSkpLCB0cnVlXHJcbiAgICAvKiBpcyBhbHJlYWR5IGJ5dGUgc3RyaW5nICovXHJcbiAgICApO1xyXG4gICAgbGV0IG1ldGFkYXRhID0gXCJcIjtcclxuICAgIG1ldGFkYXRhICs9IFwiPCEtLSBwYXlsb2FkLXR5cGU6XCIuY29uY2F0KE1JTUVfVFlQRVMuZXhjYWxpZHJhdywgXCIgLS0+XCIpO1xyXG4gICAgbWV0YWRhdGEgKz0gXCI8IS0tIHBheWxvYWQtdmVyc2lvbjoyIC0tPlwiO1xyXG4gICAgbWV0YWRhdGEgKz0gXCI8IS0tIHBheWxvYWQtc3RhcnQgLS0+XCI7XHJcbiAgICBtZXRhZGF0YSArPSBiYXNlNjQ7XHJcbiAgICBtZXRhZGF0YSArPSBcIjwhLS0gcGF5bG9hZC1lbmQgLS0+XCI7XHJcbiAgICByZXR1cm4gbWV0YWRhdGE7XHJcbn07XHJcbmV4cG9ydCBjb25zdCBkZWNvZGVTdmdNZXRhZGF0YSA9IGFzeW5jIChfcmVmMykgPT4ge1xyXG4gICAgbGV0IHsgc3ZnIH0gPSBfcmVmMztcclxuICAgIGlmIChzdmcuaW5jbHVkZXMoXCJwYXlsb2FkLXR5cGU6XCIuY29uY2F0KE1JTUVfVFlQRVMuZXhjYWxpZHJhdykpKSB7XHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBzdmcubWF0Y2goLzwhLS0gcGF5bG9hZC1zdGFydCAtLT4oLis/KTwhLS0gcGF5bG9hZC1lbmQgLS0+Lyk7XHJcbiAgICAgICAgaWYgKCFtYXRjaCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJTlZBTElEXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSBzdmcubWF0Y2goLzwhLS0gcGF5bG9hZC12ZXJzaW9uOihcXGQrKSAtLT4vKTtcclxuICAgICAgICBjb25zdCB2ZXJzaW9uID0gKHZlcnNpb25NYXRjaCA9PT0gbnVsbCB8fCB2ZXJzaW9uTWF0Y2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZlcnNpb25NYXRjaFsxXSkgfHwgXCIxXCI7XHJcbiAgICAgICAgY29uc3QgaXNCeXRlU3RyaW5nID0gdmVyc2lvbiAhPT0gXCIxXCI7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IGJhc2U2NFRvU3RyaW5nKG1hdGNoWzFdLCBpc0J5dGVTdHJpbmcpO1xyXG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkRGF0YSA9IEpTT04ucGFyc2UoanNvbik7XHJcbiAgICAgICAgICAgIGlmICghKFwiZW5jb2RlZFwiIGluIGVuY29kZWREYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gbGVnYWN5LCB1bi1lbmNvZGVkIHNjZW5lIEpTT05cclxuICAgICAgICAgICAgICAgIGlmIChcInR5cGVcIiBpbiBlbmNvZGVkRGF0YSAmJiBlbmNvZGVkRGF0YS50eXBlID09PSBFWFBPUlRfREFUQV9UWVBFUy5leGNhbGlkcmF3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGQUlMRURcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRlY29kZShlbmNvZGVkRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRkFJTEVEXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURcIik7XHJcbn07XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///673\n')}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkExcalidraw=self.webpackChunkExcalidraw||[]).push([[9],{4706:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "decodePngMetadata": () => (/* binding */ decodePngMetadata),\n "decodeSvgMetadata": () => (/* binding */ decodeSvgMetadata),\n "encodePngMetadata": () => (/* binding */ encodePngMetadata),\n "encodeSvgMetadata": () => (/* binding */ encodeSvgMetadata),\n "getTEXtChunk": () => (/* binding */ getTEXtChunk)\n});\n\n// EXTERNAL MODULE: ../../../node_modules/png-chunks-extract/index.js\nvar png_chunks_extract = __webpack_require__(2983);\nvar png_chunks_extract_default = /*#__PURE__*/__webpack_require__.n(png_chunks_extract);\n// EXTERNAL MODULE: ../../../node_modules/png-chunk-text/index.js\nvar png_chunk_text = __webpack_require__(1194);\n// EXTERNAL MODULE: ../../../node_modules/png-chunks-encode/index.js\nvar png_chunks_encode = __webpack_require__(3434);\nvar png_chunks_encode_default = /*#__PURE__*/__webpack_require__.n(png_chunks_encode);\n// EXTERNAL MODULE: ../../../node_modules/pako/index.js\nvar pako = __webpack_require__(2744);\n// EXTERNAL MODULE: ../../constants.ts\nvar constants = __webpack_require__(4942);\n;// CONCATENATED MODULE: ../../data/encryption.ts\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\nconst IV_LENGTH_BYTES = 12;\r\nconst createIV = () => {\r\n const arr = new Uint8Array(IV_LENGTH_BYTES);\r\n return window.crypto.getRandomValues(arr);\r\n};\r\nconst generateEncryptionKey = (returnAs) => __awaiter(void 0, void 0, void 0, function* () {\r\n const key = yield window.crypto.subtle.generateKey({\r\n name: "AES-GCM",\r\n length: ENCRYPTION_KEY_BITS,\r\n }, true, // extractable\r\n ["encrypt", "decrypt"]);\r\n return (returnAs === "cryptoKey"\r\n ? key\r\n : (yield window.crypto.subtle.exportKey("jwk", key)).k);\r\n});\r\nconst getCryptoKey = (key, usage) => window.crypto.subtle.importKey("jwk", {\r\n alg: "A128GCM",\r\n ext: true,\r\n k: key,\r\n key_ops: ["encrypt", "decrypt"],\r\n kty: "oct",\r\n}, {\r\n name: "AES-GCM",\r\n length: ENCRYPTION_KEY_BITS,\r\n}, false, // extractable\r\n[usage]);\r\nconst encryption_encryptData = (key, data) => __awaiter(void 0, void 0, void 0, function* () {\r\n const importedKey = typeof key === "string" ? yield getCryptoKey(key, "encrypt") : key;\r\n const iv = createIV();\r\n const buffer = typeof data === "string"\r\n ? new TextEncoder().encode(data)\r\n : data instanceof Uint8Array\r\n ? data\r\n : data instanceof Blob\r\n ? yield data.arrayBuffer()\r\n : data;\r\n // We use symmetric encryption. AES-GCM is the recommended algorithm and\r\n // includes checks that the ciphertext has not been modified by an attacker.\r\n const encryptedBuffer = yield window.crypto.subtle.encrypt({\r\n name: "AES-GCM",\r\n iv,\r\n }, importedKey, buffer);\r\n return { encryptedBuffer, iv };\r\n});\r\nconst encryption_decryptData = (iv, encrypted, privateKey) => __awaiter(void 0, void 0, void 0, function* () {\r\n const key = yield getCryptoKey(privateKey, "decrypt");\r\n return window.crypto.subtle.decrypt({\r\n name: "AES-GCM",\r\n iv,\r\n }, key, encrypted);\r\n});\r\n\n;// CONCATENATED MODULE: ../../data/encode.ts\nvar encode_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n// -----------------------------------------------------------------------------\r\n// byte (binary) strings\r\n// -----------------------------------------------------------------------------\r\n// fast, Buffer-compatible implem\r\nconst toByteString = (data) => {\r\n return new Promise((resolve, reject) => {\r\n const blob = typeof data === "string"\r\n ? new Blob([new TextEncoder().encode(data)])\r\n : new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)]);\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n if (!event.target || typeof event.target.result !== "string") {\r\n return reject(new Error("couldn\'t convert to byte string"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsBinaryString(blob);\r\n });\r\n};\r\nconst byteStringToArrayBuffer = (byteString) => {\r\n const buffer = new ArrayBuffer(byteString.length);\r\n const bufferView = new Uint8Array(buffer);\r\n for (let i = 0, len = byteString.length; i < len; i++) {\r\n bufferView[i] = byteString.charCodeAt(i);\r\n }\r\n return buffer;\r\n};\r\nconst byteStringToString = (byteString) => {\r\n return new TextDecoder("utf-8").decode(byteStringToArrayBuffer(byteString));\r\n};\r\n// -----------------------------------------------------------------------------\r\n// base64\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * @param isByteString set to true if already byte string to prevent bloat\r\n * due to reencoding\r\n */\r\nconst stringToBase64 = (str, isByteString = false) => encode_awaiter(void 0, void 0, void 0, function* () {\r\n return isByteString ? window.btoa(str) : window.btoa(yield toByteString(str));\r\n});\r\n// async to align with stringToBase64\r\nconst base64ToString = (base64, isByteString = false) => encode_awaiter(void 0, void 0, void 0, function* () {\r\n return isByteString\r\n ? window.atob(base64)\r\n : byteStringToString(window.atob(base64));\r\n});\r\n/**\r\n * Encodes (and potentially compresses via zlib) text to byte string\r\n */\r\nconst encode = ({ text, compress, }) => encode_awaiter(void 0, void 0, void 0, function* () {\r\n let deflated;\r\n if (compress !== false) {\r\n try {\r\n deflated = yield toByteString((0,pako.deflate)(text));\r\n }\r\n catch (error) {\r\n console.error("encode: cannot deflate", error);\r\n }\r\n }\r\n return {\r\n version: "1",\r\n encoding: "bstring",\r\n compressed: !!deflated,\r\n encoded: deflated || (yield toByteString(text)),\r\n };\r\n});\r\nconst decode = (data) => encode_awaiter(void 0, void 0, void 0, function* () {\r\n let decoded;\r\n switch (data.encoding) {\r\n case "bstring":\r\n // if compressed, do not double decode the bstring\r\n decoded = data.compressed\r\n ? data.encoded\r\n : yield byteStringToString(data.encoded);\r\n break;\r\n default:\r\n throw new Error(`decode: unknown encoding "${data.encoding}"`);\r\n }\r\n if (data.compressed) {\r\n return (0,pako.inflate)(new Uint8Array(byteStringToArrayBuffer(decoded)), {\r\n to: "string",\r\n });\r\n }\r\n return decoded;\r\n});\r\n// -----------------------------------------------------------------------------\r\nconst CONCAT_BUFFERS_VERSION = 1;\r\n/** how many bytes we use to encode how many bytes the next chunk has.\r\n * Corresponds to DataView setter methods (setUint32, setUint16, etc).\r\n *\r\n * NOTE ! values must not be changed, which would be backwards incompatible !\r\n */\r\nconst VERSION_DATAVIEW_BYTES = 4;\r\nconst NEXT_CHUNK_SIZE_DATAVIEW_BYTES = 4;\r\n// -----------------------------------------------------------------------------\r\nconst DATA_VIEW_BITS_MAP = { 1: 8, 2: 16, 4: 32 };\r\n/**\r\n * abstraction over DataView that serves as a typed getter/setter in case\r\n * you\'re using constants for the byte size and want to ensure there\'s no\r\n * discrepenancy in the encoding across refactors.\r\n *\r\n * DataView serves for an endian-agnostic handling of numbers in ArrayBuffers.\r\n */\r\nfunction dataView(buffer, bytes, offset, value) {\r\n if (value != null) {\r\n if (value > Math.pow(2, DATA_VIEW_BITS_MAP[bytes]) - 1) {\r\n throw new Error(`attempting to set value higher than the allocated bytes (value: ${value}, bytes: ${bytes})`);\r\n }\r\n const method = `setUint${DATA_VIEW_BITS_MAP[bytes]}`;\r\n new DataView(buffer.buffer)[method](offset, value);\r\n return buffer;\r\n }\r\n const method = `getUint${DATA_VIEW_BITS_MAP[bytes]}`;\r\n return new DataView(buffer.buffer)[method](offset);\r\n}\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * Resulting concatenated buffer has this format:\r\n *\r\n * [\r\n * VERSION chunk (4 bytes)\r\n * LENGTH chunk 1 (4 bytes)\r\n * DATA chunk 1 (up to 2^32 bits)\r\n * LENGTH chunk 2 (4 bytes)\r\n * DATA chunk 2 (up to 2^32 bits)\r\n * ...\r\n * ]\r\n *\r\n * @param buffers each buffer (chunk) must be at most 2^32 bits large (~4GB)\r\n */\r\nconst concatBuffers = (...buffers) => {\r\n const bufferView = new Uint8Array(VERSION_DATAVIEW_BYTES +\r\n NEXT_CHUNK_SIZE_DATAVIEW_BYTES * buffers.length +\r\n buffers.reduce((acc, buffer) => acc + buffer.byteLength, 0));\r\n let cursor = 0;\r\n // as the first chunk we\'ll encode the version for backwards compatibility\r\n dataView(bufferView, VERSION_DATAVIEW_BYTES, cursor, CONCAT_BUFFERS_VERSION);\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n for (const buffer of buffers) {\r\n dataView(bufferView, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor, buffer.byteLength);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n bufferView.set(buffer, cursor);\r\n cursor += buffer.byteLength;\r\n }\r\n return bufferView;\r\n};\r\n/** can only be used on buffers created via `concatBuffers()` */\r\nconst splitBuffers = (concatenatedBuffer) => {\r\n const buffers = [];\r\n let cursor = 0;\r\n // first chunk is the version\r\n const version = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor);\r\n // If version is outside of the supported versions, throw an error.\r\n // This usually means the buffer wasn\'t encoded using this API, so we\'d only\r\n // waste compute.\r\n if (version > CONCAT_BUFFERS_VERSION) {\r\n throw new Error(`invalid version ${version}`);\r\n }\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n while (true) {\r\n const chunkSize = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n buffers.push(concatenatedBuffer.slice(cursor, cursor + chunkSize));\r\n cursor += chunkSize;\r\n if (cursor >= concatenatedBuffer.byteLength) {\r\n break;\r\n }\r\n }\r\n return buffers;\r\n};\r\n// helpers for (de)compressing data with JSON metadata including encryption\r\n// -----------------------------------------------------------------------------\r\n/** @private */\r\nconst _encryptAndCompress = (data, encryptionKey) => encode_awaiter(void 0, void 0, void 0, function* () {\r\n const { encryptedBuffer, iv } = yield encryptData(encryptionKey, deflate(data));\r\n return { iv, buffer: new Uint8Array(encryptedBuffer) };\r\n});\r\n/**\r\n * The returned buffer has following format:\r\n * `[]` refers to a buffers wrapper (see `concatBuffers`)\r\n *\r\n * [\r\n * encodingMetadataBuffer,\r\n * iv,\r\n * [\r\n * contentsMetadataBuffer\r\n * contentsBuffer\r\n * ]\r\n * ]\r\n */\r\nconst compressData = (dataBuffer, options) => encode_awaiter(void 0, void 0, void 0, function* () {\r\n const fileInfo = {\r\n version: 2,\r\n compression: "pako@1",\r\n encryption: "AES-GCM",\r\n };\r\n const encodingMetadataBuffer = new TextEncoder().encode(JSON.stringify(fileInfo));\r\n const contentsMetadataBuffer = new TextEncoder().encode(JSON.stringify(options.metadata || null));\r\n const { iv, buffer } = yield _encryptAndCompress(concatBuffers(contentsMetadataBuffer, dataBuffer), options.encryptionKey);\r\n return concatBuffers(encodingMetadataBuffer, iv, buffer);\r\n});\r\n/** @private */\r\nconst _decryptAndDecompress = (iv, decryptedBuffer, decryptionKey, isCompressed) => encode_awaiter(void 0, void 0, void 0, function* () {\r\n decryptedBuffer = new Uint8Array(yield decryptData(iv, decryptedBuffer, decryptionKey));\r\n if (isCompressed) {\r\n return inflate(decryptedBuffer);\r\n }\r\n return decryptedBuffer;\r\n});\r\nconst decompressData = (bufferView, options) => encode_awaiter(void 0, void 0, void 0, function* () {\r\n // first chunk is encoding metadata (ignored for now)\r\n const [encodingMetadataBuffer, iv, buffer] = splitBuffers(bufferView);\r\n const encodingMetadata = JSON.parse(new TextDecoder().decode(encodingMetadataBuffer));\r\n try {\r\n const [contentsMetadataBuffer, contentsBuffer] = splitBuffers(yield _decryptAndDecompress(iv, buffer, options.decryptionKey, !!encodingMetadata.compression));\r\n const metadata = JSON.parse(new TextDecoder().decode(contentsMetadataBuffer));\r\n return {\r\n /** metadata source is always JSON so we can decode it here */\r\n metadata,\r\n /** data can be anything so the caller must decode it */\r\n data: contentsBuffer,\r\n };\r\n }\r\n catch (error) {\r\n console.error(`Error during decompressing and decrypting the file.`, encodingMetadata);\r\n throw error;\r\n }\r\n});\r\n// -----------------------------------------------------------------------------\r\n\n;// CONCATENATED MODULE: ../../data/image.ts\nvar image_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n// -----------------------------------------------------------------------------\r\n// PNG\r\n// -----------------------------------------------------------------------------\r\nconst blobToArrayBuffer = (blob) => {\r\n if ("arrayBuffer" in blob) {\r\n return blob.arrayBuffer();\r\n }\r\n // Safari\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n var _a;\r\n if (!((_a = event.target) === null || _a === void 0 ? void 0 : _a.result)) {\r\n return reject(new Error("couldn\'t convert blob to ArrayBuffer"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsArrayBuffer(blob);\r\n });\r\n};\r\nconst getTEXtChunk = (blob) => image_awaiter(void 0, void 0, void 0, function* () {\r\n const chunks = png_chunks_extract_default()(new Uint8Array(yield blobToArrayBuffer(blob)));\r\n const metadataChunk = chunks.find((chunk) => chunk.name === "tEXt");\r\n if (metadataChunk) {\r\n return png_chunk_text.decode(metadataChunk.data);\r\n }\r\n return null;\r\n});\r\nconst encodePngMetadata = ({ blob, metadata, }) => image_awaiter(void 0, void 0, void 0, function* () {\r\n const chunks = png_chunks_extract_default()(new Uint8Array(yield blobToArrayBuffer(blob)));\r\n const metadataChunk = png_chunk_text.encode(constants/* MIME_TYPES.excalidraw */.LO.excalidraw, JSON.stringify(yield encode({\r\n text: metadata,\r\n compress: true,\r\n })));\r\n // insert metadata before last chunk (iEND)\r\n chunks.splice(-1, 0, metadataChunk);\r\n return new Blob([png_chunks_encode_default()(chunks)], { type: constants/* MIME_TYPES.png */.LO.png });\r\n});\r\nconst decodePngMetadata = (blob) => image_awaiter(void 0, void 0, void 0, function* () {\r\n const metadata = yield getTEXtChunk(blob);\r\n if ((metadata === null || metadata === void 0 ? void 0 : metadata.keyword) === constants/* MIME_TYPES.excalidraw */.LO.excalidraw) {\r\n try {\r\n const encodedData = JSON.parse(metadata.text);\r\n if (!("encoded" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if ("type" in encodedData &&\r\n encodedData.type === constants/* EXPORT_DATA_TYPES.excalidraw */.r8.excalidraw) {\r\n return metadata.text;\r\n }\r\n throw new Error("FAILED");\r\n }\r\n return yield decode(encodedData);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n throw new Error("FAILED");\r\n }\r\n }\r\n throw new Error("INVALID");\r\n});\r\n// -----------------------------------------------------------------------------\r\n// SVG\r\n// -----------------------------------------------------------------------------\r\nconst encodeSvgMetadata = ({ text }) => image_awaiter(void 0, void 0, void 0, function* () {\r\n const base64 = yield stringToBase64(JSON.stringify(yield encode({ text })), true /* is already byte string */);\r\n let metadata = "";\r\n metadata += `\x3c!-- payload-type:${constants/* MIME_TYPES.excalidraw */.LO.excalidraw} --\x3e`;\r\n metadata += `\x3c!-- payload-version:2 --\x3e`;\r\n metadata += "\x3c!-- payload-start --\x3e";\r\n metadata += base64;\r\n metadata += "\x3c!-- payload-end --\x3e";\r\n return metadata;\r\n});\r\nconst decodeSvgMetadata = ({ svg }) => image_awaiter(void 0, void 0, void 0, function* () {\r\n if (svg.includes(`payload-type:${constants/* MIME_TYPES.excalidraw */.LO.excalidraw}`)) {\r\n const match = svg.match(/\x3c!-- payload-start --\x3e(.+?)\x3c!-- payload-end --\x3e/);\r\n if (!match) {\r\n throw new Error("INVALID");\r\n }\r\n const versionMatch = svg.match(/\x3c!-- payload-version:(\\d+) --\x3e/);\r\n const version = (versionMatch === null || versionMatch === void 0 ? void 0 : versionMatch[1]) || "1";\r\n const isByteString = version !== "1";\r\n try {\r\n const json = yield base64ToString(match[1], isByteString);\r\n const encodedData = JSON.parse(json);\r\n if (!("encoded" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if ("type" in encodedData &&\r\n encodedData.type === constants/* EXPORT_DATA_TYPES.excalidraw */.r8.excalidraw) {\r\n return json;\r\n }\r\n throw new Error("FAILED");\r\n }\r\n return yield decode(encodedData);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n throw new Error("FAILED");\r\n }\r\n }\r\n throw new Error("INVALID");\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QSxxQkFBcUIsMkJBQVMsYUFBYSxNQUFNLG9DQUFjLEVBQUU7QUFDakUsQ0FBQztBQUNNLG9DQUFvQyxhQUFTO0FBQ3BEO0FBQ0EsbUZBQW1GLGtEQUFxQjtBQUN4RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLHlEQUE0QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixNQUFNO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNPLDZCQUE2QixNQUFNLEtBQUssYUFBUztBQUN4RCx5QkFBeUIsY0FBYyxzQkFBc0IsTUFBTSxHQUFHLE1BQU07QUFDNUU7QUFDQSxxQ0FBcUMsa0RBQXFCLEVBQUU7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDTSw2QkFBNkIsS0FBSyxLQUFLLGFBQVM7QUFDdkQscUNBQXFDLGtEQUFxQixDQUFDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsY0FBYztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qyx5REFBNEI7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsTUFBTTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZGF0YS9lbmNyeXB0aW9uLnRzPzQ4NzkiLCJ3ZWJwYWNrOi8vLy4uLy4uL2RhdGEvZW5jb2RlLnRzP2M2NmEiLCJ3ZWJwYWNrOi8vLy4uLy4uL2RhdGEvaW1hZ2UudHM/NTc3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn07XHJcbmltcG9ydCB7IEVOQ1JZUFRJT05fS0VZX0JJVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmV4cG9ydCBjb25zdCBJVl9MRU5HVEhfQllURVMgPSAxMjtcclxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlWID0gKCkgPT4ge1xyXG4gICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoSVZfTEVOR1RIX0JZVEVTKTtcclxuICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnIpO1xyXG59O1xyXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVFbmNyeXB0aW9uS2V5ID0gKHJldHVybkFzKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgIGNvbnN0IGtleSA9IHlpZWxkIHdpbmRvdy5jcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KHtcclxuICAgICAgICBuYW1lOiBcIkFFUy1HQ01cIixcclxuICAgICAgICBsZW5ndGg6IEVOQ1JZUFRJT05fS0VZX0JJVFMsXHJcbiAgICB9LCB0cnVlLCAvLyBleHRyYWN0YWJsZVxyXG4gICAgW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIl0pO1xyXG4gICAgcmV0dXJuIChyZXR1cm5BcyA9PT0gXCJjcnlwdG9LZXlcIlxyXG4gICAgICAgID8ga2V5XHJcbiAgICAgICAgOiAoeWllbGQgd2luZG93LmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KFwiandrXCIsIGtleSkpLmspO1xyXG59KTtcclxuZXhwb3J0IGNvbnN0IGdldENyeXB0b0tleSA9IChrZXksIHVzYWdlKSA9PiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXCJqd2tcIiwge1xyXG4gICAgYWxnOiBcIkExMjhHQ01cIixcclxuICAgIGV4dDogdHJ1ZSxcclxuICAgIGs6IGtleSxcclxuICAgIGtleV9vcHM6IFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCJdLFxyXG4gICAga3R5OiBcIm9jdFwiLFxyXG59LCB7XHJcbiAgICBuYW1lOiBcIkFFUy1HQ01cIixcclxuICAgIGxlbmd0aDogRU5DUllQVElPTl9LRVlfQklUUyxcclxufSwgZmFsc2UsIC8vIGV4dHJhY3RhYmxlXHJcblt1c2FnZV0pO1xyXG5leHBvcnQgY29uc3QgZW5jcnlwdERhdGEgPSAoa2V5LCBkYXRhKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgIGNvbnN0IGltcG9ydGVkS2V5ID0gdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiA/IHlpZWxkIGdldENyeXB0b0tleShrZXksIFwiZW5jcnlwdFwiKSA6IGtleTtcclxuICAgIGNvbnN0IGl2ID0gY3JlYXRlSVYoKTtcclxuICAgIGNvbnN0IGJ1ZmZlciA9IHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiXHJcbiAgICAgICAgPyBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZGF0YSlcclxuICAgICAgICA6IGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5XHJcbiAgICAgICAgICAgID8gZGF0YVxyXG4gICAgICAgICAgICA6IGRhdGEgaW5zdGFuY2VvZiBCbG9iXHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIGRhdGEuYXJyYXlCdWZmZXIoKVxyXG4gICAgICAgICAgICAgICAgOiBkYXRhO1xyXG4gICAgLy8gV2UgdXNlIHN5bW1ldHJpYyBlbmNyeXB0aW9uLiBBRVMtR0NNIGlzIHRoZSByZWNvbW1lbmRlZCBhbGdvcml0aG0gYW5kXHJcbiAgICAvLyBpbmNsdWRlcyBjaGVja3MgdGhhdCB0aGUgY2lwaGVydGV4dCBoYXMgbm90IGJlZW4gbW9kaWZpZWQgYnkgYW4gYXR0YWNrZXIuXHJcbiAgICBjb25zdCBlbmNyeXB0ZWRCdWZmZXIgPSB5aWVsZCB3aW5kb3cuY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHtcclxuICAgICAgICBuYW1lOiBcIkFFUy1HQ01cIixcclxuICAgICAgICBpdixcclxuICAgIH0sIGltcG9ydGVkS2V5LCBidWZmZXIpO1xyXG4gICAgcmV0dXJuIHsgZW5jcnlwdGVkQnVmZmVyLCBpdiB9O1xyXG59KTtcclxuZXhwb3J0IGNvbnN0IGRlY3J5cHREYXRhID0gKGl2LCBlbmNyeXB0ZWQsIHByaXZhdGVLZXkpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgY29uc3Qga2V5ID0geWllbGQgZ2V0Q3J5cHRvS2V5KHByaXZhdGVLZXksIFwiZGVjcnlwdFwiKTtcclxuICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5kZWNyeXB0KHtcclxuICAgICAgICBuYW1lOiBcIkFFUy1HQ01cIixcclxuICAgICAgICBpdixcclxuICAgIH0sIGtleSwgZW5jcnlwdGVkKTtcclxufSk7XHJcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufTtcclxuaW1wb3J0IHsgZGVmbGF0ZSwgaW5mbGF0ZSB9IGZyb20gXCJwYWtvXCI7XHJcbmltcG9ydCB7IGVuY3J5cHREYXRhLCBkZWNyeXB0RGF0YSB9IGZyb20gXCIuL2VuY3J5cHRpb25cIjtcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gYnl0ZSAoYmluYXJ5KSBzdHJpbmdzXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIGZhc3QsIEJ1ZmZlci1jb21wYXRpYmxlIGltcGxlbVxyXG5leHBvcnQgY29uc3QgdG9CeXRlU3RyaW5nID0gKGRhdGEpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgYmxvYiA9IHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiXHJcbiAgICAgICAgICAgID8gbmV3IEJsb2IoW25ldyBUZXh0RW5jb2RlcigpLmVuY29kZShkYXRhKV0pXHJcbiAgICAgICAgICAgIDogbmV3IEJsb2IoW2RhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gZGF0YSA6IG5ldyBVaW50OEFycmF5KGRhdGEpXSk7XHJcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0IHx8IHR5cGVvZiBldmVudC50YXJnZXQucmVzdWx0ICE9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcImNvdWxkbid0IGNvbnZlcnQgdG8gYnl0ZSBzdHJpbmdcIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc29sdmUoZXZlbnQudGFyZ2V0LnJlc3VsdCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKGJsb2IpO1xyXG4gICAgfSk7XHJcbn07XHJcbmNvbnN0IGJ5dGVTdHJpbmdUb0FycmF5QnVmZmVyID0gKGJ5dGVTdHJpbmcpID0+IHtcclxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XHJcbiAgICBjb25zdCBidWZmZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBieXRlU3RyaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgYnVmZmVyVmlld1tpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBidWZmZXI7XHJcbn07XHJcbmNvbnN0IGJ5dGVTdHJpbmdUb1N0cmluZyA9IChieXRlU3RyaW5nKSA9PiB7XHJcbiAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIikuZGVjb2RlKGJ5dGVTdHJpbmdUb0FycmF5QnVmZmVyKGJ5dGVTdHJpbmcpKTtcclxufTtcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gYmFzZTY0XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8qKlxyXG4gKiBAcGFyYW0gaXNCeXRlU3RyaW5nIHNldCB0byB0cnVlIGlmIGFscmVhZHkgYnl0ZSBzdHJpbmcgdG8gcHJldmVudCBibG9hdFxyXG4gKiAgZHVlIHRvIHJlZW5jb2RpbmdcclxuICovXHJcbmV4cG9ydCBjb25zdCBzdHJpbmdUb0Jhc2U2NCA9IChzdHIsIGlzQnl0ZVN0cmluZyA9IGZhbHNlKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgIHJldHVybiBpc0J5dGVTdHJpbmcgPyB3aW5kb3cuYnRvYShzdHIpIDogd2luZG93LmJ0b2EoeWllbGQgdG9CeXRlU3RyaW5nKHN0cikpO1xyXG59KTtcclxuLy8gYXN5bmMgdG8gYWxpZ24gd2l0aCBzdHJpbmdUb0Jhc2U2NFxyXG5leHBvcnQgY29uc3QgYmFzZTY0VG9TdHJpbmcgPSAoYmFzZTY0LCBpc0J5dGVTdHJpbmcgPSBmYWxzZSkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICByZXR1cm4gaXNCeXRlU3RyaW5nXHJcbiAgICAgICAgPyB3aW5kb3cuYXRvYihiYXNlNjQpXHJcbiAgICAgICAgOiBieXRlU3RyaW5nVG9TdHJpbmcod2luZG93LmF0b2IoYmFzZTY0KSk7XHJcbn0pO1xyXG4vKipcclxuICogRW5jb2RlcyAoYW5kIHBvdGVudGlhbGx5IGNvbXByZXNzZXMgdmlhIHpsaWIpIHRleHQgdG8gYnl0ZSBzdHJpbmdcclxuICovXHJcbmV4cG9ydCBjb25zdCBlbmNvZGUgPSAoeyB0ZXh0LCBjb21wcmVzcywgfSkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICBsZXQgZGVmbGF0ZWQ7XHJcbiAgICBpZiAoY29tcHJlc3MgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGVmbGF0ZWQgPSB5aWVsZCB0b0J5dGVTdHJpbmcoZGVmbGF0ZSh0ZXh0KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZW5jb2RlOiBjYW5ub3QgZGVmbGF0ZVwiLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB2ZXJzaW9uOiBcIjFcIixcclxuICAgICAgICBlbmNvZGluZzogXCJic3RyaW5nXCIsXHJcbiAgICAgICAgY29tcHJlc3NlZDogISFkZWZsYXRlZCxcclxuICAgICAgICBlbmNvZGVkOiBkZWZsYXRlZCB8fCAoeWllbGQgdG9CeXRlU3RyaW5nKHRleHQpKSxcclxuICAgIH07XHJcbn0pO1xyXG5leHBvcnQgY29uc3QgZGVjb2RlID0gKGRhdGEpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgbGV0IGRlY29kZWQ7XHJcbiAgICBzd2l0Y2ggKGRhdGEuZW5jb2RpbmcpIHtcclxuICAgICAgICBjYXNlIFwiYnN0cmluZ1wiOlxyXG4gICAgICAgICAgICAvLyBpZiBjb21wcmVzc2VkLCBkbyBub3QgZG91YmxlIGRlY29kZSB0aGUgYnN0cmluZ1xyXG4gICAgICAgICAgICBkZWNvZGVkID0gZGF0YS5jb21wcmVzc2VkXHJcbiAgICAgICAgICAgICAgICA/IGRhdGEuZW5jb2RlZFxyXG4gICAgICAgICAgICAgICAgOiB5aWVsZCBieXRlU3RyaW5nVG9TdHJpbmcoZGF0YS5lbmNvZGVkKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkZWNvZGU6IHVua25vd24gZW5jb2RpbmcgXCIke2RhdGEuZW5jb2Rpbmd9XCJgKTtcclxuICAgIH1cclxuICAgIGlmIChkYXRhLmNvbXByZXNzZWQpIHtcclxuICAgICAgICByZXR1cm4gaW5mbGF0ZShuZXcgVWludDhBcnJheShieXRlU3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKSksIHtcclxuICAgICAgICAgICAgdG86IFwic3RyaW5nXCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGVjb2RlZDtcclxufSk7XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmNvbnN0IENPTkNBVF9CVUZGRVJTX1ZFUlNJT04gPSAxO1xyXG4vKiogaG93IG1hbnkgYnl0ZXMgd2UgdXNlIHRvIGVuY29kZSBob3cgbWFueSBieXRlcyB0aGUgbmV4dCBjaHVuayBoYXMuXHJcbiAqIENvcnJlc3BvbmRzIHRvIERhdGFWaWV3IHNldHRlciBtZXRob2RzIChzZXRVaW50MzIsIHNldFVpbnQxNiwgZXRjKS5cclxuICpcclxuICogTk9URSAhIHZhbHVlcyBtdXN0IG5vdCBiZSBjaGFuZ2VkLCB3aGljaCB3b3VsZCBiZSBiYWNrd2FyZHMgaW5jb21wYXRpYmxlICFcclxuICovXHJcbmNvbnN0IFZFUlNJT05fREFUQVZJRVdfQllURVMgPSA0O1xyXG5jb25zdCBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMgPSA0O1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5jb25zdCBEQVRBX1ZJRVdfQklUU19NQVAgPSB7IDE6IDgsIDI6IDE2LCA0OiAzMiB9O1xyXG4vKipcclxuICogYWJzdHJhY3Rpb24gb3ZlciBEYXRhVmlldyB0aGF0IHNlcnZlcyBhcyBhIHR5cGVkIGdldHRlci9zZXR0ZXIgaW4gY2FzZVxyXG4gKiB5b3UncmUgdXNpbmcgY29uc3RhbnRzIGZvciB0aGUgYnl0ZSBzaXplIGFuZCB3YW50IHRvIGVuc3VyZSB0aGVyZSdzIG5vXHJcbiAqIGRpc2NyZXBlbmFuY3kgaW4gdGhlIGVuY29kaW5nIGFjcm9zcyByZWZhY3RvcnMuXHJcbiAqXHJcbiAqIERhdGFWaWV3IHNlcnZlcyBmb3IgYW4gZW5kaWFuLWFnbm9zdGljIGhhbmRsaW5nIG9mIG51bWJlcnMgaW4gQXJyYXlCdWZmZXJzLlxyXG4gKi9cclxuZnVuY3Rpb24gZGF0YVZpZXcoYnVmZmVyLCBieXRlcywgb2Zmc2V0LCB2YWx1ZSkge1xyXG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICBpZiAodmFsdWUgPiBNYXRoLnBvdygyLCBEQVRBX1ZJRVdfQklUU19NQVBbYnl0ZXNdKSAtIDEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhdHRlbXB0aW5nIHRvIHNldCB2YWx1ZSBoaWdoZXIgdGhhbiB0aGUgYWxsb2NhdGVkIGJ5dGVzICh2YWx1ZTogJHt2YWx1ZX0sIGJ5dGVzOiAke2J5dGVzfSlgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbWV0aG9kID0gYHNldFVpbnQke0RBVEFfVklFV19CSVRTX01BUFtieXRlc119YDtcclxuICAgICAgICBuZXcgRGF0YVZpZXcoYnVmZmVyLmJ1ZmZlcilbbWV0aG9kXShvZmZzZXQsIHZhbHVlKTtcclxuICAgICAgICByZXR1cm4gYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWV0aG9kID0gYGdldFVpbnQke0RBVEFfVklFV19CSVRTX01BUFtieXRlc119YDtcclxuICAgIHJldHVybiBuZXcgRGF0YVZpZXcoYnVmZmVyLmJ1ZmZlcilbbWV0aG9kXShvZmZzZXQpO1xyXG59XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8qKlxyXG4gKiBSZXN1bHRpbmcgY29uY2F0ZW5hdGVkIGJ1ZmZlciBoYXMgdGhpcyBmb3JtYXQ6XHJcbiAqXHJcbiAqIFtcclxuICogICBWRVJTSU9OIGNodW5rICg0IGJ5dGVzKVxyXG4gKiAgIExFTkdUSCBjaHVuayAxICg0IGJ5dGVzKVxyXG4gKiAgIERBVEEgY2h1bmsgMSAodXAgdG8gMl4zMiBiaXRzKVxyXG4gKiAgIExFTkdUSCBjaHVuayAyICg0IGJ5dGVzKVxyXG4gKiAgIERBVEEgY2h1bmsgMiAodXAgdG8gMl4zMiBiaXRzKVxyXG4gKiAgIC4uLlxyXG4gKiBdXHJcbiAqXHJcbiAqIEBwYXJhbSBidWZmZXJzIGVhY2ggYnVmZmVyIChjaHVuaykgbXVzdCBiZSBhdCBtb3N0IDJeMzIgYml0cyBsYXJnZSAofjRHQilcclxuICovXHJcbmNvbnN0IGNvbmNhdEJ1ZmZlcnMgPSAoLi4uYnVmZmVycykgPT4ge1xyXG4gICAgY29uc3QgYnVmZmVyVmlldyA9IG5ldyBVaW50OEFycmF5KFZFUlNJT05fREFUQVZJRVdfQllURVMgK1xyXG4gICAgICAgIE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUyAqIGJ1ZmZlcnMubGVuZ3RoICtcclxuICAgICAgICBidWZmZXJzLnJlZHVjZSgoYWNjLCBidWZmZXIpID0+IGFjYyArIGJ1ZmZlci5ieXRlTGVuZ3RoLCAwKSk7XHJcbiAgICBsZXQgY3Vyc29yID0gMDtcclxuICAgIC8vIGFzIHRoZSBmaXJzdCBjaHVuayB3ZSdsbCBlbmNvZGUgdGhlIHZlcnNpb24gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XHJcbiAgICBkYXRhVmlldyhidWZmZXJWaWV3LCBWRVJTSU9OX0RBVEFWSUVXX0JZVEVTLCBjdXJzb3IsIENPTkNBVF9CVUZGRVJTX1ZFUlNJT04pO1xyXG4gICAgY3Vyc29yICs9IFZFUlNJT05fREFUQVZJRVdfQllURVM7XHJcbiAgICBmb3IgKGNvbnN0IGJ1ZmZlciBvZiBidWZmZXJzKSB7XHJcbiAgICAgICAgZGF0YVZpZXcoYnVmZmVyVmlldywgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTLCBjdXJzb3IsIGJ1ZmZlci5ieXRlTGVuZ3RoKTtcclxuICAgICAgICBjdXJzb3IgKz0gTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTO1xyXG4gICAgICAgIGJ1ZmZlclZpZXcuc2V0KGJ1ZmZlciwgY3Vyc29yKTtcclxuICAgICAgICBjdXJzb3IgKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnVmZmVyVmlldztcclxufTtcclxuLyoqIGNhbiBvbmx5IGJlIHVzZWQgb24gYnVmZmVycyBjcmVhdGVkIHZpYSBgY29uY2F0QnVmZmVycygpYCAqL1xyXG5jb25zdCBzcGxpdEJ1ZmZlcnMgPSAoY29uY2F0ZW5hdGVkQnVmZmVyKSA9PiB7XHJcbiAgICBjb25zdCBidWZmZXJzID0gW107XHJcbiAgICBsZXQgY3Vyc29yID0gMDtcclxuICAgIC8vIGZpcnN0IGNodW5rIGlzIHRoZSB2ZXJzaW9uXHJcbiAgICBjb25zdCB2ZXJzaW9uID0gZGF0YVZpZXcoY29uY2F0ZW5hdGVkQnVmZmVyLCBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMsIGN1cnNvcik7XHJcbiAgICAvLyBJZiB2ZXJzaW9uIGlzIG91dHNpZGUgb2YgdGhlIHN1cHBvcnRlZCB2ZXJzaW9ucywgdGhyb3cgYW4gZXJyb3IuXHJcbiAgICAvLyBUaGlzIHVzdWFsbHkgbWVhbnMgdGhlIGJ1ZmZlciB3YXNuJ3QgZW5jb2RlZCB1c2luZyB0aGlzIEFQSSwgc28gd2UnZCBvbmx5XHJcbiAgICAvLyB3YXN0ZSBjb21wdXRlLlxyXG4gICAgaWYgKHZlcnNpb24gPiBDT05DQVRfQlVGRkVSU19WRVJTSU9OKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHZlcnNpb24gJHt2ZXJzaW9ufWApO1xyXG4gICAgfVxyXG4gICAgY3Vyc29yICs9IFZFUlNJT05fREFUQVZJRVdfQllURVM7XHJcbiAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IGRhdGFWaWV3KGNvbmNhdGVuYXRlZEJ1ZmZlciwgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTLCBjdXJzb3IpO1xyXG4gICAgICAgIGN1cnNvciArPSBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVM7XHJcbiAgICAgICAgYnVmZmVycy5wdXNoKGNvbmNhdGVuYXRlZEJ1ZmZlci5zbGljZShjdXJzb3IsIGN1cnNvciArIGNodW5rU2l6ZSkpO1xyXG4gICAgICAgIGN1cnNvciArPSBjaHVua1NpemU7XHJcbiAgICAgICAgaWYgKGN1cnNvciA+PSBjb25jYXRlbmF0ZWRCdWZmZXIuYnl0ZUxlbmd0aCkge1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnVmZmVycztcclxufTtcclxuLy8gaGVscGVycyBmb3IgKGRlKWNvbXByZXNzaW5nIGRhdGEgd2l0aCBKU09OIG1ldGFkYXRhIGluY2x1ZGluZyBlbmNyeXB0aW9uXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8qKiBAcHJpdmF0ZSAqL1xyXG5jb25zdCBfZW5jcnlwdEFuZENvbXByZXNzID0gKGRhdGEsIGVuY3J5cHRpb25LZXkpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgY29uc3QgeyBlbmNyeXB0ZWRCdWZmZXIsIGl2IH0gPSB5aWVsZCBlbmNyeXB0RGF0YShlbmNyeXB0aW9uS2V5LCBkZWZsYXRlKGRhdGEpKTtcclxuICAgIHJldHVybiB7IGl2LCBidWZmZXI6IG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZEJ1ZmZlcikgfTtcclxufSk7XHJcbi8qKlxyXG4gKiBUaGUgcmV0dXJuZWQgYnVmZmVyIGhhcyBmb2xsb3dpbmcgZm9ybWF0OlxyXG4gKiBgW11gIHJlZmVycyB0byBhIGJ1ZmZlcnMgd3JhcHBlciAoc2VlIGBjb25jYXRCdWZmZXJzYClcclxuICpcclxuICogW1xyXG4gKiAgIGVuY29kaW5nTWV0YWRhdGFCdWZmZXIsXHJcbiAqICAgaXYsXHJcbiAqICAgW1xyXG4gKiAgICAgIGNvbnRlbnRzTWV0YWRhdGFCdWZmZXJcclxuICogICAgICBjb250ZW50c0J1ZmZlclxyXG4gKiAgIF1cclxuICogXVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNvbXByZXNzRGF0YSA9IChkYXRhQnVmZmVyLCBvcHRpb25zKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgIGNvbnN0IGZpbGVJbmZvID0ge1xyXG4gICAgICAgIHZlcnNpb246IDIsXHJcbiAgICAgICAgY29tcHJlc3Npb246IFwicGFrb0AxXCIsXHJcbiAgICAgICAgZW5jcnlwdGlvbjogXCJBRVMtR0NNXCIsXHJcbiAgICB9O1xyXG4gICAgY29uc3QgZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlciA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShmaWxlSW5mbykpO1xyXG4gICAgY29uc3QgY29udGVudHNNZXRhZGF0YUJ1ZmZlciA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShvcHRpb25zLm1ldGFkYXRhIHx8IG51bGwpKTtcclxuICAgIGNvbnN0IHsgaXYsIGJ1ZmZlciB9ID0geWllbGQgX2VuY3J5cHRBbmRDb21wcmVzcyhjb25jYXRCdWZmZXJzKGNvbnRlbnRzTWV0YWRhdGFCdWZmZXIsIGRhdGFCdWZmZXIpLCBvcHRpb25zLmVuY3J5cHRpb25LZXkpO1xyXG4gICAgcmV0dXJuIGNvbmNhdEJ1ZmZlcnMoZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlciwgaXYsIGJ1ZmZlcik7XHJcbn0pO1xyXG4vKiogQHByaXZhdGUgKi9cclxuY29uc3QgX2RlY3J5cHRBbmREZWNvbXByZXNzID0gKGl2LCBkZWNyeXB0ZWRCdWZmZXIsIGRlY3J5cHRpb25LZXksIGlzQ29tcHJlc3NlZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICBkZWNyeXB0ZWRCdWZmZXIgPSBuZXcgVWludDhBcnJheSh5aWVsZCBkZWNyeXB0RGF0YShpdiwgZGVjcnlwdGVkQnVmZmVyLCBkZWNyeXB0aW9uS2V5KSk7XHJcbiAgICBpZiAoaXNDb21wcmVzc2VkKSB7XHJcbiAgICAgICAgcmV0dXJuIGluZmxhdGUoZGVjcnlwdGVkQnVmZmVyKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkZWNyeXB0ZWRCdWZmZXI7XHJcbn0pO1xyXG5leHBvcnQgY29uc3QgZGVjb21wcmVzc0RhdGEgPSAoYnVmZmVyVmlldywgb3B0aW9ucykgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAvLyBmaXJzdCBjaHVuayBpcyBlbmNvZGluZyBtZXRhZGF0YSAoaWdub3JlZCBmb3Igbm93KVxyXG4gICAgY29uc3QgW2VuY29kaW5nTWV0YWRhdGFCdWZmZXIsIGl2LCBidWZmZXJdID0gc3BsaXRCdWZmZXJzKGJ1ZmZlclZpZXcpO1xyXG4gICAgY29uc3QgZW5jb2RpbmdNZXRhZGF0YSA9IEpTT04ucGFyc2UobmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGVuY29kaW5nTWV0YWRhdGFCdWZmZXIpKTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgW2NvbnRlbnRzTWV0YWRhdGFCdWZmZXIsIGNvbnRlbnRzQnVmZmVyXSA9IHNwbGl0QnVmZmVycyh5aWVsZCBfZGVjcnlwdEFuZERlY29tcHJlc3MoaXYsIGJ1ZmZlciwgb3B0aW9ucy5kZWNyeXB0aW9uS2V5LCAhIWVuY29kaW5nTWV0YWRhdGEuY29tcHJlc3Npb24pKTtcclxuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IEpTT04ucGFyc2UobmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnRzTWV0YWRhdGFCdWZmZXIpKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAvKiogbWV0YWRhdGEgc291cmNlIGlzIGFsd2F5cyBKU09OIHNvIHdlIGNhbiBkZWNvZGUgaXQgaGVyZSAqL1xyXG4gICAgICAgICAgICBtZXRhZGF0YSxcclxuICAgICAgICAgICAgLyoqIGRhdGEgY2FuIGJlIGFueXRoaW5nIHNvIHRoZSBjYWxsZXIgbXVzdCBkZWNvZGUgaXQgKi9cclxuICAgICAgICAgICAgZGF0YTogY29udGVudHNCdWZmZXIsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGR1cmluZyBkZWNvbXByZXNzaW5nIGFuZCBkZWNyeXB0aW5nIHRoZSBmaWxlLmAsIGVuY29kaW5nTWV0YWRhdGEpO1xyXG4gICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfVxyXG59KTtcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59O1xyXG5pbXBvcnQgZGVjb2RlUG5nIGZyb20gXCJwbmctY2h1bmtzLWV4dHJhY3RcIjtcclxuaW1wb3J0IHRFWHQgZnJvbSBcInBuZy1jaHVuay10ZXh0XCI7XHJcbmltcG9ydCBlbmNvZGVQbmcgZnJvbSBcInBuZy1jaHVua3MtZW5jb2RlXCI7XHJcbmltcG9ydCB7IHN0cmluZ1RvQmFzZTY0LCBlbmNvZGUsIGRlY29kZSwgYmFzZTY0VG9TdHJpbmcgfSBmcm9tIFwiLi9lbmNvZGVcIjtcclxuaW1wb3J0IHsgRVhQT1JUX0RBVEFfVFlQRVMsIE1JTUVfVFlQRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFBOR1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5jb25zdCBibG9iVG9BcnJheUJ1ZmZlciA9IChibG9iKSA9PiB7XHJcbiAgICBpZiAoXCJhcnJheUJ1ZmZlclwiIGluIGJsb2IpIHtcclxuICAgICAgICByZXR1cm4gYmxvYi5hcnJheUJ1ZmZlcigpO1xyXG4gICAgfVxyXG4gICAgLy8gU2FmYXJpXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGlmICghKChfYSA9IGV2ZW50LnRhcmdldCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlc3VsdCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKFwiY291bGRuJ3QgY29udmVydCBibG9iIHRvIEFycmF5QnVmZmVyXCIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXNvbHZlKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xyXG4gICAgfSk7XHJcbn07XHJcbmV4cG9ydCBjb25zdCBnZXRURVh0Q2h1bmsgPSAoYmxvYikgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICBjb25zdCBjaHVua3MgPSBkZWNvZGVQbmcobmV3IFVpbnQ4QXJyYXkoeWllbGQgYmxvYlRvQXJyYXlCdWZmZXIoYmxvYikpKTtcclxuICAgIGNvbnN0IG1ldGFkYXRhQ2h1bmsgPSBjaHVua3MuZmluZCgoY2h1bmspID0+IGNodW5rLm5hbWUgPT09IFwidEVYdFwiKTtcclxuICAgIGlmIChtZXRhZGF0YUNodW5rKSB7XHJcbiAgICAgICAgcmV0dXJuIHRFWHQuZGVjb2RlKG1ldGFkYXRhQ2h1bmsuZGF0YSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufSk7XHJcbmV4cG9ydCBjb25zdCBlbmNvZGVQbmdNZXRhZGF0YSA9ICh7IGJsb2IsIG1ldGFkYXRhLCB9KSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgIGNvbnN0IGNodW5rcyA9IGRlY29kZVBuZyhuZXcgVWludDhBcnJheSh5aWVsZCBibG9iVG9BcnJheUJ1ZmZlcihibG9iKSkpO1xyXG4gICAgY29uc3QgbWV0YWRhdGFDaHVuayA9IHRFWHQuZW5jb2RlKE1JTUVfVFlQRVMuZXhjYWxpZHJhdywgSlNPTi5zdHJpbmdpZnkoeWllbGQgZW5jb2RlKHtcclxuICAgICAgICB0ZXh0OiBtZXRhZGF0YSxcclxuICAgICAgICBjb21wcmVzczogdHJ1ZSxcclxuICAgIH0pKSk7XHJcbiAgICAvLyBpbnNlcnQgbWV0YWRhdGEgYmVmb3JlIGxhc3QgY2h1bmsgKGlFTkQpXHJcbiAgICBjaHVua3Muc3BsaWNlKC0xLCAwLCBtZXRhZGF0YUNodW5rKTtcclxuICAgIHJldHVybiBuZXcgQmxvYihbZW5jb2RlUG5nKGNodW5rcyldLCB7IHR5cGU6IE1JTUVfVFlQRVMucG5nIH0pO1xyXG59KTtcclxuZXhwb3J0IGNvbnN0IGRlY29kZVBuZ01ldGFkYXRhID0gKGJsb2IpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgY29uc3QgbWV0YWRhdGEgPSB5aWVsZCBnZXRURVh0Q2h1bmsoYmxvYik7XHJcbiAgICBpZiAoKG1ldGFkYXRhID09PSBudWxsIHx8IG1ldGFkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXRhZGF0YS5rZXl3b3JkKSA9PT0gTUlNRV9UWVBFUy5leGNhbGlkcmF3KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgZW5jb2RlZERhdGEgPSBKU09OLnBhcnNlKG1ldGFkYXRhLnRleHQpO1xyXG4gICAgICAgICAgICBpZiAoIShcImVuY29kZWRcIiBpbiBlbmNvZGVkRGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSwgdW4tZW5jb2RlZCBzY2VuZSBKU09OXHJcbiAgICAgICAgICAgICAgICBpZiAoXCJ0eXBlXCIgaW4gZW5jb2RlZERhdGEgJiZcclxuICAgICAgICAgICAgICAgICAgICBlbmNvZGVkRGF0YS50eXBlID09PSBFWFBPUlRfREFUQV9UWVBFUy5leGNhbGlkcmF3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnRleHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGQUlMRURcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIGRlY29kZShlbmNvZGVkRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRkFJTEVEXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURcIik7XHJcbn0pO1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBTVkdcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZXhwb3J0IGNvbnN0IGVuY29kZVN2Z01ldGFkYXRhID0gKHsgdGV4dCB9KSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgIGNvbnN0IGJhc2U2NCA9IHlpZWxkIHN0cmluZ1RvQmFzZTY0KEpTT04uc3RyaW5naWZ5KHlpZWxkIGVuY29kZSh7IHRleHQgfSkpLCB0cnVlIC8qIGlzIGFscmVhZHkgYnl0ZSBzdHJpbmcgKi8pO1xyXG4gICAgbGV0IG1ldGFkYXRhID0gXCJcIjtcclxuICAgIG1ldGFkYXRhICs9IGA8IS0tIHBheWxvYWQtdHlwZToke01JTUVfVFlQRVMuZXhjYWxpZHJhd30gLS0+YDtcclxuICAgIG1ldGFkYXRhICs9IGA8IS0tIHBheWxvYWQtdmVyc2lvbjoyIC0tPmA7XHJcbiAgICBtZXRhZGF0YSArPSBcIjwhLS0gcGF5bG9hZC1zdGFydCAtLT5cIjtcclxuICAgIG1ldGFkYXRhICs9IGJhc2U2NDtcclxuICAgIG1ldGFkYXRhICs9IFwiPCEtLSBwYXlsb2FkLWVuZCAtLT5cIjtcclxuICAgIHJldHVybiBtZXRhZGF0YTtcclxufSk7XHJcbmV4cG9ydCBjb25zdCBkZWNvZGVTdmdNZXRhZGF0YSA9ICh7IHN2ZyB9KSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgIGlmIChzdmcuaW5jbHVkZXMoYHBheWxvYWQtdHlwZToke01JTUVfVFlQRVMuZXhjYWxpZHJhd31gKSkge1xyXG4gICAgICAgIGNvbnN0IG1hdGNoID0gc3ZnLm1hdGNoKC88IS0tIHBheWxvYWQtc3RhcnQgLS0+KC4rPyk8IS0tIHBheWxvYWQtZW5kIC0tPi8pO1xyXG4gICAgICAgIGlmICghbWF0Y2gpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbk1hdGNoID0gc3ZnLm1hdGNoKC88IS0tIHBheWxvYWQtdmVyc2lvbjooXFxkKykgLS0+Lyk7XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9ICh2ZXJzaW9uTWF0Y2ggPT09IG51bGwgfHwgdmVyc2lvbk1hdGNoID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2ZXJzaW9uTWF0Y2hbMV0pIHx8IFwiMVwiO1xyXG4gICAgICAgIGNvbnN0IGlzQnl0ZVN0cmluZyA9IHZlcnNpb24gIT09IFwiMVwiO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGpzb24gPSB5aWVsZCBiYXNlNjRUb1N0cmluZyhtYXRjaFsxXSwgaXNCeXRlU3RyaW5nKTtcclxuICAgICAgICAgICAgY29uc3QgZW5jb2RlZERhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xyXG4gICAgICAgICAgICBpZiAoIShcImVuY29kZWRcIiBpbiBlbmNvZGVkRGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSwgdW4tZW5jb2RlZCBzY2VuZSBKU09OXHJcbiAgICAgICAgICAgICAgICBpZiAoXCJ0eXBlXCIgaW4gZW5jb2RlZERhdGEgJiZcclxuICAgICAgICAgICAgICAgICAgICBlbmNvZGVkRGF0YS50eXBlID09PSBFWFBPUlRfREFUQV9UWVBFUy5leGNhbGlkcmF3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGQUlMRURcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIGRlY29kZShlbmNvZGVkRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRkFJTEVEXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURcIik7XHJcbn0pO1xyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4706\n')}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkExcalidraw=self.webpackChunkExcalidraw||[]).push([[9],{4706:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "decodePngMetadata": () => (/* binding */ decodePngMetadata),\n "decodeSvgMetadata": () => (/* binding */ decodeSvgMetadata),\n "encodePngMetadata": () => (/* binding */ encodePngMetadata),\n "encodeSvgMetadata": () => (/* binding */ encodeSvgMetadata),\n "getTEXtChunk": () => (/* binding */ getTEXtChunk)\n});\n\n// EXTERNAL MODULE: ../../../node_modules/png-chunks-extract/index.js\nvar png_chunks_extract = __webpack_require__(2983);\nvar png_chunks_extract_default = /*#__PURE__*/__webpack_require__.n(png_chunks_extract);\n// EXTERNAL MODULE: ../../../node_modules/png-chunk-text/index.js\nvar png_chunk_text = __webpack_require__(1194);\n// EXTERNAL MODULE: ../../../node_modules/png-chunks-encode/index.js\nvar png_chunks_encode = __webpack_require__(3434);\nvar png_chunks_encode_default = /*#__PURE__*/__webpack_require__.n(png_chunks_encode);\n// EXTERNAL MODULE: ../../../node_modules/pako/index.js\nvar pako = __webpack_require__(2744);\n// EXTERNAL MODULE: ../../constants.ts\nvar constants = __webpack_require__(4942);\n;// CONCATENATED MODULE: ../../data/encryption.ts\n\r\nconst IV_LENGTH_BYTES = 12;\r\nconst createIV = () => {\r\n const arr = new Uint8Array(IV_LENGTH_BYTES);\r\n return window.crypto.getRandomValues(arr);\r\n};\r\nconst generateEncryptionKey = async (returnAs) => {\r\n const key = await window.crypto.subtle.generateKey({\r\n name: "AES-GCM",\r\n length: ENCRYPTION_KEY_BITS,\r\n }, true, // extractable\r\n ["encrypt", "decrypt"]);\r\n return (returnAs === "cryptoKey"\r\n ? key\r\n : (await window.crypto.subtle.exportKey("jwk", key)).k);\r\n};\r\nconst getCryptoKey = (key, usage) => window.crypto.subtle.importKey("jwk", {\r\n alg: "A128GCM",\r\n ext: true,\r\n k: key,\r\n key_ops: ["encrypt", "decrypt"],\r\n kty: "oct",\r\n}, {\r\n name: "AES-GCM",\r\n length: ENCRYPTION_KEY_BITS,\r\n}, false, // extractable\r\n[usage]);\r\nconst encryption_encryptData = async (key, data) => {\r\n const importedKey = typeof key === "string" ? await getCryptoKey(key, "encrypt") : key;\r\n const iv = createIV();\r\n const buffer = typeof data === "string"\r\n ? new TextEncoder().encode(data)\r\n : data instanceof Uint8Array\r\n ? data\r\n : data instanceof Blob\r\n ? await data.arrayBuffer()\r\n : data;\r\n // We use symmetric encryption. AES-GCM is the recommended algorithm and\r\n // includes checks that the ciphertext has not been modified by an attacker.\r\n const encryptedBuffer = await window.crypto.subtle.encrypt({\r\n name: "AES-GCM",\r\n iv,\r\n }, importedKey, buffer);\r\n return { encryptedBuffer, iv };\r\n};\r\nconst encryption_decryptData = async (iv, encrypted, privateKey) => {\r\n const key = await getCryptoKey(privateKey, "decrypt");\r\n return window.crypto.subtle.decrypt({\r\n name: "AES-GCM",\r\n iv,\r\n }, key, encrypted);\r\n};\r\n\n;// CONCATENATED MODULE: ../../data/encode.ts\n\r\n\r\n// -----------------------------------------------------------------------------\r\n// byte (binary) strings\r\n// -----------------------------------------------------------------------------\r\n// fast, Buffer-compatible implem\r\nconst toByteString = (data) => {\r\n return new Promise((resolve, reject) => {\r\n const blob = typeof data === "string"\r\n ? new Blob([new TextEncoder().encode(data)])\r\n : new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)]);\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n if (!event.target || typeof event.target.result !== "string") {\r\n return reject(new Error("couldn\'t convert to byte string"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsBinaryString(blob);\r\n });\r\n};\r\nconst byteStringToArrayBuffer = (byteString) => {\r\n const buffer = new ArrayBuffer(byteString.length);\r\n const bufferView = new Uint8Array(buffer);\r\n for (let i = 0, len = byteString.length; i < len; i++) {\r\n bufferView[i] = byteString.charCodeAt(i);\r\n }\r\n return buffer;\r\n};\r\nconst byteStringToString = (byteString) => {\r\n return new TextDecoder("utf-8").decode(byteStringToArrayBuffer(byteString));\r\n};\r\n// -----------------------------------------------------------------------------\r\n// base64\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * @param isByteString set to true if already byte string to prevent bloat\r\n * due to reencoding\r\n */\r\nconst stringToBase64 = async (str, isByteString = false) => {\r\n return isByteString ? window.btoa(str) : window.btoa(await toByteString(str));\r\n};\r\n// async to align with stringToBase64\r\nconst base64ToString = async (base64, isByteString = false) => {\r\n return isByteString\r\n ? window.atob(base64)\r\n : byteStringToString(window.atob(base64));\r\n};\r\n/**\r\n * Encodes (and potentially compresses via zlib) text to byte string\r\n */\r\nconst encode = async ({ text, compress, }) => {\r\n let deflated;\r\n if (compress !== false) {\r\n try {\r\n deflated = await toByteString((0,pako.deflate)(text));\r\n }\r\n catch (error) {\r\n console.error("encode: cannot deflate", error);\r\n }\r\n }\r\n return {\r\n version: "1",\r\n encoding: "bstring",\r\n compressed: !!deflated,\r\n encoded: deflated || (await toByteString(text)),\r\n };\r\n};\r\nconst decode = async (data) => {\r\n let decoded;\r\n switch (data.encoding) {\r\n case "bstring":\r\n // if compressed, do not double decode the bstring\r\n decoded = data.compressed\r\n ? data.encoded\r\n : await byteStringToString(data.encoded);\r\n break;\r\n default:\r\n throw new Error(`decode: unknown encoding "${data.encoding}"`);\r\n }\r\n if (data.compressed) {\r\n return (0,pako.inflate)(new Uint8Array(byteStringToArrayBuffer(decoded)), {\r\n to: "string",\r\n });\r\n }\r\n return decoded;\r\n};\r\n// -----------------------------------------------------------------------------\r\nconst CONCAT_BUFFERS_VERSION = 1;\r\n/** how many bytes we use to encode how many bytes the next chunk has.\r\n * Corresponds to DataView setter methods (setUint32, setUint16, etc).\r\n *\r\n * NOTE ! values must not be changed, which would be backwards incompatible !\r\n */\r\nconst VERSION_DATAVIEW_BYTES = 4;\r\nconst NEXT_CHUNK_SIZE_DATAVIEW_BYTES = 4;\r\n// -----------------------------------------------------------------------------\r\nconst DATA_VIEW_BITS_MAP = { 1: 8, 2: 16, 4: 32 };\r\n/**\r\n * abstraction over DataView that serves as a typed getter/setter in case\r\n * you\'re using constants for the byte size and want to ensure there\'s no\r\n * discrepenancy in the encoding across refactors.\r\n *\r\n * DataView serves for an endian-agnostic handling of numbers in ArrayBuffers.\r\n */\r\nfunction dataView(buffer, bytes, offset, value) {\r\n if (value != null) {\r\n if (value > Math.pow(2, DATA_VIEW_BITS_MAP[bytes]) - 1) {\r\n throw new Error(`attempting to set value higher than the allocated bytes (value: ${value}, bytes: ${bytes})`);\r\n }\r\n const method = `setUint${DATA_VIEW_BITS_MAP[bytes]}`;\r\n new DataView(buffer.buffer)[method](offset, value);\r\n return buffer;\r\n }\r\n const method = `getUint${DATA_VIEW_BITS_MAP[bytes]}`;\r\n return new DataView(buffer.buffer)[method](offset);\r\n}\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * Resulting concatenated buffer has this format:\r\n *\r\n * [\r\n * VERSION chunk (4 bytes)\r\n * LENGTH chunk 1 (4 bytes)\r\n * DATA chunk 1 (up to 2^32 bits)\r\n * LENGTH chunk 2 (4 bytes)\r\n * DATA chunk 2 (up to 2^32 bits)\r\n * ...\r\n * ]\r\n *\r\n * @param buffers each buffer (chunk) must be at most 2^32 bits large (~4GB)\r\n */\r\nconst concatBuffers = (...buffers) => {\r\n const bufferView = new Uint8Array(VERSION_DATAVIEW_BYTES +\r\n NEXT_CHUNK_SIZE_DATAVIEW_BYTES * buffers.length +\r\n buffers.reduce((acc, buffer) => acc + buffer.byteLength, 0));\r\n let cursor = 0;\r\n // as the first chunk we\'ll encode the version for backwards compatibility\r\n dataView(bufferView, VERSION_DATAVIEW_BYTES, cursor, CONCAT_BUFFERS_VERSION);\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n for (const buffer of buffers) {\r\n dataView(bufferView, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor, buffer.byteLength);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n bufferView.set(buffer, cursor);\r\n cursor += buffer.byteLength;\r\n }\r\n return bufferView;\r\n};\r\n/** can only be used on buffers created via `concatBuffers()` */\r\nconst splitBuffers = (concatenatedBuffer) => {\r\n const buffers = [];\r\n let cursor = 0;\r\n // first chunk is the version\r\n const version = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor);\r\n // If version is outside of the supported versions, throw an error.\r\n // This usually means the buffer wasn\'t encoded using this API, so we\'d only\r\n // waste compute.\r\n if (version > CONCAT_BUFFERS_VERSION) {\r\n throw new Error(`invalid version ${version}`);\r\n }\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n while (true) {\r\n const chunkSize = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n buffers.push(concatenatedBuffer.slice(cursor, cursor + chunkSize));\r\n cursor += chunkSize;\r\n if (cursor >= concatenatedBuffer.byteLength) {\r\n break;\r\n }\r\n }\r\n return buffers;\r\n};\r\n// helpers for (de)compressing data with JSON metadata including encryption\r\n// -----------------------------------------------------------------------------\r\n/** @private */\r\nconst _encryptAndCompress = async (data, encryptionKey) => {\r\n const { encryptedBuffer, iv } = await encryptData(encryptionKey, deflate(data));\r\n return { iv, buffer: new Uint8Array(encryptedBuffer) };\r\n};\r\n/**\r\n * The returned buffer has following format:\r\n * `[]` refers to a buffers wrapper (see `concatBuffers`)\r\n *\r\n * [\r\n * encodingMetadataBuffer,\r\n * iv,\r\n * [\r\n * contentsMetadataBuffer\r\n * contentsBuffer\r\n * ]\r\n * ]\r\n */\r\nconst compressData = async (dataBuffer, options) => {\r\n const fileInfo = {\r\n version: 2,\r\n compression: "pako@1",\r\n encryption: "AES-GCM",\r\n };\r\n const encodingMetadataBuffer = new TextEncoder().encode(JSON.stringify(fileInfo));\r\n const contentsMetadataBuffer = new TextEncoder().encode(JSON.stringify(options.metadata || null));\r\n const { iv, buffer } = await _encryptAndCompress(concatBuffers(contentsMetadataBuffer, dataBuffer), options.encryptionKey);\r\n return concatBuffers(encodingMetadataBuffer, iv, buffer);\r\n};\r\n/** @private */\r\nconst _decryptAndDecompress = async (iv, decryptedBuffer, decryptionKey, isCompressed) => {\r\n decryptedBuffer = new Uint8Array(await decryptData(iv, decryptedBuffer, decryptionKey));\r\n if (isCompressed) {\r\n return inflate(decryptedBuffer);\r\n }\r\n return decryptedBuffer;\r\n};\r\nconst decompressData = async (bufferView, options) => {\r\n // first chunk is encoding metadata (ignored for now)\r\n const [encodingMetadataBuffer, iv, buffer] = splitBuffers(bufferView);\r\n const encodingMetadata = JSON.parse(new TextDecoder().decode(encodingMetadataBuffer));\r\n try {\r\n const [contentsMetadataBuffer, contentsBuffer] = splitBuffers(await _decryptAndDecompress(iv, buffer, options.decryptionKey, !!encodingMetadata.compression));\r\n const metadata = JSON.parse(new TextDecoder().decode(contentsMetadataBuffer));\r\n return {\r\n /** metadata source is always JSON so we can decode it here */\r\n metadata,\r\n /** data can be anything so the caller must decode it */\r\n data: contentsBuffer,\r\n };\r\n }\r\n catch (error) {\r\n console.error(`Error during decompressing and decrypting the file.`, encodingMetadata);\r\n throw error;\r\n }\r\n};\r\n// -----------------------------------------------------------------------------\r\n\n;// CONCATENATED MODULE: ../../data/image.ts\n\r\n\r\n\r\n\r\n\r\n// -----------------------------------------------------------------------------\r\n// PNG\r\n// -----------------------------------------------------------------------------\r\nconst blobToArrayBuffer = (blob) => {\r\n if ("arrayBuffer" in blob) {\r\n return blob.arrayBuffer();\r\n }\r\n // Safari\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n var _a;\r\n if (!((_a = event.target) === null || _a === void 0 ? void 0 : _a.result)) {\r\n return reject(new Error("couldn\'t convert blob to ArrayBuffer"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsArrayBuffer(blob);\r\n });\r\n};\r\nconst getTEXtChunk = async (blob) => {\r\n const chunks = png_chunks_extract_default()(new Uint8Array(await blobToArrayBuffer(blob)));\r\n const metadataChunk = chunks.find((chunk) => chunk.name === "tEXt");\r\n if (metadataChunk) {\r\n return png_chunk_text.decode(metadataChunk.data);\r\n }\r\n return null;\r\n};\r\nconst encodePngMetadata = async ({ blob, metadata, }) => {\r\n const chunks = png_chunks_extract_default()(new Uint8Array(await blobToArrayBuffer(blob)));\r\n const metadataChunk = png_chunk_text.encode(constants/* MIME_TYPES.excalidraw */.LO.excalidraw, JSON.stringify(await encode({\r\n text: metadata,\r\n compress: true,\r\n })));\r\n // insert metadata before last chunk (iEND)\r\n chunks.splice(-1, 0, metadataChunk);\r\n return new Blob([png_chunks_encode_default()(chunks)], { type: constants/* MIME_TYPES.png */.LO.png });\r\n};\r\nconst decodePngMetadata = async (blob) => {\r\n const metadata = await getTEXtChunk(blob);\r\n if ((metadata === null || metadata === void 0 ? void 0 : metadata.keyword) === constants/* MIME_TYPES.excalidraw */.LO.excalidraw) {\r\n try {\r\n const encodedData = JSON.parse(metadata.text);\r\n if (!("encoded" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if ("type" in encodedData &&\r\n encodedData.type === constants/* EXPORT_DATA_TYPES.excalidraw */.r8.excalidraw) {\r\n return metadata.text;\r\n }\r\n throw new Error("FAILED");\r\n }\r\n return await decode(encodedData);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n throw new Error("FAILED");\r\n }\r\n }\r\n throw new Error("INVALID");\r\n};\r\n// -----------------------------------------------------------------------------\r\n// SVG\r\n// -----------------------------------------------------------------------------\r\nconst encodeSvgMetadata = async ({ text }) => {\r\n const base64 = await stringToBase64(JSON.stringify(await encode({ text })), true /* is already byte string */);\r\n let metadata = "";\r\n metadata += `\x3c!-- payload-type:${constants/* MIME_TYPES.excalidraw */.LO.excalidraw} --\x3e`;\r\n metadata += `\x3c!-- payload-version:2 --\x3e`;\r\n metadata += "\x3c!-- payload-start --\x3e";\r\n metadata += base64;\r\n metadata += "\x3c!-- payload-end --\x3e";\r\n return metadata;\r\n};\r\nconst decodeSvgMetadata = async ({ svg }) => {\r\n if (svg.includes(`payload-type:${constants/* MIME_TYPES.excalidraw */.LO.excalidraw}`)) {\r\n const match = svg.match(/\x3c!-- payload-start --\x3e(.+?)\x3c!-- payload-end --\x3e/);\r\n if (!match) {\r\n throw new Error("INVALID");\r\n }\r\n const versionMatch = svg.match(/\x3c!-- payload-version:(\\d+) --\x3e/);\r\n const version = (versionMatch === null || versionMatch === void 0 ? void 0 : versionMatch[1]) || "1";\r\n const isByteString = version !== "1";\r\n try {\r\n const json = await base64ToString(match[1], isByteString);\r\n const encodedData = JSON.parse(json);\r\n if (!("encoded" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if ("type" in encodedData &&\r\n encodedData.type === constants/* EXPORT_DATA_TYPES.excalidraw */.r8.excalidraw) {\r\n return json;\r\n }\r\n throw new Error("FAILED");\r\n }\r\n return await decode(encodedData);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n throw new Error("FAILED");\r\n }\r\n }\r\n throw new Error("INVALID");\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDTztBQUNQLG1CQUFtQiw0QkFBUztBQUM1QjtBQUNBO0FBQ0EsZUFBZSxxQkFBVztBQUMxQjtBQUNBO0FBQ0E7QUFDTyxtQ0FBbUMsaUJBQWlCO0FBQzNELG1CQUFtQiw0QkFBUztBQUM1QiwwQkFBMEIscUJBQVcsQ0FBQyxrREFBcUIsdUJBQXVCLE1BQU07QUFDeEY7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EscUJBQXFCLDJCQUFTLGFBQWEsTUFBTSxvQ0FBYyxFQUFFO0FBQ2pFO0FBQ087QUFDUDtBQUNBLG1GQUFtRixrREFBcUI7QUFDeEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qyx5REFBNEI7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsTUFBTTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sbUNBQW1DLE1BQU07QUFDaEQseUJBQXlCLGNBQWMsc0JBQXNCLE1BQU0sR0FBRyxNQUFNO0FBQzVFO0FBQ0EscUNBQXFDLGtEQUFxQixFQUFFO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLG1DQUFtQyxLQUFLO0FBQy9DLHFDQUFxQyxrREFBcUIsQ0FBQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGNBQWM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMseURBQTRCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLE1BQU07QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9kYXRhL2VuY3J5cHRpb24udHM/NDg3OSIsIndlYnBhY2s6Ly8vLi4vLi4vZGF0YS9lbmNvZGUudHM/YzY2YSIsIndlYnBhY2s6Ly8vLi4vLi4vZGF0YS9pbWFnZS50cz81NzdkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVOQ1JZUFRJT05fS0VZX0JJVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmV4cG9ydCBjb25zdCBJVl9MRU5HVEhfQllURVMgPSAxMjtcclxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlWID0gKCkgPT4ge1xyXG4gICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoSVZfTEVOR1RIX0JZVEVTKTtcclxuICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnIpO1xyXG59O1xyXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVFbmNyeXB0aW9uS2V5ID0gYXN5bmMgKHJldHVybkFzKSA9PiB7XHJcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB3aW5kb3cuY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleSh7XHJcbiAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXHJcbiAgICAgICAgbGVuZ3RoOiBFTkNSWVBUSU9OX0tFWV9CSVRTLFxyXG4gICAgfSwgdHJ1ZSwgLy8gZXh0cmFjdGFibGVcclxuICAgIFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCJdKTtcclxuICAgIHJldHVybiAocmV0dXJuQXMgPT09IFwiY3J5cHRvS2V5XCJcclxuICAgICAgICA/IGtleVxyXG4gICAgICAgIDogKGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleShcImp3a1wiLCBrZXkpKS5rKTtcclxufTtcclxuZXhwb3J0IGNvbnN0IGdldENyeXB0b0tleSA9IChrZXksIHVzYWdlKSA9PiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXCJqd2tcIiwge1xyXG4gICAgYWxnOiBcIkExMjhHQ01cIixcclxuICAgIGV4dDogdHJ1ZSxcclxuICAgIGs6IGtleSxcclxuICAgIGtleV9vcHM6IFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCJdLFxyXG4gICAga3R5OiBcIm9jdFwiLFxyXG59LCB7XHJcbiAgICBuYW1lOiBcIkFFUy1HQ01cIixcclxuICAgIGxlbmd0aDogRU5DUllQVElPTl9LRVlfQklUUyxcclxufSwgZmFsc2UsIC8vIGV4dHJhY3RhYmxlXHJcblt1c2FnZV0pO1xyXG5leHBvcnQgY29uc3QgZW5jcnlwdERhdGEgPSBhc3luYyAoa2V5LCBkYXRhKSA9PiB7XHJcbiAgICBjb25zdCBpbXBvcnRlZEtleSA9IHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgPyBhd2FpdCBnZXRDcnlwdG9LZXkoa2V5LCBcImVuY3J5cHRcIikgOiBrZXk7XHJcbiAgICBjb25zdCBpdiA9IGNyZWF0ZUlWKCk7XHJcbiAgICBjb25zdCBidWZmZXIgPSB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIlxyXG4gICAgICAgID8gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGRhdGEpXHJcbiAgICAgICAgOiBkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheVxyXG4gICAgICAgICAgICA/IGRhdGFcclxuICAgICAgICAgICAgOiBkYXRhIGluc3RhbmNlb2YgQmxvYlxyXG4gICAgICAgICAgICAgICAgPyBhd2FpdCBkYXRhLmFycmF5QnVmZmVyKClcclxuICAgICAgICAgICAgICAgIDogZGF0YTtcclxuICAgIC8vIFdlIHVzZSBzeW1tZXRyaWMgZW5jcnlwdGlvbi4gQUVTLUdDTSBpcyB0aGUgcmVjb21tZW5kZWQgYWxnb3JpdGhtIGFuZFxyXG4gICAgLy8gaW5jbHVkZXMgY2hlY2tzIHRoYXQgdGhlIGNpcGhlcnRleHQgaGFzIG5vdCBiZWVuIG1vZGlmaWVkIGJ5IGFuIGF0dGFja2VyLlxyXG4gICAgY29uc3QgZW5jcnlwdGVkQnVmZmVyID0gYXdhaXQgd2luZG93LmNyeXB0by5zdWJ0bGUuZW5jcnlwdCh7XHJcbiAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXHJcbiAgICAgICAgaXYsXHJcbiAgICB9LCBpbXBvcnRlZEtleSwgYnVmZmVyKTtcclxuICAgIHJldHVybiB7IGVuY3J5cHRlZEJ1ZmZlciwgaXYgfTtcclxufTtcclxuZXhwb3J0IGNvbnN0IGRlY3J5cHREYXRhID0gYXN5bmMgKGl2LCBlbmNyeXB0ZWQsIHByaXZhdGVLZXkpID0+IHtcclxuICAgIGNvbnN0IGtleSA9IGF3YWl0IGdldENyeXB0b0tleShwcml2YXRlS2V5LCBcImRlY3J5cHRcIik7XHJcbiAgICByZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuZGVjcnlwdCh7XHJcbiAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXHJcbiAgICAgICAgaXYsXHJcbiAgICB9LCBrZXksIGVuY3J5cHRlZCk7XHJcbn07XHJcbiIsImltcG9ydCB7IGRlZmxhdGUsIGluZmxhdGUgfSBmcm9tIFwicGFrb1wiO1xyXG5pbXBvcnQgeyBlbmNyeXB0RGF0YSwgZGVjcnlwdERhdGEgfSBmcm9tIFwiLi9lbmNyeXB0aW9uXCI7XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIGJ5dGUgKGJpbmFyeSkgc3RyaW5nc1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBmYXN0LCBCdWZmZXItY29tcGF0aWJsZSBpbXBsZW1cclxuZXhwb3J0IGNvbnN0IHRvQnl0ZVN0cmluZyA9IChkYXRhKSA9PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJsb2IgPSB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIlxyXG4gICAgICAgICAgICA/IG5ldyBCbG9iKFtuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZGF0YSldKVxyXG4gICAgICAgICAgICA6IG5ldyBCbG9iKFtkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGRhdGEgOiBuZXcgVWludDhBcnJheShkYXRhKV0pO1xyXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldCB8fCB0eXBlb2YgZXZlbnQudGFyZ2V0LnJlc3VsdCAhPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoXCJjb3VsZG4ndCBjb252ZXJ0IHRvIGJ5dGUgc3RyaW5nXCIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXNvbHZlKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhibG9iKTtcclxuICAgIH0pO1xyXG59O1xyXG5jb25zdCBieXRlU3RyaW5nVG9BcnJheUJ1ZmZlciA9IChieXRlU3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpO1xyXG4gICAgY29uc3QgYnVmZmVyVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYnl0ZVN0cmluZy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgIGJ1ZmZlclZpZXdbaV0gPSBieXRlU3RyaW5nLmNoYXJDb2RlQXQoaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnVmZmVyO1xyXG59O1xyXG5jb25zdCBieXRlU3RyaW5nVG9TdHJpbmcgPSAoYnl0ZVN0cmluZykgPT4ge1xyXG4gICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpLmRlY29kZShieXRlU3RyaW5nVG9BcnJheUJ1ZmZlcihieXRlU3RyaW5nKSk7XHJcbn07XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIGJhc2U2NFxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vKipcclxuICogQHBhcmFtIGlzQnl0ZVN0cmluZyBzZXQgdG8gdHJ1ZSBpZiBhbHJlYWR5IGJ5dGUgc3RyaW5nIHRvIHByZXZlbnQgYmxvYXRcclxuICogIGR1ZSB0byByZWVuY29kaW5nXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc3RyaW5nVG9CYXNlNjQgPSBhc3luYyAoc3RyLCBpc0J5dGVTdHJpbmcgPSBmYWxzZSkgPT4ge1xyXG4gICAgcmV0dXJuIGlzQnl0ZVN0cmluZyA/IHdpbmRvdy5idG9hKHN0cikgOiB3aW5kb3cuYnRvYShhd2FpdCB0b0J5dGVTdHJpbmcoc3RyKSk7XHJcbn07XHJcbi8vIGFzeW5jIHRvIGFsaWduIHdpdGggc3RyaW5nVG9CYXNlNjRcclxuZXhwb3J0IGNvbnN0IGJhc2U2NFRvU3RyaW5nID0gYXN5bmMgKGJhc2U2NCwgaXNCeXRlU3RyaW5nID0gZmFsc2UpID0+IHtcclxuICAgIHJldHVybiBpc0J5dGVTdHJpbmdcclxuICAgICAgICA/IHdpbmRvdy5hdG9iKGJhc2U2NClcclxuICAgICAgICA6IGJ5dGVTdHJpbmdUb1N0cmluZyh3aW5kb3cuYXRvYihiYXNlNjQpKTtcclxufTtcclxuLyoqXHJcbiAqIEVuY29kZXMgKGFuZCBwb3RlbnRpYWxseSBjb21wcmVzc2VzIHZpYSB6bGliKSB0ZXh0IHRvIGJ5dGUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZW5jb2RlID0gYXN5bmMgKHsgdGV4dCwgY29tcHJlc3MsIH0pID0+IHtcclxuICAgIGxldCBkZWZsYXRlZDtcclxuICAgIGlmIChjb21wcmVzcyAhPT0gZmFsc2UpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBkZWZsYXRlZCA9IGF3YWl0IHRvQnl0ZVN0cmluZyhkZWZsYXRlKHRleHQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlbmNvZGU6IGNhbm5vdCBkZWZsYXRlXCIsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHZlcnNpb246IFwiMVwiLFxyXG4gICAgICAgIGVuY29kaW5nOiBcImJzdHJpbmdcIixcclxuICAgICAgICBjb21wcmVzc2VkOiAhIWRlZmxhdGVkLFxyXG4gICAgICAgIGVuY29kZWQ6IGRlZmxhdGVkIHx8IChhd2FpdCB0b0J5dGVTdHJpbmcodGV4dCkpLFxyXG4gICAgfTtcclxufTtcclxuZXhwb3J0IGNvbnN0IGRlY29kZSA9IGFzeW5jIChkYXRhKSA9PiB7XHJcbiAgICBsZXQgZGVjb2RlZDtcclxuICAgIHN3aXRjaCAoZGF0YS5lbmNvZGluZykge1xyXG4gICAgICAgIGNhc2UgXCJic3RyaW5nXCI6XHJcbiAgICAgICAgICAgIC8vIGlmIGNvbXByZXNzZWQsIGRvIG5vdCBkb3VibGUgZGVjb2RlIHRoZSBic3RyaW5nXHJcbiAgICAgICAgICAgIGRlY29kZWQgPSBkYXRhLmNvbXByZXNzZWRcclxuICAgICAgICAgICAgICAgID8gZGF0YS5lbmNvZGVkXHJcbiAgICAgICAgICAgICAgICA6IGF3YWl0IGJ5dGVTdHJpbmdUb1N0cmluZyhkYXRhLmVuY29kZWQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGRlY29kZTogdW5rbm93biBlbmNvZGluZyBcIiR7ZGF0YS5lbmNvZGluZ31cImApO1xyXG4gICAgfVxyXG4gICAgaWYgKGRhdGEuY29tcHJlc3NlZCkge1xyXG4gICAgICAgIHJldHVybiBpbmZsYXRlKG5ldyBVaW50OEFycmF5KGJ5dGVTdHJpbmdUb0FycmF5QnVmZmVyKGRlY29kZWQpKSwge1xyXG4gICAgICAgICAgICB0bzogXCJzdHJpbmdcIixcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBkZWNvZGVkO1xyXG59O1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5jb25zdCBDT05DQVRfQlVGRkVSU19WRVJTSU9OID0gMTtcclxuLyoqIGhvdyBtYW55IGJ5dGVzIHdlIHVzZSB0byBlbmNvZGUgaG93IG1hbnkgYnl0ZXMgdGhlIG5leHQgY2h1bmsgaGFzLlxyXG4gKiBDb3JyZXNwb25kcyB0byBEYXRhVmlldyBzZXR0ZXIgbWV0aG9kcyAoc2V0VWludDMyLCBzZXRVaW50MTYsIGV0YykuXHJcbiAqXHJcbiAqIE5PVEUgISB2YWx1ZXMgbXVzdCBub3QgYmUgY2hhbmdlZCwgd2hpY2ggd291bGQgYmUgYmFja3dhcmRzIGluY29tcGF0aWJsZSAhXHJcbiAqL1xyXG5jb25zdCBWRVJTSU9OX0RBVEFWSUVXX0JZVEVTID0gNDtcclxuY29uc3QgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTID0gNDtcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuY29uc3QgREFUQV9WSUVXX0JJVFNfTUFQID0geyAxOiA4LCAyOiAxNiwgNDogMzIgfTtcclxuLyoqXHJcbiAqIGFic3RyYWN0aW9uIG92ZXIgRGF0YVZpZXcgdGhhdCBzZXJ2ZXMgYXMgYSB0eXBlZCBnZXR0ZXIvc2V0dGVyIGluIGNhc2VcclxuICogeW91J3JlIHVzaW5nIGNvbnN0YW50cyBmb3IgdGhlIGJ5dGUgc2l6ZSBhbmQgd2FudCB0byBlbnN1cmUgdGhlcmUncyBub1xyXG4gKiBkaXNjcmVwZW5hbmN5IGluIHRoZSBlbmNvZGluZyBhY3Jvc3MgcmVmYWN0b3JzLlxyXG4gKlxyXG4gKiBEYXRhVmlldyBzZXJ2ZXMgZm9yIGFuIGVuZGlhbi1hZ25vc3RpYyBoYW5kbGluZyBvZiBudW1iZXJzIGluIEFycmF5QnVmZmVycy5cclxuICovXHJcbmZ1bmN0aW9uIGRhdGFWaWV3KGJ1ZmZlciwgYnl0ZXMsIG9mZnNldCwgdmFsdWUpIHtcclxuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID4gTWF0aC5wb3coMiwgREFUQV9WSUVXX0JJVFNfTUFQW2J5dGVzXSkgLSAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYXR0ZW1wdGluZyB0byBzZXQgdmFsdWUgaGlnaGVyIHRoYW4gdGhlIGFsbG9jYXRlZCBieXRlcyAodmFsdWU6ICR7dmFsdWV9LCBieXRlczogJHtieXRlc30pYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IGBzZXRVaW50JHtEQVRBX1ZJRVdfQklUU19NQVBbYnl0ZXNdfWA7XHJcbiAgICAgICAgbmV3IERhdGFWaWV3KGJ1ZmZlci5idWZmZXIpW21ldGhvZF0ob2Zmc2V0LCB2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcclxuICAgIH1cclxuICAgIGNvbnN0IG1ldGhvZCA9IGBnZXRVaW50JHtEQVRBX1ZJRVdfQklUU19NQVBbYnl0ZXNdfWA7XHJcbiAgICByZXR1cm4gbmV3IERhdGFWaWV3KGJ1ZmZlci5idWZmZXIpW21ldGhvZF0ob2Zmc2V0KTtcclxufVxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vKipcclxuICogUmVzdWx0aW5nIGNvbmNhdGVuYXRlZCBidWZmZXIgaGFzIHRoaXMgZm9ybWF0OlxyXG4gKlxyXG4gKiBbXHJcbiAqICAgVkVSU0lPTiBjaHVuayAoNCBieXRlcylcclxuICogICBMRU5HVEggY2h1bmsgMSAoNCBieXRlcylcclxuICogICBEQVRBIGNodW5rIDEgKHVwIHRvIDJeMzIgYml0cylcclxuICogICBMRU5HVEggY2h1bmsgMiAoNCBieXRlcylcclxuICogICBEQVRBIGNodW5rIDIgKHVwIHRvIDJeMzIgYml0cylcclxuICogICAuLi5cclxuICogXVxyXG4gKlxyXG4gKiBAcGFyYW0gYnVmZmVycyBlYWNoIGJ1ZmZlciAoY2h1bmspIG11c3QgYmUgYXQgbW9zdCAyXjMyIGJpdHMgbGFyZ2UgKH40R0IpXHJcbiAqL1xyXG5jb25zdCBjb25jYXRCdWZmZXJzID0gKC4uLmJ1ZmZlcnMpID0+IHtcclxuICAgIGNvbnN0IGJ1ZmZlclZpZXcgPSBuZXcgVWludDhBcnJheShWRVJTSU9OX0RBVEFWSUVXX0JZVEVTICtcclxuICAgICAgICBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMgKiBidWZmZXJzLmxlbmd0aCArXHJcbiAgICAgICAgYnVmZmVycy5yZWR1Y2UoKGFjYywgYnVmZmVyKSA9PiBhY2MgKyBidWZmZXIuYnl0ZUxlbmd0aCwgMCkpO1xyXG4gICAgbGV0IGN1cnNvciA9IDA7XHJcbiAgICAvLyBhcyB0aGUgZmlyc3QgY2h1bmsgd2UnbGwgZW5jb2RlIHRoZSB2ZXJzaW9uIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG4gICAgZGF0YVZpZXcoYnVmZmVyVmlldywgVkVSU0lPTl9EQVRBVklFV19CWVRFUywgY3Vyc29yLCBDT05DQVRfQlVGRkVSU19WRVJTSU9OKTtcclxuICAgIGN1cnNvciArPSBWRVJTSU9OX0RBVEFWSUVXX0JZVEVTO1xyXG4gICAgZm9yIChjb25zdCBidWZmZXIgb2YgYnVmZmVycykge1xyXG4gICAgICAgIGRhdGFWaWV3KGJ1ZmZlclZpZXcsIE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUywgY3Vyc29yLCBidWZmZXIuYnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgY3Vyc29yICs9IE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUztcclxuICAgICAgICBidWZmZXJWaWV3LnNldChidWZmZXIsIGN1cnNvcik7XHJcbiAgICAgICAgY3Vyc29yICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ1ZmZlclZpZXc7XHJcbn07XHJcbi8qKiBjYW4gb25seSBiZSB1c2VkIG9uIGJ1ZmZlcnMgY3JlYXRlZCB2aWEgYGNvbmNhdEJ1ZmZlcnMoKWAgKi9cclxuY29uc3Qgc3BsaXRCdWZmZXJzID0gKGNvbmNhdGVuYXRlZEJ1ZmZlcikgPT4ge1xyXG4gICAgY29uc3QgYnVmZmVycyA9IFtdO1xyXG4gICAgbGV0IGN1cnNvciA9IDA7XHJcbiAgICAvLyBmaXJzdCBjaHVuayBpcyB0aGUgdmVyc2lvblxyXG4gICAgY29uc3QgdmVyc2lvbiA9IGRhdGFWaWV3KGNvbmNhdGVuYXRlZEJ1ZmZlciwgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTLCBjdXJzb3IpO1xyXG4gICAgLy8gSWYgdmVyc2lvbiBpcyBvdXRzaWRlIG9mIHRoZSBzdXBwb3J0ZWQgdmVyc2lvbnMsIHRocm93IGFuIGVycm9yLlxyXG4gICAgLy8gVGhpcyB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgd2Fzbid0IGVuY29kZWQgdXNpbmcgdGhpcyBBUEksIHNvIHdlJ2Qgb25seVxyXG4gICAgLy8gd2FzdGUgY29tcHV0ZS5cclxuICAgIGlmICh2ZXJzaW9uID4gQ09OQ0FUX0JVRkZFUlNfVkVSU0lPTikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB2ZXJzaW9uICR7dmVyc2lvbn1gKTtcclxuICAgIH1cclxuICAgIGN1cnNvciArPSBWRVJTSU9OX0RBVEFWSUVXX0JZVEVTO1xyXG4gICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgICBjb25zdCBjaHVua1NpemUgPSBkYXRhVmlldyhjb25jYXRlbmF0ZWRCdWZmZXIsIE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUywgY3Vyc29yKTtcclxuICAgICAgICBjdXJzb3IgKz0gTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTO1xyXG4gICAgICAgIGJ1ZmZlcnMucHVzaChjb25jYXRlbmF0ZWRCdWZmZXIuc2xpY2UoY3Vyc29yLCBjdXJzb3IgKyBjaHVua1NpemUpKTtcclxuICAgICAgICBjdXJzb3IgKz0gY2h1bmtTaXplO1xyXG4gICAgICAgIGlmIChjdXJzb3IgPj0gY29uY2F0ZW5hdGVkQnVmZmVyLmJ5dGVMZW5ndGgpIHtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ1ZmZlcnM7XHJcbn07XHJcbi8vIGhlbHBlcnMgZm9yIChkZSljb21wcmVzc2luZyBkYXRhIHdpdGggSlNPTiBtZXRhZGF0YSBpbmNsdWRpbmcgZW5jcnlwdGlvblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vKiogQHByaXZhdGUgKi9cclxuY29uc3QgX2VuY3J5cHRBbmRDb21wcmVzcyA9IGFzeW5jIChkYXRhLCBlbmNyeXB0aW9uS2V5KSA9PiB7XHJcbiAgICBjb25zdCB7IGVuY3J5cHRlZEJ1ZmZlciwgaXYgfSA9IGF3YWl0IGVuY3J5cHREYXRhKGVuY3J5cHRpb25LZXksIGRlZmxhdGUoZGF0YSkpO1xyXG4gICAgcmV0dXJuIHsgaXYsIGJ1ZmZlcjogbmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkQnVmZmVyKSB9O1xyXG59O1xyXG4vKipcclxuICogVGhlIHJldHVybmVkIGJ1ZmZlciBoYXMgZm9sbG93aW5nIGZvcm1hdDpcclxuICogYFtdYCByZWZlcnMgdG8gYSBidWZmZXJzIHdyYXBwZXIgKHNlZSBgY29uY2F0QnVmZmVyc2ApXHJcbiAqXHJcbiAqIFtcclxuICogICBlbmNvZGluZ01ldGFkYXRhQnVmZmVyLFxyXG4gKiAgIGl2LFxyXG4gKiAgIFtcclxuICogICAgICBjb250ZW50c01ldGFkYXRhQnVmZmVyXHJcbiAqICAgICAgY29udGVudHNCdWZmZXJcclxuICogICBdXHJcbiAqIF1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjb21wcmVzc0RhdGEgPSBhc3luYyAoZGF0YUJ1ZmZlciwgb3B0aW9ucykgPT4ge1xyXG4gICAgY29uc3QgZmlsZUluZm8gPSB7XHJcbiAgICAgICAgdmVyc2lvbjogMixcclxuICAgICAgICBjb21wcmVzc2lvbjogXCJwYWtvQDFcIixcclxuICAgICAgICBlbmNyeXB0aW9uOiBcIkFFUy1HQ01cIixcclxuICAgIH07XHJcbiAgICBjb25zdCBlbmNvZGluZ01ldGFkYXRhQnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGZpbGVJbmZvKSk7XHJcbiAgICBjb25zdCBjb250ZW50c01ldGFkYXRhQnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KG9wdGlvbnMubWV0YWRhdGEgfHwgbnVsbCkpO1xyXG4gICAgY29uc3QgeyBpdiwgYnVmZmVyIH0gPSBhd2FpdCBfZW5jcnlwdEFuZENvbXByZXNzKGNvbmNhdEJ1ZmZlcnMoY29udGVudHNNZXRhZGF0YUJ1ZmZlciwgZGF0YUJ1ZmZlciksIG9wdGlvbnMuZW5jcnlwdGlvbktleSk7XHJcbiAgICByZXR1cm4gY29uY2F0QnVmZmVycyhlbmNvZGluZ01ldGFkYXRhQnVmZmVyLCBpdiwgYnVmZmVyKTtcclxufTtcclxuLyoqIEBwcml2YXRlICovXHJcbmNvbnN0IF9kZWNyeXB0QW5kRGVjb21wcmVzcyA9IGFzeW5jIChpdiwgZGVjcnlwdGVkQnVmZmVyLCBkZWNyeXB0aW9uS2V5LCBpc0NvbXByZXNzZWQpID0+IHtcclxuICAgIGRlY3J5cHRlZEJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGF3YWl0IGRlY3J5cHREYXRhKGl2LCBkZWNyeXB0ZWRCdWZmZXIsIGRlY3J5cHRpb25LZXkpKTtcclxuICAgIGlmIChpc0NvbXByZXNzZWQpIHtcclxuICAgICAgICByZXR1cm4gaW5mbGF0ZShkZWNyeXB0ZWRCdWZmZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRlY3J5cHRlZEJ1ZmZlcjtcclxufTtcclxuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NEYXRhID0gYXN5bmMgKGJ1ZmZlclZpZXcsIG9wdGlvbnMpID0+IHtcclxuICAgIC8vIGZpcnN0IGNodW5rIGlzIGVuY29kaW5nIG1ldGFkYXRhIChpZ25vcmVkIGZvciBub3cpXHJcbiAgICBjb25zdCBbZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlciwgaXYsIGJ1ZmZlcl0gPSBzcGxpdEJ1ZmZlcnMoYnVmZmVyVmlldyk7XHJcbiAgICBjb25zdCBlbmNvZGluZ01ldGFkYXRhID0gSlNPTi5wYXJzZShuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlcikpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBbY29udGVudHNNZXRhZGF0YUJ1ZmZlciwgY29udGVudHNCdWZmZXJdID0gc3BsaXRCdWZmZXJzKGF3YWl0IF9kZWNyeXB0QW5kRGVjb21wcmVzcyhpdiwgYnVmZmVyLCBvcHRpb25zLmRlY3J5cHRpb25LZXksICEhZW5jb2RpbmdNZXRhZGF0YS5jb21wcmVzc2lvbikpO1xyXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gSlNPTi5wYXJzZShuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoY29udGVudHNNZXRhZGF0YUJ1ZmZlcikpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC8qKiBtZXRhZGF0YSBzb3VyY2UgaXMgYWx3YXlzIEpTT04gc28gd2UgY2FuIGRlY29kZSBpdCBoZXJlICovXHJcbiAgICAgICAgICAgIG1ldGFkYXRhLFxyXG4gICAgICAgICAgICAvKiogZGF0YSBjYW4gYmUgYW55dGhpbmcgc28gdGhlIGNhbGxlciBtdXN0IGRlY29kZSBpdCAqL1xyXG4gICAgICAgICAgICBkYXRhOiBjb250ZW50c0J1ZmZlcixcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZHVyaW5nIGRlY29tcHJlc3NpbmcgYW5kIGRlY3J5cHRpbmcgdGhlIGZpbGUuYCwgZW5jb2RpbmdNZXRhZGF0YSk7XHJcbiAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcbn07XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiIsImltcG9ydCBkZWNvZGVQbmcgZnJvbSBcInBuZy1jaHVua3MtZXh0cmFjdFwiO1xyXG5pbXBvcnQgdEVYdCBmcm9tIFwicG5nLWNodW5rLXRleHRcIjtcclxuaW1wb3J0IGVuY29kZVBuZyBmcm9tIFwicG5nLWNodW5rcy1lbmNvZGVcIjtcclxuaW1wb3J0IHsgc3RyaW5nVG9CYXNlNjQsIGVuY29kZSwgZGVjb2RlLCBiYXNlNjRUb1N0cmluZyB9IGZyb20gXCIuL2VuY29kZVwiO1xyXG5pbXBvcnQgeyBFWFBPUlRfREFUQV9UWVBFUywgTUlNRV9UWVBFUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gUE5HXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmNvbnN0IGJsb2JUb0FycmF5QnVmZmVyID0gKGJsb2IpID0+IHtcclxuICAgIGlmIChcImFycmF5QnVmZmVyXCIgaW4gYmxvYikge1xyXG4gICAgICAgIHJldHVybiBibG9iLmFycmF5QnVmZmVyKCk7XHJcbiAgICB9XHJcbiAgICAvLyBTYWZhcmlcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBfYTtcclxuICAgICAgICAgICAgaWYgKCEoKF9hID0gZXZlbnQudGFyZ2V0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVzdWx0KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoXCJjb3VsZG4ndCBjb252ZXJ0IGJsb2IgdG8gQXJyYXlCdWZmZXJcIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc29sdmUoZXZlbnQudGFyZ2V0LnJlc3VsdCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XHJcbiAgICB9KTtcclxufTtcclxuZXhwb3J0IGNvbnN0IGdldFRFWHRDaHVuayA9IGFzeW5jIChibG9iKSA9PiB7XHJcbiAgICBjb25zdCBjaHVua3MgPSBkZWNvZGVQbmcobmV3IFVpbnQ4QXJyYXkoYXdhaXQgYmxvYlRvQXJyYXlCdWZmZXIoYmxvYikpKTtcclxuICAgIGNvbnN0IG1ldGFkYXRhQ2h1bmsgPSBjaHVua3MuZmluZCgoY2h1bmspID0+IGNodW5rLm5hbWUgPT09IFwidEVYdFwiKTtcclxuICAgIGlmIChtZXRhZGF0YUNodW5rKSB7XHJcbiAgICAgICAgcmV0dXJuIHRFWHQuZGVjb2RlKG1ldGFkYXRhQ2h1bmsuZGF0YSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuZXhwb3J0IGNvbnN0IGVuY29kZVBuZ01ldGFkYXRhID0gYXN5bmMgKHsgYmxvYiwgbWV0YWRhdGEsIH0pID0+IHtcclxuICAgIGNvbnN0IGNodW5rcyA9IGRlY29kZVBuZyhuZXcgVWludDhBcnJheShhd2FpdCBibG9iVG9BcnJheUJ1ZmZlcihibG9iKSkpO1xyXG4gICAgY29uc3QgbWV0YWRhdGFDaHVuayA9IHRFWHQuZW5jb2RlKE1JTUVfVFlQRVMuZXhjYWxpZHJhdywgSlNPTi5zdHJpbmdpZnkoYXdhaXQgZW5jb2RlKHtcclxuICAgICAgICB0ZXh0OiBtZXRhZGF0YSxcclxuICAgICAgICBjb21wcmVzczogdHJ1ZSxcclxuICAgIH0pKSk7XHJcbiAgICAvLyBpbnNlcnQgbWV0YWRhdGEgYmVmb3JlIGxhc3QgY2h1bmsgKGlFTkQpXHJcbiAgICBjaHVua3Muc3BsaWNlKC0xLCAwLCBtZXRhZGF0YUNodW5rKTtcclxuICAgIHJldHVybiBuZXcgQmxvYihbZW5jb2RlUG5nKGNodW5rcyldLCB7IHR5cGU6IE1JTUVfVFlQRVMucG5nIH0pO1xyXG59O1xyXG5leHBvcnQgY29uc3QgZGVjb2RlUG5nTWV0YWRhdGEgPSBhc3luYyAoYmxvYikgPT4ge1xyXG4gICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBnZXRURVh0Q2h1bmsoYmxvYik7XHJcbiAgICBpZiAoKG1ldGFkYXRhID09PSBudWxsIHx8IG1ldGFkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXRhZGF0YS5rZXl3b3JkKSA9PT0gTUlNRV9UWVBFUy5leGNhbGlkcmF3KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgZW5jb2RlZERhdGEgPSBKU09OLnBhcnNlKG1ldGFkYXRhLnRleHQpO1xyXG4gICAgICAgICAgICBpZiAoIShcImVuY29kZWRcIiBpbiBlbmNvZGVkRGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSwgdW4tZW5jb2RlZCBzY2VuZSBKU09OXHJcbiAgICAgICAgICAgICAgICBpZiAoXCJ0eXBlXCIgaW4gZW5jb2RlZERhdGEgJiZcclxuICAgICAgICAgICAgICAgICAgICBlbmNvZGVkRGF0YS50eXBlID09PSBFWFBPUlRfREFUQV9UWVBFUy5leGNhbGlkcmF3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnRleHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGQUlMRURcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRlY29kZShlbmNvZGVkRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRkFJTEVEXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURcIik7XHJcbn07XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFNWR1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5leHBvcnQgY29uc3QgZW5jb2RlU3ZnTWV0YWRhdGEgPSBhc3luYyAoeyB0ZXh0IH0pID0+IHtcclxuICAgIGNvbnN0IGJhc2U2NCA9IGF3YWl0IHN0cmluZ1RvQmFzZTY0KEpTT04uc3RyaW5naWZ5KGF3YWl0IGVuY29kZSh7IHRleHQgfSkpLCB0cnVlIC8qIGlzIGFscmVhZHkgYnl0ZSBzdHJpbmcgKi8pO1xyXG4gICAgbGV0IG1ldGFkYXRhID0gXCJcIjtcclxuICAgIG1ldGFkYXRhICs9IGA8IS0tIHBheWxvYWQtdHlwZToke01JTUVfVFlQRVMuZXhjYWxpZHJhd30gLS0+YDtcclxuICAgIG1ldGFkYXRhICs9IGA8IS0tIHBheWxvYWQtdmVyc2lvbjoyIC0tPmA7XHJcbiAgICBtZXRhZGF0YSArPSBcIjwhLS0gcGF5bG9hZC1zdGFydCAtLT5cIjtcclxuICAgIG1ldGFkYXRhICs9IGJhc2U2NDtcclxuICAgIG1ldGFkYXRhICs9IFwiPCEtLSBwYXlsb2FkLWVuZCAtLT5cIjtcclxuICAgIHJldHVybiBtZXRhZGF0YTtcclxufTtcclxuZXhwb3J0IGNvbnN0IGRlY29kZVN2Z01ldGFkYXRhID0gYXN5bmMgKHsgc3ZnIH0pID0+IHtcclxuICAgIGlmIChzdmcuaW5jbHVkZXMoYHBheWxvYWQtdHlwZToke01JTUVfVFlQRVMuZXhjYWxpZHJhd31gKSkge1xyXG4gICAgICAgIGNvbnN0IG1hdGNoID0gc3ZnLm1hdGNoKC88IS0tIHBheWxvYWQtc3RhcnQgLS0+KC4rPyk8IS0tIHBheWxvYWQtZW5kIC0tPi8pO1xyXG4gICAgICAgIGlmICghbWF0Y2gpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbk1hdGNoID0gc3ZnLm1hdGNoKC88IS0tIHBheWxvYWQtdmVyc2lvbjooXFxkKykgLS0+Lyk7XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9ICh2ZXJzaW9uTWF0Y2ggPT09IG51bGwgfHwgdmVyc2lvbk1hdGNoID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2ZXJzaW9uTWF0Y2hbMV0pIHx8IFwiMVwiO1xyXG4gICAgICAgIGNvbnN0IGlzQnl0ZVN0cmluZyA9IHZlcnNpb24gIT09IFwiMVwiO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCBiYXNlNjRUb1N0cmluZyhtYXRjaFsxXSwgaXNCeXRlU3RyaW5nKTtcclxuICAgICAgICAgICAgY29uc3QgZW5jb2RlZERhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xyXG4gICAgICAgICAgICBpZiAoIShcImVuY29kZWRcIiBpbiBlbmNvZGVkRGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSwgdW4tZW5jb2RlZCBzY2VuZSBKU09OXHJcbiAgICAgICAgICAgICAgICBpZiAoXCJ0eXBlXCIgaW4gZW5jb2RlZERhdGEgJiZcclxuICAgICAgICAgICAgICAgICAgICBlbmNvZGVkRGF0YS50eXBlID09PSBFWFBPUlRfREFUQV9UWVBFUy5leGNhbGlkcmF3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGQUlMRURcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRlY29kZShlbmNvZGVkRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRkFJTEVEXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURcIik7XHJcbn07XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4706\n')}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunkExcalidraw=self.webpackChunkExcalidraw||[]).push([[9],{8527:function(e,t,r){"use strict";r.r(t),r.d(t,{decodePngMetadata:function(){return E},decodeSvgMetadata:function(){return L},encodePngMetadata:function(){return m},encodeSvgMetadata:function(){return A},getTEXtChunk:function(){return g}});var n=r(6086),a=r(7945),c=r.n(a),u=r(2983),o=r.n(u),s=r(1194),i=r(3434),f=r.n(i),p=r(2744),d=function(e){return new Promise((function(t,r){var n="string"==typeof e?new Blob([(new TextEncoder).encode(e)]):new Blob([e]),a=new FileReader;a.onload=function(e){if(!e.target||"string"!=typeof e.target.result)return r(new Error("couldn't convert to byte string"));t(e.target.result)},a.readAsBinaryString(n)}))},l=function(e){for(var t=new ArrayBuffer(e.length),r=new Uint8Array(t),n=0,a=e.length;n<a;n++)r[n]=e.charCodeAt(n);return t},x=function(e){return new TextDecoder("utf-8").decode(l(e))},w=function(){var e=(0,n.Z)(c().mark((function e(t){var r=arguments;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(r.length>1&&void 0!==r[1]&&r[1])){e.next=5;break}e.t0=btoa(t),e.next=10;break;case 5:return e.t1=btoa,e.next=8,d(t);case 8:e.t2=e.sent,e.t0=(0,e.t1)(e.t2);case 10:return e.abrupt("return",e.t0);case 11:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),v=function(){var e=(0,n.Z)(c().mark((function e(t){var r,n=arguments;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=n.length>1&&void 0!==n[1]&&n[1],e.abrupt("return",r?atob(t):x(atob(t)));case 2:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),b=function(){var e=(0,n.Z)(c().mark((function e(t){var r,n;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=t.text,!1===t.compress){e.next=11;break}return e.prev=2,e.next=5,d((0,p.deflate)(r));case 5:n=e.sent,e.next=11;break;case 8:e.prev=8,e.t0=e.catch(2),console.error("encode: cannot deflate",e.t0);case 11:if(e.t1=!!n,e.t2=n,e.t2){e.next=17;break}return e.next=16,d(r);case 16:e.t2=e.sent;case 17:return e.t3=e.t2,e.abrupt("return",{version:"1",encoding:"bstring",compressed:e.t1,encoded:e.t3});case 19:case"end":return e.stop()}}),e,null,[[2,8]])})));return function(t){return e.apply(this,arguments)}}(),h=function(){var e=(0,n.Z)(c().mark((function e(t){var r;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.t0=t.encoding,e.next="bstring"===e.t0?3:12;break;case 3:if(!t.compressed){e.next=7;break}e.t1=t.encoded,e.next=10;break;case 7:return e.next=9,x(t.encoded);case 9:e.t1=e.sent;case 10:return r=e.t1,e.abrupt("break",13);case 12:throw new Error('decode: unknown encoding "'.concat(t.encoding,'"'));case 13:if(!t.compressed){e.next=15;break}return e.abrupt("return",(0,p.inflate)(new Uint8Array(l(r)),{to:"string"}));case 15:return e.abrupt("return",r);case 16:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),y=r(8288),k=function(e){return"arrayBuffer"in e?e.arrayBuffer():new Promise((function(t,r){var n=new FileReader;n.onload=function(e){var n;if(null===(n=e.target)||void 0===n||!n.result)return r(new Error("couldn't convert blob to ArrayBuffer"));t(e.target.result)},n.readAsArrayBuffer(e)}))},g=function(){var e=(0,n.Z)(c().mark((function e(t){var r,n;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=o(),e.t1=Uint8Array,e.next=4,k(t);case 4:if(e.t2=e.sent,e.t3=new e.t1(e.t2),r=(0,e.t0)(e.t3),!(n=r.find((function(e){return"tEXt"===e.name})))){e.next=10;break}return e.abrupt("return",s.decode(n.data));case 10:return e.abrupt("return",null);case 11:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),m=function(){var e=(0,n.Z)(c().mark((function e(t){var r,n,a,u;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t.blob,n=t.metadata,e.t0=o(),e.t1=Uint8Array,e.next=5,k(r);case 5:return e.t2=e.sent,e.t3=new e.t1(e.t2),a=(0,e.t0)(e.t3),e.t4=s,e.t5=y.LO.excalidraw,e.t6=JSON,e.next=13,b({text:n,compress:!0});case 13:return e.t7=e.sent,e.t8=e.t6.stringify.call(e.t6,e.t7),u=e.t4.encode.call(e.t4,e.t5,e.t8),a.splice(-1,0,u),e.abrupt("return",new Blob([f()(a)],{type:"image/png"}));case 18:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),E=function(){var e=(0,n.Z)(c().mark((function e(t){var r,n;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,g(t);case 2:if((null==(r=e.sent)?void 0:r.keyword)!==y.LO.excalidraw){e.next=19;break}if(e.prev=4,"encoded"in(n=JSON.parse(r.text))){e.next=10;break}if(!("type"in n)||n.type!==y.r8.excalidraw){e.next=9;break}return e.abrupt("return",r.text);case 9:throw new Error("FAILED");case 10:return e.next=12,h(n);case 12:return e.abrupt("return",e.sent);case 15:throw e.prev=15,e.t0=e.catch(4),console.error(e.t0),new Error("FAILED");case 19:throw new Error("INVALID");case 20:case"end":return e.stop()}}),e,null,[[4,15]])})));return function(t){return e.apply(this,arguments)}}(),A=function(){var e=(0,n.Z)(c().mark((function e(t){var r,n,a;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t.text,e.t0=w,e.t1=JSON,e.next=5,b({text:r});case 5:return e.t2=e.sent,e.t3=e.t1.stringify.call(e.t1,e.t2),e.next=9,(0,e.t0)(e.t3,!0);case 9:return n=e.sent,a="",a+="\x3c!-- payload-type:".concat(y.LO.excalidraw," --\x3e"),a+="\x3c!-- payload-version:2 --\x3e",a+="\x3c!-- payload-start --\x3e",a+=n,a+="\x3c!-- payload-end --\x3e",e.abrupt("return",a);case 17:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),L=function(){var e=(0,n.Z)(c().mark((function e(t){var r,n,a,u,o,s,i;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(r=t.svg).includes("payload-type:".concat(y.LO.excalidraw))){e.next=26;break}if(n=r.match(/<!-- payload-start -->(.+?)<!-- payload-end -->/)){e.next=5;break}throw new Error("INVALID");case 5:return a=r.match(/<!-- payload-version:(\d+) -->/),u=(null==a?void 0:a[1])||"1",o="1"!==u,e.prev=8,e.next=11,v(n[1],o);case 11:if(s=e.sent,"encoded"in(i=JSON.parse(s))){e.next=17;break}if(!("type"in i)||i.type!==y.r8.excalidraw){e.next=16;break}return e.abrupt("return",s);case 16:throw new Error("FAILED");case 17:return e.next=19,h(i);case 19:return e.abrupt("return",e.sent);case 22:throw e.prev=22,e.t0=e.catch(8),console.error(e.t0),new Error("FAILED");case 26:throw new Error("INVALID");case 27:case"end":return e.stop()}}),e,null,[[8,22]])})));return function(t){return e.apply(this,arguments)}}()}}]);
|