@zsviczian/excalidraw 0.9.0-obsidian-image-support-1 → 0.9.0-obsidian-image-support-2
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.
|
@@ -2588,7 +2588,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2588
2588
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2589
2589
|
|
|
2590
2590
|
"use strict";
|
|
2591
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"loadFirebaseStorage\": () => (/* binding */ loadFirebaseStorage),\n/* harmony export */ \"isSavedToFirebase\": () => (/* binding */ isSavedToFirebase),\n/* harmony export */ \"saveFilesToFirebase\": () => (/* binding */ saveFilesToFirebase),\n/* harmony export */ \"saveToFirebase\": () => (/* binding */ saveToFirebase),\n/* harmony export */ \"loadFromFirebase\": () => (/* binding */ loadFromFirebase),\n/* harmony export */ \"loadFilesFromFirebase\": () => (/* binding */ loadFilesFromFirebase)\n/* harmony export */ });\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ \"../../excalidraw-app/data/index.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../element */ \"../../element/index.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../data/restore */ \"../../data/restore.ts\");\n/* harmony import */ var _app_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../app_constants */ \"../../excalidraw-app/app_constants.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\n\r\n\r\n\r\n\r\n// private\r\n// -----------------------------------------------------------------------------\r\nconst FIREBASE_CONFIG = JSON.parse(process.env.REACT_APP_FIREBASE_CONFIG);\r\nlet firebasePromise = null;\r\nlet firestorePromise = null;\r\nlet firebseStoragePromise = null;\r\nlet isFirebaseInitialized = false;\r\nconst _loadFirebase = () => __awaiter(void 0, void 0, void 0, function* () {\r\n const firebase = (yield __webpack_require__.e(/*! import() | firebase */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! firebase/app */ \"../../../node_modules/firebase/app/dist/index.esm.js\"))).default;\r\n // due to dev HMR\r\n if (!isFirebaseInitialized) {\r\n isFirebaseInitialized = true;\r\n try {\r\n firebase.initializeApp(FIREBASE_CONFIG);\r\n }\r\n catch (error) {\r\n console.warn(error.name, error.code);\r\n }\r\n }\r\n return firebase;\r\n});\r\nconst _getFirebase = () => __awaiter(void 0, void 0, void 0, function* () {\r\n if (!firebasePromise) {\r\n firebasePromise = _loadFirebase();\r\n }\r\n return firebasePromise;\r\n});\r\n// -----------------------------------------------------------------------------\r\nconst loadFirestore = () => __awaiter(void 0, void 0, void 0, function* () {\r\n const firebase = yield _getFirebase();\r\n if (!firestorePromise) {\r\n firestorePromise = __webpack_require__.e(/*! import() | firestore */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! firebase/firestore */ \"../../../node_modules/firebase/firestore/dist/index.esm.js\"));\r\n }\r\n if (firestorePromise !== true) {\r\n yield firestorePromise;\r\n firestorePromise = true;\r\n }\r\n return firebase;\r\n});\r\nconst loadFirebaseStorage = () => __awaiter(void 0, void 0, void 0, function* () {\r\n const firebase = yield _getFirebase();\r\n if (!firebseStoragePromise) {\r\n firebseStoragePromise = __webpack_require__.e(/*! import() | storage */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! firebase/storage */ \"../../../node_modules/firebase/storage/dist/index.esm.js\"));\r\n }\r\n if (firebseStoragePromise !== true) {\r\n yield firebseStoragePromise;\r\n firebseStoragePromise = true;\r\n }\r\n return firebase;\r\n});\r\nconst encryptElements = (key, elements) => __awaiter(void 0, void 0, void 0, function* () {\r\n const importedKey = yield (0,_data__WEBPACK_IMPORTED_MODULE_0__.getImportedKey)(key, \"encrypt\");\r\n const iv = (0,_data__WEBPACK_IMPORTED_MODULE_0__.createIV)();\r\n const json = JSON.stringify(elements);\r\n const encoded = new TextEncoder().encode(json);\r\n const ciphertext = yield window.crypto.subtle.encrypt({\r\n name: \"AES-GCM\",\r\n iv,\r\n }, importedKey, encoded);\r\n return { ciphertext, iv };\r\n});\r\nconst decryptElements = (key, iv, ciphertext) => __awaiter(void 0, void 0, void 0, function* () {\r\n const importedKey = yield (0,_data__WEBPACK_IMPORTED_MODULE_0__.getImportedKey)(key, \"decrypt\");\r\n const decrypted = yield window.crypto.subtle.decrypt({\r\n name: \"AES-GCM\",\r\n iv,\r\n }, importedKey, ciphertext);\r\n const decodedData = new TextDecoder(\"utf-8\").decode(new Uint8Array(decrypted));\r\n return JSON.parse(decodedData);\r\n});\r\nconst firebaseSceneVersionCache = new WeakMap();\r\nconst isSavedToFirebase = (portal, elements) => {\r\n if (portal.socket && portal.roomId && portal.roomKey) {\r\n const sceneVersion = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getSceneVersion)(elements);\r\n return firebaseSceneVersionCache.get(portal.socket) === sceneVersion;\r\n }\r\n // if no room exists, consider the room saved so that we don't unnecessarily\r\n // prevent unload (there's nothing we could do at that point anyway)\r\n return true;\r\n};\r\nconst saveFilesToFirebase = ({ prefix, decryptionKey, files, allowedTypes, maxBytes, }) => __awaiter(void 0, void 0, void 0, function* () {\r\n const firebase = yield loadFirebaseStorage();\r\n const filesToUpload = [...files].map(([id, dataURL]) => {\r\n const blob = (0,_data__WEBPACK_IMPORTED_MODULE_0__.dataURLToBlob)(dataURL);\r\n if (!allowedTypes.includes(blob.type)) {\r\n throw new Error(\"Disallowed file type.\");\r\n }\r\n if (blob.size > maxBytes) {\r\n throw new Error(`File cannot be larger than ${maxBytes / 1024} kB.`);\r\n }\r\n return { blob, id };\r\n });\r\n const erroredFiles = new Map();\r\n const savedFiles = new Map();\r\n yield Promise.all(filesToUpload.map(({ blob, id }) => __awaiter(void 0, void 0, void 0, function* () {\r\n const encryptedData = yield (0,_data__WEBPACK_IMPORTED_MODULE_0__.encryptData)(decryptionKey, blob);\r\n try {\r\n yield firebase\r\n .storage()\r\n .ref(`${prefix}/${id}`)\r\n .put(new Blob([encryptedData.iv, encryptedData.blob], {\r\n type: blob.type,\r\n }), {\r\n cacheControl: `public, max-age=${_app_constants__WEBPACK_IMPORTED_MODULE_3__.FILE_CACHE_MAX_AGE_SEC}`,\r\n customMetadata: {\r\n data: JSON.stringify({\r\n version: 1,\r\n filename: id,\r\n type: blob.type,\r\n }),\r\n created: Date.now().toString(),\r\n },\r\n });\r\n savedFiles.set(id, true);\r\n }\r\n catch (error) {\r\n erroredFiles.set(id, true);\r\n }\r\n })));\r\n return { savedFiles, erroredFiles };\r\n});\r\nconst decryptData = (iv, encrypted, privateKey) => __awaiter(void 0, void 0, void 0, function* () {\r\n const key = yield (0,_data__WEBPACK_IMPORTED_MODULE_0__.getImportedKey)(privateKey, \"decrypt\");\r\n return window.crypto.subtle.decrypt({\r\n name: \"AES-GCM\",\r\n iv,\r\n }, key, encrypted);\r\n});\r\nconst saveToFirebase = (portal, elements) => __awaiter(void 0, void 0, void 0, function* () {\r\n const { roomId, roomKey, socket } = portal;\r\n if (\r\n // if no room exists, consider the room saved because there's nothing we can\r\n // do at this point\r\n !roomId ||\r\n !roomKey ||\r\n !socket ||\r\n isSavedToFirebase(portal, elements)) {\r\n return true;\r\n }\r\n const firebase = yield loadFirestore();\r\n const sceneVersion = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getSceneVersion)(elements);\r\n const { ciphertext, iv } = yield encryptElements(roomKey, elements);\r\n const nextDocData = {\r\n sceneVersion,\r\n ciphertext: firebase.firestore.Blob.fromUint8Array(new Uint8Array(ciphertext)),\r\n iv: firebase.firestore.Blob.fromUint8Array(iv),\r\n };\r\n const db = firebase.firestore();\r\n const docRef = db.collection(\"scenes\").doc(roomId);\r\n const didUpdate = yield db.runTransaction((transaction) => __awaiter(void 0, void 0, void 0, function* () {\r\n const doc = yield transaction.get(docRef);\r\n if (!doc.exists) {\r\n transaction.set(docRef, nextDocData);\r\n return true;\r\n }\r\n const prevDocData = doc.data();\r\n if (prevDocData.sceneVersion >= nextDocData.sceneVersion) {\r\n return false;\r\n }\r\n transaction.update(docRef, nextDocData);\r\n return true;\r\n }));\r\n if (didUpdate) {\r\n firebaseSceneVersionCache.set(socket, sceneVersion);\r\n }\r\n return didUpdate;\r\n});\r\nconst loadFromFirebase = (roomId, roomKey, socket) => __awaiter(void 0, void 0, void 0, function* () {\r\n const firebase = yield loadFirestore();\r\n const db = firebase.firestore();\r\n const docRef = db.collection(\"scenes\").doc(roomId);\r\n const doc = yield docRef.get();\r\n if (!doc.exists) {\r\n return null;\r\n }\r\n const storedScene = doc.data();\r\n const ciphertext = storedScene.ciphertext.toUint8Array();\r\n const iv = storedScene.iv.toUint8Array();\r\n const elements = yield decryptElements(roomKey, iv, ciphertext);\r\n if (socket) {\r\n firebaseSceneVersionCache.set(socket, (0,_element__WEBPACK_IMPORTED_MODULE_1__.getSceneVersion)(elements));\r\n }\r\n return (0,_data_restore__WEBPACK_IMPORTED_MODULE_2__.restoreElements)(elements, null);\r\n});\r\nconst loadFilesFromFirebase = (prefix, decryptionKey, filesIds) => __awaiter(void 0, void 0, void 0, function* () {\r\n const loadedFiles = [];\r\n const erroredFiles = [];\r\n yield Promise.all([...new Set(filesIds)].map((id) => __awaiter(void 0, void 0, void 0, function* () {\r\n try {\r\n const url = `https://firebasestorage.googleapis.com/v0/b/${FIREBASE_CONFIG.storageBucket}/o/${encodeURIComponent(prefix.replace(/^\\//, \"\"))}%2F${id}`;\r\n const response = yield fetch(`${url}?alt=media`);\r\n if (response.status < 400) {\r\n const contentType = response.headers.get(\"content-type\") || \"image/png\";\r\n const arrayBuffer = yield response.arrayBuffer();\r\n const KEY_LENGTH = 12;\r\n const iv = arrayBuffer.slice(0, KEY_LENGTH);\r\n const encrypted = arrayBuffer.slice(KEY_LENGTH, arrayBuffer.byteLength);\r\n const decrypted = yield decryptData(iv, encrypted, decryptionKey);\r\n const dataURL = yield (0,_data__WEBPACK_IMPORTED_MODULE_0__.arrayBufferToDataURL)(decrypted, contentType);\r\n loadedFiles.push({\r\n type: contentType.includes(\"image/\") ? \"image\" : \"other\",\r\n id,\r\n dataURL,\r\n });\r\n }\r\n }\r\n catch (error) {\r\n erroredFiles.push(id);\r\n console.error(error);\r\n }\r\n })));\r\n return { loadedFiles, erroredFiles };\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZXhjYWxpZHJhdy1hcHAvZGF0YS9maXJlYmFzZS50cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBS2lCO0FBQ2tCO0FBRWE7QUFFSztBQUVLO0FBRTFELFVBQVU7QUFDVixnRkFBZ0Y7QUFFaEYsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFFMUUsSUFBSSxlQUFlLEdBRVIsSUFBSSxDQUFDO0FBQ2hCLElBQUksZ0JBQWdCLEdBQStCLElBQUksQ0FBQztBQUN4RCxJQUFJLHFCQUFxQixHQUErQixJQUFJLENBQUM7QUFFN0QsSUFBSSxxQkFBcUIsR0FBRyxLQUFLLENBQUM7QUFFbEMsTUFBTSxhQUFhLEdBQUcsR0FBUyxFQUFFO0lBQy9CLE1BQU0sUUFBUSxHQUFHLENBQ2YsTUFBTSwwTEFBeUQsQ0FDaEUsQ0FBQyxPQUFPLENBQUM7SUFFVixpQkFBaUI7SUFDakIsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1FBQzFCLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJO1lBQ0YsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUN6QztRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0QztLQUNGO0lBRUQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyxFQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUcsR0FFbkIsRUFBRTtJQUNGLElBQUksQ0FBQyxlQUFlLEVBQUU7UUFDcEIsZUFBZSxHQUFHLGFBQWEsRUFBRSxDQUFDO0tBQ25DO0lBQ0QsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQyxFQUFDO0FBRUYsZ0ZBQWdGO0FBRWhGLE1BQU0sYUFBYSxHQUFHLEdBQVMsRUFBRTtJQUMvQixNQUFNLFFBQVEsR0FB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QUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBRWxFLE1BQU0sT0FBTyxHQUFHLE1BQU0sMkRBQW9CLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUVuRSxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUNmLElBQUksRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU87b0JBQ3hELEVBQUU7b0JBQ0YsT0FBTztpQkFDUixDQUFDLENBQUM7YUFDSjtTQUNGO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdEI7SUFDSCxDQUFDLEVBQUMsQ0FDSCxDQUFDO0lBRUYsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsQ0FBQztBQUN2QyxDQUFDLEVBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZXhjYWxpZHJhdy1hcHAvZGF0YS9maXJlYmFzZS50cz85MTNmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFycmF5QnVmZmVyVG9EYXRhVVJMLFxuICBkYXRhVVJMVG9CbG9iLFxuICBlbmNyeXB0RGF0YSxcbiAgZ2V0SW1wb3J0ZWRLZXksXG59IGZyb20gXCIuLi9kYXRhXCI7XG5pbXBvcnQgeyBjcmVhdGVJViB9IGZyb20gXCIuL2luZGV4XCI7XG5pbXBvcnQgeyBFeGNhbGlkcmF3RWxlbWVudCwgSW1hZ2VJZCB9IGZyb20gXCIuLi8uLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRTY2VuZVZlcnNpb24gfSBmcm9tIFwiLi4vLi4vZWxlbWVudFwiO1xuaW1wb3J0IFBvcnRhbCBmcm9tIFwiLi4vY29sbGFiL1BvcnRhbFwiO1xuaW1wb3J0IHsgcmVzdG9yZUVsZW1lbnRzIH0gZnJvbSBcIi4uLy4uL2RhdGEvcmVzdG9yZVwiO1xuaW1wb3J0IHsgQmluYXJ5RmlsZURhdGEsIERhdGFVUkwgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IEZJTEVfQ0FDSEVfTUFYX0FHRV9TRUMgfSBmcm9tIFwiLi4vYXBwX2NvbnN0YW50c1wiO1xuXG4vLyBwcml2YXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBGSVJFQkFTRV9DT05GSUcgPSBKU09OLnBhcnNlKHByb2Nlc3MuZW52LlJFQUNUX0FQUF9GSVJFQkFTRV9DT05GSUcpO1xuXG5sZXQgZmlyZWJhc2VQcm9taXNlOiBQcm9taXNlPFxuICB0eXBlb2YgaW1wb3J0KFwiZmlyZWJhc2UvYXBwXCIpLmRlZmF1bHRcbj4gfCBudWxsID0gbnVsbDtcbmxldCBmaXJlc3RvcmVQcm9taXNlOiBQcm9taXNlPGFueT4gfCBudWxsIHwgdHJ1ZSA9IG51bGw7XG5sZXQgZmlyZWJzZVN0b3JhZ2VQcm9taXNlOiBQcm9taXNlPGFueT4gfCBudWxsIHwgdHJ1ZSA9IG51bGw7XG5cbmxldCBpc0ZpcmViYXNlSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuY29uc3QgX2xvYWRGaXJlYmFzZSA9IGFzeW5jICgpID0+IHtcbiAgY29uc3QgZmlyZWJhc2UgPSAoXG4gICAgYXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tDaHVua05hbWU6IFwiZmlyZWJhc2VcIiAqLyBcImZpcmViYXNlL2FwcFwiKVxuICApLmRlZmF1bHQ7XG5cbiAgLy8gZHVlIHRvIGRldiBITVJcbiAgaWYgKCFpc0ZpcmViYXNlSW5pdGlhbGl6ZWQpIHtcbiAgICBpc0ZpcmViYXNlSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBmaXJlYmFzZS5pbml0aWFsaXplQXBwKEZJUkVCQVNFX0NPTkZJRyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihlcnJvci5uYW1lLCBlcnJvci5jb2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmlyZWJhc2U7XG59O1xuXG5jb25zdCBfZ2V0RmlyZWJhc2UgPSBhc3luYyAoKTogUHJvbWlzZTxcbiAgdHlwZW9mIGltcG9ydChcImZpcmViYXNlL2FwcFwiKS5kZWZhdWx0XG4+ID0+IHtcbiAgaWYgKCFmaXJlYmFzZVByb21pc2UpIHtcbiAgICBmaXJlYmFzZVByb21pc2UgPSBfbG9hZEZpcmViYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGZpcmViYXNlUHJvbWlzZTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IGxvYWRGaXJlc3RvcmUgPSBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGZpcmViYXNlID0gYXdhaXQgX2dldEZpcmViYXNlKCk7XG4gIGlmICghZmlyZXN0b3JlUHJvbWlzZSkge1xuICAgIGZpcmVzdG9yZVByb21pc2UgPSBpbXBvcnQoXG4gICAgICAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImZpcmVzdG9yZVwiICovIFwiZmlyZWJhc2UvZmlyZXN0b3JlXCJcbiAgICApO1xuICB9XG4gIGlmIChmaXJlc3RvcmVQcm9taXNlICE9PSB0cnVlKSB7XG4gICAgYXdhaXQgZmlyZXN0b3JlUHJvbWlzZTtcbiAgICBmaXJlc3RvcmVQcm9taXNlID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmlyZWJhc2U7XG59O1xuXG5leHBvcnQgY29uc3QgbG9hZEZpcmViYXNlU3RvcmFnZSA9IGFzeW5jICgpID0+IHtcbiAgY29uc3QgZmlyZWJhc2UgPSBhd2FpdCBfZ2V0RmlyZWJhc2UoKTtcbiAgaWYgKCFmaXJlYnNlU3RvcmFnZVByb21pc2UpIHtcbiAgICBmaXJlYnNlU3RvcmFnZVByb21pc2UgPSBpbXBvcnQoXG4gICAgICAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcInN0b3JhZ2VcIiAqLyBcImZpcmViYXNlL3N0b3JhZ2VcIlxuICAgICk7XG4gIH1cbiAgaWYgKGZpcmVic2VTdG9yYWdlUHJvbWlzZSAhPT0gdHJ1ZSkge1xuICAgIGF3YWl0IGZpcmVic2VTdG9yYWdlUHJvbWlzZTtcbiAgICBmaXJlYnNlU3RvcmFnZVByb21pc2UgPSB0cnVlO1xuICB9XG4gIHJldHVybiBmaXJlYmFzZTtcbn07XG5cbmludGVyZmFjZSBGaXJlYmFzZVN0b3JlZFNjZW5lIHtcbiAgc2NlbmVWZXJzaW9uOiBudW1iZXI7XG4gIGl2OiBmaXJlYmFzZS5kZWZhdWx0LmZpcmVzdG9yZS5CbG9iO1xuICBjaXBoZXJ0ZXh0OiBmaXJlYmFzZS5kZWZhdWx0LmZpcmVzdG9yZS5CbG9iO1xufVxuXG5jb25zdCBlbmNyeXB0RWxlbWVudHMgPSBhc3luYyAoXG4gIGtleTogc3RyaW5nLFxuICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbik6IFByb21pc2U8eyBjaXBoZXJ0ZXh0OiBBcnJheUJ1ZmZlcjsgaXY6IFVpbnQ4QXJyYXkgfT4gPT4ge1xuICBjb25zdCBpbXBvcnRlZEtleSA9IGF3YWl0IGdldEltcG9ydGVkS2V5KGtleSwgXCJlbmNyeXB0XCIpO1xuICBjb25zdCBpdiA9IGNyZWF0ZUlWKCk7XG4gIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShlbGVtZW50cyk7XG4gIGNvbnN0IGVuY29kZWQgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoanNvbik7XG4gIGNvbnN0IGNpcGhlcnRleHQgPSBhd2FpdCB3aW5kb3cuY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgIHtcbiAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgaXYsXG4gICAgfSxcbiAgICBpbXBvcnRlZEtleSxcbiAgICBlbmNvZGVkLFxuICApO1xuXG4gIHJldHVybiB7IGNpcGhlcnRleHQsIGl2IH07XG59O1xuXG5jb25zdCBkZWNyeXB0RWxlbWVudHMgPSBhc3luYyAoXG4gIGtleTogc3RyaW5nLFxuICBpdjogVWludDhBcnJheSxcbiAgY2lwaGVydGV4dDogQXJyYXlCdWZmZXIsXG4pOiBQcm9taXNlPHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10+ID0+IHtcbiAgY29uc3QgaW1wb3J0ZWRLZXkgPSBhd2FpdCBnZXRJbXBvcnRlZEtleShrZXksIFwiZGVjcnlwdFwiKTtcbiAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgd2luZG93LmNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICB7XG4gICAgICBuYW1lOiBcIkFFUy1HQ01cIixcbiAgICAgIGl2LFxuICAgIH0sXG4gICAgaW1wb3J0ZWRLZXksXG4gICAgY2lwaGVydGV4dCxcbiAgKTtcblxuICBjb25zdCBkZWNvZGVkRGF0YSA9IG5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpLmRlY29kZShcbiAgICBuZXcgVWludDhBcnJheShkZWNyeXB0ZWQpIGFzIGFueSxcbiAgKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZERhdGEpO1xufTtcblxuY29uc3QgZmlyZWJhc2VTY2VuZVZlcnNpb25DYWNoZSA9IG5ldyBXZWFrTWFwPFNvY2tldElPQ2xpZW50LlNvY2tldCwgbnVtYmVyPigpO1xuXG5leHBvcnQgY29uc3QgaXNTYXZlZFRvRmlyZWJhc2UgPSAoXG4gIHBvcnRhbDogUG9ydGFsLFxuICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAocG9ydGFsLnNvY2tldCAmJiBwb3J0YWwucm9vbUlkICYmIHBvcnRhbC5yb29tS2V5KSB7XG4gICAgY29uc3Qgc2NlbmVWZXJzaW9uID0gZ2V0U2NlbmVWZXJzaW9uKGVsZW1lbnRzKTtcblxuICAgIHJldHVybiBmaXJlYmFzZVNjZW5lVmVyc2lvbkNhY2hlLmdldChwb3J0YWwuc29ja2V0KSA9PT0gc2NlbmVWZXJzaW9uO1xuICB9XG4gIC8vIGlmIG5vIHJvb20gZXhpc3RzLCBjb25zaWRlciB0aGUgcm9vbSBzYXZlZCBzbyB0aGF0IHdlIGRvbid0IHVubmVjZXNzYXJpbHlcbiAgLy8gcHJldmVudCB1bmxvYWQgKHRoZXJlJ3Mgbm90aGluZyB3ZSBjb3VsZCBkbyBhdCB0aGF0IHBvaW50IGFueXdheSlcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3Qgc2F2ZUZpbGVzVG9GaXJlYmFzZSA9IGFzeW5jICh7XG4gIHByZWZpeCxcbiAgZGVjcnlwdGlvbktleSxcbiAgZmlsZXMsXG4gIGFsbG93ZWRUeXBlcyxcbiAgbWF4Qnl0ZXMsXG59OiB7XG4gIHByZWZpeDogc3RyaW5nO1xuICBkZWNyeXB0aW9uS2V5OiBzdHJpbmc7XG4gIGZpbGVzOiBNYXA8SW1hZ2VJZCwgRGF0YVVSTD47XG4gIGFsbG93ZWRUeXBlczogc3RyaW5nW107XG4gIG1heEJ5dGVzOiBudW1iZXI7XG59KSA9PiB7XG4gIGNvbnN0IGZpcmViYXNlID0gYXdhaXQgbG9hZEZpcmViYXNlU3RvcmFnZSgpO1xuICBjb25zdCBmaWxlc1RvVXBsb2FkID0gWy4uLmZpbGVzXS5tYXAoKFtpZCwgZGF0YVVSTF0pID0+IHtcbiAgICBjb25zdCBibG9iID0gZGF0YVVSTFRvQmxvYihkYXRhVVJMKTtcblxuICAgIGlmICghYWxsb3dlZFR5cGVzLmluY2x1ZGVzKGJsb2IudHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRpc2FsbG93ZWQgZmlsZSB0eXBlLlwiKTtcbiAgICB9XG5cbiAgICBpZiAoYmxvYi5zaXplID4gbWF4Qnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gJHttYXhCeXRlcyAvIDEwMjR9IGtCLmApO1xuICAgIH1cblxuICAgIHJldHVybiB7IGJsb2IsIGlkIH07XG4gIH0pO1xuXG4gIGNvbnN0IGVycm9yZWRGaWxlcyA9IG5ldyBNYXA8SW1hZ2VJZCwgdHJ1ZT4oKTtcbiAgY29uc3Qgc2F2ZWRGaWxlcyA9IG5ldyBNYXA8SW1hZ2VJZCwgdHJ1ZT4oKTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBmaWxlc1RvVXBsb2FkLm1hcChhc3luYyAoeyBibG9iLCBpZCB9KSA9PiB7XG4gICAgICBjb25zdCBlbmNyeXB0ZWREYXRhID0gYXdhaXQgZW5jcnlwdERhdGEoZGVjcnlwdGlvbktleSwgYmxvYik7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmaXJlYmFzZVxuICAgICAgICAgIC5zdG9yYWdlKClcbiAgICAgICAgICAucmVmKGAke3ByZWZpeH0vJHtpZH1gKVxuICAgICAgICAgIC5wdXQoXG4gICAgICAgICAgICBuZXcgQmxvYihbZW5jcnlwdGVkRGF0YS5pdiwgZW5jcnlwdGVkRGF0YS5ibG9iXSwge1xuICAgICAgICAgICAgICB0eXBlOiBibG9iLnR5cGUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2FjaGVDb250cm9sOiBgcHVibGljLCBtYXgtYWdlPSR7RklMRV9DQUNIRV9NQVhfQUdFX1NFQ31gLFxuICAgICAgICAgICAgICBjdXN0b21NZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgICAgICAgICAgICBmaWxlbmFtZTogaWQsXG4gICAgICAgICAgICAgICAgICB0eXBlOiBibG9iLnR5cGUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY3JlYXRlZDogRGF0ZS5ub3coKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICBzYXZlZEZpbGVzLnNldChpZCwgdHJ1ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlcnJvcmVkRmlsZXMuc2V0KGlkLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgKTtcblxuICByZXR1cm4geyBzYXZlZEZpbGVzLCBlcnJvcmVkRmlsZXMgfTtcbn07XG5cbmNvbnN0IGRlY3J5cHREYXRhID0gYXN5bmMgKFxuICBpdjogQXJyYXlCdWZmZXIsXG4gIGVuY3J5cHRlZDogQXJyYXlCdWZmZXIsXG4gIHByaXZhdGVLZXk6IHN0cmluZyxcbik6IFByb21pc2U8QXJyYXlCdWZmZXI+ID0+IHtcbiAgY29uc3Qga2V5ID0gYXdhaXQgZ2V0SW1wb3J0ZWRLZXkocHJpdmF0ZUtleSwgXCJkZWNyeXB0XCIpO1xuICByZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICB7XG4gICAgICBuYW1lOiBcIkFFUy1HQ01cIixcbiAgICAgIGl2LFxuICAgIH0sXG4gICAga2V5LFxuICAgIGVuY3J5cHRlZCxcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzYXZlVG9GaXJlYmFzZSA9IGFzeW5jIChcbiAgcG9ydGFsOiBQb3J0YWwsXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuKSA9PiB7XG4gIGNvbnN0IHsgcm9vbUlkLCByb29tS2V5LCBzb2NrZXQgfSA9IHBvcnRhbDtcbiAgaWYgKFxuICAgIC8vIGlmIG5vIHJvb20gZXhpc3RzLCBjb25zaWRlciB0aGUgcm9vbSBzYXZlZCBiZWNhdXNlIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW5cbiAgICAvLyBkbyBhdCB0aGlzIHBvaW50XG4gICAgIXJvb21JZCB8fFxuICAgICFyb29tS2V5IHx8XG4gICAgIXNvY2tldCB8fFxuICAgIGlzU2F2ZWRUb0ZpcmViYXNlKHBvcnRhbCwgZWxlbWVudHMpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgZmlyZWJhc2UgPSBhd2FpdCBsb2FkRmlyZXN0b3JlKCk7XG4gIGNvbnN0IHNjZW5lVmVyc2lvbiA9IGdldFNjZW5lVmVyc2lvbihlbGVtZW50cyk7XG4gIGNvbnN0IHsgY2lwaGVydGV4dCwgaXYgfSA9IGF3YWl0IGVuY3J5cHRFbGVtZW50cyhyb29tS2V5LCBlbGVtZW50cyk7XG5cbiAgY29uc3QgbmV4dERvY0RhdGEgPSB7XG4gICAgc2NlbmVWZXJzaW9uLFxuICAgIGNpcGhlcnRleHQ6IGZpcmViYXNlLmZpcmVzdG9yZS5CbG9iLmZyb21VaW50OEFycmF5KFxuICAgICAgbmV3IFVpbnQ4QXJyYXkoY2lwaGVydGV4dCksXG4gICAgKSxcbiAgICBpdjogZmlyZWJhc2UuZmlyZXN0b3JlLkJsb2IuZnJvbVVpbnQ4QXJyYXkoaXYpLFxuICB9IGFzIEZpcmViYXNlU3RvcmVkU2NlbmU7XG5cbiAgY29uc3QgZGIgPSBmaXJlYmFzZS5maXJlc3RvcmUoKTtcbiAgY29uc3QgZG9jUmVmID0gZGIuY29sbGVjdGlvbihcInNjZW5lc1wiKS5kb2Mocm9vbUlkKTtcbiAgY29uc3QgZGlkVXBkYXRlID0gYXdhaXQgZGIucnVuVHJhbnNhY3Rpb24oYXN5bmMgKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgY29uc3QgZG9jID0gYXdhaXQgdHJhbnNhY3Rpb24uZ2V0KGRvY1JlZik7XG4gICAgaWYgKCFkb2MuZXhpc3RzKSB7XG4gICAgICB0cmFuc2FjdGlvbi5zZXQoZG9jUmVmLCBuZXh0RG9jRGF0YSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2RG9jRGF0YSA9IGRvYy5kYXRhKCkgYXMgRmlyZWJhc2VTdG9yZWRTY2VuZTtcbiAgICBpZiAocHJldkRvY0RhdGEuc2NlbmVWZXJzaW9uID49IG5leHREb2NEYXRhLnNjZW5lVmVyc2lvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyYW5zYWN0aW9uLnVwZGF0ZShkb2NSZWYsIG5leHREb2NEYXRhKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgaWYgKGRpZFVwZGF0ZSkge1xuICAgIGZpcmViYXNlU2NlbmVWZXJzaW9uQ2FjaGUuc2V0KHNvY2tldCwgc2NlbmVWZXJzaW9uKTtcbiAgfVxuXG4gIHJldHVybiBkaWRVcGRhdGU7XG59O1xuXG5leHBvcnQgY29uc3QgbG9hZEZyb21GaXJlYmFzZSA9IGFzeW5jIChcbiAgcm9vbUlkOiBzdHJpbmcsXG4gIHJvb21LZXk6IHN0cmluZyxcbiAgc29ja2V0OiBTb2NrZXRJT0NsaWVudC5Tb2NrZXQgfCBudWxsLFxuKTogUHJvbWlzZTxyZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdIHwgbnVsbD4gPT4ge1xuICBjb25zdCBmaXJlYmFzZSA9IGF3YWl0IGxvYWRGaXJlc3RvcmUoKTtcbiAgY29uc3QgZGIgPSBmaXJlYmFzZS5maXJlc3RvcmUoKTtcblxuICBjb25zdCBkb2NSZWYgPSBkYi5jb2xsZWN0aW9uKFwic2NlbmVzXCIpLmRvYyhyb29tSWQpO1xuICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gIGlmICghZG9jLmV4aXN0cykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHN0b3JlZFNjZW5lID0gZG9jLmRhdGEoKSBhcyBGaXJlYmFzZVN0b3JlZFNjZW5lO1xuICBjb25zdCBjaXBoZXJ0ZXh0ID0gc3RvcmVkU2NlbmUuY2lwaGVydGV4dC50b1VpbnQ4QXJyYXkoKTtcbiAgY29uc3QgaXYgPSBzdG9yZWRTY2VuZS5pdi50b1VpbnQ4QXJyYXkoKTtcblxuICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IGRlY3J5cHRFbGVtZW50cyhyb29tS2V5LCBpdiwgY2lwaGVydGV4dCk7XG5cbiAgaWYgKHNvY2tldCkge1xuICAgIGZpcmViYXNlU2NlbmVWZXJzaW9uQ2FjaGUuc2V0KHNvY2tldCwgZ2V0U2NlbmVWZXJzaW9uKGVsZW1lbnRzKSk7XG4gIH1cblxuICByZXR1cm4gcmVzdG9yZUVsZW1lbnRzKGVsZW1lbnRzLCBudWxsKTtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2FkRmlsZXNGcm9tRmlyZWJhc2UgPSBhc3luYyAoXG4gIHByZWZpeDogc3RyaW5nLFxuICBkZWNyeXB0aW9uS2V5OiBzdHJpbmcsXG4gIGZpbGVzSWRzOiByZWFkb25seSBJbWFnZUlkW10sXG4pOiBQcm9taXNlPHtcbiAgbG9hZGVkRmlsZXM6IEJpbmFyeUZpbGVEYXRhW107XG4gIGVycm9yZWRGaWxlczogSW1hZ2VJZFtdO1xufT4gPT4ge1xuICBjb25zdCBsb2FkZWRGaWxlczogQmluYXJ5RmlsZURhdGFbXSA9IFtdO1xuICBjb25zdCBlcnJvcmVkRmlsZXM6IEltYWdlSWRbXSA9IFtdO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIFsuLi5uZXcgU2V0KGZpbGVzSWRzKV0ubWFwKGFzeW5jIChpZCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vZmlyZWJhc2VzdG9yYWdlLmdvb2dsZWFwaXMuY29tL3YwL2IvJHtcbiAgICAgICAgICBGSVJFQkFTRV9DT05GSUcuc3RvcmFnZUJ1Y2tldFxuICAgICAgICB9L28vJHtlbmNvZGVVUklDb21wb25lbnQocHJlZml4LnJlcGxhY2UoL15cXC8vLCBcIlwiKSl9JTJGJHtpZH1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3VybH0/YWx0PW1lZGlhYCk7XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9XG4gICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSB8fCBcImltYWdlL3BuZ1wiO1xuICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcblxuICAgICAgICAgIGNvbnN0IEtFWV9MRU5HVEggPSAxMjtcblxuICAgICAgICAgIGNvbnN0IGl2ID0gYXJyYXlCdWZmZXIuc2xpY2UoMCwgS0VZX0xFTkdUSCk7XG4gICAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gYXJyYXlCdWZmZXIuc2xpY2UoXG4gICAgICAgICAgICBLRVlfTEVOR1RILFxuICAgICAgICAgICAgYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgZGVjcnlwdERhdGEoaXYsIGVuY3J5cHRlZCwgZGVjcnlwdGlvbktleSk7XG5cbiAgICAgICAgICBjb25zdCBkYXRhVVJMID0gYXdhaXQgYXJyYXlCdWZmZXJUb0RhdGFVUkwoZGVjcnlwdGVkLCBjb250ZW50VHlwZSk7XG5cbiAgICAgICAgICBsb2FkZWRGaWxlcy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IGNvbnRlbnRUeXBlLmluY2x1ZGVzKFwiaW1hZ2UvXCIpID8gXCJpbWFnZVwiIDogXCJvdGhlclwiLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBkYXRhVVJMLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlcnJvcmVkRmlsZXMucHVzaChpZCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pLFxuICApO1xuXG4gIHJldHVybiB7IGxvYWRlZEZpbGVzLCBlcnJvcmVkRmlsZXMgfTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../excalidraw-app/data/firebase.ts\n");
|
|
2591
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"loadFirebaseStorage\": () => (/* binding */ loadFirebaseStorage),\n/* harmony export */ \"isSavedToFirebase\": () => (/* binding */ isSavedToFirebase),\n/* harmony export */ \"saveFilesToFirebase\": () => (/* binding */ saveFilesToFirebase),\n/* harmony export */ \"saveToFirebase\": () => (/* binding */ saveToFirebase),\n/* harmony export */ \"loadFromFirebase\": () => (/* binding */ loadFromFirebase),\n/* harmony export */ \"loadFilesFromFirebase\": () => (/* binding */ loadFilesFromFirebase)\n/* harmony export */ });\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ \"../../excalidraw-app/data/index.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../element */ \"../../element/index.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../data/restore */ \"../../data/restore.ts\");\n/* harmony import */ var _app_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../app_constants */ \"../../excalidraw-app/app_constants.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 _a;\r\n\r\n\r\n\r\n\r\n\r\n// private\r\n// -----------------------------------------------------------------------------\r\nconst FIREBASE_CONFIG = JSON.parse((_a = process.env.REACT_APP_FIREBASE_CONFIG) !== null && _a !== void 0 ? _a : \"{}\");\r\nlet firebasePromise = null;\r\nlet firestorePromise = null;\r\nlet firebseStoragePromise = null;\r\nlet isFirebaseInitialized = false;\r\nconst _loadFirebase = () => __awaiter(void 0, void 0, void 0, function* () {\r\n const firebase = (yield __webpack_require__.e(/*! import() | firebase */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! firebase/app */ \"../../../node_modules/firebase/app/dist/index.esm.js\"))).default;\r\n // due to dev HMR\r\n if (!isFirebaseInitialized) {\r\n isFirebaseInitialized = true;\r\n try {\r\n firebase.initializeApp(FIREBASE_CONFIG);\r\n }\r\n catch (error) {\r\n console.warn(error.name, error.code);\r\n }\r\n }\r\n return firebase;\r\n});\r\nconst _getFirebase = () => __awaiter(void 0, void 0, void 0, function* () {\r\n if (!firebasePromise) {\r\n firebasePromise = _loadFirebase();\r\n }\r\n return firebasePromise;\r\n});\r\n// -----------------------------------------------------------------------------\r\nconst loadFirestore = () => __awaiter(void 0, void 0, void 0, function* () {\r\n const firebase = yield _getFirebase();\r\n if (!firestorePromise) {\r\n firestorePromise = __webpack_require__.e(/*! import() | firestore */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! firebase/firestore */ \"../../../node_modules/firebase/firestore/dist/index.esm.js\"));\r\n }\r\n if (firestorePromise !== true) {\r\n yield firestorePromise;\r\n firestorePromise = true;\r\n }\r\n return firebase;\r\n});\r\nconst loadFirebaseStorage = () => __awaiter(void 0, void 0, void 0, function* () {\r\n const firebase = yield _getFirebase();\r\n if (!firebseStoragePromise) {\r\n firebseStoragePromise = __webpack_require__.e(/*! import() | storage */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! firebase/storage */ \"../../../node_modules/firebase/storage/dist/index.esm.js\"));\r\n }\r\n if (firebseStoragePromise !== true) {\r\n yield firebseStoragePromise;\r\n firebseStoragePromise = true;\r\n }\r\n return firebase;\r\n});\r\nconst encryptElements = (key, elements) => __awaiter(void 0, void 0, void 0, function* () {\r\n const importedKey = yield (0,_data__WEBPACK_IMPORTED_MODULE_0__.getImportedKey)(key, \"encrypt\");\r\n const iv = (0,_data__WEBPACK_IMPORTED_MODULE_0__.createIV)();\r\n const json = JSON.stringify(elements);\r\n const encoded = new TextEncoder().encode(json);\r\n const ciphertext = yield window.crypto.subtle.encrypt({\r\n name: \"AES-GCM\",\r\n iv,\r\n }, importedKey, encoded);\r\n return { ciphertext, iv };\r\n});\r\nconst decryptElements = (key, iv, ciphertext) => __awaiter(void 0, void 0, void 0, function* () {\r\n const importedKey = yield (0,_data__WEBPACK_IMPORTED_MODULE_0__.getImportedKey)(key, \"decrypt\");\r\n const decrypted = yield window.crypto.subtle.decrypt({\r\n name: \"AES-GCM\",\r\n iv,\r\n }, importedKey, ciphertext);\r\n const decodedData = new TextDecoder(\"utf-8\").decode(new Uint8Array(decrypted));\r\n return JSON.parse(decodedData);\r\n});\r\nconst firebaseSceneVersionCache = new WeakMap();\r\nconst isSavedToFirebase = (portal, elements) => {\r\n if (portal.socket && portal.roomId && portal.roomKey) {\r\n const sceneVersion = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getSceneVersion)(elements);\r\n return firebaseSceneVersionCache.get(portal.socket) === sceneVersion;\r\n }\r\n // if no room exists, consider the room saved so that we don't unnecessarily\r\n // prevent unload (there's nothing we could do at that point anyway)\r\n return true;\r\n};\r\nconst saveFilesToFirebase = ({ prefix, decryptionKey, files, allowedTypes, maxBytes, }) => __awaiter(void 0, void 0, void 0, function* () {\r\n const firebase = yield loadFirebaseStorage();\r\n const filesToUpload = [...files].map(([id, dataURL]) => {\r\n const blob = (0,_data__WEBPACK_IMPORTED_MODULE_0__.dataURLToBlob)(dataURL);\r\n if (!allowedTypes.includes(blob.type)) {\r\n throw new Error(\"Disallowed file type.\");\r\n }\r\n if (blob.size > maxBytes) {\r\n throw new Error(`File cannot be larger than ${maxBytes / 1024} kB.`);\r\n }\r\n return { blob, id };\r\n });\r\n const erroredFiles = new Map();\r\n const savedFiles = new Map();\r\n yield Promise.all(filesToUpload.map(({ blob, id }) => __awaiter(void 0, void 0, void 0, function* () {\r\n const encryptedData = yield (0,_data__WEBPACK_IMPORTED_MODULE_0__.encryptData)(decryptionKey, blob);\r\n try {\r\n yield firebase\r\n .storage()\r\n .ref(`${prefix}/${id}`)\r\n .put(new Blob([encryptedData.iv, encryptedData.blob], {\r\n type: blob.type,\r\n }), {\r\n cacheControl: `public, max-age=${_app_constants__WEBPACK_IMPORTED_MODULE_3__.FILE_CACHE_MAX_AGE_SEC}`,\r\n customMetadata: {\r\n data: JSON.stringify({\r\n version: 1,\r\n filename: id,\r\n type: blob.type,\r\n }),\r\n created: Date.now().toString(),\r\n },\r\n });\r\n savedFiles.set(id, true);\r\n }\r\n catch (error) {\r\n erroredFiles.set(id, true);\r\n }\r\n })));\r\n return { savedFiles, erroredFiles };\r\n});\r\nconst decryptData = (iv, encrypted, privateKey) => __awaiter(void 0, void 0, void 0, function* () {\r\n const key = yield (0,_data__WEBPACK_IMPORTED_MODULE_0__.getImportedKey)(privateKey, \"decrypt\");\r\n return window.crypto.subtle.decrypt({\r\n name: \"AES-GCM\",\r\n iv,\r\n }, key, encrypted);\r\n});\r\nconst saveToFirebase = (portal, elements) => __awaiter(void 0, void 0, void 0, function* () {\r\n const { roomId, roomKey, socket } = portal;\r\n if (\r\n // if no room exists, consider the room saved because there's nothing we can\r\n // do at this point\r\n !roomId ||\r\n !roomKey ||\r\n !socket ||\r\n isSavedToFirebase(portal, elements)) {\r\n return true;\r\n }\r\n const firebase = yield loadFirestore();\r\n const sceneVersion = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getSceneVersion)(elements);\r\n const { ciphertext, iv } = yield encryptElements(roomKey, elements);\r\n const nextDocData = {\r\n sceneVersion,\r\n ciphertext: firebase.firestore.Blob.fromUint8Array(new Uint8Array(ciphertext)),\r\n iv: firebase.firestore.Blob.fromUint8Array(iv),\r\n };\r\n const db = firebase.firestore();\r\n const docRef = db.collection(\"scenes\").doc(roomId);\r\n const didUpdate = yield db.runTransaction((transaction) => __awaiter(void 0, void 0, void 0, function* () {\r\n const doc = yield transaction.get(docRef);\r\n if (!doc.exists) {\r\n transaction.set(docRef, nextDocData);\r\n return true;\r\n }\r\n const prevDocData = doc.data();\r\n if (prevDocData.sceneVersion >= nextDocData.sceneVersion) {\r\n return false;\r\n }\r\n transaction.update(docRef, nextDocData);\r\n return true;\r\n }));\r\n if (didUpdate) {\r\n firebaseSceneVersionCache.set(socket, sceneVersion);\r\n }\r\n return didUpdate;\r\n});\r\nconst loadFromFirebase = (roomId, roomKey, socket) => __awaiter(void 0, void 0, void 0, function* () {\r\n const firebase = yield loadFirestore();\r\n const db = firebase.firestore();\r\n const docRef = db.collection(\"scenes\").doc(roomId);\r\n const doc = yield docRef.get();\r\n if (!doc.exists) {\r\n return null;\r\n }\r\n const storedScene = doc.data();\r\n const ciphertext = storedScene.ciphertext.toUint8Array();\r\n const iv = storedScene.iv.toUint8Array();\r\n const elements = yield decryptElements(roomKey, iv, ciphertext);\r\n if (socket) {\r\n firebaseSceneVersionCache.set(socket, (0,_element__WEBPACK_IMPORTED_MODULE_1__.getSceneVersion)(elements));\r\n }\r\n return (0,_data_restore__WEBPACK_IMPORTED_MODULE_2__.restoreElements)(elements, null);\r\n});\r\nconst loadFilesFromFirebase = (prefix, decryptionKey, filesIds) => __awaiter(void 0, void 0, void 0, function* () {\r\n const loadedFiles = [];\r\n const erroredFiles = [];\r\n yield Promise.all([...new Set(filesIds)].map((id) => __awaiter(void 0, void 0, void 0, function* () {\r\n try {\r\n const url = `https://firebasestorage.googleapis.com/v0/b/${FIREBASE_CONFIG.storageBucket}/o/${encodeURIComponent(prefix.replace(/^\\//, \"\"))}%2F${id}`;\r\n const response = yield fetch(`${url}?alt=media`);\r\n if (response.status < 400) {\r\n const contentType = response.headers.get(\"content-type\") || \"image/png\";\r\n const arrayBuffer = yield response.arrayBuffer();\r\n const KEY_LENGTH = 12;\r\n const iv = arrayBuffer.slice(0, KEY_LENGTH);\r\n const encrypted = arrayBuffer.slice(KEY_LENGTH, arrayBuffer.byteLength);\r\n const decrypted = yield decryptData(iv, encrypted, decryptionKey);\r\n const dataURL = yield (0,_data__WEBPACK_IMPORTED_MODULE_0__.arrayBufferToDataURL)(decrypted, contentType);\r\n loadedFiles.push({\r\n type: contentType.includes(\"image/\") ? \"image\" : \"other\",\r\n id,\r\n dataURL,\r\n });\r\n }\r\n }\r\n catch (error) {\r\n erroredFiles.push(id);\r\n console.error(error);\r\n }\r\n })));\r\n return { loadedFiles, erroredFiles };\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZXhjYWxpZHJhdy1hcHAvZGF0YS9maXJlYmFzZS50cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtpQjtBQUNrQjtBQUVhO0FBRUs7QUFFSztBQUUxRCxVQUFVO0FBQ1YsZ0ZBQWdGO0FBRWhGLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsbUNBQUUsSUFBSSxDQUFDLENBQUM7QUFFaEYsSUFBSSxlQUFlLEdBRVIsSUFBSSxDQUFDO0FBQ2hCLElBQUksZ0JBQWdCLEdBQStCLElBQUksQ0FBQztBQUN4RCxJQUFJLHFCQUFxQixHQUErQixJQUFJLENBQUM7QUFFN0QsSUFBSSxxQkFBcUIsR0FBRyxLQUFLLENBQUM7QUFFbEMsTUFBTSxhQUFhLEdBQUcsR0FBUyxFQUFFO0lBQy9CLE1BQU0sUUFBUSxHQUFHLENBQ2YsTUFBTSwwTEFBeUQsQ0FDaEUsQ0FBQyxPQUFPLENBQUM7SUFFVixpQkFBaUI7SUFDakIsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1FBQzFCLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJO1lBQ0YsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUN6QztRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0QztLQUNGO0lBRUQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyxFQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUcsR0FFbkIsRUFBRTtJQUNGLElBQUksQ0FBQyxlQUFlLEVBQUU7UUFDcEIsZUFBZSxHQUFHLGFBQWEsRUFBRSxDQUFDO0tBQ25DO0lBQ0QsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQyxFQUFDO0FBRUYsZ0ZBQWdGO0FBRWhGLE1BQU0sYUFBYSxHQUFHLEdBQVMsRUFBRTtJQUMvQixN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LEVBQUUsRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBRWxFLE1BQU0sT0FBTyxHQUFHLE1BQU0sMkRBQW9CLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUVuRSxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUNmLElBQUksRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU87b0JBQ3hELEVBQUU7b0JBQ0YsT0FBTztpQkFDUixDQUFDLENBQUM7YUFDSjtTQUNGO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdEI7SUFDSCxDQUFDLEVBQUMsQ0FDSCxDQUFDO0lBRUYsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsQ0FBQztBQUN2QyxDQUFDLEVBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZXhjYWxpZHJhdy1hcHAvZGF0YS9maXJlYmFzZS50cz85MTNmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFycmF5QnVmZmVyVG9EYXRhVVJMLFxuICBkYXRhVVJMVG9CbG9iLFxuICBlbmNyeXB0RGF0YSxcbiAgZ2V0SW1wb3J0ZWRLZXksXG59IGZyb20gXCIuLi9kYXRhXCI7XG5pbXBvcnQgeyBjcmVhdGVJViB9IGZyb20gXCIuL2luZGV4XCI7XG5pbXBvcnQgeyBFeGNhbGlkcmF3RWxlbWVudCwgSW1hZ2VJZCB9IGZyb20gXCIuLi8uLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRTY2VuZVZlcnNpb24gfSBmcm9tIFwiLi4vLi4vZWxlbWVudFwiO1xuaW1wb3J0IFBvcnRhbCBmcm9tIFwiLi4vY29sbGFiL1BvcnRhbFwiO1xuaW1wb3J0IHsgcmVzdG9yZUVsZW1lbnRzIH0gZnJvbSBcIi4uLy4uL2RhdGEvcmVzdG9yZVwiO1xuaW1wb3J0IHsgQmluYXJ5RmlsZURhdGEsIERhdGFVUkwgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IEZJTEVfQ0FDSEVfTUFYX0FHRV9TRUMgfSBmcm9tIFwiLi4vYXBwX2NvbnN0YW50c1wiO1xuXG4vLyBwcml2YXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBGSVJFQkFTRV9DT05GSUcgPSBKU09OLnBhcnNlKHByb2Nlc3MuZW52LlJFQUNUX0FQUF9GSVJFQkFTRV9DT05GSUc/P1wie31cIik7XG5cbmxldCBmaXJlYmFzZVByb21pc2U6IFByb21pc2U8XG4gIHR5cGVvZiBpbXBvcnQoXCJmaXJlYmFzZS9hcHBcIikuZGVmYXVsdFxuPiB8IG51bGwgPSBudWxsO1xubGV0IGZpcmVzdG9yZVByb21pc2U6IFByb21pc2U8YW55PiB8IG51bGwgfCB0cnVlID0gbnVsbDtcbmxldCBmaXJlYnNlU3RvcmFnZVByb21pc2U6IFByb21pc2U8YW55PiB8IG51bGwgfCB0cnVlID0gbnVsbDtcblxubGV0IGlzRmlyZWJhc2VJbml0aWFsaXplZCA9IGZhbHNlO1xuXG5jb25zdCBfbG9hZEZpcmViYXNlID0gYXN5bmMgKCkgPT4ge1xuICBjb25zdCBmaXJlYmFzZSA9IChcbiAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJmaXJlYmFzZVwiICovIFwiZmlyZWJhc2UvYXBwXCIpXG4gICkuZGVmYXVsdDtcblxuICAvLyBkdWUgdG8gZGV2IEhNUlxuICBpZiAoIWlzRmlyZWJhc2VJbml0aWFsaXplZCkge1xuICAgIGlzRmlyZWJhc2VJbml0aWFsaXplZCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGZpcmViYXNlLmluaXRpYWxpemVBcHAoRklSRUJBU0VfQ09ORklHKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGVycm9yLm5hbWUsIGVycm9yLmNvZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaXJlYmFzZTtcbn07XG5cbmNvbnN0IF9nZXRGaXJlYmFzZSA9IGFzeW5jICgpOiBQcm9taXNlPFxuICB0eXBlb2YgaW1wb3J0KFwiZmlyZWJhc2UvYXBwXCIpLmRlZmF1bHRcbj4gPT4ge1xuICBpZiAoIWZpcmViYXNlUHJvbWlzZSkge1xuICAgIGZpcmViYXNlUHJvbWlzZSA9IF9sb2FkRmlyZWJhc2UoKTtcbiAgfVxuICByZXR1cm4gZmlyZWJhc2VQcm9taXNlO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgbG9hZEZpcmVzdG9yZSA9IGFzeW5jICgpID0+IHtcbiAgY29uc3QgZmlyZWJhc2UgPSBhd2FpdCBfZ2V0RmlyZWJhc2UoKTtcbiAgaWYgKCFmaXJlc3RvcmVQcm9taXNlKSB7XG4gICAgZmlyZXN0b3JlUHJvbWlzZSA9IGltcG9ydChcbiAgICAgIC8qIHdlYnBhY2tDaHVua05hbWU6IFwiZmlyZXN0b3JlXCIgKi8gXCJmaXJlYmFzZS9maXJlc3RvcmVcIlxuICAgICk7XG4gIH1cbiAgaWYgKGZpcmVzdG9yZVByb21pc2UgIT09IHRydWUpIHtcbiAgICBhd2FpdCBmaXJlc3RvcmVQcm9taXNlO1xuICAgIGZpcmVzdG9yZVByb21pc2UgPSB0cnVlO1xuICB9XG4gIHJldHVybiBmaXJlYmFzZTtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2FkRmlyZWJhc2VTdG9yYWdlID0gYXN5bmMgKCkgPT4ge1xuICBjb25zdCBmaXJlYmFzZSA9IGF3YWl0IF9nZXRGaXJlYmFzZSgpO1xuICBpZiAoIWZpcmVic2VTdG9yYWdlUHJvbWlzZSkge1xuICAgIGZpcmVic2VTdG9yYWdlUHJvbWlzZSA9IGltcG9ydChcbiAgICAgIC8qIHdlYnBhY2tDaHVua05hbWU6IFwic3RvcmFnZVwiICovIFwiZmlyZWJhc2Uvc3RvcmFnZVwiXG4gICAgKTtcbiAgfVxuICBpZiAoZmlyZWJzZVN0b3JhZ2VQcm9taXNlICE9PSB0cnVlKSB7XG4gICAgYXdhaXQgZmlyZWJzZVN0b3JhZ2VQcm9taXNlO1xuICAgIGZpcmVic2VTdG9yYWdlUHJvbWlzZSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGZpcmViYXNlO1xufTtcblxuaW50ZXJmYWNlIEZpcmViYXNlU3RvcmVkU2NlbmUge1xuICBzY2VuZVZlcnNpb246IG51bWJlcjtcbiAgaXY6IGZpcmViYXNlLmRlZmF1bHQuZmlyZXN0b3JlLkJsb2I7XG4gIGNpcGhlcnRleHQ6IGZpcmViYXNlLmRlZmF1bHQuZmlyZXN0b3JlLkJsb2I7XG59XG5cbmNvbnN0IGVuY3J5cHRFbGVtZW50cyA9IGFzeW5jIChcbiAga2V5OiBzdHJpbmcsXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuKTogUHJvbWlzZTx7IGNpcGhlcnRleHQ6IEFycmF5QnVmZmVyOyBpdjogVWludDhBcnJheSB9PiA9PiB7XG4gIGNvbnN0IGltcG9ydGVkS2V5ID0gYXdhaXQgZ2V0SW1wb3J0ZWRLZXkoa2V5LCBcImVuY3J5cHRcIik7XG4gIGNvbnN0IGl2ID0gY3JlYXRlSVYoKTtcbiAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGVsZW1lbnRzKTtcbiAgY29uc3QgZW5jb2RlZCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShqc29uKTtcbiAgY29uc3QgY2lwaGVydGV4dCA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAge1xuICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXG4gICAgICBpdixcbiAgICB9LFxuICAgIGltcG9ydGVkS2V5LFxuICAgIGVuY29kZWQsXG4gICk7XG5cbiAgcmV0dXJuIHsgY2lwaGVydGV4dCwgaXYgfTtcbn07XG5cbmNvbnN0IGRlY3J5cHRFbGVtZW50cyA9IGFzeW5jIChcbiAga2V5OiBzdHJpbmcsXG4gIGl2OiBVaW50OEFycmF5LFxuICBjaXBoZXJ0ZXh0OiBBcnJheUJ1ZmZlcixcbik6IFByb21pc2U8cmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXT4gPT4ge1xuICBjb25zdCBpbXBvcnRlZEtleSA9IGF3YWl0IGdldEltcG9ydGVkS2V5KGtleSwgXCJkZWNyeXB0XCIpO1xuICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCB3aW5kb3cuY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgIHtcbiAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgaXYsXG4gICAgfSxcbiAgICBpbXBvcnRlZEtleSxcbiAgICBjaXBoZXJ0ZXh0LFxuICApO1xuXG4gIGNvbnN0IGRlY29kZWREYXRhID0gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIikuZGVjb2RlKFxuICAgIG5ldyBVaW50OEFycmF5KGRlY3J5cHRlZCkgYXMgYW55LFxuICApO1xuICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVkRGF0YSk7XG59O1xuXG5jb25zdCBmaXJlYmFzZVNjZW5lVmVyc2lvbkNhY2hlID0gbmV3IFdlYWtNYXA8U29ja2V0SU9DbGllbnQuU29ja2V0LCBudW1iZXI+KCk7XG5cbmV4cG9ydCBjb25zdCBpc1NhdmVkVG9GaXJlYmFzZSA9IChcbiAgcG9ydGFsOiBQb3J0YWwsXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuKTogYm9vbGVhbiA9PiB7XG4gIGlmIChwb3J0YWwuc29ja2V0ICYmIHBvcnRhbC5yb29tSWQgJiYgcG9ydGFsLnJvb21LZXkpIHtcbiAgICBjb25zdCBzY2VuZVZlcnNpb24gPSBnZXRTY2VuZVZlcnNpb24oZWxlbWVudHMpO1xuXG4gICAgcmV0dXJuIGZpcmViYXNlU2NlbmVWZXJzaW9uQ2FjaGUuZ2V0KHBvcnRhbC5zb2NrZXQpID09PSBzY2VuZVZlcnNpb247XG4gIH1cbiAgLy8gaWYgbm8gcm9vbSBleGlzdHMsIGNvbnNpZGVyIHRoZSByb29tIHNhdmVkIHNvIHRoYXQgd2UgZG9uJ3QgdW5uZWNlc3NhcmlseVxuICAvLyBwcmV2ZW50IHVubG9hZCAodGhlcmUncyBub3RoaW5nIHdlIGNvdWxkIGRvIGF0IHRoYXQgcG9pbnQgYW55d2F5KVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBzYXZlRmlsZXNUb0ZpcmViYXNlID0gYXN5bmMgKHtcbiAgcHJlZml4LFxuICBkZWNyeXB0aW9uS2V5LFxuICBmaWxlcyxcbiAgYWxsb3dlZFR5cGVzLFxuICBtYXhCeXRlcyxcbn06IHtcbiAgcHJlZml4OiBzdHJpbmc7XG4gIGRlY3J5cHRpb25LZXk6IHN0cmluZztcbiAgZmlsZXM6IE1hcDxJbWFnZUlkLCBEYXRhVVJMPjtcbiAgYWxsb3dlZFR5cGVzOiBzdHJpbmdbXTtcbiAgbWF4Qnl0ZXM6IG51bWJlcjtcbn0pID0+IHtcbiAgY29uc3QgZmlyZWJhc2UgPSBhd2FpdCBsb2FkRmlyZWJhc2VTdG9yYWdlKCk7XG4gIGNvbnN0IGZpbGVzVG9VcGxvYWQgPSBbLi4uZmlsZXNdLm1hcCgoW2lkLCBkYXRhVVJMXSkgPT4ge1xuICAgIGNvbnN0IGJsb2IgPSBkYXRhVVJMVG9CbG9iKGRhdGFVUkwpO1xuXG4gICAgaWYgKCFhbGxvd2VkVHlwZXMuaW5jbHVkZXMoYmxvYi50eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlzYWxsb3dlZCBmaWxlIHR5cGUuXCIpO1xuICAgIH1cblxuICAgIGlmIChibG9iLnNpemUgPiBtYXhCeXRlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiAke21heEJ5dGVzIC8gMTAyNH0ga0IuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYmxvYiwgaWQgfTtcbiAgfSk7XG5cbiAgY29uc3QgZXJyb3JlZEZpbGVzID0gbmV3IE1hcDxJbWFnZUlkLCB0cnVlPigpO1xuICBjb25zdCBzYXZlZEZpbGVzID0gbmV3IE1hcDxJbWFnZUlkLCB0cnVlPigpO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVzVG9VcGxvYWQubWFwKGFzeW5jICh7IGJsb2IsIGlkIH0pID0+IHtcbiAgICAgIGNvbnN0IGVuY3J5cHRlZERhdGEgPSBhd2FpdCBlbmNyeXB0RGF0YShkZWNyeXB0aW9uS2V5LCBibG9iKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZpcmViYXNlXG4gICAgICAgICAgLnN0b3JhZ2UoKVxuICAgICAgICAgIC5yZWYoYCR7cHJlZml4fS8ke2lkfWApXG4gICAgICAgICAgLnB1dChcbiAgICAgICAgICAgIG5ldyBCbG9iKFtlbmNyeXB0ZWREYXRhLml2LCBlbmNyeXB0ZWREYXRhLmJsb2JdLCB7XG4gICAgICAgICAgICAgIHR5cGU6IGJsb2IudHlwZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjYWNoZUNvbnRyb2w6IGBwdWJsaWMsIG1heC1hZ2U9JHtGSUxFX0NBQ0hFX01BWF9BR0VfU0VDfWAsXG4gICAgICAgICAgICAgIGN1c3RvbU1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBpZCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IGJsb2IudHlwZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkOiBEYXRlLm5vdygpLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgIHNhdmVkRmlsZXMuc2V0KGlkLCB0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGVycm9yZWRGaWxlcy5zZXQoaWQsIHRydWUpO1xuICAgICAgfVxuICAgIH0pLFxuICApO1xuXG4gIHJldHVybiB7IHNhdmVkRmlsZXMsIGVycm9yZWRGaWxlcyB9O1xufTtcblxuY29uc3QgZGVjcnlwdERhdGEgPSBhc3luYyAoXG4gIGl2OiBBcnJheUJ1ZmZlcixcbiAgZW5jcnlwdGVkOiBBcnJheUJ1ZmZlcixcbiAgcHJpdmF0ZUtleTogc3RyaW5nLFxuKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4gPT4ge1xuICBjb25zdCBrZXkgPSBhd2FpdCBnZXRJbXBvcnRlZEtleShwcml2YXRlS2V5LCBcImRlY3J5cHRcIik7XG4gIHJldHVybiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgIHtcbiAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgaXYsXG4gICAgfSxcbiAgICBrZXksXG4gICAgZW5jcnlwdGVkLFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHNhdmVUb0ZpcmViYXNlID0gYXN5bmMgKFxuICBwb3J0YWw6IFBvcnRhbCxcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4pID0+IHtcbiAgY29uc3QgeyByb29tSWQsIHJvb21LZXksIHNvY2tldCB9ID0gcG9ydGFsO1xuICBpZiAoXG4gICAgLy8gaWYgbm8gcm9vbSBleGlzdHMsIGNvbnNpZGVyIHRoZSByb29tIHNhdmVkIGJlY2F1c2UgdGhlcmUncyBub3RoaW5nIHdlIGNhblxuICAgIC8vIGRvIGF0IHRoaXMgcG9pbnRcbiAgICAhcm9vbUlkIHx8XG4gICAgIXJvb21LZXkgfHxcbiAgICAhc29ja2V0IHx8XG4gICAgaXNTYXZlZFRvRmlyZWJhc2UocG9ydGFsLCBlbGVtZW50cylcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBmaXJlYmFzZSA9IGF3YWl0IGxvYWRGaXJlc3RvcmUoKTtcbiAgY29uc3Qgc2NlbmVWZXJzaW9uID0gZ2V0U2NlbmVWZXJzaW9uKGVsZW1lbnRzKTtcbiAgY29uc3QgeyBjaXBoZXJ0ZXh0LCBpdiB9ID0gYXdhaXQgZW5jcnlwdEVsZW1lbnRzKHJvb21LZXksIGVsZW1lbnRzKTtcblxuICBjb25zdCBuZXh0RG9jRGF0YSA9IHtcbiAgICBzY2VuZVZlcnNpb24sXG4gICAgY2lwaGVydGV4dDogZmlyZWJhc2UuZmlyZXN0b3JlLkJsb2IuZnJvbVVpbnQ4QXJyYXkoXG4gICAgICBuZXcgVWludDhBcnJheShjaXBoZXJ0ZXh0KSxcbiAgICApLFxuICAgIGl2OiBmaXJlYmFzZS5maXJlc3RvcmUuQmxvYi5mcm9tVWludDhBcnJheShpdiksXG4gIH0gYXMgRmlyZWJhc2VTdG9yZWRTY2VuZTtcblxuICBjb25zdCBkYiA9IGZpcmViYXNlLmZpcmVzdG9yZSgpO1xuICBjb25zdCBkb2NSZWYgPSBkYi5jb2xsZWN0aW9uKFwic2NlbmVzXCIpLmRvYyhyb29tSWQpO1xuICBjb25zdCBkaWRVcGRhdGUgPSBhd2FpdCBkYi5ydW5UcmFuc2FjdGlvbihhc3luYyAodHJhbnNhY3Rpb24pID0+IHtcbiAgICBjb25zdCBkb2MgPSBhd2FpdCB0cmFuc2FjdGlvbi5nZXQoZG9jUmVmKTtcbiAgICBpZiAoIWRvYy5leGlzdHMpIHtcbiAgICAgIHRyYW5zYWN0aW9uLnNldChkb2NSZWYsIG5leHREb2NEYXRhKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZEb2NEYXRhID0gZG9jLmRhdGEoKSBhcyBGaXJlYmFzZVN0b3JlZFNjZW5lO1xuICAgIGlmIChwcmV2RG9jRGF0YS5zY2VuZVZlcnNpb24gPj0gbmV4dERvY0RhdGEuc2NlbmVWZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJhbnNhY3Rpb24udXBkYXRlKGRvY1JlZiwgbmV4dERvY0RhdGEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICBpZiAoZGlkVXBkYXRlKSB7XG4gICAgZmlyZWJhc2VTY2VuZVZlcnNpb25DYWNoZS5zZXQoc29ja2V0LCBzY2VuZVZlcnNpb24pO1xuICB9XG5cbiAgcmV0dXJuIGRpZFVwZGF0ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2FkRnJvbUZpcmViYXNlID0gYXN5bmMgKFxuICByb29tSWQ6IHN0cmluZyxcbiAgcm9vbUtleTogc3RyaW5nLFxuICBzb2NrZXQ6IFNvY2tldElPQ2xpZW50LlNvY2tldCB8IG51bGwsXG4pOiBQcm9taXNlPHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10gfCBudWxsPiA9PiB7XG4gIGNvbnN0IGZpcmViYXNlID0gYXdhaXQgbG9hZEZpcmVzdG9yZSgpO1xuICBjb25zdCBkYiA9IGZpcmViYXNlLmZpcmVzdG9yZSgpO1xuXG4gIGNvbnN0IGRvY1JlZiA9IGRiLmNvbGxlY3Rpb24oXCJzY2VuZXNcIikuZG9jKHJvb21JZCk7XG4gIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgaWYgKCFkb2MuZXhpc3RzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgc3RvcmVkU2NlbmUgPSBkb2MuZGF0YSgpIGFzIEZpcmViYXNlU3RvcmVkU2NlbmU7XG4gIGNvbnN0IGNpcGhlcnRleHQgPSBzdG9yZWRTY2VuZS5jaXBoZXJ0ZXh0LnRvVWludDhBcnJheSgpO1xuICBjb25zdCBpdiA9IHN0b3JlZFNjZW5lLml2LnRvVWludDhBcnJheSgpO1xuXG4gIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgZGVjcnlwdEVsZW1lbnRzKHJvb21LZXksIGl2LCBjaXBoZXJ0ZXh0KTtcblxuICBpZiAoc29ja2V0KSB7XG4gICAgZmlyZWJhc2VTY2VuZVZlcnNpb25DYWNoZS5zZXQoc29ja2V0LCBnZXRTY2VuZVZlcnNpb24oZWxlbWVudHMpKTtcbiAgfVxuXG4gIHJldHVybiByZXN0b3JlRWxlbWVudHMoZWxlbWVudHMsIG51bGwpO1xufTtcblxuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc0Zyb21GaXJlYmFzZSA9IGFzeW5jIChcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGRlY3J5cHRpb25LZXk6IHN0cmluZyxcbiAgZmlsZXNJZHM6IHJlYWRvbmx5IEltYWdlSWRbXSxcbik6IFByb21pc2U8e1xuICBsb2FkZWRGaWxlczogQmluYXJ5RmlsZURhdGFbXTtcbiAgZXJyb3JlZEZpbGVzOiBJbWFnZUlkW107XG59PiA9PiB7XG4gIGNvbnN0IGxvYWRlZEZpbGVzOiBCaW5hcnlGaWxlRGF0YVtdID0gW107XG4gIGNvbnN0IGVycm9yZWRGaWxlczogSW1hZ2VJZFtdID0gW107XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgWy4uLm5ldyBTZXQoZmlsZXNJZHMpXS5tYXAoYXN5bmMgKGlkKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9maXJlYmFzZXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vdjAvYi8ke1xuICAgICAgICAgIEZJUkVCQVNFX0NPTkZJRy5zdG9yYWdlQnVja2V0XG4gICAgICAgIH0vby8ke2VuY29kZVVSSUNvbXBvbmVudChwcmVmaXgucmVwbGFjZSgvXlxcLy8sIFwiXCIpKX0lMkYke2lkfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dXJsfT9hbHQ9bWVkaWFgKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID1cbiAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpIHx8IFwiaW1hZ2UvcG5nXCI7XG4gICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuXG4gICAgICAgICAgY29uc3QgS0VZX0xFTkdUSCA9IDEyO1xuXG4gICAgICAgICAgY29uc3QgaXYgPSBhcnJheUJ1ZmZlci5zbGljZSgwLCBLRVlfTEVOR1RIKTtcbiAgICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBhcnJheUJ1ZmZlci5zbGljZShcbiAgICAgICAgICAgIEtFWV9MRU5HVEgsXG4gICAgICAgICAgICBhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNyeXB0RGF0YShpdiwgZW5jcnlwdGVkLCBkZWNyeXB0aW9uS2V5KTtcblxuICAgICAgICAgIGNvbnN0IGRhdGFVUkwgPSBhd2FpdCBhcnJheUJ1ZmZlclRvRGF0YVVSTChkZWNyeXB0ZWQsIGNvbnRlbnRUeXBlKTtcblxuICAgICAgICAgIGxvYWRlZEZpbGVzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogY29udGVudFR5cGUuaW5jbHVkZXMoXCJpbWFnZS9cIikgPyBcImltYWdlXCIgOiBcIm90aGVyXCIsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGRhdGFVUkwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGVycm9yZWRGaWxlcy5wdXNoKGlkKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSksXG4gICk7XG5cbiAgcmV0dXJuIHsgbG9hZGVkRmlsZXMsIGVycm9yZWRGaWxlcyB9O1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../excalidraw-app/data/firebase.ts\n");
|
|
2592
2592
|
|
|
2593
2593
|
/***/ }),
|
|
2594
2594
|
|
|
@@ -3105,7 +3105,7 @@ module.exports = JSON.parse('{"ar-SA":100,"bg-BG":68,"ca-ES":84,"cs-CZ":30,"da-D
|
|
|
3105
3105
|
/***/ ((module) => {
|
|
3106
3106
|
|
|
3107
3107
|
"use strict";
|
|
3108
|
-
module.exports = JSON.parse('{"name":"@zsviczian/excalidraw","version":"0.9.0-obsidian-image-support-
|
|
3108
|
+
module.exports = JSON.parse('{"name":"@zsviczian/excalidraw","version":"0.9.0-obsidian-image-support-2","main":"main.js","types":"types/packages/excalidraw/index.d.ts","files":["dist/*","types/*"],"publishConfig":{"access":"public"},"description":"Excalidraw as a React component","repository":"https://github.com/excalidraw/excalidraw","license":"MIT","keywords":["excalidraw","excalidraw-embed","react","npm","npm excalidraw"],"browserslist":{"production":[">0.2%","not dead","not ie <= 11","not op_mini all","not safari < 12","not kaios <= 2.5","not edge < 79","not chrome < 70","not and_uc < 13","not samsung < 10"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"peerDependencies":{"react":"^17.0.2","react-dom":"^17.0.2"},"devDependencies":{"@babel/core":"7.14.8","@babel/plugin-transform-arrow-functions":"7.14.5","@babel/plugin-transform-async-to-generator":"7.14.5","@babel/plugin-transform-runtime":"7.14.5","@babel/plugin-transform-typescript":"7.14.6","@babel/preset-env":"7.14.9","@babel/preset-react":"7.14.5","@babel/preset-typescript":"7.14.5","autoprefixer":"10.3.1","babel-loader":"8.2.2","babel-plugin-transform-class-properties":"6.24.1","cross-env":"7.0.3","css-loader":"5.2.6","file-loader":"6.2.0","mini-css-extract-plugin":"1.6.1","postcss-loader":"6.1.1","sass-loader":"12.1.0","terser-webpack-plugin":"5.1.4","ts-loader":"9.2.4","typescript":"4.3.5","webpack":"5.50.0","webpack-bundle-analyzer":"4.4.2","webpack-cli":"4.7.2"},"bugs":"https://github.com/excalidraw/excalidraw/issues","homepage":"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw","scripts":{"gen:types":"tsc --project ../../../tsconfig-types.json","build:umd":"cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types","build:umd:withAnalyzer":"cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js","pack":"yarn build:umd && yarn pack"}}');
|
|
3109
3109
|
|
|
3110
3110
|
/***/ })
|
|
3111
3111
|
|