script.bundle.js in Squeeze – Image Optimization & Compression, WEBP Conversion 1.7.12, at assets/js/script.bundle.js
| 1 | /* |
| 2 | * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). |
| 3 | * This devtool is neither made for production nor for readable output files. |
| 4 | * It uses "eval()" calls to create a separate source file in the browser devtools. |
| 5 | * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) |
| 6 | * or disable the default devtool with "devtool: false". |
| 7 | * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). |
| 8 | */ |
| 9 | /******/ (() => { // webpackBootstrap |
| 10 | /******/ "use strict"; |
| 11 | /******/ var __webpack_modules__ = ({ |
| 12 | |
| 13 | /***/ "./assets/js/handlers.js": |
| 14 | /*!*******************************!*\ |
| 15 | !*** ./assets/js/handlers.js ***! |
| 16 | \*******************************/ |
| 17 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { |
| 18 | |
| 19 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"handleBulkButtonClick\": () => (/* binding */ handleBulkButtonClick),\n/* harmony export */ \"handleBulkFromPage\": () => (/* binding */ handleBulkFromPage),\n/* harmony export */ \"handleBulkToggle\": () => (/* binding */ handleBulkToggle),\n/* harmony export */ \"handleButtonsClick\": () => (/* binding */ handleButtonsClick),\n/* harmony export */ \"handleClosePathDialog\": () => (/* binding */ handleClosePathDialog),\n/* harmony export */ \"handleCompressAfterUpload\": () => (/* binding */ handleCompressAfterUpload),\n/* harmony export */ \"handleCompressBeforeUpload\": () => (/* binding */ handleCompressBeforeUpload),\n/* harmony export */ \"handleDirectoryCheck\": () => (/* binding */ handleDirectoryCheck),\n/* harmony export */ \"handleDirectoryClick\": () => (/* binding */ handleDirectoryClick),\n/* harmony export */ \"handleFetchImagesFromPage\": () => (/* binding */ handleFetchImagesFromPage),\n/* harmony export */ \"handleMultiFileFormUpload\": () => (/* binding */ handleMultiFileFormUpload),\n/* harmony export */ \"handleOnLeave\": () => (/* binding */ handleOnLeave),\n/* harmony export */ \"handleRecursiveUpload\": () => (/* binding */ handleRecursiveUpload),\n/* harmony export */ \"handleRestoreBtnClick\": () => (/* binding */ handleRestoreBtnClick),\n/* harmony export */ \"handleSingleBtnClick\": () => (/* binding */ handleSingleBtnClick)\n/* harmony export */ });\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers.js */ \"./assets/js/helpers.js\");\n\r\n\r\n\r\n\r\n\r\nconst { __, sprintf } = wp.i18n; // Import __() from wp.i18n\r\n\r\nconst updateUI = (initId, response) => {\r\n const statusEl = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.postsFilterForm?.querySelector(`#post-${initId} .column-squeeze .squeeze_status`);\r\n if (statusEl) statusEl.innerHTML = response?.data?.message ?? response?.data ?? response;\r\n\r\n const gridItem = document.querySelector(`.media-frame.mode-grid .attachment[data-id=\"${initId}\"]`);\r\n if (gridItem) {\r\n const centered = gridItem.querySelector('.centered');\r\n const progress = gridItem.querySelector('.media-progress-bar');\r\n if (centered) centered.style.display = 'block';\r\n if (progress) progress.remove();\r\n gridItem.classList.remove('uploading');\r\n }\r\n};\r\n\r\nconst getTotalPages = (path) => {\r\n const selectors = {\r\n uncompressed: \"input[name='squeeze_bulk_uncompressed_pages']\",\r\n all: \"input[name='squeeze_bulk_total_pages']\"\r\n };\r\n const sel = selectors[path];\r\n const val = sel && document.querySelector(sel)?.value;\r\n return Number(val) || 1;\r\n};\r\n\r\nconst checkPaused = (data, page) => {\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.isPaused) return false;\r\n handleBulkPause(data, page);\r\n return true;\r\n};\r\n\r\nconst logAndThumbnail = async (filename, response, wrapper) => {\r\n const isSuccess = response?.success !== false;\r\n const message = response?.data?.message ?? response?.data;\r\n\r\n await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(message, {\r\n mediaLogWrapper: wrapper,\r\n iconId: isSuccess ? 'check-mark-circle-icon' : 'ban-sign-icon',\r\n isSuccess\r\n });\r\n\r\n if (!isSuccess) {\r\n await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(__('Skipped — continuing with next image.', 'squeeze'), {\r\n mediaLogWrapper: wrapper,\r\n iconId: 'ban-sign-icon',\r\n isWarning: true\r\n });\r\n }\r\n\r\n const titleEl = wrapper?.querySelector('h3');\r\n if (titleEl && response?.data?.filename) {\r\n titleEl.textContent = `${__('Media', 'squeeze')} ${filename} (${response.data.filename}):`;\r\n }\r\n\r\n const thumbUrl = response?.data?.sizes?.thumbnail?.url || response?.data?.url || response?.url;\r\n if (thumbUrl) {\r\n const thumb = document.createElement('div');\r\n thumb.classList.add('media-log-thumbnail');\r\n thumb.innerHTML = `<img src=\"${thumbUrl}\" alt=\"${filename}\"/>`;\r\n wrapper?.appendChild(thumb);\r\n }\r\n};\r\n\r\nconst handleDirectoryCheck = (event) => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.savePathBtn.disabled = !_helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.dirContainer.querySelector(\"input[type='checkbox']:checked\");\r\n};\r\n\r\nconst handleClosePathDialog = (event) => {\r\n if (!event.target.contains(_helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.pathDialog)) return;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.pathDialog.close();\r\n};\r\n\r\nconst handleBulkToggle = (event, process, mediaIDs, page = 1) => {\r\n const isPaused = event.target.dataset.running === 'true';\r\n\r\n event.target.dataset.running = isPaused ? 'false' : 'true';\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateButtonText(event.target, isPaused ? __('Resume bulk squeezing', 'squeeze') : __('Pause bulk squeezing', 'squeeze'), isPaused ? '#play-button-round-icon' : '#pause-button-icon');\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.isPaused = isPaused;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.process = process;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.mediaIDs = mediaIDs;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.page = page;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target = event.target;\r\n\r\n //console.log('handleBulkToggle', cachedMediaData);\r\n\r\n return isPaused;\r\n};\r\n\r\n// Handle single compress button click\r\nconst handleSingleBtnClick = async (event, timeoutId) => {\r\n const attachmentID = event.target.dataset.attachment;\r\n const squeezeStatus = event.target.closest(\"td\").querySelector(\".squeeze_status\");\r\n\r\n try {\r\n wp.media.attachment(attachmentID).fetch().then(async (data) => {\r\n const attachment = { attributes: data };\r\n\r\n let squeezeResponse = null;\r\n try {\r\n const compressData = await Squeeze.handleCompress(attachment);\r\n squeezeResponse = await Squeeze.handleUpload({ attachment, base64: compressData });\r\n\r\n squeezeStatus.innerHTML = squeezeResponse?.data?.message ?? squeezeResponse?.data ?? squeezeResponse;\r\n\r\n if (event.target.closest(\"td.field\")) {\r\n const table = event.target.closest(\"td\")?.querySelector(\".squeeze_status .squeeze-comparison-table\");\r\n if (table) {\r\n const td = document.createElement(\"td\");\r\n td.classList.add(\"field\");\r\n td.style.width = \"100%\";\r\n td.appendChild(table);\r\n event.target.closest(\"tr\").appendChild(td);\r\n }\r\n }\r\n // TBD: add file size label to the attachment info\r\n /*\r\n if (event.target.closest('.attachment-info')) {\r\n const fileSizeLabel = event.target.closest('.attachment-info').querySelector('.file-size');\r\n if (fileSizeLabel) {\r\n const fileSize = squeezeResponse?.data?.sizes?.scaled?.compressed_size ?? squeezeResponse?.data?.sizes?.original?.compressed_size ?? null;\r\n if (fileSize) {\r\n const humanFileSize = SqueezeHelpers.humanFileSize(fileSize, true);\r\n fileSizeLabel.innerHTML = fileSizeLabel.innerHTML.replace(/(<\\/strong>\\s*)(.*)/, `$1${humanFileSize}`);\r\n }\r\n }\r\n }\r\n */\r\n } catch (error) {\r\n console.error(error);\r\n squeezeStatus.innerHTML = error?.message ?? error;\r\n } finally {\r\n // Always preserve the \"Restore original\" button so the user can still revert\r\n // after a failed squeeze (result larger than original) or a successful one.\r\n // The button is safe to keep visible: it only appears when a backup actually exists.\r\n event.target.closest(\"td\")\r\n ?.querySelectorAll('button:not([name=\"squeeze_restore\"])')\r\n .forEach(btn => btn.remove());\r\n window.onbeforeunload = null;\r\n if (timeoutId) clearTimeout(timeoutId);\r\n }\r\n });\r\n } catch (error) {\r\n console.error(error);\r\n squeezeStatus.innerHTML = error?.message ?? error;\r\n event.target.remove();\r\n window.onbeforeunload = null;\r\n if (timeoutId) clearTimeout(timeoutId);\r\n }\r\n};\r\n\r\nconst handleRestoreBtnClick = async (event) => {\r\n const attachmentID = event.target.dataset.attachment;\r\n const statusEl = event.target.closest(\"td\").querySelector(\".squeeze_status\");\r\n\r\n event.target.disabled = true;\r\n statusEl.innerHTML = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.squeezeLoadingAnimationHTML + __('Restoring the original image...', 'squeeze');\r\n\r\n // if still squeezing after 3 seconds, update the status message\r\n const timeoutId = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.waitMessage(_helpers_js__WEBPACK_IMPORTED_MODULE_0__.squeezeLoadingAnimationHTML + __('Still restoring... Just need to regenerate thumbnails, please wait a moment.', 'squeeze'), statusEl);\r\n\r\n try {\r\n const response = await Squeeze.handleRestore(attachmentID);\r\n statusEl.innerHTML = response?.data ?? response;\r\n } catch (error) {\r\n console.error(error);\r\n statusEl.innerHTML = error?.message ?? JSON.stringify(error, null, 2);\r\n } finally {\r\n // Re-enable whichever compress button is present (varies by prior state).\r\n event.target.closest('td')\r\n ?.querySelector(`[name='squeeze_compress_again'], [name='squeeze_compress_single']`)\r\n ?.removeAttribute('disabled');\r\n event.target.remove();\r\n window.onbeforeunload = null;\r\n if (timeoutId) clearTimeout(timeoutId);\r\n }\r\n};\r\n\r\nconst handleBulkButtonClick = async (event, process, mediaIDs, currentPage) => {\r\n if (mediaIDs.length === 0) return;\r\n\r\n const totalPages = getTotalPages(process);\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.disableBulkButtons();\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.process === process) {\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.mediaIDs/*.length > 0*/) {\r\n mediaIDs = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.mediaIDs;\r\n }\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.page) {\r\n currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.page;\r\n }\r\n }\r\n\r\n const isPaused = handleBulkToggle(event, process, mediaIDs, currentPage);\r\n if (isPaused) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateButtonText(event.target, __('Pausing...', 'squeeze'), '#pause-button-icon');\r\n return;\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.hideBulkPausedBanner();\r\n event.target.disabled = false;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.focusBulkAction(event.target);\r\n\r\n try {\r\n const finalResponse = await handleRecursiveUpload(process, mediaIDs, currentPage, true);\r\n\r\n if (finalResponse?.mediaIDs) {\r\n if (finalResponse.mediaIDs.length === 0 && finalResponse.page >= totalPages) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(__('All images have been processed!', 'squeeze'), { isEnd: true });\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.showPopupMessage( {\r\n title: __('Squeezing complete', 'squeeze'),\r\n message: __('All images have been processed!', 'squeeze'),\r\n type: 'success'\r\n });\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.restoreBulkButtons();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.restoreBulkButtons();\r\n window.onbeforeunload = null;\r\n alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n }\r\n};\r\n\r\nconst handleButtonsClick = async (event) => {\r\n const singleBtnName = 'squeeze_compress_single';\r\n const compressAgainBtnName = 'squeeze_compress_again';\r\n const restoreBtnName = 'squeeze_restore';\r\n //console.log(Squeeze?.options?.webp_quality)\r\n\r\n if (event.target.getAttribute(\"name\") === singleBtnName || event.target.getAttribute(\"name\") === compressAgainBtnName) {\r\n //console.log('Clicked compress button, WebP quality:', Squeeze?.options?.webp_quality);\r\n \r\n const statusEl = event.target.closest(\"td\").querySelector(\".squeeze_status\");\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.disableAllButtons(event.target.closest(\"td\").querySelectorAll(`button`));\r\n statusEl.innerHTML = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.squeezeLoadingAnimationHTML + __('Squeezing...', 'squeeze');\r\n\r\n // if still squeezing after 5 seconds, update the status message\r\n const timeoutId = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.waitMessage(\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.squeezeLoadingAnimationHTML + \r\n __('Still squeezing... This may take a while depending on the image size.', 'squeeze'), \r\n statusEl\r\n );\r\n\r\n window.onbeforeunload = handleOnLeave;\r\n handleSingleBtnClick(event, timeoutId);\r\n }\r\n\r\n if (event.target.getAttribute(\"name\") === restoreBtnName) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.disableAllButtons(event.target.closest(\"td\").querySelectorAll(`button`));\r\n window.onbeforeunload = handleOnLeave;\r\n handleRestoreBtnClick(event);\r\n }\r\n}\r\n\r\nconst handleDirectoryClick = async (event) => {\r\n if (event.target !== event.currentTarget) return;\r\n\r\n const currentDir = event.target.closest(\".directory-item\");\r\n const currentPath = currentDir.dataset.path;\r\n const parentPath = currentDir.dataset.parent;\r\n\r\n if (parentPath === '/' || currentDir.classList.contains(\"loading\")) return;\r\n\r\n if (currentDir.classList.contains(\"loaded\")) {\r\n currentDir.classList.toggle(\"opened\");\r\n return;\r\n }\r\n\r\n currentDir.classList.add(\"loading\");\r\n\r\n const subDirs = await Squeeze.getDirectories(currentPath);\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.renderDirectories(subDirs, currentDir, {\r\n handleDirectoryClick,\r\n handleDirectoryCheck\r\n });\r\n\r\n currentDir.classList.remove(\"loading\");\r\n currentDir.classList.add(\"loaded\", \"opened\");\r\n}\r\n\r\n/**\r\n * Hadnle warning on page leave\r\n*/\r\nconst handleOnLeave = () => {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const page = urlParams.get('page');\r\n const isUploadPage = window.location.href.includes('upload.php');\r\n const isMediaNewPage = window.location.href.includes('media-new.php');\r\n const isAttachmentPage = window.location.href.includes('post.php') && urlParams.get('action') === 'edit';\r\n\r\n if (page === 'squeeze-bulk' || isMediaNewPage || isAttachmentPage) {\r\n return __('Are you sure you want to leave this page? The squeezing process will be terminated!', 'squeeze');\r\n }\r\n if (isUploadPage) {\r\n return __('Are you sure you want to leave this page? The settings will not be saved!', 'squeeze');\r\n }\r\n};\r\n\r\nconst handleBulkPause = (data, currentPage) => {\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.mediaIDs = data;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.page = currentPage;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target.dataset.running = 'false';\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target.disabled = false;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateButtonText(_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target, __('Resume bulk squeezing', 'squeeze'), '#play-button-round-icon');\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.enableBulkButtonsOnPause(_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.showBulkPausedBanner();\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(__('Bulk squeezing has been paused!', 'squeeze'), { isPause: true });\r\n};\r\n\r\nconst handleUpdateChart = (uncompressedImagesCount) => {\r\n const linearStats = document.querySelector(\".squeeze-bulk-media-stats--linear\");\r\n const squeezedImages = document.querySelector(\".squeeze-bulk-media-stats-item-value\");\r\n\r\n const imagesLeft = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.totalImages - uncompressedImagesCount;\r\n const percentage = parseFloat((imagesLeft / _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.totalImages) * 100).toFixed(2);\r\n\r\n if (linearStats) {\r\n const pctEl = linearStats.querySelector(\".squeeze-bulk-media-stats-chart-pct\");\r\n if (pctEl) {\r\n pctEl.textContent = `${percentage}%`;\r\n }\r\n linearStats.style.setProperty(\"--squeeze-progress-pct\", percentage);\r\n if (squeezedImages) {\r\n squeezedImages.textContent = `${imagesLeft} / ${_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.totalImages}`;\r\n }\r\n return;\r\n }\r\n\r\n const chartValue = document.querySelector(\".squeeze-bulk-media-stats-chart-value > text\");\r\n const chartBar = document.querySelector(\".squeeze-bulk-media-stats-chart\");\r\n\r\n if (!chartValue || !chartBar) return;\r\n\r\n const dasharray = percentage * 560 / 100;\r\n chartValue.textContent = `${percentage}%`;\r\n chartBar.style.setProperty(\"--squeeze-dasharray\", dasharray);\r\n\r\n if (squeezedImages) {\r\n squeezedImages.textContent = `${imagesLeft} / ${_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.totalImages}`;\r\n }\r\n};\r\n\r\nconst handleRecursiveUpload = async (path, data, currentPage, isUpdateChart = false) => {\r\n\r\n if (!Array.isArray(data)) return { success: false, data: 'No data provided!', mediaIDs: [] }; // when bulk directory path has no images\r\n\r\n const totalPages = getTotalPages(path);\r\n\r\n const noMoreImages = (page, message = __('No more images found!', 'squeeze')) => ({\r\n success: true,\r\n data: message,\r\n mediaIDs: [],\r\n page,\r\n });\r\n\r\n if (data.length === 0) {\r\n currentPage += 1;\r\n if (currentPage > totalPages || !_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.lastId) return noMoreImages(currentPage);\r\n\r\n const maybeGetNextMediaIDs = await Squeeze.getNextAttachments(currentPage, path, _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.lastId);\r\n if (maybeGetNextMediaIDs.success && maybeGetNextMediaIDs.data.length > 0) {\r\n const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n return handleRecursiveUpload(path, nextMediaIDs, currentPage, isUpdateChart);\r\n } else {\r\n return noMoreImages(currentPage);\r\n }\r\n }\r\n\r\n const initData = [...data]; // initial data\r\n\r\n const filename = data[0]?.filename ? data[0].filename : `ID #${data[0]}`;\r\n const mediaLogWrapper = await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(\r\n `${__('Start squeezing...', 'squeeze')}`, \r\n { title: filename, isStart: true, iconId: 'lemon-dot-icon' }\r\n );\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.lastId = data[0] || 0; // update lastId to the last processed ID\r\n const stillWorkingTimeoutId = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.waitBulkMessage(mediaLogWrapper, filename);\r\n\r\n try {\r\n const response = await Squeeze.handleBulkUpload(path, data);\r\n\r\n clearTimeout(stillWorkingTimeoutId);\r\n\r\n //console.log('handleRecursiveUpload response', response);\r\n\r\n await logAndThumbnail(filename, response, mediaLogWrapper);\r\n\r\n if (isUpdateChart && path !== 'all') {\r\n let uncompressedImagesCount = 0;\r\n if (path === 'uncompressed') {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.uncompressedImages = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.uncompressedImages - 1 || 0;\r\n uncompressedImagesCount = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.uncompressedImages;\r\n } else if (path === 'path') {\r\n uncompressedImagesCount = response.mediaIDs.length;\r\n }\r\n handleUpdateChart(uncompressedImagesCount);\r\n }\r\n\r\n if (checkPaused(data, currentPage)) {\r\n return { success: false, data: 'Process has been paused!', mediaIDs: data, page: currentPage };\r\n }\r\n\r\n updateUI(initData[0], response);\r\n\r\n if (response.mediaIDs.length > 0) {\r\n return handleRecursiveUpload(path, response.mediaIDs, currentPage, isUpdateChart);\r\n } else {\r\n currentPage += 1;\r\n if (currentPage > totalPages) return { ...response, page: currentPage };\r\n\r\n const lastId = initData[initData.length - 1];\r\n const maybeGetNextMediaIDs = await Squeeze.getNextAttachments(currentPage, path, lastId);\r\n if (maybeGetNextMediaIDs.success && maybeGetNextMediaIDs.data.length > 0) {\r\n const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n return handleRecursiveUpload(path, nextMediaIDs, currentPage, isUpdateChart);\r\n }\r\n }\r\n\r\n return response;\r\n\r\n } catch (error) {\r\n clearTimeout(stillWorkingTimeoutId);\r\n console.error(error);\r\n const errorMessage = error?.message ?? String(error);\r\n\r\n await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(errorMessage, { mediaLogWrapper, iconId: 'ban-sign-icon', isWarning: true });\r\n await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(__('Skipped — continuing with next image.', 'squeeze'), {\r\n mediaLogWrapper,\r\n iconId: 'ban-sign-icon',\r\n isWarning: true\r\n });\r\n\r\n const failedItem = initData[0];\r\n const remainingIDs = data.filter((item) => item !== failedItem);\r\n\r\n if (remainingIDs.length > 0) {\r\n return handleRecursiveUpload(path, remainingIDs, currentPage, isUpdateChart);\r\n } else {\r\n currentPage += 1;\r\n if (currentPage > totalPages) return { success: false, data: error, mediaIDs: [], page: currentPage };\r\n\r\n const lastId = initData[initData.length - 1];\r\n const maybeGetNextMediaIDs = await Squeeze.getNextAttachments(currentPage, path, lastId);\r\n if (maybeGetNextMediaIDs.success && maybeGetNextMediaIDs.data.length > 0) {\r\n const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n return handleRecursiveUpload(path, nextMediaIDs, currentPage, isUpdateChart);\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n/**\r\n * Handles the compression of image before upload using Squeeze.\r\n * It compresses only the original image, not the thumbnails.\r\n * \r\n * @param {object} up - The plupload instance\r\n * @param {object} pluploadFile - The file to be compressed\r\n * @param {object} compressOptions - The compression options object\r\n * @returns {boolean} - Returns false to prevent further processing of the file\r\n */\r\nconst handleCompressBeforeUpload = async (up, pluploadFile, compressOptions) => {\r\n //*\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.isSqueezeAvailable()) return;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.isFileAlreadyProcessed(pluploadFile)) return;\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.isImageFile(pluploadFile)) return;\r\n\r\n const file = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.getNativeFile(pluploadFile);\r\n const { type, subtype } = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.parseMimeType(file);\r\n\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.maybeCompressAttachment(type, subtype, compressOptions)) return;\r\n\r\n up?.stop();\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n if (await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.isExcludedFile(pluploadFile, up)) return;\r\n //*/\r\n\r\n try {\r\n return await processCompression(up, pluploadFile, file, compressOptions);\r\n } catch (error) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.handleCompressionError(error, up, pluploadFile);\r\n return false;\r\n }\r\n}\r\n\r\nasync function processCompression(up, pluploadFile, file, compressOptions) {\r\n\r\n //*\r\n let originalFile = file;\r\n\r\n const base64Obj = await Squeeze.compressBeforeUpload(file);\r\n if (!base64Obj?.base64) {\r\n console.warn('Compression skipped or failed for:', file.name);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.markFileFailed(pluploadFile);\r\n if (up) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.restartUploader(up);\r\n }\r\n return;\r\n }\r\n\r\n if (compressOptions?.backup_original) {\r\n originalFile = await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.maybeBackupOriginal(file, compressOptions);\r\n pluploadFile.originalFile = originalFile;\r\n }\r\n\r\n const compressedFile = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.base64ToFile(base64Obj.base64, file.name, file.type);\r\n const newSource = new mOxie.File(null, compressedFile);\r\n if (!newSource) {\r\n console.error('Failed to create new mOxie.File from base64 data');\r\n return;\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.markFileCompressed(pluploadFile, newSource, base64Obj);\r\n if (up) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.restartUploader(up);\r\n }\r\n\r\n //console.timeEnd('Compressing image:', pluploadFile.name);\r\n\r\n return true;\r\n //*/\r\n}\r\n\r\nconst handleMultiFileFormUpload = (compressOptions) => {\r\n if (typeof wpUploaderInit === 'undefined' || typeof plupload === 'undefined' || typeof uploader === 'undefined') return;\r\n\r\n const SqueezeUploader = uploader;\r\n\r\n SqueezeUploader.bind('BeforeUpload', async function (up, pluploadFile) {\r\n //console.log('BeforeUpload', up, pluploadFile.name, pluploadFile);\r\n handleCompressBeforeUpload(up, pluploadFile, compressOptions)\r\n });\r\n\r\n SqueezeUploader.bind('FileUploaded', function (up, file, response) {\r\n //console.log('FileUploaded', file, response);\r\n handleCompressAfterUpload(file, compressOptions, response);\r\n });\r\n}\r\n\r\nconst handleCompressAfterUpload = async (file, compressOptions, response = null) => {\r\n const fileID = file?.id;\r\n const attachmentID = response?.response;\r\n const mediaItem = document.getElementById(`media-item-${fileID}`);\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.isFileFailedAfterCompression(file)) {\r\n window.onbeforeunload = null;\r\n if (mediaItem) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.waitForItemLoad(mediaItem, false).then(() => {\r\n mediaItem.innerHTML += `<div class=\"squeeze_status\">\r\n ${file?._isExcluded ? __('File is excluded from compression:', 'squeeze') : __('File compression failed:', 'squeeze')}\r\n ${file.name}\r\n </div>`;\r\n });\r\n }\r\n return;\r\n }\r\n\r\n let attachment = file?.attachment;\r\n const type = attachment?.attributes?.type ?? file?.type?.split('/')[0];\r\n const subtype = attachment?.attributes?.subtype ?? file?.type?.split('/')[1];\r\n\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.maybeCompressAttachment(type, subtype, compressOptions)) {\r\n //console.warn('Skipping compression for:', type, subtype);\r\n return; // Skip compression for this attachment\r\n }\r\n\r\n window.onbeforeunload = handleOnLeave;\r\n \r\n // set 'uploading' param to true, to pause the uploading process\r\n attachment?.set('uploading', true);\r\n attachment?.set('percent', 50);\r\n attachment?.set('status', 'Squeezing'); // Set status to 'Squeezing' to indicate compression is in progress\r\n\r\n if (mediaItem) {\r\n try {\r\n await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.waitForItemLoad(mediaItem);\r\n const data = await wp.media.attachment(attachmentID).fetch();\r\n //console.log('Fetched attachment data:', data);\r\n attachment = { attributes: data };\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateAttachmentUIFailed(mediaItem, error);\r\n window.onbeforeunload = null;\r\n }\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.extendAttachment(attachment, file);\r\n\r\n try {\r\n const compressData = await Squeeze.handleCompress(attachment);\r\n if (attachment && typeof attachment.set === 'function') {\r\n attachment.set('percent', 75); // Set percent to 75% to indicate compression is done\r\n }\r\n const uploadData = await Squeeze.handleUpload({ attachment, base64: compressData });\r\n\r\n if (uploadData.success) {\r\n if (mediaItem) {\r\n mediaItem.innerHTML += `<div class=\"squeeze_status\">${uploadData?.data?.message}</div>`;\r\n mediaItem.querySelector('.progress')?.remove();\r\n } else {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateAttachmentUI(attachment, uploadData);\r\n }\r\n \r\n } else {\r\n console.warn(uploadData.data);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateAttachmentUIFailed(mediaItem, uploadData?.data?.message ?? uploadData?.data ?? uploadData)\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateAttachmentUIFailed(mediaItem, error);\r\n } finally {\r\n if (attachment && typeof attachment.set === 'function') {\r\n attachment.set('uploading', false);\r\n }\r\n window.onbeforeunload = null;\r\n }\r\n}\r\n\n\n//# sourceURL=webpack:///./assets/js/handlers.js?"); |
| 20 | |
| 21 | /***/ }), |
| 22 | |
| 23 | /***/ "./assets/js/helpers.js": |
| 24 | /*!******************************!*\ |
| 25 | !*** ./assets/js/helpers.js ***! |
| 26 | \******************************/ |
| 27 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { |
| 28 | |
| 29 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"base64SizeInBytes\": () => (/* binding */ base64SizeInBytes),\n/* harmony export */ \"base64ToBlob\": () => (/* binding */ base64ToBlob),\n/* harmony export */ \"base64ToFile\": () => (/* binding */ base64ToFile),\n/* harmony export */ \"cachedMediaData\": () => (/* binding */ cachedMediaData),\n/* harmony export */ \"disableAllButtons\": () => (/* binding */ disableAllButtons),\n/* harmony export */ \"disableBulkButtons\": () => (/* binding */ disableBulkButtons),\n/* harmony export */ \"elements\": () => (/* binding */ elements),\n/* harmony export */ \"enableBulkButtonsOnPause\": () => (/* binding */ enableBulkButtonsOnPause),\n/* harmony export */ \"extendAttachment\": () => (/* binding */ extendAttachment),\n/* harmony export */ \"fileToBase64\": () => (/* binding */ fileToBase64),\n/* harmony export */ \"focusBulkAction\": () => (/* binding */ focusBulkAction),\n/* harmony export */ \"getBulkButtonLabels\": () => (/* binding */ getBulkButtonLabels),\n/* harmony export */ \"getFileFromUrl\": () => (/* binding */ getFileFromUrl),\n/* harmony export */ \"getNativeFile\": () => (/* binding */ getNativeFile),\n/* harmony export */ \"handleCompressionError\": () => (/* binding */ handleCompressionError),\n/* harmony export */ \"handleRemovePathButton\": () => (/* binding */ handleRemovePathButton),\n/* harmony export */ \"hideBulkPausedBanner\": () => (/* binding */ hideBulkPausedBanner),\n/* harmony export */ \"humanFileSize\": () => (/* binding */ humanFileSize),\n/* harmony export */ \"isDocHidden\": () => (/* binding */ isDocHidden),\n/* harmony export */ \"isExcludedFile\": () => (/* binding */ isExcludedFile),\n/* harmony export */ \"isFileAlreadyProcessed\": () => (/* binding */ isFileAlreadyProcessed),\n/* harmony export */ \"isFileFailedAfterCompression\": () => (/* binding */ isFileFailedAfterCompression),\n/* harmony export */ \"isImageFile\": () => (/* binding */ isImageFile),\n/* harmony export */ \"isSqueezeAvailable\": () => (/* binding */ isSqueezeAvailable),\n/* harmony export */ \"logMessage\": () => (/* binding */ logMessage),\n/* harmony export */ \"markFileCompressed\": () => (/* binding */ markFileCompressed),\n/* harmony export */ \"markFileExcluded\": () => (/* binding */ markFileExcluded),\n/* harmony export */ \"markFileFailed\": () => (/* binding */ markFileFailed),\n/* harmony export */ \"maybeBackupOriginal\": () => (/* binding */ maybeBackupOriginal),\n/* harmony export */ \"maybeCompressAttachment\": () => (/* binding */ maybeCompressAttachment),\n/* harmony export */ \"objectToFormData\": () => (/* binding */ objectToFormData),\n/* harmony export */ \"parseMimeType\": () => (/* binding */ parseMimeType),\n/* harmony export */ \"populatePathInput\": () => (/* binding */ populatePathInput),\n/* harmony export */ \"removeAllButtons\": () => (/* binding */ removeAllButtons),\n/* harmony export */ \"renderDirectories\": () => (/* binding */ renderDirectories),\n/* harmony export */ \"renderTemplate\": () => (/* binding */ renderTemplate),\n/* harmony export */ \"restartUploader\": () => (/* binding */ restartUploader),\n/* harmony export */ \"restoreBulkActionItems\": () => (/* binding */ restoreBulkActionItems),\n/* harmony export */ \"restoreBulkButtons\": () => (/* binding */ restoreBulkButtons),\n/* harmony export */ \"showBulkPausedBanner\": () => (/* binding */ showBulkPausedBanner),\n/* harmony export */ \"showPopupMessage\": () => (/* binding */ showPopupMessage),\n/* harmony export */ \"squeezeLoadingAnimationHTML\": () => (/* binding */ squeezeLoadingAnimationHTML),\n/* harmony export */ \"syncDirectoryDialogCheckboxesFromPathInput\": () => (/* binding */ syncDirectoryDialogCheckboxesFromPathInput),\n/* harmony export */ \"updateAttachmentUI\": () => (/* binding */ updateAttachmentUI),\n/* harmony export */ \"updateAttachmentUIFailed\": () => (/* binding */ updateAttachmentUIFailed),\n/* harmony export */ \"updateButtonText\": () => (/* binding */ updateButtonText),\n/* harmony export */ \"waitBulkMessage\": () => (/* binding */ waitBulkMessage),\n/* harmony export */ \"waitForItemLoad\": () => (/* binding */ waitForItemLoad),\n/* harmony export */ \"waitMessage\": () => (/* binding */ waitMessage)\n/* harmony export */ });\n\r\n\r\nconst { __, sprintf } = wp.i18n; // Import __() from wp.i18n\r\n\r\nconst getBulkButtonLabels = () => ({\r\n newImages: __('Squeeze new images', 'squeeze'),\r\n reSqueezeAll: __('Re-squeeze all images', 'squeeze'),\r\n directorySqueeze: __('Run Directory Squeeze', 'squeeze'),\r\n});\r\n\r\n// move static helper functions here\r\nconst elements = {\r\n bulkBtn: document.querySelector(\"[name='squeeze_bulk']\"),\r\n bulkAgainBtn: document.querySelector(\"[name='squeeze_bulk_again']\"),\r\n bulkPathBtn: document.querySelector(\"[name='squeeze_bulk_path_button']\"),\r\n bulkPathRemoveBtns: document.querySelectorAll(\".squeeze-path-list__remove\"),\r\n selectPathBtn: document.querySelector(\"[name='squeeze_select_path_button']\"),\r\n savePathBtn: document.querySelector(\"[name='squeeze_save_path_button']\"),\r\n pathDialog: document.getElementById(\"squeeze-path-dialog\"),\r\n closePathDialogBtn: document.querySelector(\"[name='squeeze_close_path_dialog_button']\"),\r\n pathInput: document.querySelector(\"[name='squeeze_bulk_path']\"),\r\n pathList: document.querySelector(\".squeeze-path-list\"),\r\n postsFilterForm: document.querySelector(\"#posts-filter\"),\r\n dirContainer: document.getElementById(\"squeeze-bulk-directory-list\"),\r\n bulkLogInput: document.querySelector(\"#squeeze-log-data\"),\r\n pauseBulkBtn: document.querySelector(\"[name='squeeze_pause_page_bulk']\"),\r\n bulkPausedBanner: document.getElementById('squeeze-bulk-paused-banner'),\r\n bulkPausedBannerText: document.getElementById('squeeze-bulk-paused-banner-text'),\r\n}\r\n\r\nconst getBulkActionItem = (btn) => btn?.closest('.squeeze-bulk-media-actions__item');\r\n\r\nconst setBulkActionItemHidden = (btn, hidden) => {\r\n const item = getBulkActionItem(btn);\r\n if (item) {\r\n item.hidden = hidden;\r\n }\r\n};\r\n\r\nconst focusBulkAction = (activeBtn) => {\r\n [elements.bulkBtn, elements.bulkAgainBtn].forEach((btn) => {\r\n if (!btn) return;\r\n setBulkActionItemHidden(btn, btn !== activeBtn);\r\n });\r\n};\r\n\r\nconst restoreBulkActionItems = () => {\r\n [elements.bulkBtn, elements.bulkAgainBtn].forEach((btn) => {\r\n if (!btn) return;\r\n setBulkActionItemHidden(btn, false);\r\n });\r\n\r\n if (elements.bulkBtn?.dataset.defaultHidden === 'true') {\r\n setBulkActionItemHidden(elements.bulkBtn, true);\r\n }\r\n};\r\n\r\nconst cachedMediaData = {\r\n isPaused: false,\r\n page: 1,\r\n process: '',\r\n mediaIDs: [],\r\n lastId: 0,\r\n totalImages: document.querySelector(\"[name='squeeze_bulk_total_images']\")?.value || 0,\r\n uncompressedImages: document.querySelector(\"[name='squeeze_bulk_uncompressed_images']\")?.value || 0,\r\n target: null\r\n}\r\n\r\nconst loadTemplate = async (templatePath, data) => {\r\n const response = await fetch(templatePath);\r\n let template = await response.text();\r\n\r\n // Process sub-templates\r\n const subTemplateRegex = /\\{\\{\\>\\s*(.*?)\\s*\\}\\}/g;\r\n let match;\r\n while ((match = subTemplateRegex.exec(template)) !== null) {\r\n const subTemplatePath = `${squeezeOptions.templateBase}/${match[1].trim()}.html`;\r\n const subTemplate = await loadTemplate(subTemplatePath, data);\r\n template = template.replace(match[0], subTemplate);\r\n }\r\n\r\n // Function to safely evaluate conditions (supports boolean variables, expressions, AND/OR)\r\n const evaluateCondition = (condition, data) => {\r\n try {\r\n // Convert standalone boolean variables (e.g., webp_lossless) to data['webp_lossless']\r\n condition = condition.replace(/\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b/g, (match) =>\r\n match in data ? `data['${match}']` : match\r\n );\r\n\r\n return new Function(\"data\", `with(data) { return ${condition}; }`)(data);\r\n } catch (e) {\r\n console.error(\"Error evaluating condition:\", condition, e);\r\n return false;\r\n }\r\n };\r\n\r\n // Recursive function to process nested if-else conditions\r\n const processIfStatements = (template) => {\r\n return template.replace(/\\{\\{#if ([\\s\\S]*?)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g, (match, condition, content) => {\r\n condition = condition.trim();\r\n const conditionResult = evaluateCondition(condition, data);\r\n\r\n // Extract and split the if-else blocks\r\n const elseMatch = content.match(/\\{\\{#else\\}\\}([\\s\\S]*)/);\r\n const trueBlock = elseMatch ? content.replace(/\\{\\{#else\\}\\}([\\s\\S]*)/, \"\") : content;\r\n const falseBlock = elseMatch ? elseMatch[1] : \"\";\r\n\r\n // Process nested if statements recursively\r\n return processIfStatements(conditionResult ? trueBlock : falseBlock);\r\n });\r\n };\r\n\r\n // Apply recursive processing of if conditions\r\n template = processIfStatements(template);\r\n\r\n // Replace variables\r\n return template.replace(/\\{\\{(.*?)\\}\\}/g, (match, key) => data[key.trim()] || '');\r\n}\r\n\r\nconst renderTemplate = async (templatePath, data, target = null) => {\r\n const renderedHTML = await loadTemplate(templatePath, data);\r\n\r\n // Create a temporary container to parse HTML\r\n const tempContainer = document.createElement(\"template\");\r\n tempContainer.innerHTML = renderedHTML.trim();\r\n\r\n if (!target) {\r\n return tempContainer.content.firstChild;\r\n }\r\n\r\n target.appendChild(tempContainer.content.firstChild);\r\n\r\n // Return the last element of the rendered template\r\n return target.lastElementChild;\r\n}\r\n\r\nconst logMessage = async (msg, options = {}) => {\r\n const { mediaLogWrapper = null, isStart = false, isPause = false, isEnd = false, isSuccess = false, isProgress = false, isWarning = false } = options;\r\n let { title = '', iconId = 'check-mark-circle-icon' } = options;\r\n\r\n if (!elements.bulkLogInput) return;\r\n\r\n if (isStart || isPause || isEnd) {\r\n iconId = isPause ? 'pause-button-icon' : ( isEnd ? 'check-mark-circle-icon' : 'image-file-icon' );\r\n title = isPause ? __('Bulk squeezing has been paused!', 'squeeze') : ( isEnd ? __('Bulk squeezing has been completed!', 'squeeze') : `${__('Media', 'squeeze')} ${title}:` );\r\n return await renderTemplate(squeezeOptions.templates.logWrapper, { title: title, msg: msg, iconId: iconId, isStart: isStart, isPause: isPause, isEnd: isEnd }, elements.bulkLogInput);\r\n } else {\r\n if (mediaLogWrapper) {\r\n const process = mediaLogWrapper.querySelector(\".media-log-process\");\r\n const step = await renderTemplate(squeezeOptions.templates.logStep, { msg: msg, iconId: iconId }, process);\r\n\r\n if (isWarning) {\r\n step.classList.add('media-log-step--warning');\r\n }\r\n\r\n if (msg && msg.includes('squeeze-comparison-table')) {\r\n const comparisonTable = step.querySelector('.squeeze-comparison-table');\r\n const toggleBtn = await renderTemplate(squeezeOptions.templates.logDetailsButton, { buttonText: __('Show details', 'squeeze') }, mediaLogWrapper);\r\n\r\n toggleBtn.addEventListener(\"click\", () => {\r\n comparisonTable.classList.toggle(\"show\");\r\n toggleBtn.textContent = comparisonTable.classList.contains(\"show\") ? __('Hide details', 'squeeze') : __('Show details', 'squeeze');\r\n });\r\n step.closest(\".media-log-wrapper\").appendChild(comparisonTable);\r\n step.closest(\".media-log-wrapper\").appendChild(toggleBtn);\r\n }\r\n\r\n if (!isProgress) {\r\n mediaLogWrapper.classList.add('media-log-wrapper--done');\r\n }\r\n\r\n if (isSuccess) {\r\n mediaLogWrapper.classList.add('media-log-wrapper--success');\r\n }\r\n\r\n if (isWarning) {\r\n mediaLogWrapper.classList.add('media-log-wrapper--warning');\r\n }\r\n } else {\r\n elements.bulkLogInput.innerHTML += msg + `<br>`;\r\n }\r\n }\r\n}\r\n\r\nconst showPopupMessage = (args) => {\r\n const { title = '', message, type = 'info', onClose = null } = args;\r\n const popup = document.createElement('dialog');\r\n const popupCloseBtn = document.createElement('button');\r\n const popupCloseIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n const popupIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n const popupText = document.createElement('p');\r\n const popupTitle = document.createElement('h3');\r\n\r\n popupIcon.setAttributeNS(null, 'viewBox', '0 0 32 32');\r\n popupIcon.classList.add('squeeze-icon');\r\n switch (type) {\r\n case 'success':\r\n popupIcon.innerHTML = `<use xlink:href=\"#check-mark-circle-icon\"></use>`;\r\n break;\r\n case 'error':\r\n popupIcon.innerHTML = `<use xlink:href=\"#ban-sign-icon\"></use>`;\r\n break;\r\n case 'info':\r\n popupIcon.innerHTML = `<use xlink:href=\"#info-icon\"></use>`;\r\n break;\r\n }\r\n\r\n popup.appendChild(popupIcon);\r\n\r\n if (title) {\r\n popupTitle.innerText = title;\r\n popup.appendChild(popupTitle);\r\n }\r\n\r\n const closePopup = () => {\r\n popup.close();\r\n popup.remove();\r\n }\r\n popup.addEventListener('click', (event) => {\r\n const rect = popup.getBoundingClientRect();\r\n const isInDialog = (rect.top <= event.clientY && event.clientY <= rect.top + rect.height &&\r\n rect.left <= event.clientX && event.clientX <= rect.left + rect.width);\r\n \r\n if (!isInDialog) {\r\n popup.close();\r\n }\r\n })\r\n popupCloseBtn.addEventListener('click', closePopup);\r\n if (onClose) {\r\n popup.addEventListener('close', onClose);\r\n }\r\n popupCloseBtn.className = 'squeeze-popup-close-btn';\r\n popup.className = `squeeze-popup-message squeeze-popup-${type} squeeze-box`;\r\n popupText.innerHTML = message;\r\n popupCloseIcon.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n popupCloseIcon.classList.add('squeeze-icon');\r\n popupCloseIcon.innerHTML = `<use xlink:href=\"#close-round-icon\"></use>`;\r\n\r\n popupCloseBtn.appendChild(popupCloseIcon);\r\n popup.appendChild(popupText);\r\n popup.appendChild(popupCloseBtn);\r\n document.body.appendChild(popup);\r\n popup.showModal();\r\n}\r\n\r\nconst hideBulkPausedBanner = () => {\r\n if (!elements.bulkPausedBanner) return;\r\n elements.bulkPausedBanner.hidden = true;\r\n if (elements.bulkPausedBannerText) {\r\n elements.bulkPausedBannerText.textContent = '';\r\n }\r\n};\r\n\r\nconst showBulkPausedBanner = () => {\r\n if (!elements.bulkPausedBanner || !elements.bulkPausedBannerText) return;\r\n\r\n elements.bulkPausedBannerText.textContent = __('Paused. Click Resume to continue.', 'squeeze');\r\n elements.bulkPausedBanner.hidden = false;\r\n};\r\n\r\nconst enableBulkButtonsOnPause = (resumeTarget) => {\r\n if (resumeTarget) {\r\n resumeTarget.disabled = false;\r\n resumeTarget.dataset.running = 'false';\r\n }\r\n};\r\n\r\nconst restoreBulkButtons = () => {\r\n const labels = getBulkButtonLabels();\r\n\r\n hideBulkPausedBanner();\r\n elements.bulkBtn.disabled = false;\r\n elements.bulkAgainBtn.disabled = false;\r\n elements.bulkPathBtn.disabled = false;\r\n elements.selectPathBtn.disabled = false;\r\n updateButtonText(elements.bulkBtn, labels.newImages, '#play-button-round-icon');\r\n updateButtonText(elements.bulkAgainBtn, labels.reSqueezeAll, '#repeat-icon');\r\n updateButtonText(elements.bulkPathBtn, labels.directorySqueeze, '#play-button-round-icon');\r\n elements.bulkBtn.dataset.running = 'false';\r\n elements.bulkAgainBtn.dataset.running = 'false';\r\n elements.bulkPathBtn.dataset.running = 'false';\r\n elements.bulkPathRemoveBtns?.forEach((btn) => {\r\n btn.disabled = false;\r\n });\r\n\r\n restoreBulkActionItems();\r\n\r\n cachedMediaData.process = '';\r\n cachedMediaData.mediaIDs = [];\r\n cachedMediaData.page = 1;\r\n}\r\n\r\nconst disableBulkButtons = () => {\r\n elements.bulkBtn.disabled = true;\r\n elements.bulkAgainBtn.disabled = true;\r\n elements.bulkPathBtn.disabled = true;\r\n elements.selectPathBtn.disabled = true;\r\n elements.bulkPathRemoveBtns?.forEach((btn) => btn.disabled = true);\r\n}\r\n\r\nconst disableAllButtons = (buttons) => {\r\n if (!buttons) return;\r\n buttons.forEach((btn) => btn.disabled = true);\r\n}\r\n\r\nconst removeAllButtons = (buttons) => {\r\n if (!buttons) return;\r\n buttons.forEach((btn) => btn.remove());\r\n}\r\n\r\nconst updateButtonText = (button, text, svgAnchor = false) => {\r\n button.childNodes.forEach((node) => {\r\n if (node.nodeName === '#text' && node.textContent.trim() !== '') {\r\n node.textContent = text;\r\n }\r\n if (svgAnchor && node.nodeName === 'svg') {\r\n node.querySelector('use').setAttribute('xlink:href', svgAnchor);\r\n }\r\n });\r\n}\r\n\r\n// Function to render directories in the dialog\r\nconst renderDirectories = async (dirs, parentDir = null, listeners = {}) => {\r\n if (!dirs) return;\r\n if (typeof dirs === 'object') dirs = Object.values(dirs);\r\n if (!elements.dirContainer.classList.contains(\"loaded\")) elements.dirContainer.innerHTML = \"\";\r\n\r\n if (dirs.length === 0 && !parentDir) {\r\n const listItem = await renderTemplate(squeezeOptions.templates.directoryItemEmpty, { emptyText: __('No directories found!', 'squeeze') }, elements.dirContainer);\r\n return;\r\n }\r\n\r\n const selectedFolders = JSON.parse(elements.pathInput.value);\r\n let target;\r\n\r\n for (const dir of dirs) {\r\n const listItemClasses = [];\r\n\r\n if (dir.parent === '/') {\r\n listItemClasses.push(\"loaded\", \"opened\");\r\n }\r\n\r\n if (parentDir) {\r\n target = parentDir;\r\n } else if (dir.parent) {\r\n const parentElement = elements.dirContainer.querySelector(`[data-path=\"${dir.parent}\"]`);\r\n if (parentElement) {\r\n target = parentElement;\r\n } else {\r\n target = elements.dirContainer;\r\n }\r\n } else {\r\n target = elements.dirContainer;\r\n }\r\n\r\n const listItem = await renderTemplate(\r\n squeezeOptions.templates.directoryItem,\r\n {\r\n parent: dir.parent,\r\n path: dir.path,\r\n label: dir.name,\r\n classes: listItemClasses.join(\" \"),\r\n isWritable: dir.is_writeable && !(Array.isArray(selectedFolders) && selectedFolders.includes(dir.path)),\r\n isChecked: dir.is_writeable && Array.isArray(selectedFolders) && selectedFolders.includes(dir.path),\r\n },\r\n target\r\n )\r\n\r\n listItem.querySelector(\"label\").addEventListener(\"click\", listeners.handleDirectoryClick);\r\n listItem.querySelector(\"input[type='checkbox']\")?.addEventListener(\"change\", listeners.handleDirectoryCheck);\r\n }\r\n\r\n elements.dirContainer.classList.add(\"loaded\");\r\n}\r\n\r\n/**\r\n * Normalize directory path strings so checkbox values and hidden JSON compare reliably.\r\n */\r\nconst normalizeDirectoryPathKey = (p) => {\r\n let s = String(p ?? \"\").trim().replace(/\\\\/g, \"/\");\r\n s = s.replace(/\\/+/g, \"/\");\r\n if (!s) {\r\n return \"/\";\r\n }\r\n if (s !== \"/\" && !s.endsWith(\"/\")) {\r\n s += \"/\";\r\n }\r\n return s;\r\n};\r\n\r\n/**\r\n * Align checkboxes in #squeeze-bulk-directory-list with the hidden path JSON (e.g. after Clear path).\r\n */\r\nconst syncDirectoryDialogCheckboxesFromPathInput = () => {\r\n if (!elements.dirContainer) {\r\n return;\r\n }\r\n let selectedFolders = [];\r\n try {\r\n const raw = elements.pathInput?.value;\r\n if (raw) {\r\n selectedFolders = JSON.parse(raw);\r\n }\r\n } catch (e) {\r\n return;\r\n }\r\n if (!Array.isArray(selectedFolders)) {\r\n return;\r\n }\r\n const selectedSet = new Set(selectedFolders.map((p) => normalizeDirectoryPathKey(p)));\r\n elements.dirContainer.querySelectorAll(\"input[type='checkbox']\").forEach((cb) => {\r\n cb.checked = selectedSet.has(normalizeDirectoryPathKey(cb.value));\r\n });\r\n if (elements.savePathBtn) {\r\n elements.savePathBtn.disabled = !elements.dirContainer.querySelector(\"input[type='checkbox']:checked\");\r\n }\r\n};\r\n\r\nconst handleRemovePathButton = async (e) => {\r\n e.preventDefault();\r\n const item = e.target.closest(\".squeeze-path-list__item\");\r\n if (item) {\r\n item.remove();\r\n const currentPaths = Array.from(elements.pathList.querySelectorAll(\".squeeze-path-list__input\"))\r\n .map(input => input.value.trim())\r\n .filter(value => value !== '');\r\n elements.pathInput.value = JSON.stringify(currentPaths);\r\n await populatePathInput();\r\n }\r\n}\r\n\r\nconst populatePathInput = async () => {\r\n const path = elements.pathInput.value;\r\n if (!path) return;\r\n\r\n try {\r\n const selectedFolders = JSON.parse(path);\r\n const items = elements.pathList.querySelectorAll(\".squeeze-path-list__item\");\r\n\r\n items.forEach(item => item.remove());\r\n\r\n const showRemove = selectedFolders.length > 1;\r\n\r\n for (const folder of selectedFolders) {\r\n const item = await renderTemplate(squeezeOptions.templates.pathListItem, {\r\n folder: folder,\r\n showRemove: showRemove,\r\n clearLabel: __('Clear path', 'squeeze'),\r\n clearTitle: __('Clear the path field', 'squeeze'),\r\n }, elements.pathList);\r\n const removeButton = item.querySelector(\".squeeze-path-list__remove\");\r\n removeButton?.addEventListener(\"click\", handleRemovePathButton);\r\n }\r\n syncDirectoryDialogCheckboxesFromPathInput();\r\n } catch (error) {\r\n alert(__('Error parsing path input!', 'squeeze'));\r\n console.error('Error parsing path input:', error);\r\n }\r\n}\r\n\r\nconst getHiddenProp = () => {\r\n var prefixes = ['webkit', 'moz', 'ms', 'o'];\r\n\r\n // if 'hidden' is natively supported just return it\r\n if ('hidden' in document) return 'hidden';\r\n\r\n // otherwise loop over all the known prefixes until we find one\r\n for (let i = 0; i < prefixes.length; i++) {\r\n if ((prefixes[i] + 'Hidden') in document)\r\n return prefixes[i] + 'Hidden';\r\n }\r\n\r\n // otherwise it's not supported\r\n return null;\r\n}\r\n\r\nconst isDocHidden = () => {\r\n const prop = getHiddenProp();\r\n if (!prop) return false;\r\n\r\n return document[prop];\r\n}\r\n\r\n/**\r\n * @see https://stackoverflow.com/a/20732091\r\n */\r\nconst humanFileSize = (size) => {\r\n let i = size == 0 ? 0 : Math.floor(Math.log(size) / Math.log(1024));\r\n return +((size / Math.pow(1024, i)).toFixed(2)) * 1 + ' ' + ['B', 'KB', 'MB', 'GB', 'TB'][i];\r\n}\r\n\r\nconst base64SizeInBytes = (base64) => {\r\n // Remove data URL prefix if present\r\n const base64String = base64.split(',')[1] || base64; \r\n\r\n // Calculate padding characters ('=' at the end of Base64)\r\n const padding = (base64String.match(/=+$/) || [\"\"])[0].length;\r\n\r\n // Compute byte size\r\n return (base64String.length * 3) / 4 - padding;\r\n}\r\n\r\nconst maybeCompressAttachment = (attachmentType, attachmentSubType, compressOptions = null) => {\r\n const isAutoCompress = compressOptions?.auto_compress ?? true;\r\n const allowedMimeTypes = ['jpeg', 'png', 'webp', 'avif'];\r\n const isImage = attachmentType === 'image' && allowedMimeTypes.includes(attachmentSubType);\r\n\r\n return isImage && isAutoCompress;\r\n};\r\n\r\nconst base64ToBlob = (base64, type = 'image/jpeg') => {\r\n // Remove data URL prefix if present\r\n const base64String = base64.split(',')[1] || base64;\r\n\r\n // Decode Base64 string\r\n const byteCharacters = atob(base64String);\r\n const byteNumbers = new Array(byteCharacters.length);\r\n \r\n for (let i = 0; i < byteCharacters.length; i++) {\r\n byteNumbers[i] = byteCharacters.charCodeAt(i);\r\n }\r\n\r\n const byteArray = new Uint8Array(byteNumbers);\r\n return new Blob([byteArray], { type: type });\r\n}\r\n\r\nconst base64ToFile = (base64, fileName = 'image.jpg', type = 'image/jpeg') => {\r\n const blob = base64ToBlob(base64, type);\r\n return new File([blob], fileName, { type: type });\r\n}\r\n\r\nconst fileToBase64 = (file) => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = () => resolve(reader.result);\r\n reader.onerror = (error) => reject(error);\r\n reader.readAsDataURL(file);\r\n });\r\n}\r\n\r\nfunction objectToFormData(obj, fd = null, parentKey = null) {\r\n const formData = fd || new FormData();\r\n\r\n for (const key in obj) {\r\n if (!obj.hasOwnProperty(key)) continue;\r\n const value = obj[key];\r\n\r\n // build the form key: either \"foo\", \"parent[foo]\" or \"parent[]\" for arrays\r\n const formKey = parentKey\r\n ? Array.isArray(obj)\r\n ? `${parentKey}[]`\r\n : `${parentKey}[${key}]`\r\n : key;\r\n\r\n // Files or Blobs go straight in\r\n if (value instanceof File || value instanceof Blob) {\r\n formData.append(formKey, value, value.name);\r\n }\r\n // Arrays: recurse so they become key[]=val0, key[]=val1…\r\n else if (Array.isArray(value)) {\r\n objectToFormData(value, formData, formKey);\r\n }\r\n // Plain objects: recurse so they become key[subkey]=subval\r\n else if (\r\n value !== null &&\r\n typeof value === 'object' &&\r\n !(value instanceof Date)\r\n ) {\r\n objectToFormData(value, formData, formKey);\r\n }\r\n // Dates: convert to ISO string (or format as you like)\r\n else if (value instanceof Date) {\r\n formData.append(formKey, value.toISOString());\r\n }\r\n // Everything else (number, string, boolean, null, undefined)\r\n else {\r\n // Explicitly convert undefined to empty string so PHP sees it\r\n const stringVal =\r\n value === undefined || value === null ? '' : String(value);\r\n formData.append(formKey, stringVal);\r\n }\r\n }\r\n\r\n return formData;\r\n}\r\n\r\n/**\r\n * Extend the attachment object with additional data from the file.\r\n * @param {object} attachment \r\n * @param {object} file \r\n * @returns {object} — the extended attachment object.\r\n */\r\nconst extendAttachment = async (attachment, file) => {\r\n if (typeof attachment !== 'object' || !attachment.attributes) {\r\n console.warn('Invalid attachment object:', attachment);\r\n return;\r\n }\r\n\r\n const attributes = attachment.attributes;\r\n\r\n if (file?.base64) {\r\n attributes.base64Compressed = file.base64; // Use the base64 data from the attachment\r\n }\r\n\r\n if (file?.base64Webp) {\r\n attributes.base64WebpCompressed = file.base64Webp; // Use the WebP base64 data from the attachment\r\n }\r\n\r\n if (file?.originalFile) {\r\n attributes.originalFile = file.originalFile; // Use the original file from the attachment to be able to create a backup\r\n }\r\n\r\n return attachment;\r\n}\r\n\r\nconst getFileFromUrl = async (url, filename, format) => {\r\n const response = await fetch(url);\r\n const blob = await response.blob();\r\n const mimeType = format ? `image/${format}` : blob.type;\r\n return new File([blob], filename, { type: mimeType });\r\n}\r\n\r\nfunction isSqueezeAvailable() {\r\n if (typeof Squeeze === 'undefined') return false;\r\n if (typeof Squeeze.compressBeforeUpload !== 'function') {\r\n console.warn('Squeeze.compressBeforeUpload is not a function');\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction isFileAlreadyProcessed(file) {\r\n return file?._isSqueezed || file?._isExcluded || file?._isFailed;\r\n}\r\n\r\nfunction isFileFailedAfterCompression(file) {\r\n if (file?._isExcluded || file?._isFailed) {\r\n console.warn(`File is ${file?._isExcluded ? 'excluded' : 'failed'} from compression:`, file.name);\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nfunction isImageFile(file) {\r\n return file.type?.startsWith('image/');\r\n}\r\n\r\nfunction getNativeFile(pluploadFile) {\r\n return pluploadFile.getNative() || pluploadFile.getSource();\r\n}\r\n\r\nfunction parseMimeType(file) {\r\n const [type = '', subtype = ''] = file?.type?.split('/') ?? [];\r\n return { type, subtype };\r\n}\r\n\r\nasync function isExcludedFile(pluploadFile, up) {\r\n \r\n}\r\n\r\nfunction markFileExcluded(pluploadFile) {\r\n pluploadFile.status = plupload.QUEUED;\r\n pluploadFile.loaded = 0;\r\n pluploadFile._isExcluded = true;\r\n}\r\n\r\nfunction markFileFailed(pluploadFile) {\r\n pluploadFile.status = plupload.QUEUED;\r\n pluploadFile.loaded = 0;\r\n pluploadFile._isFailed = true;\r\n}\r\n\r\nfunction markFileCompressed(pluploadFile, newSource, base64Obj) {\r\n pluploadFile.getSource = () => newSource;\r\n pluploadFile.status = plupload.QUEUED;\r\n pluploadFile.loaded = 0;\r\n pluploadFile._isSqueezed = true;\r\n pluploadFile.base64 = base64Obj.base64;\r\n pluploadFile.base64Webp = base64Obj?.base64Webp;\r\n}\r\n\r\nfunction restartUploader(up) {\r\n if (!up) return;\r\n setTimeout(() => up.start(), 0);\r\n}\r\n\r\nasync function maybeBackupOriginal(file, compressOptions) {\r\n const isDirectWebp = compressOptions?.direct_webp && file.type !== 'image/webp';\r\n if (isDirectWebp) {\r\n return await Squeeze.convertFileToWebp(file);\r\n }\r\n return file;\r\n}\r\n\r\nfunction handleCompressionError(error, up, pluploadFile) {\r\n console.error('Error during compression before upload:', error);\r\n markFileFailed(pluploadFile);\r\n if (up) {\r\n restartUploader(up);\r\n }\r\n}\r\n\r\nfunction updateAttachmentUI(attachment, uploadData) {\r\n if (!attachment || !uploadData) return;\r\n if (uploadData.success === false) return;\r\n\r\n const compat = attachment.get('compat');\r\n const tempDiv = document.createElement('div');\r\n let compatItem = compat.item;\r\n\r\n tempDiv.innerHTML = compatItem;\r\n if (tempDiv.querySelector('.compat-field-squeeze_is_compressed .field')) {\r\n tempDiv.querySelector('.compat-field-squeeze_is_compressed .field').innerHTML = uploadData?.data?.message;\r\n }\r\n compat.item = tempDiv.innerHTML;\r\n\r\n attachment.set('compat', compat);\r\n}\r\n\r\nfunction updateAttachmentUIFailed(mediaItem, message) {\r\n if (!mediaItem) return;\r\n\r\n mediaItem.innerHTML += message;\r\n mediaItem.querySelector('.progress')?.remove();\r\n}\r\n\r\n/**\r\n * Wait for media item to load( 'async-upload.php' )\r\n * Ping every 1 second until the media item is loaded\r\n * @returns Promise\r\n*/\r\nconst waitForItemLoad = (mediaItem, addProgressBar = true) => {\r\n return new Promise((resolve) => {\r\n let interval = setInterval(() => {\r\n if (mediaItem.querySelector('.media-item-wrapper')) {\r\n if (addProgressBar) {\r\n mediaItem.querySelector('.media-item-wrapper').innerHTML += `\r\n <div class=\"progress\">\r\n <div class=\"percent\">${__('Squeezing...', 'squeeze')}</div>\r\n <div class=\"bar\" style=\"width: 200px;\"></div>\r\n </div>\r\n `;\r\n }\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 1000);\r\n });\r\n}\r\n\r\n/**\r\n * Show a message in the status element after a delay\r\n * Useful for long-running operations\r\n * @param {string} message \r\n * @param {HTMLElement} statusEl \r\n * @param {integer} delay - delay in milliseconds (default: 5000)\r\n * @returns {integer} - timeout ID\r\n */\r\nconst waitMessage = (message, statusEl, delay = 5000) => {\r\n const timeoutId = setTimeout(() => {\r\n statusEl.innerHTML = message;\r\n }, delay);\r\n\r\n return timeoutId;\r\n}\r\n\r\n/**\r\n * After a delay, append a \"still working\" step to an in-progress bulk log entry.\r\n */\r\nconst waitBulkMessage = (mediaLogWrapper, filename, delay = 30000) => {\r\n return setTimeout(async () => {\r\n if (!mediaLogWrapper || mediaLogWrapper.classList.contains('media-log-wrapper--done')) {\r\n return;\r\n }\r\n\r\n await logMessage(\r\n sprintf(__('Still processing %s… Large images can take several minutes.', 'squeeze'), filename),\r\n { mediaLogWrapper, iconId: 'lemon-dot-icon', isProgress: true }\r\n );\r\n }, delay);\r\n}\r\n\r\nconst squeezeLoadingAnimationHTML = `\r\n <div class=\"squeeze-loading-wrap\" aria-live=\"polite\" aria-label=\"Loading\">\r\n <span class=\"squeeze-loading-icon\">⌛</span>\r\n </div>\r\n`;\n\n//# sourceURL=webpack:///./assets/js/helpers.js?"); |
| 30 | |
| 31 | /***/ }), |
| 32 | |
| 33 | /***/ "./assets/js/script.js": |
| 34 | /*!*****************************!*\ |
| 35 | !*** ./assets/js/script.js ***! |
| 36 | \*****************************/ |
| 37 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { |
| 38 | |
| 39 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _squeeze_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./squeeze.js */ \"./assets/js/squeeze.js\");\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers.js */ \"./assets/js/helpers.js\");\n/* harmony import */ var _handlers_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./handlers.js */ \"./assets/js/handlers.js\");\n/* harmony import */ var _voxel_upload_compat_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./voxel-upload-compat.js */ \"./assets/js/voxel-upload-compat.js\");\n\r\n\r\n\r\n\r\n\r\n\r\n\"use strict\";\r\n\r\nconst { sprintf, __ } = wp.i18n; // Import __() from wp.i18n\r\n\r\n//const Squeeze = new SQUEEZE(squeezeOptions);\r\nconst compressOptions = JSON.parse(squeezeOptions.options);\r\nwindow.Squeeze = window.Squeeze || new _squeeze_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](squeezeOptions); // make it globally accessible for other scripts\r\n\r\n(0,_voxel_upload_compat_js__WEBPACK_IMPORTED_MODULE_3__.initVoxelUploadCompat)(compressOptions);\r\n\r\ndocument.addEventListener(\"click\", (event) => {\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleButtonsClick(event);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkBtn?.addEventListener(\"click\", async (event) => {\r\n let uncompressedIDs = squeezeBulk.unCompressedImages ? squeezeBulk.unCompressedImages.split(\",\") : [];\r\n let currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page ?? 1;\r\n\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleBulkButtonClick(event, 'uncompressed', uncompressedIDs, currentPage);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkAgainBtn?.addEventListener(\"click\", async (event) => {\r\n let allIDs = squeezeBulk.allImages ? squeezeBulk.allImages.split(\",\") : [];\r\n let currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page ?? 1;\r\n\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleBulkButtonClick(event, 'all', allIDs, currentPage);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkPathBtn?.addEventListener(\"click\", async (event) => {\r\n const path = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput?.value ?? '';\r\n let bulkPathData;\r\n\r\n if (path.replace(/\\[\\]/g, '').split(',').length === 0 || !path.replace(/\\[\\]/g, '').split(',')[0] || !path) {\r\n alert(__('Please enter a valid path!', 'squeeze'));\r\n return;\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.disableBulkButtons();\r\n window.onbeforeunload = _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleOnLeave;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.process === 'path' && _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs.length > 0) {\r\n bulkPathData = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs;\r\n } else {\r\n const pathData = await Squeeze.getAttachmentsByPath(path);\r\n\r\n if (pathData.success) {\r\n bulkPathData = pathData.data;\r\n } else {\r\n console.error(pathData.data);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n window.onbeforeunload = null;\r\n }\r\n }\r\n\r\n const isPaused = _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleBulkToggle(event, 'path', bulkPathData);\r\n\r\n if (isPaused) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.updateButtonText(event.target, __('Pausing...', 'squeeze'), '#pause-button-icon');\r\n return;\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.hideBulkPausedBanner();\r\n event.target.disabled = false;\r\n\r\n try {\r\n const finalResponse = await _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleRecursiveUpload('path', bulkPathData, 1);\r\n\r\n if (finalResponse?.mediaIDs) {\r\n if (finalResponse.mediaIDs.length === 0) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.logMessage(__('All images have been processed!', 'squeeze'), { isEnd: true });\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.showPopupMessage( {\r\n title: __('Squeezing complete', 'squeeze'),\r\n message: __('All images have been processed!', 'squeeze'),\r\n type: 'success'\r\n });\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n window.onbeforeunload = null;\r\n alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n }\r\n})\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkPathRemoveBtns?.forEach((btn) => {\r\n btn.addEventListener(\"click\", _helpers_js__WEBPACK_IMPORTED_MODULE_1__.handleRemovePathButton);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.selectPathBtn?.addEventListener(\"click\", async (event) => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.showModal();\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.classList.contains(\"loading\")) return;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.classList.contains(\"loaded\")) {\r\n const selectedFolders = JSON.parse(_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput.value);\r\n\r\n if (Array.isArray(selectedFolders)) {\r\n selectedFolders.forEach((folder) => {\r\n const checkbox = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.querySelector(`input[value=\"${folder}\"]`);\r\n if (checkbox) {\r\n checkbox.checked = true;\r\n }\r\n });\r\n }\r\n\r\n return;\r\n\r\n } else {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.classList.add(\"loading\");\r\n const folders = await Squeeze.getDirectories();\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.renderDirectories(folders, null, {\r\n handleDirectoryClick: _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleDirectoryClick,\r\n handleDirectoryCheck: _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleDirectoryCheck\r\n });\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.classList.remove(\"loading\");\r\n }\r\n\r\n\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.savePathBtn?.addEventListener(\"click\", () => {\r\n const checkboxes = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.querySelectorAll(\"input[type='checkbox']\");\r\n const selectedFolders = Array.from(checkboxes)\r\n .filter(checkbox => checkbox.checked)\r\n .map(checkbox => checkbox.value);\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput.value = JSON.stringify(selectedFolders);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.populatePathInput();\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.close();\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.closePathDialogBtn?.addEventListener(\"click\", () => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.close();\r\n});\r\n\r\ndocument.addEventListener('click', _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleClosePathDialog);\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm?.addEventListener(\"submit\", async (event) => {\r\n const dataAction = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.dataset.action;\r\n const action = event.target.querySelector(\"select[name='action']\").value;\r\n const submitButtons = event.target.querySelectorAll(\"input[name='bulk_action']\");\r\n\r\n if (action === 'squeeze_bulk_compress' && dataAction !== 'squeeze_bulk_compressed') {\r\n event.preventDefault();\r\n const mediaList = document.querySelectorAll(\"input[name='media[]']:checked\");\r\n const uncompressedIDs = Array.from(mediaList).map((el) => el.value);\r\n\r\n if (uncompressedIDs.length === 0) return;\r\n\r\n window.onbeforeunload = _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleOnLeave;\r\n\r\n uncompressedIDs.forEach((id) => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.querySelectorAll(`#post-${id} .column-squeeze button`).forEach((btn) => {\r\n btn.disabled = true;\r\n });\r\n const squeezeStatusElement = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.querySelector(`#post-${id} .column-squeeze .squeeze_status`);\r\n if (squeezeStatusElement) {\r\n squeezeStatusElement.innerText = '⏳ ' + __('Squeezing...', 'squeeze');\r\n }\r\n });\r\n\r\n submitButtons.forEach((btn) => {\r\n btn.disabled = true;\r\n btn.value = __('Squeezing...', 'squeeze');\r\n });\r\n\r\n try {\r\n const finalResponse = await _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleRecursiveUpload('uncompressed', uncompressedIDs, 1);\r\n\r\n if (finalResponse?.mediaIDs) {\r\n if (finalResponse.mediaIDs.length === 0) {\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.dataset.action = 'squeeze_bulk_compressed';\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.submit();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n window.onbeforeunload = null;\r\n alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n }\r\n }\r\n});\r\n\r\n// https://wordpress.stackexchange.com/a/131295/186146 - override wp.Uploader.prototype.success\r\nwindow.wp.domReady(()=>{\r\n\r\n if (wp?.Uploader?.prototype) {\r\n const prevInit = wp.Uploader.prototype.init;\r\n\r\n wp.Uploader.prototype.init = function (...args) {\r\n // Call Filebird’s (or whoever’s) init first\r\n if (typeof prevInit === 'function') {\r\n prevInit.apply(this, args);\r\n }\r\n \r\n const uploader = this.uploader;\r\n\r\n // Now add *your* logic\r\n if (uploader) {\r\n\r\n uploader.bind('BeforeUpload', async function (up, pluploadFile) {\r\n //console.time('Compressing image:', pluploadFile.name);\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleCompressBeforeUpload(up, pluploadFile, compressOptions);\r\n });\r\n\r\n uploader.bind('FileUploaded', async function (up, file, response) {\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleCompressAfterUpload(file, compressOptions);\r\n //console.timeEnd('Compressing image:', file.name)\r\n })\r\n\r\n }\r\n }\r\n }\r\n});\r\n\r\ndocument.onreadystatechange = function () {\r\n if (document.readyState === \"complete\") { // equivalent to jQuery $(document).ready()\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleMultiFileFormUpload(compressOptions);\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Create the toggle preview checkbox\r\n * @param {Integer} attachmentId \r\n * @param {Boolean} isPlaceholder\r\n * @returns HTMLElement\r\n */\r\nconst createTogglePreview = (attachmentId, isPlaceholder = false) => {\r\n\r\n // Create the toggle\r\n const toggleWrap = document.createElement('span');\r\n const toggleInput = document.createElement('input');\r\n const toggleLabel = document.createElement('label');\r\n const toggleIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n\r\n toggleInput.type = 'checkbox';\r\n toggleInput.className = 'squeeze-ios8-switch';\r\n toggleInput.id = 'squeeze-ios8-switch-' + attachmentId;\r\n toggleLabel.textContent = __('Compare Squeeze', 'squeeze');\r\n toggleLabel.title = __('Image comparison with Squeeze', 'squeeze');\r\n toggleLabel.htmlFor = toggleInput.id;\r\n toggleWrap.style.marginInlineStart = '1em';\r\n toggleWrap.style.verticalAlign = 'sub';\r\n toggleIcon.style.display = 'inline-block';\r\n toggleIcon.style.verticalAlign = 'middle';\r\n toggleIcon.setAttributeNS(null, 'viewBox', '0 0 122.88 101.61');\r\n toggleIcon.classList.add('squeeze-icon');\r\n toggleIcon.innerHTML = `<g><path d=\"M15.28,46.33h30V4.44c0-2.45,1.99-4.44,4.44-4.44c2.45,0,4.44,1.99,4.44,4.44v92.72c0,2.45-1.99,4.44-4.44,4.44 c-2.45,0-4.44-1.99-4.44-4.44V55.21H15.07l15.15,15.28c1.72,1.73,1.72,4.54-0.02,6.26c-1.73,1.72-4.54,1.72-6.26-0.02L1.29,53.89 l0,0l-0.01-0.01c-0.05-0.05-0.09-0.09-0.13-0.14l-0.01-0.01l-0.06-0.07l-0.02-0.02l-0.05-0.06l-0.02-0.03l-0.02-0.02l-0.05-0.07 l0,0L0.87,53.4l-0.02-0.02l-0.01-0.02l-0.05-0.07l-0.01-0.02l-0.05-0.07l0,0l-0.04-0.07L0.66,53.1l-0.01-0.02l-0.04-0.07 l-0.01-0.02l-0.02-0.03l-0.04-0.06l0,0L0.5,52.82l-0.01-0.02l-0.04-0.08l0,0l-0.04-0.08L0.4,52.62l-0.03-0.06l-0.01-0.03L0.35,52.5 l-0.03-0.08L0.31,52.4l-0.03-0.08L0.27,52.3l-0.03-0.08l0-0.01c-0.02-0.06-0.04-0.13-0.06-0.19l0-0.01l-0.02-0.08l-0.01-0.02 l-0.01-0.02l-0.02-0.08l-0.02-0.1l0-0.01l-0.02-0.1l0-0.01l-0.01-0.07L0.06,51.5l0-0.02l-0.01-0.08l0-0.02l-0.01-0.08l0,0 L0.02,51.2l0-0.01l0-0.02l-0.01-0.08l0-0.01C0.01,51,0,50.93,0,50.87l0-0.01l0-0.09v-0.02l0-0.08l0-0.02l0-0.02l0-0.08l0-0.02 l0.01-0.08l0,0l0.01-0.09l0-0.01c0.01-0.1,0.02-0.21,0.04-0.31l0.02-0.09l0-0.02c0.02-0.1,0.04-0.2,0.07-0.3l0,0l0.02-0.08 l0.01-0.03l0.01-0.02l0.02-0.08l0.01-0.02l0.03-0.08l0.01-0.02l0.03-0.08l0-0.01c0.04-0.1,0.08-0.19,0.12-0.28l0.01-0.01 c0.03-0.06,0.06-0.12,0.09-0.17l0.01-0.02l0.01-0.02l0.04-0.07l0.01-0.02l0.04-0.07c0.03-0.05,0.06-0.11,0.1-0.16l0.02-0.03 l0.01-0.02l0.05-0.07l0-0.01c0.04-0.06,0.08-0.11,0.12-0.16l0.01-0.01L1,47.97v0l0.07-0.08l0.01-0.01l0.04-0.05l0.05-0.05l0,0 l0.06-0.06l0.02-0.02l0.06-0.06l0,0l0.01-0.01L23.97,25.4c1.74-1.71,4.55-1.69,6.26,0.05c1.71,1.74,1.69,4.55-0.05,6.26 L15.28,46.33L15.28,46.33z M67.86,4.44C67.86,1.99,69.85,0,72.3,0c2.45,0,4.44,1.99,4.44,4.44v41.89h30.86L92.7,31.72 c-1.74-1.71-1.77-4.52-0.05-6.26c1.71-1.74,4.52-1.77,6.26-0.05l22.65,22.21l0.01,0.01l0,0l0.06,0.06l0.02,0.02l0.06,0.06l0,0 l0.05,0.05l0.04,0.05l0.01,0.01l0.07,0.08v0l0.07,0.08l0.01,0.01c0.04,0.05,0.08,0.11,0.12,0.16l0,0.01l0.05,0.07l0.01,0.02 l0.02,0.03c0.03,0.05,0.07,0.11,0.1,0.16l0.04,0.07l0.01,0.02l0.04,0.07l0.01,0.02l0.01,0.02c0.03,0.06,0.06,0.12,0.09,0.17 l0.01,0.01c0.04,0.09,0.08,0.19,0.12,0.28l0,0.01l0.03,0.08l0.01,0.02l0.03,0.08l0.01,0.02l0.02,0.08l0.01,0.02l0.01,0.03 l0.02,0.08l0,0c0.03,0.1,0.05,0.2,0.07,0.3l0,0.02l0.02,0.09c0.02,0.1,0.03,0.21,0.04,0.31l0,0.01l0.01,0.09l0,0l0.01,0.08l0,0.02 l0,0.08l0,0.02l0,0.02l0,0.08v0.02l0,0.09l0,0.01c0,0.07,0,0.13-0.01,0.2l0,0.01l-0.01,0.08l0,0.02l0,0.01l-0.01,0.09l0,0 l-0.01,0.08l0,0.02l-0.01,0.08l0,0.02l-0.01,0.03l-0.01,0.07l0,0.01l-0.02,0.1l0,0.01l-0.02,0.1l-0.02,0.08l-0.01,0.02l-0.01,0.02 l-0.02,0.08l0,0.01c-0.02,0.06-0.04,0.13-0.06,0.19l0,0.01l-0.03,0.08l-0.01,0.02l-0.03,0.08l-0.01,0.02l-0.03,0.08l-0.01,0.02 l-0.01,0.03l-0.03,0.06l-0.01,0.02l-0.04,0.08l0,0l-0.04,0.08l-0.01,0.02l-0.04,0.07l0,0l-0.04,0.06l-0.02,0.03l-0.01,0.02 l-0.04,0.07l-0.01,0.02l-0.01,0.02l-0.04,0.07l0,0l-0.05,0.07l-0.01,0.02l-0.05,0.07l-0.01,0.02l-0.02,0.02l-0.05,0.06l0,0 l-0.05,0.07l-0.02,0.02l-0.02,0.03l-0.05,0.06l-0.02,0.02l-0.06,0.07l-0.01,0.01c-0.04,0.05-0.09,0.1-0.13,0.14l-0.01,0.01l0,0 L98.94,76.73c-1.72,1.73-4.53,1.74-6.26,0.02c-1.73-1.72-1.74-4.53-0.02-6.26l15.15-15.28H76.74v41.96c0,2.45-1.99,4.44-4.44,4.44 c-2.45,0-4.44-1.99-4.44-4.44V4.44L67.86,4.44z M122.16,48.35c0.03,0.05,0.07,0.11,0.1,0.16L122.16,48.35L122.16,48.35z\"></path></g>`;\r\n\r\n if (isPlaceholder) {\r\n toggleInput.disabled = true;\r\n toggleLabel.innerHTML += ' ' + sprintf(__('(<a href=\"%s\" target=\"_blank\">premium only</a>)', 'squeeze'), squeezeOptions.upgradeUrl);\r\n }\r\n\r\n toggleWrap.appendChild(toggleIcon);\r\n toggleWrap.appendChild(toggleInput);\r\n toggleWrap.appendChild(toggleLabel);\r\n\r\n return toggleWrap;\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./assets/js/script.js?"); |
| 40 | |
| 41 | /***/ }), |
| 42 | |
| 43 | /***/ "./assets/js/squeeze.js": |
| 44 | /*!******************************!*\ |
| 45 | !*** ./assets/js/squeeze.js ***! |
| 46 | \******************************/ |
| 47 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { |
| 48 | |
| 49 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SQUEEZE)\n/* harmony export */ });\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers.js */ \"./assets/js/helpers.js\");\n/* harmony import */ var browser_image_compression__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! browser-image-compression */ \"./node_modules/browser-image-compression/dist/browser-image-compression.mjs\");\n/* harmony import */ var _jsquash_webp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jsquash/webp */ \"./node_modules/@jsquash/webp/encode.js\");\n\n\n\n\n\n\nconst { __, sprintf } = wp.i18n; // Import __() from wp.i18n\n\nclass SQUEEZE {\n\n constructor(squeeze) {\n this.options = JSON.parse(squeeze.options); // plugin options\n this.nonce = squeeze.nonce; // nonce\n this.ajaxUrl = squeeze.ajaxUrl; // ajax url\n this.timeout = parseInt(this.options.timeout) * 1000; // convert to milliseconds\n this.poolSize = navigator.hardwareConcurrency || 1; // number of threads\n this.settingsPageUrl = squeeze.settingsPageUrl || ''; // settings page URL\n }\n\n /**\n * Returns true when `url` is on a different origin than the current page.\n * Used to detect images served from an external CDN (e.g. GCS, S3) so we can\n * proxy them through WordPress before passing to the Web Worker.\n */\n _isCrossOrigin = (url) => {\n if (!url) return false;\n try {\n return new URL(url, window.location.href).origin !== window.location.origin;\n } catch {\n return false;\n }\n }\n\n /**\n * Build a same-origin proxy URL for an attachment image.\n * The browser can fetch this without CORS errors; the PHP handler streams the\n * actual image (from local disk or from the provider) back to the browser.\n *\n * @param {number} attachmentId WordPress attachment post ID.\n * @param {string} size WP size name: 'original', 'full', or registered size.\n * @returns {string}\n */\n _buildProxyUrl = (attachmentId, size = 'original') => {\n return `${this.ajaxUrl}?action=squeeze_fetch_image` +\n `&attachment_id=${encodeURIComponent(attachmentId)}` +\n `&size=${encodeURIComponent(size)}` +\n `&_ajax_nonce=${encodeURIComponent(this.nonce)}`;\n }\n\n /**\n * For each size whose `url` is cross-origin, add a `fetchUrl` field pointing to\n * the same-origin proxy. The original `url` is kept so PHP can still derive the\n * correct filename. The worker will use `fetchUrl` for the actual fetch() call.\n *\n * @param {Object} sizes Sizes object from attachment data.\n * @param {number} attachmentId WordPress attachment post ID.\n * @returns {Object}\n */\n _proxySizes = (sizes, attachmentId) => {\n if (!sizes || !attachmentId) return sizes;\n const proxied = {};\n for (const [sizeName, sizeData] of Object.entries(sizes)) {\n proxied[sizeName] = { ...sizeData };\n if (sizeData?.url && this._isCrossOrigin(sizeData.url)) {\n proxied[sizeName].fetchUrl = this._buildProxyUrl(attachmentId, sizeName);\n }\n }\n return proxied;\n }\n\n handleCompress = async ( attachment, type = 'uncompressed' ) => {\n const attachmentData = attachment.attributes;\n const url = attachmentData?.originalImageURL ?? attachmentData.url;\n const mime = attachmentData.mime;\n const name = attachmentData.name;\n const filename = attachmentData?.originalImageName ?? attachmentData.filename;\n const attachmentID = attachmentData.id;\n const sizes = attachmentData.sizes;\n const format = mime.split(\"/\")[1];\n const sourceType = format;\n const outputType = format;\n const skipFull = attachmentData?.skipFull ?? attachmentData.originalImageName === undefined ? true : false;\n const timeout = this.timeout;\n const isPreview = attachmentData?.isPreview ?? false;\n const file = attachmentData?.file ?? null; // the original file, it passed for the newly uploaded attachment to compress it\n\n // the original compressed image base64, it passed when the attachment was already compressed and we need to compress thumbs only\n // we pass it in order to prevent re-compressing the original image when we need to compress thumbs only\n const base64Compressed = attachmentData?.base64Compressed ?? null; \n const base64WebpCompressed = attachmentData?.base64WebpCompressed ?? null; // the original compressed webp image base64\n\n // When the image is served from a cross-origin CDN (e.g. WP Offload Media → GCS/S3),\n // the worker's fetch() call would be blocked by CORS. We compute a same-origin proxy\n // URL and pass it alongside the original URL. The worker fetches from fetchUrl; the\n // original url is kept so PHP can still determine the correct filename.\n const fetchUrl = !file && this._isCrossOrigin(url) && attachmentID\n ? this._buildProxyUrl(attachmentID, 'original')\n : undefined;\n const workerSizes = this._proxySizes(sizes, attachmentID);\n\n const worker = new Worker(new URL(/* worker import */ __webpack_require__.p + __webpack_require__.u(\"assets_js_worker_js\"), __webpack_require__.b), {type: undefined}); // worker url\n const channel = new MessageChannel();\n worker.postMessage({\n action: 'compress',\n format,\n url,\n fetchUrl,\n name,\n sourceType,\n outputType,\n mime,\n sizes: workerSizes,\n skipFull,\n timeout,\n isPreview,\n file,\n base64Compressed,\n base64WebpCompressed,\n type,\n options: this.options,\n //urlOriginal: urlOriginal,\n }, [channel.port2]);\n\n // Listen for compression requests from the worker via port1\n channel.port1.onmessage = async (ev) => {\n //console.log(\"Worker received compression request:\", ev.data);\n const { id, action, fileOrArrayBuffer, mime, options } = ev.data;\n if (action !== 'imageCompression') return;\n\n try {\n // Accept ArrayBuffer or Blob\n const blob = (fileOrArrayBuffer instanceof ArrayBuffer)\n ? new Blob([this.toUint8Array(fileOrArrayBuffer)], { type: mime })\n : fileOrArrayBuffer;\n\n const compressedBlob = await (0,browser_image_compression__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(blob, { useWebWorker: true, ...(options || {}) });\n\n // quick checks\n //console.log('compressedBlob.type, size:', compressedBlob.type, compressedBlob.size);\n // normalize final binary\n const compressedArrayBuffer = await compressedBlob.arrayBuffer();\n\n // Reply with the compressed ArrayBuffer (transfer to avoid copy)\n channel.port1.postMessage({ id, ok: true, arrayBuffer: compressedArrayBuffer }, [compressedArrayBuffer]);\n } catch (err) {\n channel.port1.postMessage({ id, ok: false, error: err.message || String(err) });\n }\n }\n\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n worker.terminate();\n console.warn('Worker compress terminated', name, sourceType, outputType);\n reject(sprintf('😩 ' + __('Request timed out. Try to increase the timeout limit on the Squeeze <a target=\"_blank\" href=\"%s\">settings page</a>.', 'squeeze'), `${this.settingsPageUrl}#:~:text=Squeeze%20timeout`));\n }, timeout);\n\n worker.onmessage = (event) => {\n clearTimeout(timeoutId);\n if (event.data.error) {\n reject(event.data.error);\n } else {\n resolve(event.data);\n }\n worker.terminate();\n };\n\n worker.onerror = (error) => {\n clearTimeout(timeoutId);\n reject(`Worker error: ${error.message}`);\n };\n });\n\n }\n\n handleUpload = async ({ attachment, base64, type = 'uncompressed', mediaIDs = [] }) => {\n\n const attachmentData = attachment.attributes;\n const url = attachmentData?.originalImageURL ?? attachmentData.url;\n const mime = attachmentData.mime;\n const filename = attachmentData?.originalImageName ?? attachmentData.filename;\n const attachmentID = attachmentData.id;\n const format = base64?.isDirectWebp ? 'webp' : mime.split(\"/\")[1];\n const sizes = attachmentData.sizes;\n\n const isDirectWebp = base64?.isDirectWebp && mime !== 'image/webp';\n const isBackupOriginal = this.options?.backup_original ?? false; // check if backup original is enabled\n let originalFile = attachmentData?.originalFile ?? null; // the original file, used for creating backup\n \n // if originalFile is not provided, try to get it from the URL\n // used when the attachment needs to be converted to webp from jpg or png\n if (!originalFile && type !== 'path' && isBackupOriginal && isDirectWebp) {\n // Use proxy URL when the image is served from a cross-origin CDN (e.g. WP Offload Media).\n const fetchUrlForOriginal = this._isCrossOrigin(url) && attachmentID\n ? this._buildProxyUrl(attachmentID, 'original')\n : url;\n const file = await (0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.getFileFromUrl)(fetchUrlForOriginal, filename, mime.split(\"/\")[1])\n //console.log('conveting original file to webp', file);\n originalFile = await this.convertFileToWebp(file);\n }\n //console.log('handleUpload attachmentData', attachmentData)\n\n const data = {\n action: 'squeeze_update_attachment',\n _ajax_nonce: this.nonce,\n filename: filename,\n type: 'image',\n format: format,\n base64: base64.base64,\n base64Sizes: base64.base64Sizes,\n base64Webp: base64.base64Webp,\n base64SizesWebp: base64.base64SizesWebp,\n \n attachmentID: attachmentID,\n url: url,\n process: type,\n originalFile: originalFile,\n }\n\n const formData = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.objectToFormData)(data);\n\n //console.log('squeeze_update_attachment', JSON.stringify(data, null, 2));\n\n try {\n const uploadResponse = await jQuery.ajax({\n url: this.ajaxUrl, // + '111',\n type: 'POST',\n data: formData,\n processData: false, // very important!\n contentType: false, // very important!\n });\n\n //if (uploadResponse.success) {\n uploadResponse['mediaIDs'] = mediaIDs;\n //}\n\n if (!uploadResponse?.data?.url) {\n uploadResponse.url = url; // fallback to original URL if not provided\n }\n\n //console.log('uploadResponse', JSON.stringify(uploadResponse, null, 2));\n\n return uploadResponse;\n \n } catch (error) {\n // jQuery.ajax rejects with a jqXHR object on HTTP errors, not a plain Error.\n // Extract a human-readable message so callers never receive [object Object].\n let errorMessage;\n if (error && typeof error === 'object' && typeof error.status === 'number') {\n if (error.status === 413) {\n errorMessage = __('The compressed image payload is too large for the server to accept (HTTP 413). Please ask your host to raise the post_max_size PHP setting and, for nginx, the client_max_body_size directive.', 'squeeze');\n } else {\n errorMessage = sprintf(\n /* translators: 1: HTTP status code, 2: HTTP status text */\n __('Upload failed with HTTP %1$d: %2$s', 'squeeze'),\n error.status,\n error.statusText ?? ''\n );\n }\n } else {\n errorMessage = error?.message ?? String(error);\n }\n\n return {\n 'mediaIDs': mediaIDs,\n 'data': errorMessage,\n 'success': false\n };\n }\n\n }\n\n handleBulkUpload = async (type = 'uncompressed', mediaIDs = []) => {\n let currentID;\n let attachment;\n\n switch (type) {\n case 'all':\n case 'uncompressed':\n currentID = mediaIDs[0];\n break;\n case 'path':\n currentID = mediaIDs[0]?.filename;\n break;\n default:\n currentID = 0;\n break;\n }\n\n if (type === 'path') {\n\n \n\n attachment = {\n attributes: {\n url: mediaIDs[0].url,\n mime: mediaIDs[0].mime,\n name: mediaIDs[0].name,\n filename: mediaIDs[0].filename,\n id: mediaIDs[0].id,\n sizes: mediaIDs[0]?.sizes,\n }\n }\n\n } else {\n\n const attachmentResponse = await this.getAttachment(currentID); \n if (attachmentResponse.success === false) {\n if (Array.isArray(mediaIDs)) mediaIDs.shift();\n return {\n 'mediaIDs': mediaIDs,\n 'data': attachmentResponse.data\n }\n }\n const attachmentData = attachmentResponse.data;\n attachment = {\n attributes: {\n url: attachmentData.url,\n mime: attachmentData.mime,\n name: attachmentData.name,\n filename: attachmentData.filename,\n id: attachmentData.id,\n sizes: attachmentData.sizes,\n }\n }\n\n }\n\n if (Array.isArray(mediaIDs)) mediaIDs.shift();\n\n const mediaType = attachment.attributes.mime.split(\"/\")[0];\n const mediaSubType = attachment.attributes.mime.split(\"/\")[1];\n\n if (!(0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.maybeCompressAttachment)(mediaType, mediaSubType)) {\n return {\n 'mediaIDs': mediaIDs,\n 'data': __('Skipped: the image is broken or its format is not supported or excluded from squeezing.', 'squeeze')\n }\n }\n\n try {\n const compressData = await this.handleCompress( attachment, type );\n const uploadData = await this.handleUpload({ attachment: attachment, base64: compressData, type: type, mediaIDs: mediaIDs })\n\n return uploadData;\n\n } catch (error) {\n return {\n 'mediaIDs': mediaIDs,\n 'data': error?.message ?? error,\n 'success': false\n }\n }\n\n }\n\n \n\n handleRestore = async (attachmentID) => {\n const data = {\n action: 'squeeze_restore_attachment',\n _ajax_nonce: this.nonce,\n attachmentID: attachmentID,\n };\n\n const response = await jQuery.ajax({\n url: this.ajaxUrl,\n type: 'POST',\n data: data,\n });\n\n return response;\n };\n\n // Get list of attachments by path\n getAttachmentsByPath = async (path) => {\n\n const data = {\n action: 'squeeze_get_attachment_by_path',\n path: path,\n _ajax_nonce: this.nonce,\n }\n\n const response = jQuery.ajax({\n url: this.ajaxUrl,\n type: 'POST',\n data: data,\n });\n\n return response;\n }\n\n getAttachment = async (attachmentID) => {\n const data = {\n action: 'squeeze_get_attachment',\n _ajax_nonce: this.nonce,\n attachmentID: attachmentID,\n }\n\n const response = jQuery.ajax({\n url: this.ajaxUrl,\n type: 'POST',\n data: data,\n });\n\n return response;\n }\n\n getNextAttachments = async (page = 1, type = 'uncompressed', lastId = 0) => {\n const data = {\n action: 'squeeze_get_next_attachments',\n _ajax_nonce: this.nonce,\n page: page,\n type: type,\n lastId: lastId,\n }\n\n const response = jQuery.ajax({\n url: this.ajaxUrl,\n type: 'POST',\n data: data,\n });\n\n return response;\n }\n\n getDirectories = async (parentDir = false) => {\n const data = {\n action: 'squeeze_get_directories',\n _ajax_nonce: this.nonce,\n }\n\n if (parentDir) {\n data['parentDir'] = parentDir;\n }\n\n const response = jQuery.ajax({\n url: this.ajaxUrl,\n type: 'POST',\n data: data,\n });\n\n return response;\n }\n\n \n\n setOptions = async (options) => {\n const data = {\n action: 'squeeze_set_options',\n _ajax_nonce: this.nonce,\n options: options,\n }\n\n const response = jQuery.ajax({\n url: this.ajaxUrl,\n type: 'POST',\n data: data,\n });\n\n return response;\n }\n\n /**\n * Compresses an image before upload.\n * If the compressSizes parameter is provided, it will compress the sizes specified along with the original image.\n * \n * @param {File} file - The file to be compressed\n * @param {object} compressSizes - Optional sizes for compression\n * @returns {Promise<object|boolean>} - Returns a Promise that resolves to the compressed file as a base64 object or false if the file is invalid\n */\n compressBeforeUpload = async (file, compressSizes = null) => {\n if (!(file instanceof Blob) && !(file instanceof File) && (file.constructor.name !== 'File')) {\n console.error('Invalid file type:', file);\n return false; // Return false if the file is not a Blob or File\n }\n\n const attachment = {\n attributes: {\n url: null,\n mime: file.type,\n name: file.name,\n filename: file.name,\n id: 0,\n sizes: compressSizes,\n file: file,\n skipFull: false,\n }\n }\n\n try {\n const base64Obj = await this.handleCompress(attachment);\n\n return base64Obj; // Return the compressed file as base64Obj\n } catch (error) {\n console.error(error);\n return error; // Return the error for further handling\n }\n }\n\n isWebpEncodingSupported = async () => {\n try {\n const canvas = document.createElement('canvas');\n if (!canvas.toDataURL) return false;\n const data = canvas.toDataURL('image/webp');\n // WebP signature starts with \"data:image/webp\"\n return data.indexOf('data:image/webp') === 0;\n } catch (e) {\n return false;\n }\n }\n\n handleConvertFileToWebp = async (args) => {\n const timeout = this.timeout;\n \n const { file, sourceType, name } = args;\n const fileBuffer = await file.arrayBuffer();\n const mime = sourceType === 'png' ? 'image/png' : 'image/jpeg';\n const inputBlob = new Blob([fileBuffer], { type: mime });\n // compression options you can tune\n const imageCompressionOptions = {\n useWebWorker: true,\n fileType: 'image/webp',\n };\n\n return new Promise(async (resolve, reject) => {\n const timeoutId = setTimeout(() => {\n console.warn('Worker convertToWebp terminated', name);\n reject(new Error(sprintf('😩 ' + __('Request timed out. Try to increase the timeout limit on the Squeeze <a target=\"_blank\" href=\"%s\">settings page</a>.', 'squeeze'), `${this.settingsPageUrl}#:~:text=Squeeze%20timeout`)));\n }, timeout);\n\n try {\n\n const compressedBlob = await (0,browser_image_compression__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(inputBlob, imageCompressionOptions);\n\n // quick checks\n //console.log('compressedBlob.type, size:', compressedBlob.type, compressedBlob.size);\n // normalize final binary\n const webpArrayBuffer = await compressedBlob.arrayBuffer();\n\n const webpName = name.replace(/\\.\\w+$/, '.webp');\n const webpFile = new File([webpArrayBuffer], webpName, { type: 'image/webp', lastModified: Date.now() });\n\n clearTimeout(timeoutId);\n resolve({ webpFile }); // must return object with webpFile prop\n } catch (error) {\n clearTimeout(timeoutId);\n console.error('Error during image processing:', error);\n reject(error);\n }\n });\n \n }\n\n // helper: normalize buffer-like inputs to Uint8Array\n toUint8Array = (bufferLike) => {\n if (bufferLike instanceof Uint8Array) return bufferLike;\n if (bufferLike instanceof ArrayBuffer) return new Uint8Array(bufferLike);\n if (ArrayBuffer.isView(bufferLike)) return new Uint8Array(bufferLike.buffer, bufferLike.byteOffset, bufferLike.byteLength);\n // Node Buffer (in some environments) has .buffer and .byteOffset\n if (bufferLike && typeof bufferLike === 'object' && bufferLike.buffer) {\n return new Uint8Array(bufferLike.buffer, bufferLike.byteOffset || 0, bufferLike.byteLength || bufferLike.length);\n }\n throw new Error('Unsupported buffer type: ' + Object.prototype.toString.call(bufferLike));\n }\n\n /**\n * Convert an image File to WebP.\n *\n * @param {File} inputFile — the original image File (e.g. JPEG, PNG).\n * @returns {Promise<File>} — a Promise that resolves to a WebP File.\n */\n convertFileToWebp = async (inputFile) => {\n // Ensure it’s an image\n if (!inputFile.type.startsWith('image/')) {\n throw new Error('Input must be an image File');\n }\n if (this.isCanvasExtractionBlocked()) {\n console.warn('Canvas extraction is blocked');\n // Handle the case where canvas extraction is blocked\n alert(__('Image conversion blocked by browser privacy setting', 'squeeze'));\n throw new Error('Canvas extraction is blocked');\n } else {\n console.log('Canvas extraction is allowed');\n }\n const args = {\n file: inputFile,\n sourceType: inputFile.type.split('/')[1], // e.g. 'jpeg', 'png'\n name: inputFile.name,\n }\n const webpSupported = await this.isWebpEncodingSupported();\n try {\n // Convert the image to WebP\n let webpData;\n if (webpSupported) {\n //console.log('WebP decoding is supported');\n webpData = await this.handleConvertFileToWebp(args);\n } else {\n console.warn('WebP encoding not supported on this device. Using original format instead.');\n const webpName = args.name.replace(/\\.\\w+$/, '.webp');\n webpData = await this.convertToWebpWithJsquash(inputFile, webpName);\n }\n if (!webpData || !webpData.webpFile) {\n throw new Error('Failed to convert image to WebP');\n }\n\n return webpData.webpFile; // Return the WebP File\n\n } catch (error) {\n console.error('Error converting image to WebP:', error);\n throw error; // Re-throw the error for further handling\n }\n\n }\n\n /**\n * Convert an input (File | Blob | ArrayBuffer | Uint8Array) to a WebP File using @jsquash/webp.\n * @param {File|Blob|ArrayBuffer|Uint8Array} input\n * @param {string} outputName - desired filename for the .webp output\n * @param {{quality?: number, lossless?: boolean, method?: number}} [opts] - encoder options (quality 0-100)\n * @returns {Promise<File>} - WebP File\n */\n convertToWebpWithJsquash = async (input, outputName = 'out.webp', opts = { quality: 100 }) => {\n // Normalize input to Blob\n let blob;\n if (input instanceof Blob) {\n blob = input;\n } else if (input instanceof ArrayBuffer || ArrayBuffer.isView(input)) {\n blob = new Blob([input]);\n } else {\n throw new Error('Unsupported input type. Provide File, Blob, ArrayBuffer or TypedArray.');\n }\n\n // Load image into <img>\n const dataURL = await new Promise((resolve, reject) => {\n const fr = new FileReader();\n fr.onload = () => resolve(fr.result);\n fr.onerror = reject;\n fr.readAsDataURL(blob);\n });\n\n const img = await new Promise((resolve, reject) => {\n const i = new Image();\n i.onload = () => resolve(i);\n i.onerror = () => reject(new Error('Failed to load image for conversion'));\n i.src = dataURL;\n // avoid cross-origin taint if data-url is used\n });\n\n // Draw to canvas and extract ImageData\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth || img.width;\n canvas.height = img.naturalHeight || img.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0);\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n\n // encode -> returns ArrayBuffer (WASM libwebp)\n // opts example: { quality: 75, lossless: false, method: 4 }\n const webpArrayBuffer = await (0,_jsquash_webp__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(imageData, opts);\n\n // Validate a little (size)\n if (!webpArrayBuffer || webpArrayBuffer.byteLength < 20) {\n throw new Error('jsquash produced an invalid WebP buffer');\n }\n\n // Wrap into File\n const webpFile = new File([webpArrayBuffer], outputName.replace(/\\.\\w+$/, '.webp'), {\n type: 'image/webp',\n lastModified: Date.now(),\n });\n\n return {webpFile};\n }\n\n isCanvasExtractionBlocked = () => {\n try {\n const c = document.createElement('canvas');\n c.width = 2;\n c.height = 2;\n const ctx = c.getContext('2d');\n if (!ctx) return false; // no ctx => treat as not-blocked here (or handle separately)\n\n // draw four known opaque pixels (no alpha surprise)\n ctx.fillStyle = 'rgb(255,0,0)'; // top-left\n ctx.fillRect(0, 0, 1, 1);\n\n ctx.fillStyle = 'rgb(0,255,0)'; // top-right\n ctx.fillRect(1, 0, 1, 1);\n\n ctx.fillStyle = 'rgb(0,0,255)'; // bottom-left\n ctx.fillRect(0, 1, 1, 1);\n\n ctx.fillStyle = 'rgb(1,2,3)'; // bottom-right (small values detect naive normalization)\n ctx.fillRect(1, 1, 1, 1);\n\n let data;\n try {\n data = ctx.getImageData(0, 0, 2, 2).data; // Uint8ClampedArray length 16 (4*2*2)\n } catch (err) {\n // thrown security/blocked error (Firefox/resistFingerprinting sometimes throws)\n if (err && (err.name === 'SecurityError' || /blocked/i.test(err.message))) return true;\n // other errors: be conservative and return false\n return false;\n }\n\n // Expected RGBA order for pixels (top-left, top-right, bottom-left, bottom-right)\n const expected = new Uint8ClampedArray([\n 255, 0, 0, 255, // top-left\n 0, 255, 0, 255, // top-right\n 0, 0, 255, 255, // bottom-left\n 1, 2, 3, 255 // bottom-right\n ]);\n\n // Compare each channel exactly. If ANY mismatch — canvas data was altered.\n for (let i = 0; i < expected.length; i++) {\n if (data[i] !== expected[i]) {\n // mismatch -> either fingerprint-protection normalized the canvas OR something else tainted it\n return true;\n }\n }\n\n // No thrown error and pixels match exactly => extraction works\n return false;\n } catch (e) {\n // If something unexpected goes wrong, assume not blocked so caller can handle fallback.\n return false;\n }\n }\n\n\n}\n\n//# sourceURL=webpack:///./assets/js/squeeze.js?"); |
| 50 | |
| 51 | /***/ }), |
| 52 | |
| 53 | /***/ "./assets/js/voxel-upload-compat.js": |
| 54 | /*!******************************************!*\ |
| 55 | !*** ./assets/js/voxel-upload-compat.js ***! |
| 56 | \******************************************/ |
| 57 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { |
| 58 | |
| 59 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"initVoxelUploadCompat\": () => (/* binding */ initVoxelUploadCompat)\n/* harmony export */ });\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers.js */ \"./assets/js/helpers.js\");\n\r\n\r\n\r\n\r\n/** One successful patch per JS realm (per window / iframe). */\r\nconst PATCHED_KEY = \"__squeezeVoxelCompatPatched\";\r\n\r\nconst LOG_PREFIX = \"[Squeeze · Voxel]\";\r\n\r\nfunction vxLog(...args) {\r\n\tconsole.info(LOG_PREFIX, ...args);\r\n}\r\n\r\nfunction vxWarn(...args) {\r\n\tconsole.warn(LOG_PREFIX, ...args);\r\n}\r\n\r\n/**\r\n * FormData from another window fails `instanceof FormData` in this window.\r\n *\r\n * @param {unknown} body\r\n * @returns {body is FormData}\r\n */\r\nfunction isFormDataLike(body) {\r\n\tif (body == null || typeof body !== \"object\") {\r\n\t\treturn false;\r\n\t}\r\n\tif (typeof FormData !== \"undefined\" && body instanceof FormData) {\r\n\t\treturn true;\r\n\t}\r\n\tconst o = /** @type {{ append?: unknown; entries?: unknown; delete?: unknown }} */ (body);\r\n\treturn (\r\n\t\ttypeof o.append === \"function\" &&\r\n\t\ttypeof o.entries === \"function\" &&\r\n\t\ttypeof o.delete === \"function\"\r\n\t);\r\n}\r\n\r\n/**\r\n * jQuery / some stacks pass a URL object to xhr.open(); we must not treat that as \"\".\r\n *\r\n * @param {unknown} url\r\n * @returns {string}\r\n */\r\nfunction normalizeOpenUrl(url) {\r\n\tif (typeof url === \"string\") {\r\n\t\treturn url;\r\n\t}\r\n\tif (url && typeof url === \"object\" && \"href\" in url) {\r\n\t\treturn String(/** @type {{ href: string }} */ (url).href);\r\n\t}\r\n\treturn String(url ?? \"\");\r\n}\r\n\r\n/**\r\n * URLs where Voxel may POST multipart `files[field][]` (create / edit post with uploads).\r\n * Do not match generic admin-ajax.php (heartbeat, etc.) — that only adds noise and work.\r\n *\r\n * @param {string} url\r\n * @returns {boolean}\r\n */\r\nfunction looksLikeVoxelMultipartTarget(url) {\r\n\tconst s = String(url || \"\");\r\n\tif (!s) {\r\n\t\treturn false;\r\n\t}\r\n\t// Primary Voxel front-end AJAX: …?vx=1&action=…\r\n\tif (/[?&]vx=1(?:&|$)/.test(s)) {\r\n\t\treturn true;\r\n\t}\r\n\ttry {\r\n\t\tif (new URL(s, window.location.href).searchParams.get(\"vx\") === \"1\") {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t} catch (e) {\r\n\t\t/* ignore */\r\n\t}\r\n\t// Rare: create_post via admin-ajax with multipart (not the usual Voxel ?vx=1 endpoint)\r\n\tif (s.includes(\"admin-ajax.php\") && /[?&]action=create_post/.test(s)) {\r\n\t\treturn true;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n/**\r\n * @param {FormData | { entries: () => IterableIterator<[string, FormDataEntryValue]> }} formData\r\n * @returns {Array<[string, FormDataEntryValue]>}\r\n */\r\nfunction snapshotFormDataEntries(formData) {\r\n\treturn [...formData.entries()];\r\n}\r\n\r\n/**\r\n * True for File/Blob-like values that look like images (cross-realm safe).\r\n *\r\n * @param {unknown} v\r\n * @returns {boolean}\r\n */\r\nfunction isImageFileLike(v) {\r\n\tif (v == null || typeof v !== \"object\") {\r\n\t\treturn false;\r\n\t}\r\n\tconst any = /** @type {{ name?: string; type?: string; size?: number }} */ (v);\r\n\tif (typeof any.size !== \"number\") {\r\n\t\treturn false;\r\n\t}\r\n\tconst type = typeof any.type === \"string\" ? any.type : \"\";\r\n\tif (type.startsWith(\"image/\")) {\r\n\t\treturn true;\r\n\t}\r\n\tif (type === \"\" && typeof any.name === \"string\" && /\\.(jpe?g|png|gif|webp|avif)$/i.test(any.name)) {\r\n\t\treturn true;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n/**\r\n * @param {File | Blob} v\r\n * @param {string} key FormData key (for fallback filename)\r\n * @returns {File}\r\n */\r\nfunction ensureFileForCompression(v, key) {\r\n\tif (typeof File !== \"undefined\" && v instanceof File) {\r\n\t\treturn v;\r\n\t}\r\n\tconst name =\r\n\t\t(\"name\" in v && typeof /** @type {File} */ (v).name === \"string\" && /** @type {File} */ (v).name)\r\n\t\t\t? /** @type {File} */ (v).name\r\n\t\t\t: `upload-${key.replace(/[^\\w.-]+/g, \"_\")}.jpg`;\r\n\tconst type = v.type && v.type.length ? v.type : \"image/jpeg\";\r\n\treturn new File([v], name, { type });\r\n}\r\n\r\n/**\r\n * @param {Array<[string, FormDataEntryValue]>} entries\r\n */\r\nfunction formDataHasVoxelImageFiles(entries) {\r\n\treturn entries.some(([k, v]) => /^files\\[/i.test(k) && isImageFileLike(v));\r\n}\r\n\r\n/**\r\n * Compress a single image file when Squeeze on-upload rules allow it.\r\n *\r\n * @param {File} fileValue\r\n * @param {string} key FormData key or diagnostic label\r\n * @param {Record<string, unknown>} compressOptions\r\n * @param {object} squeeze window.Squeeze\r\n * @returns {Promise<{ out: File; metaSignal: boolean }>}\r\n */\r\nasync function compressOneVoxelImageIfNeeded(fileValue, key, compressOptions, squeeze) {\r\n\tconst { type, subtype } = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.parseMimeType)(fileValue);\r\n\tif (!(0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.maybeCompressAttachment)(type, subtype, compressOptions)) {\r\n\t\tvxLog(\"file skipped (format/settings):\", fileValue.name, fileValue.type);\r\n\t\treturn { out: fileValue, metaSignal: false };\r\n\t}\r\n\r\n\tif (typeof squeeze.isExcludedByName === \"function\") {\r\n\t\ttry {\r\n\t\t\tif (await squeeze.isExcludedByName(fileValue.name)) {\r\n\t\t\t\tvxLog(\"file skipped (exclusion list):\", fileValue.name);\r\n\t\t\t\treturn { out: fileValue, metaSignal: false };\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\tvxWarn(\"exclude check failed; continuing with compression:\", fileValue.name, e);\r\n\t\t}\r\n\t}\r\n\r\n\tconst inBytes = fileValue.size;\r\n\ttry {\r\n\t\tvxLog(\"compressing:\", fileValue.name, `(${inBytes} B in)`);\r\n\t\tconst t0 = performance.now();\r\n\t\tconst base64Obj = await squeeze.compressBeforeUpload(fileValue);\r\n\t\tif (!base64Obj?.base64) {\r\n\t\t\tvxWarn(\"compress returned no data; using original:\", fileValue.name);\r\n\t\t\treturn { out: fileValue, metaSignal: false };\r\n\t\t}\r\n\t\tconst outFile = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.base64ToFile)(base64Obj.base64, fileValue.name, fileValue.type);\r\n\t\tconst ms = Math.round(performance.now() - t0);\r\n\t\tif (outFile.size > inBytes) {\r\n\t\t\tvxLog(\"compressed larger than original; using original:\", fileValue.name, `(${inBytes} B vs ${outFile.size} B in ${ms} ms)`);\r\n\t\t\treturn { out: fileValue, metaSignal: false };\r\n\t\t}\r\n\t\tvxLog(\"compressed:\", fileValue.name, `(${inBytes} B → ${outFile.size} B in ${ms} ms)`);\r\n\t\treturn { out: outFile, metaSignal: true };\r\n\t} catch (e) {\r\n\t\tvxWarn(\"compress failed; using original:\", fileValue.name, e);\r\n\t\treturn { out: fileValue, metaSignal: false };\r\n\t}\r\n}\r\n\r\n/**\r\n * Append signed markers so PHP can set squeeze_is_compressed on new attachments (Voxel bypasses wp AJAX squeeze).\r\n *\r\n * @param {FormData} newFd\r\n * @param {boolean} metaSignal\r\n * @param {object | null} squeeze\r\n */\r\nfunction appendVoxelClientCompressedMarkers(newFd, metaSignal, squeeze) {\r\n\tif (!metaSignal || !squeeze?.nonce) {\r\n\t\treturn;\r\n\t}\r\n\tnewFd.append(\"_squeeze_voxel_client\", \"1\");\r\n\tnewFd.append(\"_squeeze_voxel_nonce\", String(squeeze.nonce));\r\n}\r\n\r\nfunction logFormDataDiag(reqUrl, entries) {\r\n\tconst rows = entries.map(([k, v]) => {\r\n\t\tif (v == null) {\r\n\t\t\treturn { key: k, kind: \"null\" };\r\n\t\t}\r\n\t\tif (typeof v === \"string\") {\r\n\t\t\treturn { key: k, kind: \"string\", len: v.length };\r\n\t\t}\r\n\t\tif (typeof File !== \"undefined\" && v instanceof File) {\r\n\t\t\treturn { key: k, kind: \"File\", name: v.name, type: v.type, size: v.size };\r\n\t\t}\r\n\t\tif (typeof Blob !== \"undefined\" && v instanceof Blob) {\r\n\t\t\treturn { key: k, kind: \"Blob\", type: v.type, size: v.size };\r\n\t\t}\r\n\t\treturn { key: k, kind: typeof v };\r\n\t});\r\n\tvxLog(\"FormData POST (diagnostic — no image entries under files[…] matched for squeeze)\", {\r\n\t\turl: reqUrl,\r\n\t\tentries: rows,\r\n\t});\r\n}\r\n\r\n/**\r\n * Observe jQuery AJAX (same path Voxel create-post uses) — helps if XHR prototype behaves unexpectedly.\r\n *\r\n * @param {typeof looksLikeVoxelMultipartTarget} urlTest\r\n */\r\nfunction installJQueryVoxelProbe(urlTest) {\r\n\tconst $ = window.jQuery;\r\n\tif (!$ || /** @type {{ __squeezeVoxelAjaxProbe?: boolean }} */ ($).__squeezeVoxelAjaxProbe) {\r\n\t\treturn;\r\n\t}\r\n\t/** @type {{ __squeezeVoxelAjaxProbe?: boolean }} */ ($).__squeezeVoxelAjaxProbe = true;\r\n\r\n\t$(document).ajaxSend((_event, _jqXHR, settings) => {\r\n\t\tconst u = String(settings.url || \"\");\r\n\t\tif (!urlTest(u)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst d = settings.data;\r\n\t\tconst formLike = isFormDataLike(d);\r\n\t\tvxLog(\"jQuery ajaxSend (Voxel multipart)\", {\r\n\t\t\turl: u,\r\n\t\t\tdataIsFormDataLike: formLike,\r\n\t\t\tdataType: d == null ? \"null\" : typeof d,\r\n\t\t\tconstructor: d && d.constructor && d.constructor.name,\r\n\t\t});\r\n\t\tif (formLike) {\r\n\t\t\ttry {\r\n\t\t\t\tconst snap = snapshotFormDataEntries(/** @type {FormData} */ (d));\r\n\t\t\t\tvxLog(\"jQuery FormData snapshot\", snap.map(([k, v]) => ({\r\n\t\t\t\t\tkey: k,\r\n\t\t\t\t\tkind: v instanceof File ? \"File\" : v instanceof Blob ? \"Blob\" : typeof v,\r\n\t\t\t\t\tname: v && /** @type {File} */ (v).name,\r\n\t\t\t\t\ttype: v && /** @type {Blob} */ (v).type,\r\n\t\t\t\t\tsize: v && /** @type {Blob} */ (v).size,\r\n\t\t\t\t})));\r\n\t\t\t} catch (e) {\r\n\t\t\t\tvxWarn(\"jQuery FormData snapshot failed\", e);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\tvxLog(\"jQuery ajaxSend probe installed (Voxel multipart URLs only).\");\r\n}\r\n\r\n/**\r\n * Voxel file/gallery fields POST multipart FormData (files[field_key][]) to the Voxel AJAX URL,\r\n * bypassing wp.Uploader. Mirror Squeeze \"on upload\" behaviour by compressing image Files\r\n * before the request body is sent.\r\n *\r\n * @param {Record<string, unknown>} compressOptions Parsed squeezeOptions.options\r\n */\r\nfunction initVoxelUploadCompat(compressOptions) {\r\n\tif (typeof window === \"undefined\") {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst protoEarly = window.XMLHttpRequest?.prototype;\r\n\tif (protoEarly && /** @type {{ [k: string]: boolean }} */ (protoEarly)[PATCHED_KEY]) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (typeof Voxel_Config === \"undefined\") {\r\n\t\tvxLog(\"compat skipped: Voxel_Config is undefined (not a Voxel page or config not printed yet).\");\r\n\t\treturn;\r\n\t}\r\n\tif (!compressOptions?.auto_compress) {\r\n\t\tvxLog(\"compat skipped: Squeeze on upload (auto_compress) is off in settings.\");\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst XHR = window.XMLHttpRequest;\r\n\tconst proto = XHR && XHR.prototype;\r\n\tif (!proto) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst ajaxUrl = Voxel_Config.ajax_url || \"\";\r\n\tvxLog(\"init\", { auto_compress: !!compressOptions.auto_compress, voxel_ajax_url: ajaxUrl });\r\n\r\n\tconst origOpen = proto.open;\r\n\tconst origSend = proto.send;\r\n\r\n\t/** @type {{ [k: string]: boolean }} */ (proto)[PATCHED_KEY] = true;\r\n\r\n\tproto.open = function (method, url, ...rest) {\r\n\t\tthis.__squeezeRequestUrl = normalizeOpenUrl(url);\r\n\t\treturn origOpen.call(this, method, url, ...rest);\r\n\t};\r\n\r\n\tproto.send = function (body) {\r\n\t\tconst xhr = this;\r\n\t\tconst reqUrl = xhr.__squeezeRequestUrl || \"\";\r\n\r\n\t\tif (!isFormDataLike(body)) {\r\n\t\t\treturn origSend.call(xhr, body);\r\n\t\t}\r\n\r\n\t\tif (!looksLikeVoxelMultipartTarget(reqUrl)) {\r\n\t\t\treturn origSend.call(xhr, body);\r\n\t\t}\r\n\r\n\t\tconst squeeze = window.Squeeze;\r\n\t\tif (!squeeze || typeof squeeze.compressBeforeUpload !== \"function\") {\r\n\t\t\tvxWarn(\"XHR FormData-like body to Voxel AJAX but window.Squeeze.compressBeforeUpload missing; upload unchanged.\");\r\n\t\t\treturn origSend.call(xhr, body);\r\n\t\t}\r\n\r\n\t\tlet snapshot;\r\n\t\ttry {\r\n\t\t\tsnapshot = snapshotFormDataEntries(/** @type {FormData} */ (body));\r\n\t\t} catch (e) {\r\n\t\t\tvxWarn(\"FormData.entries() failed; upload unchanged.\", e);\r\n\t\t\treturn origSend.call(xhr, body);\r\n\t\t}\r\n\r\n\t\tif (!formDataHasVoxelImageFiles(snapshot)) {\r\n\t\t\tif (looksLikeVoxelMultipartTarget(reqUrl)) {\r\n\t\t\t\tlogFormDataDiag(reqUrl, snapshot);\r\n\t\t\t}\r\n\t\t\treturn origSend.call(xhr, body);\r\n\t\t}\r\n\r\n\t\tvxLog(\"XHR intercept: compressing image file(s) before upload.\", {\r\n\t\t\tmethod: \"POST\",\r\n\t\t\turl: reqUrl,\r\n\t\t\tfile_keys: snapshot\r\n\t\t\t\t.filter(([k, v]) => /^files\\[/i.test(k) && isImageFileLike(v))\r\n\t\t\t\t.map(([k, v]) => ({\r\n\t\t\t\t\tkey: k,\r\n\t\t\t\t\tname: \"name\" in v ? /** @type {File} */ (v).name : \"(blob)\",\r\n\t\t\t\t\ttype: /** @type {Blob} */ (v).type,\r\n\t\t\t\t\tsize: /** @type {Blob} */ (v).size,\r\n\t\t\t\t})),\r\n\t\t});\r\n\r\n\t\tvoid (async () => {\r\n\t\t\tconst t0 = performance.now();\r\n\t\t\ttry {\r\n\t\t\t\tconst newFd = await buildFormDataFromSnapshot(snapshot, compressOptions, squeeze);\r\n\t\t\t\tvxLog(\"XHR intercept: compression pass done in\", Math.round(performance.now() - t0), \"ms; sending request.\");\r\n\t\t\t\torigSend.call(xhr, newFd);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tvxWarn(\"XHR intercept failed; sending original FormData.\", e);\r\n\t\t\t\torigSend.call(xhr, body);\r\n\t\t\t}\r\n\t\t})();\r\n\t};\r\n\r\n\tvxLog(\"XMLHttpRequest.send hook installed (Voxel multipart: ?vx=1 or admin-ajax create_post).\");\r\n\r\n\tif (typeof window.fetch === \"function\") {\r\n\t\tconst origFetch = window.fetch.bind(window);\r\n\r\n\t\twindow.fetch = async function (input, init) {\r\n\t\t\tconst url =\r\n\t\t\t\ttypeof input === \"string\"\r\n\t\t\t\t\t? input\r\n\t\t\t\t\t: input instanceof Request\r\n\t\t\t\t\t\t? input.url\r\n\t\t\t\t\t\t: normalizeOpenUrl(input);\r\n\r\n\t\t\tconst rawBody = init?.body;\r\n\t\t\tconst body = isFormDataLike(rawBody) ? /** @type {FormData} */ (rawBody) : null;\r\n\t\t\tif (!body || !looksLikeVoxelMultipartTarget(url)) {\r\n\t\t\t\treturn origFetch(input, init);\r\n\t\t\t}\r\n\r\n\t\t\tconst squeeze = window.Squeeze;\r\n\t\t\tif (!squeeze || typeof squeeze.compressBeforeUpload !== \"function\") {\r\n\t\t\t\treturn origFetch(input, init);\r\n\t\t\t}\r\n\r\n\t\t\tlet snapshot;\r\n\t\t\ttry {\r\n\t\t\t\tsnapshot = snapshotFormDataEntries(body);\r\n\t\t\t} catch (e) {\r\n\t\t\t\treturn origFetch(input, init);\r\n\t\t\t}\r\n\r\n\t\t\tif (!formDataHasVoxelImageFiles(snapshot)) {\r\n\t\t\t\tif (looksLikeVoxelMultipartTarget(String(url))) {\r\n\t\t\t\t\tlogFormDataDiag(String(url), snapshot);\r\n\t\t\t\t}\r\n\t\t\t\treturn origFetch(input, init);\r\n\t\t\t}\r\n\r\n\t\t\tvxLog(\"fetch intercept: compressing image file(s) before upload.\", { url });\r\n\r\n\t\t\tconst t0 = performance.now();\r\n\t\t\ttry {\r\n\t\t\t\tconst newFd = await buildFormDataFromSnapshot(snapshot, compressOptions, squeeze);\r\n\t\t\t\tvxLog(\"fetch intercept: compression pass done in\", Math.round(performance.now() - t0), \"ms.\");\r\n\t\t\t\tconst nextInit = init ? { ...init, body: newFd } : { body: newFd };\r\n\t\t\t\treturn origFetch(input, nextInit);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tvxWarn(\"fetch intercept failed; using original body.\", e);\r\n\t\t\t\treturn origFetch(input, init);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvxLog(\"window.fetch hook installed for Voxel-style AJAX URLs.\");\r\n\t}\r\n\r\n\tscheduleJQueryProbe(looksLikeVoxelMultipartTarget);\r\n}\r\n\r\n/**\r\n * jQuery may register after Squeeze (script order); retry briefly.\r\n *\r\n * @param {typeof looksLikeVoxelMultipartTarget} urlTest\r\n */\r\nfunction scheduleJQueryProbe(urlTest) {\r\n\tif (window.jQuery) {\r\n\t\tinstallJQueryVoxelProbe(urlTest);\r\n\t\treturn;\r\n\t}\r\n\tlet tries = 0;\r\n\tconst id = window.setInterval(() => {\r\n\t\ttries += 1;\r\n\t\tif (window.jQuery) {\r\n\t\t\twindow.clearInterval(id);\r\n\t\t\tinstallJQueryVoxelProbe(urlTest);\r\n\t\t} else if (tries > 200) {\r\n\t\t\twindow.clearInterval(id);\r\n\t\t}\r\n\t}, 50);\r\n}\r\n\r\n/**\r\n * @param {Array<[string, FormDataEntryValue]>} entries\r\n * @param {Record<string, unknown>} compressOptions\r\n * @param {object} squeeze Squeeze instance (window.Squeeze)\r\n */\r\nasync function buildFormDataFromSnapshot(entries, compressOptions, squeeze) {\r\n\tconst newFd = new FormData();\r\n\tlet metaSignal = false;\r\n\r\n\tfor (const [key, value] of entries) {\r\n\t\tif (/^files\\[/i.test(key) && isImageFileLike(value)) {\r\n\t\t\tconst fileValue = ensureFileForCompression(/** @type {File | Blob} */ (value), key);\r\n\t\t\tconst { out, metaSignal: m } = await compressOneVoxelImageIfNeeded(fileValue, key, compressOptions, squeeze);\r\n\t\t\tif (m) {\r\n\t\t\t\tmetaSignal = true;\r\n\t\t\t}\r\n\t\t\tnewFd.append(key, out, out.name);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif (typeof File !== \"undefined\" && value instanceof File) {\r\n\t\t\tnewFd.append(key, value, value.name);\r\n\t\t} else if (typeof Blob !== \"undefined\" && value instanceof Blob) {\r\n\t\t\tnewFd.append(key, value);\r\n\t\t} else {\r\n\t\t\tnewFd.append(key, value);\r\n\t\t}\r\n\t}\r\n\r\n\tappendVoxelClientCompressedMarkers(newFd, metaSignal, squeeze);\r\n\treturn newFd;\r\n}\r\n\n\n//# sourceURL=webpack:///./assets/js/voxel-upload-compat.js?"); |
| 60 | |
| 61 | /***/ }), |
| 62 | |
| 63 | /***/ "./node_modules/@jsquash/webp/encode.js": |
| 64 | /*!**********************************************!*\ |
| 65 | !*** ./node_modules/@jsquash/webp/encode.js ***! |
| 66 | \**********************************************/ |
| 67 | /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { |
| 68 | |
| 69 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ encode),\n/* harmony export */ \"init\": () => (/* binding */ init)\n/* harmony export */ });\n/* harmony import */ var _meta_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./meta.js */ \"./node_modules/@jsquash/webp/meta.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ \"./node_modules/@jsquash/webp/utils.js\");\n/* harmony import */ var wasm_feature_detect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! wasm-feature-detect */ \"./node_modules/wasm-feature-detect/dist/esm/index.js\");\n/**\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\nlet emscriptenModule;\nasync function init(module, moduleOptionOverrides) {\n if (await (0,wasm_feature_detect__WEBPACK_IMPORTED_MODULE_0__.simd)()) {\n const webpEncoder = await __webpack_require__.e(/*! import() */ \"vendors-node_modules_jsquash_webp_codec_enc_webp_enc_simd_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./codec/enc/webp_enc_simd.js */ \"./node_modules/@jsquash/webp/codec/enc/webp_enc_simd.js\"));\n emscriptenModule = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.initEmscriptenModule)(webpEncoder.default, module, moduleOptionOverrides);\n return emscriptenModule;\n }\n const webpEncoder = await __webpack_require__.e(/*! import() */ \"vendors-node_modules_jsquash_webp_codec_enc_webp_enc_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./codec/enc/webp_enc.js */ \"./node_modules/@jsquash/webp/codec/enc/webp_enc.js\"));\n emscriptenModule = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.initEmscriptenModule)(webpEncoder.default, module, moduleOptionOverrides);\n return emscriptenModule;\n}\nasync function encode(data, options = {}) {\n if (!emscriptenModule)\n emscriptenModule = init();\n const _options = { ..._meta_js__WEBPACK_IMPORTED_MODULE_2__.defaultOptions, ...options };\n const module = await emscriptenModule;\n const result = module.encode(data.data, data.width, data.height, _options);\n if (!result)\n throw new Error('Encoding error.');\n return result.buffer;\n}\n\n\n//# sourceURL=webpack:///./node_modules/@jsquash/webp/encode.js?"); |
| 70 | |
| 71 | /***/ }), |
| 72 | |
| 73 | /***/ "./node_modules/@jsquash/webp/meta.js": |
| 74 | /*!********************************************!*\ |
| 75 | !*** ./node_modules/@jsquash/webp/meta.js ***! |
| 76 | \********************************************/ |
| 77 | /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { |
| 78 | |
| 79 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"defaultOptions\": () => (/* binding */ defaultOptions),\n/* harmony export */ \"extension\": () => (/* binding */ extension),\n/* harmony export */ \"label\": () => (/* binding */ label),\n/* harmony export */ \"mimeType\": () => (/* binding */ mimeType)\n/* harmony export */ });\nconst label = 'WebP';\nconst mimeType = 'image/webp';\nconst extension = 'webp';\n// These come from struct WebPConfig in encode.h.\nconst defaultOptions = {\n quality: 75,\n target_size: 0,\n target_PSNR: 0,\n method: 4,\n sns_strength: 50,\n filter_strength: 60,\n filter_sharpness: 0,\n filter_type: 1,\n partitions: 0,\n segments: 4,\n pass: 1,\n show_compressed: 0,\n preprocessing: 0,\n autofilter: 0,\n partition_limit: 0,\n alpha_compression: 1,\n alpha_filtering: 1,\n alpha_quality: 100,\n lossless: 0,\n exact: 0,\n image_hint: 0,\n emulate_jpeg_size: 0,\n thread_level: 0,\n low_memory: 0,\n near_lossless: 100,\n use_delta_palette: 0,\n use_sharp_yuv: 0,\n};\n\n\n//# sourceURL=webpack:///./node_modules/@jsquash/webp/meta.js?"); |
| 80 | |
| 81 | /***/ }), |
| 82 | |
| 83 | /***/ "./node_modules/@jsquash/webp/utils.js": |
| 84 | /*!*********************************************!*\ |
| 85 | !*** ./node_modules/@jsquash/webp/utils.js ***! |
| 86 | \*********************************************/ |
| 87 | /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { |
| 88 | |
| 89 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"initEmscriptenModule\": () => (/* binding */ initEmscriptenModule)\n/* harmony export */ });\n/**\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Notice: I (Jamie Sinclair) have modified this file to allow manual instantiation of the Wasm Module.\n */\nfunction initEmscriptenModule(moduleFactory, wasmModule, moduleOptionOverrides = {}) {\n let instantiateWasm;\n if (wasmModule) {\n instantiateWasm = (imports, callback) => {\n const instance = new WebAssembly.Instance(wasmModule, imports);\n callback(instance);\n return instance.exports;\n };\n }\n return moduleFactory({\n // Just to be safe, don't automatically invoke any wasm functions\n noInitialRun: true,\n instantiateWasm,\n ...moduleOptionOverrides,\n });\n}\n\n\n//# sourceURL=webpack:///./node_modules/@jsquash/webp/utils.js?"); |
| 90 | |
| 91 | /***/ }), |
| 92 | |
| 93 | /***/ "./node_modules/browser-image-compression/dist/browser-image-compression.mjs": |
| 94 | /*!***********************************************************************************!*\ |
| 95 | !*** ./node_modules/browser-image-compression/dist/browser-image-compression.mjs ***! |
| 96 | \***********************************************************************************/ |
| 97 | /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { |
| 98 | |
| 99 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ imageCompression)\n/* harmony export */ });\n/**\n * Browser Image Compression\n * v2.0.2\n * by Donald <donaldcwl@gmail.com>\n * https://github.com/Donaldcwl/browser-image-compression\n */\n\nfunction _mergeNamespaces(e,t){return t.forEach((function(t){t&&\"string\"!=typeof t&&!Array.isArray(t)&&Object.keys(t).forEach((function(r){if(\"default\"!==r&&!(r in e)){var i=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,i.get?i:{enumerable:!0,get:function(){return t[r]}})}}))})),Object.freeze(e)}function copyExifWithoutOrientation(e,t){return new Promise((function(r,i){let o;return getApp1Segment(e).then((function(e){try{return o=e,r(new Blob([t.slice(0,2),o,t.slice(2)],{type:\"image/jpeg\"}))}catch(e){return i(e)}}),i)}))}const getApp1Segment=e=>new Promise(((t,r)=>{const i=new FileReader;i.addEventListener(\"load\",(({target:{result:e}})=>{const i=new DataView(e);let o=0;if(65496!==i.getUint16(o))return r(\"not a valid JPEG\");for(o+=2;;){const a=i.getUint16(o);if(65498===a)break;const s=i.getUint16(o+2);if(65505===a&&1165519206===i.getUint32(o+4)){const a=o+10;let f;switch(i.getUint16(a)){case 18761:f=!0;break;case 19789:f=!1;break;default:return r(\"TIFF header contains invalid endian\")}if(42!==i.getUint16(a+2,f))return r(\"TIFF header contains invalid version\");const l=i.getUint32(a+4,f),c=a+l+2+12*i.getUint16(a+l,f);for(let e=a+l+2;e<c;e+=12){if(274==i.getUint16(e,f)){if(3!==i.getUint16(e+2,f))return r(\"Orientation data type is invalid\");if(1!==i.getUint32(e+4,f))return r(\"Orientation data count is invalid\");i.setUint16(e+8,1,f);break}}return t(e.slice(o,o+2+s))}o+=2+s}return t(new Blob)})),i.readAsArrayBuffer(e)}));var e={},t={get exports(){return e},set exports(t){e=t}};!function(e){var r,i,UZIP={};t.exports=UZIP,UZIP.parse=function(e,t){for(var r=UZIP.bin.readUshort,i=UZIP.bin.readUint,o=0,a={},s=new Uint8Array(e),f=s.length-4;101010256!=i(s,f);)f--;o=f;o+=4;var l=r(s,o+=4);r(s,o+=2);var c=i(s,o+=2),u=i(s,o+=4);o+=4,o=u;for(var h=0;h<l;h++){i(s,o),o+=4,o+=4,o+=4,i(s,o+=4);c=i(s,o+=4);var d=i(s,o+=4),A=r(s,o+=4),g=r(s,o+2),p=r(s,o+4);o+=6;var m=i(s,o+=8);o+=4,o+=A+g+p,UZIP._readLocal(s,m,a,c,d,t)}return a},UZIP._readLocal=function(e,t,r,i,o,a){var s=UZIP.bin.readUshort,f=UZIP.bin.readUint;f(e,t),s(e,t+=4),s(e,t+=2);var l=s(e,t+=2);f(e,t+=2),f(e,t+=4),t+=4;var c=s(e,t+=8),u=s(e,t+=2);t+=2;var h=UZIP.bin.readUTF8(e,t,c);if(t+=c,t+=u,a)r[h]={size:o,csize:i};else{var d=new Uint8Array(e.buffer,t);if(0==l)r[h]=new Uint8Array(d.buffer.slice(t,t+i));else{if(8!=l)throw\"unknown compression method: \"+l;var A=new Uint8Array(o);UZIP.inflateRaw(d,A),r[h]=A}}},UZIP.inflateRaw=function(e,t){return UZIP.F.inflate(e,t)},UZIP.inflate=function(e,t){return e[0],e[1],UZIP.inflateRaw(new Uint8Array(e.buffer,e.byteOffset+2,e.length-6),t)},UZIP.deflate=function(e,t){null==t&&(t={level:6});var r=0,i=new Uint8Array(50+Math.floor(1.1*e.length));i[r]=120,i[r+1]=156,r+=2,r=UZIP.F.deflateRaw(e,i,r,t.level);var o=UZIP.adler(e,0,e.length);return i[r+0]=o>>>24&255,i[r+1]=o>>>16&255,i[r+2]=o>>>8&255,i[r+3]=o>>>0&255,new Uint8Array(i.buffer,0,r+4)},UZIP.deflateRaw=function(e,t){null==t&&(t={level:6});var r=new Uint8Array(50+Math.floor(1.1*e.length)),i=UZIP.F.deflateRaw(e,r,i,t.level);return new Uint8Array(r.buffer,0,i)},UZIP.encode=function(e,t){null==t&&(t=!1);var r=0,i=UZIP.bin.writeUint,o=UZIP.bin.writeUshort,a={};for(var s in e){var f=!UZIP._noNeed(s)&&!t,l=e[s],c=UZIP.crc.crc(l,0,l.length);a[s]={cpr:f,usize:l.length,crc:c,file:f?UZIP.deflateRaw(l):l}}for(var s in a)r+=a[s].file.length+30+46+2*UZIP.bin.sizeUTF8(s);r+=22;var u=new Uint8Array(r),h=0,d=[];for(var s in a){var A=a[s];d.push(h),h=UZIP._writeHeader(u,h,s,A,0)}var g=0,p=h;for(var s in a){A=a[s];d.push(h),h=UZIP._writeHeader(u,h,s,A,1,d[g++])}var m=h-p;return i(u,h,101010256),h+=4,o(u,h+=4,g),o(u,h+=2,g),i(u,h+=2,m),i(u,h+=4,p),h+=4,h+=2,u.buffer},UZIP._noNeed=function(e){var t=e.split(\".\").pop().toLowerCase();return-1!=\"png,jpg,jpeg,zip\".indexOf(t)},UZIP._writeHeader=function(e,t,r,i,o,a){var s=UZIP.bin.writeUint,f=UZIP.bin.writeUshort,l=i.file;return s(e,t,0==o?67324752:33639248),t+=4,1==o&&(t+=2),f(e,t,20),f(e,t+=2,0),f(e,t+=2,i.cpr?8:0),s(e,t+=2,0),s(e,t+=4,i.crc),s(e,t+=4,l.length),s(e,t+=4,i.usize),f(e,t+=4,UZIP.bin.sizeUTF8(r)),f(e,t+=2,0),t+=2,1==o&&(t+=2,t+=2,s(e,t+=6,a),t+=4),t+=UZIP.bin.writeUTF8(e,t,r),0==o&&(e.set(l,t),t+=l.length),t},UZIP.crc={table:function(){for(var e=new Uint32Array(256),t=0;t<256;t++){for(var r=t,i=0;i<8;i++)1&r?r=3988292384^r>>>1:r>>>=1;e[t]=r}return e}(),update:function(e,t,r,i){for(var o=0;o<i;o++)e=UZIP.crc.table[255&(e^t[r+o])]^e>>>8;return e},crc:function(e,t,r){return 4294967295^UZIP.crc.update(4294967295,e,t,r)}},UZIP.adler=function(e,t,r){for(var i=1,o=0,a=t,s=t+r;a<s;){for(var f=Math.min(a+5552,s);a<f;)o+=i+=e[a++];i%=65521,o%=65521}return o<<16|i},UZIP.bin={readUshort:function(e,t){return e[t]|e[t+1]<<8},writeUshort:function(e,t,r){e[t]=255&r,e[t+1]=r>>8&255},readUint:function(e,t){return 16777216*e[t+3]+(e[t+2]<<16|e[t+1]<<8|e[t])},writeUint:function(e,t,r){e[t]=255&r,e[t+1]=r>>8&255,e[t+2]=r>>16&255,e[t+3]=r>>24&255},readASCII:function(e,t,r){for(var i=\"\",o=0;o<r;o++)i+=String.fromCharCode(e[t+o]);return i},writeASCII:function(e,t,r){for(var i=0;i<r.length;i++)e[t+i]=r.charCodeAt(i)},pad:function(e){return e.length<2?\"0\"+e:e},readUTF8:function(e,t,r){for(var i,o=\"\",a=0;a<r;a++)o+=\"%\"+UZIP.bin.pad(e[t+a].toString(16));try{i=decodeURIComponent(o)}catch(i){return UZIP.bin.readASCII(e,t,r)}return i},writeUTF8:function(e,t,r){for(var i=r.length,o=0,a=0;a<i;a++){var s=r.charCodeAt(a);if(0==(4294967168&s))e[t+o]=s,o++;else if(0==(4294965248&s))e[t+o]=192|s>>6,e[t+o+1]=128|s>>0&63,o+=2;else if(0==(4294901760&s))e[t+o]=224|s>>12,e[t+o+1]=128|s>>6&63,e[t+o+2]=128|s>>0&63,o+=3;else{if(0!=(4292870144&s))throw\"e\";e[t+o]=240|s>>18,e[t+o+1]=128|s>>12&63,e[t+o+2]=128|s>>6&63,e[t+o+3]=128|s>>0&63,o+=4}}return o},sizeUTF8:function(e){for(var t=e.length,r=0,i=0;i<t;i++){var o=e.charCodeAt(i);if(0==(4294967168&o))r++;else if(0==(4294965248&o))r+=2;else if(0==(4294901760&o))r+=3;else{if(0!=(4292870144&o))throw\"e\";r+=4}}return r}},UZIP.F={},UZIP.F.deflateRaw=function(e,t,r,i){var o=[[0,0,0,0,0],[4,4,8,4,0],[4,5,16,8,0],[4,6,16,16,0],[4,10,16,32,0],[8,16,32,32,0],[8,16,128,128,0],[8,32,128,256,0],[32,128,258,1024,1],[32,258,258,4096,1]][i],a=UZIP.F.U,s=UZIP.F._goodIndex;UZIP.F._hash;var f=UZIP.F._putsE,l=0,c=r<<3,u=0,h=e.length;if(0==i){for(;l<h;){f(t,c,l+(_=Math.min(65535,h-l))==h?1:0),c=UZIP.F._copyExact(e,l,_,t,c+8),l+=_}return c>>>3}var d=a.lits,A=a.strt,g=a.prev,p=0,m=0,w=0,v=0,b=0,y=0;for(h>2&&(A[y=UZIP.F._hash(e,0)]=0),l=0;l<h;l++){if(b=y,l+1<h-2){y=UZIP.F._hash(e,l+1);var E=l+1&32767;g[E]=A[y],A[y]=E}if(u<=l){(p>14e3||m>26697)&&h-l>100&&(u<l&&(d[p]=l-u,p+=2,u=l),c=UZIP.F._writeBlock(l==h-1||u==h?1:0,d,p,v,e,w,l-w,t,c),p=m=v=0,w=l);var F=0;l<h-2&&(F=UZIP.F._bestMatch(e,l,g,b,Math.min(o[2],h-l),o[3]));var _=F>>>16,B=65535&F;if(0!=F){B=65535&F;var U=s(_=F>>>16,a.of0);a.lhst[257+U]++;var C=s(B,a.df0);a.dhst[C]++,v+=a.exb[U]+a.dxb[C],d[p]=_<<23|l-u,d[p+1]=B<<16|U<<8|C,p+=2,u=l+_}else a.lhst[e[l]]++;m++}}for(w==l&&0!=e.length||(u<l&&(d[p]=l-u,p+=2,u=l),c=UZIP.F._writeBlock(1,d,p,v,e,w,l-w,t,c),p=0,m=0,p=m=v=0,w=l);0!=(7&c);)c++;return c>>>3},UZIP.F._bestMatch=function(e,t,r,i,o,a){var s=32767&t,f=r[s],l=s-f+32768&32767;if(f==s||i!=UZIP.F._hash(e,t-l))return 0;for(var c=0,u=0,h=Math.min(32767,t);l<=h&&0!=--a&&f!=s;){if(0==c||e[t+c]==e[t+c-l]){var d=UZIP.F._howLong(e,t,l);if(d>c){if(u=l,(c=d)>=o)break;l+2<d&&(d=l+2);for(var A=0,g=0;g<d-2;g++){var p=t-l+g+32768&32767,m=p-r[p]+32768&32767;m>A&&(A=m,f=p)}}}l+=(s=f)-(f=r[s])+32768&32767}return c<<16|u},UZIP.F._howLong=function(e,t,r){if(e[t]!=e[t-r]||e[t+1]!=e[t+1-r]||e[t+2]!=e[t+2-r])return 0;var i=t,o=Math.min(e.length,t+258);for(t+=3;t<o&&e[t]==e[t-r];)t++;return t-i},UZIP.F._hash=function(e,t){return(e[t]<<8|e[t+1])+(e[t+2]<<4)&65535},UZIP.saved=0,UZIP.F._writeBlock=function(e,t,r,i,o,a,s,f,l){var c,u,h,d,A,g,p,m,w,v=UZIP.F.U,b=UZIP.F._putsF,y=UZIP.F._putsE;v.lhst[256]++,u=(c=UZIP.F.getTrees())[0],h=c[1],d=c[2],A=c[3],g=c[4],p=c[5],m=c[6],w=c[7];var E=32+(0==(l+3&7)?0:8-(l+3&7))+(s<<3),F=i+UZIP.F.contSize(v.fltree,v.lhst)+UZIP.F.contSize(v.fdtree,v.dhst),_=i+UZIP.F.contSize(v.ltree,v.lhst)+UZIP.F.contSize(v.dtree,v.dhst);_+=14+3*p+UZIP.F.contSize(v.itree,v.ihst)+(2*v.ihst[16]+3*v.ihst[17]+7*v.ihst[18]);for(var B=0;B<286;B++)v.lhst[B]=0;for(B=0;B<30;B++)v.dhst[B]=0;for(B=0;B<19;B++)v.ihst[B]=0;var U=E<F&&E<_?0:F<_?1:2;if(b(f,l,e),b(f,l+1,U),l+=3,0==U){for(;0!=(7&l);)l++;l=UZIP.F._copyExact(o,a,s,f,l)}else{var C,I;if(1==U&&(C=v.fltree,I=v.fdtree),2==U){UZIP.F.makeCodes(v.ltree,u),UZIP.F.revCodes(v.ltree,u),UZIP.F.makeCodes(v.dtree,h),UZIP.F.revCodes(v.dtree,h),UZIP.F.makeCodes(v.itree,d),UZIP.F.revCodes(v.itree,d),C=v.ltree,I=v.dtree,y(f,l,A-257),y(f,l+=5,g-1),y(f,l+=5,p-4),l+=4;for(var Q=0;Q<p;Q++)y(f,l+3*Q,v.itree[1+(v.ordr[Q]<<1)]);l+=3*p,l=UZIP.F._codeTiny(m,v.itree,f,l),l=UZIP.F._codeTiny(w,v.itree,f,l)}for(var M=a,x=0;x<r;x+=2){for(var S=t[x],R=S>>>23,T=M+(8388607&S);M<T;)l=UZIP.F._writeLit(o[M++],C,f,l);if(0!=R){var O=t[x+1],P=O>>16,H=O>>8&255,L=255&O;y(f,l=UZIP.F._writeLit(257+H,C,f,l),R-v.of0[H]),l+=v.exb[H],b(f,l=UZIP.F._writeLit(L,I,f,l),P-v.df0[L]),l+=v.dxb[L],M+=R}}l=UZIP.F._writeLit(256,C,f,l)}return l},UZIP.F._copyExact=function(e,t,r,i,o){var a=o>>>3;return i[a]=r,i[a+1]=r>>>8,i[a+2]=255-i[a],i[a+3]=255-i[a+1],a+=4,i.set(new Uint8Array(e.buffer,t,r),a),o+(r+4<<3)},UZIP.F.getTrees=function(){for(var e=UZIP.F.U,t=UZIP.F._hufTree(e.lhst,e.ltree,15),r=UZIP.F._hufTree(e.dhst,e.dtree,15),i=[],o=UZIP.F._lenCodes(e.ltree,i),a=[],s=UZIP.F._lenCodes(e.dtree,a),f=0;f<i.length;f+=2)e.ihst[i[f]]++;for(f=0;f<a.length;f+=2)e.ihst[a[f]]++;for(var l=UZIP.F._hufTree(e.ihst,e.itree,7),c=19;c>4&&0==e.itree[1+(e.ordr[c-1]<<1)];)c--;return[t,r,l,o,s,c,i,a]},UZIP.F.getSecond=function(e){for(var t=[],r=0;r<e.length;r+=2)t.push(e[r+1]);return t},UZIP.F.nonZero=function(e){for(var t=\"\",r=0;r<e.length;r+=2)0!=e[r+1]&&(t+=(r>>1)+\",\");return t},UZIP.F.contSize=function(e,t){for(var r=0,i=0;i<t.length;i++)r+=t[i]*e[1+(i<<1)];return r},UZIP.F._codeTiny=function(e,t,r,i){for(var o=0;o<e.length;o+=2){var a=e[o],s=e[o+1];i=UZIP.F._writeLit(a,t,r,i);var f=16==a?2:17==a?3:7;a>15&&(UZIP.F._putsE(r,i,s,f),i+=f)}return i},UZIP.F._lenCodes=function(e,t){for(var r=e.length;2!=r&&0==e[r-1];)r-=2;for(var i=0;i<r;i+=2){var o=e[i+1],a=i+3<r?e[i+3]:-1,s=i+5<r?e[i+5]:-1,f=0==i?-1:e[i-1];if(0==o&&a==o&&s==o){for(var l=i+5;l+2<r&&e[l+2]==o;)l+=2;(c=Math.min(l+1-i>>>1,138))<11?t.push(17,c-3):t.push(18,c-11),i+=2*c-2}else if(o==f&&a==o&&s==o){for(l=i+5;l+2<r&&e[l+2]==o;)l+=2;var c=Math.min(l+1-i>>>1,6);t.push(16,c-3),i+=2*c-2}else t.push(o,0)}return r>>>1},UZIP.F._hufTree=function(e,t,r){var i=[],o=e.length,a=t.length,s=0;for(s=0;s<a;s+=2)t[s]=0,t[s+1]=0;for(s=0;s<o;s++)0!=e[s]&&i.push({lit:s,f:e[s]});var f=i.length,l=i.slice(0);if(0==f)return 0;if(1==f){var c=i[0].lit;l=0==c?1:0;return t[1+(c<<1)]=1,t[1+(l<<1)]=1,1}i.sort((function(e,t){return e.f-t.f}));var u=i[0],h=i[1],d=0,A=1,g=2;for(i[0]={lit:-1,f:u.f+h.f,l:u,r:h,d:0};A!=f-1;)u=d!=A&&(g==f||i[d].f<i[g].f)?i[d++]:i[g++],h=d!=A&&(g==f||i[d].f<i[g].f)?i[d++]:i[g++],i[A++]={lit:-1,f:u.f+h.f,l:u,r:h};var p=UZIP.F.setDepth(i[A-1],0);for(p>r&&(UZIP.F.restrictDepth(l,r,p),p=r),s=0;s<f;s++)t[1+(l[s].lit<<1)]=l[s].d;return p},UZIP.F.setDepth=function(e,t){return-1!=e.lit?(e.d=t,t):Math.max(UZIP.F.setDepth(e.l,t+1),UZIP.F.setDepth(e.r,t+1))},UZIP.F.restrictDepth=function(e,t,r){var i=0,o=1<<r-t,a=0;for(e.sort((function(e,t){return t.d==e.d?e.f-t.f:t.d-e.d})),i=0;i<e.length&&e[i].d>t;i++){var s=e[i].d;e[i].d=t,a+=o-(1<<r-s)}for(a>>>=r-t;a>0;){(s=e[i].d)<t?(e[i].d++,a-=1<<t-s-1):i++}for(;i>=0;i--)e[i].d==t&&a<0&&(e[i].d--,a++);0!=a&&console.log(\"debt left\")},UZIP.F._goodIndex=function(e,t){var r=0;return t[16|r]<=e&&(r|=16),t[8|r]<=e&&(r|=8),t[4|r]<=e&&(r|=4),t[2|r]<=e&&(r|=2),t[1|r]<=e&&(r|=1),r},UZIP.F._writeLit=function(e,t,r,i){return UZIP.F._putsF(r,i,t[e<<1]),i+t[1+(e<<1)]},UZIP.F.inflate=function(e,t){var r=Uint8Array;if(3==e[0]&&0==e[1])return t||new r(0);var i=UZIP.F,o=i._bitsF,a=i._bitsE,s=i._decodeTiny,f=i.makeCodes,l=i.codes2map,c=i._get17,u=i.U,h=null==t;h&&(t=new r(e.length>>>2<<3));for(var d,A,g=0,p=0,m=0,w=0,v=0,b=0,y=0,E=0,F=0;0==g;)if(g=o(e,F,1),p=o(e,F+1,2),F+=3,0!=p){if(h&&(t=UZIP.F._check(t,E+(1<<17))),1==p&&(d=u.flmap,A=u.fdmap,b=511,y=31),2==p){m=a(e,F,5)+257,w=a(e,F+5,5)+1,v=a(e,F+10,4)+4,F+=14;for(var _=0;_<38;_+=2)u.itree[_]=0,u.itree[_+1]=0;var B=1;for(_=0;_<v;_++){var U=a(e,F+3*_,3);u.itree[1+(u.ordr[_]<<1)]=U,U>B&&(B=U)}F+=3*v,f(u.itree,B),l(u.itree,B,u.imap),d=u.lmap,A=u.dmap,F=s(u.imap,(1<<B)-1,m+w,e,F,u.ttree);var C=i._copyOut(u.ttree,0,m,u.ltree);b=(1<<C)-1;var I=i._copyOut(u.ttree,m,w,u.dtree);y=(1<<I)-1,f(u.ltree,C),l(u.ltree,C,d),f(u.dtree,I),l(u.dtree,I,A)}for(;;){var Q=d[c(e,F)&b];F+=15&Q;var M=Q>>>4;if(M>>>8==0)t[E++]=M;else{if(256==M)break;var x=E+M-254;if(M>264){var S=u.ldef[M-257];x=E+(S>>>3)+a(e,F,7&S),F+=7&S}var R=A[c(e,F)&y];F+=15&R;var T=R>>>4,O=u.ddef[T],P=(O>>>4)+o(e,F,15&O);for(F+=15&O,h&&(t=UZIP.F._check(t,E+(1<<17)));E<x;)t[E]=t[E++-P],t[E]=t[E++-P],t[E]=t[E++-P],t[E]=t[E++-P];E=x}}}else{0!=(7&F)&&(F+=8-(7&F));var H=4+(F>>>3),L=e[H-4]|e[H-3]<<8;h&&(t=UZIP.F._check(t,E+L)),t.set(new r(e.buffer,e.byteOffset+H,L),E),F=H+L<<3,E+=L}return t.length==E?t:t.slice(0,E)},UZIP.F._check=function(e,t){var r=e.length;if(t<=r)return e;var i=new Uint8Array(Math.max(r<<1,t));return i.set(e,0),i},UZIP.F._decodeTiny=function(e,t,r,i,o,a){for(var s=UZIP.F._bitsE,f=UZIP.F._get17,l=0;l<r;){var c=e[f(i,o)&t];o+=15&c;var u=c>>>4;if(u<=15)a[l]=u,l++;else{var h=0,d=0;16==u?(d=3+s(i,o,2),o+=2,h=a[l-1]):17==u?(d=3+s(i,o,3),o+=3):18==u&&(d=11+s(i,o,7),o+=7);for(var A=l+d;l<A;)a[l]=h,l++}}return o},UZIP.F._copyOut=function(e,t,r,i){for(var o=0,a=0,s=i.length>>>1;a<r;){var f=e[a+t];i[a<<1]=0,i[1+(a<<1)]=f,f>o&&(o=f),a++}for(;a<s;)i[a<<1]=0,i[1+(a<<1)]=0,a++;return o},UZIP.F.makeCodes=function(e,t){for(var r,i,o,a,s=UZIP.F.U,f=e.length,l=s.bl_count,c=0;c<=t;c++)l[c]=0;for(c=1;c<f;c+=2)l[e[c]]++;var u=s.next_code;for(r=0,l[0]=0,i=1;i<=t;i++)r=r+l[i-1]<<1,u[i]=r;for(o=0;o<f;o+=2)0!=(a=e[o+1])&&(e[o]=u[a],u[a]++)},UZIP.F.codes2map=function(e,t,r){for(var i=e.length,o=UZIP.F.U.rev15,a=0;a<i;a+=2)if(0!=e[a+1])for(var s=a>>1,f=e[a+1],l=s<<4|f,c=t-f,u=e[a]<<c,h=u+(1<<c);u!=h;){r[o[u]>>>15-t]=l,u++}},UZIP.F.revCodes=function(e,t){for(var r=UZIP.F.U.rev15,i=15-t,o=0;o<e.length;o+=2){var a=e[o]<<t-e[o+1];e[o]=r[a]>>>i}},UZIP.F._putsE=function(e,t,r){r<<=7&t;var i=t>>>3;e[i]|=r,e[i+1]|=r>>>8},UZIP.F._putsF=function(e,t,r){r<<=7&t;var i=t>>>3;e[i]|=r,e[i+1]|=r>>>8,e[i+2]|=r>>>16},UZIP.F._bitsE=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8)>>>(7&t)&(1<<r)-1},UZIP.F._bitsF=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)&(1<<r)-1},UZIP.F._get17=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)},UZIP.F._get25=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16|e[3+(t>>>3)]<<24)>>>(7&t)},UZIP.F.U=(r=Uint16Array,i=Uint32Array,{next_code:new r(16),bl_count:new r(16),ordr:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],of0:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],exb:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],ldef:new r(32),df0:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],dxb:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],ddef:new i(32),flmap:new r(512),fltree:[],fdmap:new r(32),fdtree:[],lmap:new r(32768),ltree:[],ttree:[],dmap:new r(32768),dtree:[],imap:new r(512),itree:[],rev15:new r(32768),lhst:new i(286),dhst:new i(30),ihst:new i(19),lits:new i(15e3),strt:new r(65536),prev:new r(32768)}),function(){for(var e=UZIP.F.U,t=0;t<32768;t++){var r=t;r=(4278255360&(r=(4042322160&(r=(3435973836&(r=(2863311530&r)>>>1|(1431655765&r)<<1))>>>2|(858993459&r)<<2))>>>4|(252645135&r)<<4))>>>8|(16711935&r)<<8,e.rev15[t]=(r>>>16|r<<16)>>>17}function pushV(e,t,r){for(;0!=t--;)e.push(0,r)}for(t=0;t<32;t++)e.ldef[t]=e.of0[t]<<3|e.exb[t],e.ddef[t]=e.df0[t]<<4|e.dxb[t];pushV(e.fltree,144,8),pushV(e.fltree,112,9),pushV(e.fltree,24,7),pushV(e.fltree,8,8),UZIP.F.makeCodes(e.fltree,9),UZIP.F.codes2map(e.fltree,9,e.flmap),UZIP.F.revCodes(e.fltree,9),pushV(e.fdtree,32,5),UZIP.F.makeCodes(e.fdtree,5),UZIP.F.codes2map(e.fdtree,5,e.fdmap),UZIP.F.revCodes(e.fdtree,5),pushV(e.itree,19,0),pushV(e.ltree,286,0),pushV(e.dtree,30,0),pushV(e.ttree,320,0)}()}();var UZIP=_mergeNamespaces({__proto__:null,default:e},[e]);const UPNG=function(){var e={nextZero(e,t){for(;0!=e[t];)t++;return t},readUshort:(e,t)=>e[t]<<8|e[t+1],writeUshort(e,t,r){e[t]=r>>8&255,e[t+1]=255&r},readUint:(e,t)=>16777216*e[t]+(e[t+1]<<16|e[t+2]<<8|e[t+3]),writeUint(e,t,r){e[t]=r>>24&255,e[t+1]=r>>16&255,e[t+2]=r>>8&255,e[t+3]=255&r},readASCII(e,t,r){let i=\"\";for(let o=0;o<r;o++)i+=String.fromCharCode(e[t+o]);return i},writeASCII(e,t,r){for(let i=0;i<r.length;i++)e[t+i]=r.charCodeAt(i)},readBytes(e,t,r){const i=[];for(let o=0;o<r;o++)i.push(e[t+o]);return i},pad:e=>e.length<2?`0${e}`:e,readUTF8(t,r,i){let o,a=\"\";for(let o=0;o<i;o++)a+=`%${e.pad(t[r+o].toString(16))}`;try{o=decodeURIComponent(a)}catch(o){return e.readASCII(t,r,i)}return o}};function decodeImage(t,r,i,o){const a=r*i,s=_getBPP(o),f=Math.ceil(r*s/8),l=new Uint8Array(4*a),c=new Uint32Array(l.buffer),{ctype:u}=o,{depth:h}=o,d=e.readUshort;if(6==u){const e=a<<2;if(8==h)for(var A=0;A<e;A+=4)l[A]=t[A],l[A+1]=t[A+1],l[A+2]=t[A+2],l[A+3]=t[A+3];if(16==h)for(A=0;A<e;A++)l[A]=t[A<<1]}else if(2==u){const e=o.tabs.tRNS;if(null==e){if(8==h)for(A=0;A<a;A++){var g=3*A;c[A]=255<<24|t[g+2]<<16|t[g+1]<<8|t[g]}if(16==h)for(A=0;A<a;A++){g=6*A;c[A]=255<<24|t[g+4]<<16|t[g+2]<<8|t[g]}}else{var p=e[0];const r=e[1],i=e[2];if(8==h)for(A=0;A<a;A++){var m=A<<2;g=3*A;c[A]=255<<24|t[g+2]<<16|t[g+1]<<8|t[g],t[g]==p&&t[g+1]==r&&t[g+2]==i&&(l[m+3]=0)}if(16==h)for(A=0;A<a;A++){m=A<<2,g=6*A;c[A]=255<<24|t[g+4]<<16|t[g+2]<<8|t[g],d(t,g)==p&&d(t,g+2)==r&&d(t,g+4)==i&&(l[m+3]=0)}}}else if(3==u){const e=o.tabs.PLTE,s=o.tabs.tRNS,c=s?s.length:0;if(1==h)for(var w=0;w<i;w++){var v=w*f,b=w*r;for(A=0;A<r;A++){m=b+A<<2;var y=3*(E=t[v+(A>>3)]>>7-((7&A)<<0)&1);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E<c?s[E]:255}}if(2==h)for(w=0;w<i;w++)for(v=w*f,b=w*r,A=0;A<r;A++){m=b+A<<2,y=3*(E=t[v+(A>>2)]>>6-((3&A)<<1)&3);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E<c?s[E]:255}if(4==h)for(w=0;w<i;w++)for(v=w*f,b=w*r,A=0;A<r;A++){m=b+A<<2,y=3*(E=t[v+(A>>1)]>>4-((1&A)<<2)&15);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E<c?s[E]:255}if(8==h)for(A=0;A<a;A++){var E;m=A<<2,y=3*(E=t[A]);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E<c?s[E]:255}}else if(4==u){if(8==h)for(A=0;A<a;A++){m=A<<2;var F=t[_=A<<1];l[m]=F,l[m+1]=F,l[m+2]=F,l[m+3]=t[_+1]}if(16==h)for(A=0;A<a;A++){var _;m=A<<2,F=t[_=A<<2];l[m]=F,l[m+1]=F,l[m+2]=F,l[m+3]=t[_+2]}}else if(0==u)for(p=o.tabs.tRNS?o.tabs.tRNS:-1,w=0;w<i;w++){const e=w*f,i=w*r;if(1==h)for(var B=0;B<r;B++){var U=(F=255*(t[e+(B>>>3)]>>>7-(7&B)&1))==255*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(2==h)for(B=0;B<r;B++){U=(F=85*(t[e+(B>>>2)]>>>6-((3&B)<<1)&3))==85*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(4==h)for(B=0;B<r;B++){U=(F=17*(t[e+(B>>>1)]>>>4-((1&B)<<2)&15))==17*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(8==h)for(B=0;B<r;B++){U=(F=t[e+B])==p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(16==h)for(B=0;B<r;B++){F=t[e+(B<<1)],U=d(t,e+(B<<1))==p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}}return l}function _decompress(e,r,i,o){const a=_getBPP(e),s=Math.ceil(i*a/8),f=new Uint8Array((s+1+e.interlace)*o);return r=e.tabs.CgBI?t(r,f):_inflate(r,f),0==e.interlace?r=_filterZero(r,e,0,i,o):1==e.interlace&&(r=function _readInterlace(e,t){const r=t.width,i=t.height,o=_getBPP(t),a=o>>3,s=Math.ceil(r*o/8),f=new Uint8Array(i*s);let l=0;const c=[0,0,4,0,2,0,1],u=[0,4,0,2,0,1,0],h=[8,8,8,4,4,2,2],d=[8,8,4,4,2,2,1];let A=0;for(;A<7;){const p=h[A],m=d[A];let w=0,v=0,b=c[A];for(;b<i;)b+=p,v++;let y=u[A];for(;y<r;)y+=m,w++;const E=Math.ceil(w*o/8);_filterZero(e,t,l,w,v);let F=0,_=c[A];for(;_<i;){let t=u[A],i=l+F*E<<3;for(;t<r;){var g;if(1==o)g=(g=e[i>>3])>>7-(7&i)&1,f[_*s+(t>>3)]|=g<<7-((7&t)<<0);if(2==o)g=(g=e[i>>3])>>6-(7&i)&3,f[_*s+(t>>2)]|=g<<6-((3&t)<<1);if(4==o)g=(g=e[i>>3])>>4-(7&i)&15,f[_*s+(t>>1)]|=g<<4-((1&t)<<2);if(o>=8){const r=_*s+t*a;for(let t=0;t<a;t++)f[r+t]=e[(i>>3)+t]}i+=o,t+=m}F++,_+=p}w*v!=0&&(l+=v*(1+E)),A+=1}return f}(r,e)),r}function _inflate(e,r){return t(new Uint8Array(e.buffer,2,e.length-6),r)}var t=function(){const e={H:{}};return e.H.N=function(t,r){const i=Uint8Array;let o,a,s=0,f=0,l=0,c=0,u=0,h=0,d=0,A=0,g=0;if(3==t[0]&&0==t[1])return r||new i(0);const p=e.H,m=p.b,w=p.e,v=p.R,b=p.n,y=p.A,E=p.Z,F=p.m,_=null==r;for(_&&(r=new i(t.length>>>2<<5));0==s;)if(s=m(t,g,1),f=m(t,g+1,2),g+=3,0!=f){if(_&&(r=e.H.W(r,A+(1<<17))),1==f&&(o=F.J,a=F.h,h=511,d=31),2==f){l=w(t,g,5)+257,c=w(t,g+5,5)+1,u=w(t,g+10,4)+4,g+=14;let e=1;for(var B=0;B<38;B+=2)F.Q[B]=0,F.Q[B+1]=0;for(B=0;B<u;B++){const r=w(t,g+3*B,3);F.Q[1+(F.X[B]<<1)]=r,r>e&&(e=r)}g+=3*u,b(F.Q,e),y(F.Q,e,F.u),o=F.w,a=F.d,g=v(F.u,(1<<e)-1,l+c,t,g,F.v);const r=p.V(F.v,0,l,F.C);h=(1<<r)-1;const i=p.V(F.v,l,c,F.D);d=(1<<i)-1,b(F.C,r),y(F.C,r,o),b(F.D,i),y(F.D,i,a)}for(;;){const e=o[E(t,g)&h];g+=15&e;const i=e>>>4;if(i>>>8==0)r[A++]=i;else{if(256==i)break;{let e=A+i-254;if(i>264){const r=F.q[i-257];e=A+(r>>>3)+w(t,g,7&r),g+=7&r}const o=a[E(t,g)&d];g+=15&o;const s=o>>>4,f=F.c[s],l=(f>>>4)+m(t,g,15&f);for(g+=15&f;A<e;)r[A]=r[A++-l],r[A]=r[A++-l],r[A]=r[A++-l],r[A]=r[A++-l];A=e}}}}else{0!=(7&g)&&(g+=8-(7&g));const o=4+(g>>>3),a=t[o-4]|t[o-3]<<8;_&&(r=e.H.W(r,A+a)),r.set(new i(t.buffer,t.byteOffset+o,a),A),g=o+a<<3,A+=a}return r.length==A?r:r.slice(0,A)},e.H.W=function(e,t){const r=e.length;if(t<=r)return e;const i=new Uint8Array(r<<1);return i.set(e,0),i},e.H.R=function(t,r,i,o,a,s){const f=e.H.e,l=e.H.Z;let c=0;for(;c<i;){const e=t[l(o,a)&r];a+=15&e;const i=e>>>4;if(i<=15)s[c]=i,c++;else{let e=0,t=0;16==i?(t=3+f(o,a,2),a+=2,e=s[c-1]):17==i?(t=3+f(o,a,3),a+=3):18==i&&(t=11+f(o,a,7),a+=7);const r=c+t;for(;c<r;)s[c]=e,c++}}return a},e.H.V=function(e,t,r,i){let o=0,a=0;const s=i.length>>>1;for(;a<r;){const r=e[a+t];i[a<<1]=0,i[1+(a<<1)]=r,r>o&&(o=r),a++}for(;a<s;)i[a<<1]=0,i[1+(a<<1)]=0,a++;return o},e.H.n=function(t,r){const i=e.H.m,o=t.length;let a,s,f;let l;const c=i.j;for(var u=0;u<=r;u++)c[u]=0;for(u=1;u<o;u+=2)c[t[u]]++;const h=i.K;for(a=0,c[0]=0,s=1;s<=r;s++)a=a+c[s-1]<<1,h[s]=a;for(f=0;f<o;f+=2)l=t[f+1],0!=l&&(t[f]=h[l],h[l]++)},e.H.A=function(t,r,i){const o=t.length,a=e.H.m.r;for(let e=0;e<o;e+=2)if(0!=t[e+1]){const o=e>>1,s=t[e+1],f=o<<4|s,l=r-s;let c=t[e]<<l;const u=c+(1<<l);for(;c!=u;){i[a[c]>>>15-r]=f,c++}}},e.H.l=function(t,r){const i=e.H.m.r,o=15-r;for(let e=0;e<t.length;e+=2){const a=t[e]<<r-t[e+1];t[e]=i[a]>>>o}},e.H.M=function(e,t,r){r<<=7&t;const i=t>>>3;e[i]|=r,e[i+1]|=r>>>8},e.H.I=function(e,t,r){r<<=7&t;const i=t>>>3;e[i]|=r,e[i+1]|=r>>>8,e[i+2]|=r>>>16},e.H.e=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8)>>>(7&t)&(1<<r)-1},e.H.b=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)&(1<<r)-1},e.H.Z=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)},e.H.i=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16|e[3+(t>>>3)]<<24)>>>(7&t)},e.H.m=function(){const e=Uint16Array,t=Uint32Array;return{K:new e(16),j:new e(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],T:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],q:new e(32),p:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],z:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],c:new t(32),J:new e(512),_:[],h:new e(32),$:[],w:new e(32768),C:[],v:[],d:new e(32768),D:[],u:new e(512),Q:[],r:new e(32768),s:new t(286),Y:new t(30),a:new t(19),t:new t(15e3),k:new e(65536),g:new e(32768)}}(),function(){const t=e.H.m;for(var r=0;r<32768;r++){let e=r;e=(2863311530&e)>>>1|(1431655765&e)<<1,e=(3435973836&e)>>>2|(858993459&e)<<2,e=(4042322160&e)>>>4|(252645135&e)<<4,e=(4278255360&e)>>>8|(16711935&e)<<8,t.r[r]=(e>>>16|e<<16)>>>17}function n(e,t,r){for(;0!=t--;)e.push(0,r)}for(r=0;r<32;r++)t.q[r]=t.S[r]<<3|t.T[r],t.c[r]=t.p[r]<<4|t.z[r];n(t._,144,8),n(t._,112,9),n(t._,24,7),n(t._,8,8),e.H.n(t._,9),e.H.A(t._,9,t.J),e.H.l(t._,9),n(t.$,32,5),e.H.n(t.$,5),e.H.A(t.$,5,t.h),e.H.l(t.$,5),n(t.Q,19,0),n(t.C,286,0),n(t.D,30,0),n(t.v,320,0)}(),e.H.N}();function _getBPP(e){return[1,null,3,1,2,null,4][e.ctype]*e.depth}function _filterZero(e,t,r,i,o){let a=_getBPP(t);const s=Math.ceil(i*a/8);let f,l;a=Math.ceil(a/8);let c=e[r],u=0;if(c>1&&(e[r]=[0,0,1][c-2]),3==c)for(u=a;u<s;u++)e[u+1]=e[u+1]+(e[u+1-a]>>>1)&255;for(let t=0;t<o;t++)if(f=r+t*s,l=f+t+1,c=e[l-1],u=0,0==c)for(;u<s;u++)e[f+u]=e[l+u];else if(1==c){for(;u<a;u++)e[f+u]=e[l+u];for(;u<s;u++)e[f+u]=e[l+u]+e[f+u-a]}else if(2==c)for(;u<s;u++)e[f+u]=e[l+u]+e[f+u-s];else if(3==c){for(;u<a;u++)e[f+u]=e[l+u]+(e[f+u-s]>>>1);for(;u<s;u++)e[f+u]=e[l+u]+(e[f+u-s]+e[f+u-a]>>>1)}else{for(;u<a;u++)e[f+u]=e[l+u]+_paeth(0,e[f+u-s],0);for(;u<s;u++)e[f+u]=e[l+u]+_paeth(e[f+u-a],e[f+u-s],e[f+u-a-s])}return e}function _paeth(e,t,r){const i=e+t-r,o=i-e,a=i-t,s=i-r;return o*o<=a*a&&o*o<=s*s?e:a*a<=s*s?t:r}function _IHDR(t,r,i){i.width=e.readUint(t,r),r+=4,i.height=e.readUint(t,r),r+=4,i.depth=t[r],r++,i.ctype=t[r],r++,i.compress=t[r],r++,i.filter=t[r],r++,i.interlace=t[r],r++}function _copyTile(e,t,r,i,o,a,s,f,l){const c=Math.min(t,o),u=Math.min(r,a);let h=0,d=0;for(let r=0;r<u;r++)for(let a=0;a<c;a++)if(s>=0&&f>=0?(h=r*t+a<<2,d=(f+r)*o+s+a<<2):(h=(-f+r)*t-s+a<<2,d=r*o+a<<2),0==l)i[d]=e[h],i[d+1]=e[h+1],i[d+2]=e[h+2],i[d+3]=e[h+3];else if(1==l){var A=e[h+3]*(1/255),g=e[h]*A,p=e[h+1]*A,m=e[h+2]*A,w=i[d+3]*(1/255),v=i[d]*w,b=i[d+1]*w,y=i[d+2]*w;const t=1-A,r=A+w*t,o=0==r?0:1/r;i[d+3]=255*r,i[d+0]=(g+v*t)*o,i[d+1]=(p+b*t)*o,i[d+2]=(m+y*t)*o}else if(2==l){A=e[h+3],g=e[h],p=e[h+1],m=e[h+2],w=i[d+3],v=i[d],b=i[d+1],y=i[d+2];A==w&&g==v&&p==b&&m==y?(i[d]=0,i[d+1]=0,i[d+2]=0,i[d+3]=0):(i[d]=g,i[d+1]=p,i[d+2]=m,i[d+3]=A)}else if(3==l){A=e[h+3],g=e[h],p=e[h+1],m=e[h+2],w=i[d+3],v=i[d],b=i[d+1],y=i[d+2];if(A==w&&g==v&&p==b&&m==y)continue;if(A<220&&w>20)return!1}return!0}return{decode:function decode(r){const i=new Uint8Array(r);let o=8;const a=e,s=a.readUshort,f=a.readUint,l={tabs:{},frames:[]},c=new Uint8Array(i.length);let u,h=0,d=0;const A=[137,80,78,71,13,10,26,10];for(var g=0;g<8;g++)if(i[g]!=A[g])throw\"The input is not a PNG file!\";for(;o<i.length;){const e=a.readUint(i,o);o+=4;const r=a.readASCII(i,o,4);if(o+=4,\"IHDR\"==r)_IHDR(i,o,l);else if(\"iCCP\"==r){for(var p=o;0!=i[p];)p++;a.readASCII(i,o,p-o),i[p+1];const s=i.slice(p+2,o+e);let f=null;try{f=_inflate(s)}catch(e){f=t(s)}l.tabs[r]=f}else if(\"CgBI\"==r)l.tabs[r]=i.slice(o,o+4);else if(\"IDAT\"==r){for(g=0;g<e;g++)c[h+g]=i[o+g];h+=e}else if(\"acTL\"==r)l.tabs[r]={num_frames:f(i,o),num_plays:f(i,o+4)},u=new Uint8Array(i.length);else if(\"fcTL\"==r){if(0!=d)(E=l.frames[l.frames.length-1]).data=_decompress(l,u.slice(0,d),E.rect.width,E.rect.height),d=0;const e={x:f(i,o+12),y:f(i,o+16),width:f(i,o+4),height:f(i,o+8)};let t=s(i,o+22);t=s(i,o+20)/(0==t?100:t);const r={rect:e,delay:Math.round(1e3*t),dispose:i[o+24],blend:i[o+25]};l.frames.push(r)}else if(\"fdAT\"==r){for(g=0;g<e-4;g++)u[d+g]=i[o+g+4];d+=e-4}else if(\"pHYs\"==r)l.tabs[r]=[a.readUint(i,o),a.readUint(i,o+4),i[o+8]];else if(\"cHRM\"==r){l.tabs[r]=[];for(g=0;g<8;g++)l.tabs[r].push(a.readUint(i,o+4*g))}else if(\"tEXt\"==r||\"zTXt\"==r){null==l.tabs[r]&&(l.tabs[r]={});var m=a.nextZero(i,o),w=a.readASCII(i,o,m-o),v=o+e-m-1;if(\"tEXt\"==r)y=a.readASCII(i,m+1,v);else{var b=_inflate(i.slice(m+2,m+2+v));y=a.readUTF8(b,0,b.length)}l.tabs[r][w]=y}else if(\"iTXt\"==r){null==l.tabs[r]&&(l.tabs[r]={});m=0,p=o;m=a.nextZero(i,p);w=a.readASCII(i,p,m-p);const t=i[p=m+1];var y;i[p+1],p+=2,m=a.nextZero(i,p),a.readASCII(i,p,m-p),p=m+1,m=a.nextZero(i,p),a.readUTF8(i,p,m-p);v=e-((p=m+1)-o);if(0==t)y=a.readUTF8(i,p,v);else{b=_inflate(i.slice(p,p+v));y=a.readUTF8(b,0,b.length)}l.tabs[r][w]=y}else if(\"PLTE\"==r)l.tabs[r]=a.readBytes(i,o,e);else if(\"hIST\"==r){const e=l.tabs.PLTE.length/3;l.tabs[r]=[];for(g=0;g<e;g++)l.tabs[r].push(s(i,o+2*g))}else if(\"tRNS\"==r)3==l.ctype?l.tabs[r]=a.readBytes(i,o,e):0==l.ctype?l.tabs[r]=s(i,o):2==l.ctype&&(l.tabs[r]=[s(i,o),s(i,o+2),s(i,o+4)]);else if(\"gAMA\"==r)l.tabs[r]=a.readUint(i,o)/1e5;else if(\"sRGB\"==r)l.tabs[r]=i[o];else if(\"bKGD\"==r)0==l.ctype||4==l.ctype?l.tabs[r]=[s(i,o)]:2==l.ctype||6==l.ctype?l.tabs[r]=[s(i,o),s(i,o+2),s(i,o+4)]:3==l.ctype&&(l.tabs[r]=i[o]);else if(\"IEND\"==r)break;o+=e,a.readUint(i,o),o+=4}var E;return 0!=d&&((E=l.frames[l.frames.length-1]).data=_decompress(l,u.slice(0,d),E.rect.width,E.rect.height)),l.data=_decompress(l,c,l.width,l.height),delete l.compress,delete l.interlace,delete l.filter,l},toRGBA8:function toRGBA8(e){const t=e.width,r=e.height;if(null==e.tabs.acTL)return[decodeImage(e.data,t,r,e).buffer];const i=[];null==e.frames[0].data&&(e.frames[0].data=e.data);const o=t*r*4,a=new Uint8Array(o),s=new Uint8Array(o),f=new Uint8Array(o);for(let c=0;c<e.frames.length;c++){const u=e.frames[c],h=u.rect.x,d=u.rect.y,A=u.rect.width,g=u.rect.height,p=decodeImage(u.data,A,g,e);if(0!=c)for(var l=0;l<o;l++)f[l]=a[l];if(0==u.blend?_copyTile(p,A,g,a,t,r,h,d,0):1==u.blend&&_copyTile(p,A,g,a,t,r,h,d,1),i.push(a.buffer.slice(0)),0==u.dispose);else if(1==u.dispose)_copyTile(s,A,g,a,t,r,h,d,0);else if(2==u.dispose)for(l=0;l<o;l++)a[l]=f[l]}return i},_paeth:_paeth,_copyTile:_copyTile,_bin:e}}();!function(){const{_copyTile:e}=UPNG,{_bin:t}=UPNG,r=UPNG._paeth;var i={table:function(){const e=new Uint32Array(256);for(let t=0;t<256;t++){let r=t;for(let e=0;e<8;e++)1&r?r=3988292384^r>>>1:r>>>=1;e[t]=r}return e}(),update(e,t,r,o){for(let a=0;a<o;a++)e=i.table[255&(e^t[r+a])]^e>>>8;return e},crc:(e,t,r)=>4294967295^i.update(4294967295,e,t,r)};function addErr(e,t,r,i){t[r]+=e[0]*i>>4,t[r+1]+=e[1]*i>>4,t[r+2]+=e[2]*i>>4,t[r+3]+=e[3]*i>>4}function N(e){return Math.max(0,Math.min(255,e))}function D(e,t){const r=e[0]-t[0],i=e[1]-t[1],o=e[2]-t[2],a=e[3]-t[3];return r*r+i*i+o*o+a*a}function dither(e,t,r,i,o,a,s){null==s&&(s=1);const f=i.length,l=[];for(var c=0;c<f;c++){const e=i[c];l.push([e>>>0&255,e>>>8&255,e>>>16&255,e>>>24&255])}for(c=0;c<f;c++){let e=4294967295;for(var u=0,h=0;h<f;h++){var d=D(l[c],l[h]);h!=c&&d<e&&(e=d,u=h)}}const A=new Uint32Array(o.buffer),g=new Int16Array(t*r*4),p=[0,8,2,10,12,4,14,6,3,11,1,9,15,7,13,5];for(c=0;c<p.length;c++)p[c]=255*((p[c]+.5)/16-.5);for(let o=0;o<r;o++)for(let w=0;w<t;w++){var m;c=4*(o*t+w);if(2!=s)m=[N(e[c]+g[c]),N(e[c+1]+g[c+1]),N(e[c+2]+g[c+2]),N(e[c+3]+g[c+3])];else{d=p[4*(3&o)+(3&w)];m=[N(e[c]+d),N(e[c+1]+d),N(e[c+2]+d),N(e[c+3]+d)]}u=0;let v=16777215;for(h=0;h<f;h++){const e=D(m,l[h]);e<v&&(v=e,u=h)}const b=l[u],y=[m[0]-b[0],m[1]-b[1],m[2]-b[2],m[3]-b[3]];1==s&&(w!=t-1&&addErr(y,g,c+4,7),o!=r-1&&(0!=w&&addErr(y,g,c+4*t-4,3),addErr(y,g,c+4*t,5),w!=t-1&&addErr(y,g,c+4*t+4,1))),a[c>>2]=u,A[c>>2]=i[u]}}function _main(e,r,o,a,s){null==s&&(s={});const{crc:f}=i,l=t.writeUint,c=t.writeUshort,u=t.writeASCII;let h=8;const d=e.frames.length>1;let A,g=!1,p=33+(d?20:0);if(null!=s.sRGB&&(p+=13),null!=s.pHYs&&(p+=21),null!=s.iCCP&&(A=pako.deflate(s.iCCP),p+=21+A.length+4),3==e.ctype){for(var m=e.plte.length,w=0;w<m;w++)e.plte[w]>>>24!=255&&(g=!0);p+=8+3*m+4+(g?8+1*m+4:0)}for(var v=0;v<e.frames.length;v++){d&&(p+=38),p+=(F=e.frames[v]).cimg.length+12,0!=v&&(p+=4)}p+=12;const b=new Uint8Array(p),y=[137,80,78,71,13,10,26,10];for(w=0;w<8;w++)b[w]=y[w];if(l(b,h,13),h+=4,u(b,h,\"IHDR\"),h+=4,l(b,h,r),h+=4,l(b,h,o),h+=4,b[h]=e.depth,h++,b[h]=e.ctype,h++,b[h]=0,h++,b[h]=0,h++,b[h]=0,h++,l(b,h,f(b,h-17,17)),h+=4,null!=s.sRGB&&(l(b,h,1),h+=4,u(b,h,\"sRGB\"),h+=4,b[h]=s.sRGB,h++,l(b,h,f(b,h-5,5)),h+=4),null!=s.iCCP){const e=13+A.length;l(b,h,e),h+=4,u(b,h,\"iCCP\"),h+=4,u(b,h,\"ICC profile\"),h+=11,h+=2,b.set(A,h),h+=A.length,l(b,h,f(b,h-(e+4),e+4)),h+=4}if(null!=s.pHYs&&(l(b,h,9),h+=4,u(b,h,\"pHYs\"),h+=4,l(b,h,s.pHYs[0]),h+=4,l(b,h,s.pHYs[1]),h+=4,b[h]=s.pHYs[2],h++,l(b,h,f(b,h-13,13)),h+=4),d&&(l(b,h,8),h+=4,u(b,h,\"acTL\"),h+=4,l(b,h,e.frames.length),h+=4,l(b,h,null!=s.loop?s.loop:0),h+=4,l(b,h,f(b,h-12,12)),h+=4),3==e.ctype){l(b,h,3*(m=e.plte.length)),h+=4,u(b,h,\"PLTE\"),h+=4;for(w=0;w<m;w++){const t=3*w,r=e.plte[w],i=255&r,o=r>>>8&255,a=r>>>16&255;b[h+t+0]=i,b[h+t+1]=o,b[h+t+2]=a}if(h+=3*m,l(b,h,f(b,h-3*m-4,3*m+4)),h+=4,g){l(b,h,m),h+=4,u(b,h,\"tRNS\"),h+=4;for(w=0;w<m;w++)b[h+w]=e.plte[w]>>>24&255;h+=m,l(b,h,f(b,h-m-4,m+4)),h+=4}}let E=0;for(v=0;v<e.frames.length;v++){var F=e.frames[v];d&&(l(b,h,26),h+=4,u(b,h,\"fcTL\"),h+=4,l(b,h,E++),h+=4,l(b,h,F.rect.width),h+=4,l(b,h,F.rect.height),h+=4,l(b,h,F.rect.x),h+=4,l(b,h,F.rect.y),h+=4,c(b,h,a[v]),h+=2,c(b,h,1e3),h+=2,b[h]=F.dispose,h++,b[h]=F.blend,h++,l(b,h,f(b,h-30,30)),h+=4);const t=F.cimg;l(b,h,(m=t.length)+(0==v?0:4)),h+=4;const r=h;u(b,h,0==v?\"IDAT\":\"fdAT\"),h+=4,0!=v&&(l(b,h,E++),h+=4),b.set(t,h),h+=m,l(b,h,f(b,r,h-r)),h+=4}return l(b,h,0),h+=4,u(b,h,\"IEND\"),h+=4,l(b,h,f(b,h-4,4)),h+=4,b.buffer}function compressPNG(e,t,r){for(let i=0;i<e.frames.length;i++){const o=e.frames[i];o.rect.width;const a=o.rect.height,s=new Uint8Array(a*o.bpl+a);o.cimg=_filterZero(o.img,a,o.bpp,o.bpl,s,t,r)}}function compress(t,r,i,o,a){const s=a[0],f=a[1],l=a[2],c=a[3],u=a[4],h=a[5];let d=6,A=8,g=255;for(var p=0;p<t.length;p++){const e=new Uint8Array(t[p]);for(var m=e.length,w=0;w<m;w+=4)g&=e[w+3]}const v=255!=g,b=function framize(t,r,i,o,a,s){const f=[];for(var l=0;l<t.length;l++){const h=new Uint8Array(t[l]),A=new Uint32Array(h.buffer);var c;let g=0,p=0,m=r,w=i,v=o?1:0;if(0!=l){const b=s||o||1==l||0!=f[l-2].dispose?1:2;let y=0,E=1e9;for(let e=0;e<b;e++){var u=new Uint8Array(t[l-1-e]);const o=new Uint32Array(t[l-1-e]);let s=r,f=i,c=-1,h=-1;for(let e=0;e<i;e++)for(let t=0;t<r;t++){A[d=e*r+t]!=o[d]&&(t<s&&(s=t),t>c&&(c=t),e<f&&(f=e),e>h&&(h=e))}-1==c&&(s=f=c=h=0),a&&(1==(1&s)&&s--,1==(1&f)&&f--);const v=(c-s+1)*(h-f+1);v<E&&(E=v,y=e,g=s,p=f,m=c-s+1,w=h-f+1)}u=new Uint8Array(t[l-1-y]);1==y&&(f[l-1].dispose=2),c=new Uint8Array(m*w*4),e(u,r,i,c,m,w,-g,-p,0),v=e(h,r,i,c,m,w,-g,-p,3)?1:0,1==v?_prepareDiff(h,r,i,c,{x:g,y:p,width:m,height:w}):e(h,r,i,c,m,w,-g,-p,0)}else c=h.slice(0);f.push({rect:{x:g,y:p,width:m,height:w},img:c,blend:v,dispose:0})}if(o)for(l=0;l<f.length;l++){if(1==(A=f[l]).blend)continue;const e=A.rect,o=f[l-1].rect,s=Math.min(e.x,o.x),c=Math.min(e.y,o.y),u={x:s,y:c,width:Math.max(e.x+e.width,o.x+o.width)-s,height:Math.max(e.y+e.height,o.y+o.height)-c};f[l-1].dispose=1,l-1!=0&&_updateFrame(t,r,i,f,l-1,u,a),_updateFrame(t,r,i,f,l,u,a)}let h=0;if(1!=t.length)for(var d=0;d<f.length;d++){var A;h+=(A=f[d]).rect.width*A.rect.height}return f}(t,r,i,s,f,l),y={},E=[],F=[];if(0!=o){const e=[];for(w=0;w<b.length;w++)e.push(b[w].img.buffer);const t=function concatRGBA(e){let t=0;for(var r=0;r<e.length;r++)t+=e[r].byteLength;const i=new Uint8Array(t);let o=0;for(r=0;r<e.length;r++){const t=new Uint8Array(e[r]),a=t.length;for(let e=0;e<a;e+=4){let r=t[e],a=t[e+1],s=t[e+2];const f=t[e+3];0==f&&(r=a=s=0),i[o+e]=r,i[o+e+1]=a,i[o+e+2]=s,i[o+e+3]=f}o+=a}return i.buffer}(e),r=quantize(t,o);for(w=0;w<r.plte.length;w++)E.push(r.plte[w].est.rgba);let i=0;for(w=0;w<b.length;w++){const e=(B=b[w]).img.length;var _=new Uint8Array(r.inds.buffer,i>>2,e>>2);F.push(_);const t=new Uint8Array(r.abuf,i,e);h&&dither(B.img,B.rect.width,B.rect.height,E,t,_),B.img.set(t),i+=e}}else for(p=0;p<b.length;p++){var B=b[p];const e=new Uint32Array(B.img.buffer);var U=B.rect.width;m=e.length,_=new Uint8Array(m);F.push(_);for(w=0;w<m;w++){const t=e[w];if(0!=w&&t==e[w-1])_[w]=_[w-1];else if(w>U&&t==e[w-U])_[w]=_[w-U];else{let e=y[t];if(null==e&&(y[t]=e=E.length,E.push(t),E.length>=300))break;_[w]=e}}}const C=E.length;C<=256&&0==u&&(A=C<=2?1:C<=4?2:C<=16?4:8,A=Math.max(A,c));for(p=0;p<b.length;p++){(B=b[p]).rect.x,B.rect.y;U=B.rect.width;const e=B.rect.height;let t=B.img;new Uint32Array(t.buffer);let r=4*U,i=4;if(C<=256&&0==u){r=Math.ceil(A*U/8);var I=new Uint8Array(r*e);const o=F[p];for(let t=0;t<e;t++){w=t*r;const e=t*U;if(8==A)for(var Q=0;Q<U;Q++)I[w+Q]=o[e+Q];else if(4==A)for(Q=0;Q<U;Q++)I[w+(Q>>1)]|=o[e+Q]<<4-4*(1&Q);else if(2==A)for(Q=0;Q<U;Q++)I[w+(Q>>2)]|=o[e+Q]<<6-2*(3&Q);else if(1==A)for(Q=0;Q<U;Q++)I[w+(Q>>3)]|=o[e+Q]<<7-1*(7&Q)}t=I,d=3,i=1}else if(0==v&&1==b.length){I=new Uint8Array(U*e*3);const o=U*e;for(w=0;w<o;w++){const e=3*w,r=4*w;I[e]=t[r],I[e+1]=t[r+1],I[e+2]=t[r+2]}t=I,d=2,i=3,r=3*U}B.img=t,B.bpl=r,B.bpp=i}return{ctype:d,depth:A,plte:E,frames:b}}function _updateFrame(t,r,i,o,a,s,f){const l=Uint8Array,c=Uint32Array,u=new l(t[a-1]),h=new c(t[a-1]),d=a+1<t.length?new l(t[a+1]):null,A=new l(t[a]),g=new c(A.buffer);let p=r,m=i,w=-1,v=-1;for(let e=0;e<s.height;e++)for(let t=0;t<s.width;t++){const i=s.x+t,f=s.y+e,l=f*r+i,c=g[l];0==c||0==o[a-1].dispose&&h[l]==c&&(null==d||0!=d[4*l+3])||(i<p&&(p=i),i>w&&(w=i),f<m&&(m=f),f>v&&(v=f))}-1==w&&(p=m=w=v=0),f&&(1==(1&p)&&p--,1==(1&m)&&m--),s={x:p,y:m,width:w-p+1,height:v-m+1};const b=o[a];b.rect=s,b.blend=1,b.img=new Uint8Array(s.width*s.height*4),0==o[a-1].dispose?(e(u,r,i,b.img,s.width,s.height,-s.x,-s.y,0),_prepareDiff(A,r,i,b.img,s)):e(A,r,i,b.img,s.width,s.height,-s.x,-s.y,0)}function _prepareDiff(t,r,i,o,a){e(t,r,i,o,a.width,a.height,-a.x,-a.y,2)}function _filterZero(e,t,r,i,o,a,s){const f=[];let l,c=[0,1,2,3,4];-1!=a?c=[a]:(t*i>5e5||1==r)&&(c=[0]),s&&(l={level:0});const u=UZIP;for(var h=0;h<c.length;h++){for(let a=0;a<t;a++)_filterLine(o,e,a,i,r,c[h]);f.push(u.deflate(o,l))}let d,A=1e9;for(h=0;h<f.length;h++)f[h].length<A&&(d=h,A=f[h].length);return f[d]}function _filterLine(e,t,i,o,a,s){const f=i*o;let l=f+i;if(e[l]=s,l++,0==s)if(o<500)for(var c=0;c<o;c++)e[l+c]=t[f+c];else e.set(new Uint8Array(t.buffer,f,o),l);else if(1==s){for(c=0;c<a;c++)e[l+c]=t[f+c];for(c=a;c<o;c++)e[l+c]=t[f+c]-t[f+c-a]+256&255}else if(0==i){for(c=0;c<a;c++)e[l+c]=t[f+c];if(2==s)for(c=a;c<o;c++)e[l+c]=t[f+c];if(3==s)for(c=a;c<o;c++)e[l+c]=t[f+c]-(t[f+c-a]>>1)+256&255;if(4==s)for(c=a;c<o;c++)e[l+c]=t[f+c]-r(t[f+c-a],0,0)+256&255}else{if(2==s)for(c=0;c<o;c++)e[l+c]=t[f+c]+256-t[f+c-o]&255;if(3==s){for(c=0;c<a;c++)e[l+c]=t[f+c]+256-(t[f+c-o]>>1)&255;for(c=a;c<o;c++)e[l+c]=t[f+c]+256-(t[f+c-o]+t[f+c-a]>>1)&255}if(4==s){for(c=0;c<a;c++)e[l+c]=t[f+c]+256-r(0,t[f+c-o],0)&255;for(c=a;c<o;c++)e[l+c]=t[f+c]+256-r(t[f+c-a],t[f+c-o],t[f+c-a-o])&255}}}function quantize(e,t){const r=new Uint8Array(e),i=r.slice(0),o=new Uint32Array(i.buffer),a=getKDtree(i,t),s=a[0],f=a[1],l=r.length,c=new Uint8Array(l>>2);let u;if(r.length<2e7)for(var h=0;h<l;h+=4){u=getNearest(s,d=r[h]*(1/255),A=r[h+1]*(1/255),g=r[h+2]*(1/255),p=r[h+3]*(1/255)),c[h>>2]=u.ind,o[h>>2]=u.est.rgba}else for(h=0;h<l;h+=4){var d=r[h]*(1/255),A=r[h+1]*(1/255),g=r[h+2]*(1/255),p=r[h+3]*(1/255);for(u=s;u.left;)u=planeDst(u.est,d,A,g,p)<=0?u.left:u.right;c[h>>2]=u.ind,o[h>>2]=u.est.rgba}return{abuf:i.buffer,inds:c,plte:f}}function getKDtree(e,t,r){null==r&&(r=1e-4);const i=new Uint32Array(e.buffer),o={i0:0,i1:e.length,bst:null,est:null,tdst:0,left:null,right:null};o.bst=stats(e,o.i0,o.i1),o.est=estats(o.bst);const a=[o];for(;a.length<t;){let t=0,o=0;for(var s=0;s<a.length;s++)a[s].est.L>t&&(t=a[s].est.L,o=s);if(t<r)break;const f=a[o],l=splitPixels(e,i,f.i0,f.i1,f.est.e,f.est.eMq255);if(f.i0>=l||f.i1<=l){f.est.L=0;continue}const c={i0:f.i0,i1:l,bst:null,est:null,tdst:0,left:null,right:null};c.bst=stats(e,c.i0,c.i1),c.est=estats(c.bst);const u={i0:l,i1:f.i1,bst:null,est:null,tdst:0,left:null,right:null};u.bst={R:[],m:[],N:f.bst.N-c.bst.N};for(s=0;s<16;s++)u.bst.R[s]=f.bst.R[s]-c.bst.R[s];for(s=0;s<4;s++)u.bst.m[s]=f.bst.m[s]-c.bst.m[s];u.est=estats(u.bst),f.left=c,f.right=u,a[o]=c,a.push(u)}a.sort(((e,t)=>t.bst.N-e.bst.N));for(s=0;s<a.length;s++)a[s].ind=s;return[o,a]}function getNearest(e,t,r,i,o){if(null==e.left)return e.tdst=function dist(e,t,r,i,o){const a=t-e[0],s=r-e[1],f=i-e[2],l=o-e[3];return a*a+s*s+f*f+l*l}(e.est.q,t,r,i,o),e;const a=planeDst(e.est,t,r,i,o);let s=e.left,f=e.right;a>0&&(s=e.right,f=e.left);const l=getNearest(s,t,r,i,o);if(l.tdst<=a*a)return l;const c=getNearest(f,t,r,i,o);return c.tdst<l.tdst?c:l}function planeDst(e,t,r,i,o){const{e:a}=e;return a[0]*t+a[1]*r+a[2]*i+a[3]*o-e.eMq}function splitPixels(e,t,r,i,o,a){for(i-=4;r<i;){for(;vecDot(e,r,o)<=a;)r+=4;for(;vecDot(e,i,o)>a;)i-=4;if(r>=i)break;const s=t[r>>2];t[r>>2]=t[i>>2],t[i>>2]=s,r+=4,i-=4}for(;vecDot(e,r,o)>a;)r-=4;return r+4}function vecDot(e,t,r){return e[t]*r[0]+e[t+1]*r[1]+e[t+2]*r[2]+e[t+3]*r[3]}function stats(e,t,r){const i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],o=[0,0,0,0],a=r-t>>2;for(let a=t;a<r;a+=4){const t=e[a]*(1/255),r=e[a+1]*(1/255),s=e[a+2]*(1/255),f=e[a+3]*(1/255);o[0]+=t,o[1]+=r,o[2]+=s,o[3]+=f,i[0]+=t*t,i[1]+=t*r,i[2]+=t*s,i[3]+=t*f,i[5]+=r*r,i[6]+=r*s,i[7]+=r*f,i[10]+=s*s,i[11]+=s*f,i[15]+=f*f}return i[4]=i[1],i[8]=i[2],i[9]=i[6],i[12]=i[3],i[13]=i[7],i[14]=i[11],{R:i,m:o,N:a}}function estats(e){const{R:t}=e,{m:r}=e,{N:i}=e,a=r[0],s=r[1],f=r[2],l=r[3],c=0==i?0:1/i,u=[t[0]-a*a*c,t[1]-a*s*c,t[2]-a*f*c,t[3]-a*l*c,t[4]-s*a*c,t[5]-s*s*c,t[6]-s*f*c,t[7]-s*l*c,t[8]-f*a*c,t[9]-f*s*c,t[10]-f*f*c,t[11]-f*l*c,t[12]-l*a*c,t[13]-l*s*c,t[14]-l*f*c,t[15]-l*l*c],h=u,d=o;let A=[Math.random(),Math.random(),Math.random(),Math.random()],g=0,p=0;if(0!=i)for(let e=0;e<16&&(A=d.multVec(h,A),p=Math.sqrt(d.dot(A,A)),A=d.sml(1/p,A),!(0!=e&&Math.abs(p-g)<1e-9));e++)g=p;const m=[a*c,s*c,f*c,l*c];return{Cov:u,q:m,e:A,L:g,eMq255:d.dot(d.sml(255,m),A),eMq:d.dot(A,m),rgba:(Math.round(255*m[3])<<24|Math.round(255*m[2])<<16|Math.round(255*m[1])<<8|Math.round(255*m[0])<<0)>>>0}}var o={multVec:(e,t)=>[e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3],e[4]*t[0]+e[5]*t[1]+e[6]*t[2]+e[7]*t[3],e[8]*t[0]+e[9]*t[1]+e[10]*t[2]+e[11]*t[3],e[12]*t[0]+e[13]*t[1]+e[14]*t[2]+e[15]*t[3]],dot:(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3],sml:(e,t)=>[e*t[0],e*t[1],e*t[2],e*t[3]]};UPNG.encode=function encode(e,t,r,i,o,a,s){null==i&&(i=0),null==s&&(s=!1);const f=compress(e,t,r,i,[!1,!1,!1,0,s,!1]);return compressPNG(f,-1),_main(f,t,r,o,a)},UPNG.encodeLL=function encodeLL(e,t,r,i,o,a,s,f){const l={ctype:0+(1==i?0:2)+(0==o?0:4),depth:a,frames:[]},c=(i+o)*a,u=c*t;for(let i=0;i<e.length;i++)l.frames.push({rect:{x:0,y:0,width:t,height:r},img:new Uint8Array(e[i]),blend:0,dispose:1,bpp:Math.ceil(c/8),bpl:Math.ceil(u/8)});return compressPNG(l,0,!0),_main(l,t,r,s,f)},UPNG.encode.compress=compress,UPNG.encode.dither=dither,UPNG.quantize=quantize,UPNG.quantize.getKDtree=getKDtree,UPNG.quantize.getNearest=getNearest}();const r={toArrayBuffer(e,t){const i=e.width,o=e.height,a=i<<2,s=e.getContext(\"2d\").getImageData(0,0,i,o),f=new Uint32Array(s.data.buffer),l=(32*i+31)/32<<2,c=l*o,u=122+c,h=new ArrayBuffer(u),d=new DataView(h),A=1<<20;let g,p,m,w,v=A,b=0,y=0,E=0;function set16(e){d.setUint16(y,e,!0),y+=2}function set32(e){d.setUint32(y,e,!0),y+=4}function seek(e){y+=e}set16(19778),set32(u),seek(4),set32(122),set32(108),set32(i),set32(-o>>>0),set16(1),set16(32),set32(3),set32(c),set32(2835),set32(2835),seek(8),set32(16711680),set32(65280),set32(255),set32(4278190080),set32(1466527264),function convert(){for(;b<o&&v>0;){for(w=122+b*l,g=0;g<a;)v--,p=f[E++],m=p>>>24,d.setUint32(w+g,p<<8|m),g+=4;b++}E<f.length?(v=A,setTimeout(convert,r._dly)):t(h)}()},toBlob(e,t){this.toArrayBuffer(e,(e=>{t(new Blob([e],{type:\"image/bmp\"}))}))},_dly:9};var i={CHROME:\"CHROME\",FIREFOX:\"FIREFOX\",DESKTOP_SAFARI:\"DESKTOP_SAFARI\",IE:\"IE\",IOS:\"IOS\",ETC:\"ETC\"},o={[i.CHROME]:16384,[i.FIREFOX]:11180,[i.DESKTOP_SAFARI]:16384,[i.IE]:8192,[i.IOS]:4096,[i.ETC]:8192};const a=\"undefined\"!=typeof window,s=\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,f=a&&window.cordova&&window.cordova.require&&window.cordova.require(\"cordova/modulemapper\"),CustomFile=(a||s)&&(f&&f.getOriginalSymbol(window,\"File\")||\"undefined\"!=typeof File&&File),CustomFileReader=(a||s)&&(f&&f.getOriginalSymbol(window,\"FileReader\")||\"undefined\"!=typeof FileReader&&FileReader);function getFilefromDataUrl(e,t,r=Date.now()){return new Promise((i=>{const o=e.split(\",\"),a=o[0].match(/:(.*?);/)[1],s=globalThis.atob(o[1]);let f=s.length;const l=new Uint8Array(f);for(;f--;)l[f]=s.charCodeAt(f);const c=new Blob([l],{type:a});c.name=t,c.lastModified=r,i(c)}))}function getDataUrlFromFile(e){return new Promise(((t,r)=>{const i=new CustomFileReader;i.onload=()=>t(i.result),i.onerror=e=>r(e),i.readAsDataURL(e)}))}function loadImage(e){return new Promise(((t,r)=>{const i=new Image;i.onload=()=>t(i),i.onerror=e=>r(e),i.src=e}))}function getBrowserName(){if(void 0!==getBrowserName.cachedResult)return getBrowserName.cachedResult;let e=i.ETC;const{userAgent:t}=navigator;return/Chrom(e|ium)/i.test(t)?e=i.CHROME:/iP(ad|od|hone)/i.test(t)&&/WebKit/i.test(t)?e=i.IOS:/Safari/i.test(t)?e=i.DESKTOP_SAFARI:/Firefox/i.test(t)?e=i.FIREFOX:(/MSIE/i.test(t)||!0==!!document.documentMode)&&(e=i.IE),getBrowserName.cachedResult=e,getBrowserName.cachedResult}function approximateBelowMaximumCanvasSizeOfBrowser(e,t){const r=getBrowserName(),i=o[r];let a=e,s=t,f=a*s;const l=a>s?s/a:a/s;for(;f>i*i;){const e=(i+a)/2,t=(i+s)/2;e<t?(s=t,a=t*l):(s=e*l,a=e),f=a*s}return{width:a,height:s}}function getNewCanvasAndCtx(e,t){let r,i;try{if(r=new OffscreenCanvas(e,t),i=r.getContext(\"2d\"),null===i)throw new Error(\"getContext of OffscreenCanvas returns null\")}catch(e){r=document.createElement(\"canvas\"),i=r.getContext(\"2d\")}return r.width=e,r.height=t,[r,i]}function drawImageInCanvas(e,t){const{width:r,height:i}=approximateBelowMaximumCanvasSizeOfBrowser(e.width,e.height),[o,a]=getNewCanvasAndCtx(r,i);return t&&/jpe?g/.test(t)&&(a.fillStyle=\"white\",a.fillRect(0,0,o.width,o.height)),a.drawImage(e,0,0,o.width,o.height),o}function isIOS(){return void 0!==isIOS.cachedResult||(isIOS.cachedResult=[\"iPad Simulator\",\"iPhone Simulator\",\"iPod Simulator\",\"iPad\",\"iPhone\",\"iPod\"].includes(navigator.platform)||navigator.userAgent.includes(\"Mac\")&&\"undefined\"!=typeof document&&\"ontouchend\"in document),isIOS.cachedResult}function drawFileInCanvas(e,t={}){return new Promise((function(r,o){let a,s;var $Try_2_Post=function(){try{return s=drawImageInCanvas(a,t.fileType||e.type),r([a,s])}catch(e){return o(e)}},$Try_2_Catch=function(t){try{0;var $Try_3_Catch=function(e){try{throw e}catch(e){return o(e)}};try{let t;return getDataUrlFromFile(e).then((function(e){try{return t=e,loadImage(t).then((function(e){try{return a=e,function(){try{return $Try_2_Post()}catch(e){return o(e)}}()}catch(e){return $Try_3_Catch(e)}}),$Try_3_Catch)}catch(e){return $Try_3_Catch(e)}}),$Try_3_Catch)}catch(e){$Try_3_Catch(e)}}catch(e){return o(e)}};try{if(isIOS()||[i.DESKTOP_SAFARI,i.MOBILE_SAFARI].includes(getBrowserName()))throw new Error(\"Skip createImageBitmap on IOS and Safari\");return createImageBitmap(e).then((function(e){try{return a=e,$Try_2_Post()}catch(e){return $Try_2_Catch()}}),$Try_2_Catch)}catch(e){$Try_2_Catch()}}))}function canvasToFile(e,t,i,o,a=1){return new Promise((function(s,f){let l;if(\"image/png\"===t){let c,u,h;return c=e.getContext(\"2d\"),({data:u}=c.getImageData(0,0,e.width,e.height)),h=UPNG.encode([u.buffer],e.width,e.height,4096*a),l=new Blob([h],{type:t}),l.name=i,l.lastModified=o,$If_4.call(this)}{if(\"image/bmp\"===t)return new Promise((t=>r.toBlob(e,t))).then(function(e){try{return l=e,l.name=i,l.lastModified=o,$If_5.call(this)}catch(e){return f(e)}}.bind(this),f);{if(\"function\"==typeof OffscreenCanvas&&e instanceof OffscreenCanvas)return e.convertToBlob({type:t,quality:a}).then(function(e){try{return l=e,l.name=i,l.lastModified=o,$If_6.call(this)}catch(e){return f(e)}}.bind(this),f);{let d;return d=e.toDataURL(t,a),getFilefromDataUrl(d,i,o).then(function(e){try{return l=e,$If_6.call(this)}catch(e){return f(e)}}.bind(this),f)}function $If_6(){return $If_5.call(this)}}function $If_5(){return $If_4.call(this)}}function $If_4(){return s(l)}}))}function cleanupCanvasMemory(e){e.width=0,e.height=0}function isAutoOrientationInBrowser(){return new Promise((function(e,t){let r,i,o,a,s;return void 0!==isAutoOrientationInBrowser.cachedResult?e(isAutoOrientationInBrowser.cachedResult):(r=\"data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==\",getFilefromDataUrl(\"data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==\",\"test.jpg\",Date.now()).then((function(r){try{return i=r,drawFileInCanvas(i).then((function(r){try{return o=r[1],canvasToFile(o,i.type,i.name,i.lastModified).then((function(r){try{return a=r,cleanupCanvasMemory(o),drawFileInCanvas(a).then((function(r){try{return s=r[0],isAutoOrientationInBrowser.cachedResult=1===s.width&&2===s.height,e(isAutoOrientationInBrowser.cachedResult)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t))}))}function getExifOrientation(e){return new Promise(((t,r)=>{const i=new CustomFileReader;i.onload=e=>{const r=new DataView(e.target.result);if(65496!=r.getUint16(0,!1))return t(-2);const i=r.byteLength;let o=2;for(;o<i;){if(r.getUint16(o+2,!1)<=8)return t(-1);const e=r.getUint16(o,!1);if(o+=2,65505==e){if(1165519206!=r.getUint32(o+=2,!1))return t(-1);const e=18761==r.getUint16(o+=6,!1);o+=r.getUint32(o+4,e);const i=r.getUint16(o,e);o+=2;for(let a=0;a<i;a++)if(274==r.getUint16(o+12*a,e))return t(r.getUint16(o+12*a+8,e))}else{if(65280!=(65280&e))break;o+=r.getUint16(o,!1)}}return t(-1)},i.onerror=e=>r(e),i.readAsArrayBuffer(e)}))}function handleMaxWidthOrHeight(e,t){const{width:r}=e,{height:i}=e,{maxWidthOrHeight:o}=t;let a,s=e;return isFinite(o)&&(r>o||i>o)&&([s,a]=getNewCanvasAndCtx(r,i),r>i?(s.width=o,s.height=i/r*o):(s.width=r/i*o,s.height=o),a.drawImage(e,0,0,s.width,s.height),cleanupCanvasMemory(e)),s}function followExifOrientation(e,t){const{width:r}=e,{height:i}=e,[o,a]=getNewCanvasAndCtx(r,i);switch(t>4&&t<9?(o.width=i,o.height=r):(o.width=r,o.height=i),t){case 2:a.transform(-1,0,0,1,r,0);break;case 3:a.transform(-1,0,0,-1,r,i);break;case 4:a.transform(1,0,0,-1,0,i);break;case 5:a.transform(0,1,1,0,0,0);break;case 6:a.transform(0,1,-1,0,i,0);break;case 7:a.transform(0,-1,-1,0,i,r);break;case 8:a.transform(0,-1,1,0,0,r)}return a.drawImage(e,0,0,r,i),cleanupCanvasMemory(e),o}function compress(e,t,r=0){return new Promise((function(i,o){let a,s,f,l,c,u,h,d,A,g,p,m,w,v,b,y,E,F,_,B;function incProgress(e=5){if(t.signal&&t.signal.aborted)throw t.signal.reason;a+=e,t.onProgress(Math.min(a,100))}function setProgress(e){if(t.signal&&t.signal.aborted)throw t.signal.reason;a=Math.min(Math.max(e,a),100),t.onProgress(a)}return a=r,s=t.maxIteration||10,f=1024*t.maxSizeMB*1024,incProgress(),drawFileInCanvas(e,t).then(function(r){try{return[,l]=r,incProgress(),c=handleMaxWidthOrHeight(l,t),incProgress(),new Promise((function(r,i){var o;if(!(o=t.exifOrientation))return getExifOrientation(e).then(function(e){try{return o=e,$If_2.call(this)}catch(e){return i(e)}}.bind(this),i);function $If_2(){return r(o)}return $If_2.call(this)})).then(function(r){try{return u=r,incProgress(),isAutoOrientationInBrowser().then(function(r){try{return h=r?c:followExifOrientation(c,u),incProgress(),d=t.initialQuality||1,A=t.fileType||e.type,canvasToFile(h,A,e.name,e.lastModified,d).then(function(r){try{{if(g=r,incProgress(),p=g.size>f,m=g.size>e.size,!p&&!m)return setProgress(100),i(g);var a;function $Loop_3(){if(s--&&(b>f||b>w)){let t,r;return t=B?.95*_.width:_.width,r=B?.95*_.height:_.height,[E,F]=getNewCanvasAndCtx(t,r),F.drawImage(_,0,0,t,r),d*=\"image/png\"===A?.85:.95,canvasToFile(E,A,e.name,e.lastModified,d).then((function(e){try{return y=e,cleanupCanvasMemory(_),_=E,b=y.size,setProgress(Math.min(99,Math.floor((v-b)/(v-f)*100))),$Loop_3}catch(e){return o(e)}}),o)}return[1]}return w=e.size,v=g.size,b=v,_=h,B=!t.alwaysKeepResolution&&p,(a=function(e){for(;e;){if(e.then)return void e.then(a,o);try{if(e.pop){if(e.length)return e.pop()?$Loop_3_exit.call(this):e;e=$Loop_3}else e=e.call(this)}catch(e){return o(e)}}}.bind(this))($Loop_3);function $Loop_3_exit(){return cleanupCanvasMemory(_),cleanupCanvasMemory(E),cleanupCanvasMemory(c),cleanupCanvasMemory(h),cleanupCanvasMemory(l),setProgress(100),i(y)}}}catch(u){return o(u)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}))}const l=\"\\nlet scriptImported = false\\nself.addEventListener('message', async (e) => {\\n const { file, id, imageCompressionLibUrl, options } = e.data\\n options.onProgress = (progress) => self.postMessage({ progress, id })\\n try {\\n if (!scriptImported) {\\n // console.log('[worker] importScripts', imageCompressionLibUrl)\\n self.importScripts(imageCompressionLibUrl)\\n scriptImported = true\\n }\\n // console.log('[worker] self', self)\\n const compressedFile = await imageCompression(file, options)\\n self.postMessage({ file: compressedFile, id })\\n } catch (e) {\\n // console.error('[worker] error', e)\\n self.postMessage({ error: e.message + '\\\\n' + e.stack, id })\\n }\\n})\\n\";let c;function compressOnWebWorker(e,t){return new Promise(((r,i)=>{c||(c=function createWorkerScriptURL(e){const t=[];return\"function\"==typeof e?t.push(`(${e})()`):t.push(e),URL.createObjectURL(new Blob(t))}(l));const o=new Worker(c);o.addEventListener(\"message\",(function handler(e){if(t.signal&&t.signal.aborted)o.terminate();else if(void 0===e.data.progress){if(e.data.error)return i(new Error(e.data.error)),void o.terminate();r(e.data.file),o.terminate()}else t.onProgress(e.data.progress)})),o.addEventListener(\"error\",i),t.signal&&t.signal.addEventListener(\"abort\",(()=>{i(t.signal.reason),o.terminate()})),o.postMessage({file:e,imageCompressionLibUrl:t.libURL,options:{...t,onProgress:void 0,signal:void 0}})}))}function imageCompression(e,t){return new Promise((function(r,i){let o,a,s,f,l,c;if(o={...t},s=0,({onProgress:f}=o),o.maxSizeMB=o.maxSizeMB||Number.POSITIVE_INFINITY,l=\"boolean\"!=typeof o.useWebWorker||o.useWebWorker,delete o.useWebWorker,o.onProgress=e=>{s=e,\"function\"==typeof f&&f(s)},!(e instanceof Blob||e instanceof CustomFile))return i(new Error(\"The file given is not an instance of Blob or File\"));if(!/^image/.test(e.type))return i(new Error(\"The file given is not an image\"));if(c=\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,!l||\"function\"!=typeof Worker||c)return compress(e,o).then(function(e){try{return a=e,$If_4.call(this)}catch(e){return i(e)}}.bind(this),i);var u=function(){try{return $If_4.call(this)}catch(e){return i(e)}}.bind(this),$Try_1_Catch=function(t){try{return compress(e,o).then((function(e){try{return a=e,u()}catch(e){return i(e)}}),i)}catch(e){return i(e)}};try{return o.libURL=o.libURL||\"https://cdn.jsdelivr.net/npm/browser-image-compression@2.0.2/dist/browser-image-compression.js\",compressOnWebWorker(e,o).then((function(e){try{return a=e,u()}catch(e){return $Try_1_Catch()}}),$Try_1_Catch)}catch(e){$Try_1_Catch()}function $If_4(){try{a.name=e.name,a.lastModified=e.lastModified}catch(e){}try{o.preserveExif&&\"image/jpeg\"===e.type&&(!o.fileType||o.fileType&&o.fileType===e.type)&&(a=copyExifWithoutOrientation(e,a))}catch(e){}return r(a)}}))}imageCompression.getDataUrlFromFile=getDataUrlFromFile,imageCompression.getFilefromDataUrl=getFilefromDataUrl,imageCompression.loadImage=loadImage,imageCompression.drawImageInCanvas=drawImageInCanvas,imageCompression.drawFileInCanvas=drawFileInCanvas,imageCompression.canvasToFile=canvasToFile,imageCompression.getExifOrientation=getExifOrientation,imageCompression.handleMaxWidthOrHeight=handleMaxWidthOrHeight,imageCompression.followExifOrientation=followExifOrientation,imageCompression.cleanupCanvasMemory=cleanupCanvasMemory,imageCompression.isAutoOrientationInBrowser=isAutoOrientationInBrowser,imageCompression.approximateBelowMaximumCanvasSizeOfBrowser=approximateBelowMaximumCanvasSizeOfBrowser,imageCompression.copyExifWithoutOrientation=copyExifWithoutOrientation,imageCompression.getBrowserName=getBrowserName,imageCompression.version=\"2.0.2\";\n//# sourceMappingURL=browser-image-compression.mjs.map\n\n\n//# sourceURL=webpack:///./node_modules/browser-image-compression/dist/browser-image-compression.mjs?"); |
| 100 | |
| 101 | /***/ }), |
| 102 | |
| 103 | /***/ "./node_modules/wasm-feature-detect/dist/esm/index.js": |
| 104 | /*!************************************************************!*\ |
| 105 | !*** ./node_modules/wasm-feature-detect/dist/esm/index.js ***! |
| 106 | \************************************************************/ |
| 107 | /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { |
| 108 | |
| 109 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bigInt\": () => (/* binding */ bigInt),\n/* harmony export */ \"bulkMemory\": () => (/* binding */ bulkMemory),\n/* harmony export */ \"exceptions\": () => (/* binding */ exceptions),\n/* harmony export */ \"extendedConst\": () => (/* binding */ extendedConst),\n/* harmony export */ \"gc\": () => (/* binding */ gc),\n/* harmony export */ \"memory64\": () => (/* binding */ memory64),\n/* harmony export */ \"multiValue\": () => (/* binding */ multiValue),\n/* harmony export */ \"mutableGlobals\": () => (/* binding */ mutableGlobals),\n/* harmony export */ \"referenceTypes\": () => (/* binding */ referenceTypes),\n/* harmony export */ \"relaxedSimd\": () => (/* binding */ relaxedSimd),\n/* harmony export */ \"saturatedFloatToInt\": () => (/* binding */ saturatedFloatToInt),\n/* harmony export */ \"signExtensions\": () => (/* binding */ signExtensions),\n/* harmony export */ \"simd\": () => (/* binding */ simd),\n/* harmony export */ \"streamingCompilation\": () => (/* binding */ streamingCompilation),\n/* harmony export */ \"tailCall\": () => (/* binding */ tailCall),\n/* harmony export */ \"threads\": () => (/* binding */ threads)\n/* harmony export */ });\nconst bigInt=()=>(async e=>{try{return(await WebAssembly.instantiate(e)).instance.exports.b(BigInt(0))===BigInt(0)}catch(e){return!1}})(new Uint8Array([0,97,115,109,1,0,0,0,1,6,1,96,1,126,1,126,3,2,1,0,7,5,1,1,98,0,0,10,6,1,4,0,32,0,11])),bulkMemory=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,3,1,0,1,10,14,1,12,0,65,0,65,0,65,0,252,10,0,0,11])),exceptions=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,6,64,25,11,11])),extendedConst=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,5,3,1,0,1,11,9,1,0,65,1,65,2,106,11,0])),gc=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,10,2,95,1,125,0,96,0,1,107,0,3,2,1,1,10,12,1,10,0,67,0,0,0,0,251,7,0,11])),memory64=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,5,3,1,4,1])),multiValue=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,6,1,96,0,2,127,127,3,2,1,0,10,8,1,6,0,65,0,65,0,11])),mutableGlobals=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,2,8,1,1,97,1,98,3,127,1,6,6,1,127,1,65,0,11,7,5,1,1,97,3,1])),referenceTypes=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,7,1,5,0,208,112,26,11])),relaxedSimd=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,15,1,13,0,65,1,253,15,65,2,253,15,253,128,2,11])),saturatedFloatToInt=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,12,1,10,0,67,0,0,0,0,252,0,26,11])),signExtensions=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,65,0,192,26,11])),simd=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11])),streamingCompilation=()=>(async()=>\"compileStreaming\"in WebAssembly)(),tailCall=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,6,1,4,0,18,0,11])),threads=()=>(async e=>{try{return\"undefined\"!=typeof MessageChannel&&(new MessageChannel).port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(e)}catch(e){return!1}})(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]));\n\n\n//# sourceURL=webpack:///./node_modules/wasm-feature-detect/dist/esm/index.js?"); |
| 110 | |
| 111 | /***/ }) |
| 112 | |
| 113 | /******/ }); |
| 114 | /************************************************************************/ |
| 115 | /******/ // The module cache |
| 116 | /******/ var __webpack_module_cache__ = {}; |
| 117 | /******/ |
| 118 | /******/ // The require function |
| 119 | /******/ function __webpack_require__(moduleId) { |
| 120 | /******/ // Check if module is in cache |
| 121 | /******/ var cachedModule = __webpack_module_cache__[moduleId]; |
| 122 | /******/ if (cachedModule !== undefined) { |
| 123 | /******/ return cachedModule.exports; |
| 124 | /******/ } |
| 125 | /******/ // Create a new module (and put it into the cache) |
| 126 | /******/ var module = __webpack_module_cache__[moduleId] = { |
| 127 | /******/ // no module.id needed |
| 128 | /******/ // no module.loaded needed |
| 129 | /******/ exports: {} |
| 130 | /******/ }; |
| 131 | /******/ |
| 132 | /******/ // Execute the module function |
| 133 | /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); |
| 134 | /******/ |
| 135 | /******/ // Return the exports of the module |
| 136 | /******/ return module.exports; |
| 137 | /******/ } |
| 138 | /******/ |
| 139 | /******/ // expose the modules object (__webpack_modules__) |
| 140 | /******/ __webpack_require__.m = __webpack_modules__; |
| 141 | /******/ |
| 142 | /************************************************************************/ |
| 143 | /******/ /* webpack/runtime/define property getters */ |
| 144 | /******/ (() => { |
| 145 | /******/ // define getter functions for harmony exports |
| 146 | /******/ __webpack_require__.d = (exports, definition) => { |
| 147 | /******/ for(var key in definition) { |
| 148 | /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { |
| 149 | /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); |
| 150 | /******/ } |
| 151 | /******/ } |
| 152 | /******/ }; |
| 153 | /******/ })(); |
| 154 | /******/ |
| 155 | /******/ /* webpack/runtime/ensure chunk */ |
| 156 | /******/ (() => { |
| 157 | /******/ __webpack_require__.f = {}; |
| 158 | /******/ // This file contains only the entry chunk. |
| 159 | /******/ // The chunk loading function for additional chunks |
| 160 | /******/ __webpack_require__.e = (chunkId) => { |
| 161 | /******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { |
| 162 | /******/ __webpack_require__.f[key](chunkId, promises); |
| 163 | /******/ return promises; |
| 164 | /******/ }, [])); |
| 165 | /******/ }; |
| 166 | /******/ })(); |
| 167 | /******/ |
| 168 | /******/ /* webpack/runtime/get javascript chunk filename */ |
| 169 | /******/ (() => { |
| 170 | /******/ // This function allow to reference async chunks |
| 171 | /******/ __webpack_require__.u = (chunkId) => { |
| 172 | /******/ // return url for filenames based on template |
| 173 | /******/ return "" + chunkId + ".bundle.js"; |
| 174 | /******/ }; |
| 175 | /******/ })(); |
| 176 | /******/ |
| 177 | /******/ /* webpack/runtime/global */ |
| 178 | /******/ (() => { |
| 179 | /******/ __webpack_require__.g = (function() { |
| 180 | /******/ if (typeof globalThis === 'object') return globalThis; |
| 181 | /******/ try { |
| 182 | /******/ return this || new Function('return this')(); |
| 183 | /******/ } catch (e) { |
| 184 | /******/ if (typeof window === 'object') return window; |
| 185 | /******/ } |
| 186 | /******/ })(); |
| 187 | /******/ })(); |
| 188 | /******/ |
| 189 | /******/ /* webpack/runtime/hasOwnProperty shorthand */ |
| 190 | /******/ (() => { |
| 191 | /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) |
| 192 | /******/ })(); |
| 193 | /******/ |
| 194 | /******/ /* webpack/runtime/load script */ |
| 195 | /******/ (() => { |
| 196 | /******/ var inProgress = {}; |
| 197 | /******/ // data-webpack is not used as build has no uniqueName |
| 198 | /******/ // loadScript function to load a script via script tag |
| 199 | /******/ __webpack_require__.l = (url, done, key, chunkId) => { |
| 200 | /******/ if(inProgress[url]) { inProgress[url].push(done); return; } |
| 201 | /******/ var script, needAttach; |
| 202 | /******/ if(key !== undefined) { |
| 203 | /******/ var scripts = document.getElementsByTagName("script"); |
| 204 | /******/ for(var i = 0; i < scripts.length; i++) { |
| 205 | /******/ var s = scripts[i]; |
| 206 | /******/ if(s.getAttribute("src") == url) { script = s; break; } |
| 207 | /******/ } |
| 208 | /******/ } |
| 209 | /******/ if(!script) { |
| 210 | /******/ needAttach = true; |
| 211 | /******/ script = document.createElement('script'); |
| 212 | /******/ |
| 213 | /******/ script.charset = 'utf-8'; |
| 214 | /******/ script.timeout = 120; |
| 215 | /******/ if (__webpack_require__.nc) { |
| 216 | /******/ script.setAttribute("nonce", __webpack_require__.nc); |
| 217 | /******/ } |
| 218 | /******/ |
| 219 | /******/ script.src = url; |
| 220 | /******/ } |
| 221 | /******/ inProgress[url] = [done]; |
| 222 | /******/ var onScriptComplete = (prev, event) => { |
| 223 | /******/ // avoid mem leaks in IE. |
| 224 | /******/ script.onerror = script.onload = null; |
| 225 | /******/ clearTimeout(timeout); |
| 226 | /******/ var doneFns = inProgress[url]; |
| 227 | /******/ delete inProgress[url]; |
| 228 | /******/ script.parentNode && script.parentNode.removeChild(script); |
| 229 | /******/ doneFns && doneFns.forEach((fn) => (fn(event))); |
| 230 | /******/ if(prev) return prev(event); |
| 231 | /******/ } |
| 232 | /******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); |
| 233 | /******/ script.onerror = onScriptComplete.bind(null, script.onerror); |
| 234 | /******/ script.onload = onScriptComplete.bind(null, script.onload); |
| 235 | /******/ needAttach && document.head.appendChild(script); |
| 236 | /******/ }; |
| 237 | /******/ })(); |
| 238 | /******/ |
| 239 | /******/ /* webpack/runtime/make namespace object */ |
| 240 | /******/ (() => { |
| 241 | /******/ // define __esModule on exports |
| 242 | /******/ __webpack_require__.r = (exports) => { |
| 243 | /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { |
| 244 | /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); |
| 245 | /******/ } |
| 246 | /******/ Object.defineProperty(exports, '__esModule', { value: true }); |
| 247 | /******/ }; |
| 248 | /******/ })(); |
| 249 | /******/ |
| 250 | /******/ /* webpack/runtime/publicPath */ |
| 251 | /******/ (() => { |
| 252 | /******/ var scriptUrl; |
| 253 | /******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + ""; |
| 254 | /******/ var document = __webpack_require__.g.document; |
| 255 | /******/ if (!scriptUrl && document) { |
| 256 | /******/ if (document.currentScript) |
| 257 | /******/ scriptUrl = document.currentScript.src; |
| 258 | /******/ if (!scriptUrl) { |
| 259 | /******/ var scripts = document.getElementsByTagName("script"); |
| 260 | /******/ if(scripts.length) scriptUrl = scripts[scripts.length - 1].src |
| 261 | /******/ } |
| 262 | /******/ } |
| 263 | /******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration |
| 264 | /******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic. |
| 265 | /******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser"); |
| 266 | /******/ scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/"); |
| 267 | /******/ __webpack_require__.p = scriptUrl; |
| 268 | /******/ })(); |
| 269 | /******/ |
| 270 | /******/ /* webpack/runtime/jsonp chunk loading */ |
| 271 | /******/ (() => { |
| 272 | /******/ __webpack_require__.b = document.baseURI || self.location.href; |
| 273 | /******/ |
| 274 | /******/ // object to store loaded and loading chunks |
| 275 | /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched |
| 276 | /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded |
| 277 | /******/ var installedChunks = { |
| 278 | /******/ "script": 0 |
| 279 | /******/ }; |
| 280 | /******/ |
| 281 | /******/ __webpack_require__.f.j = (chunkId, promises) => { |
| 282 | /******/ // JSONP chunk loading for javascript |
| 283 | /******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; |
| 284 | /******/ if(installedChunkData !== 0) { // 0 means "already installed". |
| 285 | /******/ |
| 286 | /******/ // a Promise means "currently loading". |
| 287 | /******/ if(installedChunkData) { |
| 288 | /******/ promises.push(installedChunkData[2]); |
| 289 | /******/ } else { |
| 290 | /******/ if(true) { // all chunks have JS |
| 291 | /******/ // setup Promise in chunk cache |
| 292 | /******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); |
| 293 | /******/ promises.push(installedChunkData[2] = promise); |
| 294 | /******/ |
| 295 | /******/ // start chunk loading |
| 296 | /******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); |
| 297 | /******/ // create error before stack unwound to get useful stacktrace later |
| 298 | /******/ var error = new Error(); |
| 299 | /******/ var loadingEnded = (event) => { |
| 300 | /******/ if(__webpack_require__.o(installedChunks, chunkId)) { |
| 301 | /******/ installedChunkData = installedChunks[chunkId]; |
| 302 | /******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; |
| 303 | /******/ if(installedChunkData) { |
| 304 | /******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); |
| 305 | /******/ var realSrc = event && event.target && event.target.src; |
| 306 | /******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; |
| 307 | /******/ error.name = 'ChunkLoadError'; |
| 308 | /******/ error.type = errorType; |
| 309 | /******/ error.request = realSrc; |
| 310 | /******/ installedChunkData[1](error); |
| 311 | /******/ } |
| 312 | /******/ } |
| 313 | /******/ }; |
| 314 | /******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); |
| 315 | /******/ } else installedChunks[chunkId] = 0; |
| 316 | /******/ } |
| 317 | /******/ } |
| 318 | /******/ }; |
| 319 | /******/ |
| 320 | /******/ // no prefetching |
| 321 | /******/ |
| 322 | /******/ // no preloaded |
| 323 | /******/ |
| 324 | /******/ // no HMR |
| 325 | /******/ |
| 326 | /******/ // no HMR manifest |
| 327 | /******/ |
| 328 | /******/ // no on chunks loaded |
| 329 | /******/ |
| 330 | /******/ // install a JSONP callback for chunk loading |
| 331 | /******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { |
| 332 | /******/ var [chunkIds, moreModules, runtime] = data; |
| 333 | /******/ // add "moreModules" to the modules object, |
| 334 | /******/ // then flag all "chunkIds" as loaded and fire callback |
| 335 | /******/ var moduleId, chunkId, i = 0; |
| 336 | /******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { |
| 337 | /******/ for(moduleId in moreModules) { |
| 338 | /******/ if(__webpack_require__.o(moreModules, moduleId)) { |
| 339 | /******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; |
| 340 | /******/ } |
| 341 | /******/ } |
| 342 | /******/ if(runtime) var result = runtime(__webpack_require__); |
| 343 | /******/ } |
| 344 | /******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); |
| 345 | /******/ for(;i < chunkIds.length; i++) { |
| 346 | /******/ chunkId = chunkIds[i]; |
| 347 | /******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { |
| 348 | /******/ installedChunks[chunkId][0](); |
| 349 | /******/ } |
| 350 | /******/ installedChunks[chunkId] = 0; |
| 351 | /******/ } |
| 352 | /******/ |
| 353 | /******/ } |
| 354 | /******/ |
| 355 | /******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; |
| 356 | /******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); |
| 357 | /******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); |
| 358 | /******/ })(); |
| 359 | /******/ |
| 360 | /************************************************************************/ |
| 361 | /******/ |
| 362 | /******/ // startup |
| 363 | /******/ // Load entry module and return exports |
| 364 | /******/ // This entry module can't be inlined because the eval devtool is used. |
| 365 | /******/ var __webpack_exports__ = __webpack_require__("./assets/js/script.js"); |
| 366 | /******/ |
| 367 | /******/ })() |
| 368 | ; |