@loaders.gl/images
Version:
Framework-independent loaders and writers for images (PNG, JPG, ...)
8 lines (7 loc) • 44.5 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../src/index.ts", "../src/lib/utils/version.ts", "../src/lib/parsers/parse-image.ts", "../src/lib/category-api/image-type.ts", "../src/lib/category-api/parsed-image-api.ts", "../src/lib/parsers/svg-utils.ts", "../src/lib/parsers/parse-to-image.ts", "../src/lib/parsers/parse-to-image-bitmap.ts", "../src/lib/parsers/parse-to-node-image.ts", "../src/lib/category-api/parse-isobmff-binary.ts", "../src/lib/category-api/binary-image-api.ts", "../src/image-loader.ts", "../src/lib/encoders/encode-image.ts", "../src/image-writer.ts", "../src/lib/category-api/image-format.ts"],
"sourcesContent": ["// TYPES\nexport type {ImageDataType, ImageType, ImageTypeEnum} from './types';\nexport type {ImageLoaderOptions} from './image-loader';\n\n// LOADERS AND WRITERS\nexport {ImageLoader} from './image-loader';\nexport {ImageWriter} from './image-writer';\n\n// IMAGE CATEGORY API\n\n// Binary Image API\nexport {getBinaryImageMetadata} from './lib/category-api/binary-image-api';\n\n// Parsed Image API\nexport {isImageTypeSupported, getDefaultImageType} from './lib/category-api/image-type';\n\nexport {\n isImage,\n getImageType,\n getImageSize,\n getImageData\n} from './lib/category-api/parsed-image-api';\n\n// EXPERIMENTAL\nexport {getSupportedImageFormats} from './lib/category-api/image-format';\nexport {isImageFormatSupported} from './lib/category-api/image-format';\n\n// REMOVED\n/** @deprecated Temporary placeholder to prevent builds from breaking */\nexport function loadImage() {\n throw new Error('loadImage has moved to @loaders.gl/textures');\n}\n", "// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n", "import type {LoaderContext} from '@loaders.gl/loader-utils';\nimport {assert} from '@loaders.gl/loader-utils';\nimport type {ImageType} from '../../types';\nimport type {ImageLoaderOptions} from '../../image-loader';\nimport {isImageTypeSupported, getDefaultImageType} from '../category-api/image-type';\nimport {getImageData} from '../category-api/parsed-image-api';\nimport {parseToImage} from './parse-to-image';\nimport {parseToImageBitmap} from './parse-to-image-bitmap';\nimport {parseToNodeImage} from './parse-to-node-image';\n\n// Parse to platform defined image type (data on node, ImageBitmap or HTMLImage on browser)\n// eslint-disable-next-line complexity\nexport async function parseImage(\n arrayBuffer: ArrayBuffer,\n options?: ImageLoaderOptions,\n context?: LoaderContext\n): Promise<ImageType> {\n options = options || {};\n const imageOptions = options.image || {};\n\n // The user can request a specific output format via `options.image.type`\n const imageType = imageOptions.type || 'auto';\n\n const {url} = context || {};\n\n // Note: For options.image.type === `data`, we may still need to load as `image` or `imagebitmap`\n const loadType = getLoadableImageType(imageType);\n\n let image;\n switch (loadType) {\n case 'imagebitmap':\n image = await parseToImageBitmap(arrayBuffer, options, url);\n break;\n case 'image':\n image = await parseToImage(arrayBuffer, options, url);\n break;\n case 'data':\n // Node.js loads imagedata directly\n image = await parseToNodeImage(arrayBuffer, options);\n break;\n default:\n assert(false);\n }\n\n // Browser: if options.image.type === 'data', we can now extract data from the loaded image\n if (imageType === 'data') {\n image = getImageData(image);\n }\n\n return image;\n}\n\n// Get a loadable image type from image type\nfunction getLoadableImageType(type) {\n switch (type) {\n case 'auto':\n case 'data':\n // Browser: For image data we need still need to load using an image format\n // Node: the default image type is `data`.\n return getDefaultImageType();\n default:\n // Throw an error if not supported\n isImageTypeSupported(type);\n return type;\n }\n}\n", "import {isBrowser} from '@loaders.gl/loader-utils';\nimport type {ImageTypeEnum} from '../../types';\n\n// @ts-ignore TS2339: Property does not exist on type\nconst parseImageNode = globalThis.loaders?.parseImageNode;\n\nconst IMAGE_SUPPORTED = typeof Image !== 'undefined'; // NOTE: \"false\" positives if jsdom is installed\nconst IMAGE_BITMAP_SUPPORTED = typeof ImageBitmap !== 'undefined';\nconst NODE_IMAGE_SUPPORTED = Boolean(parseImageNode);\nconst DATA_SUPPORTED = isBrowser ? true : NODE_IMAGE_SUPPORTED;\n\n/**\n * Checks if a loaders.gl image type is supported\n * @param type image type string\n */\nexport function isImageTypeSupported(type: string): boolean {\n switch (type) {\n case 'auto':\n // Should only ever be false in Node.js, if polyfills have not been installed...\n return IMAGE_BITMAP_SUPPORTED || IMAGE_SUPPORTED || DATA_SUPPORTED;\n\n case 'imagebitmap':\n return IMAGE_BITMAP_SUPPORTED;\n case 'image':\n return IMAGE_SUPPORTED;\n case 'data':\n return DATA_SUPPORTED;\n\n default:\n throw new Error(`@loaders.gl/images: image ${type} not supported in this environment`);\n }\n}\n\n/**\n * Returns the \"most performant\" supported image type on this platform\n * @returns image type string\n */\nexport function getDefaultImageType(): ImageTypeEnum {\n if (IMAGE_BITMAP_SUPPORTED) {\n return 'imagebitmap';\n }\n if (IMAGE_SUPPORTED) {\n return 'image';\n }\n if (DATA_SUPPORTED) {\n return 'data';\n }\n\n // This should only happen in Node.js\n throw new Error('Install \\'@loaders.gl/polyfills\\' to parse images under Node.js');\n}\n", "import type {ImageType, ImageTypeEnum, ImageDataType} from '../../types';\n\nexport function isImage(image: ImageType): boolean {\n return Boolean(getImageTypeOrNull(image));\n}\n\nexport function deleteImage(image: ImageType): void {\n switch (getImageType(image)) {\n case 'imagebitmap':\n (image as ImageBitmap).close();\n break;\n default:\n // Nothing to do for images and image data objects\n }\n}\n\nexport function getImageType(image: ImageType): ImageTypeEnum {\n const format = getImageTypeOrNull(image);\n if (!format) {\n throw new Error('Not an image');\n }\n return format;\n}\n\nexport function getImageSize(image: ImageType): {width: number; height: number} {\n return getImageData(image);\n}\n\nexport function getImageData(image: ImageType): ImageDataType | ImageData {\n switch (getImageType(image)) {\n case 'data':\n return image as unknown as ImageData;\n\n case 'image':\n case 'imagebitmap':\n // Extract the image data from the image via a canvas\n const canvas = document.createElement('canvas');\n // TODO - reuse the canvas?\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('getImageData');\n }\n // @ts-ignore\n canvas.width = image.width;\n // @ts-ignore\n canvas.height = image.height;\n // @ts-ignore\n context.drawImage(image, 0, 0);\n // @ts-ignore\n return context.getImageData(0, 0, image.width, image.height);\n\n default:\n throw new Error('getImageData');\n }\n}\n\n// PRIVATE\n\n// eslint-disable-next-line complexity\nfunction getImageTypeOrNull(image) {\n if (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap) {\n return 'imagebitmap';\n }\n if (typeof Image !== 'undefined' && image instanceof Image) {\n return 'image';\n }\n if (image && typeof image === 'object' && image.data && image.width && image.height) {\n return 'data';\n }\n return null;\n}\n", "// SVG parsing has limitations, e.g:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=606319\n\nconst SVG_DATA_URL_PATTERN = /^data:image\\/svg\\+xml/;\nconst SVG_URL_PATTERN = /\\.svg((\\?|#).*)?$/;\n\nexport function isSVG(url) {\n return url && (SVG_DATA_URL_PATTERN.test(url) || SVG_URL_PATTERN.test(url));\n}\n\nexport function getBlobOrSVGDataUrl(arrayBuffer: ArrayBuffer, url?: string): Blob | string {\n if (isSVG(url)) {\n // Prepare a properly tagged data URL, and load using normal mechanism\n const textDecoder = new TextDecoder();\n let xmlText = textDecoder.decode(arrayBuffer);\n // TODO Escape in browser to support e.g. Chinese characters\n try {\n if (typeof unescape === 'function' && typeof encodeURIComponent === 'function') {\n xmlText = unescape(encodeURIComponent(xmlText));\n }\n } catch (error) {\n throw new Error((error as Error).message);\n }\n // base64 encoding is safer. utf-8 fails in some browsers\n const src = `data:image/svg+xml;base64,${btoa(xmlText)}`;\n return src;\n }\n return getBlob(arrayBuffer, url);\n}\n\nexport function getBlob(arrayBuffer: ArrayBuffer, url?: string): Blob {\n if (isSVG(url)) {\n // https://bugs.chromium.org/p/chromium/issues/detail?id=606319\n // return new Blob([new Uint8Array(arrayBuffer)], {type: 'image/svg+xml'});\n throw new Error('SVG cannot be parsed directly to imagebitmap');\n }\n // TODO - how to determine mime type? Param? Sniff here?\n return new Blob([new Uint8Array(arrayBuffer)]); // MIME type not needed?\n}\n", "import type {ImageLoaderOptions} from '../../image-loader';\nimport {getBlobOrSVGDataUrl} from './svg-utils';\n\n// Parses html image from array buffer\nexport async function parseToImage(\n arrayBuffer: ArrayBuffer,\n options: ImageLoaderOptions,\n url?: string\n): Promise<HTMLImageElement> {\n // Note: image parsing requires conversion to Blob (for createObjectURL).\n // Potentially inefficient for not using `response.blob()` (and for File / Blob inputs)...\n // But presumably not worth adding 'blob' flag to loader objects?\n\n const blobOrDataUrl = getBlobOrSVGDataUrl(arrayBuffer, url);\n const URL = self.URL || self.webkitURL;\n const objectUrl = typeof blobOrDataUrl !== 'string' && URL.createObjectURL(blobOrDataUrl);\n try {\n return await loadToImage(objectUrl || blobOrDataUrl, options);\n } finally {\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n }\n}\n\nexport async function loadToImage(url, options): Promise<HTMLImageElement> {\n const image = new Image();\n image.src = url;\n\n // The `image.onload()` callback does not guarantee that the image has been decoded\n // so a main thread \"freeze\" can be incurred when using the image for the first time.\n // `Image.decode()` returns a promise that completes when image is decoded.\n\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/decode\n // Note: When calling `img.decode()`, we do not need to wait for `img.onload()`\n // Note: `HTMLImageElement.decode()` is not available in Edge and IE11\n if (options.image && options.image.decode && image.decode) {\n await image.decode();\n return image;\n }\n\n // Create a promise that tracks onload/onerror callbacks\n return await new Promise((resolve, reject) => {\n try {\n image.onload = () => resolve(image);\n image.onerror = (error) => {\n const message = error instanceof Error ? error.message : 'error';\n reject(new Error(message));\n };\n } catch (error) {\n reject(error);\n }\n });\n}\n", "import type {ImageLoaderOptions} from '../../image-loader';\nimport {isSVG, getBlob} from './svg-utils';\nimport {parseToImage} from './parse-to-image';\n\nlet imagebitmapOptionsSupported = true;\n\n/**\n * Asynchronously parses an array buffer into an ImageBitmap - this contains the decoded data\n * ImageBitmaps are supported on worker threads, but not supported on Edge, IE11 and Safari\n * https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap#Browser_compatibility\n *\n * TODO - createImageBitmap supports source rect (5 param overload), pass through?\n */\nexport async function parseToImageBitmap(\n arrayBuffer: ArrayBuffer,\n options: ImageLoaderOptions,\n url?: string\n): Promise<ImageBitmap> {\n let blob;\n\n // Cannot parse SVG directly to ImageBitmap, parse to Image first\n if (isSVG(url)) {\n // Note: this only works on main thread\n const image = await parseToImage(arrayBuffer, options, url);\n blob = image;\n } else {\n // Create blob from the array buffer\n blob = getBlob(arrayBuffer, url);\n }\n\n const imagebitmapOptions = (options && options.imagebitmap) as\n | ImageBitmapOptions\n | null\n | undefined;\n\n return await safeCreateImageBitmap(blob, imagebitmapOptions);\n}\n\n/**\n * Safely creates an imageBitmap with options\n * *\n * Firefox crashes if imagebitmapOptions is supplied\n * Avoid supplying if not provided or supported, remember if not supported\n */\nasync function safeCreateImageBitmap(\n blob: Blob,\n imagebitmapOptions: ImageBitmapOptions | null = null\n): Promise<ImageBitmap> {\n if (isEmptyObject(imagebitmapOptions) || !imagebitmapOptionsSupported) {\n imagebitmapOptions = null;\n }\n\n if (imagebitmapOptions) {\n try {\n // @ts-ignore Options\n return await createImageBitmap(blob, imagebitmapOptions);\n } catch (error) {\n console.warn(error); // eslint-disable-line\n imagebitmapOptionsSupported = false;\n }\n }\n\n return await createImageBitmap(blob);\n}\n\nfunction isEmptyObject(object: object | null | undefined) {\n if (!object) {\n return true;\n }\n\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n return false;\n }\n }\n\n return true;\n}\n", "import type {ImageLoaderOptions} from '../../image-loader';\nimport type {ImageDataType} from '../../types';\nimport {assert} from '@loaders.gl/loader-utils';\nimport {getBinaryImageMetadata} from '../category-api/binary-image-api';\n\n// Note: These types should be consistent with loaders.gl/polyfills\n\ntype NDArray = {\n shape: number[];\n data: Uint8Array;\n width: number;\n height: number;\n components: number;\n layers: number[];\n};\n\ntype ParseImageNode = (arrayBuffer: ArrayBuffer, mimeType: string) => Promise<NDArray>;\n\n// Use polyfills if installed to parsed image using get-pixels\nexport async function parseToNodeImage(\n arrayBuffer: ArrayBuffer,\n options: ImageLoaderOptions\n): Promise<ImageDataType> {\n const {mimeType} = getBinaryImageMetadata(arrayBuffer) || {};\n\n // @ts-ignore\n const parseImageNode: ParseImageNode = globalThis.loaders?.parseImageNode;\n assert(parseImageNode); // '@loaders.gl/polyfills not installed'\n\n // @ts-expect-error TODO should we throw error in this case?\n return await parseImageNode(arrayBuffer, mimeType);\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// code adapted from https://github.com/sindresorhus/file-type under MIT license\n\n/**\n * Box is a container format that can contain a variety of media related files,\n * so we want to return information about which type of file is actually contained inside\n */\nexport type BoxFileType = {extension: string; mimeType: string};\n\n/**\n * Tests if a buffer is in ISO base media file format (ISOBMFF) @see https://en.wikipedia.org/wiki/ISO_base_media_file_format\n * (ISOBMFF is a media container standard based on the Apple QuickTime container format)\n */\nexport function getISOBMFFMediaType(buffer: Uint8Array): BoxFileType | null {\n // Almost all ISO base media files start with `ftyp` box. (It's not required to be first, but it's recommended to be.)\n if (!checkString(buffer, 'ftyp', 4)) {\n return null;\n }\n\n // Extra check: test for 8859-1 printable characters (for simplicity, it's a mask which also catches one non-printable character).\n if ((buffer[8] & 0x60) === 0x00) {\n return null;\n }\n\n // `ftyp` box must contain a brand major identifier, which must consist of ISO 8859-1 printable characters.\n return decodeMajorBrand(buffer);\n}\n\n/**\n * brands explained @see https://github.com/strukturag/libheif/issues/83\n * code adapted from @see https://github.com/sindresorhus/file-type/blob/main/core.js#L489-L492\n */\nexport function decodeMajorBrand(buffer: Uint8Array): BoxFileType | null {\n const brandMajor = getUTF8String(buffer, 8, 12).replace('\\0', ' ').trim();\n\n switch (brandMajor) {\n case 'avif':\n case 'avis':\n return {extension: 'avif', mimeType: 'image/avif'};\n default:\n return null;\n }\n // We don't need these now, but they are easy to add\n // case 'mif1':\n // return {extension: 'heic', mimeType: 'image/heif'};\n // case 'msf1':\n // return {extension: 'heic', mimeType: 'image/heif-sequence'};\n // case 'heic':\n // case 'heix':\n // return {extension: 'heic', mimeType: 'image/heic'};\n // case 'hevc':\n // case 'hevx':\n // return {extension: 'heic', mimeType: 'image/heic-sequence'};\n // case 'qt':\n // return {ext: 'mov', mime: 'video/quicktime'};\n // case 'M4V':\n // case 'M4VH':\n // case 'M4VP':\n // return {ext: 'm4v', mime: 'video/x-m4v'};\n // case 'M4P':\n // return {ext: 'm4p', mime: 'video/mp4'};\n // case 'M4B':\n // return {ext: 'm4b', mime: 'audio/mp4'};\n // case 'M4A':\n // return {ext: 'm4a', mime: 'audio/x-m4a'};\n // case 'F4V':\n // return {ext: 'f4v', mime: 'video/mp4'};\n // case 'F4P':\n // return {ext: 'f4p', mime: 'video/mp4'};\n // case 'F4A':\n // return {ext: 'f4a', mime: 'audio/mp4'};\n // case 'F4B':\n // return {ext: 'f4b', mime: 'audio/mp4'};\n // case 'crx':\n // return {ext: 'cr3', mime: 'image/x-canon-cr3'};\n // default:\n // if (brandMajor.startsWith('3g')) {\n // if (brandMajor.startsWith('3g2')) {\n // return {ext: '3g2', mime: 'video/3gpp2'};\n // }\n // return {ext: '3gp', mime: 'video/3gpp'};\n // }\n // return {ext: 'mp4', mime: 'video/mp4'};\n}\n\n/** Interpret a chunk of bytes as a UTF8 string */\nfunction getUTF8String(array: Uint8Array, start: number, end: number): string {\n return String.fromCharCode(...array.slice(start, end));\n}\n\nfunction stringToBytes(string: string): number[] {\n return [...string].map((character) => character.charCodeAt(0));\n}\n\nfunction checkString(buffer: ArrayLike<number>, header: string, offset: number = 0): boolean {\n const headerBytes = stringToBytes(header);\n\n for (let i = 0; i < headerBytes.length; ++i) {\n if (headerBytes[i] !== buffer[i + offset]) {\n return false;\n }\n }\n\n return true;\n}\n", "// Attributions\n// * Based on binary-gltf-utils under MIT license: Copyright (c) 2016-17 Karl Cheng\n\nimport {getISOBMFFMediaType} from './parse-isobmff-binary';\n\n/** MIME type, width and height extracted from binary compressed image data */\nexport type BinaryImageMetadata = {\n mimeType: string;\n width: number;\n height: number;\n};\n\nconst BIG_ENDIAN = false;\nconst LITTLE_ENDIAN = true;\n\n/**\n * Extracts `{mimeType, width and height}` from a memory buffer containing a known image format\n * Currently supports `image/png`, `image/jpeg`, `image/bmp` and `image/gif`.\n * @param binaryData: DataView | ArrayBuffer image file memory to parse\n * @returns metadata or null if memory is not a valid image file format layout.\n */\nexport function getBinaryImageMetadata(\n binaryData: DataView | ArrayBuffer\n): BinaryImageMetadata | null {\n const dataView = toDataView(binaryData);\n return (\n getPngMetadata(dataView) ||\n getJpegMetadata(dataView) ||\n getGifMetadata(dataView) ||\n getBmpMetadata(dataView) ||\n getISOBMFFMetadata(dataView)\n );\n}\n\n// ISOBMFF\n\nfunction getISOBMFFMetadata(binaryData: DataView | ArrayBuffer): BinaryImageMetadata | null {\n const buffer = new Uint8Array(binaryData instanceof DataView ? binaryData.buffer : binaryData);\n const mediaType = getISOBMFFMediaType(buffer);\n if (!mediaType) {\n return null;\n }\n return {\n mimeType: mediaType.mimeType,\n // TODO - decode width and height\n width: 0,\n height: 0\n };\n}\n\n// PNG\n\nfunction getPngMetadata(binaryData: DataView | ArrayBuffer): BinaryImageMetadata | null {\n const dataView = toDataView(binaryData);\n // Check file contains the first 4 bytes of the PNG signature.\n const isPng = dataView.byteLength >= 24 && dataView.getUint32(0, BIG_ENDIAN) === 0x89504e47;\n if (!isPng) {\n return null;\n }\n\n // Extract size from a binary PNG file\n return {\n mimeType: 'image/png',\n width: dataView.getUint32(16, BIG_ENDIAN),\n height: dataView.getUint32(20, BIG_ENDIAN)\n };\n}\n\n// GIF\n\n// Extract size from a binary GIF file\n// TODO: GIF is not this simple\nfunction getGifMetadata(binaryData: DataView | ArrayBuffer): BinaryImageMetadata | null {\n const dataView = toDataView(binaryData);\n // Check first 4 bytes of the GIF signature (\"GIF8\").\n const isGif = dataView.byteLength >= 10 && dataView.getUint32(0, BIG_ENDIAN) === 0x47494638;\n if (!isGif) {\n return null;\n }\n\n // GIF is little endian.\n return {\n mimeType: 'image/gif',\n width: dataView.getUint16(6, LITTLE_ENDIAN),\n height: dataView.getUint16(8, LITTLE_ENDIAN)\n };\n}\n\n// BMP\n\n// TODO: BMP is not this simple\nexport function getBmpMetadata(binaryData: DataView | ArrayBuffer): BinaryImageMetadata | null {\n const dataView = toDataView(binaryData);\n // Check magic number is valid (first 2 characters should be \"BM\").\n // The mandatory bitmap file header is 14 bytes long.\n const isBmp =\n dataView.byteLength >= 14 &&\n dataView.getUint16(0, BIG_ENDIAN) === 0x424d &&\n dataView.getUint32(2, LITTLE_ENDIAN) === dataView.byteLength;\n\n if (!isBmp) {\n return null;\n }\n\n // BMP is little endian.\n return {\n mimeType: 'image/bmp',\n width: dataView.getUint32(18, LITTLE_ENDIAN),\n height: dataView.getUint32(22, LITTLE_ENDIAN)\n };\n}\n\n// JPEG\n\n// Extract width and height from a binary JPEG file\nfunction getJpegMetadata(binaryData: DataView | ArrayBuffer): BinaryImageMetadata | null {\n const dataView = toDataView(binaryData);\n // Check file contains the JPEG \"start of image\" (SOI) marker\n // followed by another marker.\n const isJpeg =\n dataView.byteLength >= 3 &&\n dataView.getUint16(0, BIG_ENDIAN) === 0xffd8 &&\n dataView.getUint8(2) === 0xff;\n\n if (!isJpeg) {\n return null;\n }\n\n const {tableMarkers, sofMarkers} = getJpegMarkers();\n\n // Exclude the two byte SOI marker.\n let i = 2;\n while (i + 9 < dataView.byteLength) {\n const marker = dataView.getUint16(i, BIG_ENDIAN);\n\n // The frame that contains the width and height of the JPEG image.\n if (sofMarkers.has(marker)) {\n return {\n mimeType: 'image/jpeg',\n height: dataView.getUint16(i + 5, BIG_ENDIAN), // Number of lines\n width: dataView.getUint16(i + 7, BIG_ENDIAN) // Number of pixels per line\n };\n }\n\n // Miscellaneous tables/data preceding the frame header.\n if (!tableMarkers.has(marker)) {\n return null;\n }\n\n // Length includes size of length parameter but not the two byte header.\n i += 2;\n i += dataView.getUint16(i, BIG_ENDIAN);\n }\n\n return null;\n}\n\nfunction getJpegMarkers() {\n // Tables/misc header markers.\n // DQT, DHT, DAC, DRI, COM, APP_n\n const tableMarkers = new Set([0xffdb, 0xffc4, 0xffcc, 0xffdd, 0xfffe]);\n for (let i = 0xffe0; i < 0xfff0; ++i) {\n tableMarkers.add(i);\n }\n\n // SOF markers and DHP marker.\n // These markers are after tables/misc data.\n const sofMarkers = new Set([\n 0xffc0, 0xffc1, 0xffc2, 0xffc3, 0xffc5, 0xffc6, 0xffc7, 0xffc9, 0xffca, 0xffcb, 0xffcd, 0xffce,\n 0xffcf, 0xffde\n ]);\n\n return {tableMarkers, sofMarkers};\n}\n\n// TODO - move into image module?\nfunction toDataView(data) {\n if (data instanceof DataView) {\n return data;\n }\n if (ArrayBuffer.isView(data)) {\n return new DataView(data.buffer);\n }\n\n // TODO: make these functions work for Node.js buffers?\n // if (bufferToArrayBuffer) {\n // data = bufferToArrayBuffer(data);\n // }\n\n // Careful - Node Buffers will look like ArrayBuffers (keep after isBuffer)\n if (data instanceof ArrayBuffer) {\n return new DataView(data);\n }\n throw new Error('toDataView');\n}\n", "import type {LoaderWithParser, StrictLoaderOptions} from '@loaders.gl/loader-utils';\nimport type {ImageType} from './types';\n// import type { ImageType } from '@loaders.gl/schema';\nimport {VERSION} from './lib/utils/version';\nimport {parseImage} from './lib/parsers/parse-image';\nimport {getBinaryImageMetadata} from './lib/category-api/binary-image-api';\n\nconst EXTENSIONS = ['png', 'jpg', 'jpeg', 'gif', 'webp', 'bmp', 'ico', 'svg', 'avif'];\nconst MIME_TYPES = [\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'image/webp',\n 'image/avif',\n 'image/bmp',\n 'image/vnd.microsoft.icon',\n 'image/svg+xml'\n];\n\nexport type ImageLoaderOptions = StrictLoaderOptions & {\n image?: {\n type?: 'auto' | 'data' | 'imagebitmap' | 'image';\n decode?: boolean;\n imagebitmap?: ImageBitmapOptions;\n };\n};\n\nconst DEFAULT_IMAGE_LOADER_OPTIONS: ImageLoaderOptions = {\n image: {\n type: 'auto',\n decode: true // if format is HTML\n }\n // imagebitmap: {} - passes (platform dependent) parameters to ImageBitmap constructor\n};\n\n/**\n * Loads a platform-specific image type\n * Note: This type can be used as input data to WebGL texture creation\n */\nexport const ImageLoader = {\n dataType: null as unknown as ImageType,\n batchType: null as never,\n id: 'image',\n module: 'images',\n name: 'Images',\n version: VERSION,\n mimeTypes: MIME_TYPES,\n extensions: EXTENSIONS,\n parse: parseImage,\n // TODO: byteOffset, byteLength;\n tests: [(arrayBuffer) => Boolean(getBinaryImageMetadata(new DataView(arrayBuffer)))],\n options: DEFAULT_IMAGE_LOADER_OPTIONS\n} as const satisfies LoaderWithParser<ImageType, never, ImageLoaderOptions>;\n", "// Image loading/saving for browser and Node.js\nimport {ImageDataType} from '../../types';\nimport {getImageSize} from '../category-api/parsed-image-api';\n\n// @ts-ignore TS2339: Property does not exist on type\nconst encodeImageNode = globalThis.loaders?.encodeImageNode;\n\n/**\n * Returns data bytes representing a compressed image in PNG or JPG format,\n * This data can be saved using file system (f) methods or used in a request.\n * @param image - ImageBitmap Image or Canvas\n * @param options\n * param opt.type='png' - png, jpg or image/png, image/jpg are valid\n * param mimeType= - Whether to include a data URI header\n */\nexport async function encodeImage(\n image: ImageDataType,\n options?: {[key: string]: any}\n): Promise<ArrayBuffer> {\n options = options || {};\n options.image = options.image || ({} as {[key: string]: any});\n\n return encodeImageNode\n ? encodeImageNode(image, {type: options.image.mimeType})\n : encodeImageInBrowser(image, options);\n}\n\n// In case we get exceptions from canvas.toBlob(resolve, type, quality)\nlet qualityParamSupported = true;\n\n/**\n *\n * @param image\n * @param options\n * @note Based on canvas.toBlob\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob\n */\nasync function encodeImageInBrowser(image, options) {\n const {mimeType, jpegQuality} = options.image;\n\n const {width, height} = getImageSize(image);\n\n // create a canvas and resize it to the size of our image\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n\n drawImageToCanvas(image, canvas);\n\n // The actual encoding is done asynchronously with `canvas.toBlob()`\n const blob = await new Promise<Blob | null>((resolve) => {\n // get it back as a Blob\n if (jpegQuality && qualityParamSupported) {\n try {\n canvas.toBlob(resolve, mimeType, jpegQuality);\n return;\n } catch (error) {\n qualityParamSupported = false;\n }\n }\n canvas.toBlob(resolve, mimeType);\n });\n\n if (!blob) {\n throw new Error('image encoding failed');\n }\n\n return await blob.arrayBuffer();\n}\n\nfunction drawImageToCanvas(image, canvas, x = 0, y = 0) {\n // Try optimized path for ImageBitmaps via bitmaprenderer context\n if (x === 0 && y === 0 && typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap) {\n const context = canvas.getContext('bitmaprenderer');\n if (context) {\n // transfer the ImageBitmap to it\n context.transferFromImageBitmap(image);\n return canvas;\n }\n }\n\n // Available on most platforms, except IE11 and Andriod WebViews...\n const context = canvas.getContext('2d');\n if (image.data) {\n // ImageData constructor expects clamped array even though getImageData does not return a clamped array...\n const clampedArray = new Uint8ClampedArray(image.data);\n const imageData = new ImageData(clampedArray, image.width, image.height);\n context.putImageData(imageData, 0, 0);\n return canvas;\n }\n\n // Fall back to generic image/image bitmap rendering path\n context.drawImage(image, 0, 0);\n return canvas;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WriterWithEncoder, WriterOptions} from '@loaders.gl/loader-utils';\nimport type {ImageDataType} from './types';\nimport {VERSION} from './lib/utils/version';\nimport {encodeImage} from './lib/encoders/encode-image';\n\nexport type ImageWriterOptions = WriterOptions & {\n image?: {\n mimeType?: 'image/png';\n jpegQuality?: number | null;\n };\n};\n\n/** Writer for image data */\nexport const ImageWriter = {\n name: 'Images',\n id: 'image',\n module: 'images',\n version: VERSION,\n extensions: ['jpeg'],\n mimeTypes: [],\n options: {\n image: {\n mimeType: 'image/png',\n jpegQuality: null\n }\n },\n encode: encodeImage\n} as const satisfies WriterWithEncoder<ImageDataType, never, ImageWriterOptions>;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {isBrowser} from '@loaders.gl/loader-utils';\n\nconst MIME_TYPES = [\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'image/webp',\n 'image/avif',\n 'image/tiff',\n // TODO - what is the correct type for SVG\n 'image/svg',\n 'image/svg+xml',\n 'image/bmp',\n 'image/vnd.microsoft.icon'\n];\n\n/** Only one round of tests is performed */\nconst mimeTypeSupportedPromise: Promise<Set<string>> | null = null;\n\n/** Run-time browser detection of file formats requires async tests for most precise results */\nexport async function getSupportedImageFormats(): Promise<Set<string>> {\n if (mimeTypeSupportedPromise) {\n return await mimeTypeSupportedPromise;\n }\n\n const supportedMimeTypes = new Set<string>();\n for (const mimeType of MIME_TYPES) {\n const supported = isBrowser\n ? await checkBrowserImageFormatSupportAsync(mimeType)\n : checkNodeImageFormatSupport(mimeType);\n if (supported) {\n supportedMimeTypes.add(mimeType);\n }\n }\n\n return supportedMimeTypes;\n}\n\n/** Cache sync values for speed */\nconst mimeTypeSupportedSync: {[mimeType: string]: boolean} = {};\n\n/**\n * Check if image MIME type is supported. Result is cached to avoid repeated tests.\n */\nexport function isImageFormatSupported(mimeType: string): boolean {\n if (mimeTypeSupportedSync[mimeType] === undefined) {\n const supported = isBrowser\n ? checkBrowserImageFormatSupport(mimeType)\n : checkNodeImageFormatSupport(mimeType);\n mimeTypeSupportedSync[mimeType] = supported;\n }\n return mimeTypeSupportedSync[mimeType];\n}\n\n/**\n * Checks that polyfills are installed and that mimeType is supported by polyfills\n * @todo Ideally polyfills should declare what formats they support, instead of storing that data here.\n */\nfunction checkNodeImageFormatSupport(mimeType: string): boolean {\n const NODE_FORMAT_SUPPORT = ['image/png', 'image/jpeg', 'image/gif'];\n const imageFormatsNode = globalThis.loaders?.imageFormatsNode || NODE_FORMAT_SUPPORT;\n const parseImageNode = globalThis.loaders?.parseImageNode;\n return Boolean(parseImageNode) && imageFormatsNode.includes(mimeType);\n}\n\n/** Checks image format support synchronously.\n * @note Unreliable, fails on AVIF\n */\nfunction checkBrowserImageFormatSupport(mimeType: string): boolean {\n switch (mimeType) {\n case 'image/avif': // Will fail\n case 'image/webp':\n return testBrowserImageFormatSupport(mimeType);\n default:\n return true;\n }\n}\n\nconst TEST_IMAGE = {\n 'image/avif':\n 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=',\n // Lossy test image. Support for lossy images doesn't guarantee support for all WebP images.\n 'image/webp': 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA'\n};\n\n/** Checks WebP and AVIF support asynchronously */\nasync function checkBrowserImageFormatSupportAsync(mimeType: string): Promise<boolean> {\n const dataURL = TEST_IMAGE[mimeType];\n return dataURL ? await testBrowserImageFormatSupportAsync(dataURL) : true;\n}\n\n/**\n * Checks browser synchronously\n * Checks if toDataURL supports the mimeType.\n * @note Imperfect testOn Chrome this is true for WebP but not for AVIF\n */\nfunction testBrowserImageFormatSupport(mimeType: string): boolean {\n try {\n const element = document.createElement('canvas');\n const dataURL = element.toDataURL(mimeType);\n return dataURL.indexOf(`data:${mimeType}`) === 0;\n } catch {\n // Probably Safari...\n return false;\n }\n}\n\n// Check WebPSupport asynchronously\nasync function testBrowserImageFormatSupportAsync(testImageDataURL: string): Promise<boolean> {\n return new Promise((resolve) => {\n const image = new Image();\n image.src = testImageDataURL;\n image.onload = () => resolve(image.height > 0);\n image.onerror = () => resolve(false);\n });\n}\n"],
"mappings": ";;;;;;;;;;;;;;;;;;;;AAIA;;;;;;;;;;;;;;;;;;ACDO,IAAM,UAAU,OAAoC,UAAe;;;ACF1E,IAAAA,uBAAqB;;;ACDrB,0BAAwB;AAAxB;AAIA,IAAM,kBAAiB,gBAAW,YAAX,mBAAoB;AAE3C,IAAM,kBAAkB,OAAO,UAAU;AACzC,IAAM,yBAAyB,OAAO,gBAAgB;AACtD,IAAM,uBAAuB,QAAQ,cAAc;AACnD,IAAM,iBAAiB,gCAAY,OAAO;AAMpC,SAAU,qBAAqB,MAAY;AAC/C,UAAQ,MAAM;IACZ,KAAK;AAEH,aAAO,0BAA0B,mBAAmB;IAEtD,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IAET;AACE,YAAM,IAAI,MAAM,6BAA6B,wCAAwC;EACzF;AACF;AAMM,SAAU,sBAAmB;AACjC,MAAI,wBAAwB;AAC1B,WAAO;EACT;AACA,MAAI,iBAAiB;AACnB,WAAO;EACT;AACA,MAAI,gBAAgB;AAClB,WAAO;EACT;AAGA,QAAM,IAAI,MAAM,+DAAiE;AACnF;;;AChDM,SAAU,QAAQ,OAAgB;AACtC,SAAO,QAAQ,mBAAmB,KAAK,CAAC;AAC1C;AAYM,SAAU,aAAa,OAAgB;AAC3C,QAAM,SAAS,mBAAmB,KAAK;AACvC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,cAAc;EAChC;AACA,SAAO;AACT;AAEM,SAAU,aAAa,OAAgB;AAC3C,SAAO,aAAa,KAAK;AAC3B;AAEM,SAAU,aAAa,OAAgB;AAC3C,UAAQ,aAAa,KAAK,GAAG;IAC3B,KAAK;AACH,aAAO;IAET,KAAK;IACL,KAAK;AAEH,YAAM,SAAS,SAAS,cAAc,QAAQ;AAE9C,YAAM,UAAU,OAAO,WAAW,IAAI;AACtC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,cAAc;MAChC;AAEA,aAAO,QAAQ,MAAM;AAErB,aAAO,SAAS,MAAM;AAEtB,cAAQ,UAAU,OAAO,GAAG,CAAC;AAE7B,aAAO,QAAQ,aAAa,GAAG,GAAG,MAAM,OAAO,MAAM,MAAM;IAE7D;AACE,YAAM,IAAI,MAAM,cAAc;EAClC;AACF;AAKA,SAAS,mBAAmB,OAAK;AAC/B,MAAI,OAAO,gBAAgB,eAAe,iBAAiB,aAAa;AACtE,WAAO;EACT;AACA,MAAI,OAAO,UAAU,eAAe,iBAAiB,OAAO;AAC1D,WAAO;EACT;AACA,MAAI,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ;AACnF,WAAO;EACT;AACA,SAAO;AACT;;;ACnEA,IAAM,uBAAuB;AAC7B,IAAM,kBAAkB;AAElB,SAAU,MAAM,KAAG;AACvB,SAAO,QAAQ,qBAAqB,KAAK,GAAG,KAAK,gBAAgB,KAAK,GAAG;AAC3E;AAEM,SAAU,oBAAoB,aAA0B,KAAY;AACxE,MAAI,MAAM,GAAG,GAAG;AAEd,UAAM,cAAc,IAAI,YAAW;AACnC,QAAI,UAAU,YAAY,OAAO,WAAW;AAE5C,QAAI;AACF,UAAI,OAAO,aAAa,cAAc,OAAO,uBAAuB,YAAY;AAC9E,kBAAU,SAAS,mBAAmB,OAAO,CAAC;MAChD;IACF,SAAS,OAAP;AACA,YAAM,IAAI,MAAO,MAAgB,OAAO;IAC1C;AAEA,UAAM,MAAM,6BAA6B,KAAK,OAAO;AACrD,WAAO;EACT;AACA,SAAO,QAAQ,aAAa,GAAG;AACjC;AAEM,SAAU,QAAQ,aAA0B,KAAY;AAC5D,MAAI,MAAM,GAAG,GAAG;AAGd,UAAM,IAAI,MAAM,8CAA8C;EAChE;AAEA,SAAO,IAAI,KAAK,CAAC,IAAI,WAAW,WAAW,CAAC,CAAC;AAC/C;;;AClCA,eAAsB,aACpB,aACA,SACA,KAAY;AAMZ,QAAM,gBAAgB,oBAAoB,aAAa,GAAG;AAC1D,QAAM,MAAM,KAAK,OAAO,KAAK;AAC7B,QAAM,YAAY,OAAO,kBAAkB,YAAY,IAAI,gBAAgB,aAAa;AACxF,MAAI;AACF,WAAO,MAAM,YAAY,aAAa,eAAe,OAAO;EAC9D;AACE,QAAI,WAAW;AACb,UAAI,gBAAgB,SAAS;IAC/B;EACF;AACF;AAEA,eAAsB,YAAY,KAAK,SAAO;AAC5C,QAAM,QAAQ,IAAI,MAAK;AACvB,QAAM,MAAM;AASZ,MAAI,QAAQ,SAAS,QAAQ,MAAM,UAAU,MAAM,QAAQ;AACzD,UAAM,MAAM,OAAM;AAClB,WAAO;EACT;AAGA,SAAO,MAAM,IAAI,QAAQ,CAAC,SAAS,WAAU;AAC3C,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,YAAM,UAAU,CAAC,UAAS;AACxB,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAO,IAAI,MAAM,OAAO,CAAC;MAC3B;IACF,SAAS,OAAP;AACA,aAAO,KAAK;IACd;EACF,CAAC;AACH;;;ACjDA,IAAI,8BAA8B;AASlC,eAAsB,mBACpB,aACA,SACA,KAAY;AAEZ,MAAI;AAGJ,MAAI,MAAM,GAAG,GAAG;AAEd,UAAM,QAAQ,MAAM,aAAa,aAAa,SAAS,GAAG;AAC1D,WAAO;EACT,OAAO;AAEL,WAAO,QAAQ,aAAa,GAAG;EACjC;AAEA,QAAM,qBAAsB,WAAW,QAAQ;AAK/C,SAAO,MAAM,sBAAsB,MAAM,kBAAkB;AAC7D;AAQA,eAAe,sBACb,MACA,qBAAgD,MAAI;AAEpD,MAAI,cAAc,kBAAkB,KAAK,CAAC,6BAA6B;AACrE,yBAAqB;EACvB;AAEA,MAAI,oBAAoB;AACtB,QAAI;AAEF,aAAO,MAAM,kBAAkB,MAAM,kBAAkB;IACzD,SAAS,OAAP;AACA,cAAQ,KAAK,KAAK;AAClB,oCAA8B;IAChC;EACF;AAEA,SAAO,MAAM,kBAAkB,IAAI;AACrC;AAEA,SAAS,cAAc,QAAiC;AACtD,MAAI,CAAC,QAAQ;AACX,WAAO;EACT;AAEA,aAAW,OAAO,QAAQ;AACxB,QAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG,GAAG;AACrD,aAAO;IACT;EACF;AAEA,SAAO;AACT;;;AC3EA,IAAAC,uBAAqB;;;ACaf,SAAU,oBAAoB,QAAkB;AAEpD,MAAI,CAAC,YAAY,QAAQ,QAAQ,CAAC,GAAG;AACnC,WAAO;EACT;AAGA,OAAK,OAAO,CAAC,IAAI,QAAU,GAAM;AAC/B,WAAO;EACT;AAGA,SAAO,iBAAiB,MAAM;AAChC;AAMM,SAAU,iBAAiB,QAAkB;AACjD,QAAM,aAAa,cAAc,QAAQ,GAAG,EAAE,EAAE,QAAQ,MAAM,GAAG,EAAE,KAAI;AAEvE,UAAQ,YAAY;IAClB,KAAK;IACL,KAAK;AACH,aAAO,EAAC,WAAW,QAAQ,UAAU,aAAY;IACnD;AACE,aAAO;EACX;AA0CF;AAGA,SAAS,cAAc,OAAmB,OAAe,KAAW;AAClE,SAAO,OAAO,aAAa,GAAG,MAAM,MAAM,OAAO,GAAG,CAAC;AACvD;AAEA,SAAS,cAAc,QAAc;AACnC,SAAO,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,cAAc,UAAU,WAAW,CAAC,CAAC;AAC/D;AAEA,SAAS,YAAY,QAA2B,QAAgB,SAAiB,GAAC;AAChF,QAAM,cAAc,cAAc,MAAM;AAExC,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,EAAE,GAAG;AAC3C,QAAI,YAAY,CAAC,MAAM,OAAO,IAAI,MAAM,GAAG;AACzC,aAAO;IACT;EACF;AAEA,SAAO;AACT;;;AC9FA,IAAM,aAAa;AACnB,IAAM,gBAAgB;AAQhB,SAAU,uBACd,YAAkC;AAElC,QAAM,WAAW,WAAW,UAAU;AACtC,SACE,eAAe,QAAQ,KACvB,gBAAgB,QAAQ,KACxB,eAAe,QAAQ,KACvB,eAAe,QAAQ,KACvB,mBAAmB,QAAQ;AAE/B;AAIA,SAAS,mBAAmB,YAAkC;AAC5D,QAAM,SAAS,IAAI,WAAW,sBAAsB,WAAW,WAAW,SAAS,UAAU;AAC7F,QAAM,YAAY,oBAAoB,MAAM;AAC5C,MAAI,CAAC,WAAW;AACd,WAAO;EACT;AACA,SAAO;IACL,UAAU,UAAU;;IAEpB,OAAO;IACP,QAAQ;;AAEZ;AAIA,SAAS,eAAe,YAAkC;AACxD,QAAM,WAAW,WAAW,UAAU;AAEtC,QAAM,QAAQ,SAAS,cAAc,MAAM,SAAS,UAAU,GAAG,UAAU,MAAM;AACjF,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AAGA,SAAO;IACL,UAAU;IACV,OAAO,SAAS,UAAU,IAAI,UAAU;IACxC,QAAQ,SAAS,UAAU,IAAI,UAAU;;AAE7C;AAMA,SAAS,eAAe,YAAkC;AACxD,QAAM,WAAW,WAAW,UAAU;AAEtC,QAAM,QAAQ,SAAS,cAAc,MAAM,SAAS,UAAU,GAAG,UAAU,MAAM;AACjF,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AAGA,SAAO;IACL,UAAU;IACV,OAAO,SAAS,UAAU,GAAG,aAAa;IAC1C,QAAQ,SAAS,UAAU,GAAG,aAAa;;AAE/C;AAKM,SAAU,eAAe,YAAkC;AAC/D,QAAM,WAAW,WAAW,UAAU;AAGtC,QAAM,QACJ,SAAS,cAAc,MACvB,SAAS,UAAU,GAAG,UAAU,MAAM,SACtC,SAAS,UAAU,GAAG,aAAa,MAAM,SAAS;AAEpD,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AAGA,SAAO;IACL,UAAU;IACV,OAAO,SAAS,UAAU,IAAI,aAAa;IAC3C,QAAQ,SAAS,UAAU,IAAI,aAAa;;AAEhD;AAKA,SAAS,gBAAgB,YAAkC;AACzD,QAAM,WAAW,WAAW,UAAU;AAGtC,QAAM,SACJ,SAAS,cAAc,KACvB,SAAS,UAAU,GAAG,UAAU,MAAM,SACtC,SAAS,SAAS,CAAC,MAAM;AAE3B,MAAI,CAAC,QAAQ;AACX,WAAO;EACT;AAEA,QAAM,EAAC,cAAc,WAAU,IAAI,eAAc;AAGjD,MAAI,IAAI;AACR,SAAO,IAAI,IAAI,SAAS,YAAY;AAClC,UAAM,SAAS,SAAS,UAAU,GAAG,UAAU;AAG/C,QAAI,WAAW,IAAI,MAAM,GAAG;AAC1B,aAAO;QACL,UAAU;QACV,QAAQ,SAAS,UAAU,IAAI,GAAG,UAAU;;QAC5C,OAAO,SAAS,UAAU,IAAI,GAAG,UAAU;;;IAE/C;AAGA,QAAI,CAAC,aAAa,IAAI,MAAM,GAAG;AAC7B,aAAO;IACT;AAGA,SAAK;AACL,SAAK,SAAS,UAAU,GAAG,UAAU;EACvC;AAEA,SAAO;AACT;AAEA,SAAS,iBAAc;AAGrB,QAAM,eAAe,oBAAI,IAAI,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,KAAM,CAAC;AACrE,WAAS,IAAI,OAAQ,IAAI,OAAQ,EAAE,GAAG;AACpC,iBAAa,IAAI,CAAC;EACpB;AAIA,QAAM,aAAa,oBAAI,IAAI;IACzB;IAAQ;IAAQ;IAAQ;IAAQ;IAAQ;IAAQ;IAAQ;IAAQ;IAAQ;IAAQ;IAAQ;IACxF;IAAQ;GACT;AAED,SAAO,EAAC,cAAc,WAAU;AAClC;AAGA,SAAS,WAAW,MAAI;AACtB,MAAI,gBAAgB,UAAU;AAC5B,WAAO;EACT;AACA,MAAI,YAAY,OAAO,IAAI,GAAG;AAC5B,WAAO,IAAI,SAAS,KAAK,MAAM;EACjC;AAQA,MAAI,gBAAgB,aAAa;AAC/B,WAAO,IAAI,SAAS,IAAI;EAC1B;AACA,QAAM,IAAI,MAAM,YAAY;AAC9B;;;AF/KA,eAAsB,iBACpB,aACA,SAA2B;AAnB7B,MAAAC;AAqBE,QAAM,EAAC,SAAQ,IAAI,uBAAuB,WAAW,KAAK,CAAA;AAG1D,QAAMC,mBAAiCD,MAAA,WAAW,YAAX,gBAAAA,IAAoB;AAC3D,mCAAOC,eAAc;AAGrB,SAAO,MAAMA,gBAAe,aAAa,QAAQ;AACnD;;;ANnBA,eAAsB,WACpB,aACA,SACA,SAAuB;AAEvB,YAAU,WAAW,CAAA;AACrB,QAAM,eAAe,QAAQ,SAAS,CAAA;AAGtC,QAAM,YAAY,aAAa,QAAQ;AAEvC,QAAM,EAAC,IAAG,IAAI,WAAW,CAAA;AAGzB,QAAM,WAAW,qBAAqB,SAAS;AAE/C,MAAI;AACJ,UAAQ,UAAU;IAChB,KAAK;AACH,cAAQ,MAAM,mBAAmB,aAAa,SAAS,GAAG;AAC1D;IACF,KAAK;AACH,cAAQ,MAAM,aAAa,aAAa,SAAS,GAAG;AACpD;IACF,KAAK;AAEH,cAAQ,MAAM,iBAAiB,aAAa,OAAO;AACnD;IACF;AACE,uCAAO,KAAK;EAChB;AAGA,MAAI,cAAc,QAAQ;AACxB,YAAQ,aAAa,KAAK;EAC5B;AAEA,SAAO;AACT;AAGA,SAAS,qBAAqB,MAAI;AAChC,UAAQ,MAAM;IACZ,KAAK;IACL,KAAK;AAGH,aAAO,oBAAmB;IAC5B;AAEE,2BAAqB,IAAI;AACzB,aAAO;EACX;AACF;;;AS1DA,IAAM,aAAa,CAAC,OAAO,OAAO,QAAQ,OAAO,QAAQ,OAAO,OAAO,OAAO,MAAM;AACpF,IAAM,aAAa;EACjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAWF,IAAM,+BAAmD;EACvD,OAAO;IACL,MAAM;IACN,QAAQ;;;;;AASL,IAAM,cAAc;EACzB,UAAU;EACV,WAAW;EACX,IAAI;EACJ,QAAQ;EACR,MAAM;EACN,SAAS;EACT,WAAW;EACX,YAAY;EACZ,OAAO;;EAEP,OAAO,CAAC,CAAC,gBAAgB,QAAQ,uBAAuB,IAAI,SAAS,WAAW,CAAC,CAAC,CAAC;EACnF,SAAS;;;;ACjDX,IAAAC;AAGA,IAAM,mBAAkBA,MAAA,WAAW,YAAX,gBAAAA,IAAoB;AAU5C,eAAsB,YACpB,OACA,SAA8B;AAE9B,YAAU,WAAW,CAAA;AACrB,UAAQ,QAAQ,QAAQ,SAAU,CAAA;AAElC,SAAO,kBACH,gBAAgB,OAAO,EAAC,MAAM,QAAQ,MAAM,SAAQ,CAAC,IACrD,qBAAqB,OAAO,OAAO;AACzC;AAGA,IAAI,wBAAwB;AAS5B,eAAe,qBAAqB,OAAO,SAAO;AAChD,QAAM,EAAC,UAAU,YAAW,IAAI,QAAQ;AAExC,QAAM,EAAC,OAAO,OAAM,IAAI,aAAa,KAAK;AAG1C,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ;AACf,SAAO,SAAS;AAEhB,oBAAkB,OAAO,MAAM;AAG/B,QAAM,OAAO,MAAM,IAAI,QAAqB,CAAC,YAAW;AAEtD,QAAI,eAAe,uBAAuB;AACxC,UAAI;AACF,eAAO,OAAO,SAAS,UAAU,WAAW;AAC5C;MACF,SAAS,OAAP;AACA,gCAAwB;MAC1B;IACF;AACA,WAAO,OAAO,SAAS,QAAQ;EACjC,CAAC;AAED,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,uBAAuB;EACzC;AAEA,SAAO,MAAM,KAAK,YAAW;AAC/B;AAEA,SAAS,kBAAkB,OAAO,QAAQ,IAAI,GAAG,IAAI,GAAC;AAEpD,MAAI,MAAM,KAAK,MAAM,KAAK,OAAO,gBAAgB,eAAe,iBAAiB,aAAa;AAC5F,UAAMC,WAAU,OAAO,WAAW,gBAAgB;AAClD,QAAIA,UAAS;AAEX,MAAAA,SAAQ,wBAAwB,KAAK;AACrC,aAAO;IACT;EACF;AAGA,QAAM,UAAU,OAAO,WAAW,IAAI;AACtC,MAAI,MAAM,MAAM;AAEd,UAAM,eAAe,IAAI,kBAAkB,MAAM,IAAI;AACrD,UAAM,YAAY,IAAI,UAAU,cAAc,MAAM,OAAO,MAAM,MAAM;AACvE,YAAQ,aAAa,WAAW,GAAG,CAAC;AACpC,WAAO;EACT;AAGA,UAAQ,UAAU,OAAO,GAAG,CAAC;AAC7B,SAAO;AACT;;;AC7EO,IAAM,cAAc;EACzB,MAAM;EACN,IAAI;EACJ,QAAQ;EACR,SAAS;EACT,YAAY,CAAC,MAAM;EACnB,WAAW,CAAA;EACX,SAAS;IACP,OAAO;MACL,UAAU;MACV,aAAa;;;EAGjB,QAAQ;;;;AC1BV,IAAAC,uBAAwB;AAExB,IAAMC,cAAa;EACjB;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;;AAIF,IAAM,2BAAwD;AAG9D,eAAsB,2BAAwB;AAC5C,MAAI,0BAA0B;AAC5B,WAAO,MAAM;EACf;AAEA,QAAM,qBAAqB,oBAAI,IAAG;AAClC,aAAW,YAAYA,aAAY;AACjC,UAAM,YAAY,iCACd,MAAM,oCAAoC,QAAQ,IAClD,4BAA4B,QAAQ;AACxC,QAAI,WAAW;AACb,yBAAmB,IAAI,QAAQ;IACjC;EACF;AAEA,SAAO;AACT;AAGA,IAAM,wBAAuD,CAAA;AAKvD,SAAU,uBAAuB,UAAgB;AACrD,MAAI,sBAAsB,QAAQ,MAAM,QAAW;AACjD,UAAM,YAAY,iCACd,+BAA+B,QAAQ,IACvC,4BAA4B,QAAQ;AACxC,0BAAsB,QAAQ,IAAI;EACpC;AACA,SAAO,sBAAsB,QAAQ;AACvC;AAMA,SAAS,4BAA4B,UAAgB;AA9DrD,MAAAC,KAAA;AA+DE,QAAM,sBAAsB,CAAC,aAAa,cAAc,WAAW;AACnE,QAAM,qBAAmBA,MAAA,WAAW,YAAX,gBAAAA,IAAoB,qBAAoB;AACjE,QAAMC,mBAAiB,gBAAW,YAAX,mBAAoB;AAC3C,SAAO,QAAQA,eAAc,KAAK,iBAAiB,SAAS,QAAQ;AACtE;AAKA,SAAS,+BAA+B,UAAgB;AACtD,UAAQ,UAAU;IAChB,KAAK;IACL,KAAK;AACH,aAAO,8BAA8B,QAAQ;IAC/C;AACE,aAAO;EACX;AACF;AAEA,IAAM,aAAa;EACjB,cACE;;EAEF,cAAc;;AAIhB,eAAe,oCAAoC,UAAgB;AACjE,QAAM,UAAU,WAAW,QAAQ;AACnC,SAAO,UAAU,MAAM,mCAAmC,OAAO,IAAI;AACvE;AAOA,SAAS,8BAA8B,UAAgB;AACrD,MAAI;AACF,UAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAM,UAAU,QAAQ,UAAU,QAAQ;AAC1C,WAAO,QAAQ,QAAQ,QAAQ,UAAU,MAAM;EACjD,QAAE;AAEA,WAAO;EACT;AACF;AAGA,eAAe,mCAAmC,kBAAwB;AACxE,SAAO,IAAI,QAAQ,CAAC,YAAW;AAC7B,UAAM,QAAQ,IAAI,MAAK;AACvB,UAAM,MAAM;AACZ,UAAM,SAAS,MAAM,QAAQ,MAAM,SAAS,CAAC;AAC7C,UAAM,UAAU,MAAM,QAAQ,KAAK;EACrC,CAAC;AACH;;;Ad1FM,SAAU,YAAS;AACvB,QAAM,IAAI,MAAM,6CAA6C;AAC/D;",
"names": ["import_loader_utils", "import_loader_utils", "_a", "parseImageNode", "_a", "context", "import_loader_utils", "MIME_TYPES", "_a", "parseImageNode"]
}