@autorender/sdk-core 0.1.35 → 0.1.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +207 -4024
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +207 -4043
- package/dist/index.js.map +1 -1
- package/dist/styles.d.ts +2 -0
- package/package.json +10 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/ieee754/index.js","../../../node_modules/ms/index.js","../../../node_modules/debug/src/common.js","../../../node_modules/debug/src/browser.js","../../../node_modules/has-flag/index.js","../../../node_modules/supports-color/index.js","../../../node_modules/debug/src/node.js","../../../node_modules/debug/src/index.js","../src/constants/defaults.ts","../src/client/api-client.ts","../src/utils/helpers.ts","../../../node_modules/token-types/lib/index.js","../../../node_modules/@borewit/text-codec/lib/index.js","../../../node_modules/strtok3/lib/stream/Errors.js","../../../node_modules/strtok3/lib/stream/AbstractStreamReader.js","../../../node_modules/strtok3/lib/stream/WebStreamReader.js","../../../node_modules/strtok3/lib/stream/WebStreamByobReader.js","../../../node_modules/strtok3/lib/stream/WebStreamDefaultReader.js","../../../node_modules/strtok3/lib/stream/WebStreamReaderFactory.js","../../../node_modules/strtok3/lib/AbstractTokenizer.js","../../../node_modules/strtok3/lib/ReadStreamTokenizer.js","../../../node_modules/strtok3/lib/BufferTokenizer.js","../../../node_modules/strtok3/lib/BlobTokenizer.js","../../../node_modules/strtok3/lib/core.js","../../../node_modules/@tokenizer/inflate/lib/ZipHandler.js","../../../node_modules/@tokenizer/inflate/lib/ZipToken.js","../../../node_modules/@tokenizer/inflate/lib/GzipHandler.js","../../../node_modules/uint8array-extras/index.js","../../../node_modules/file-type/util.js","../../../node_modules/file-type/supported.js","../../../node_modules/file-type/core.js","../src/core/uploader-controller.ts","../src/widget/styles.ts","../src/widget/uploader-element.ts","../src/viewtag/device.ts","../src/viewtag/transform.ts","../src/viewtag/url-builder.ts","../src/viewtag/responsive.ts","../src/viewtag/create-ar.ts","../src/viewtag/format-detection.ts","../src/index.ts"],"sourcesContent":["/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n","'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tforceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = 1;\n}\n\nif ('FORCE_COLOR' in env) {\n\tif (env.FORCE_COLOR === 'true') {\n\t\tforceColor = 1;\n\t} else if (env.FORCE_COLOR === 'false') {\n\t\tforceColor = 0;\n\t} else {\n\t\tforceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, streamIsTTY) {\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream, stream && stream.isTTY);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: translateLevel(supportsColor(true, tty.isatty(1))),\n\tstderr: translateLevel(supportsColor(true, tty.isatty(2)))\n};\n","/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n","/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n","import type { IconSet, LabelSet, ThemeOptions, UploadSourceOption } from '../types';\n\nexport type Environment = 'prod' | 'dev';\n\nexport function getBaseUrl(environment: Environment = 'prod'): string {\n switch (environment) {\n case 'dev':\n return 'https://upload-dev.autorender.io/api/v1';\n case 'prod':\n default:\n return 'https://upload.autorender.io/api/v1';\n }\n}\n\nexport const DEFAULT_BASE_URL = getBaseUrl('prod');\n\nexport const DEFAULT_ASSET_DELIVERY_BASE_URL = 'https://dev.autorender.io';\n\n\nexport const DEFAULT_LABELS: Required<LabelSet> = {\n title: 'Upload files',\n description: 'Drag & drop files or click to browse.',\n selectButton: 'Upload files',\n selectFolderButton: 'Upload folder',\n uploadButton: 'Upload',\n uploading: 'Uploading...',\n uploadComplete: 'All files uploaded successfully.',\n uploadFailed: 'Unable to upload files. Please try again.',\n retry: 'Retry',\n remove: 'Remove',\n addMore: 'Add more',\n done: 'Done',\n clear: 'Clear',\n cancel: 'Cancel',\n dropzoneTitle: 'Drop files here',\n duplicateFileExists: 'The following file already exists in this folder:',\n duplicateFilesExist: 'The following files already exist in this folder:',\n duplicateFileError: 'File already exists in this folder.',\n invalidApiKey: 'Invalid API key. Please verify your credentials and try again.',\n};\n\nexport const DEFAULT_ICONS: Required<IconSet> = {\n upload: `\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M12 16a1 1 0 0 1-1-1V7.41l-2.3 2.3a1 1 0 1 1-1.4-1.42l4-4a1 1 0 0 1 1.4 0l4 4a1 1 0 1 1-1.4 1.42L13 7.41V15a1 1 0 0 1-1 1Z\" />\n <path d=\"M5 20a3 3 0 0 1-3-3v-1a1 1 0 0 1 2 0v1a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-1a1 1 0 1 1 2 0v1a3 3 0 0 1-3 3Z\" />\n </svg>\n `,\n success: `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M9.5 17a1 1 0 0 1-.7-.29l-3.5-3.5a1 1 0 1 1 1.4-1.42l2.8 2.79 7.1-7.09a1 1 0 0 1 1.4 1.42l-7.8 7.79a1 1 0 0 1-.7.3Z\" fill=\"currentColor\" />\n </svg>\n `,\n error: `\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" >\n <path d=\"m12 13.41 3.29 3.3a1 1 0 0 0 1.42-1.42L13.41 12l3.3-3.29a1 1 0 0 0-1.42-1.42L12 10.59l-3.29-3.3a1 1 0 1 0-1.42 1.42L10.59 12l-3.3 3.29a1 1 0 0 0 1.42 1.42L12 13.41Z\" />\n </svg>\n `,\n remove: `\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M9 5.25C9 4.55964 9.55964 4 10.25 4H13.75C14.4404 4 15 4.55964 15 5.25V7H9V5.25Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n />\n <path\n d=\"M5 7H19\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n <rect\n x=\"6.5\"\n y=\"7\"\n width=\"11\"\n height=\"12.5\"\n rx=\"2\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n />\n <path\n d=\"M10 11.5V16\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n <path\n d=\"M14 11.5V16\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n `,\n close: `\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M13.41 12 18 7.41 16.59 6 12 10.59 7.41 6 6 7.41 10.59 12 6 16.59 7.41 18 12 13.41 16.59 18 18 16.59 13.41 12Z\" />\n </svg>\n `,\n};\n\nexport const DEFAULT_SOURCES: UploadSourceOption[] = [\n {\n id: 'device',\n label: 'From device',\n kind: 'device',\n icon: `\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"4\" y=\"5\" width=\"16\" height=\"14\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"M9.5 4h5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n `,\n },\n {\n id: 'camera',\n label: 'Camera',\n kind: 'camera',\n icon: `\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 7h2l1-2h8l1 2h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" />\n <circle cx=\"12\" cy=\"13\" r=\"3.25\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n </svg>\n `,\n },\n {\n id: 'facebook',\n label: 'Facebook',\n kind: 'facebook',\n icon: `\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"M13 8h2V6h-2a3 3 0 0 0-3 3v1H8v2h2v6h2v-6h2v-2h-2V9a1 1 0 0 1 1-1Z\" fill=\"currentColor\" />\n </svg>\n `,\n },\n {\n id: 'google-drive',\n label: 'Google Drive',\n kind: 'google-drive',\n icon: `\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M6.5 18.5h11l3-5-5-8h-6l-5 8 2 3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" />\n <path d=\"M8 13.5h8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n `,\n },\n];\n\nexport const DEFAULT_THEME: Required<\n Pick<ThemeOptions, 'appearance' | 'borderRadius' | 'dropzoneBackground' | 'dropzoneBorder'>\n> = {\n appearance: 'light',\n borderRadius: 8,\n dropzoneBackground: 'var(--ar-color-muted)',\n dropzoneBorder: 'var(--ar-color-border)',\n};\n\n","import { getBaseUrl } from '../constants/defaults';\nimport type { AppRunnerResponse, UploadSettings, Environment } from '../types';\n\ninterface UploadFileParams {\n file: File;\n folderPath?: string;\n relativePath?: string;\n settings?: UploadSettings;\n}\n\ninterface NewUploadResponse {\n id: string;\n workspace_id: string;\n name: string;\n path: string;\n url: string;\n width?: number;\n height?: number;\n size: number;\n format?: string;\n mime_type?: string;\n hash?: string;\n tags?: string[];\n metadata?: Record<string, unknown> | null;\n custom_id?: string | null;\n is_private?: boolean;\n is_duplicate?: boolean;\n created_at: string;\n upload_source?: string;\n folder_no?: string | null;\n file_no?: string;\n}\n\nexport class AutorenderApiClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(opts: { apiKey: string; baseUrl?: string; environment?: Environment }) {\n if (!opts.apiKey) {\n throw new Error('apiKey is required');\n }\n this.apiKey = opts.apiKey;\n this.baseUrl = (opts.baseUrl || getBaseUrl(opts.environment || 'prod')).replace(/\\/+$/, '');\n }\n\n uploadFile(\n params: UploadFileParams,\n onProgress?: (progress: number) => void,\n signal?: AbortSignal\n ): Promise<AppRunnerResponse> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException('Upload aborted', 'AbortError'));\n return;\n }\n\n const xhr = new XMLHttpRequest();\n\n if (signal) {\n signal.addEventListener('abort', () => {\n xhr.abort();\n reject(new DOMException('Upload aborted', 'AbortError'));\n });\n }\n\n let lastProgress = 0;\n xhr.upload.onprogress = event => {\n if (event.lengthComputable && onProgress) {\n const progress = Math.round((event.loaded / event.total) * 100);\n lastProgress = progress;\n onProgress(progress);\n } else if (onProgress && event.loaded > 0) {\n const estimatedProgress = Math.min(\n 95,\n Math.round((event.loaded / (event.loaded + 1000000)) * 100)\n );\n if (estimatedProgress > lastProgress) {\n lastProgress = estimatedProgress;\n onProgress(estimatedProgress);\n }\n }\n };\n\n xhr.onerror = () => {\n reject(new Error(`Upload failed: ${xhr.statusText}`));\n };\n\n xhr.onload = () => {\n try {\n if (xhr.status < 200 || xhr.status >= 300) {\n const errorText = xhr.responseText || xhr.statusText;\n reject(new Error(`Upload failed: ${errorText}`));\n return;\n }\n const newResponse = JSON.parse(xhr.responseText) as NewUploadResponse;\n\n const response: AppRunnerResponse = {\n success: true,\n file_no: newResponse.file_no || newResponse.id,\n name: newResponse.name,\n url: newResponse.url,\n file_size: newResponse.size,\n format: newResponse.format,\n width: newResponse.width,\n height: newResponse.height,\n created_at: newResponse.created_at,\n path: newResponse.path,\n workspace_no: newResponse.workspace_id,\n isDuplicate: newResponse.is_duplicate || false,\n };\n\n resolve(response);\n } catch (error) {\n reject(new Error('Failed to parse response'));\n }\n };\n\n const endpoint = `${this.baseUrl}/uploads`;\n const formData = new FormData();\n formData.append('file', params.file);\n formData.append('file_name', params.file.name);\n if (params.folderPath) {\n formData.append('folder', params.folderPath);\n }\n if (params.settings?.tags?.length) {\n formData.append('tags', params.settings.tags.join(','));\n }\n if (params.settings?.pretransformations) {\n formData.append('transform', params.settings.pretransformations);\n }\n if (params.settings?.custom_id) {\n formData.append('custom_id', params.settings.custom_id);\n }\n\n xhr.open('POST', endpoint);\n xhr.setRequestHeader('Authorization', `Bearer ${this.apiKey}`);\n xhr.setRequestHeader('accept', 'application/json');\n xhr.send(formData);\n });\n }\n}\n\nexport {}\n\n","export function generateId(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n\n return 'id-' + Math.random().toString(36).slice(2, 11);\n}\n\nexport function chunkArray<T>(items: T[], chunkSize: number): T[][] {\n if (chunkSize <= 0) {\n return [items];\n }\n\n const chunks: T[][] = [];\n for (let i = 0; i < items.length; i += chunkSize) {\n chunks.push(items.slice(i, i + chunkSize));\n }\n return chunks;\n}\n\nexport function clamp(value: number, min = 0, max = 1) {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function formatBytes(bytes: number) {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const num = bytes / Math.pow(k, i);\n return `${num.toFixed(num > 10 ? 0 : 1)} ${sizes[i]}`;\n}\n\nexport function createElement<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n className?: string,\n textContent?: string\n): HTMLElementTagNameMap[T] {\n const element = document.createElement(tag);\n if (className) element.className = className;\n if (textContent) element.textContent = textContent;\n return element;\n}\n\nexport function resolveIcon(renderer: string | HTMLElement | (() => string | HTMLElement)) {\n if (typeof renderer === 'function') {\n return resolveIcon(renderer());\n }\n if (typeof renderer === 'string') {\n const template = document.createElement('template');\n template.innerHTML = renderer.trim();\n return template.content.firstElementChild as HTMLElement | null;\n }\n return renderer ? (renderer.cloneNode(true) as HTMLElement) : null;\n}\n\nexport function toCssVars(theme: {\n appearance?: 'light' | 'dark' | 'system';\n accentColor?: string;\n borderRadius?: number;\n fontFamily?: string;\n dropzoneBackground?: string;\n dropzoneBorder?: string;\n}) {\n const variables: Record<string, string> = {};\n if (theme.accentColor) {\n variables['--ar-accent'] = theme.accentColor;\n }\n if (theme.borderRadius !== undefined) {\n variables['--ar-radius'] = `${theme.borderRadius}px`;\n }\n if (theme.fontFamily) {\n variables['--ar-font-family'] = theme.fontFamily;\n }\n if (theme.dropzoneBackground) {\n variables['--ar-dropzone-bg'] = theme.dropzoneBackground;\n }\n if (theme.dropzoneBorder) {\n variables['--ar-dropzone-border'] = theme.dropzoneBorder;\n }\n return variables;\n}\n\nexport function applyCssVariables(\n element: HTMLElement,\n variables: Record<string, string>\n) {\n Object.entries(variables).forEach(([key, value]) => {\n element.style.setProperty(key, value);\n });\n}\n\nexport function getRelativeFolderPath(\n basePath: string | undefined,\n relativePath: string | undefined\n) {\n if (!relativePath) return undefined;\n\n const parts = relativePath\n .split('/')\n .map(segment => segment.trim())\n .filter(segment => segment && segment !== '.');\n\n if (parts.length <= 1) {\n return undefined;\n }\n\n const folderSegments = parts.slice(0, -1);\n\n if (basePath) {\n const baseSegments = basePath\n .split('/')\n .map(segment => segment.trim())\n .filter(segment => segment && segment !== '.');\n\n let offset = 0;\n while (\n offset < baseSegments.length &&\n offset < folderSegments.length &&\n folderSegments[offset] === baseSegments[offset]\n ) {\n offset += 1;\n }\n\n return offset < folderSegments.length\n ? folderSegments.slice(offset).join('/')\n : undefined;\n }\n\n return folderSegments.length ? folderSegments.join('/') : undefined;\n}\n\nexport function calculateBatchProgress(items: { progress: number }[]) {\n if (items.length === 0) return 0;\n const total = items.reduce((acc, item) => acc + item.progress, 0);\n return Math.round(total / items.length);\n}\n\nconst S3_URL_PATTERN = /^s3:\\/\\/([^/]+)\\/(.+)$/i;\n\nexport function sanitizeBaseUrl(baseUrl?: string): string | undefined {\n if (!baseUrl) return undefined;\n const trimmed = baseUrl.trim();\n if (!trimmed) return undefined;\n return trimmed.replace(/\\/+$/, '');\n}\n\nexport function extractWorkspaceFromUrl(url?: string): string | undefined {\n if (!url) return undefined;\n const s3Match = S3_URL_PATTERN.exec(url);\n if (s3Match) {\n return s3Match[1];\n }\n try {\n const parsed = new URL(url);\n const firstSegment = parsed.pathname.replace(/^\\/+/, '').split('/')[0];\n return firstSegment || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function extractPathFromUrl(url?: string): string | undefined {\n if (!url) return undefined;\n const s3Match = S3_URL_PATTERN.exec(url);\n if (s3Match) {\n return s3Match[2];\n }\n try {\n const parsed = new URL(url);\n const [, ...rest] = parsed.pathname.replace(/^\\/+/, '').split('/');\n return rest.length ? rest.join('/') : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function buildAssetDeliveryUrl(\n baseUrl: string | undefined,\n workspace?: string,\n path?: string,\n fallback?: string\n): string | undefined {\n const sanitizedBase = sanitizeBaseUrl(baseUrl);\n if (!sanitizedBase || !workspace || !path) {\n return fallback;\n }\n\n const normalizedPath = path\n .split('/')\n .filter(Boolean)\n .map(segment => encodeURIComponent(segment))\n .join('/');\n\n return `${sanitizedBase}/${workspace}/${normalizedPath}`.replace(/([^:]\\/)\\/+/g, '$1');\n}\n\n","import * as ieee754 from 'ieee754';\nimport { textDecode } from \"@borewit/text-codec\";\n// Primitive types\nfunction dv(array) {\n return new DataView(array.buffer, array.byteOffset);\n}\n/*\n * 8-bit unsigned integer\n */\nexport const UINT8 = {\n len: 1,\n get(array, offset) {\n return dv(array).getUint8(offset);\n },\n put(array, offset, value) {\n dv(array).setUint8(offset, value);\n return offset + 1;\n }\n};\n/**\n * 16-bit unsigned integer, Little Endian byte order\n */\nexport const UINT16_LE = {\n len: 2,\n get(array, offset) {\n return dv(array).getUint16(offset, true);\n },\n put(array, offset, value) {\n dv(array).setUint16(offset, value, true);\n return offset + 2;\n }\n};\n/**\n * 16-bit unsigned integer, Big Endian byte order\n */\nexport const UINT16_BE = {\n len: 2,\n get(array, offset) {\n return dv(array).getUint16(offset);\n },\n put(array, offset, value) {\n dv(array).setUint16(offset, value);\n return offset + 2;\n }\n};\n/**\n * 24-bit unsigned integer, Little Endian byte order\n */\nexport const UINT24_LE = {\n len: 3,\n get(array, offset) {\n const dataView = dv(array);\n return dataView.getUint8(offset) + (dataView.getUint16(offset + 1, true) << 8);\n },\n put(array, offset, value) {\n const dataView = dv(array);\n dataView.setUint8(offset, value & 0xff);\n dataView.setUint16(offset + 1, value >> 8, true);\n return offset + 3;\n }\n};\n/**\n * 24-bit unsigned integer, Big Endian byte order\n */\nexport const UINT24_BE = {\n len: 3,\n get(array, offset) {\n const dataView = dv(array);\n return (dataView.getUint16(offset) << 8) + dataView.getUint8(offset + 2);\n },\n put(array, offset, value) {\n const dataView = dv(array);\n dataView.setUint16(offset, value >> 8);\n dataView.setUint8(offset + 2, value & 0xff);\n return offset + 3;\n }\n};\n/**\n * 32-bit unsigned integer, Little Endian byte order\n */\nexport const UINT32_LE = {\n len: 4,\n get(array, offset) {\n return dv(array).getUint32(offset, true);\n },\n put(array, offset, value) {\n dv(array).setUint32(offset, value, true);\n return offset + 4;\n }\n};\n/**\n * 32-bit unsigned integer, Big Endian byte order\n */\nexport const UINT32_BE = {\n len: 4,\n get(array, offset) {\n return dv(array).getUint32(offset);\n },\n put(array, offset, value) {\n dv(array).setUint32(offset, value);\n return offset + 4;\n }\n};\n/**\n * 8-bit signed integer\n */\nexport const INT8 = {\n len: 1,\n get(array, offset) {\n return dv(array).getInt8(offset);\n },\n put(array, offset, value) {\n dv(array).setInt8(offset, value);\n return offset + 1;\n }\n};\n/**\n * 16-bit signed integer, Big Endian byte order\n */\nexport const INT16_BE = {\n len: 2,\n get(array, offset) {\n return dv(array).getInt16(offset);\n },\n put(array, offset, value) {\n dv(array).setInt16(offset, value);\n return offset + 2;\n }\n};\n/**\n * 16-bit signed integer, Little Endian byte order\n */\nexport const INT16_LE = {\n len: 2,\n get(array, offset) {\n return dv(array).getInt16(offset, true);\n },\n put(array, offset, value) {\n dv(array).setInt16(offset, value, true);\n return offset + 2;\n }\n};\n/**\n * 24-bit signed integer, Little Endian byte order\n */\nexport const INT24_LE = {\n len: 3,\n get(array, offset) {\n const unsigned = UINT24_LE.get(array, offset);\n return unsigned > 0x7fffff ? unsigned - 0x1000000 : unsigned;\n },\n put(array, offset, value) {\n const dataView = dv(array);\n dataView.setUint8(offset, value & 0xff);\n dataView.setUint16(offset + 1, value >> 8, true);\n return offset + 3;\n }\n};\n/**\n * 24-bit signed integer, Big Endian byte order\n */\nexport const INT24_BE = {\n len: 3,\n get(array, offset) {\n const unsigned = UINT24_BE.get(array, offset);\n return unsigned > 0x7fffff ? unsigned - 0x1000000 : unsigned;\n },\n put(array, offset, value) {\n const dataView = dv(array);\n dataView.setUint16(offset, value >> 8);\n dataView.setUint8(offset + 2, value & 0xff);\n return offset + 3;\n }\n};\n/**\n * 32-bit signed integer, Big Endian byte order\n */\nexport const INT32_BE = {\n len: 4,\n get(array, offset) {\n return dv(array).getInt32(offset);\n },\n put(array, offset, value) {\n dv(array).setInt32(offset, value);\n return offset + 4;\n }\n};\n/**\n * 32-bit signed integer, Big Endian byte order\n */\nexport const INT32_LE = {\n len: 4,\n get(array, offset) {\n return dv(array).getInt32(offset, true);\n },\n put(array, offset, value) {\n dv(array).setInt32(offset, value, true);\n return offset + 4;\n }\n};\n/**\n * 64-bit unsigned integer, Little Endian byte order\n */\nexport const UINT64_LE = {\n len: 8,\n get(array, offset) {\n return dv(array).getBigUint64(offset, true);\n },\n put(array, offset, value) {\n dv(array).setBigUint64(offset, value, true);\n return offset + 8;\n }\n};\n/**\n * 64-bit signed integer, Little Endian byte order\n */\nexport const INT64_LE = {\n len: 8,\n get(array, offset) {\n return dv(array).getBigInt64(offset, true);\n },\n put(array, offset, value) {\n dv(array).setBigInt64(offset, value, true);\n return offset + 8;\n }\n};\n/**\n * 64-bit unsigned integer, Big Endian byte order\n */\nexport const UINT64_BE = {\n len: 8,\n get(array, offset) {\n return dv(array).getBigUint64(offset);\n },\n put(array, offset, value) {\n dv(array).setBigUint64(offset, value);\n return offset + 8;\n }\n};\n/**\n * 64-bit signed integer, Big Endian byte order\n */\nexport const INT64_BE = {\n len: 8,\n get(array, offset) {\n return dv(array).getBigInt64(offset);\n },\n put(array, offset, value) {\n dv(array).setBigInt64(offset, value);\n return offset + 8;\n }\n};\n/**\n * IEEE 754 16-bit (half precision) float, big endian\n */\nexport const Float16_BE = {\n len: 2,\n get(dataView, offset) {\n return ieee754.read(dataView, offset, false, 10, this.len);\n },\n put(dataView, offset, value) {\n ieee754.write(dataView, value, offset, false, 10, this.len);\n return offset + this.len;\n }\n};\n/**\n * IEEE 754 16-bit (half precision) float, little endian\n */\nexport const Float16_LE = {\n len: 2,\n get(array, offset) {\n return ieee754.read(array, offset, true, 10, this.len);\n },\n put(array, offset, value) {\n ieee754.write(array, value, offset, true, 10, this.len);\n return offset + this.len;\n }\n};\n/**\n * IEEE 754 32-bit (single precision) float, big endian\n */\nexport const Float32_BE = {\n len: 4,\n get(array, offset) {\n return dv(array).getFloat32(offset);\n },\n put(array, offset, value) {\n dv(array).setFloat32(offset, value);\n return offset + 4;\n }\n};\n/**\n * IEEE 754 32-bit (single precision) float, little endian\n */\nexport const Float32_LE = {\n len: 4,\n get(array, offset) {\n return dv(array).getFloat32(offset, true);\n },\n put(array, offset, value) {\n dv(array).setFloat32(offset, value, true);\n return offset + 4;\n }\n};\n/**\n * IEEE 754 64-bit (double precision) float, big endian\n */\nexport const Float64_BE = {\n len: 8,\n get(array, offset) {\n return dv(array).getFloat64(offset);\n },\n put(array, offset, value) {\n dv(array).setFloat64(offset, value);\n return offset + 8;\n }\n};\n/**\n * IEEE 754 64-bit (double precision) float, little endian\n */\nexport const Float64_LE = {\n len: 8,\n get(array, offset) {\n return dv(array).getFloat64(offset, true);\n },\n put(array, offset, value) {\n dv(array).setFloat64(offset, value, true);\n return offset + 8;\n }\n};\n/**\n * IEEE 754 80-bit (extended precision) float, big endian\n */\nexport const Float80_BE = {\n len: 10,\n get(array, offset) {\n return ieee754.read(array, offset, false, 63, this.len);\n },\n put(array, offset, value) {\n ieee754.write(array, value, offset, false, 63, this.len);\n return offset + this.len;\n }\n};\n/**\n * IEEE 754 80-bit (extended precision) float, little endian\n */\nexport const Float80_LE = {\n len: 10,\n get(array, offset) {\n return ieee754.read(array, offset, true, 63, this.len);\n },\n put(array, offset, value) {\n ieee754.write(array, value, offset, true, 63, this.len);\n return offset + this.len;\n }\n};\n/**\n * Ignore a given number of bytes\n */\nexport class IgnoreType {\n /**\n * @param len number of bytes to ignore\n */\n constructor(len) {\n this.len = len;\n }\n // ToDo: don't read, but skip data\n get(_array, _off) {\n }\n}\nexport class Uint8ArrayType {\n constructor(len) {\n this.len = len;\n }\n get(array, offset) {\n return array.subarray(offset, offset + this.len);\n }\n}\n/**\n * Consume a fixed number of bytes from the stream and return a string with a specified encoding.\n * Supports all encodings supported by TextDecoder, plus 'windows-1252'.\n */\nexport class StringType {\n constructor(len, encoding) {\n this.len = len;\n this.encoding = encoding;\n }\n get(data, offset = 0) {\n const bytes = data.subarray(offset, offset + this.len);\n return textDecode(bytes, this.encoding);\n }\n}\n/**\n * ANSI Latin 1 String using Windows-1252 (Code Page 1252)\n * Windows-1252 is a superset of ISO 8859-1 / Latin-1.\n */\nexport class AnsiStringType extends StringType {\n constructor(len) {\n super(len, 'windows-1252');\n }\n}\n","// text-polyfill.ts\n// Minimal encode/decode for utf-8, utf-16le, ascii, latin1, windows-1252\nconst WINDOWS_1252_EXTRA = {\n 0x80: \"€\", 0x82: \"‚\", 0x83: \"ƒ\", 0x84: \"„\", 0x85: \"…\", 0x86: \"†\",\n 0x87: \"‡\", 0x88: \"ˆ\", 0x89: \"‰\", 0x8a: \"Š\", 0x8b: \"‹\", 0x8c: \"Œ\",\n 0x8e: \"Ž\", 0x91: \"‘\", 0x92: \"’\", 0x93: \"“\", 0x94: \"”\", 0x95: \"•\",\n 0x96: \"–\", 0x97: \"—\", 0x98: \"˜\", 0x99: \"™\", 0x9a: \"š\", 0x9b: \"›\",\n 0x9c: \"œ\", 0x9e: \"ž\", 0x9f: \"Ÿ\",\n};\nconst WINDOWS_1252_REVERSE = {};\nfor (const [code, char] of Object.entries(WINDOWS_1252_EXTRA)) {\n WINDOWS_1252_REVERSE[char] = Number.parseInt(code);\n}\n/**\n * Decode text from binary data\n * @param bytes Binary data\n * @param encoding Encoding\n */\nexport function textDecode(bytes, encoding = \"utf-8\") {\n switch (encoding.toLowerCase()) {\n case \"utf-8\":\n case \"utf8\":\n if (typeof globalThis.TextDecoder !== \"undefined\") {\n return new globalThis.TextDecoder(\"utf-8\").decode(bytes);\n }\n return decodeUTF8(bytes);\n case \"utf-16le\":\n return decodeUTF16LE(bytes);\n case \"ascii\":\n return decodeASCII(bytes);\n case \"latin1\":\n case \"iso-8859-1\":\n return decodeLatin1(bytes);\n case \"windows-1252\":\n return decodeWindows1252(bytes);\n default:\n throw new RangeError(`Encoding '${encoding}' not supported`);\n }\n}\nexport function textEncode(input = \"\", encoding = \"utf-8\") {\n switch (encoding.toLowerCase()) {\n case \"utf-8\":\n case \"utf8\":\n if (typeof globalThis.TextEncoder !== \"undefined\") {\n return new globalThis.TextEncoder().encode(input);\n }\n return encodeUTF8(input);\n case \"utf-16le\":\n return encodeUTF16LE(input);\n case \"ascii\":\n return encodeASCII(input);\n case \"latin1\":\n case \"iso-8859-1\":\n return encodeLatin1(input);\n case \"windows-1252\":\n return encodeWindows1252(input);\n default:\n throw new RangeError(`Encoding '${encoding}' not supported`);\n }\n}\n// --- Internal helpers ---\nfunction decodeUTF8(bytes) {\n let out = \"\";\n let i = 0;\n while (i < bytes.length) {\n const b1 = bytes[i++];\n if (b1 < 0x80) {\n out += String.fromCharCode(b1);\n }\n else if (b1 < 0xe0) {\n const b2 = bytes[i++] & 0x3f;\n out += String.fromCharCode(((b1 & 0x1f) << 6) | b2);\n }\n else if (b1 < 0xf0) {\n const b2 = bytes[i++] & 0x3f;\n const b3 = bytes[i++] & 0x3f;\n out += String.fromCharCode(((b1 & 0x0f) << 12) | (b2 << 6) | b3);\n }\n else {\n const b2 = bytes[i++] & 0x3f;\n const b3 = bytes[i++] & 0x3f;\n const b4 = bytes[i++] & 0x3f;\n let cp = ((b1 & 0x07) << 18) |\n (b2 << 12) |\n (b3 << 6) |\n b4;\n cp -= 0x10000;\n out += String.fromCharCode(0xd800 + ((cp >> 10) & 0x3ff), 0xdc00 + (cp & 0x3ff));\n }\n }\n return out;\n}\nfunction decodeUTF16LE(bytes) {\n let out = \"\";\n for (let i = 0; i < bytes.length; i += 2) {\n out += String.fromCharCode(bytes[i] | (bytes[i + 1] << 8));\n }\n return out;\n}\nfunction decodeASCII(bytes) {\n return String.fromCharCode(...bytes.map((b) => b & 0x7f));\n}\nfunction decodeLatin1(bytes) {\n return String.fromCharCode(...bytes);\n}\nfunction decodeWindows1252(bytes) {\n let out = \"\";\n for (const b of bytes) {\n if (b >= 0x80 && b <= 0x9f && WINDOWS_1252_EXTRA[b]) {\n out += WINDOWS_1252_EXTRA[b];\n }\n else {\n out += String.fromCharCode(b);\n }\n }\n return out;\n}\nfunction encodeUTF8(str) {\n const out = [];\n for (let i = 0; i < str.length; i++) {\n const cp = str.charCodeAt(i);\n if (cp < 0x80) {\n out.push(cp);\n }\n else if (cp < 0x800) {\n out.push(0xc0 | (cp >> 6), 0x80 | (cp & 0x3f));\n }\n else if (cp < 0x10000) {\n out.push(0xe0 | (cp >> 12), 0x80 | ((cp >> 6) & 0x3f), 0x80 | (cp & 0x3f));\n }\n else {\n out.push(0xf0 | (cp >> 18), 0x80 | ((cp >> 12) & 0x3f), 0x80 | ((cp >> 6) & 0x3f), 0x80 | (cp & 0x3f));\n }\n }\n return new Uint8Array(out);\n}\nfunction encodeUTF16LE(str) {\n const out = new Uint8Array(str.length * 2);\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n out[i * 2] = code & 0xff;\n out[i * 2 + 1] = code >> 8;\n }\n return out;\n}\nfunction encodeASCII(str) {\n return new Uint8Array([...str].map((ch) => ch.charCodeAt(0) & 0x7f));\n}\nfunction encodeLatin1(str) {\n return new Uint8Array([...str].map((ch) => ch.charCodeAt(0) & 0xff));\n}\nfunction encodeWindows1252(str) {\n return new Uint8Array([...str].map((ch) => {\n const code = ch.charCodeAt(0);\n if (code <= 0xff)\n return code;\n if (WINDOWS_1252_REVERSE[ch] !== undefined)\n return WINDOWS_1252_REVERSE[ch];\n return 0x3f; // '?'\n }));\n}\n","export const defaultMessages = 'End-Of-Stream';\n/**\n * Thrown on read operation of the end of file or stream has been reached\n */\nexport class EndOfStreamError extends Error {\n constructor() {\n super(defaultMessages);\n this.name = \"EndOfStreamError\";\n }\n}\nexport class AbortError extends Error {\n constructor(message = \"The operation was aborted\") {\n super(message);\n this.name = \"AbortError\";\n }\n}\n","import { EndOfStreamError, AbortError } from \"./Errors.js\";\nexport class AbstractStreamReader {\n constructor() {\n this.endOfStream = false;\n this.interrupted = false;\n /**\n * Store peeked data\n * @type {Array}\n */\n this.peekQueue = [];\n }\n async peek(uint8Array, mayBeLess = false) {\n const bytesRead = await this.read(uint8Array, mayBeLess);\n this.peekQueue.push(uint8Array.subarray(0, bytesRead)); // Put read data back to peek buffer\n return bytesRead;\n }\n async read(buffer, mayBeLess = false) {\n if (buffer.length === 0) {\n return 0;\n }\n let bytesRead = this.readFromPeekBuffer(buffer);\n if (!this.endOfStream) {\n bytesRead += await this.readRemainderFromStream(buffer.subarray(bytesRead), mayBeLess);\n }\n if (bytesRead === 0 && !mayBeLess) {\n throw new EndOfStreamError();\n }\n return bytesRead;\n }\n /**\n * Read chunk from stream\n * @param buffer - Target Uint8Array (or Buffer) to store data read from stream in\n * @returns Number of bytes read\n */\n readFromPeekBuffer(buffer) {\n let remaining = buffer.length;\n let bytesRead = 0;\n // consume peeked data first\n while (this.peekQueue.length > 0 && remaining > 0) {\n const peekData = this.peekQueue.pop(); // Front of queue\n if (!peekData)\n throw new Error('peekData should be defined');\n const lenCopy = Math.min(peekData.length, remaining);\n buffer.set(peekData.subarray(0, lenCopy), bytesRead);\n bytesRead += lenCopy;\n remaining -= lenCopy;\n if (lenCopy < peekData.length) {\n // remainder back to queue\n this.peekQueue.push(peekData.subarray(lenCopy));\n }\n }\n return bytesRead;\n }\n async readRemainderFromStream(buffer, mayBeLess) {\n let bytesRead = 0;\n // Continue reading from stream if required\n while (bytesRead < buffer.length && !this.endOfStream) {\n if (this.interrupted) {\n throw new AbortError();\n }\n const chunkLen = await this.readFromStream(buffer.subarray(bytesRead), mayBeLess);\n if (chunkLen === 0)\n break;\n bytesRead += chunkLen;\n }\n if (!mayBeLess && bytesRead < buffer.length) {\n throw new EndOfStreamError();\n }\n return bytesRead;\n }\n}\n","import { AbstractStreamReader } from \"./AbstractStreamReader.js\";\nexport class WebStreamReader extends AbstractStreamReader {\n constructor(reader) {\n super();\n this.reader = reader;\n }\n async abort() {\n return this.close();\n }\n async close() {\n this.reader.releaseLock();\n }\n}\n","import { WebStreamReader } from './WebStreamReader.js';\n/**\n * Read from a WebStream using a BYOB reader\n * Reference: https://nodejs.org/api/webstreams.html#class-readablestreambyobreader\n */\nexport class WebStreamByobReader extends WebStreamReader {\n /**\n * Read from stream\n * @param buffer - Target Uint8Array (or Buffer) to store data read from stream in\n * @param mayBeLess - If true, may fill the buffer partially\n * @protected Bytes read\n */\n async readFromStream(buffer, mayBeLess) {\n if (buffer.length === 0)\n return 0;\n // @ts-ignore\n const result = await this.reader.read(new Uint8Array(buffer.length), { min: mayBeLess ? undefined : buffer.length });\n if (result.done) {\n this.endOfStream = result.done;\n }\n if (result.value) {\n buffer.set(result.value);\n return result.value.length;\n }\n return 0;\n }\n}\n","import { EndOfStreamError } from './Errors.js';\nimport { AbstractStreamReader } from \"./AbstractStreamReader.js\";\nexport class WebStreamDefaultReader extends AbstractStreamReader {\n constructor(reader) {\n super();\n this.reader = reader;\n this.buffer = null; // Internal buffer to store excess data\n }\n /**\n * Copy chunk to target, and store the remainder in this.buffer\n */\n writeChunk(target, chunk) {\n const written = Math.min(chunk.length, target.length);\n target.set(chunk.subarray(0, written));\n // Adjust the remainder of the buffer\n if (written < chunk.length) {\n this.buffer = chunk.subarray(written);\n }\n else {\n this.buffer = null;\n }\n return written;\n }\n /**\n * Read from stream\n * @param buffer - Target Uint8Array (or Buffer) to store data read from stream in\n * @param mayBeLess - If true, may fill the buffer partially\n * @protected Bytes read\n */\n async readFromStream(buffer, mayBeLess) {\n if (buffer.length === 0)\n return 0;\n let totalBytesRead = 0;\n // Serve from the internal buffer first\n if (this.buffer) {\n totalBytesRead += this.writeChunk(buffer, this.buffer);\n }\n // Continue reading from the stream if more data is needed\n while (totalBytesRead < buffer.length && !this.endOfStream) {\n const result = await this.reader.read();\n if (result.done) {\n this.endOfStream = true;\n break;\n }\n if (result.value) {\n totalBytesRead += this.writeChunk(buffer.subarray(totalBytesRead), result.value);\n }\n }\n if (!mayBeLess && totalBytesRead === 0 && this.endOfStream) {\n throw new EndOfStreamError();\n }\n return totalBytesRead;\n }\n abort() {\n this.interrupted = true;\n return this.reader.cancel();\n }\n async close() {\n await this.abort();\n this.reader.releaseLock();\n }\n}\n","import { WebStreamByobReader } from './WebStreamByobReader.js';\nimport { WebStreamDefaultReader } from './WebStreamDefaultReader.js';\nexport function makeWebStreamReader(stream) {\n try {\n const reader = stream.getReader({ mode: \"byob\" });\n if (reader instanceof ReadableStreamDefaultReader) {\n // Fallback to default reader in case `mode: byob` is ignored\n return new WebStreamDefaultReader(reader);\n }\n return new WebStreamByobReader(reader);\n }\n catch (error) {\n if (error instanceof TypeError) {\n // Fallback to default reader in case `mode: byob` rejected by a `TypeError`\n return new WebStreamDefaultReader(stream.getReader());\n }\n throw error;\n }\n}\n","import { EndOfStreamError } from './stream/index.js';\n/**\n * Core tokenizer\n */\nexport class AbstractTokenizer {\n /**\n * Constructor\n * @param options Tokenizer options\n * @protected\n */\n constructor(options) {\n this.numBuffer = new Uint8Array(8);\n /**\n * Tokenizer-stream position\n */\n this.position = 0;\n this.onClose = options?.onClose;\n if (options?.abortSignal) {\n options.abortSignal.addEventListener('abort', () => {\n this.abort();\n });\n }\n }\n /**\n * Read a token from the tokenizer-stream\n * @param token - The token to read\n * @param position - If provided, the desired position in the tokenizer-stream\n * @returns Promise with token data\n */\n async readToken(token, position = this.position) {\n const uint8Array = new Uint8Array(token.len);\n const len = await this.readBuffer(uint8Array, { position });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(uint8Array, 0);\n }\n /**\n * Peek a token from the tokenizer-stream.\n * @param token - Token to peek from the tokenizer-stream.\n * @param position - Offset where to begin reading within the file. If position is null, data will be read from the current file position.\n * @returns Promise with token data\n */\n async peekToken(token, position = this.position) {\n const uint8Array = new Uint8Array(token.len);\n const len = await this.peekBuffer(uint8Array, { position });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(uint8Array, 0);\n }\n /**\n * Read a numeric token from the stream\n * @param token - Numeric token\n * @returns Promise with number\n */\n async readNumber(token) {\n const len = await this.readBuffer(this.numBuffer, { length: token.len });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(this.numBuffer, 0);\n }\n /**\n * Read a numeric token from the stream\n * @param token - Numeric token\n * @returns Promise with number\n */\n async peekNumber(token) {\n const len = await this.peekBuffer(this.numBuffer, { length: token.len });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(this.numBuffer, 0);\n }\n /**\n * Ignore number of bytes, advances the pointer in under tokenizer-stream.\n * @param length - Number of bytes to ignore\n * @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available\n */\n async ignore(length) {\n if (this.fileInfo.size !== undefined) {\n const bytesLeft = this.fileInfo.size - this.position;\n if (length > bytesLeft) {\n this.position += bytesLeft;\n return bytesLeft;\n }\n }\n this.position += length;\n return length;\n }\n async close() {\n await this.abort();\n await this.onClose?.();\n }\n normalizeOptions(uint8Array, options) {\n if (!this.supportsRandomAccess() && options && options.position !== undefined && options.position < this.position) {\n throw new Error('`options.position` must be equal or greater than `tokenizer.position`');\n }\n return {\n ...{\n mayBeLess: false,\n offset: 0,\n length: uint8Array.length,\n position: this.position\n }, ...options\n };\n }\n abort() {\n return Promise.resolve(); // Ignore abort signal\n }\n}\n","import { AbstractTokenizer } from './AbstractTokenizer.js';\nimport { EndOfStreamError } from './stream/index.js';\nconst maxBufferSize = 256000;\nexport class ReadStreamTokenizer extends AbstractTokenizer {\n /**\n * Constructor\n * @param streamReader stream-reader to read from\n * @param options Tokenizer options\n */\n constructor(streamReader, options) {\n super(options);\n this.streamReader = streamReader;\n this.fileInfo = options?.fileInfo ?? {};\n }\n /**\n * Read buffer from tokenizer\n * @param uint8Array - Target Uint8Array to fill with data read from the tokenizer-stream\n * @param options - Read behaviour options\n * @returns Promise with number of bytes read\n */\n async readBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n const skipBytes = normOptions.position - this.position;\n if (skipBytes > 0) {\n await this.ignore(skipBytes);\n return this.readBuffer(uint8Array, options);\n }\n if (skipBytes < 0) {\n throw new Error('`options.position` must be equal or greater than `tokenizer.position`');\n }\n if (normOptions.length === 0) {\n return 0;\n }\n const bytesRead = await this.streamReader.read(uint8Array.subarray(0, normOptions.length), normOptions.mayBeLess);\n this.position += bytesRead;\n if ((!options || !options.mayBeLess) && bytesRead < normOptions.length) {\n throw new EndOfStreamError();\n }\n return bytesRead;\n }\n /**\n * Peek (read ahead) buffer from tokenizer\n * @param uint8Array - Uint8Array (or Buffer) to write data to\n * @param options - Read behaviour options\n * @returns Promise with number of bytes peeked\n */\n async peekBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n let bytesRead = 0;\n if (normOptions.position) {\n const skipBytes = normOptions.position - this.position;\n if (skipBytes > 0) {\n const skipBuffer = new Uint8Array(normOptions.length + skipBytes);\n bytesRead = await this.peekBuffer(skipBuffer, { mayBeLess: normOptions.mayBeLess });\n uint8Array.set(skipBuffer.subarray(skipBytes));\n return bytesRead - skipBytes;\n }\n if (skipBytes < 0) {\n throw new Error('Cannot peek from a negative offset in a stream');\n }\n }\n if (normOptions.length > 0) {\n try {\n bytesRead = await this.streamReader.peek(uint8Array.subarray(0, normOptions.length), normOptions.mayBeLess);\n }\n catch (err) {\n if (options?.mayBeLess && err instanceof EndOfStreamError) {\n return 0;\n }\n throw err;\n }\n if ((!normOptions.mayBeLess) && bytesRead < normOptions.length) {\n throw new EndOfStreamError();\n }\n }\n return bytesRead;\n }\n async ignore(length) {\n // debug(`ignore ${this.position}...${this.position + length - 1}`);\n const bufSize = Math.min(maxBufferSize, length);\n const buf = new Uint8Array(bufSize);\n let totBytesRead = 0;\n while (totBytesRead < length) {\n const remaining = length - totBytesRead;\n const bytesRead = await this.readBuffer(buf, { length: Math.min(bufSize, remaining) });\n if (bytesRead < 0) {\n return bytesRead;\n }\n totBytesRead += bytesRead;\n }\n return totBytesRead;\n }\n abort() {\n return this.streamReader.abort();\n }\n async close() {\n return this.streamReader.close();\n }\n supportsRandomAccess() {\n return false;\n }\n}\n","import { EndOfStreamError } from './stream/index.js';\nimport { AbstractTokenizer } from './AbstractTokenizer.js';\nexport class BufferTokenizer extends AbstractTokenizer {\n /**\n * Construct BufferTokenizer\n * @param uint8Array - Uint8Array to tokenize\n * @param options Tokenizer options\n */\n constructor(uint8Array, options) {\n super(options);\n this.uint8Array = uint8Array;\n this.fileInfo = { ...options?.fileInfo ?? {}, ...{ size: uint8Array.length } };\n }\n /**\n * Read buffer from tokenizer\n * @param uint8Array - Uint8Array to tokenize\n * @param options - Read behaviour options\n * @returns {Promise<number>}\n */\n async readBuffer(uint8Array, options) {\n if (options?.position) {\n this.position = options.position;\n }\n const bytesRead = await this.peekBuffer(uint8Array, options);\n this.position += bytesRead;\n return bytesRead;\n }\n /**\n * Peek (read ahead) buffer from tokenizer\n * @param uint8Array\n * @param options - Read behaviour options\n * @returns {Promise<number>}\n */\n async peekBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n const bytes2read = Math.min(this.uint8Array.length - normOptions.position, normOptions.length);\n if ((!normOptions.mayBeLess) && bytes2read < normOptions.length) {\n throw new EndOfStreamError();\n }\n uint8Array.set(this.uint8Array.subarray(normOptions.position, normOptions.position + bytes2read));\n return bytes2read;\n }\n close() {\n return super.close();\n }\n supportsRandomAccess() {\n return true;\n }\n setPosition(position) {\n this.position = position;\n }\n}\n","import { EndOfStreamError } from './stream/index.js';\nimport { AbstractTokenizer } from './AbstractTokenizer.js';\nexport class BlobTokenizer extends AbstractTokenizer {\n /**\n * Construct BufferTokenizer\n * @param blob - Uint8Array to tokenize\n * @param options Tokenizer options\n */\n constructor(blob, options) {\n super(options);\n this.blob = blob;\n this.fileInfo = { ...options?.fileInfo ?? {}, ...{ size: blob.size, mimeType: blob.type } };\n }\n /**\n * Read buffer from tokenizer\n * @param uint8Array - Uint8Array to tokenize\n * @param options - Read behaviour options\n * @returns {Promise<number>}\n */\n async readBuffer(uint8Array, options) {\n if (options?.position) {\n this.position = options.position;\n }\n const bytesRead = await this.peekBuffer(uint8Array, options);\n this.position += bytesRead;\n return bytesRead;\n }\n /**\n * Peek (read ahead) buffer from tokenizer\n * @param buffer\n * @param options - Read behaviour options\n * @returns {Promise<number>}\n */\n async peekBuffer(buffer, options) {\n const normOptions = this.normalizeOptions(buffer, options);\n const bytes2read = Math.min(this.blob.size - normOptions.position, normOptions.length);\n if ((!normOptions.mayBeLess) && bytes2read < normOptions.length) {\n throw new EndOfStreamError();\n }\n const arrayBuffer = await this.blob.slice(normOptions.position, normOptions.position + bytes2read).arrayBuffer();\n buffer.set(new Uint8Array(arrayBuffer));\n return bytes2read;\n }\n close() {\n return super.close();\n }\n supportsRandomAccess() {\n return true;\n }\n setPosition(position) {\n this.position = position;\n }\n}\n","import { StreamReader, makeWebStreamReader } from './stream/index.js';\nimport { ReadStreamTokenizer } from './ReadStreamTokenizer.js';\nimport { BufferTokenizer } from './BufferTokenizer.js';\nimport { BlobTokenizer } from './BlobTokenizer.js';\nexport { EndOfStreamError, AbortError } from './stream/index.js';\nexport { AbstractTokenizer } from './AbstractTokenizer.js';\n/**\n * Construct ReadStreamTokenizer from given Stream.\n * Will set fileSize, if provided given Stream has set the .path property/\n * @param stream - Read from Node.js Stream.Readable\n * @param options - Tokenizer options\n * @returns ReadStreamTokenizer\n */\nexport function fromStream(stream, options) {\n const streamReader = new StreamReader(stream);\n const _options = options ?? {};\n const chainedClose = _options.onClose;\n _options.onClose = async () => {\n await streamReader.close();\n if (chainedClose) {\n return chainedClose();\n }\n };\n return new ReadStreamTokenizer(streamReader, _options);\n}\n/**\n * Construct ReadStreamTokenizer from given ReadableStream (WebStream API).\n * Will set fileSize, if provided given Stream has set the .path property/\n * @param webStream - Read from Node.js Stream.Readable (must be a byte stream)\n * @param options - Tokenizer options\n * @returns ReadStreamTokenizer\n */\nexport function fromWebStream(webStream, options) {\n const webStreamReader = makeWebStreamReader(webStream);\n const _options = options ?? {};\n const chainedClose = _options.onClose;\n _options.onClose = async () => {\n await webStreamReader.close();\n if (chainedClose) {\n return chainedClose();\n }\n };\n return new ReadStreamTokenizer(webStreamReader, _options);\n}\n/**\n * Construct ReadStreamTokenizer from given Buffer.\n * @param uint8Array - Uint8Array to tokenize\n * @param options - Tokenizer options\n * @returns BufferTokenizer\n */\nexport function fromBuffer(uint8Array, options) {\n return new BufferTokenizer(uint8Array, options);\n}\n/**\n * Construct ReadStreamTokenizer from given Blob.\n * @param blob - Uint8Array to tokenize\n * @param options - Tokenizer options\n * @returns BufferTokenizer\n */\nexport function fromBlob(blob, options) {\n return new BlobTokenizer(blob, options);\n}\n","import { StringType, UINT32_LE } from 'token-types';\nimport initDebug from 'debug';\nimport { DataDescriptor, EndOfCentralDirectoryRecordToken, FileHeader, LocalFileHeaderToken, Signature } from \"./ZipToken.js\";\nfunction signatureToArray(signature) {\n const signatureBytes = new Uint8Array(UINT32_LE.len);\n UINT32_LE.put(signatureBytes, 0, signature);\n return signatureBytes;\n}\nconst debug = initDebug('tokenizer:inflate');\nconst syncBufferSize = 256 * 1024;\nconst ddSignatureArray = signatureToArray(Signature.DataDescriptor);\nconst eocdSignatureBytes = signatureToArray(Signature.EndOfCentralDirectory);\nexport class ZipHandler {\n constructor(tokenizer) {\n this.tokenizer = tokenizer;\n this.syncBuffer = new Uint8Array(syncBufferSize);\n }\n async isZip() {\n return await this.peekSignature() === Signature.LocalFileHeader;\n }\n peekSignature() {\n return this.tokenizer.peekToken(UINT32_LE);\n }\n async findEndOfCentralDirectoryLocator() {\n const randomReadTokenizer = this.tokenizer;\n const chunkLength = Math.min(16 * 1024, randomReadTokenizer.fileInfo.size);\n const buffer = this.syncBuffer.subarray(0, chunkLength);\n await this.tokenizer.readBuffer(buffer, { position: randomReadTokenizer.fileInfo.size - chunkLength });\n // Search the buffer from end to beginning for EOCD signature\n // const signature = 0x06054b50;\n for (let i = buffer.length - 4; i >= 0; i--) {\n // Compare 4 bytes directly without calling readUInt32LE\n if (buffer[i] === eocdSignatureBytes[0] &&\n buffer[i + 1] === eocdSignatureBytes[1] &&\n buffer[i + 2] === eocdSignatureBytes[2] &&\n buffer[i + 3] === eocdSignatureBytes[3]) {\n return randomReadTokenizer.fileInfo.size - chunkLength + i;\n }\n }\n return -1;\n }\n async readCentralDirectory() {\n if (!this.tokenizer.supportsRandomAccess()) {\n debug('Cannot reading central-directory without random-read support');\n return;\n }\n debug('Reading central-directory...');\n const pos = this.tokenizer.position;\n const offset = await this.findEndOfCentralDirectoryLocator();\n if (offset > 0) {\n debug('Central-directory 32-bit signature found');\n const eocdHeader = await this.tokenizer.readToken(EndOfCentralDirectoryRecordToken, offset);\n const files = [];\n this.tokenizer.setPosition(eocdHeader.offsetOfStartOfCd);\n for (let n = 0; n < eocdHeader.nrOfEntriesOfSize; ++n) {\n const entry = await this.tokenizer.readToken(FileHeader);\n if (entry.signature !== Signature.CentralFileHeader) {\n throw new Error('Expected Central-File-Header signature');\n }\n entry.filename = await this.tokenizer.readToken(new StringType(entry.filenameLength, 'utf-8'));\n await this.tokenizer.ignore(entry.extraFieldLength);\n await this.tokenizer.ignore(entry.fileCommentLength);\n files.push(entry);\n debug(`Add central-directory file-entry: n=${n + 1}/${files.length}: filename=${files[n].filename}`);\n }\n this.tokenizer.setPosition(pos);\n return files;\n }\n this.tokenizer.setPosition(pos);\n }\n async unzip(fileCb) {\n const entries = await this.readCentralDirectory();\n if (entries) {\n // Use Central Directory to iterate over files\n return this.iterateOverCentralDirectory(entries, fileCb);\n }\n // Scan Zip files for local-file-header\n let stop = false;\n do {\n const zipHeader = await this.readLocalFileHeader();\n if (!zipHeader)\n break;\n const next = fileCb(zipHeader);\n stop = !!next.stop;\n let fileData;\n await this.tokenizer.ignore(zipHeader.extraFieldLength);\n if (zipHeader.dataDescriptor && zipHeader.compressedSize === 0) {\n const chunks = [];\n let len = syncBufferSize;\n debug('Compressed-file-size unknown, scanning for next data-descriptor-signature....');\n let nextHeaderIndex = -1;\n while (nextHeaderIndex < 0 && len === syncBufferSize) {\n len = await this.tokenizer.peekBuffer(this.syncBuffer, { mayBeLess: true });\n nextHeaderIndex = indexOf(this.syncBuffer.subarray(0, len), ddSignatureArray);\n const size = nextHeaderIndex >= 0 ? nextHeaderIndex : len;\n if (next.handler) {\n const data = new Uint8Array(size);\n await this.tokenizer.readBuffer(data);\n chunks.push(data);\n }\n else {\n // Move position to the next header if found, skip the whole buffer otherwise\n await this.tokenizer.ignore(size);\n }\n }\n debug(`Found data-descriptor-signature at pos=${this.tokenizer.position}`);\n if (next.handler) {\n await this.inflate(zipHeader, mergeArrays(chunks), next.handler);\n }\n }\n else {\n if (next.handler) {\n debug(`Reading compressed-file-data: ${zipHeader.compressedSize} bytes`);\n fileData = new Uint8Array(zipHeader.compressedSize);\n await this.tokenizer.readBuffer(fileData);\n await this.inflate(zipHeader, fileData, next.handler);\n }\n else {\n debug(`Ignoring compressed-file-data: ${zipHeader.compressedSize} bytes`);\n await this.tokenizer.ignore(zipHeader.compressedSize);\n }\n }\n debug(`Reading data-descriptor at pos=${this.tokenizer.position}`);\n if (zipHeader.dataDescriptor) {\n // await this.tokenizer.ignore(DataDescriptor.len);\n const dataDescriptor = await this.tokenizer.readToken(DataDescriptor);\n if (dataDescriptor.signature !== 0x08074b50) {\n throw new Error(`Expected data-descriptor-signature at position ${this.tokenizer.position - DataDescriptor.len}`);\n }\n }\n } while (!stop);\n }\n async iterateOverCentralDirectory(entries, fileCb) {\n for (const fileHeader of entries) {\n const next = fileCb(fileHeader);\n if (next.handler) {\n this.tokenizer.setPosition(fileHeader.relativeOffsetOfLocalHeader);\n const zipHeader = await this.readLocalFileHeader();\n if (zipHeader) {\n await this.tokenizer.ignore(zipHeader.extraFieldLength);\n const fileData = new Uint8Array(fileHeader.compressedSize);\n await this.tokenizer.readBuffer(fileData);\n await this.inflate(zipHeader, fileData, next.handler);\n }\n }\n if (next.stop)\n break;\n }\n }\n async inflate(zipHeader, fileData, cb) {\n if (zipHeader.compressedMethod === 0) {\n // Stored (uncompressed)\n return cb(fileData);\n }\n if (zipHeader.compressedMethod !== 8) {\n throw new Error(`Unsupported ZIP compression method: ${zipHeader.compressedMethod}`);\n }\n debug(`Decompress filename=${zipHeader.filename}, compressed-size=${fileData.length}`);\n const uncompressedData = await ZipHandler.decompressDeflateRaw(fileData);\n return cb(uncompressedData);\n }\n static async decompressDeflateRaw(data) {\n // Wrap Uint8Array in a ReadableStream without copying\n const input = new ReadableStream({\n start(controller) {\n controller.enqueue(data);\n controller.close();\n }\n });\n const ds = new DecompressionStream(\"deflate-raw\");\n const output = input.pipeThrough(ds);\n try {\n // Collect decompressed bytes from the output stream\n const response = new Response(output);\n const buffer = await response.arrayBuffer();\n return new Uint8Array(buffer);\n }\n catch (err) {\n // Provide ZIP-specific error context\n const message = err instanceof Error\n ? `Failed to deflate ZIP entry: ${err.message}`\n : \"Unknown decompression error in ZIP entry\";\n throw new TypeError(message);\n }\n }\n async readLocalFileHeader() {\n const signature = await this.tokenizer.peekToken(UINT32_LE);\n if (signature === Signature.LocalFileHeader) {\n const header = await this.tokenizer.readToken(LocalFileHeaderToken);\n header.filename = await this.tokenizer.readToken(new StringType(header.filenameLength, 'utf-8'));\n return header;\n }\n if (signature === Signature.CentralFileHeader) {\n return false;\n }\n if (signature === 0xE011CFD0) {\n throw new Error('Encrypted ZIP');\n }\n throw new Error('Unexpected signature');\n }\n}\nfunction indexOf(buffer, portion) {\n const bufferLength = buffer.length;\n const portionLength = portion.length;\n // Return -1 if the portion is longer than the buffer\n if (portionLength > bufferLength)\n return -1;\n // Search for the portion in the buffer\n for (let i = 0; i <= bufferLength - portionLength; i++) {\n let found = true;\n for (let j = 0; j < portionLength; j++) {\n if (buffer[i + j] !== portion[j]) {\n found = false;\n break;\n }\n }\n if (found) {\n return i; // Return the starting offset\n }\n }\n return -1; // Not found\n}\nfunction mergeArrays(chunks) {\n // Concatenate chunks into a single Uint8Array\n const totalLength = chunks.reduce((acc, curr) => acc + curr.length, 0);\n const mergedArray = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n mergedArray.set(chunk, offset);\n offset += chunk.length;\n }\n return mergedArray;\n}\n","/**\n * Ref https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT\n */\nimport { UINT16_LE, UINT32_LE } from \"token-types\";\nexport const Signature = {\n LocalFileHeader: 0x04034b50,\n DataDescriptor: 0x08074b50,\n CentralFileHeader: 0x02014b50,\n EndOfCentralDirectory: 0x06054b50\n};\nexport const DataDescriptor = {\n get(array) {\n return {\n signature: UINT32_LE.get(array, 0),\n compressedSize: UINT32_LE.get(array, 8),\n uncompressedSize: UINT32_LE.get(array, 12),\n };\n }, len: 16\n};\n/**\n * First part of the ZIP Local File Header\n * Offset | Bytes| Description\n * -------|------+-------------------------------------------------------------------\n * 0 | 4 | Signature (0x04034b50)\n * 4 | 2 | Minimum version needed to extract\n * 6 | 2 | Bit flag\n * 8 | 2 | Compression method\n * 10 | 2 | File last modification time (MS-DOS format)\n * 12 | 2 | File last modification date (MS-DOS format)\n * 14 | 4 | CRC-32 of uncompressed data\n * 18 | 4 | Compressed size\n * 22 | 4 | Uncompressed size\n * 26 | 2 | File name length (n)\n * 28 | 2 | Extra field length (m)\n * 30 | n | File name\n * 30 + n | m | Extra field\n */\nexport const LocalFileHeaderToken = {\n get(array) {\n const flags = UINT16_LE.get(array, 6);\n return {\n signature: UINT32_LE.get(array, 0),\n minVersion: UINT16_LE.get(array, 4),\n dataDescriptor: !!(flags & 0x0008),\n compressedMethod: UINT16_LE.get(array, 8),\n compressedSize: UINT32_LE.get(array, 18),\n uncompressedSize: UINT32_LE.get(array, 22),\n filenameLength: UINT16_LE.get(array, 26),\n extraFieldLength: UINT16_LE.get(array, 28),\n filename: null\n };\n }, len: 30\n};\n/**\n * 4.3.16 End of central directory record:\n * end of central dir signature (0x06064b50) 4 bytes\n * number of this disk 2 bytes\n * number of the disk with the start of the central directory 2 bytes\n * total number of entries in the central directory on this disk 2 bytes\n * total number of entries in the size of the central directory 2 bytes\n * sizeOfTheCentralDirectory 4 bytes\n * offset of start of central directory with respect to the starting disk number 4 bytes\n * .ZIP file comment length 2 bytes\n * .ZIP file comment (variable size)\n */\nexport const EndOfCentralDirectoryRecordToken = {\n get(array) {\n return {\n signature: UINT32_LE.get(array, 0),\n nrOfThisDisk: UINT16_LE.get(array, 4),\n nrOfThisDiskWithTheStart: UINT16_LE.get(array, 6),\n nrOfEntriesOnThisDisk: UINT16_LE.get(array, 8),\n nrOfEntriesOfSize: UINT16_LE.get(array, 10),\n sizeOfCd: UINT32_LE.get(array, 12),\n offsetOfStartOfCd: UINT32_LE.get(array, 16),\n zipFileCommentLength: UINT16_LE.get(array, 20),\n };\n }, len: 22\n};\n/**\n * File header:\n * central file header signature 4 bytes 0 (0x02014b50)\n * version made by 2 bytes 4\n * version needed to extract 2 bytes 6\n * general purpose bit flag 2 bytes 8\n * compression method 2 bytes 10\n * last mod file time 2 bytes 12\n * last mod file date 2 bytes 14\n * crc-32 4 bytes 16\n * compressed size 4 bytes 20\n * uncompressed size 4 bytes 24\n * file name length 2 bytes 28\n * extra field length 2 bytes 30\n * file comment length 2 bytes 32\n * disk number start 2 bytes 34\n * internal file attributes 2 bytes 36\n * external file attributes 4 bytes 38\n * relative offset of local header 4 bytes 42\n */\nexport const FileHeader = {\n get(array) {\n const flags = UINT16_LE.get(array, 8);\n return {\n signature: UINT32_LE.get(array, 0),\n minVersion: UINT16_LE.get(array, 6),\n dataDescriptor: !!(flags & 0x0008),\n compressedMethod: UINT16_LE.get(array, 10),\n compressedSize: UINT32_LE.get(array, 20),\n uncompressedSize: UINT32_LE.get(array, 24),\n filenameLength: UINT16_LE.get(array, 28),\n extraFieldLength: UINT16_LE.get(array, 30),\n fileCommentLength: UINT16_LE.get(array, 32),\n relativeOffsetOfLocalHeader: UINT32_LE.get(array, 42),\n filename: null\n };\n }, len: 46\n};\n","export class GzipHandler {\n constructor(tokenizer) {\n this.tokenizer = tokenizer;\n }\n inflate() {\n const tokenizer = this.tokenizer;\n return new ReadableStream({\n async pull(controller) {\n const buffer = new Uint8Array(1024);\n const size = await tokenizer.readBuffer(buffer, { mayBeLess: true });\n if (size === 0) {\n controller.close();\n return;\n }\n controller.enqueue(buffer.subarray(0, size));\n }\n }).pipeThrough(new DecompressionStream(\"gzip\"));\n }\n}\n","const objectToString = Object.prototype.toString;\nconst uint8ArrayStringified = '[object Uint8Array]';\nconst arrayBufferStringified = '[object ArrayBuffer]';\n\nfunction isType(value, typeConstructor, typeStringified) {\n\tif (!value) {\n\t\treturn false;\n\t}\n\n\tif (value.constructor === typeConstructor) {\n\t\treturn true;\n\t}\n\n\treturn objectToString.call(value) === typeStringified;\n}\n\nexport function isUint8Array(value) {\n\treturn isType(value, Uint8Array, uint8ArrayStringified);\n}\n\nfunction isArrayBuffer(value) {\n\treturn isType(value, ArrayBuffer, arrayBufferStringified);\n}\n\nfunction isUint8ArrayOrArrayBuffer(value) {\n\treturn isUint8Array(value) || isArrayBuffer(value);\n}\n\nexport function assertUint8Array(value) {\n\tif (!isUint8Array(value)) {\n\t\tthrow new TypeError(`Expected \\`Uint8Array\\`, got \\`${typeof value}\\``);\n\t}\n}\n\nexport function assertUint8ArrayOrArrayBuffer(value) {\n\tif (!isUint8ArrayOrArrayBuffer(value)) {\n\t\tthrow new TypeError(`Expected \\`Uint8Array\\` or \\`ArrayBuffer\\`, got \\`${typeof value}\\``);\n\t}\n}\n\nexport function toUint8Array(value) {\n\tif (value instanceof ArrayBuffer) {\n\t\treturn new Uint8Array(value);\n\t}\n\n\tif (ArrayBuffer.isView(value)) {\n\t\treturn new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n\t}\n\n\tthrow new TypeError(`Unsupported value, got \\`${typeof value}\\`.`);\n}\n\nexport function concatUint8Arrays(arrays, totalLength) {\n\tif (arrays.length === 0) {\n\t\treturn new Uint8Array(0);\n\t}\n\n\ttotalLength ??= arrays.reduce((accumulator, currentValue) => accumulator + currentValue.length, 0);\n\n\tconst returnValue = new Uint8Array(totalLength);\n\n\tlet offset = 0;\n\tfor (const array of arrays) {\n\t\tassertUint8Array(array);\n\t\treturnValue.set(array, offset);\n\t\toffset += array.length;\n\t}\n\n\treturn returnValue;\n}\n\nexport function areUint8ArraysEqual(a, b) {\n\tassertUint8Array(a);\n\tassertUint8Array(b);\n\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\tif (a.length !== b.length) {\n\t\treturn false;\n\t}\n\n\t// eslint-disable-next-line unicorn/no-for-loop\n\tfor (let index = 0; index < a.length; index++) {\n\t\tif (a[index] !== b[index]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nexport function compareUint8Arrays(a, b) {\n\tassertUint8Array(a);\n\tassertUint8Array(b);\n\n\tconst length = Math.min(a.length, b.length);\n\n\tfor (let index = 0; index < length; index++) {\n\t\tconst diff = a[index] - b[index];\n\t\tif (diff !== 0) {\n\t\t\treturn Math.sign(diff);\n\t\t}\n\t}\n\n\t// At this point, all the compared elements are equal.\n\t// The shorter array should come first if the arrays are of different lengths.\n\treturn Math.sign(a.length - b.length);\n}\n\nconst cachedDecoders = {\n\tutf8: new globalThis.TextDecoder('utf8'),\n};\n\nexport function uint8ArrayToString(array, encoding = 'utf8') {\n\tassertUint8ArrayOrArrayBuffer(array);\n\tcachedDecoders[encoding] ??= new globalThis.TextDecoder(encoding);\n\treturn cachedDecoders[encoding].decode(array);\n}\n\nfunction assertString(value) {\n\tif (typeof value !== 'string') {\n\t\tthrow new TypeError(`Expected \\`string\\`, got \\`${typeof value}\\``);\n\t}\n}\n\nconst cachedEncoder = new globalThis.TextEncoder();\n\nexport function stringToUint8Array(string) {\n\tassertString(string);\n\treturn cachedEncoder.encode(string);\n}\n\nfunction base64ToBase64Url(base64) {\n\treturn base64.replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/, '');\n}\n\nfunction base64UrlToBase64(base64url) {\n\tconst base64 = base64url.replaceAll('-', '+').replaceAll('_', '/');\n\tconst padding = (4 - (base64.length % 4)) % 4;\n\treturn base64 + '='.repeat(padding);\n}\n\n// Reference: https://phuoc.ng/collection/this-vs-that/concat-vs-push/\n// Important: Keep this value divisible by 3 so intermediate chunks produce no Base64 padding.\nconst MAX_BLOCK_SIZE = 65_535;\n\nexport function uint8ArrayToBase64(array, {urlSafe = false} = {}) {\n\tassertUint8Array(array);\n\n\tlet base64 = '';\n\n\tfor (let index = 0; index < array.length; index += MAX_BLOCK_SIZE) {\n\t\tconst chunk = array.subarray(index, index + MAX_BLOCK_SIZE);\n\t\t// Required as `btoa` and `atob` don't properly support Unicode: https://developer.mozilla.org/en-US/docs/Glossary/Base64#the_unicode_problem\n\t\tbase64 += globalThis.btoa(String.fromCodePoint.apply(undefined, chunk));\n\t}\n\n\treturn urlSafe ? base64ToBase64Url(base64) : base64;\n}\n\nexport function base64ToUint8Array(base64String) {\n\tassertString(base64String);\n\treturn Uint8Array.from(globalThis.atob(base64UrlToBase64(base64String)), x => x.codePointAt(0));\n}\n\nexport function stringToBase64(string, {urlSafe = false} = {}) {\n\tassertString(string);\n\treturn uint8ArrayToBase64(stringToUint8Array(string), {urlSafe});\n}\n\nexport function base64ToString(base64String) {\n\tassertString(base64String);\n\treturn uint8ArrayToString(base64ToUint8Array(base64String));\n}\n\nconst byteToHexLookupTable = Array.from({length: 256}, (_, index) => index.toString(16).padStart(2, '0'));\n\nexport function uint8ArrayToHex(array) {\n\tassertUint8Array(array);\n\n\t// Concatenating a string is faster than using an array.\n\tlet hexString = '';\n\n\t// eslint-disable-next-line unicorn/no-for-loop -- Max performance is critical.\n\tfor (let index = 0; index < array.length; index++) {\n\t\thexString += byteToHexLookupTable[array[index]];\n\t}\n\n\treturn hexString;\n}\n\nconst hexToDecimalLookupTable = {\n\t0: 0,\n\t1: 1,\n\t2: 2,\n\t3: 3,\n\t4: 4,\n\t5: 5,\n\t6: 6,\n\t7: 7,\n\t8: 8,\n\t9: 9,\n\ta: 10,\n\tb: 11,\n\tc: 12,\n\td: 13,\n\te: 14,\n\tf: 15,\n\tA: 10,\n\tB: 11,\n\tC: 12,\n\tD: 13,\n\tE: 14,\n\tF: 15,\n};\n\nexport function hexToUint8Array(hexString) {\n\tassertString(hexString);\n\n\tif (hexString.length % 2 !== 0) {\n\t\tthrow new Error('Invalid Hex string length.');\n\t}\n\n\tconst resultLength = hexString.length / 2;\n\tconst bytes = new Uint8Array(resultLength);\n\n\tfor (let index = 0; index < resultLength; index++) {\n\t\tconst highNibble = hexToDecimalLookupTable[hexString[index * 2]];\n\t\tconst lowNibble = hexToDecimalLookupTable[hexString[(index * 2) + 1]];\n\n\t\tif (highNibble === undefined || lowNibble === undefined) {\n\t\t\tthrow new Error(`Invalid Hex character encountered at position ${index * 2}`);\n\t\t}\n\n\t\tbytes[index] = (highNibble << 4) | lowNibble; // eslint-disable-line no-bitwise\n\t}\n\n\treturn bytes;\n}\n\n/**\n@param {DataView} view\n@returns {number}\n*/\nexport function getUintBE(view) {\n\tconst {byteLength} = view;\n\n\tif (byteLength === 6) {\n\t\treturn (view.getUint16(0) * (2 ** 32)) + view.getUint32(2);\n\t}\n\n\tif (byteLength === 5) {\n\t\treturn (view.getUint8(0) * (2 ** 32)) + view.getUint32(1);\n\t}\n\n\tif (byteLength === 4) {\n\t\treturn view.getUint32(0);\n\t}\n\n\tif (byteLength === 3) {\n\t\treturn (view.getUint8(0) * (2 ** 16)) + view.getUint16(1);\n\t}\n\n\tif (byteLength === 2) {\n\t\treturn view.getUint16(0);\n\t}\n\n\tif (byteLength === 1) {\n\t\treturn view.getUint8(0);\n\t}\n}\n\n/**\n@param {Uint8Array} array\n@param {Uint8Array} value\n@returns {number}\n*/\nexport function indexOf(array, value) {\n\tconst arrayLength = array.length;\n\tconst valueLength = value.length;\n\n\tif (valueLength === 0) {\n\t\treturn -1;\n\t}\n\n\tif (valueLength > arrayLength) {\n\t\treturn -1;\n\t}\n\n\tconst validOffsetLength = arrayLength - valueLength;\n\n\tfor (let index = 0; index <= validOffsetLength; index++) {\n\t\tlet isMatch = true;\n\t\tfor (let index2 = 0; index2 < valueLength; index2++) {\n\t\t\tif (array[index + index2] !== value[index2]) {\n\t\t\t\tisMatch = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (isMatch) {\n\t\t\treturn index;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/**\n@param {Uint8Array} array\n@param {Uint8Array} value\n@returns {boolean}\n*/\nexport function includes(array, value) {\n\treturn indexOf(array, value) !== -1;\n}\n","import {StringType} from 'token-types';\n\nexport function stringToBytes(string, encoding) {\n\tif (encoding === 'utf-16le') {\n\t\tconst bytes = [];\n\t\tfor (let index = 0; index < string.length; index++) {\n\t\t\tconst code = string.charCodeAt(index); // eslint-disable-line unicorn/prefer-code-point\n\t\t\tbytes.push(code & 0xFF, (code >> 8) & 0xFF); // High byte\n\t\t}\n\n\t\treturn bytes;\n\t}\n\n\tif (encoding === 'utf-16be') {\n\t\tconst bytes = [];\n\t\tfor (let index = 0; index < string.length; index++) {\n\t\t\tconst code = string.charCodeAt(index); // eslint-disable-line unicorn/prefer-code-point\n\t\t\tbytes.push((code >> 8) & 0xFF, code & 0xFF); // Low byte\n\t\t}\n\n\t\treturn bytes;\n\t}\n\n\treturn [...string].map(character => character.charCodeAt(0)); // eslint-disable-line unicorn/prefer-code-point\n}\n\n/**\nChecks whether the TAR checksum is valid.\n\n@param {Uint8Array} arrayBuffer - The TAR header `[offset ... offset + 512]`.\n@param {number} offset - TAR header offset.\n@returns {boolean} `true` if the TAR checksum is valid, otherwise `false`.\n*/\nexport function tarHeaderChecksumMatches(arrayBuffer, offset = 0) {\n\tconst readSum = Number.parseInt(new StringType(6).get(arrayBuffer, 148).replace(/\\0.*$/, '').trim(), 8); // Read sum in header\n\tif (Number.isNaN(readSum)) {\n\t\treturn false;\n\t}\n\n\tlet sum = 8 * 0x20; // Initialize signed bit sum\n\n\tfor (let index = offset; index < offset + 148; index++) {\n\t\tsum += arrayBuffer[index];\n\t}\n\n\tfor (let index = offset + 156; index < offset + 512; index++) {\n\t\tsum += arrayBuffer[index];\n\t}\n\n\treturn readSum === sum;\n}\n\n/**\nID3 UINT32 sync-safe tokenizer token.\n28 bits (representing up to 256MB) integer, the msb is 0 to avoid \"false syncsignals\".\n*/\nexport const uint32SyncSafeToken = {\n\tget: (buffer, offset) => (buffer[offset + 3] & 0x7F) | ((buffer[offset + 2]) << 7) | ((buffer[offset + 1]) << 14) | ((buffer[offset]) << 21),\n\tlen: 4,\n};\n","export const extensions = [\n\t'jpg',\n\t'png',\n\t'apng',\n\t'gif',\n\t'webp',\n\t'flif',\n\t'xcf',\n\t'cr2',\n\t'cr3',\n\t'orf',\n\t'arw',\n\t'dng',\n\t'nef',\n\t'rw2',\n\t'raf',\n\t'tif',\n\t'bmp',\n\t'icns',\n\t'jxr',\n\t'psd',\n\t'indd',\n\t'zip',\n\t'tar',\n\t'rar',\n\t'gz',\n\t'bz2',\n\t'7z',\n\t'dmg',\n\t'mp4',\n\t'mid',\n\t'mkv',\n\t'webm',\n\t'mov',\n\t'avi',\n\t'mpg',\n\t'mp2',\n\t'mp3',\n\t'm4a',\n\t'oga',\n\t'ogg',\n\t'ogv',\n\t'opus',\n\t'flac',\n\t'wav',\n\t'spx',\n\t'amr',\n\t'pdf',\n\t'epub',\n\t'elf',\n\t'macho',\n\t'exe',\n\t'swf',\n\t'rtf',\n\t'wasm',\n\t'woff',\n\t'woff2',\n\t'eot',\n\t'ttf',\n\t'otf',\n\t'ttc',\n\t'ico',\n\t'flv',\n\t'ps',\n\t'xz',\n\t'sqlite',\n\t'nes',\n\t'crx',\n\t'xpi',\n\t'cab',\n\t'deb',\n\t'ar',\n\t'rpm',\n\t'Z',\n\t'lz',\n\t'cfb',\n\t'mxf',\n\t'mts',\n\t'blend',\n\t'bpg',\n\t'docx',\n\t'pptx',\n\t'xlsx',\n\t'3gp',\n\t'3g2',\n\t'j2c',\n\t'jp2',\n\t'jpm',\n\t'jpx',\n\t'mj2',\n\t'aif',\n\t'qcp',\n\t'odt',\n\t'ods',\n\t'odp',\n\t'xml',\n\t'mobi',\n\t'heic',\n\t'cur',\n\t'ktx',\n\t'ape',\n\t'wv',\n\t'dcm',\n\t'ics',\n\t'glb',\n\t'pcap',\n\t'dsf',\n\t'lnk',\n\t'alias',\n\t'voc',\n\t'ac3',\n\t'm4v',\n\t'm4p',\n\t'm4b',\n\t'f4v',\n\t'f4p',\n\t'f4b',\n\t'f4a',\n\t'mie',\n\t'asf',\n\t'ogm',\n\t'ogx',\n\t'mpc',\n\t'arrow',\n\t'shp',\n\t'aac',\n\t'mp1',\n\t'it',\n\t's3m',\n\t'xm',\n\t'skp',\n\t'avif',\n\t'eps',\n\t'lzh',\n\t'pgp',\n\t'asar',\n\t'stl',\n\t'chm',\n\t'3mf',\n\t'zst',\n\t'jxl',\n\t'vcf',\n\t'jls',\n\t'pst',\n\t'dwg',\n\t'parquet',\n\t'class',\n\t'arj',\n\t'cpio',\n\t'ace',\n\t'avro',\n\t'icc',\n\t'fbx',\n\t'vsdx',\n\t'vtt',\n\t'apk',\n\t'drc',\n\t'lz4',\n\t'potx',\n\t'xltx',\n\t'dotx',\n\t'xltm',\n\t'ott',\n\t'ots',\n\t'otp',\n\t'odg',\n\t'otg',\n\t'xlsm',\n\t'docm',\n\t'dotm',\n\t'potm',\n\t'pptm',\n\t'jar',\n\t'jmp',\n\t'rm',\n\t'sav',\n\t'ppsm',\n\t'ppsx',\n\t'tar.gz',\n\t'reg',\n\t'dat',\n];\n\nexport const mimeTypes = [\n\t'image/jpeg',\n\t'image/png',\n\t'image/gif',\n\t'image/webp',\n\t'image/flif',\n\t'image/x-xcf',\n\t'image/x-canon-cr2',\n\t'image/x-canon-cr3',\n\t'image/tiff',\n\t'image/bmp',\n\t'image/vnd.ms-photo',\n\t'image/vnd.adobe.photoshop',\n\t'application/x-indesign',\n\t'application/epub+zip',\n\t'application/x-xpinstall',\n\t'application/vnd.ms-powerpoint.slideshow.macroenabled.12',\n\t'application/vnd.oasis.opendocument.text',\n\t'application/vnd.oasis.opendocument.spreadsheet',\n\t'application/vnd.oasis.opendocument.presentation',\n\t'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n\t'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n\t'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n\t'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n\t'application/zip',\n\t'application/x-tar',\n\t'application/x-rar-compressed',\n\t'application/gzip',\n\t'application/x-bzip2',\n\t'application/x-7z-compressed',\n\t'application/x-apple-diskimage',\n\t'application/vnd.apache.arrow.file',\n\t'video/mp4',\n\t'audio/midi',\n\t'video/matroska',\n\t'video/webm',\n\t'video/quicktime',\n\t'video/vnd.avi',\n\t'audio/wav',\n\t'audio/qcelp',\n\t'audio/x-ms-asf',\n\t'video/x-ms-asf',\n\t'application/vnd.ms-asf',\n\t'video/mpeg',\n\t'video/3gpp',\n\t'audio/mpeg',\n\t'audio/mp4', // RFC 4337\n\t'video/ogg',\n\t'audio/ogg',\n\t'audio/ogg; codecs=opus',\n\t'application/ogg',\n\t'audio/flac',\n\t'audio/ape',\n\t'audio/wavpack',\n\t'audio/amr',\n\t'application/pdf',\n\t'application/x-elf',\n\t'application/x-mach-binary',\n\t'application/x-msdownload',\n\t'application/x-shockwave-flash',\n\t'application/rtf',\n\t'application/wasm',\n\t'font/woff',\n\t'font/woff2',\n\t'application/vnd.ms-fontobject',\n\t'font/ttf',\n\t'font/otf',\n\t'font/collection',\n\t'image/x-icon',\n\t'video/x-flv',\n\t'application/postscript',\n\t'application/eps',\n\t'application/x-xz',\n\t'application/x-sqlite3',\n\t'application/x-nintendo-nes-rom',\n\t'application/x-google-chrome-extension',\n\t'application/vnd.ms-cab-compressed',\n\t'application/x-deb',\n\t'application/x-unix-archive',\n\t'application/x-rpm',\n\t'application/x-compress',\n\t'application/x-lzip',\n\t'application/x-cfb',\n\t'application/x-mie',\n\t'application/mxf',\n\t'video/mp2t',\n\t'application/x-blender',\n\t'image/bpg',\n\t'image/j2c',\n\t'image/jp2',\n\t'image/jpx',\n\t'image/jpm',\n\t'image/mj2',\n\t'audio/aiff',\n\t'application/xml',\n\t'application/x-mobipocket-ebook',\n\t'image/heif',\n\t'image/heif-sequence',\n\t'image/heic',\n\t'image/heic-sequence',\n\t'image/icns',\n\t'image/ktx',\n\t'application/dicom',\n\t'audio/x-musepack',\n\t'text/calendar',\n\t'text/vcard',\n\t'text/vtt',\n\t'model/gltf-binary',\n\t'application/vnd.tcpdump.pcap',\n\t'audio/x-dsf', // Non-standard\n\t'application/x.ms.shortcut', // Invented by us\n\t'application/x.apple.alias', // Invented by us\n\t'audio/x-voc',\n\t'audio/vnd.dolby.dd-raw',\n\t'audio/x-m4a',\n\t'image/apng',\n\t'image/x-olympus-orf',\n\t'image/x-sony-arw',\n\t'image/x-adobe-dng',\n\t'image/x-nikon-nef',\n\t'image/x-panasonic-rw2',\n\t'image/x-fujifilm-raf',\n\t'video/x-m4v',\n\t'video/3gpp2',\n\t'application/x-esri-shape',\n\t'audio/aac',\n\t'audio/x-it',\n\t'audio/x-s3m',\n\t'audio/x-xm',\n\t'video/MP1S',\n\t'video/MP2P',\n\t'application/vnd.sketchup.skp',\n\t'image/avif',\n\t'application/x-lzh-compressed',\n\t'application/pgp-encrypted',\n\t'application/x-asar',\n\t'model/stl',\n\t'application/vnd.ms-htmlhelp',\n\t'model/3mf',\n\t'image/jxl',\n\t'application/zstd',\n\t'image/jls',\n\t'application/vnd.ms-outlook',\n\t'image/vnd.dwg',\n\t'application/vnd.apache.parquet',\n\t'application/java-vm',\n\t'application/x-arj',\n\t'application/x-cpio',\n\t'application/x-ace-compressed',\n\t'application/avro',\n\t'application/vnd.iccprofile',\n\t'application/x.autodesk.fbx', // Invented by us\n\t'application/vnd.visio',\n\t'application/vnd.android.package-archive',\n\t'application/vnd.google.draco', // Invented by us\n\t'application/x-lz4', // Invented by us\n\t'application/vnd.openxmlformats-officedocument.presentationml.template',\n\t'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n\t'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n\t'application/vnd.ms-excel.template.macroenabled.12',\n\t'application/vnd.oasis.opendocument.text-template',\n\t'application/vnd.oasis.opendocument.spreadsheet-template',\n\t'application/vnd.oasis.opendocument.presentation-template',\n\t'application/vnd.oasis.opendocument.graphics',\n\t'application/vnd.oasis.opendocument.graphics-template',\n\t'application/vnd.ms-excel.sheet.macroenabled.12',\n\t'application/vnd.ms-word.document.macroenabled.12',\n\t'application/vnd.ms-word.template.macroenabled.12',\n\t'application/vnd.ms-powerpoint.template.macroenabled.12',\n\t'application/vnd.ms-powerpoint.presentation.macroenabled.12',\n\t'application/java-archive',\n\t'application/vnd.rn-realmedia',\n\t'application/x-spss-sav',\n\t'application/x-ms-regedit',\n\t'application/x-ft-windows-registry-hive',\n\t'application/x-jmp-data',\n];\n","/**\nPrimary entry point, Node.js specific entry point is index.js\n*/\n\nimport * as Token from 'token-types';\nimport * as strtok3 from 'strtok3/core';\nimport {ZipHandler, GzipHandler} from '@tokenizer/inflate';\nimport {getUintBE} from 'uint8array-extras';\nimport {\n\tstringToBytes,\n\ttarHeaderChecksumMatches,\n\tuint32SyncSafeToken,\n} from './util.js';\nimport {extensions, mimeTypes} from './supported.js';\n\nexport const reasonableDetectionSizeInBytes = 4100; // A fair amount of file-types are detectable within this range.\n\nexport async function fileTypeFromStream(stream, options) {\n\treturn new FileTypeParser(options).fromStream(stream);\n}\n\nexport async function fileTypeFromBuffer(input, options) {\n\treturn new FileTypeParser(options).fromBuffer(input);\n}\n\nexport async function fileTypeFromBlob(blob, options) {\n\treturn new FileTypeParser(options).fromBlob(blob);\n}\n\nfunction getFileTypeFromMimeType(mimeType) {\n\tmimeType = mimeType.toLowerCase();\n\tswitch (mimeType) {\n\t\tcase 'application/epub+zip':\n\t\t\treturn {\n\t\t\t\text: 'epub',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.text':\n\t\t\treturn {\n\t\t\t\text: 'odt',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.text-template':\n\t\t\treturn {\n\t\t\t\text: 'ott',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.spreadsheet':\n\t\t\treturn {\n\t\t\t\text: 'ods',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.spreadsheet-template':\n\t\t\treturn {\n\t\t\t\text: 'ots',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.presentation':\n\t\t\treturn {\n\t\t\t\text: 'odp',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.presentation-template':\n\t\t\treturn {\n\t\t\t\text: 'otp',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.graphics':\n\t\t\treturn {\n\t\t\t\text: 'odg',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.graphics-template':\n\t\t\treturn {\n\t\t\t\text: 'otg',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.presentationml.slideshow':\n\t\t\treturn {\n\t\t\t\text: 'ppsx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':\n\t\t\treturn {\n\t\t\t\text: 'xlsx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-excel.sheet.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'xlsm',\n\t\t\t\tmime: 'application/vnd.ms-excel.sheet.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.spreadsheetml.template':\n\t\t\treturn {\n\t\t\t\text: 'xltx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-excel.template.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'xltm',\n\t\t\t\tmime: 'application/vnd.ms-excel.template.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.ms-powerpoint.slideshow.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'ppsm',\n\t\t\t\tmime: 'application/vnd.ms-powerpoint.slideshow.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':\n\t\t\treturn {\n\t\t\t\text: 'docx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-word.document.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'docm',\n\t\t\t\tmime: 'application/vnd.ms-word.document.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.wordprocessingml.template':\n\t\t\treturn {\n\t\t\t\text: 'dotx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-word.template.macroenabledtemplate':\n\t\t\treturn {\n\t\t\t\text: 'dotm',\n\t\t\t\tmime: 'application/vnd.ms-word.template.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.presentationml.template':\n\t\t\treturn {\n\t\t\t\text: 'potx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-powerpoint.template.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'potm',\n\t\t\t\tmime: 'application/vnd.ms-powerpoint.template.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.presentationml.presentation':\n\t\t\treturn {\n\t\t\t\text: 'pptx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-powerpoint.presentation.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'pptm',\n\t\t\t\tmime: 'application/vnd.ms-powerpoint.presentation.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.ms-visio.drawing':\n\t\t\treturn {\n\t\t\t\text: 'vsdx',\n\t\t\t\tmime: 'application/vnd.visio',\n\t\t\t};\n\t\tcase 'application/vnd.ms-package.3dmanufacturing-3dmodel+xml':\n\t\t\treturn {\n\t\t\t\text: '3mf',\n\t\t\t\tmime: 'model/3mf',\n\t\t\t};\n\t\tdefault:\n\t}\n}\n\nfunction _check(buffer, headers, options) {\n\toptions = {\n\t\toffset: 0,\n\t\t...options,\n\t};\n\n\tfor (const [index, header] of headers.entries()) {\n\t\t// If a bitmask is set\n\t\tif (options.mask) {\n\t\t\t// If header doesn't equal `buf` with bits masked off\n\t\t\tif (header !== (options.mask[index] & buffer[index + options.offset])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (header !== buffer[index + options.offset]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nexport async function fileTypeFromTokenizer(tokenizer, options) {\n\treturn new FileTypeParser(options).fromTokenizer(tokenizer);\n}\n\nexport async function fileTypeStream(webStream, options) {\n\treturn new FileTypeParser(options).toDetectionStream(webStream, options);\n}\n\nexport class FileTypeParser {\n\tconstructor(options) {\n\t\tthis.options = {\n\t\t\tmpegOffsetTolerance: 0,\n\t\t\t...options,\n\t\t};\n\n\t\tthis.detectors = [...(options?.customDetectors ?? []),\n\t\t\t{id: 'core', detect: this.detectConfident},\n\t\t\t{id: 'core.imprecise', detect: this.detectImprecise}];\n\t\tthis.tokenizerOptions = {\n\t\t\tabortSignal: options?.signal,\n\t\t};\n\t}\n\n\tasync fromTokenizer(tokenizer) {\n\t\tconst initialPosition = tokenizer.position;\n\n\t\t// Iterate through all file-type detectors\n\t\tfor (const detector of this.detectors) {\n\t\t\tconst fileType = await detector.detect(tokenizer);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\n\t\t\tif (initialPosition !== tokenizer.position) {\n\t\t\t\treturn undefined; // Cannot proceed scanning of the tokenizer is at an arbitrary position\n\t\t\t}\n\t\t}\n\t}\n\n\tasync fromBuffer(input) {\n\t\tif (!(input instanceof Uint8Array || input instanceof ArrayBuffer)) {\n\t\t\tthrow new TypeError(`Expected the \\`input\\` argument to be of type \\`Uint8Array\\` or \\`ArrayBuffer\\`, got \\`${typeof input}\\``);\n\t\t}\n\n\t\tconst buffer = input instanceof Uint8Array ? input : new Uint8Array(input);\n\n\t\tif (!(buffer?.length > 1)) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.fromTokenizer(strtok3.fromBuffer(buffer, this.tokenizerOptions));\n\t}\n\n\tasync fromBlob(blob) {\n\t\tconst tokenizer = strtok3.fromBlob(blob, this.tokenizerOptions);\n\t\ttry {\n\t\t\treturn await this.fromTokenizer(tokenizer);\n\t\t} finally {\n\t\t\tawait tokenizer.close();\n\t\t}\n\t}\n\n\tasync fromStream(stream) {\n\t\tconst tokenizer = strtok3.fromWebStream(stream, this.tokenizerOptions);\n\t\ttry {\n\t\t\treturn await this.fromTokenizer(tokenizer);\n\t\t} finally {\n\t\t\tawait tokenizer.close();\n\t\t}\n\t}\n\n\tasync toDetectionStream(stream, options) {\n\t\tconst {sampleSize = reasonableDetectionSizeInBytes} = options;\n\t\tlet detectedFileType;\n\t\tlet firstChunk;\n\n\t\tconst reader = stream.getReader({mode: 'byob'});\n\t\ttry {\n\t\t\t// Read the first chunk from the stream\n\t\t\tconst {value: chunk, done} = await reader.read(new Uint8Array(sampleSize));\n\t\t\tfirstChunk = chunk;\n\t\t\tif (!done && chunk) {\n\t\t\t\ttry {\n\t\t\t\t\t// Attempt to detect the file type from the chunk\n\t\t\t\t\tdetectedFileType = await this.fromBuffer(chunk.subarray(0, sampleSize));\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!(error instanceof strtok3.EndOfStreamError)) {\n\t\t\t\t\t\tthrow error; // Re-throw non-EndOfStreamError\n\t\t\t\t\t}\n\n\t\t\t\t\tdetectedFileType = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfirstChunk = chunk;\n\t\t} finally {\n\t\t\treader.releaseLock(); // Ensure the reader is released\n\t\t}\n\n\t\t// Create a new ReadableStream to manage locking issues\n\t\tconst transformStream = new TransformStream({\n\t\t\tasync start(controller) {\n\t\t\t\tcontroller.enqueue(firstChunk); // Enqueue the initial chunk\n\t\t\t},\n\t\t\ttransform(chunk, controller) {\n\t\t\t\t// Pass through the chunks without modification\n\t\t\t\tcontroller.enqueue(chunk);\n\t\t\t},\n\t\t});\n\n\t\tconst newStream = stream.pipeThrough(transformStream);\n\t\tnewStream.fileType = detectedFileType;\n\n\t\treturn newStream;\n\t}\n\n\tcheck(header, options) {\n\t\treturn _check(this.buffer, header, options);\n\t}\n\n\tcheckString(header, options) {\n\t\treturn this.check(stringToBytes(header, options?.encoding), options);\n\t}\n\n\t// Detections with a high degree of certainty in identifying the correct file type\n\tdetectConfident = async tokenizer => {\n\t\tthis.buffer = new Uint8Array(reasonableDetectionSizeInBytes);\n\n\t\t// Keep reading until EOF if the file size is unknown.\n\t\tif (tokenizer.fileInfo.size === undefined) {\n\t\t\ttokenizer.fileInfo.size = Number.MAX_SAFE_INTEGER;\n\t\t}\n\n\t\tthis.tokenizer = tokenizer;\n\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: 32, mayBeLess: true});\n\n\t\t// -- 2-byte signatures --\n\n\t\tif (this.check([0x42, 0x4D])) {\n\t\t\treturn {\n\t\t\t\text: 'bmp',\n\t\t\t\tmime: 'image/bmp',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x0B, 0x77])) {\n\t\t\treturn {\n\t\t\t\text: 'ac3',\n\t\t\t\tmime: 'audio/vnd.dolby.dd-raw',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x78, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'dmg',\n\t\t\t\tmime: 'application/x-apple-diskimage',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4D, 0x5A])) {\n\t\t\treturn {\n\t\t\t\text: 'exe',\n\t\t\t\tmime: 'application/x-msdownload',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x25, 0x21])) {\n\t\t\tawait tokenizer.peekBuffer(this.buffer, {length: 24, mayBeLess: true});\n\n\t\t\tif (\n\t\t\t\tthis.checkString('PS-Adobe-', {offset: 2})\n\t\t\t\t&& this.checkString(' EPSF-', {offset: 14})\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'eps',\n\t\t\t\t\tmime: 'application/eps',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'ps',\n\t\t\t\tmime: 'application/postscript',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x1F, 0xA0])\n\t\t\t|| this.check([0x1F, 0x9D])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'Z',\n\t\t\t\tmime: 'application/x-compress',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xC7, 0x71])) {\n\t\t\treturn {\n\t\t\t\text: 'cpio',\n\t\t\t\tmime: 'application/x-cpio',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x60, 0xEA])) {\n\t\t\treturn {\n\t\t\t\text: 'arj',\n\t\t\t\tmime: 'application/x-arj',\n\t\t\t};\n\t\t}\n\n\t\t// -- 3-byte signatures --\n\n\t\tif (this.check([0xEF, 0xBB, 0xBF])) { // UTF-8-BOM\n\t\t\t// Strip off UTF-8-BOM\n\t\t\tthis.tokenizer.ignore(3);\n\t\t\treturn this.detectConfident(tokenizer);\n\t\t}\n\n\t\tif (this.check([0x47, 0x49, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'gif',\n\t\t\t\tmime: 'image/gif',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x49, 0x49, 0xBC])) {\n\t\t\treturn {\n\t\t\t\text: 'jxr',\n\t\t\t\tmime: 'image/vnd.ms-photo',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x1F, 0x8B, 0x8])) {\n\t\t\tconst gzipHandler = new GzipHandler(tokenizer);\n\n\t\t\tconst stream = gzipHandler.inflate();\n\t\t\tlet shouldCancelStream = true;\n\t\t\ttry {\n\t\t\t\tlet compressedFileType;\n\t\t\t\ttry {\n\t\t\t\t\tcompressedFileType = await this.fromStream(stream);\n\t\t\t\t} catch {\n\t\t\t\t\tshouldCancelStream = false;\n\t\t\t\t}\n\n\t\t\t\tif (compressedFileType && compressedFileType.ext === 'tar') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'tar.gz',\n\t\t\t\t\t\tmime: 'application/gzip',\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (shouldCancelStream) {\n\t\t\t\t\tawait stream.cancel();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'gz',\n\t\t\t\tmime: 'application/gzip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x5A, 0x68])) {\n\t\t\treturn {\n\t\t\t\text: 'bz2',\n\t\t\t\tmime: 'application/x-bzip2',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('ID3')) {\n\t\t\tawait tokenizer.ignore(6); // Skip ID3 header until the header size\n\t\t\tconst id3HeaderLength = await tokenizer.readToken(uint32SyncSafeToken);\n\t\t\tif (tokenizer.position + id3HeaderLength > tokenizer.fileInfo.size) {\n\t\t\t\t// Guess file type based on ID3 header for backward compatibility\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp3',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tawait tokenizer.ignore(id3HeaderLength);\n\t\t\treturn this.fromTokenizer(tokenizer); // Skip ID3 header, recursion\n\t\t}\n\n\t\t// Musepack, SV7\n\t\tif (this.checkString('MP+')) {\n\t\t\treturn {\n\t\t\t\text: 'mpc',\n\t\t\t\tmime: 'audio/x-musepack',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\t(this.buffer[0] === 0x43 || this.buffer[0] === 0x46)\n\t\t\t&& this.check([0x57, 0x53], {offset: 1})\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'swf',\n\t\t\t\tmime: 'application/x-shockwave-flash',\n\t\t\t};\n\t\t}\n\n\t\t// -- 4-byte signatures --\n\n\t\t// Requires a sample size of 4 bytes\n\t\tif (this.check([0xFF, 0xD8, 0xFF])) {\n\t\t\tif (this.check([0xF7], {offset: 3})) { // JPG7/SOF55, indicating a ISO/IEC 14495 / JPEG-LS file\n\t\t\t\treturn {\n\t\t\t\t\text: 'jls',\n\t\t\t\t\tmime: 'image/jls',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'jpg',\n\t\t\t\tmime: 'image/jpeg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4F, 0x62, 0x6A, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'avro',\n\t\t\t\tmime: 'application/avro',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('FLIF')) {\n\t\t\treturn {\n\t\t\t\text: 'flif',\n\t\t\t\tmime: 'image/flif',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('8BPS')) {\n\t\t\treturn {\n\t\t\t\text: 'psd',\n\t\t\t\tmime: 'image/vnd.adobe.photoshop',\n\t\t\t};\n\t\t}\n\n\t\t// Musepack, SV8\n\t\tif (this.checkString('MPCK')) {\n\t\t\treturn {\n\t\t\t\text: 'mpc',\n\t\t\t\tmime: 'audio/x-musepack',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('FORM')) {\n\t\t\treturn {\n\t\t\t\text: 'aif',\n\t\t\t\tmime: 'audio/aiff',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('icns', {offset: 0})) {\n\t\t\treturn {\n\t\t\t\text: 'icns',\n\t\t\t\tmime: 'image/icns',\n\t\t\t};\n\t\t}\n\n\t\t// Zip-based file formats\n\t\t// Need to be before the `zip` check\n\t\tif (this.check([0x50, 0x4B, 0x3, 0x4])) { // Local file header signature\n\t\t\tlet fileType;\n\t\t\tawait new ZipHandler(tokenizer).unzip(zipHeader => {\n\t\t\t\tswitch (zipHeader.filename) {\n\t\t\t\t\tcase 'META-INF/mozilla.rsa':\n\t\t\t\t\t\tfileType = {\n\t\t\t\t\t\t\text: 'xpi',\n\t\t\t\t\t\t\tmime: 'application/x-xpinstall',\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstop: true,\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'META-INF/MANIFEST.MF':\n\t\t\t\t\t\tfileType = {\n\t\t\t\t\t\t\text: 'jar',\n\t\t\t\t\t\t\tmime: 'application/java-archive',\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstop: true,\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'mimetype':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tasync handler(fileData) {\n\t\t\t\t\t\t\t\t// Use TextDecoder to decode the UTF-8 encoded data\n\t\t\t\t\t\t\t\tconst mimeType = new TextDecoder('utf-8').decode(fileData).trim();\n\t\t\t\t\t\t\t\tfileType = getFileTypeFromMimeType(mimeType);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstop: true,\n\t\t\t\t\t\t};\n\n\t\t\t\t\tcase '[Content_Types].xml':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tasync handler(fileData) {\n\t\t\t\t\t\t\t\t// Use TextDecoder to decode the UTF-8 encoded data\n\t\t\t\t\t\t\t\tlet xmlContent = new TextDecoder('utf-8').decode(fileData);\n\t\t\t\t\t\t\t\tconst endPos = xmlContent.indexOf('.main+xml\"');\n\t\t\t\t\t\t\t\tif (endPos === -1) {\n\t\t\t\t\t\t\t\t\tconst mimeType = 'application/vnd.ms-package.3dmanufacturing-3dmodel+xml';\n\t\t\t\t\t\t\t\t\tif (xmlContent.includes(`ContentType=\"${mimeType}\"`)) {\n\t\t\t\t\t\t\t\t\t\tfileType = getFileTypeFromMimeType(mimeType);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\txmlContent = xmlContent.slice(0, Math.max(0, endPos));\n\t\t\t\t\t\t\t\t\tconst firstPos = xmlContent.lastIndexOf('\"');\n\t\t\t\t\t\t\t\t\tconst mimeType = xmlContent.slice(Math.max(0, firstPos + 1));\n\t\t\t\t\t\t\t\t\tfileType = getFileTypeFromMimeType(mimeType);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstop: true,\n\t\t\t\t\t\t};\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (/classes\\d*\\.dex/.test(zipHeader.filename)) {\n\t\t\t\t\t\t\tfileType = {\n\t\t\t\t\t\t\t\text: 'apk',\n\t\t\t\t\t\t\t\tmime: 'application/vnd.android.package-archive',\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treturn {stop: true};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {};\n\t\t\t\t}\n\t\t\t}).catch(error => {\n\t\t\t\tif (!(error instanceof strtok3.EndOfStreamError)) {\n\t\t\t\t\tthrow error; // Re-throw non-EndOfStreamError\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn fileType ?? {\n\t\t\t\text: 'zip',\n\t\t\t\tmime: 'application/zip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('OggS')) {\n\t\t\t// This is an OGG container\n\t\t\tawait tokenizer.ignore(28);\n\t\t\tconst type = new Uint8Array(8);\n\t\t\tawait tokenizer.readBuffer(type);\n\n\t\t\t// Needs to be before `ogg` check\n\t\t\tif (_check(type, [0x4F, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'opus',\n\t\t\t\t\tmime: 'audio/ogg; codecs=opus',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If ' theora' in header.\n\t\t\tif (_check(type, [0x80, 0x74, 0x68, 0x65, 0x6F, 0x72, 0x61])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogv',\n\t\t\t\t\tmime: 'video/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If '\\x01video' in header.\n\t\t\tif (_check(type, [0x01, 0x76, 0x69, 0x64, 0x65, 0x6F, 0x00])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogm',\n\t\t\t\t\tmime: 'video/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If ' FLAC' in header https://xiph.org/flac/faq.html\n\t\t\tif (_check(type, [0x7F, 0x46, 0x4C, 0x41, 0x43])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'oga',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// 'Speex ' in header https://en.wikipedia.org/wiki/Speex\n\t\t\tif (_check(type, [0x53, 0x70, 0x65, 0x65, 0x78, 0x20, 0x20])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'spx',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If '\\x01vorbis' in header\n\t\t\tif (_check(type, [0x01, 0x76, 0x6F, 0x72, 0x62, 0x69, 0x73])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogg',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Default OGG container https://www.iana.org/assignments/media-types/application/ogg\n\t\t\treturn {\n\t\t\t\text: 'ogx',\n\t\t\t\tmime: 'application/ogg',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x50, 0x4B])\n\t\t\t&& (this.buffer[2] === 0x3 || this.buffer[2] === 0x5 || this.buffer[2] === 0x7)\n\t\t\t&& (this.buffer[3] === 0x4 || this.buffer[3] === 0x6 || this.buffer[3] === 0x8)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'zip',\n\t\t\t\tmime: 'application/zip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('MThd')) {\n\t\t\treturn {\n\t\t\t\text: 'mid',\n\t\t\t\tmime: 'audio/midi',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('wOFF')\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x01, 0x00, 0x00], {offset: 4})\n\t\t\t\t|| this.checkString('OTTO', {offset: 4})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'woff',\n\t\t\t\tmime: 'font/woff',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('wOF2')\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x01, 0x00, 0x00], {offset: 4})\n\t\t\t\t|| this.checkString('OTTO', {offset: 4})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'woff2',\n\t\t\t\tmime: 'font/woff2',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xD4, 0xC3, 0xB2, 0xA1]) || this.check([0xA1, 0xB2, 0xC3, 0xD4])) {\n\t\t\treturn {\n\t\t\t\text: 'pcap',\n\t\t\t\tmime: 'application/vnd.tcpdump.pcap',\n\t\t\t};\n\t\t}\n\n\t\t// Sony DSD Stream File (DSF)\n\t\tif (this.checkString('DSD ')) {\n\t\t\treturn {\n\t\t\t\text: 'dsf',\n\t\t\t\tmime: 'audio/x-dsf', // Non-standard\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('LZIP')) {\n\t\t\treturn {\n\t\t\t\text: 'lz',\n\t\t\t\tmime: 'application/x-lzip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('fLaC')) {\n\t\t\treturn {\n\t\t\t\text: 'flac',\n\t\t\t\tmime: 'audio/flac',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x50, 0x47, 0xFB])) {\n\t\t\treturn {\n\t\t\t\text: 'bpg',\n\t\t\t\tmime: 'image/bpg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('wvpk')) {\n\t\t\treturn {\n\t\t\t\text: 'wv',\n\t\t\t\tmime: 'audio/wavpack',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('%PDF')) {\n\t\t\t// Assume this is just a normal PDF\n\t\t\treturn {\n\t\t\t\text: 'pdf',\n\t\t\t\tmime: 'application/pdf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x61, 0x73, 0x6D])) {\n\t\t\treturn {\n\t\t\t\text: 'wasm',\n\t\t\t\tmime: 'application/wasm',\n\t\t\t};\n\t\t}\n\n\t\t// TIFF, little-endian type\n\t\tif (this.check([0x49, 0x49])) {\n\t\t\tconst fileType = await this.readTiffHeader(false);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\n\t\t// TIFF, big-endian type\n\t\tif (this.check([0x4D, 0x4D])) {\n\t\t\tconst fileType = await this.readTiffHeader(true);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('MAC ')) {\n\t\t\treturn {\n\t\t\t\text: 'ape',\n\t\t\t\tmime: 'audio/ape',\n\t\t\t};\n\t\t}\n\n\t\t// https://github.com/file/file/blob/master/magic/Magdir/matroska\n\t\tif (this.check([0x1A, 0x45, 0xDF, 0xA3])) { // Root element: EBML\n\t\t\tasync function readField() {\n\t\t\t\tconst msb = await tokenizer.peekNumber(Token.UINT8);\n\t\t\t\tlet mask = 0x80;\n\t\t\t\tlet ic = 0; // 0 = A, 1 = B, 2 = C, 3 = D\n\n\t\t\t\twhile ((msb & mask) === 0 && mask !== 0) {\n\t\t\t\t\t++ic;\n\t\t\t\t\tmask >>= 1;\n\t\t\t\t}\n\n\t\t\t\tconst id = new Uint8Array(ic + 1);\n\t\t\t\tawait tokenizer.readBuffer(id);\n\t\t\t\treturn id;\n\t\t\t}\n\n\t\t\tasync function readElement() {\n\t\t\t\tconst idField = await readField();\n\t\t\t\tconst lengthField = await readField();\n\n\t\t\t\tlengthField[0] ^= 0x80 >> (lengthField.length - 1);\n\t\t\t\tconst nrLength = Math.min(6, lengthField.length); // JavaScript can max read 6 bytes integer\n\n\t\t\t\tconst idView = new DataView(idField.buffer);\n\t\t\t\tconst lengthView = new DataView(lengthField.buffer, lengthField.length - nrLength, nrLength);\n\n\t\t\t\treturn {\n\t\t\t\t\tid: getUintBE(idView),\n\t\t\t\t\tlen: getUintBE(lengthView),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tasync function readChildren(children) {\n\t\t\t\twhile (children > 0) {\n\t\t\t\t\tconst element = await readElement();\n\t\t\t\t\tif (element.id === 0x42_82) {\n\t\t\t\t\t\tconst rawValue = await tokenizer.readToken(new Token.StringType(element.len));\n\t\t\t\t\t\treturn rawValue.replaceAll(/\\00.*$/g, ''); // Return DocType\n\t\t\t\t\t}\n\n\t\t\t\t\tawait tokenizer.ignore(element.len); // ignore payload\n\t\t\t\t\t--children;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst re = await readElement();\n\t\t\tconst documentType = await readChildren(re.len);\n\n\t\t\tswitch (documentType) {\n\t\t\t\tcase 'webm':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'webm',\n\t\t\t\t\t\tmime: 'video/webm',\n\t\t\t\t\t};\n\n\t\t\t\tcase 'matroska':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'mkv',\n\t\t\t\t\t\tmime: 'video/matroska',\n\t\t\t\t\t};\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('SQLi')) {\n\t\t\treturn {\n\t\t\t\text: 'sqlite',\n\t\t\t\tmime: 'application/x-sqlite3',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4E, 0x45, 0x53, 0x1A])) {\n\t\t\treturn {\n\t\t\t\text: 'nes',\n\t\t\t\tmime: 'application/x-nintendo-nes-rom',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Cr24')) {\n\t\t\treturn {\n\t\t\t\text: 'crx',\n\t\t\t\tmime: 'application/x-google-chrome-extension',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('MSCF')\n\t\t\t|| this.checkString('ISc(')\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'cab',\n\t\t\t\tmime: 'application/vnd.ms-cab-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xED, 0xAB, 0xEE, 0xDB])) {\n\t\t\treturn {\n\t\t\t\text: 'rpm',\n\t\t\t\tmime: 'application/x-rpm',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xC5, 0xD0, 0xD3, 0xC6])) {\n\t\t\treturn {\n\t\t\t\text: 'eps',\n\t\t\t\tmime: 'application/eps',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x28, 0xB5, 0x2F, 0xFD])) {\n\t\t\treturn {\n\t\t\t\text: 'zst',\n\t\t\t\tmime: 'application/zstd',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x7F, 0x45, 0x4C, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'elf',\n\t\t\t\tmime: 'application/x-elf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x21, 0x42, 0x44, 0x4E])) {\n\t\t\treturn {\n\t\t\t\text: 'pst',\n\t\t\t\tmime: 'application/vnd.ms-outlook',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('PAR1') || this.checkString('PARE')) {\n\t\t\treturn {\n\t\t\t\text: 'parquet',\n\t\t\t\tmime: 'application/vnd.apache.parquet',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('ttcf')) {\n\t\t\treturn {\n\t\t\t\text: 'ttc',\n\t\t\t\tmime: 'font/collection',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xCF, 0xFA, 0xED, 0xFE])) {\n\t\t\treturn {\n\t\t\t\text: 'macho',\n\t\t\t\tmime: 'application/x-mach-binary',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x04, 0x22, 0x4D, 0x18])) {\n\t\t\treturn {\n\t\t\t\text: 'lz4',\n\t\t\t\tmime: 'application/x-lz4', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('regf')) {\n\t\t\treturn {\n\t\t\t\text: 'dat',\n\t\t\t\tmime: 'application/x-ft-windows-registry-hive',\n\t\t\t};\n\t\t}\n\n\t\t// SPSS Statistical Data File\n\t\tif (this.checkString('$FL2') || this.checkString('$FL3')) {\n\t\t\treturn {\n\t\t\t\text: 'sav',\n\t\t\t\tmime: 'application/x-spss-sav',\n\t\t\t};\n\t\t}\n\n\t\t// -- 5-byte signatures --\n\n\t\tif (this.check([0x4F, 0x54, 0x54, 0x4F, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'otf',\n\t\t\t\tmime: 'font/otf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('#!AMR')) {\n\t\t\treturn {\n\t\t\t\text: 'amr',\n\t\t\t\tmime: 'audio/amr',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('{\\\\rtf')) {\n\t\t\treturn {\n\t\t\t\text: 'rtf',\n\t\t\t\tmime: 'application/rtf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x46, 0x4C, 0x56, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'flv',\n\t\t\t\tmime: 'video/x-flv',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('IMPM')) {\n\t\t\treturn {\n\t\t\t\text: 'it',\n\t\t\t\tmime: 'audio/x-it',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('-lh0-', {offset: 2})\n\t\t\t|| this.checkString('-lh1-', {offset: 2})\n\t\t\t|| this.checkString('-lh2-', {offset: 2})\n\t\t\t|| this.checkString('-lh3-', {offset: 2})\n\t\t\t|| this.checkString('-lh4-', {offset: 2})\n\t\t\t|| this.checkString('-lh5-', {offset: 2})\n\t\t\t|| this.checkString('-lh6-', {offset: 2})\n\t\t\t|| this.checkString('-lh7-', {offset: 2})\n\t\t\t|| this.checkString('-lzs-', {offset: 2})\n\t\t\t|| this.checkString('-lz4-', {offset: 2})\n\t\t\t|| this.checkString('-lz5-', {offset: 2})\n\t\t\t|| this.checkString('-lhd-', {offset: 2})\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'lzh',\n\t\t\t\tmime: 'application/x-lzh-compressed',\n\t\t\t};\n\t\t}\n\n\t\t// MPEG program stream (PS or MPEG-PS)\n\t\tif (this.check([0x00, 0x00, 0x01, 0xBA])) {\n\t\t\t// MPEG-PS, MPEG-1 Part 1\n\t\t\tif (this.check([0x21], {offset: 4, mask: [0xF1]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mpg', // May also be .ps, .mpeg\n\t\t\t\t\tmime: 'video/MP1S',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// MPEG-PS, MPEG-2 Part 1\n\t\t\tif (this.check([0x44], {offset: 4, mask: [0xC4]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mpg', // May also be .mpg, .m2p, .vob or .sub\n\t\t\t\t\tmime: 'video/MP2P',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('ITSF')) {\n\t\t\treturn {\n\t\t\t\text: 'chm',\n\t\t\t\tmime: 'application/vnd.ms-htmlhelp',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xCA, 0xFE, 0xBA, 0xBE])) {\n\t\t\treturn {\n\t\t\t\text: 'class',\n\t\t\t\tmime: 'application/java-vm',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('.RMF')) {\n\t\t\treturn {\n\t\t\t\text: 'rm',\n\t\t\t\tmime: 'application/vnd.rn-realmedia',\n\t\t\t};\n\t\t}\n\n\t\t// -- 5-byte signatures --\n\n\t\tif (this.checkString('DRACO')) {\n\t\t\treturn {\n\t\t\t\text: 'drc',\n\t\t\t\tmime: 'application/vnd.google.draco', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\t// -- 6-byte signatures --\n\n\t\tif (this.check([0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'xz',\n\t\t\t\tmime: 'application/x-xz',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('<?xml ')) {\n\t\t\treturn {\n\t\t\t\text: 'xml',\n\t\t\t\tmime: 'application/xml',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C])) {\n\t\t\treturn {\n\t\t\t\text: '7z',\n\t\t\t\tmime: 'application/x-7z-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x52, 0x61, 0x72, 0x21, 0x1A, 0x7])\n\t\t\t&& (this.buffer[6] === 0x0 || this.buffer[6] === 0x1)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'rar',\n\t\t\t\tmime: 'application/x-rar-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('solid ')) {\n\t\t\treturn {\n\t\t\t\text: 'stl',\n\t\t\t\tmime: 'model/stl',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('AC')) {\n\t\t\tconst version = new Token.StringType(4, 'latin1').get(this.buffer, 2);\n\t\t\tif (version.match('^d*') && version >= 1000 && version <= 1050) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'dwg',\n\t\t\t\t\tmime: 'image/vnd.dwg',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('070707')) {\n\t\t\treturn {\n\t\t\t\text: 'cpio',\n\t\t\t\tmime: 'application/x-cpio',\n\t\t\t};\n\t\t}\n\n\t\t// -- 7-byte signatures --\n\n\t\tif (this.checkString('BLENDER')) {\n\t\t\treturn {\n\t\t\t\text: 'blend',\n\t\t\t\tmime: 'application/x-blender',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('!<arch>')) {\n\t\t\tawait tokenizer.ignore(8);\n\t\t\tconst string = await tokenizer.readToken(new Token.StringType(13, 'ascii'));\n\t\t\tif (string === 'debian-binary') {\n\t\t\t\treturn {\n\t\t\t\t\text: 'deb',\n\t\t\t\t\tmime: 'application/x-deb',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'ar',\n\t\t\t\tmime: 'application/x-unix-archive',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('WEBVTT')\n\t\t\t&&\t(\n\t\t\t\t// One of LF, CR, tab, space, or end of file must follow \"WEBVTT\" per the spec (see `fixture/fixture-vtt-*.vtt` for examples). Note that `\\0` is technically the null character (there is no such thing as an EOF character). However, checking for `\\0` gives us the same result as checking for the end of the stream.\n\t\t\t\t(['\\n', '\\r', '\\t', ' ', '\\0'].some(char7 => this.checkString(char7, {offset: 6}))))\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'vtt',\n\t\t\t\tmime: 'text/vtt',\n\t\t\t};\n\t\t}\n\n\t\t// -- 8-byte signatures --\n\n\t\tif (this.check([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) {\n\t\t\t// APNG format (https://wiki.mozilla.org/APNG_Specification)\n\t\t\t// 1. Find the first IDAT (image data) chunk (49 44 41 54)\n\t\t\t// 2. Check if there is an \"acTL\" chunk before the IDAT one (61 63 54 4C)\n\n\t\t\t// Offset calculated as follows:\n\t\t\t// - 8 bytes: PNG signature\n\t\t\t// - 4 (length) + 4 (chunk type) + 13 (chunk data) + 4 (CRC): IHDR chunk\n\n\t\t\tawait tokenizer.ignore(8); // ignore PNG signature\n\n\t\t\tasync function readChunkHeader() {\n\t\t\t\treturn {\n\t\t\t\t\tlength: await tokenizer.readToken(Token.INT32_BE),\n\t\t\t\t\ttype: await tokenizer.readToken(new Token.StringType(4, 'latin1')),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdo {\n\t\t\t\tconst chunk = await readChunkHeader();\n\t\t\t\tif (chunk.length < 0) {\n\t\t\t\t\treturn; // Invalid chunk length\n\t\t\t\t}\n\n\t\t\t\tswitch (chunk.type) {\n\t\t\t\t\tcase 'IDAT':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'png',\n\t\t\t\t\t\t\tmime: 'image/png',\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'acTL':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'apng',\n\t\t\t\t\t\t\tmime: 'image/apng',\n\t\t\t\t\t\t};\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tawait tokenizer.ignore(chunk.length + 4); // Ignore chunk-data + CRC\n\t\t\t\t}\n\t\t\t} while (tokenizer.position + 8 < tokenizer.fileInfo.size);\n\n\t\t\treturn {\n\t\t\t\text: 'png',\n\t\t\t\tmime: 'image/png',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x41, 0x52, 0x52, 0x4F, 0x57, 0x31, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'arrow',\n\t\t\t\tmime: 'application/vnd.apache.arrow.file',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x67, 0x6C, 0x54, 0x46, 0x02, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'glb',\n\t\t\t\tmime: 'model/gltf-binary',\n\t\t\t};\n\t\t}\n\n\t\t// `mov` format variants\n\t\tif (\n\t\t\tthis.check([0x66, 0x72, 0x65, 0x65], {offset: 4}) // `free`\n\t\t\t|| this.check([0x6D, 0x64, 0x61, 0x74], {offset: 4}) // `mdat` MJPEG\n\t\t\t|| this.check([0x6D, 0x6F, 0x6F, 0x76], {offset: 4}) // `moov`\n\t\t\t|| this.check([0x77, 0x69, 0x64, 0x65], {offset: 4}) // `wide`\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'mov',\n\t\t\t\tmime: 'video/quicktime',\n\t\t\t};\n\t\t}\n\n\t\t// -- 9-byte signatures --\n\n\t\tif (this.check([0x49, 0x49, 0x52, 0x4F, 0x08, 0x00, 0x00, 0x00, 0x18])) {\n\t\t\treturn {\n\t\t\t\text: 'orf',\n\t\t\t\tmime: 'image/x-olympus-orf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('gimp xcf ')) {\n\t\t\treturn {\n\t\t\t\text: 'xcf',\n\t\t\t\tmime: 'image/x-xcf',\n\t\t\t};\n\t\t}\n\n\t\t// File Type Box (https://en.wikipedia.org/wiki/ISO_base_media_file_format)\n\t\t// It's not required to be first, but it's recommended to be. Almost all ISO base media files start with `ftyp` box.\n\t\t// `ftyp` box must contain a brand major identifier, which must consist of ISO 8859-1 printable characters.\n\t\t// Here we check for 8859-1 printable characters (for simplicity, it's a mask which also catches one non-printable character).\n\t\tif (\n\t\t\tthis.checkString('ftyp', {offset: 4})\n\t\t\t&& (this.buffer[8] & 0x60) !== 0x00 // Brand major, first character ASCII?\n\t\t) {\n\t\t\t// They all can have MIME `video/mp4` except `application/mp4` special-case which is hard to detect.\n\t\t\t// For some cases, we're specific, everything else falls to `video/mp4` with `mp4` extension.\n\t\t\tconst brandMajor = new Token.StringType(4, 'latin1').get(this.buffer, 8).replace('\\0', ' ').trim();\n\t\t\tswitch (brandMajor) {\n\t\t\t\tcase 'avif':\n\t\t\t\tcase 'avis':\n\t\t\t\t\treturn {ext: 'avif', mime: 'image/avif'};\n\t\t\t\tcase 'mif1':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heif'};\n\t\t\t\tcase 'msf1':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heif-sequence'};\n\t\t\t\tcase 'heic':\n\t\t\t\tcase 'heix':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heic'};\n\t\t\t\tcase 'hevc':\n\t\t\t\tcase 'hevx':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heic-sequence'};\n\t\t\t\tcase 'qt':\n\t\t\t\t\treturn {ext: 'mov', mime: 'video/quicktime'};\n\t\t\t\tcase 'M4V':\n\t\t\t\tcase 'M4VH':\n\t\t\t\tcase 'M4VP':\n\t\t\t\t\treturn {ext: 'm4v', mime: 'video/x-m4v'};\n\t\t\t\tcase 'M4P':\n\t\t\t\t\treturn {ext: 'm4p', mime: 'video/mp4'};\n\t\t\t\tcase 'M4B':\n\t\t\t\t\treturn {ext: 'm4b', mime: 'audio/mp4'};\n\t\t\t\tcase 'M4A':\n\t\t\t\t\treturn {ext: 'm4a', mime: 'audio/x-m4a'};\n\t\t\t\tcase 'F4V':\n\t\t\t\t\treturn {ext: 'f4v', mime: 'video/mp4'};\n\t\t\t\tcase 'F4P':\n\t\t\t\t\treturn {ext: 'f4p', mime: 'video/mp4'};\n\t\t\t\tcase 'F4A':\n\t\t\t\t\treturn {ext: 'f4a', mime: 'audio/mp4'};\n\t\t\t\tcase 'F4B':\n\t\t\t\t\treturn {ext: 'f4b', mime: 'audio/mp4'};\n\t\t\t\tcase 'crx':\n\t\t\t\t\treturn {ext: 'cr3', mime: 'image/x-canon-cr3'};\n\t\t\t\tdefault:\n\t\t\t\t\tif (brandMajor.startsWith('3g')) {\n\t\t\t\t\t\tif (brandMajor.startsWith('3g2')) {\n\t\t\t\t\t\t\treturn {ext: '3g2', mime: 'video/3gpp2'};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {ext: '3gp', mime: 'video/3gpp'};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {ext: 'mp4', mime: 'video/mp4'};\n\t\t\t}\n\t\t}\n\n\t\t// -- 10-byte signatures --\n\n\t\tif (this.checkString('REGEDIT4\\r\\n')) {\n\t\t\treturn {\n\t\t\t\text: 'reg',\n\t\t\t\tmime: 'application/x-ms-regedit',\n\t\t\t};\n\t\t}\n\n\t\t// -- 12-byte signatures --\n\n\t\t// RIFF file format which might be AVI, WAV, QCP, etc\n\t\tif (this.check([0x52, 0x49, 0x46, 0x46])) {\n\t\t\tif (this.checkString('WEBP', {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'webp',\n\t\t\t\t\tmime: 'image/webp',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.check([0x41, 0x56, 0x49], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'avi',\n\t\t\t\t\tmime: 'video/vnd.avi',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.check([0x57, 0x41, 0x56, 0x45], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'wav',\n\t\t\t\t\tmime: 'audio/wav',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// QLCM, QCP file\n\t\t\tif (this.check([0x51, 0x4C, 0x43, 0x4D], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'qcp',\n\t\t\t\t\tmime: 'audio/qcelp',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.check([0x49, 0x49, 0x55, 0x00, 0x18, 0x00, 0x00, 0x00, 0x88, 0xE7, 0x74, 0xD8])) {\n\t\t\treturn {\n\t\t\t\text: 'rw2',\n\t\t\t\tmime: 'image/x-panasonic-rw2',\n\t\t\t};\n\t\t}\n\n\t\t// ASF_Header_Object first 80 bytes\n\t\tif (this.check([0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9])) {\n\t\t\tasync function readHeader() {\n\t\t\t\tconst guid = new Uint8Array(16);\n\t\t\t\tawait tokenizer.readBuffer(guid);\n\t\t\t\treturn {\n\t\t\t\t\tid: guid,\n\t\t\t\t\tsize: Number(await tokenizer.readToken(Token.UINT64_LE)),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tawait tokenizer.ignore(30);\n\t\t\t// Search for header should be in first 1KB of file.\n\t\t\twhile (tokenizer.position + 24 < tokenizer.fileInfo.size) {\n\t\t\t\tconst header = await readHeader();\n\t\t\t\tlet payload = header.size - 24;\n\t\t\t\tif (_check(header.id, [0x91, 0x07, 0xDC, 0xB7, 0xB7, 0xA9, 0xCF, 0x11, 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65])) {\n\t\t\t\t\t// Sync on Stream-Properties-Object (B7DC0791-A9B7-11CF-8EE6-00C00C205365)\n\t\t\t\t\tconst typeId = new Uint8Array(16);\n\t\t\t\t\tpayload -= await tokenizer.readBuffer(typeId);\n\n\t\t\t\t\tif (_check(typeId, [0x40, 0x9E, 0x69, 0xF8, 0x4D, 0x5B, 0xCF, 0x11, 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B])) {\n\t\t\t\t\t\t// Found audio:\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asf',\n\t\t\t\t\t\t\tmime: 'audio/x-ms-asf',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (_check(typeId, [0xC0, 0xEF, 0x19, 0xBC, 0x4D, 0x5B, 0xCF, 0x11, 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B])) {\n\t\t\t\t\t\t// Found video:\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asf',\n\t\t\t\t\t\t\tmime: 'video/x-ms-asf',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tawait tokenizer.ignore(payload);\n\t\t\t}\n\n\t\t\t// Default to ASF generic extension\n\t\t\treturn {\n\t\t\t\text: 'asf',\n\t\t\t\tmime: 'application/vnd.ms-asf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A])) {\n\t\t\treturn {\n\t\t\t\text: 'ktx',\n\t\t\t\tmime: 'image/ktx',\n\t\t\t};\n\t\t}\n\n\t\tif ((this.check([0x7E, 0x10, 0x04]) || this.check([0x7E, 0x18, 0x04])) && this.check([0x30, 0x4D, 0x49, 0x45], {offset: 4})) {\n\t\t\treturn {\n\t\t\t\text: 'mie',\n\t\t\t\tmime: 'application/x-mie',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x27, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], {offset: 2})) {\n\t\t\treturn {\n\t\t\t\text: 'shp',\n\t\t\t\tmime: 'application/x-esri-shape',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFF, 0x4F, 0xFF, 0x51])) {\n\t\t\treturn {\n\t\t\t\text: 'j2c',\n\t\t\t\tmime: 'image/j2c',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A])) {\n\t\t\t// JPEG-2000 family\n\n\t\t\tawait tokenizer.ignore(20);\n\t\t\tconst type = await tokenizer.readToken(new Token.StringType(4, 'ascii'));\n\t\t\tswitch (type) {\n\t\t\t\tcase 'jp2 ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jp2',\n\t\t\t\t\t\tmime: 'image/jp2',\n\t\t\t\t\t};\n\t\t\t\tcase 'jpx ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jpx',\n\t\t\t\t\t\tmime: 'image/jpx',\n\t\t\t\t\t};\n\t\t\t\tcase 'jpm ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jpm',\n\t\t\t\t\t\tmime: 'image/jpm',\n\t\t\t\t\t};\n\t\t\t\tcase 'mjp2':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'mj2',\n\t\t\t\t\t\tmime: 'image/mj2',\n\t\t\t\t\t};\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0xFF, 0x0A])\n\t\t\t|| this.check([0x00, 0x00, 0x00, 0x0C, 0x4A, 0x58, 0x4C, 0x20, 0x0D, 0x0A, 0x87, 0x0A])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'jxl',\n\t\t\t\tmime: 'image/jxl',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFE, 0xFF])) { // UTF-16-BOM-BE\n\t\t\tif (this.checkString('<?xml ', {offset: 2, encoding: 'utf-16be'})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'xml',\n\t\t\t\t\tmime: 'application/xml',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn undefined; // Some unknown text based format\n\t\t}\n\n\t\tif (this.check([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) {\n\t\t\t// Detected Microsoft Compound File Binary File (MS-CFB) Format.\n\t\t\treturn {\n\t\t\t\text: 'cfb',\n\t\t\t\tmime: 'application/x-cfb',\n\t\t\t};\n\t\t}\n\n\t\t// Increase sample size from 32 to 256.\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\tif (this.check([0x61, 0x63, 0x73, 0x70], {offset: 36})) {\n\t\t\treturn {\n\t\t\t\text: 'icc',\n\t\t\t\tmime: 'application/vnd.iccprofile',\n\t\t\t};\n\t\t}\n\n\t\t// ACE: requires 14 bytes in the buffer\n\t\tif (this.checkString('**ACE', {offset: 7}) && this.checkString('**', {offset: 12})) {\n\t\t\treturn {\n\t\t\t\text: 'ace',\n\t\t\t\tmime: 'application/x-ace-compressed',\n\t\t\t};\n\t\t}\n\n\t\t// -- 15-byte signatures --\n\n\t\tif (this.checkString('BEGIN:')) {\n\t\t\tif (this.checkString('VCARD', {offset: 6})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'vcf',\n\t\t\t\t\tmime: 'text/vcard',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.checkString('VCALENDAR', {offset: 6})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ics',\n\t\t\t\t\tmime: 'text/calendar',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// `raf` is here just to keep all the raw image detectors together.\n\t\tif (this.checkString('FUJIFILMCCD-RAW')) {\n\t\t\treturn {\n\t\t\t\text: 'raf',\n\t\t\t\tmime: 'image/x-fujifilm-raf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Extended Module:')) {\n\t\t\treturn {\n\t\t\t\text: 'xm',\n\t\t\t\tmime: 'audio/x-xm',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Creative Voice File')) {\n\t\t\treturn {\n\t\t\t\text: 'voc',\n\t\t\t\tmime: 'audio/x-voc',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x04, 0x00, 0x00, 0x00]) && this.buffer.length >= 16) { // Rough & quick check Pickle/ASAR\n\t\t\tconst jsonSize = new DataView(this.buffer.buffer).getUint32(12, true);\n\n\t\t\tif (jsonSize > 12 && this.buffer.length >= jsonSize + 16) {\n\t\t\t\ttry {\n\t\t\t\t\tconst header = new TextDecoder().decode(this.buffer.subarray(16, jsonSize + 16));\n\t\t\t\t\tconst json = JSON.parse(header);\n\t\t\t\t\t// Check if Pickle is ASAR\n\t\t\t\t\tif (json.files) { // Final check, assuring Pickle/ASAR format\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asar',\n\t\t\t\t\t\t\tmime: 'application/x-asar',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t}\n\n\t\tif (this.check([0x06, 0x0E, 0x2B, 0x34, 0x02, 0x05, 0x01, 0x01, 0x0D, 0x01, 0x02, 0x01, 0x01, 0x02])) {\n\t\t\treturn {\n\t\t\t\text: 'mxf',\n\t\t\t\tmime: 'application/mxf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('SCRM', {offset: 44})) {\n\t\t\treturn {\n\t\t\t\text: 's3m',\n\t\t\t\tmime: 'audio/x-s3m',\n\t\t\t};\n\t\t}\n\n\t\t// Raw MPEG-2 transport stream (188-byte packets)\n\t\tif (this.check([0x47]) && this.check([0x47], {offset: 188})) {\n\t\t\treturn {\n\t\t\t\text: 'mts',\n\t\t\t\tmime: 'video/mp2t',\n\t\t\t};\n\t\t}\n\n\t\t// Blu-ray Disc Audio-Video (BDAV) MPEG-2 transport stream has 4-byte TP_extra_header before each 188-byte packet\n\t\tif (this.check([0x47], {offset: 4}) && this.check([0x47], {offset: 196})) {\n\t\t\treturn {\n\t\t\t\text: 'mts',\n\t\t\t\tmime: 'video/mp2t',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x4F, 0x4F, 0x4B, 0x4D, 0x4F, 0x42, 0x49], {offset: 60})) {\n\t\t\treturn {\n\t\t\t\text: 'mobi',\n\t\t\t\tmime: 'application/x-mobipocket-ebook',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x44, 0x49, 0x43, 0x4D], {offset: 128})) {\n\t\t\treturn {\n\t\t\t\text: 'dcm',\n\t\t\t\tmime: 'application/dicom',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4C, 0x00, 0x00, 0x00, 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'lnk',\n\t\t\t\tmime: 'application/x.ms.shortcut', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x62, 0x6F, 0x6F, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x72, 0x6B, 0x00, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'alias',\n\t\t\t\tmime: 'application/x.apple.alias', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Kaydara FBX Binary \\u0000')) {\n\t\t\treturn {\n\t\t\t\text: 'fbx',\n\t\t\t\tmime: 'application/x.autodesk.fbx', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x4C, 0x50], {offset: 34})\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x00, 0x01], {offset: 8})\n\t\t\t\t|| this.check([0x01, 0x00, 0x02], {offset: 8})\n\t\t\t\t|| this.check([0x02, 0x00, 0x02], {offset: 8})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'eot',\n\t\t\t\tmime: 'application/vnd.ms-fontobject',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x06, 0x06, 0xED, 0xF5, 0xD8, 0x1D, 0x46, 0xE5, 0xBD, 0x31, 0xEF, 0xE7, 0xFE, 0x74, 0xB7, 0x1D])) {\n\t\t\treturn {\n\t\t\t\text: 'indd',\n\t\t\t\tmime: 'application/x-indesign',\n\t\t\t};\n\t\t}\n\n\t\t// -- 16-byte signatures --\n\n\t\t// JMP files - check for both Little Endian and Big Endian signatures\n\t\tif (this.check([0xFF, 0xFF, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00])\n\t\t\t|| this.check([0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'jmp',\n\t\t\t\tmime: 'application/x-jmp-data',\n\t\t\t};\n\t\t}\n\n\t\t// Increase sample size from 256 to 512\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\t// Requires a buffer size of 512 bytes\n\t\tif ((this.checkString('ustar', {offset: 257}) && (this.checkString('\\0', {offset: 262}) || this.checkString(' ', {offset: 262})))\n\t\t\t|| (this.check([0, 0, 0, 0, 0, 0], {offset: 257}) && tarHeaderChecksumMatches(this.buffer))) {\n\t\t\treturn {\n\t\t\t\text: 'tar',\n\t\t\t\tmime: 'application/x-tar',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFF, 0xFE])) { // UTF-16-BOM-LE\n\t\t\tconst encoding = 'utf-16le';\n\t\t\tif (this.checkString('<?xml ', {offset: 2, encoding})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'xml',\n\t\t\t\t\tmime: 'application/xml',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.check([0xFF, 0x0E], {offset: 2}) && this.checkString('SketchUp Model', {offset: 4, encoding})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'skp',\n\t\t\t\t\tmime: 'application/vnd.sketchup.skp',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.checkString('Windows Registry Editor Version 5.00\\r\\n', {offset: 2, encoding})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'reg',\n\t\t\t\t\tmime: 'application/x-ms-regedit',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn undefined; // Some text based format\n\t\t}\n\n\t\tif (this.checkString('-----BEGIN PGP MESSAGE-----')) {\n\t\t\treturn {\n\t\t\t\text: 'pgp',\n\t\t\t\tmime: 'application/pgp-encrypted',\n\t\t\t};\n\t\t}\n\t};\n\t// Detections with limited supporting data, resulting in a higher likelihood of false positives\n\tdetectImprecise = async tokenizer => {\n\t\tthis.buffer = new Uint8Array(reasonableDetectionSizeInBytes);\n\n\t\t// Read initial sample size of 8 bytes\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(8, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\tif (\n\t\t\tthis.check([0x0, 0x0, 0x1, 0xBA])\n\t\t\t|| this.check([0x0, 0x0, 0x1, 0xB3])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'mpg',\n\t\t\t\tmime: 'video/mpeg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x01, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'ttf',\n\t\t\t\tmime: 'font/ttf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x01, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'ico',\n\t\t\t\tmime: 'image/x-icon',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x02, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'cur',\n\t\t\t\tmime: 'image/x-icon',\n\t\t\t};\n\t\t}\n\n\t\t// Adjust buffer to `mpegOffsetTolerance`\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(2 + this.options.mpegOffsetTolerance, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\t// Check MPEG 1 or 2 Layer 3 header, or 'layer 0' for ADTS (MPEG sync-word 0xFFE)\n\t\tif (this.buffer.length >= (2 + this.options.mpegOffsetTolerance)) {\n\t\t\tfor (let depth = 0; depth <= this.options.mpegOffsetTolerance; ++depth) {\n\t\t\t\tconst type = this.scanMpeg(depth);\n\t\t\t\tif (type) {\n\t\t\t\t\treturn type;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tasync readTiffTag(bigEndian) {\n\t\tconst tagId = await this.tokenizer.readToken(bigEndian ? Token.UINT16_BE : Token.UINT16_LE);\n\t\tthis.tokenizer.ignore(10);\n\t\tswitch (tagId) {\n\t\t\tcase 50_341:\n\t\t\t\treturn {\n\t\t\t\t\text: 'arw',\n\t\t\t\t\tmime: 'image/x-sony-arw',\n\t\t\t\t};\n\t\t\tcase 50_706:\n\t\t\t\treturn {\n\t\t\t\t\text: 'dng',\n\t\t\t\t\tmime: 'image/x-adobe-dng',\n\t\t\t\t};\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tasync readTiffIFD(bigEndian) {\n\t\tconst numberOfTags = await this.tokenizer.readToken(bigEndian ? Token.UINT16_BE : Token.UINT16_LE);\n\t\tfor (let n = 0; n < numberOfTags; ++n) {\n\t\t\tconst fileType = await this.readTiffTag(bigEndian);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync readTiffHeader(bigEndian) {\n\t\tconst version = (bigEndian ? Token.UINT16_BE : Token.UINT16_LE).get(this.buffer, 2);\n\t\tconst ifdOffset = (bigEndian ? Token.UINT32_BE : Token.UINT32_LE).get(this.buffer, 4);\n\n\t\tif (version === 42) {\n\t\t\t// TIFF file header\n\t\t\tif (ifdOffset >= 6) {\n\t\t\t\tif (this.checkString('CR', {offset: 8})) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'cr2',\n\t\t\t\t\t\tmime: 'image/x-canon-cr2',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (ifdOffset >= 8) {\n\t\t\t\t\tconst someId1 = (bigEndian ? Token.UINT16_BE : Token.UINT16_LE).get(this.buffer, 8);\n\t\t\t\t\tconst someId2 = (bigEndian ? Token.UINT16_BE : Token.UINT16_LE).get(this.buffer, 10);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t(someId1 === 0x1C && someId2 === 0xFE)\n\t\t\t\t\t\t|| (someId1 === 0x1F && someId2 === 0x0B)) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'nef',\n\t\t\t\t\t\t\tmime: 'image/x-nikon-nef',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait this.tokenizer.ignore(ifdOffset);\n\t\t\tconst fileType = await this.readTiffIFD(bigEndian);\n\t\t\treturn fileType ?? {\n\t\t\t\text: 'tif',\n\t\t\t\tmime: 'image/tiff',\n\t\t\t};\n\t\t}\n\n\t\tif (version === 43) {\t// Big TIFF file header\n\t\t\treturn {\n\t\t\t\text: 'tif',\n\t\t\t\tmime: 'image/tiff',\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\tScan check MPEG 1 or 2 Layer 3 header, or 'layer 0' for ADTS (MPEG sync-word 0xFFE).\n\n\t@param offset - Offset to scan for sync-preamble.\n\t@returns {{ext: string, mime: string}}\n\t*/\n\tscanMpeg(offset) {\n\t\tif (this.check([0xFF, 0xE0], {offset, mask: [0xFF, 0xE0]})) {\n\t\t\tif (this.check([0x10], {offset: offset + 1, mask: [0x16]})) {\n\t\t\t\t// Check for (ADTS) MPEG-2\n\t\t\t\tif (this.check([0x08], {offset: offset + 1, mask: [0x08]})) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'aac',\n\t\t\t\t\t\tmime: 'audio/aac',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Must be (ADTS) MPEG-4\n\t\t\t\treturn {\n\t\t\t\t\text: 'aac',\n\t\t\t\t\tmime: 'audio/aac',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// MPEG 1 or 2 Layer 3 header\n\t\t\t// Check for MPEG layer 3\n\t\t\tif (this.check([0x02], {offset: offset + 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp3',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Check for MPEG layer 2\n\t\t\tif (this.check([0x04], {offset: offset + 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp2',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Check for MPEG layer 1\n\t\t\tif (this.check([0x06], {offset: offset + 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp1',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport const supportedExtensions = new Set(extensions);\nexport const supportedMimeTypes = new Set(mimeTypes);\n","import { AutorenderApiClient } from '../client/api-client';\nimport { DEFAULT_ASSET_DELIVERY_BASE_URL } from '../constants/defaults';\nimport type {\n CreateUploaderOptions,\n UploadItem,\n UploadedFileResponse,\n ThemeOptions,\n UploadSourceOption,\n AppRunnerResponse,\n UploadSuccessFile,\n} from '../types';\nimport {\n applyCssVariables,\n buildAssetDeliveryUrl,\n calculateBatchProgress,\n extractPathFromUrl,\n extractWorkspaceFromUrl,\n generateId,\n getRelativeFolderPath,\n sanitizeBaseUrl,\n toCssVars,\n} from '../utils/helpers';\nimport { fileTypeFromBlob } from 'file-type/core';\n\nconst DEFAULT_PARALLEL_UPLOADS = 4;\nconst MAX_FILE_SIZE_BYTES = 100 * 1024 * 1024; // 100MB\n\ninterface FileSelection {\n file: File;\n relativePath?: string;\n}\n\nexport interface ControllerOptions\n extends Omit<CreateUploaderOptions, 'target' | 'theme' | 'sources'> {\n theme?: ThemeOptions;\n sources?: UploadSourceOption[];\n}\n\nexport interface ControllerState {\n items: UploadItem[];\n isUploading: boolean;\n progress: number;\n duplicates: string[];\n}\n\ntype ControllerEvents =\n | 'statechange'\n | 'progress'\n | 'fileprogress'\n | 'error'\n | 'complete'\n | 'filesadded';\n\nexport class UploaderController extends EventTarget {\n private options: ControllerOptions;\n private readonly client: AutorenderApiClient;\n private items: UploadItem[] = [];\n private abortController: AbortController | null = null;\n private isUploading = false;\n private targetElement: HTMLElement;\n private duplicateConflicts = new Set<string>();\n\n private isAbortError(error: unknown): boolean {\n if (!error) return false;\n if (error instanceof DOMException && error.name === 'AbortError') return true;\n if (error instanceof Error && error.name === 'AbortError') return true;\n const message =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : '';\n return typeof message === 'string' && message.toLowerCase().includes('abort');\n }\n\n constructor(\n client: AutorenderApiClient,\n target: HTMLElement,\n options: ControllerOptions\n ) {\n super();\n this.client = client;\n this.targetElement = target;\n this.options = options;\n this.applyTheme();\n }\n\n setOptions(options: Partial<ControllerOptions>) {\n this.options = {\n ...this.options,\n ...options,\n };\n this.applyTheme();\n this.dispatch('statechange');\n }\n\n getOptions(): ControllerOptions {\n return this.options;\n }\n\n getState(): ControllerState {\n return {\n items: this.items,\n isUploading: this.isUploading,\n progress: calculateBatchProgress(this.items),\n duplicates: Array.from(this.duplicateConflicts),\n };\n }\n\n async addFiles(files: FileSelection[]) {\n const existingKeys = new Map<string, UploadItem>();\n const basePathKey = this.normalizePath(this.options.folderPath) ?? '';\n const buildKey = (file: File, folderPath?: string, relativePath?: string) =>\n `${basePathKey}::${folderPath ?? ''}::${relativePath ?? ''}::${file.name}::${file.size}`;\n\n this.items.forEach(item => {\n existingKeys.set(buildKey(item.file, item.folderPath, item.relativePath), item);\n });\n\n // Detect mimeType for files that don't have it\n const filesWithMimeType = await Promise.all(\n files.map(async ({ file, relativePath }) => {\n let mimeType = file.type;\n \n // If file doesn't have mimeType, detect it using file-type\n if (!mimeType || mimeType === 'application/octet-stream' || mimeType === '') {\n try {\n const detected = await fileTypeFromBlob(file);\n if (detected?.mime) {\n mimeType = detected.mime;\n // Update the File object's type property if possible\n Object.defineProperty(file, 'type', {\n value: mimeType,\n writable: false,\n configurable: true,\n });\n } else {\n // Fallback to application/octet-stream if detection fails\n mimeType = 'application/octet-stream';\n }\n } catch (error) {\n // If detection fails, use fallback\n mimeType = 'application/octet-stream';\n }\n }\n\n return { file, relativePath, mimeType };\n })\n );\n\n const newItems = filesWithMimeType.map(({ file, relativePath, mimeType }) => {\n const folderPath = getRelativeFolderPath(\n this.options.folderPath,\n relativePath\n ) ?? '';\n\n // Only create preview URL for images\n const previewUrl = mimeType.startsWith('image/')\n ? URL.createObjectURL(file)\n : undefined;\n\n // Check file size limit (100MB)\n const fileSizeMB = (file.size / (1024 * 1024)).toFixed(2);\n const info = file.size > MAX_FILE_SIZE_BYTES\n ? `File size (${fileSizeMB}MB) exceeds the maximum limit of 100MB`\n : undefined;\n\n const baseItem: UploadItem = {\n id: generateId(),\n file,\n relativePath,\n folderPath,\n status: 'pending' as const,\n progress: 0,\n previewUrl,\n info,\n };\n\n const key = buildKey(file, folderPath, relativePath);\n if (existingKeys.has(key)) {\n baseItem.status = 'completed';\n baseItem.progress = 100;\n baseItem.error = undefined;\n existingKeys.set(key, baseItem);\n return baseItem;\n }\n\n existingKeys.set(key, baseItem);\n return baseItem;\n });\n\n this.items = [...this.items, ...newItems];\n this.dispatch('filesadded', { items: newItems });\n\n const duplicates = newItems.filter(item => item.status === 'completed');\n if (duplicates.length) {\n this.markDuplicatesCompleted(duplicates);\n }\n\n this.dispatch('statechange');\n }\n\n removeFile(id: string) {\n const item = this.items.find(entry => entry.id === id);\n if (item?.previewUrl) {\n URL.revokeObjectURL(item.previewUrl);\n }\n this.items = this.items.filter(item => item.id !== id);\n if (item) {\n this.duplicateConflicts.delete(item.file.name);\n }\n this.dispatch('statechange');\n }\n\n reset() {\n this.abortController?.abort();\n this.abortController = null;\n this.isUploading = false;\n this.cleanupPreviews();\n this.items = [];\n this.duplicateConflicts.clear();\n this.dispatch('statechange');\n }\n\n async uploadAll() {\n if (this.isUploading) return;\n if (this.items.length === 0) return;\n\n this.duplicateConflicts.clear();\n this.isUploading = true;\n this.abortController = new AbortController();\n this.dispatch('statechange');\n\n try {\n await this.processUploads();\n const files = this.buildSuccessFiles();\n this.dispatch('complete', {\n items: this.items,\n files,\n });\n } catch (error) {\n if (this.isAbortError(error)) {\n this.dispatch('error', error);\n return;\n }\n this.annotateItemsWithError(error);\n this.dispatch('error', error);\n throw error;\n } finally {\n this.isUploading = false;\n this.abortController = null;\n this.dispatch('statechange');\n }\n }\n\n cancel() {\n this.abortController?.abort();\n this.abortController = null;\n }\n\n private isDuplicateError(error: unknown) {\n if (!error) return false;\n if (typeof error === 'object' && error !== null) {\n const status = (error as any).status ?? (error as any).statusCode;\n if (status === 409) {\n return true;\n }\n const code = (error as any).code;\n if (typeof code === 'string' && code.toLowerCase() === 'conflict') {\n return true;\n }\n }\n const message =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : '';\n const normalized = message.toLowerCase();\n return (\n normalized.includes('duplicate') ||\n normalized.includes('already exists') ||\n normalized.includes('status 409') ||\n normalized.includes('conflict 409') ||\n normalized.includes('409')\n );\n }\n\n private markDuplicatesCompleted(\n items: UploadItem[],\n duplicateNames?: string[],\n options: { annotateError?: boolean } = {}\n ): UploadItem[] {\n const normalizedNames =\n duplicateNames\n ?.map(name => name.trim().toLowerCase())\n .filter(Boolean) ?? [];\n const targetSet =\n normalizedNames.length > 0 ? new Set(normalizedNames) : null;\n\n const targetItems =\n targetSet !== null\n ? items.filter(item =>\n targetSet.has(item.file.name.trim().toLowerCase())\n )\n : items;\n\n const duplicates =\n targetSet !== null && targetItems.length === 0 ? items : targetItems;\n\n const { annotateError = true } = options;\n\n duplicates.forEach(item => {\n if (!item) return;\n\n const name = item.file.name;\n if (!this.duplicateConflicts.has(name)) {\n this.duplicateConflicts.add(name);\n }\n\n item.status = 'completed';\n item.progress = 100;\n item.error = annotateError ? 'duplicate' : undefined;\n this.dispatch('fileprogress', { item });\n });\n\n if (duplicates.length > 0) {\n this.dispatch('progress', {\n progress: calculateBatchProgress(this.items),\n items: this.items,\n });\n\n this.dispatch('statechange');\n }\n\n return duplicates;\n }\n\n private isAuthError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n const message =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : '';\n return (\n typeof message === 'string' &&\n message.toLowerCase().includes('unauthorized')\n );\n }\n\n const status = (error as any).status;\n if (typeof status === 'number' && (status === 401 || status === 403)) {\n return true;\n }\n\n const message =\n error instanceof Error\n ? error.message\n : typeof (error as any)?.message === 'string'\n ? (error as any).message\n : '';\n const normalized = String(message).toLowerCase();\n return (\n normalized.includes('unauthorized') ||\n normalized.includes('forbidden') ||\n normalized.includes('invalid api key')\n );\n }\n\n private annotateItemsWithError(error: unknown) {\n const isAuth = this.isAuthError(error);\n const fallbackMessage =\n error instanceof Error\n ? error.message\n : typeof (error as any)?.message === 'string'\n ? (error as any).message\n : 'Upload failed';\n\n let mutated = false;\n\n this.items.forEach(item => {\n if (item.status === 'completed') return;\n mutated = true;\n item.status = 'error';\n item.progress = item.progress ?? 0;\n item.error = isAuth ? 'invalid-api-key' : fallbackMessage;\n this.dispatch('fileprogress', { item });\n });\n\n if (mutated) {\n this.dispatch('progress', {\n progress: calculateBatchProgress(this.items),\n items: this.items,\n });\n this.dispatch('statechange');\n }\n }\n\n private async processUploads() {\n const allItems = this.items.filter(item => item.status !== 'completed');\n\n if (allItems.length === 0) {\n return;\n }\n\n const parallel = Math.max(1, this.options.parallelUploads ?? DEFAULT_PARALLEL_UPLOADS);\n const uploadSettings = this.options.uploadSettings;\n\n // Process all items in parallel with concurrency limit\n const tasks = allItems.map(item => async () => {\n if (this.abortController?.signal.aborted) {\n throw new Error('Upload cancelled');\n }\n\n try {\n await this.uploadSingleFile(item, uploadSettings);\n } catch (error) {\n if (this.isAbortError(error)) {\n return; // Don't mark as error for aborted uploads\n }\n if (this.isDuplicateError(error)) {\n this.markDuplicatesCompleted([item], [item.file.name], {\n annotateError: true,\n });\n } else {\n const err = error instanceof Error ? error : new Error(String(error));\n item.status = 'error';\n item.error = err.message;\n this.dispatch('fileprogress', { item });\n this.dispatch('statechange');\n }\n }\n });\n\n await this.runWithConcurrency(tasks, parallel);\n }\n\n private async uploadSingleFile(\n item: UploadItem,\n uploadSettings?: CreateUploaderOptions['uploadSettings']\n ) {\n // Check file size limit before uploading\n if (item.file.size > MAX_FILE_SIZE_BYTES) {\n // Don't upload, but keep status as pending and show info message\n const fileSizeMB = (item.file.size / (1024 * 1024)).toFixed(2);\n item.info = `File size (${fileSizeMB}MB) exceeds the maximum limit of 100MB`;\n this.dispatch('fileprogress', { item });\n this.dispatch('statechange');\n return; // Skip upload for files that are too large\n }\n\n item.status = 'uploading';\n item.progress = 0;\n this.dispatch('statechange');\n\n const folderPath = item.folderPath\n ? this.combinePaths(this.options.folderPath, item.folderPath)\n : this.normalizePath(this.options.folderPath);\n\n const appRunnerResponse: AppRunnerResponse = await this.client.uploadFile(\n {\n file: item.file,\n folderPath: folderPath ?? undefined,\n relativePath: item.relativePath,\n settings: uploadSettings\n ? {\n pretransformations: uploadSettings.pretransformations,\n tags: uploadSettings.tags,\n is_unique_suffix_name: uploadSettings.is_unique_suffix_name ?? false,\n custom_id: uploadSettings.custom_id,\n }\n : undefined,\n },\n progress => {\n item.progress = progress;\n this.dispatch('fileprogress', { item });\n this.dispatch('progress', {\n progress: calculateBatchProgress(this.items),\n items: this.items,\n });\n },\n this.abortController?.signal\n );\n\n if (!appRunnerResponse.success) {\n const error = new Error(appRunnerResponse.message ?? 'Upload failed');\n (error as any).code = appRunnerResponse.errorCode;\n throw error;\n }\n\n item.status = 'completed';\n item.progress = 100;\n item.response = {\n file_no: appRunnerResponse.file_no,\n name: appRunnerResponse.name,\n url: appRunnerResponse.url,\n file_size: appRunnerResponse.file_size,\n folder_no: undefined,\n path: appRunnerResponse.path,\n width: appRunnerResponse.width,\n height: appRunnerResponse.height,\n format: appRunnerResponse.format,\n workspace_no: appRunnerResponse.workspace_no,\n };\n item.uploadedAt = new Date(appRunnerResponse.created_at);\n\n if (appRunnerResponse.isDuplicate) {\n item.error = 'duplicate';\n }\n\n this.dispatch('fileprogress', { item });\n this.dispatch('progress', {\n progress: calculateBatchProgress(this.items),\n items: this.items,\n });\n this.dispatch('statechange');\n }\n\n\n\n private applyTheme() {\n if (!this.options.theme) return;\n const vars = toCssVars(this.options.theme);\n applyCssVariables(this.targetElement, vars);\n if (this.options.theme.appearance && this.options.theme.appearance !== 'system') {\n this.targetElement.dataset.theme = this.options.theme.appearance;\n } else {\n delete this.targetElement.dataset.theme;\n }\n }\n\n private dispatch(event: ControllerEvents, detail?: CustomEventInit['detail']) {\n const customEvent = new CustomEvent(event, { detail });\n this.dispatchEvent(customEvent);\n\n switch (event) {\n case 'progress':\n this.options.onProgress?.(\n (detail as any)?.progress ?? calculateBatchProgress(this.items),\n this.items\n );\n break;\n case 'fileprogress':\n this.options.onFileProgress?.((detail as any).item);\n break;\n case 'error':\n this.options.onError?.(\n detail instanceof Error ? detail : new Error(String(detail))\n );\n break;\n case 'complete':\n this.options.onSuccess?.((detail as any)?.files ?? []);\n break;\n default:\n break;\n }\n }\n\n private resolveAssetDeliveryBaseUrl() {\n return (\n sanitizeBaseUrl(this.options.assetDeliveryBaseUrl) ??\n DEFAULT_ASSET_DELIVERY_BASE_URL\n );\n }\n\n private buildSuccessFiles(): UploadSuccessFile[] {\n const baseUrl = this.resolveAssetDeliveryBaseUrl();\n\n return this.items\n .filter(item => item.status === 'completed' && item.response)\n .map(item => {\n const response = item.response as UploadedFileResponse;\n const workspace =\n response.workspace_no ?? extractWorkspaceFromUrl(response.url);\n const assetPath = response.path ?? extractPathFromUrl(response.url);\n const resolvedUrl =\n buildAssetDeliveryUrl(baseUrl, workspace, assetPath, response.url) ??\n response.url;\n\n return {\n id: item.id,\n previewUrl: item.previewUrl,\n file_no: response.file_no,\n name: response.name,\n url: resolvedUrl,\n input_file_size: item.file?.size ?? response.file_size ?? 0,\n output_file_size: response.file_size ?? 0,\n path: response.path ?? assetPath,\n width: response.width,\n height: response.height,\n format: response.format,\n workspace_no: workspace,\n uploadedAt: item.uploadedAt?.toISOString(),\n };\n });\n }\n\n private async runWithConcurrency(tasks: Array<() => Promise<void>>, limit: number) {\n const executing = new Set<Promise<void>>();\n\n for (const task of tasks) {\n if (this.abortController?.signal.aborted) {\n throw new Error('Upload cancelled');\n }\n\n const promise = task().finally(() => {\n executing.delete(promise);\n });\n executing.add(promise);\n\n if (executing.size >= limit) {\n await Promise.race(executing);\n }\n }\n\n await Promise.all(executing);\n }\n\n private cleanupPreviews() {\n this.items.forEach(item => {\n if (item.previewUrl) {\n URL.revokeObjectURL(item.previewUrl);\n item.previewUrl = undefined;\n }\n });\n }\n\n private normalizePath(path?: string): string | undefined {\n if (!path) {\n return undefined;\n }\n\n const normalized = path\n .split('/')\n .map(segment => segment.trim())\n .filter(Boolean)\n .join('/');\n\n return normalized.length > 0 ? normalized : undefined;\n }\n\n private combinePaths(basePath?: string, relativePath?: string): string | undefined {\n const base = this.normalizePath(basePath);\n const relative = this.normalizePath(relativePath);\n\n if (base && relative) {\n return `${base}/${relative}`;\n }\n\n return base || relative || undefined;\n }\n\n}\n\n","export const widgetStyles = /* css */ `\n:host {\n --ar-font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --ar-color-bg: hsl(0 0% 100%);\n --ar-color-bg-muted: hsl(210 40% 96%);\n --ar-color-border: hsl(214 32% 91%);\n --ar-color-text: hsl(222 47% 11%);\n --ar-color-muted-foreground: hsl(215 16% 47%);\n /* let palette or theme set accent */\n --ar-color-accent: unset;\n --ar-color-accent-hover: unset;\n --ar-color-accent-button: unset;\n --ar-radius: 8px;\n display: block;\n}\n\n/* Palette: Blue (default) */\n:host([data-palette='at-blue']),\n:host:not([data-palette]) {\n --ar-color-accent: #e0f2fe;\n --ar-color-accent-hover: #f0f9ff;\n --ar-color-accent-button: #0c55f9;\n}\n\n/* Palette: Purple */\n:host([data-palette='at-purple']) {\n --ar-color-accent: #f3e8ff;\n --ar-color-accent-hover: #faf5ff;\n --ar-color-accent-button: #8a3ffc;\n}\n\n/* Palette: Red */\n:host([data-palette='at-red']) {\n --ar-color-accent: #fee2e2;\n --ar-color-accent-hover: #fef2f2;\n --ar-color-accent-button: #da1e28;\n}\n\n/* Palette: Orange */\n:host([data-palette='at-orange']) {\n --ar-color-accent: #ffedd5;\n --ar-color-accent-hover: #fff7ed;\n --ar-color-accent-button: #ff832b;\n}\n\n/* Palette: Green */\n:host([data-palette='at-green']) {\n --ar-color-accent: #dcfce7;\n --ar-color-accent-hover: #f0fdf4;\n --ar-color-accent-button: #24a148;\n}\n\n/* Palette: Turquoise */\n:host([data-palette='at-turquoise']) {\n --ar-color-accent: #ccfbf1;\n --ar-color-accent-hover: #f0fdfa;\n --ar-color-accent-button: #0072c3;\n}\n\n/* Palette: Gray */\n:host([data-palette='at-gray']) {\n --ar-color-accent: #f3f4f6;\n --ar-color-accent-hover: #f9fafb;\n --ar-color-accent-button: #525252;\n}\n\n:host([data-trigger='inline']) .ar-uploader-root,\n:host([data-trigger='inline']) .ar-inline-upload,\n:host([data-trigger='inline']) .ar-inline-panel {\n width: 100%;\n min-width: 0;\n}\n\n:host([data-theme='dark']) {\n --ar-color-bg: hsl(222 41% 6%);\n --ar-color-bg-muted: hsl(217 33% 17%);\n --ar-color-border: hsl(217 19% 27%);\n --ar-color-text: hsl(213 31% 91%);\n --ar-color-muted-foreground: hsl(215 20% 65%);\n --ar-color-accent: unset;\n --ar-color-accent-hover: unset;\n}\n\n/* Dark theme palette overrides */\n:host([data-theme='dark'][data-palette='at-blue']),\n:host([data-theme='dark']:not([data-palette])) {\n --ar-color-accent: rgba(120, 169, 255, 0.8);\n --ar-color-accent-hover: rgba(120, 169, 255, 0.2);\n --ar-color-accent-button: #78a9ff;\n}\n\n:host([data-theme='dark'][data-palette='at-purple']) {\n --ar-color-accent: rgba(167, 139, 250, 0.8);\n --ar-color-accent-hover: rgba(167, 139, 250, 0.2);\n --ar-color-accent-button: #a78bfa;\n}\n\n:host([data-theme='dark'][data-palette='at-red']) {\n --ar-color-accent: rgba(255, 131, 137, 0.8);\n --ar-color-accent-hover: rgba(255, 131, 137, 0.2);\n --ar-color-accent-button: #ff8389;\n}\n\n:host([data-theme='dark'][data-palette='at-orange']) {\n --ar-color-accent: rgba(255, 179, 102, 0.8);\n --ar-color-accent-hover: rgba(255, 179, 102, 0.2);\n --ar-color-accent-button: #ffb366;\n}\n\n:host([data-theme='dark'][data-palette='at-green']) {\n --ar-color-accent: rgba(111, 220, 140, 0.8);\n --ar-color-accent-hover: rgba(111, 220, 140, 0.2);\n --ar-color-accent-button: #6fdc8c;\n}\n\n:host([data-theme='dark'][data-palette='at-turquoise']) {\n --ar-color-accent: rgba(130, 207, 255, 0.8);\n --ar-color-accent-hover: rgba(130, 207, 255, 0.2);\n --ar-color-accent-button: #82cfff;\n}\n\n:host([data-theme='dark'][data-palette='at-gray']) {\n --ar-color-accent: rgba(198, 198, 198, 0.8);\n --ar-color-accent-hover: rgba(198, 198, 198, 0.2);\n --ar-color-accent-button: #c6c6c6;\n}\n\n.ar-uploader-root {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n font-family: var(--ar-font-family);\n background-color: var(--ar-color-bg);\n color: var(--ar-color-text);\n border: 1px solid var(--ar-color-border);\n border-radius: var(--ar-radius);\n padding: 0.5rem 1rem 1rem 1rem;\n}\n\n/* Reduce root gap when sources are empty in inline mode */\n:host([data-trigger='inline']) .ar-uploader-root:has(.ar-inline-upload--no-sources) {\n gap: 0.75rem;\n}\n\n\n:host([data-theme='dark']) .ar-uploader-root {\n background-color: hsl(222 41% 6%);\n}\n\n.ar-uploader-root[data-trigger='button'] {\n border: none;\n padding: 0;\n box-shadow: none;\n background: transparent;\n}\n\n.ar-header {\n display: none;\n}\n\n.ar-uploader-root.has-items .ar-header {\n display: flex;\n}\n\n.ar-title {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n}\n\n.ar-description {\n margin: 0;\n color: var(--ar-color-muted-foreground);\n font-size: 0.95rem;\n}\n\n\n.ar-subtext {\n margin: 0;\n font-size: 0.8rem;\n color: var(--ar-color-muted-foreground);\n}\n\n.ar-button-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.45rem;\n padding: 0.55rem 1.25rem;\n font-weight: 600;\n border-radius: var(--ar-radius);\n border: 1px solid rgba(15, 23, 42, 0.08);\n background: rgba(248, 250, 252, 0.9);\n color: var(--ar-color-text);\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 6px 16px rgba(15, 23, 42, 0.06);\n}\n\n:host([data-theme='dark']) .ar-button-trigger {\n border: 1px solid rgba(148, 163, 184, 0.25);\n background: rgba(30, 41, 59, 0.75);\n color: var(--ar-color-text);\n}\n\n.ar-button-trigger:hover {\n transform: translateY(-1px);\n}\n\n.ar-button-trigger:active {\n transform: translateY(0);\n}\n\n.ar-button-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.ar-button-icon svg {\n width: 1rem;\n height: 1rem;\n fill: currentColor;\n}\n\n.ar-inline-upload {\n display: flex;\n flex-direction: column;\n gap: 1.1rem;\n}\n\n/* Reduce gap when sources are empty in inline mode */\n:host([data-trigger='inline']) .ar-inline-upload--no-sources {\n gap: 0.5rem;\n}\n\n.ar-inline-panel {\n display: flex;\n flex-direction: column;\n}\n\n.ar-dropzone {\n position: relative;\n border: 1.5px dashed var(--ar-dropzone-border, var(--ar-color-border));\n border-radius: var(--ar-radius);\n background: var(--ar-dropzone-bg, var(--ar-color-bg));\n padding: 3rem 2rem;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 1rem;\n cursor: pointer;\n transition: border-color 0.2s ease, background-color 0.2s ease, transform 0.2s ease;\n margin: 0.6rem 0rem 1rem 0rem;\n}\n\n/* Reduce bottom margin when sources are empty in inline mode */\n:host([data-trigger='inline']) .ar-modal-body--no-sources .ar-dropzone {\n margin-bottom: 0.25rem;\n}\n\n.ar-dropzone:hover {\n background-color: var(--ar-color-accent-hover);\n transform: translateY(-1px);\n}\n\n.ar-dropzone:hover .ar-dropzone-icon {\n background: var(--ar-color-accent);\n}\n\n.ar-dropzone.is-dragover {\n border-color: var(--ar-color-accent);\n background-color: var(--ar-color-accent-hover);\n}\n\n.ar-dropzone.is-dragover .ar-dropzone-icon {\n background: var(--ar-color-accent-hover);\n color: var(--ar-color-accent);\n}\n\n.ar-dropzone.is-dragover .ar-description {\n color: var(--ar-color-accent);\n}\n\n.ar-dropzone.is-dragging {\n border-color: var(--ar-color-accent);\n background: var(--ar-color-accent-hover);\n color: var(--ar-color-accent);\n}\n\n.ar-dropzone.is-dragging .ar-dropzone-icon {\n background: var(--ar-color-accent-hover);\n color: var(--ar-color-accent);\n}\n\n.ar-dropzone.is-dragging .ar-description {\n color: var(--ar-color-accent);\n}\n\n.ar-dropzone-icon {\n width: 3rem;\n height: 3rem;\n border-radius: 999px;\n background: rgba(148, 163, 184, 0.12);\n color: var(--ar-color-muted-foreground);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n:host([data-theme='dark']) .ar-dropzone-icon {\n color: var(--ar-color-text);\n}\n\n.ar-dropzone svg {\n width: 1.75rem;\n height: 1.75rem;\n fill: currentColor;\n}\n\n.ar-dropzone-actions {\n display: none;\n}\n\n.ar-file-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-bottom: 1rem;\n}\n\n.ar-file-list.is-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 1rem;\n}\n\n.ar-file-item {\n border: none;\n border-radius: var(--ar-radius);\n background: rgba(148, 163, 184, 0.15);\n padding: 0.5rem;\n display: flex;\n flex-direction: column;\n gap: 0.45rem;\n position: relative;\n box-sizing: border-box;\n min-height: 50px;\n overflow: hidden;\n}\n\n.ar-file-item.is-grid {\n height: auto;\n padding: 0px;\n background: none;\n}\n\n:host([data-theme='dark']) .ar-file-item {\n background: hsl(222 41% 10%);\n}\n\n.ar-file-header {\n display: flex;\n align-items: center;\n gap: 0.6rem;\n min-width: 0;\n flex: 1;\n}\n\n.ar-file-header.is-grid {\n flex-direction: column;\n align-items: stretch;\n}\n\n.ar-file-thumb {\n width: 32px;\n height: 32px;\n border-radius: calc(var(--ar-radius) * 0.5);\n background: var(--ar-color-accent-hover);\n color: var(--ar-color-accent);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.8rem;\n font-weight: 600;\n overflow: hidden;\n position: relative;\n}\n\n.ar-file-thumb-document {\n background: rgba(148, 163, 184, 0.15);\n color: var(--ar-color-muted-foreground);\n}\n\n.ar-file-thumb-document svg {\n width: 20px;\n height: 20px;\n color: currentColor;\n}\n\n.ar-file-thumb.is-grid {\n width: 100%;\n height: 140px;\n border-radius: calc(var(--ar-radius) * 0.75);\n font-size: 1rem;\n}\n\n.ar-file-thumb.is-grid.ar-file-thumb-document svg {\n width: 48px;\n height: 48px;\n}\n\n.ar-file-item.is-completed .ar-file-thumb {\n color: #fff;\n}\n\n.ar-thumb-status {\n position: absolute;\n bottom: -2px;\n right: -2px;\n width: 18px;\n height: 18px;\n border-radius: 999px;\n background: #1e9f6d;\n color: #fff;\n border: 2px solid var(--ar-color-bg);\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 6px rgba(15, 23, 42, 0.25);\n}\n\n.ar-thumb-status svg {\n width: 10px;\n height: 10px;\n color: currentColor;\n}\n\n.ar-thumb-status.is-error {\n background: rgba(225, 29, 72, 0.85);\n}\n\n.ar-file-name {\n font-size: 0.8rem;\n margin: 0;\n color: var(--ar-color-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n min-width: 0;\n}\n\n.ar-file-meta {\n display: block;\n margin-top: 0.25rem;\n font-size: 0.8rem;\n color: var(--ar-color-muted-foreground);\n width: 100%;\n flex-shrink: 0;\n}\n\n.ar-file-info {\n display: block;\n font-size: 0.75rem;\n color: var(--ar-color-muted-foreground);\n font-style: italic;\n padding: 0.25rem 0.5rem;\n background: rgba(148, 163, 184, 0.15);\n border-radius: calc(var(--ar-radius) * 0.5);\n width: 100%;\n box-sizing: border-box;\n word-wrap: break-word;\n overflow-wrap: break-word;\n}\n\n.ar-file-item.is-grid .ar-file-info {\n font-size: 0.7rem;\n padding: 0.2rem 0.4rem;\n}\n\n.ar-file-item.is-grid .ar-file-meta {\n justify-content: center;\n}\n\n.ar-remove-button {\n margin-left: auto;\n border: none;\n background: transparent;\n color: var(--ar-color-muted-foreground);\n cursor: pointer;\n padding: 0.25rem;\n border-radius: var(--ar-radius);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s ease, color 0.2s ease;\n}\n\n.ar-remove-button.is-grid {\n position: absolute;\n top: 0.6rem;\n right: 0.6rem;\n background: rgba(255, 255, 255, 0.95);\n color: var(--ar-color-text);\n padding: 0.35rem;\n border-radius: var(--ar-radius);\n box-shadow: 0 4px 12px rgba(15, 23, 42, 0.25);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.15s ease, background 0.2s ease, color 0.2s ease;\n}\n\n.ar-file-item.is-grid:hover .ar-remove-button.is-grid {\n opacity: 1;\n pointer-events: auto;\n}\n\n:host([data-theme='dark']) .ar-remove-button.is-grid {\n background: rgba(15, 23, 42, 0.92);\n color: var(--ar-color-text);\n box-shadow: 0 4px 18px rgba(8, 47, 73, 0.45);\n}\n\n.ar-remove-button svg {\n width: 20px;\n height: 20px;\n display: block;\n}\n\n.ar-remove-button svg path,\n.ar-remove-button svg line,\n.ar-remove-button svg rect,\n.ar-remove-button svg circle,\n.ar-remove-button svg polyline {\n stroke: currentColor;\n fill: none;\n}\n\n.ar-remove-button:hover:not([disabled]) {\n color: var(--ar-color-text);\n}\n\n.ar-progress-track {\n width: 100%;\n height: 4px;\n border-radius: var(--ar-radius);\n background-color: rgba(148, 163, 184, 0.35);\n overflow: hidden;\n}\n\n.ar-file-item.is-uploading {\n border-color: var(--ar-color-accent);\n}\n\n.ar-file-item.is-error {\n border: 1px solid rgba(225, 29, 72, 0.4);\n background: rgba(248, 113, 113, 0.12);\n}\n\n.ar-progress-border {\n opacity: 0;\n height: 2px;\n width: 96%;\n border-radius: 999px;\n background: var(--ar-color-accent-hover);\n overflow: hidden;\n margin-top: 0.35rem;\n position: absolute;\n bottom: 0;\n left: 6px;\n right: 6px;\n}\n\n.ar-progress-border.is-active,\n.ar-progress-border.is-complete {\n opacity: 1;\n}\n\n.ar-progress-border.is-train {\n background: var(--ar-color-accent-hover);\n}\n\n.ar-progress-fill {\n height: 100%;\n width: 0%;\n border-radius: inherit;\n background: var(--ar-color-accent);\n transition: width 0.25s ease;\n transform-origin: left center;\n animation: none;\n}\n\n.ar-progress-fill.is-train {\n background-image: linear-gradient(\n 90deg,\n rgba(245, 250, 241, 0.93) 0%,\n rgba(240, 242, 247, 0.85) 80%,\n rgb(30, 101, 212) 100%\n );\n background-size: 220% 100%;\n animation: ar-progress-train 2.4s linear infinite;\n}\n\n.ar-progress-border.is-complete {\n background: rgba(34, 197, 94, 0.25);\n}\n\n.ar-progress-border.is-complete .ar-progress-fill {\n background-image: linear-gradient(\n 90deg,\n rgba(52, 211, 153, 0.3) 0%,\n rgba(16, 185, 129, 0.85) 50%,\n rgba(52, 211, 153, 0.3) 100%\n );\n animation: none;\n}\n\n@keyframes ar-progress-train {\n 0% {\n background-position: 240% 0;\n }\n 100% {\n background-position: -240% 0;\n }\n}\n\n.ar-file-item.is-completed {\n border-color: rgba(30, 159, 109, 0.6);\n}\n\n.ar-file-item.is-grid .ar-file-name {\n text-align: left;\n font-size: 0.78rem;\n color: var(--ar-color-muted-foreground);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ar-status {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--ar-color-muted-foreground);\n}\n\n.ar-status svg {\n width: 1rem;\n height: 1rem;\n}\n\n.ar-status.is-success {\n color: #1e9f6d;\n}\n\n.ar-status.is-error {\n color: #e11d48;\n}\n\n.ar-status.is-warning {\n color: #d97706;\n}\n\n.ar-file-error {\n font-size: 0.78rem;\n color: #e11d48;\n}\n\n.ar-error-banner {\n display: none;\n margin: 0.5rem 0;\n color: #b91c1c;\n font-size: 0.82rem;\n font-weight: 600;\n line-height: 1.4;\n}\n\n.ar-error-banner:not([hidden]) {\n display: block;\n}\n\n:host([data-theme='dark']) .ar-error-banner {\n color: #fecaca;\n}\n\n.ar-actions {\n display: flex;\n justify-content: flex-end;\n}\n\n.ar-upload-button {\n border-radius: 10px;\n padding: 0.65rem 1.5rem;\n font-weight: 600;\n border: none;\n background: var(--ar-color-accent-button, var(--ar-color-accent));\n color: white;\n cursor: pointer;\n transition: filter 0.2s ease, transform 0.2s ease;\n min-width: 140px;\n}\n\n.ar-upload-button:hover:not([disabled]) {\n filter: brightness(1.05);\n transform: translateY(-1px);\n}\n\n.ar-upload-button[disabled] {\n opacity: 0.55;\n cursor: not-allowed;\n}\n\n.ar-footer {\n font-size: 0.78rem;\n color: var(--ar-color-muted-foreground);\n text-align: right;\n}\n\n.ar-modal {\n position: fixed;\n inset: 0;\n display: none;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n\n.ar-modal.is-portal {\n position: absolute;\n}\n\n.ar-modal.is-open {\n display: flex;\n}\n\n.ar-modal-backdrop {\n position: absolute;\n inset: 0;\n background: rgba(15, 23, 42, 0.45);\n}\n\n.ar-modal-dialog {\n position: relative;\n background: var(--ar-color-bg);\n border-radius: 16px;\n border: 1px solid var(--ar-color-border);\n box-shadow: 0 32px 80px rgba(15, 23, 42, 0.25);\n width: min(343px, 92vw);\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n padding: 0.5rem 1rem 1rem 1rem;\n}\n\n.ar-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n margin-bottom: 1rem;\n}\n\n.ar-modal-header.is-inline {\n justify-content: flex-start;\n align-items: center;\n gap: 0.5rem;\n padding-top:0.5rem;\n}\n\n.ar-modal-title {\n margin: 0;\n font-size: 1rem;\n font-weight: 500;\n}\n\n.ar-modal-close {\n border: none;\n background: transparent;\n color: var(--ar-color-muted-foreground);\n cursor: pointer;\n border-radius: 999px;\n padding: 0.3rem;\n transition: color 0.2s ease, background 0.2s ease;\n}\n\n.ar-modal-close:hover {\n background: rgba(148, 163, 184, 0.15);\n color: var(--ar-color-accent);\n}\n\n.ar-modal-close-icon svg {\n width: 1.2rem;\n height: 1.2rem;\n}\n\n.ar-modal-body {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n overflow-y: auto;\n padding-right: 0.25rem;\n}\n\n/* Reduce gap when source list is hidden in inline mode */\n:host([data-trigger='inline']) .ar-modal-body--no-sources {\n gap: 0.5rem;\n}\n\n.ar-modal-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n}\n\n.ar-modal-footer.is-inline {\n padding: 0;\n border-top: none;\n}\n\n.ar-modal-footer.is-inline .ar-modal-footer-actions {\n margin-left: auto;\n}\n\n.ar-modal-footer-actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.ar-modal-add-more,\n.ar-modal-clear {\n border-radius: var(--ar-radius);\n padding: 0.55rem 1.25rem;\n font-weight: 600;\n border: 1px solid var(--ar-color-border);\n background: var(--ar-color-bg);\n color: var(--ar-color-text);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.ar-modal-add-more:hover {\n border-color: var(--ar-color-accent-button, var(--ar-color-accent));\n color: var(--ar-color-accent-button, var(--ar-color-accent));\n}\n\n.ar-modal-clear {\n background: rgba(148, 163, 184, 0.12);\n}\n\n.ar-modal-clear[disabled] {\n opacity: 0.45;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.ar-modal-clear:hover {\n border-color: var(--ar-color-accent);\n color: var(--ar-color-accent);\n}\n\n.ar-modal-upload-button,\n.ar-modal-done {\n border-radius: var(--ar-radius);\n padding: 0.55rem 1.25rem;\n font-weight: 600;\n border: none;\n background: var(--ar-color-accent-button, var(--ar-color-accent));\n color: white;\n cursor: pointer;\n transition: filter 0.2s ease;\n}\n\n.ar-modal-upload-button:hover,\n.ar-modal-done:hover {\n filter: brightness(1.05);\n}\n\n.ar-uploaded-summary {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n border-top: 1px solid var(--ar-color-border);\n padding-top: 1rem;\n}\n\n.ar-uploader-root[data-trigger='button'] .ar-uploaded-summary {\n border: 1px solid var(--ar-color-border);\n border-radius: var(--ar-radius);\n padding: 1rem;\n background: var(--ar-color-bg-muted);\n}\n\n.ar-summary-title {\n margin: 0;\n font-size: 0.95rem;\n font-weight: 600;\n}\n\n.ar-summary-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.ar-summary-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.ar-summary-icon {\n width: 38px;\n height: 38px;\n border-radius: 12px;\n background: var(--ar-color-accent-hover);\n color: var(--ar-color-accent);\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n}\n\n.ar-summary-info {\n display: flex;\n flex-direction: column;\n gap: 0.2rem;\n}\n\n.ar-summary-name {\n font-weight: 600;\n font-size: 0.95rem;\n}\n\n.ar-summary-meta {\n font-size: 0.8rem;\n color: var(--ar-color-muted-foreground);\n}\n\n.ar-uploader-root.is-uploading .ar-dropzone {\n display: none;\n}\n\n.ar-uploader-root.has-items .ar-file-list {\n display: flex;\n}\n\n.ar-file-list:empty {\n display: none;\n}\n\n.ar-modal-upload {\n display: flex;\n flex-direction: column;\n}\n\n.ar-modal-upload.is-inline {\n gap: 1rem;\n}\n\n.ar-modal-body .ar-file-list {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n max-height: 220px;\n overflow-y: auto;\n border: none;\n background: transparent;\n padding: 0;\n}\n\nbutton,\n.ar-button-trigger,\n.ar-dropzone-button,\n.ar-upload-button,\n.ar-modal-footer button,\n.ar-actions button,\n.ar-remove-button,\n.ar-modal-header button {\n font-size: 1rem;\n font-weight: 400;\n}\n\n@media (max-width: 640px) {\n .ar-uploader-root {\n padding: 1rem;\n }\n\n .ar-dropzone {\n padding: 2.25rem 1.25rem;\n }\n\n .ar-modal-dialog {\n width: min(90vw, 343px);\n padding: 1.25rem;\n }\n}\n\n.ar-actions-sources,\n.ar-modal-sources {\n display: none;\n}\n\n.ar-actions-sources.is-visible,\n.ar-modal-sources.is-visible {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n}\n\n.ar-source-list {\n display: none;\n flex-direction: column;\n margin: 1rem 0rem;\n}\n\n/* Remove margin when source list is hidden in inline mode */\n:host([data-trigger='inline']) .ar-source-list:not(.ar-source-list--choices) {\n margin: 0;\n}\n\n.ar-source-list--choices {\n display: flex;\n}\n\n.ar-source-option {\n display: flex;\n align-items: center;\n gap: 0.65rem;\n width: 100%;\n border: none;\n border-radius: var(--ar-radius);\n background: transparent;\n padding: 0.55rem 0.75rem;\n text-align: left;\n color: var(--ar-color-text);\n cursor: pointer;\n transition: background-color 0.2s ease, color 0.2s ease;\n}\n\n.ar-source-option.is-primary {\n background: rgba(148, 163, 184, 0.12);\n color: var(--ar-color-muted-foreground);\n}\n\n:host([data-theme='dark']) .ar-source-option.is-primary {\n color: var(--ar-color-text);\n}\n\n.ar-source-option:hover:not([disabled]),\n.ar-source-option:focus-visible {\n background: var(--ar-color-accent-hover);\n}\n\n.ar-source-option[disabled] {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.ar-source-option-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--ar-color-muted-foreground);\n}\n\n.ar-source-option-label {\n flex: 1;\n font-size: 0.95rem;\n}\n\n.ar-source-inline {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n}\n\n.ar-source-inline-button {\n width: 36px;\n height: 36px;\n border-radius: 999px;\n border: 1px solid var(--ar-color-border);\n background: transparent;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--ar-color-text);\n transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;\n}\n\n.ar-source-inline-button:hover:not([disabled]) {\n background: var(--ar-color-accent-hover);\n color: var(--ar-color-accent);\n border-color: var(--ar-color-accent);\n}\n\n.ar-source-inline-button svg {\n width: 18px;\n height: 18px;\n display: block;\n}\n\n.ar-modal-cancel {\n background: rgba(148, 163, 184, 0.15);\n border: none;\n color: var(--ar-color-text);\n padding:0.5rem 1rem;\n border-radius: var(--ar-radius);\n}\n\n.ar-modal-cancel:hover:not([disabled]) {\n background: rgba(148, 163, 184, 0.25);\n}\n\n.ar-modal-cancel.is-fullwidth {\n width: 100%;\n justify-content: center;\n border-radius: var(--ar-radius);\n cursor: pointer;\n}\n\n.ar-modal-powered,\n.ar-inline-powered {\n margin-top: 12px;\n font-size: 0.75rem;\n color: var(--ar-color-muted-foreground);\n text-align: center;\n}\n\n/* Reduce margin when sources are empty in inline mode */\n:host([data-trigger='inline']) .ar-inline-upload--no-sources .ar-inline-powered {\n margin-top: 0.5rem;\n}\n\n.ar-duplicate-banner {\n display: none;\n margin: 0.75rem 0;\n padding: 0.75rem;\n border-radius: var(--ar-radius);\n background: rgba(248, 113, 113, 0.12);\n color: #9f1239;\n font-size: 0.85rem;\n line-height: 1.3;\n}\n\n.ar-duplicate-banner[hidden] {\n display: none !important;\n}\n\n`;\n\n","import { UploaderController, type ControllerOptions } from '../core/uploader-controller';\nimport { DEFAULT_ICONS, DEFAULT_LABELS, DEFAULT_THEME } from '../constants/defaults';\nimport type {\n IconSet,\n LabelSet,\n ThemeOptions,\n UploadItem,\n UploadSourceOption,\n UploaderClassNames,\n} from '../types';\nimport { resolveIcon } from '../utils/helpers';\nimport { widgetStyles } from './styles';\n\nconst HTMLElementShim: typeof HTMLElement =\n typeof globalThis === 'undefined' || typeof globalThis.HTMLElement === 'undefined'\n ? (class HTMLElementFallback {} as unknown as typeof HTMLElement)\n : globalThis.HTMLElement;\n\ninterface FilesAddedDetail {\n items: UploadItem[];\n}\n\ninterface FileSystemEntry {\n isFile: boolean;\n isDirectory: boolean;\n name: string;\n fullPath: string;\n}\n\ninterface FileSystemFileEntry extends FileSystemEntry {\n file: (callback: (file: File) => void, errorCallback?: (error: DOMException) => void) => void;\n}\n\ninterface FileSystemDirectoryEntry extends FileSystemEntry {\n createReader: () => FileSystemDirectoryReader;\n}\n\ninterface FileSystemDirectoryReader {\n readEntries: (\n successCallback: (entries: FileSystemEntry[]) => void,\n errorCallback?: (error: DOMException) => void\n ) => void;\n}\n\nexport class AutorenderUploaderElement extends HTMLElementShim {\n static tagName = 'autorender-uploader';\n\n private shadow: ShadowRoot;\n private controller: UploaderController | null = null;\n private options!: ControllerOptions;\n private labels: Required<LabelSet> = DEFAULT_LABELS;\n private icons: Required<IconSet> = DEFAULT_ICONS;\n private classNames: UploaderClassNames = {};\n private sourceOptions: UploadSourceOption[] = [];\n\n private triggerType: 'button' | 'inline' = 'inline';\n private isModalOpen = false;\n private fileLayout: 'list' | 'grid' = 'list';\n private showGridFileName = true;\n\n private rootElement: HTMLElement | null = null;\n private fileInput!: HTMLInputElement;\n private dropzone: HTMLDivElement | null = null;\n private fileList: HTMLUListElement | null = null;\n private sourceLists: HTMLElement[] = [];\n private modalBody: HTMLElement | null = null;\n private inlineUpload: HTMLElement | null = null;\n private uploadButton: HTMLButtonElement | null = null;\n private triggerButton: HTMLButtonElement | null = null;\n private modalElement: HTMLElement | null = null;\n private modalCloseButton: HTMLButtonElement | null = null;\n private modalDoneButton: HTMLButtonElement | null = null;\n private modalClearButton: HTMLButtonElement | null = null;\n private modalUploadButton: HTMLButtonElement | null = null;\n private modalCancelButton: HTMLButtonElement | null = null;\n private modalAddMoreButton: HTMLButtonElement | null = null;\n private modalFooterActions: HTMLElement | null = null;\n private modalSourceContainer: HTMLElement | null = null;\n private actionsSourceContainer: HTMLElement | null = null;\n private modalTitleElement: HTMLElement | null = null;\n private modalHeaderElement: HTMLElement | null = null;\n private modalPoweredElement: HTMLElement | null = null;\n private inlinePoweredElement: HTMLElement | null = null;\n private duplicateBanners: HTMLElement[] = [];\n private errorBannerElement: HTMLElement | null = null;\n private globalErrorMessage: string | null = null;\n private portalContainer: HTMLElement | null = null;\n private portalDiv: HTMLElement | null = null;\n private isInsideContainer: boolean = false;\n\n private isAbortError(error: unknown): boolean {\n if (!error) return false;\n if (error instanceof DOMException && error.name === 'AbortError') return true;\n if (error instanceof Error && error.name === 'AbortError') return true;\n const message =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : '';\n return typeof message === 'string' && message.toLowerCase().includes('abort');\n }\n\n private controllerListeners = new Map<string, (event: Event) => void>();\n private handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && this.isModalOpen) {\n this.isModalOpen = false;\n this.render();\n }\n };\n\n constructor() {\n super();\n this.shadow = this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n this.render();\n }\n\n disconnectedCallback() {\n this.detachController();\n window.removeEventListener('keydown', this.handleKeydown);\n this.cleanupPortal();\n }\n\n private setupPortal() {\n if (!this.options.container) {\n this.isInsideContainer = false;\n return;\n }\n\n const container = typeof this.options.container === 'string'\n ? document.querySelector<HTMLElement>(this.options.container)\n : this.options.container;\n\n if (!container) {\n console.warn(`Container \"${this.options.container}\" not found`);\n this.isInsideContainer = false;\n return;\n }\n\n // Check if the widget is already inside the container\n // If so, we don't need a portal - everything is already contained\n let currentParent: Node | null = this.parentNode;\n while (currentParent && currentParent !== document.body) {\n if (currentParent === container) {\n // Widget is already inside container, no portal needed\n // But we need to ensure container has position relative for absolute modal positioning\n const containerStyle = window.getComputedStyle(container);\n if (containerStyle.position === 'static') {\n container.style.position = 'relative';\n }\n this.portalContainer = null;\n this.portalDiv = null;\n this.isInsideContainer = true;\n return;\n }\n currentParent = currentParent.parentNode;\n }\n\n // Widget is not inside container, use portal for modal only\n // Ensure container has position relative or absolute for absolute positioning\n const containerStyle = window.getComputedStyle(container);\n if (containerStyle.position === 'static') {\n container.style.position = 'relative';\n }\n\n this.portalContainer = container;\n this.isInsideContainer = false;\n\n // Create or reuse portal div\n if (!this.portalDiv) {\n this.portalDiv = document.createElement('div');\n this.portalDiv.className = 'ar-sdk-portal';\n this.portalDiv.style.position = 'absolute';\n this.portalDiv.style.inset = '0';\n this.portalDiv.style.zIndex = '1000';\n container.appendChild(this.portalDiv);\n }\n }\n\n private cleanupPortal() {\n if (this.portalDiv) {\n this.portalDiv.remove();\n this.portalDiv = null;\n }\n this.portalContainer = null;\n this.isInsideContainer = false;\n }\n\n setController(controller: UploaderController, options: ControllerOptions) {\n this.detachController();\n this.controller = controller;\n this.globalErrorMessage = null;\n this.applyOptions(options);\n this.attachController();\n this.render();\n }\n\n updateOptions(options: Partial<ControllerOptions>) {\n if (!this.controller) return;\n this.applyOptions({ ...this.options, ...options });\n this.controller.setOptions(this.options);\n this.render();\n }\n\n openFileDialog() {\n if (this.triggerType === 'button' && !this.isModalOpen) {\n this.isModalOpen = true;\n this.render();\n requestAnimationFrame(() => this.fileInput?.click());\n return;\n }\n this.fileInput?.click();\n }\n\n private applyOptions(options: ControllerOptions) {\n const previousOptions = this.options ?? ({} as ControllerOptions);\n const themeInput = (options.theme ?? previousOptions.theme ?? DEFAULT_THEME) as ThemeOptions;\n const resolvedTheme = {\n appearance: themeInput.appearance ?? DEFAULT_THEME.appearance,\n borderRadius: themeInput.borderRadius ?? DEFAULT_THEME.borderRadius,\n dropzoneBackground: themeInput.dropzoneBackground ?? DEFAULT_THEME.dropzoneBackground,\n dropzoneBorder: themeInput.dropzoneBorder ?? DEFAULT_THEME.dropzoneBorder,\n fontFamily: themeInput.fontFamily ?? previousOptions.theme?.fontFamily,\n };\n\n // Sources are already normalized by normalizeOptions (empty array if all disabled)\n const resolvedSources = options.sources ?? previousOptions.sources ?? [];\n const previousSourceIds = this.sourceOptions?.map(s => s.id).sort().join(',') ?? '';\n\n // Resolve container\n const containerChanged = previousOptions.container !== options.container;\n if (containerChanged && this.portalDiv && this.portalContainer) {\n // Clean up old portal\n this.portalDiv.remove();\n this.portalDiv = null;\n this.portalContainer = null;\n }\n\n this.options = {\n ...previousOptions,\n ...options,\n theme: resolvedTheme,\n sources: resolvedSources,\n };\n\n // Setup portal if container is specified and widget is not already inside it\n if (this.options.container) {\n this.setupPortal();\n } else {\n this.cleanupPortal();\n }\n\n this.labels = {\n ...DEFAULT_LABELS,\n ...(this.options.labels ?? {}),\n };\n\n this.icons = DEFAULT_ICONS;\n\n const currentSourceIds = resolvedSources.map(s => s.id).sort().join(',');\n const sourcesChanged = previousSourceIds !== currentSourceIds;\n \n this.sourceOptions = resolvedSources;\n this.options.onSourceSelect = options.onSourceSelect ?? previousOptions.onSourceSelect;\n\n const requestedType = this.options.type ?? 'inline';\n this.triggerType = requestedType === 'button' ? 'button' : 'inline';\n this.fileLayout = this.options.fileLayout ?? 'list';\n this.showGridFileName = this.options.showGridFileName ?? true;\n this.classNames = this.options.classNames ?? {};\n\n if (this.options.autoUpload === undefined && this.triggerType === 'inline') {\n this.options.autoUpload = true;\n }\n\n // Re-render source list if sources changed and widget is already rendered\n if (this.rootElement && sourcesChanged) {\n const hasItems = (this.controller?.getState().items.length ?? 0) > 0;\n this.renderSourceOptions(hasItems);\n }\n }\n\n private attachController() {\n if (!this.controller) return;\n\n const stateListener = () => this.updateState();\n const progressListener = () => this.updateState();\n const filesAddedListener = (event: Event) => {\n const detail = (event as CustomEvent<FilesAddedDetail>).detail;\n if (this.options.autoUpload && detail?.items?.length) {\n void this.controller?.uploadAll();\n }\n };\n const completeListener = () => {\n this.clearGlobalError();\n this.render();\n };\n const errorListener = (event: Event) => {\n const detail = (event as CustomEvent).detail;\n this.handleControllerError(detail);\n };\n\n this.controller.addEventListener('statechange', stateListener);\n this.controller.addEventListener('progress', progressListener);\n this.controller.addEventListener('fileprogress', progressListener);\n this.controller.addEventListener('filesadded', filesAddedListener);\n this.controller.addEventListener('complete', completeListener);\n this.controller.addEventListener('error', errorListener);\n\n this.controllerListeners.set('statechange', stateListener);\n this.controllerListeners.set('progress', progressListener);\n this.controllerListeners.set('fileprogress', progressListener);\n this.controllerListeners.set('filesadded', filesAddedListener);\n this.controllerListeners.set('complete', completeListener);\n this.controllerListeners.set('error', errorListener);\n }\n\n private detachController() {\n if (!this.controller) return;\n for (const [event, handler] of this.controllerListeners.entries()) {\n this.controller.removeEventListener(event, handler);\n }\n this.controllerListeners.clear();\n this.controller = null;\n }\n\n private resolveClassName(key: keyof UploaderClassNames, fallback: string) {\n const extra = this.classNames[key];\n return extra ? `${fallback} ${extra}` : fallback;\n }\n\n private render() {\n if (!this.controller) return;\n\n this.setAttribute('data-trigger', this.triggerType);\n\n const duplicateBannerMarkup = `<div class=\"ar-duplicate-banner\" hidden></div>`;\n const errorBannerMarkup = `<div class=\"ar-error-banner\" role=\"alert\" hidden></div>`;\n\n const dropzoneMarkup = `\n <div class=\"${this.resolveClassName('dropzone', 'ar-dropzone')}\" role=\"button\" tabindex=\"0\">\n <div class=\"ar-dropzone-icon\"></div>\n <p class=\"ar-description\">${this.labels.dropzoneTitle}</p>\n </div>\n `;\n\n const fileListMarkup = `<ul class=\"${this.resolveClassName('fileList', 'ar-file-list')}\"></ul>`;\n const sourceListMarkup = '<div class=\"ar-source-list\"></div>';\n\n const modalHeaderMarkup = `\n <div class=\"ar-modal-header\">\n <h3 class=\"ar-modal-title\">${this.labels.title}</h3>\n <button type=\"button\" class=\"ar-modal-close\" aria-label=\"Close\"><span class=\"ar-modal-close-icon\"></span></button>\n </div>\n `;\n\n const inlineHeaderMarkup = `\n <div class=\"ar-modal-header is-inline\">\n <h3 class=\"ar-modal-title\">${this.labels.title}</h3>\n </div>\n `;\n\n const uploadPanelMarkup = `\n <div class=\"ar-modal-body\">\n <div class=\"ar-modal-upload${this.triggerType === 'inline' ? ' is-inline' : ''}\">\n ${dropzoneMarkup}\n ${errorBannerMarkup}\n ${duplicateBannerMarkup}\n ${sourceListMarkup}\n ${fileListMarkup}\n </div>\n </div>\n `;\n\n const footerMarkup = `\n <div class=\"ar-modal-footer${this.triggerType === 'inline' ? ' is-inline' : ''}\">\n <button type=\"button\" class=\"ar-modal-clear\">${this.labels.clear}</button>\n <button type=\"button\" class=\"ar-modal-cancel\">${this.labels.cancel}</button>\n <div class=\"ar-modal-footer-actions\">\n <div class=\"ar-modal-sources\"></div>\n <button type=\"button\" class=\"ar-modal-add-more\">${this.labels.addMore}</button>\n <button type=\"button\" class=\"ar-modal-upload-button\">${this.labels.uploadButton}</button>\n <button type=\"button\" class=\"ar-modal-done\">${this.labels.done}</button>\n </div>\n </div>\n `;\n\n // Add is-portal class if widget is inside container (for absolute positioning) or if using portal div\n const shouldUsePortalPositioning = this.portalDiv || this.isInsideContainer;\n const modalMarkup = this.triggerType === 'button'\n ? `\n <div class=\"${this.resolveClassName('modal', 'ar-modal')} ${this.isModalOpen ? 'is-open' : ''} ${shouldUsePortalPositioning ? 'is-portal' : ''}\">\n <div class=\"ar-modal-backdrop\"></div>\n <div class=\"ar-modal-dialog\">\n ${modalHeaderMarkup}\n ${uploadPanelMarkup}\n ${footerMarkup}\n <div class=\"ar-modal-powered\">Powered by Autorender</div>\n </div>\n </div>\n `\n : '';\n\n const inlineMarkup = this.triggerType === 'inline'\n ? `\n <div class=\"ar-inline-upload\">\n <div class=\"ar-inline-panel\">\n ${inlineHeaderMarkup}\n ${uploadPanelMarkup}\n ${footerMarkup}\n </div>\n <div class=\"ar-inline-powered\">Powered by Autorender</div>\n </div>\n `\n : '';\n\n const template = document.createElement('template');\n template.innerHTML = `\n <style>${widgetStyles}</style>\n <div class=\"${this.resolveClassName('root', 'ar-uploader-root')}\" data-trigger=\"${this.triggerType}\">\n <input type=\"file\" class=\"ar-file-input\" hidden />\n ${\n this.triggerType === 'button'\n ? `<button type=\"button\" class=\"${this.resolveClassName('triggerButton', 'ar-button-trigger')}\"><span class=\"ar-button-icon\"></span><span>${this.labels.selectButton}</span></button>`\n : inlineMarkup\n }\n ${this.portalDiv ? '' : modalMarkup}\n </div>\n `;\n\n this.shadow.innerHTML = '';\n this.shadow.appendChild(template.content.cloneNode(true));\n\n // Render modal in portal if container is specified\n if (this.portalDiv && this.triggerType === 'button') {\n const portalTemplate = document.createElement('template');\n portalTemplate.innerHTML = `<style>${widgetStyles}</style>${modalMarkup}`;\n this.portalDiv.innerHTML = '';\n this.portalDiv.appendChild(portalTemplate.content.cloneNode(true));\n } else if (this.portalDiv && !this.triggerType) {\n // Clean up portal if not needed\n this.portalDiv.innerHTML = '';\n }\n\n this.captureElements();\n this.applyDimensions();\n this.configureInputs();\n this.bindEvents();\n this.applyThemeVariables();\n this.updateState();\n\n if (this.triggerType === 'button') {\n if (this.isModalOpen) {\n window.addEventListener('keydown', this.handleKeydown);\n } else {\n window.removeEventListener('keydown', this.handleKeydown);\n }\n }\n }\n\n private queryModalElement(selector: string): Element | null {\n // Query from portal first if it exists, otherwise from shadow\n if (this.portalDiv) {\n return this.portalDiv.querySelector(selector) || this.shadow.querySelector(selector);\n }\n return this.shadow.querySelector(selector);\n }\n\n private queryModalElements(selector: string): Element[] {\n // Query from portal first if it exists, otherwise from shadow\n if (this.portalDiv) {\n const portalResults = Array.from(this.portalDiv.querySelectorAll(selector));\n const shadowResults = Array.from(this.shadow.querySelectorAll(selector));\n // Combine results (portal takes precedence)\n const combined: Element[] = [];\n portalResults.forEach(el => combined.push(el));\n shadowResults.forEach(el => {\n if (!combined.includes(el)) combined.push(el);\n });\n return combined;\n }\n return Array.from(this.shadow.querySelectorAll(selector));\n }\n\n private captureElements() {\n this.rootElement = this.shadow.querySelector('.ar-uploader-root');\n this.fileInput = this.shadow.querySelector('.ar-file-input') as HTMLInputElement;\n this.dropzone = this.shadow.querySelector('.ar-dropzone');\n this.fileList = this.shadow.querySelector('.ar-file-list');\n this.sourceLists = Array.from(this.shadow.querySelectorAll('.ar-source-list')) as HTMLElement[];\n this.modalBody = this.queryModalElement('.ar-modal-body') as HTMLElement | null;\n this.inlineUpload = this.shadow.querySelector('.ar-inline-upload');\n this.uploadButton = this.shadow.querySelector('.ar-upload-button');\n this.triggerButton = this.shadow.querySelector('.ar-button-trigger');\n this.modalElement = this.queryModalElement('.ar-modal') as HTMLElement | null;\n this.modalCloseButton = this.queryModalElement('.ar-modal-close') as HTMLButtonElement | null;\n this.modalDoneButton = this.queryModalElement('.ar-modal-done') as HTMLButtonElement | null;\n this.modalClearButton = this.queryModalElement('.ar-modal-clear') as HTMLButtonElement | null;\n this.modalUploadButton = this.queryModalElement('.ar-modal-upload-button') as HTMLButtonElement | null;\n this.modalCancelButton = this.queryModalElement('.ar-modal-cancel') as HTMLButtonElement | null;\n this.modalAddMoreButton = this.queryModalElement('.ar-modal-add-more') as HTMLButtonElement | null;\n this.modalFooterActions = this.queryModalElement('.ar-modal-footer-actions') as HTMLElement | null;\n this.modalSourceContainer = this.queryModalElement('.ar-modal-sources') as HTMLElement | null;\n this.actionsSourceContainer = this.shadow.querySelector('.ar-actions-sources');\n this.modalTitleElement = this.queryModalElement('.ar-modal-title') as HTMLElement | null;\n this.modalHeaderElement = this.queryModalElement('.ar-modal-header') as HTMLElement | null;\n this.modalPoweredElement = this.queryModalElement('.ar-modal-powered') as HTMLElement | null;\n this.inlinePoweredElement = this.shadow.querySelector('.ar-inline-powered');\n this.duplicateBanners = this.queryModalElements('.ar-duplicate-banner') as HTMLElement[];\n this.errorBannerElement = this.queryModalElement('.ar-error-banner') as HTMLElement | null;\n this.updateErrorBanner();\n\n const icon = resolveIcon(this.icons.upload);\n const iconContainer = this.shadow.querySelector('.ar-dropzone-icon');\n if (icon && iconContainer) {\n iconContainer.innerHTML = '';\n iconContainer.appendChild(icon);\n }\n const buttonIcon = resolveIcon(this.icons.upload);\n const triggerIconContainer = this.shadow.querySelector('.ar-button-icon');\n if (buttonIcon && triggerIconContainer) {\n triggerIconContainer.innerHTML = '';\n triggerIconContainer.appendChild(buttonIcon);\n }\n const closeIcon = resolveIcon(this.icons.close);\n const closeIconContainer = this.queryModalElement('.ar-modal-close-icon');\n if (closeIcon && closeIconContainer) {\n closeIconContainer.innerHTML = '';\n closeIconContainer.appendChild(closeIcon);\n }\n }\n\n private applyDimensions() {\n if (!this.rootElement) return;\n\n const requestedWidth = this.options.width;\n\n if (requestedWidth === undefined || requestedWidth === null || requestedWidth === '') {\n if (this.triggerType === 'inline') {\n this.rootElement.style.width = '100%';\n } else {\n this.rootElement.style.removeProperty('width');\n }\n return;\n }\n\n const normalizedWidth =\n typeof requestedWidth === 'number' ? `${requestedWidth}px` : requestedWidth;\n this.rootElement.style.width = normalizedWidth;\n }\n\n private configureInputs() {\n this.fileInput?.removeAttribute('webkitdirectory');\n this.fileInput?.removeAttribute('mozdirectory');\n this.fileInput?.removeAttribute('directory');\n\n if (this.options.allowMultiple === false) {\n this.fileInput?.removeAttribute('multiple');\n } else {\n this.fileInput?.setAttribute('multiple', '');\n }\n\n if (this.options.accept?.length) {\n this.fileInput.accept = this.options.accept.join(',');\n }\n }\n\n private bindEvents() {\n this.triggerButton?.addEventListener('click', () => {\n this.isModalOpen = true;\n this.render();\n });\n\n this.modalCloseButton?.addEventListener('click', () => {\n this.isModalOpen = false;\n this.render();\n });\n\n this.modalElement?.addEventListener('click', event => {\n const target = event.target as HTMLElement;\n if (!target) return;\n if (target === this.modalElement || target.classList.contains('ar-modal-backdrop')) {\n this.isModalOpen = false;\n this.render();\n }\n });\n\n this.modalUploadButton?.addEventListener('click', () => {\n if (!this.controller) return;\n if (this.controller.getState().isUploading) return;\n void this.controller.uploadAll();\n });\n\n this.modalDoneButton?.addEventListener('click', () => {\n if (!this.controller) return;\n const state = this.controller.getState();\n const allCompleted = state.items.length > 0 && state.items.every(item => item.status === 'completed');\n if (this.triggerType === 'inline') {\n if (state.isUploading) {\n return;\n }\n if (allCompleted || state.items.length === 0) {\n this.controller.reset();\n this.updateState();\n }\n return;\n }\n if (state.isUploading) {\n this.closeModal();\n return;\n }\n if (allCompleted) {\n this.closeModal();\n return;\n }\n this.closeModal();\n });\n\n this.modalClearButton?.addEventListener('click', () => {\n if (!this.controller) return;\n const { isUploading } = this.controller.getState();\n if (isUploading) {\n return;\n }\n this.controller.reset();\n this.updateState();\n });\n\n this.modalCancelButton?.addEventListener('click', () => {\n if (!this.controller) return;\n const currentState = this.controller.getState();\n if (currentState.isUploading) return;\n this.controller.reset();\n if (this.triggerType === 'inline') {\n this.updateState();\n return;\n }\n this.isModalOpen = false;\n this.render();\n });\n\n this.modalAddMoreButton?.addEventListener('click', () => {\n this.openFileDialog();\n });\n\n this.dropzone?.addEventListener('click', () => this.openFileDialog());\n this.dropzone?.addEventListener('dragenter', event => {\n event.preventDefault();\n this.dropzone?.classList.add('is-dragging');\n });\n this.dropzone?.addEventListener('dragover', event => {\n event.preventDefault();\n this.dropzone?.classList.add('is-dragging');\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'copy';\n }\n });\n this.dropzone?.addEventListener('dragleave', event => {\n if (event.target === this.dropzone) {\n this.dropzone?.classList.remove('is-dragging');\n }\n });\n this.dropzone?.addEventListener('drop', async event => {\n event.preventDefault();\n this.dropzone?.classList.remove('is-dragging');\n const files = await this.extractFilesFromEvent(event);\n if (files.length) {\n await this.controller?.addFiles(files);\n }\n if (this.fileInput) {\n this.fileInput.value = '';\n }\n });\n\n this.fileInput?.addEventListener('change', async () => {\n const files = this.fileInput?.files ? Array.from(this.fileInput.files) : [];\n const mapped = files.map(file => ({\n file,\n relativePath: (file as File & { webkitRelativePath?: string }).webkitRelativePath,\n }));\n await this.controller?.addFiles(mapped);\n if (this.fileInput) this.fileInput.value = '';\n });\n\n this.uploadButton?.addEventListener('click', () => {\n if (this.controller?.getState().isUploading) return;\n void this.controller?.uploadAll();\n });\n }\n\n private async extractFilesFromEvent(\n event: DragEvent\n ): Promise<Array<{ file: File; relativePath?: string }>> {\n const items = event.dataTransfer?.items;\n\n if (!items) {\n const files = event.dataTransfer?.files ? Array.from(event.dataTransfer.files) : [];\n return files.map(file => ({\n file,\n relativePath: (file as File & { webkitRelativePath?: string }).webkitRelativePath,\n }));\n }\n\n const entries = Array.from(items)\n .map(item => (item.webkitGetAsEntry ? item.webkitGetAsEntry() : null))\n .filter(Boolean) as FileSystemEntry[];\n\n const collected: Array<{ file: File; relativePath?: string }> = [];\n\n for (const entry of entries) {\n const files = await this.readEntry(entry, '');\n collected.push(...files);\n }\n\n return collected;\n }\n\n private readEntry(entry: FileSystemEntry, path = ''): Promise<Array<{ file: File; relativePath?: string }>> {\n return new Promise(resolve => {\n if (entry.isFile) {\n (entry as FileSystemFileEntry).file(file => {\n resolve([{ file, relativePath: path ? `${path}/${file.name}` : file.name }]);\n });\n } else if (entry.isDirectory) {\n const reader = (entry as FileSystemDirectoryEntry).createReader();\n reader.readEntries(async entries => {\n const results = await Promise.all(\n entries.map(child => this.readEntry(child, path ? `${path}/${entry.name}` : entry.name))\n );\n resolve(results.flat());\n });\n } else {\n resolve([]);\n }\n });\n }\n\n private closeModal() {\n this.isModalOpen = false;\n this.render();\n }\n\n private setGlobalError(message: string | null) {\n this.globalErrorMessage = message;\n this.updateErrorBanner();\n }\n\n private clearGlobalError() {\n this.setGlobalError(null);\n }\n\n private updateErrorBanner() {\n if (!this.errorBannerElement) return;\n if (this.globalErrorMessage) {\n this.errorBannerElement.hidden = false;\n this.errorBannerElement.textContent = this.globalErrorMessage;\n } else {\n this.errorBannerElement.hidden = true;\n this.errorBannerElement.textContent = '';\n }\n }\n\n private handleControllerError(error: unknown) {\n if (this.isAbortError(error)) {\n this.clearGlobalError();\n return;\n }\n\n const status =\n typeof error === 'object' && error !== null && 'status' in error\n ? (error as any).status\n : undefined;\n const messageCandidate =\n error instanceof Error\n ? error.message\n : typeof (error as any)?.message === 'string'\n ? (error as any).message\n : typeof error === 'string'\n ? error\n : '';\n\n const normalized = String(messageCandidate ?? '').toLowerCase();\n const isAuthError =\n (typeof status === 'number' && (status === 401 || status === 403)) ||\n normalized.includes('unauthorized') ||\n normalized.includes('forbidden') ||\n normalized.includes('invalid api key');\n\n if (isAuthError) {\n this.setGlobalError(this.labels.invalidApiKey);\n } else if (messageCandidate) {\n this.setGlobalError(String(messageCandidate));\n } else {\n this.setGlobalError(this.labels.uploadFailed);\n }\n }\n\n private updateState() {\n if (!this.controller) return;\n if (!this.fileList) return;\n\n const state = this.controller.getState();\n const { items, isUploading, duplicates } = state;\n const hasItems = items.length > 0;\n const hasAuthError = items.some(item => item.error === 'invalid-api-key');\n\n if (hasAuthError) {\n this.setGlobalError(this.labels.invalidApiKey);\n }\n\n if (this.rootElement) {\n this.rootElement.classList.toggle('is-uploading', isUploading);\n this.rootElement.classList.toggle('has-items', hasItems);\n }\n\n if (this.dropzone) {\n if (hasItems) {\n this.dropzone.style.display = 'none';\n } else {\n this.dropzone.style.display = 'flex';\n }\n }\n\n this.renderFileList(items);\n this.updateErrorBanner();\n this.renderSourceOptions(hasItems);\n this.updateModalTitle(items, isUploading);\n this.updateDuplicateBanners(duplicates);\n\n if (this.modalHeaderElement) {\n this.modalHeaderElement.style.display = hasItems ? '' : 'none';\n }\n if (this.modalPoweredElement) {\n this.modalPoweredElement.style.display = hasItems ? 'none' : '';\n }\n if (this.inlinePoweredElement) {\n this.inlinePoweredElement.style.display = hasItems ? 'none' : '';\n }\n\n if (this.triggerType === 'button' || this.triggerType === 'inline') {\n const completedCount = items.filter(item => item.status === 'completed').length;\n const allCompleted = hasItems && completedCount === items.length && completedCount > 0;\n\n if (this.modalFooterActions) {\n this.modalFooterActions.style.display = hasItems ? '' : 'none';\n }\n\n const uploadButton = this.modalUploadButton;\n const doneButton = this.modalDoneButton;\n const cancelButton = this.modalCancelButton;\n const clearButton = this.modalClearButton;\n const addMoreButton = this.modalAddMoreButton;\n\n const showUpload = hasItems && !isUploading && !allCompleted;\n const showAddMore = hasItems && !isUploading && !allCompleted;\n const showDone = hasItems && (isUploading || allCompleted);\n const showClear = hasItems && (isUploading || allCompleted);\n const showInlineCancel =\n this.triggerType === 'inline' && hasItems && !isUploading && !allCompleted;\n const showButtonCancel =\n this.triggerType === 'button' && !isUploading && (!allCompleted || !hasItems);\n const showCancel = showInlineCancel || showButtonCancel;\n\n if (uploadButton) {\n uploadButton.style.display = showUpload ? '' : 'none';\n uploadButton.toggleAttribute('disabled', !showUpload);\n }\n\n if (doneButton) {\n doneButton.style.display = showDone ? '' : 'none';\n doneButton.textContent = this.labels.done;\n doneButton.toggleAttribute('disabled', !showDone);\n }\n\n if (clearButton) {\n clearButton.style.display = showClear ? '' : 'none';\n clearButton.toggleAttribute('disabled', isUploading);\n }\n\n if (cancelButton) {\n cancelButton.style.display = showCancel ? '' : 'none';\n cancelButton.classList.toggle(\n 'is-fullwidth',\n this.triggerType === 'button' && !hasItems\n );\n }\n\n if (addMoreButton) {\n addMoreButton.style.display = showAddMore ? '' : 'none';\n addMoreButton.toggleAttribute('disabled', !showAddMore);\n }\n }\n }\n\n private renderFileList(items: UploadItem[]) {\n if (!this.fileList) return;\n this.fileList.innerHTML = '';\n if (items.length === 0) {\n this.fileList.style.display = 'none';\n this.fileList.classList.remove('is-grid');\n return;\n }\n\n const isGridLayout = this.fileLayout === 'grid';\n this.fileList.style.display = isGridLayout ? 'grid' : 'flex';\n this.fileList.classList.toggle('is-grid', isGridLayout);\n if (isGridLayout) {\n this.fileList.style.gridTemplateColumns = 'repeat(auto-fill, minmax(140px, 1fr))';\n this.fileList.style.gap = '1rem';\n } else {\n this.fileList.style.removeProperty('grid-template-columns');\n this.fileList.style.removeProperty('gap');\n }\n\n const isUploading = this.controller?.getState().isUploading ?? false;\n\n items.forEach(item => {\n const li = document.createElement('li');\n li.className = 'ar-file-item';\n li.classList.toggle('is-grid', isGridLayout);\n\n const isInvalidApiKeyError = item.error === 'invalid-api-key';\n\n if (item.status === 'uploading' || item.status === 'pending') li.classList.add('is-uploading');\n if (item.status === 'completed') li.classList.add('is-completed');\n if (item.status === 'error' && !isInvalidApiKeyError) li.classList.add('is-error');\n\n const header = document.createElement('div');\n header.className = 'ar-file-header';\n header.classList.toggle('is-grid', isGridLayout);\n\n const thumb = document.createElement('div');\n thumb.className = 'ar-file-thumb';\n thumb.classList.toggle('is-grid', isGridLayout);\n const isImage = item.file.type.startsWith('image/');\n if (item.previewUrl && isImage) {\n const img = document.createElement('img');\n img.src = item.previewUrl;\n img.alt = item.file.name;\n thumb.appendChild(img);\n } else {\n // Show document icon for non-images\n thumb.classList.add('ar-file-thumb-document');\n const documentIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n documentIcon.setAttribute('viewBox', '0 0 24 24');\n documentIcon.setAttribute('width', '24');\n documentIcon.setAttribute('height', '24');\n documentIcon.setAttribute('fill', 'none');\n documentIcon.setAttribute('aria-hidden', 'true');\n const path1 = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path1.setAttribute('d', 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6Z');\n path1.setAttribute('stroke', 'currentColor');\n path1.setAttribute('stroke-width', '1.5');\n path1.setAttribute('stroke-linecap', 'round');\n path1.setAttribute('stroke-linejoin', 'round');\n const path2 = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path2.setAttribute('d', 'M14 2v6h6');\n path2.setAttribute('stroke', 'currentColor');\n path2.setAttribute('stroke-width', '1.5');\n path2.setAttribute('stroke-linecap', 'round');\n path2.setAttribute('stroke-linejoin', 'round');\n documentIcon.appendChild(path1);\n documentIcon.appendChild(path2);\n thumb.appendChild(documentIcon);\n }\n\n if (item.status === 'completed') {\n const statusOverlay = document.createElement('div');\n statusOverlay.className = 'ar-thumb-status';\n const successIcon = resolveIcon(this.icons.success);\n if (successIcon) {\n statusOverlay.appendChild(successIcon);\n }\n thumb.appendChild(statusOverlay);\n } else if (item.status === 'error' && !isInvalidApiKeyError) {\n const statusOverlay = document.createElement('div');\n statusOverlay.className = 'ar-thumb-status is-error';\n const errorIcon = resolveIcon(this.icons.error);\n if (errorIcon) {\n statusOverlay.appendChild(errorIcon);\n }\n thumb.appendChild(statusOverlay);\n }\n\n const name = document.createElement('span');\n name.className = 'ar-file-name';\n name.textContent = item.file.name;\n if (isGridLayout && !this.showGridFileName) {\n name.style.display = 'none';\n } else {\n name.style.display = '';\n }\n\n const removeButton = document.createElement('button');\n removeButton.type = 'button';\n removeButton.className = 'ar-remove-button';\n const shouldShowRemove =\n (item.status === 'pending' ||\n (item.status === 'error' && isInvalidApiKeyError)) &&\n !isUploading;\n removeButton.disabled = !shouldShowRemove;\n removeButton.hidden = !shouldShowRemove;\n removeButton.style.display = shouldShowRemove ? 'inline-flex' : 'none';\n removeButton.classList.toggle('is-grid', isGridLayout);\n const removeIcon = resolveIcon(this.icons.remove);\n if (removeIcon) {\n removeButton.appendChild(removeIcon);\n }\n removeButton.addEventListener('click', () => {\n if (this.controller?.getState().isUploading) return;\n this.controller?.removeFile(item.id);\n });\n\n header.appendChild(thumb);\n header.appendChild(name);\n header.appendChild(removeButton);\n li.appendChild(header);\n\n // Display info message (not error) if present - show it right after header\n if (item.info) {\n const metaRow = document.createElement('div');\n metaRow.className = 'ar-file-meta';\n const infoText = document.createElement('span');\n infoText.className = 'ar-file-info';\n infoText.textContent = item.info;\n metaRow.appendChild(infoText);\n li.appendChild(metaRow);\n }\n\n const progressBorder = document.createElement('div');\n progressBorder.className = 'ar-progress-border';\n\n const progressFill = document.createElement('div');\n progressFill.className = 'ar-progress-fill';\n\n const isPendingStatus = item.status === 'pending';\n const isUploadingStatus = item.status === 'uploading';\n const isCompleteStatus = item.status === 'completed';\n const rawProgress = Math.max(0, Math.min(100, item.progress ?? 0));\n const calculatedTrain = !isCompleteStatus && rawProgress < 20;\n const shouldAnimateTrain = (isUploadingStatus || (isUploading && isPendingStatus)) && calculatedTrain;\n // Keep indicator active if uploading, even if progress hasn't updated recently\n const isActive = isUploadingStatus || shouldAnimateTrain || (rawProgress > 0 && !isCompleteStatus);\n const stateLabel = isCompleteStatus ? 'complete' : shouldAnimateTrain ? 'train' : rawProgress >= 20 ? 'progress' : isUploadingStatus ? 'progress' : 'idle';\n\n progressBorder.dataset.state = stateLabel;\n progressBorder.dataset.status = item.status;\n progressBorder.dataset.progress = rawProgress.toFixed(0);\n\n progressBorder.classList.toggle('is-active', isActive);\n progressBorder.classList.toggle('is-train', shouldAnimateTrain);\n progressBorder.classList.toggle('is-complete', isCompleteStatus);\n progressBorder.style.display = isCompleteStatus ? 'none' : '';\n\n progressFill.classList.toggle('is-train', shouldAnimateTrain);\n progressFill.classList.toggle('is-animating', shouldAnimateTrain);\n\n if (isCompleteStatus) {\n progressFill.style.width = '100%';\n } else if (shouldAnimateTrain) {\n progressFill.style.width = '100%';\n } else if (isUploadingStatus && rawProgress === 0) {\n // Show minimal progress for uploading items even if progress hasn't started\n progressFill.style.width = '3%';\n } else {\n const computedWidth = Math.max(rawProgress, 3);\n progressFill.style.width = `${Math.min(computedWidth, 100)}%`;\n }\n\n progressBorder.appendChild(progressFill);\n\n li.appendChild(progressBorder);\n\n this.fileList?.appendChild(li);\n });\n }\n\n private renderSourceOptions(hasItems: boolean) {\n // Filter out disabled sources - only show enabled ones\n const enabledSources = this.sourceOptions.filter(option => !option.disabled);\n const hasSourcesConfigured = enabledSources.length > 0;\n\n const renderChoiceList = (container: HTMLElement) => {\n container.innerHTML = '';\n if (!hasSourcesConfigured) {\n container.style.display = 'none';\n container.classList.remove('ar-source-list--choices');\n return;\n }\n\n container.style.display = hasItems ? 'none' : 'flex';\n container.classList.toggle('ar-source-list--choices', !hasItems);\n if (hasItems) return;\n\n // Only render enabled sources\n enabledSources.forEach(option => {\n const button = document.createElement('button');\n button.type = 'button';\n button.className = 'ar-source-option';\n\n const icon = resolveIcon(option.icon ?? this.icons.upload);\n if (icon) {\n const iconWrapper = document.createElement('span');\n iconWrapper.className = 'ar-source-option-icon';\n iconWrapper.appendChild(icon);\n button.appendChild(iconWrapper);\n }\n\n const label = document.createElement('span');\n label.className = 'ar-source-option-label';\n label.textContent = option.label;\n button.appendChild(label);\n\n button.addEventListener('click', () => this.handleSourceOption(option));\n container.appendChild(button);\n });\n };\n\n this.sourceLists.forEach(container => {\n renderChoiceList(container);\n });\n\n if (this.modalSourceContainer) {\n this.modalSourceContainer.classList.toggle('is-visible', hasSourcesConfigured && !hasItems);\n this.modalSourceContainer.style.display = hasSourcesConfigured ? '' : 'none';\n this.modalSourceContainer.innerHTML = '';\n }\n if (this.actionsSourceContainer) {\n this.actionsSourceContainer.classList.toggle('is-visible', hasSourcesConfigured && !hasItems);\n this.actionsSourceContainer.style.display = hasSourcesConfigured ? '' : 'none';\n this.actionsSourceContainer.innerHTML = '';\n }\n\n // Add class to modal body and inline upload when sources are empty in inline mode\n if (this.triggerType === 'inline') {\n if (this.modalBody) {\n this.modalBody.classList.toggle('ar-modal-body--no-sources', !hasSourcesConfigured);\n }\n if (this.inlineUpload) {\n this.inlineUpload.classList.toggle('ar-inline-upload--no-sources', !hasSourcesConfigured);\n }\n }\n }\n\n private updateModalTitle(items: UploadItem[], isUploading: boolean) {\n if (!this.modalTitleElement) return;\n if (items.length === 0) {\n this.modalTitleElement.textContent = isUploading\n ? this.labels.uploading\n : this.labels.title;\n this.modalTitleElement.classList.remove('is-dynamic', 'is-success');\n return;\n }\n\n const total = items.length;\n const modalTitle = this.modalTitleElement;\n\n const suffix = total === 1 ? 'file' : 'files';\n const completedCount = items.filter(item => item.status === 'completed').length;\n\n modalTitle.classList.add('is-dynamic');\n modalTitle.classList.toggle('is-success', completedCount === total);\n\n if (isUploading) {\n modalTitle.textContent = `Uploading ${completedCount}/${total} ${suffix}`;\n return;\n }\n\n if (completedCount === total) {\n modalTitle.textContent = `${total} ${suffix} uploaded`;\n return;\n }\n\n modalTitle.textContent = `${total} ${suffix} ready`;\n }\n\n private updateDuplicateBanners(duplicates: string[]) {\n const hasDuplicates = duplicates.length > 0;\n const prefix =\n duplicates.length === 1\n ? this.labels.duplicateFileExists\n : this.labels.duplicateFilesExist;\n const message = hasDuplicates\n ? `${prefix} ${duplicates.join(', ')}`\n : '';\n\n this.duplicateBanners.forEach(banner => {\n banner.hidden = !hasDuplicates;\n banner.textContent = message;\n });\n }\n\n private handleSourceOption(option: UploadSourceOption) {\n if (option.disabled) return;\n\n this.options.onSourceSelect?.(option);\n this.dispatchEvent(new CustomEvent('sourceselect', { detail: option }));\n\n if (option.kind === 'device' && !option.action) {\n this.openFileDialog();\n return;\n }\n\n if (option.action) {\n try {\n option.action();\n } catch (error) {\n console.error('[AutorenderUploader] Source action failed', error);\n }\n return;\n }\n\n console.warn('[AutorenderUploader] No handler configured for source option', option);\n }\n\n private applyThemeVariables() {\n const theme = (this.options.theme ?? {}) as ThemeOptions;\n const borderRadius = theme.borderRadius;\n const accentColor = theme.accentColor;\n const dropzoneBackground = theme.dropzoneBackground ?? DEFAULT_THEME.dropzoneBackground;\n const dropzoneBorder = theme.dropzoneBorder ?? DEFAULT_THEME.dropzoneBorder;\n const fontFamily = theme.fontFamily;\n\n if (borderRadius !== undefined) {\n this.style.setProperty(\n '--ar-radius',\n typeof borderRadius === 'number' ? `${borderRadius}px` : String(borderRadius)\n );\n } else {\n this.style.removeProperty('--ar-radius');\n }\n\n // Only set accent color if explicitly provided; otherwise let palette CSS handle it\n if (accentColor) {\n this.style.setProperty('--ar-color-accent', accentColor);\n } else {\n this.style.removeProperty('--ar-color-accent');\n }\n\n if (dropzoneBackground) {\n this.style.setProperty('--ar-dropzone-bg', dropzoneBackground);\n }\n if (dropzoneBorder) {\n this.style.setProperty('--ar-dropzone-border', dropzoneBorder);\n }\n if (fontFamily) {\n this.style.setProperty('--ar-font-family', fontFamily);\n }\n\n const appearance = theme.appearance ?? DEFAULT_THEME.appearance;\n let resolvedAppearance = appearance;\n if (appearance === 'system' && typeof window !== 'undefined') {\n resolvedAppearance = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n this.setAttribute('data-theme', resolvedAppearance);\n\n // Apply palette\n const palette = this.options.palette;\n if (palette) {\n this.setAttribute('data-palette', palette);\n } else {\n this.removeAttribute('data-palette');\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'autorender-uploader': AutorenderUploaderElement;\n }\n}","/**\n * Device detection utilities for DPR.\n */\n\nexport function getDPR(): number {\n if (typeof window === 'undefined') return 1;\n const dpr = window.devicePixelRatio || 1;\n // Round to 1 or 2 for most cases (can be extended to 3 for high-DPI)\n return dpr >= 2 ? 2 : 1;\n}\n\n","/**\n * Transformation builder - converts TransformOptions to URL transformation string\n * with deterministic sorting\n */\n\nimport type { TransformOptions, LayerOptions } from './types';\nimport { getDPR } from './device';\n\ninterface TransformationPart {\n param: string;\n value: string;\n sortKey: string; // For deterministic sorting\n}\n\nfunction normalizePosition(value: string): string {\n const normalized = value.trim().toLowerCase();\n const positionMap: Record<string, string> = {\n center: 'c',\n 'top-left': 'tl',\n 'top-right': 'tr',\n 'bottom-left': 'bl',\n 'bottom-right': 'br',\n top: 't',\n bottom: 'b',\n left: 'l',\n right: 'r',\n p_c: 'c',\n p_tl: 'tl',\n p_tr: 'tr',\n p_bl: 'bl',\n p_br: 'br',\n p_t: 't',\n p_b: 'b',\n p_l: 'l',\n p_r: 'r',\n };\n return positionMap[normalized] || normalized;\n}\n\n/** Output format is GIF — omit DPR and quality in delivery URLs (e.g. ARImage / animated GIF). */\nexport function isGifFormatOutput(transform?: TransformOptions | null): boolean {\n const f = transform?.f;\n return typeof f === 'string' && f.toLowerCase() === 'gif';\n}\n\n/**\n * Build transformation string from options\n * Transformations are sorted alphabetically by param prefix\n */\nexport function buildTransformString(\n transform: TransformOptions,\n defaults?: { f?: string; q?: string | number; [key: string]: any },\n enableDPR: boolean = true\n): string {\n const parts: TransformationPart[] = [];\n \n // Helper to add transformation part\n const addPart = (param: string, value: string | number | boolean) => {\n if (value === undefined || value === null) return;\n \n let valueStr: string;\n if (typeof value === 'boolean') {\n valueStr = value ? '' : '';\n if (!value) return; // Skip false booleans\n } else {\n valueStr = String(value);\n }\n \n // Create sort key: param prefix determines order\n // Special handling: dpr_ should come early, but after basic size params\n let sortKey = param;\n if (param.startsWith('dpr_')) {\n sortKey = 'dpr_' + param; // Keep dpr early\n } else if (param.startsWith('a_')) {\n sortKey = 'a_' + param; // Text rotation\n } else if (param.startsWith('ar_')) {\n sortKey = 'ar_' + param;\n } else if (param.startsWith('bg_')) {\n sortKey = 'bg_' + param;\n } else if (param.startsWith('c_')) {\n sortKey = 'c_' + param;\n } else if (param.startsWith('co_')) {\n sortKey = 'co_' + param; // Text color\n } else if (param.startsWith('e_')) {\n sortKey = 'e_' + param;\n } else if (param.startsWith('f_')) {\n sortKey = 'f_' + param;\n } else if (param.startsWith('fl_')) {\n sortKey = 'fl_' + param;\n } else if (param.startsWith('fo_')) {\n sortKey = 'fo_' + param;\n } else if (param.startsWith('flip_')) {\n sortKey = 'flip_' + param;\n } else if (param.startsWith('h_')) {\n sortKey = 'h_' + param;\n } else if (param.startsWith('ip_')) {\n sortKey = 'ip_' + param; // Image layer placement\n } else if (param.startsWith('k_')) {\n sortKey = 'k_' + param;\n } else if (param.startsWith('l_')) {\n sortKey = 'l_' + param;\n } else if (param.startsWith('la_')) {\n sortKey = 'la_' + param;\n } else if (param.startsWith('lar_')) {\n sortKey = 'lar_' + param;\n } else if (param.startsWith('lbg_')) {\n sortKey = 'lbg_' + param;\n } else if (param.startsWith('lc_')) {\n sortKey = 'lc_' + param;\n } else if (param.startsWith('le_')) {\n sortKey = 'le_' + param;\n } else if (param.startsWith('lf_')) {\n sortKey = 'lf_' + param;\n } else if (param.startsWith('lflip_')) {\n sortKey = 'lflip_' + param;\n } else if (param.startsWith('lh_')) {\n sortKey = 'lh_' + param;\n } else if (param.startsWith('lp_')) {\n sortKey = 'lp_' + param;\n } else if (param.startsWith('lq_')) {\n sortKey = 'lq_' + param;\n } else if (param.startsWith('lr_')) {\n sortKey = 'lr_' + param;\n } else if (param.startsWith('ltype_')) {\n sortKey = 'ltype_' + param;\n } else if (param.startsWith('lw_')) {\n sortKey = 'lw_' + param;\n } else if (param.startsWith('lzoom_')) {\n sortKey = 'lzoom_' + param;\n } else if (param.startsWith('lbr_')) {\n sortKey = 'lbr_' + param;\n } else if (param.startsWith('o_')) {\n sortKey = 'o_' + param; // Opacity\n } else if (param.startsWith('p_')) {\n sortKey = 'p_' + param;\n } else if (param.startsWith('ps_')) {\n sortKey = 'ps_' + param;\n } else if (param.startsWith('q_')) {\n sortKey = 'q_' + param;\n } else if (param.startsWith('r_')) {\n sortKey = 'r_' + param;\n } else if (param.startsWith('tp_')) {\n sortKey = 'tp_' + param; // Text placement\n } else if (param.startsWith('w_')) {\n sortKey = 'w_' + param;\n } else if (param.startsWith('x_')) {\n sortKey = 'x_' + param;\n } else if (param.startsWith('y_')) {\n sortKey = 'y_' + param;\n } else if (param.startsWith('z_')) {\n sortKey = 'z_' + param;\n } else if (param.startsWith('br_')) {\n sortKey = 'br_' + param;\n }\n \n parts.push({ param, value: valueStr, sortKey });\n };\n \n // Size & Crop\n if (transform.w !== undefined) addPart('w_', transform.w);\n if (transform.h !== undefined) addPart('h_', transform.h);\n if (transform.fit) {\n const fitMap: Record<string, string> = {\n crop: 'crop',\n fill: 'fill',\n fit: 'fit',\n scale: 'scale'\n };\n addPart('c_', fitMap[transform.fit] || transform.fit);\n }\n if (transform.ar) addPart('ar_', transform.ar);\n if (transform.position) addPart('p_', normalizePosition(transform.position));\n if (transform.position_startagy) {\n const strategy = String(transform.position_startagy).trim().toLowerCase().replace(/^ps_/, '');\n if (strategy === 'entropy' || strategy === 'attention') {\n addPart('ps_', strategy);\n }\n }\n if (transform.focus) addPart('fo_', transform.focus);\n\n // Video trim (seconds) → so_{n}, eo_{n}\n if (transform.so !== undefined) addPart('so_', transform.so);\n if (transform.eo !== undefined) addPart('eo_', transform.eo);\n \n // Transform\n if (transform.r !== undefined) addPart('r_', transform.r);\n if (transform.z !== undefined) addPart('z_', transform.z);\n if (transform.flip) addPart('flip_', transform.flip);\n if (transform.br !== undefined) addPart('br_', transform.br);\n \n const resolvedFormat = transform.f ?? defaults?.f;\n const isGifOutput =\n typeof resolvedFormat === 'string' && resolvedFormat.toLowerCase() === 'gif';\n if (resolvedFormat && resolvedFormat !== 'auto') addPart('f_', resolvedFormat);\n\n // Quality: for GIF, only honor explicit `transform.q` (e.g. 50 → q_50, 90 → q_90); skip defaults.q.\n const quality = isGifOutput ? transform.q : transform.q ?? defaults?.q;\n if (quality !== undefined && quality !== 'auto') addPart('q_', quality);\n\n // Background\n if (transform.bg) {\n if (transform.bg.startsWith('rgb:')) {\n addPart('bg_rgb:', transform.bg.replace('rgb:', ''));\n } else {\n addPart('bg_', transform.bg);\n }\n }\n \n // DPR (auto-inject if enabled and not explicitly set) — never for GIF output\n if (!isGifOutput) {\n if (enableDPR && transform.dpr === undefined) {\n const dpr = getDPR();\n if (dpr !== 1) addPart('dpr_', dpr);\n } else if (transform.dpr !== undefined) {\n addPart('dpr_', transform.dpr);\n }\n }\n \n // Effects (e_*)\n if (transform.improve !== undefined) {\n if (typeof transform.improve === 'boolean' && transform.improve) {\n addPart('e_improve', '');\n } else if (typeof transform.improve === 'string') {\n addPart('e_improve', transform.improve);\n } else if (typeof transform.improve === 'object') {\n const { mode, blend } = transform.improve;\n let value = mode || '';\n if (blend !== undefined) value += `:${blend}`;\n addPart('e_improve', value);\n }\n }\n if (transform.unsharpMask !== undefined) addPart('e_unsharp_mask:', transform.unsharpMask);\n if (transform.saturation !== undefined) addPart('e_saturation:', transform.saturation);\n if (transform.contrast !== undefined) addPart('e_contrast:', transform.contrast);\n if (transform.brightness !== undefined) addPart('e_brightness:', transform.brightness);\n if (transform.gamma !== undefined) addPart('e_gamma:', transform.gamma);\n if (transform.sharpen !== undefined) {\n if (typeof transform.sharpen === 'boolean' && transform.sharpen) {\n addPart('e_sharpen', '');\n } else {\n addPart('e_sharpen:', transform.sharpen);\n }\n }\n if (transform.grayscale) addPart('e_grayscale', '');\n if (transform.blackwhite !== undefined) addPart('e_blackwhite:', transform.blackwhite);\n if (transform.hue !== undefined) addPart('e_hue:', transform.hue);\n if (transform.warmth !== undefined) addPart('e_warmth:', transform.warmth);\n if (transform.tint !== undefined) addPart('e_tint:', transform.tint);\n if (transform.normalize) addPart('e_normalize', '');\n if (transform.invert) addPart('e_invert', '');\n if (transform.fade !== undefined) addPart('e_fade:', transform.fade);\n if (transform.vignette !== undefined) addPart('e_vignette:', transform.vignette);\n if (transform.highlights !== undefined) addPart('e_highlights:', transform.highlights);\n if (transform.shadows !== undefined) addPart('e_shadows:', transform.shadows);\n if (transform.exposure !== undefined) addPart('e_exposure:', transform.exposure);\n if (transform.structure !== undefined) addPart('e_structure:', transform.structure);\n if (transform.autoEnhance) addPart('e_auto_enhance', '');\n if (transform.temperature !== undefined) addPart('e_temperature:', transform.temperature);\n if (transform.linear) addPart('e_linear:', transform.linear);\n if (transform.recomb) addPart('e_recomb:', transform.recomb);\n if (transform.threshold !== undefined) addPart('e_threshold:', transform.threshold);\n if (transform.convolve) addPart('e_convolve:', transform.convolve);\n if (transform.unflatten) addPart('e_unflatten', '');\n if (transform.flatten) addPart('e_flatten', '');\n if (transform.median !== undefined) addPart('e_median:', transform.median);\n if (transform.blur !== undefined) addPart('e_blur:', transform.blur);\n if (transform.extend) addPart('e_extend:', transform.extend);\n if (transform.affine) addPart('e_affine:', transform.affine);\n if (transform.extract) addPart('e_extract:', transform.extract);\n if (transform.ensureAlpha) addPart('e_ensure_alpha', '');\n if (transform.removeAlpha) addPart('e_remove_alpha:', transform.removeAlpha);\n \n // Blend mode (for layers)\n if (transform.blend) addPart('e_', transform.blend);\n \n // Raw transformations (for advanced users)\n Object.keys(transform).forEach(key => {\n if (key.startsWith('_') || \n ['w', 'h', 'fit', 'ar', 'position', 'position_startagy', 'focus', 'so', 'eo', 'r', 'z', 'flip', 'br', 'f', 'q', 'bg', 'dpr',\n 'improve', 'unsharpMask', 'saturation', 'contrast', 'brightness', 'gamma', 'sharpen',\n 'grayscale', 'blackwhite', 'hue', 'warmth', 'tint', 'normalize', 'invert', 'fade',\n 'vignette', 'highlights', 'shadows', 'exposure', 'structure', 'autoEnhance', 'temperature',\n 'linear', 'recomb', 'threshold', 'convolve', 'unflatten', 'flatten', 'median', 'blur',\n 'extend', 'affine', 'extract', 'ensureAlpha', 'removeAlpha', 'blend', 'layers'].includes(key)) {\n return; // Skip already processed keys\n }\n \n // Allow raw transformation strings\n if (typeof transform[key] === 'string' || typeof transform[key] === 'number' || typeof transform[key] === 'boolean') {\n addPart(key, transform[key] as any);\n }\n });\n \n // Sort base transformation parts deterministically by param prefix\n parts.sort((a, b) => {\n // Extract prefix for comparison\n const prefixA = a.param.split('_')[0] + '_';\n const prefixB = b.param.split('_')[0] + '_';\n \n if (prefixA !== prefixB) {\n return prefixA.localeCompare(prefixB);\n }\n \n // Same prefix, compare full param\n return a.param.localeCompare(b.param);\n });\n \n // Build base transformation string\n const baseTransform = parts.map(p => {\n if (p.value === '') {\n return p.param; // Boolean flags without values\n }\n return `${p.param}${p.value}`;\n }).join(',');\n \n // Build layers separately - each layer must end with fl_layer_apply\n const layerParts: string[] = [];\n if (transform.layers && transform.layers.length > 0) {\n transform.layers.forEach(layer => {\n const layerTransformParts: TransformationPart[] = [];\n \n const addLayerPart = (param: string, value: string | number | boolean) => {\n if (value === undefined || value === null) return;\n \n let valueStr: string;\n if (typeof value === 'boolean') {\n valueStr = value ? '' : '';\n if (!value) return; // Skip false booleans\n } else {\n valueStr = String(value);\n }\n \n layerTransformParts.push({\n param,\n value: valueStr,\n sortKey: param\n });\n };\n \n buildLayerTransform(layer, addLayerPart);\n \n // Sort layer parts with specific order (not alphabetical)\n // Order: l_image/l_text first, then ip_/tp_, then other params, then fl_layer_apply\n const applyFlag = layerTransformParts.find(p => p.param === 'fl_layer_apply');\n const regularParts = layerTransformParts.filter(p => p.param !== 'fl_layer_apply');\n \n // Define order priority for layer parameters\n const getLayerParamOrder = (param: string): number => {\n // l_image or l_text must be first\n if (param.startsWith('l_image:') || param.startsWith('l_text:')) return 0;\n // ip_ (image placement) or tp_ (text placement) comes right after l_image/l_text\n if (param.startsWith('ip_') || param.startsWith('tp_')) return 1;\n // l_type comes after placement\n if (param.startsWith('l_type:')) return 2;\n // lw_, lh_ come after l_type\n if (param.startsWith('lw_')) return 3;\n if (param.startsWith('lh_')) return 4;\n // o_ (opacity) comes after dimensions\n if (param.startsWith('o_')) return 5;\n // Other l* layer params (not lzoom_; see below)\n if (param.startsWith('l') && !param.startsWith('lzoom_')) return 6;\n // co_ (color) for text\n if (param.startsWith('co_')) return 7;\n // a_ (rotation) for text\n if (param.startsWith('a_')) return 8;\n // lr_ (rotation) for image\n if (param.startsWith('lr_')) return 8;\n // lzoom_ after placement/color/rotation, before offsets\n if (param.startsWith('lzoom_')) return 9;\n // x_, y_ offsets\n if (param.startsWith('x_') || param.startsWith('y_')) return 10;\n // le_ (layer enhancements)\n if (param.startsWith('le_')) return 11;\n // e_ (blend mode)\n if (param.startsWith('e_')) return 12;\n // Everything else\n return 100;\n };\n \n regularParts.sort((a, b) => {\n const orderA = getLayerParamOrder(a.param);\n const orderB = getLayerParamOrder(b.param);\n \n if (orderA !== orderB) {\n return orderA - orderB;\n }\n \n // Same order priority, sort alphabetically\n return a.param.localeCompare(b.param);\n });\n \n // Build layer string: regular parts + fl_layer_apply at the end\n const layerString = [\n ...regularParts.map(p => p.value === '' ? p.param : `${p.param}${p.value}`),\n ...(applyFlag ? [applyFlag.param] : [])\n ].join(',');\n \n if (layerString) {\n layerParts.push(layerString);\n }\n });\n }\n \n // Combine: base transformations + layers\n const allParts = baseTransform ? [baseTransform, ...layerParts] : layerParts;\n return allParts.join(',');\n}\n\nfunction buildLayerTransform(layer: LayerOptions, addPart: (param: string, value: string | number | boolean) => void) {\n if (layer.type === 'text') {\n // Build text layer: l_text:fontFamily_fontSize_style:text\n // Example: l_text:arial_24_bold:Demo\n const parts: string[] = [];\n if (layer.fontFamily) parts.push(layer.fontFamily);\n if (layer.fontSize !== undefined) parts.push(String(layer.fontSize));\n if (layer.fontStyle) parts.push(layer.fontStyle);\n if (layer.align) parts.push(layer.align);\n \n const text = layer.text ? encodeURIComponent(layer.text) : '';\n const layerSpec = parts.length > 0 ? `${parts.join('_')}:${text}` : text;\n addPart('l_text:', layerSpec);\n \n // Text layer modifiers (after l_text)\n if (layer.fontColor) {\n // Remove # if present, convert to hex without #\n const color = layer.fontColor.replace('#', '');\n addPart('co_', color);\n }\n if (layer.placement) {\n // Convert placement to short form if needed\n const placement = normalizePlacement(layer.placement);\n if (placement) addPart('tp_', placement);\n }\n if (layer.rotation !== undefined) addPart('a_', layer.rotation);\n if (layer.x !== undefined) addPart('x_', layer.x);\n if (layer.y !== undefined) addPart('y_', layer.y);\n } else if (layer.type === 'image') {\n // Image layer: l_image:imagePath\n // Order: l_image, l_type, lw, lh, ip, o, fl_layer_apply\n // Example: l_image:fav.png,l_type:overlay,lw_200,lh_200,ip_ne,o_100,fl_layer_apply\n if (layer.imagePath) {\n addPart('l_image:', layer.imagePath);\n }\n \n // Image layer modifiers in correct order\n if (layer.layerType) addPart('l_type:', layer.layerType);\n if (layer.width !== undefined) addPart('lw_', layer.width);\n if (layer.height !== undefined) addPart('lh_', layer.height);\n if (layer.placement) {\n // Convert placement to short form if needed\n const placement = normalizePlacement(layer.placement);\n if (placement) addPart('ip_', placement);\n }\n if (layer.opacity !== undefined) addPart('o_', layer.opacity);\n if (layer.rotation !== undefined) addPart('lr_', layer.rotation);\n if (layer.crop) addPart('lc_', layer.crop);\n if (layer.aspectRatio) addPart('lar_', layer.aspectRatio);\n if (layer.quality !== undefined) addPart('lq_', layer.quality);\n if (layer.format) addPart('lf_', layer.format);\n if (layer.background) addPart('lbg_', layer.background);\n if (layer.position) addPart('lp_', layer.position);\n if (layer.borderRadius !== undefined) addPart('lbr_', layer.borderRadius);\n if (layer.flip) addPart('lflip_', layer.flip);\n if (layer.zoom !== undefined) addPart('lzoom_', layer.zoom);\n if (layer.x !== undefined) addPart('x_', layer.x);\n if (layer.y !== undefined) addPart('y_', layer.y);\n if (layer.blendMode) addPart('e_', layer.blendMode);\n \n // Layer enhancements (le_*)\n if (layer.enhance) {\n const enhance = layer.enhance;\n if (enhance.improve !== undefined) {\n if (typeof enhance.improve === 'boolean' && enhance.improve) {\n addPart('le_improve', '');\n } else if (typeof enhance.improve === 'string') {\n addPart('le_improve', enhance.improve);\n }\n }\n if (enhance.sharpen !== undefined) addPart('le_sharpen:', enhance.sharpen);\n if (enhance.brightness !== undefined) addPart('le_brightness:', enhance.brightness);\n if (enhance.saturation !== undefined) addPart('le_saturation:', enhance.saturation);\n if (enhance.contrast !== undefined) addPart('le_contrast:', enhance.contrast);\n if (enhance.hue !== undefined) addPart('le_hue:', enhance.hue);\n if (enhance.warmth !== undefined) addPart('le_warmth:', enhance.warmth);\n if (enhance.tint !== undefined) addPart('le_tint:', enhance.tint);\n if (enhance.normalize) addPart('le_normalize', '');\n if (enhance.invert) addPart('le_invert', '');\n if (enhance.fade !== undefined) addPart('le_fade:', enhance.fade);\n if (enhance.vignette !== undefined) addPart('le_vignette:', enhance.vignette);\n if (enhance.highlights !== undefined) addPart('le_highlights:', enhance.highlights);\n if (enhance.shadows !== undefined) addPart('le_shadows:', enhance.shadows);\n if (enhance.exposure !== undefined) addPart('le_exposure:', enhance.exposure);\n if (enhance.structure !== undefined) addPart('le_structure:', enhance.structure);\n if (enhance.autoEnhance) addPart('le_auto_enhance', '');\n if (enhance.temperature !== undefined) addPart('le_temperature:', enhance.temperature);\n if (enhance.blackwhite !== undefined) addPart('le_blackwhite:', enhance.blackwhite);\n if (enhance.gamma !== undefined) addPart('le_gamma:', enhance.gamma);\n if (enhance.unsharpMask !== undefined) addPart('le_unsharp_mask:', enhance.unsharpMask);\n if (enhance.grayscale) addPart('le_grayscale', '');\n }\n }\n \n // Layer apply flag (always at the end)\n addPart('fl_layer_apply', '');\n}\n\n/**\n * Normalize placement values to short form\n * north -> n, north-east -> ne, etc.\n */\nfunction normalizePlacement(placement: string): string {\n const normalized = placement.trim().toLowerCase().replace(/\\s+/g, ' ');\n const mapping: Record<string, string> = {\n 'north': 'n',\n 'south': 's',\n 'east': 'e',\n 'west': 'w',\n 'center': 'c',\n 'north-west': 'nw',\n 'north west': 'nw',\n 'north-east': 'ne',\n 'north east': 'ne',\n 'south-west': 'sw',\n 'south west': 'sw',\n 'south-east': 'se',\n 'south east': 'se',\n 'none': 'none'\n };\n return mapping[normalized] || normalized;\n}\n\n","/**\n * URL builder for AutoRender image URLs\n */\n\nimport { buildTransformString } from './transform';\nimport type { TransformOptions } from './types';\n\nconst ABSOLUTE_URL_RE = /^https?:\\/\\//i;\n\n/**\n * Workspace path segment for `ar.url()` / ARImage `src`.\n *\n * - Relative paths (`products/shoe.jpg`): each path segment is encoded separately.\n * - Absolute URLs (`https://demo.com/photo.jpg`): emitted as `fetch_<url>`.\n */\nexport function encodeAssetPathForDelivery(src: string): string {\n const trimmed = src.trim();\n if (!trimmed) {\n return '';\n }\n\n if (ABSOLUTE_URL_RE.test(trimmed)) {\n const fetchPayload = `fetch_${trimmed}`;\n return encodeURIComponent(fetchPayload);\n }\n\n if (trimmed.startsWith('fetch_')) {\n return encodeURIComponent(trimmed);\n }\n\n return trimmed\n .split('/')\n .filter(Boolean)\n .map(segment => encodeURIComponent(segment))\n .join('/');\n}\n\nexport function buildImageUrl(\n baseUrl: string,\n workspace: string,\n src: string,\n transform?: TransformOptions,\n defaults?: { f?: string; q?: string | number; [key: string]: any },\n enableDPR: boolean = true\n): string {\n // Normalize base URL (remove trailing slashes)\n const normalizedBase = baseUrl.replace(/\\/+$/, '');\n \n // Build transformation string\n const transformStr = buildTransformString(transform || {}, defaults, enableDPR);\n\n const trimmedSrc = src.trim();\n\n // Remote fetch support:\n // For `https://...` sources, the backend expects the `fetch_...` token to be part\n // of the transformation segment (comma-separated), not a separate path segment.\n if (ABSOLUTE_URL_RE.test(trimmedSrc)) {\n const fetchPart = `fetch_${trimmedSrc}`;\n const transformWithFetch = transformStr ? `${transformStr},${fetchPart}` : fetchPart;\n return `${normalizedBase}/${workspace}/${transformWithFetch}`;\n }\n\n // Support callers passing an already-prefixed fetch token.\n if (trimmedSrc.startsWith('fetch_')) {\n const fetchPart = trimmedSrc;\n const transformWithFetch = transformStr ? `${transformStr},${fetchPart}` : fetchPart;\n return `${normalizedBase}/${workspace}/${transformWithFetch}`;\n }\n\n const encodedPath = encodeAssetPathForDelivery(trimmedSrc);\n \n // Build URL: baseUrl/workspace/transformations/file_path\n if (transformStr) {\n return `${normalizedBase}/${workspace}/${transformStr}/${encodedPath}`;\n }\n\n return `${normalizedBase}/${workspace}/${encodedPath}`;\n}\n\n","/**\n * Responsive image attributes generator\n * Implements three strategies based on input options\n */\n\nimport { buildImageUrl } from './url-builder';\nimport type { ResponsiveOptions, ResponsiveAttributes, TransformOptions } from './types';\nimport { getDPR } from './device';\n\nconst DEFAULT_DEVICE_BREAKPOINTS = [640, 750, 828, 1080, 1200, 1920, 2048, 3840];\nconst DEFAULT_IMAGE_BREAKPOINTS = [16, 32, 48, 64, 96, 128, 256, 384];\n\n/**\n * Parse sizes attribute to extract minimum viewport width\n * Returns the smallest vw value found, or null if none found\n */\nfunction parseMinVWFromSizes(sizes: string): number | null {\n // Match patterns like \"33vw\", \"100vw\", \"(min-width: 800px) 33vw\"\n const vwMatches = sizes.match(/(\\d+(?:\\.\\d+)?)vw/g);\n if (!vwMatches || vwMatches.length === 0) return null;\n \n const vwValues = vwMatches.map(m => parseFloat(m));\n return Math.min(...vwValues);\n}\n\n/**\n * Find nearest breakpoint to a given width\n */\nfunction findNearestBreakpoint(width: number, breakpoints: number[]): number {\n return breakpoints.reduce((prev, curr) => {\n return Math.abs(curr - width) < Math.abs(prev - width) ? curr : prev;\n });\n}\n\n/**\n * Generate responsive image attributes\n * \n * Rule 1: width only → DPR strategy (1x and 2x)\n * Rule 2: sizes provided → width-based strategy\n * Rule 3: neither → all device breakpoints\n */\nexport function generateResponsiveAttributes(\n baseUrl: string,\n workspace: string,\n options: ResponsiveOptions,\n defaults?: { f?: string; q?: string | number; [key: string]: any },\n deviceBreakpoints: number[] = DEFAULT_DEVICE_BREAKPOINTS,\n imageBreakpoints: number[] = DEFAULT_IMAGE_BREAKPOINTS,\n enableDPR: boolean = true\n): ResponsiveAttributes {\n const { src, width, sizes, transform, breakpoints } = options;\n \n // Use custom breakpoints if provided, otherwise use defaults\n const effectiveBreakpoints = breakpoints || deviceBreakpoints;\n \n // Rule 1: width only → DPR strategy\n if (width !== undefined && !sizes) {\n const dpr = enableDPR ? getDPR() : 1;\n const baseWidth = width;\n \n // Generate 1x and 2x URLs\n const srcSetParts: string[] = [];\n \n // 1x URL\n const transform1x: TransformOptions = {\n ...transform,\n w: baseWidth,\n dpr: 1\n };\n const url1x = buildImageUrl(baseUrl, workspace, src, transform1x, defaults, false);\n srcSetParts.push(`${url1x} 1x`);\n \n // 2x URL (only if device DPR is actually >= 2)\n if (dpr >= 2) {\n const transform2x: TransformOptions = {\n ...transform,\n w: baseWidth,\n dpr: 2\n };\n const url2x = buildImageUrl(baseUrl, workspace, src, transform2x, defaults, false);\n srcSetParts.push(`${url2x} 2x`);\n }\n \n // Default `src` must match the 1x candidate (avoid enableDPR-only drift vs srcSet).\n const baseSrc = url1x;\n \n return {\n src: baseSrc,\n srcSet: srcSetParts.join(', '),\n width: baseWidth\n };\n }\n \n // Rule 2: sizes provided → width-based strategy\n if (sizes) {\n const minVW = parseMinVWFromSizes(sizes);\n \n // Filter breakpoints: only include those >= minimum required width\n // If we have a viewport width, calculate minimum pixel width needed\n // For simplicity, we'll use all breakpoints that make sense\n // In practice, you'd calculate based on viewport width\n const filteredBreakpoints = effectiveBreakpoints.filter(bp => {\n // Include all breakpoints for now\n // Could be optimized based on minVW calculation\n return true;\n });\n \n // Generate srcset with w descriptors\n const srcSetParts = filteredBreakpoints.map(bp => {\n const transformWithWidth: TransformOptions = {\n ...transform,\n w: bp\n };\n const url = buildImageUrl(baseUrl, workspace, src, transformWithWidth, defaults, enableDPR);\n return `${url} ${bp}w`;\n });\n \n // Base URL (use smallest breakpoint or provided width)\n const baseWidth = width || filteredBreakpoints[0] || effectiveBreakpoints[0];\n const baseTransform: TransformOptions = {\n ...transform,\n w: baseWidth\n };\n const baseSrc = buildImageUrl(baseUrl, workspace, src, baseTransform, defaults, enableDPR);\n \n return {\n src: baseSrc,\n srcSet: srcSetParts.join(', '),\n sizes: sizes,\n width: baseWidth\n };\n }\n \n // Rule 3: neither width nor sizes → all device breakpoints\n // Use all breakpoints with w descriptors\n const srcSetParts = effectiveBreakpoints.map(bp => {\n const transformWithWidth: TransformOptions = {\n ...transform,\n w: bp\n };\n const url = buildImageUrl(baseUrl, workspace, src, transformWithWidth, defaults, enableDPR);\n return `${url} ${bp}w`;\n });\n \n // Base URL (use smallest breakpoint)\n const baseWidth = effectiveBreakpoints[0];\n const baseTransform: TransformOptions = {\n ...transform,\n w: baseWidth\n };\n const baseSrc = buildImageUrl(baseUrl, workspace, src, baseTransform, defaults, enableDPR);\n \n return {\n src: baseSrc,\n srcSet: srcSetParts.join(', '),\n sizes: '100vw',\n width: baseWidth\n };\n}\n\n","/**\n * Main AutoRender client factory\n * Creates an AR instance with URL building and responsive image capabilities\n */\n\nimport { buildImageUrl } from './url-builder';\nimport { buildTransformString } from './transform';\nimport { generateResponsiveAttributes } from './responsive';\nimport { getDPR } from './device';\nimport type {\n CreateARConfig,\n ARInstance,\n TransformOptions,\n ResponsiveOptions,\n ResponsiveAttributes\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://assets.autorender.io';\nconst DEFAULT_DEVICE_BREAKPOINTS = [640, 750, 828, 1080, 1200, 1920, 2048, 3840];\nconst DEFAULT_IMAGE_BREAKPOINTS = [16, 32, 48, 64, 96, 128, 256, 384];\n\nexport function createAR(config: CreateARConfig): ARInstance {\n const {\n baseUrl = DEFAULT_BASE_URL,\n workspace,\n defaults = {},\n deviceBreakpoints = DEFAULT_DEVICE_BREAKPOINTS,\n imageBreakpoints = DEFAULT_IMAGE_BREAKPOINTS,\n enableDPR = true\n } = config;\n \n if (!workspace) {\n throw new Error('workspace is required');\n }\n \n const instance: ARInstance = {\n /**\n * Generate image URL with transformations\n */\n url(src: string, transform?: TransformOptions): string {\n return buildImageUrl(\n baseUrl,\n workspace,\n src,\n transform,\n defaults,\n enableDPR\n );\n },\n \n /**\n * Generate transformation string only (without URL)\n */\n transformString(transform: TransformOptions): string {\n return buildTransformString(\n transform,\n defaults,\n enableDPR\n );\n },\n \n /**\n * Generate responsive image attributes\n */\n responsiveImageAttributes(options: ResponsiveOptions): ResponsiveAttributes {\n // Allow per-call breakpoint override\n const effectiveDeviceBreakpoints = options.breakpoints || deviceBreakpoints;\n \n return generateResponsiveAttributes(\n baseUrl,\n workspace,\n options,\n defaults,\n effectiveDeviceBreakpoints,\n imageBreakpoints,\n enableDPR\n );\n },\n \n /**\n * Get current device pixel ratio\n */\n getDPR(): number {\n return getDPR();\n }\n };\n \n return instance;\n}\n\n","/**\n * Browser format detection utilities\n * Detects which image formats the browser supports\n */\n\nlet cachedFormat: string | null = null;\n\n/**\n * Detect the best image format supported by the browser\n * Priority: AVIF > WebP > JPEG\n * Uses synchronous detection for immediate results\n */\nexport function detectBestFormat(): string {\n if (cachedFormat !== null) {\n return cachedFormat;\n }\n\n if (typeof document === 'undefined' || typeof Image === 'undefined') {\n // Server-side or non-browser environment\n cachedFormat = 'webp';\n return cachedFormat;\n }\n\n // Synchronous detection using canvas.toDataURL\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n cachedFormat = 'webp';\n return cachedFormat;\n }\n\n // Test AVIF\n try {\n const avifDataURL = canvas.toDataURL('image/avif');\n if (avifDataURL && avifDataURL.indexOf('data:image/avif') === 0) {\n cachedFormat = 'avif';\n return cachedFormat;\n }\n } catch (e) {\n // AVIF not supported\n }\n\n // Test WebP\n try {\n const webpDataURL = canvas.toDataURL('image/webp');\n if (webpDataURL && webpDataURL.indexOf('data:image/webp') === 0) {\n cachedFormat = 'webp';\n return cachedFormat;\n }\n } catch (e) {\n // WebP not supported\n }\n\n // Fallback to JPEG\n cachedFormat = 'jpg';\n return cachedFormat;\n } catch (e) {\n // Fallback to WebP if detection fails\n cachedFormat = 'webp';\n return cachedFormat;\n }\n}\n\n\n/**\n * Get the best format synchronously (uses cached value or detects)\n */\nexport function getBestFormatSync(): string {\n if (cachedFormat !== null) {\n return cachedFormat;\n }\n return detectBestFormat();\n}\n\n/**\n * Reset cached format (useful for testing)\n */\nexport function resetFormatCache(): void {\n cachedFormat = null;\n}\n\n","import { AutorenderApiClient } from './client/api-client';\nimport { UploaderController } from './core/uploader-controller';\nimport type { ControllerOptions } from './core/uploader-controller';\nimport { DEFAULT_THEME, DEFAULT_SOURCES, DEFAULT_ASSET_DELIVERY_BASE_URL } from './constants/defaults';\nimport type {\n CreateUploaderOptions,\n UploaderInstance,\n ThemeOptions,\n UploadSourceOption,\n} from './types';\nimport { AutorenderUploaderElement } from './widget/uploader-element';\n\ntype ThemeName = 'light' | 'dark' | 'system';\n\nconst SOURCE_ALIAS_MAP: Record<string, string> = {\n local: 'device',\n device: 'device',\n fromdevice: 'device',\n camera: 'camera',\n facebook: 'facebook',\n fb: 'facebook',\n insta: 'facebook',\n instagram: 'facebook',\n gdrive: 'google-drive',\n googledrive: 'google-drive',\n google: 'google-drive',\n googledisk: 'google-drive',\n 'google-drive': 'google-drive',\n};\n\nfunction ensureCustomElement() {\n if (\n typeof globalThis === 'undefined' ||\n typeof globalThis.customElements === 'undefined'\n ) {\n return;\n }\n if (!globalThis.customElements.get(AutorenderUploaderElement.tagName)) {\n globalThis.customElements.define(\n AutorenderUploaderElement.tagName,\n AutorenderUploaderElement\n );\n }\n}\n\nfunction resolveTarget(target: string | HTMLElement): HTMLElement {\n if (typeof target === 'string') {\n const element = document.querySelector<HTMLElement>(target);\n if (!element) {\n throw new Error(`Target element \"${target}\" not found`);\n }\n return element;\n }\n return target;\n}\n\nfunction resolveContainer(container?: string | HTMLElement): HTMLElement | null {\n if (!container) return null;\n if (typeof container === 'string') {\n const element = document.querySelector<HTMLElement>(container);\n if (!element) {\n throw new Error(`Container element \"${container}\" not found`);\n }\n return element;\n }\n return container;\n}\n\nfunction resolveThemePreset(theme?: ThemeName): ThemeOptions {\n const base = {\n borderRadius: DEFAULT_THEME.borderRadius,\n dropzoneBackground: DEFAULT_THEME.dropzoneBackground,\n dropzoneBorder: DEFAULT_THEME.dropzoneBorder,\n };\n\n switch (theme) {\n case 'dark':\n return {\n appearance: 'dark',\n ...base,\n };\n case 'system':\n return {\n appearance: 'system',\n ...base,\n };\n default:\n return {\n appearance: 'light',\n ...base,\n };\n }\n}\n\nfunction resolveSourcesConfig(input?: string | string[]): UploadSourceOption[] {\n if (input === undefined || input === null) {\n return [];\n }\n\n const provided = Array.isArray(input)\n ? input\n : input\n .split(',')\n .map(entry => entry.trim())\n .filter(Boolean);\n\n if (provided.length === 0) {\n return [];\n }\n\n const resolved: UploadSourceOption[] = [];\n const seen = new Set<string>();\n\n for (const entry of provided) {\n const normalized = entry.toLowerCase().replace(/[\\s_-]+/g, '');\n const mappedId = SOURCE_ALIAS_MAP[normalized] ?? normalized;\n if (seen.has(mappedId)) continue;\n const match = DEFAULT_SOURCES.find(option => option.id === mappedId);\n if (match) {\n resolved.push(match);\n seen.add(mappedId);\n }\n }\n\n return resolved;\n}\n\nfunction normalizeOptions(\n options: Partial<CreateUploaderOptions>,\n applyDefaults = false\n): Partial<ControllerOptions> {\n const {\n type,\n theme,\n sources,\n classNames,\n labels,\n fileLayout,\n showGridFileName,\n apiKey: _apiKey,\n target: _target,\n ...rest\n } = options;\n\n const normalized: any = { ...rest };\n\n if (type !== undefined) {\n normalized.type = type === 'button' ? 'button' : 'inline';\n } else if (applyDefaults) {\n normalized.type = 'inline';\n }\n\n if (theme !== undefined) {\n normalized.theme = resolveThemePreset(theme);\n } else if (applyDefaults) {\n normalized.theme = resolveThemePreset('light');\n }\n\n if (options.palette !== undefined) {\n normalized.palette = options.palette;\n } else if (applyDefaults) {\n normalized.palette = 'at-blue';\n }\n\n if (sources !== undefined) {\n normalized.sources = resolveSourcesConfig(sources);\n } else if ('sources' in options) {\n // Explicitly undefined - means no sources (all disabled)\n normalized.sources = [];\n } else if (applyDefaults) {\n normalized.sources = [];\n }\n\n if (classNames !== undefined) {\n normalized.classNames = classNames;\n }\n\n if (labels !== undefined) {\n normalized.labels = labels;\n }\n\n if (fileLayout !== undefined) {\n normalized.fileLayout = fileLayout;\n } else if (applyDefaults) {\n normalized.fileLayout = 'list';\n }\n\n if (showGridFileName !== undefined) {\n normalized.showGridFileName = showGridFileName;\n } else if (applyDefaults) {\n normalized.showGridFileName = true;\n }\n\n if (options.assetDeliveryBaseUrl !== undefined) {\n normalized.assetDeliveryBaseUrl = options.assetDeliveryBaseUrl;\n } else if (applyDefaults) {\n normalized.assetDeliveryBaseUrl = DEFAULT_ASSET_DELIVERY_BASE_URL;\n }\n\n return normalized;\n}\n\nexport function createUploader(options: CreateUploaderOptions): UploaderInstance {\n // If container is provided, use it as the target so the entire widget renders inside it\n const container = resolveContainer(options.container);\n const defaultTarget = resolveTarget(options.target);\n const resolvedTarget = container || defaultTarget;\n \n ensureCustomElement();\n\n const widget = document.createElement(\n AutorenderUploaderElement.tagName\n ) as AutorenderUploaderElement;\n\n // Clear target and mount widget\n resolvedTarget.innerHTML = '';\n resolvedTarget.appendChild(widget);\n\n const client = new AutorenderApiClient({\n apiKey: options.apiKey,\n environment: options.environment,\n });\n\n const controllerOptions = normalizeOptions(options, true) as ControllerOptions;\n \n // Only set container in options if it's different from target (for portal logic)\n // If container is the same as target, we don't need portal\n if (container && container !== resolvedTarget) {\n controllerOptions.container = container;\n } else {\n // Clear container option if it's the same as target\n controllerOptions.container = undefined;\n }\n\n const controller = new UploaderController(\n client,\n widget,\n controllerOptions\n );\n\n widget.setController(controller, controllerOptions);\n\n return {\n openFileDialog: () => widget.openFileDialog(),\n startUpload: () => controller.uploadAll(),\n reset: () => controller.reset(),\n destroy: () => {\n controller.cancel();\n controller.reset();\n widget.remove();\n },\n updateOptions: (partialOptions: Partial<CreateUploaderOptions>) => {\n const normalized = normalizeOptions(partialOptions, false);\n controller.setOptions(normalized);\n widget.updateOptions(normalized);\n },\n getState: () => controller.getState(),\n };\n}\n\nexport * from './types';\nexport function registerAutorenderUploaderElement() {\n ensureCustomElement();\n}\n\n// ViewTag SDK exports\nexport { encodeAssetPathForDelivery } from './viewtag/url-builder';\nexport { isGifFormatOutput } from './viewtag/transform';\nexport { createAR } from './viewtag/create-ar';\nexport { detectBestFormat, getBestFormatSync, resetFormatCache } from './viewtag/format-detection';\nexport type {\n CreateARConfig,\n ARInstance,\n TransformOptions,\n ResponsiveOptions,\n ResponsiveAttributes,\n LayerOptions,\n LayerEnhancementOptions\n} from './viewtag/types';\n\n"],"mappings":"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;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEO,IAAM,YAAY;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;;;ACxVO,IAAM,iCAAiC;AAU9C,eAAsB,iBAAiB,MAAM,SAAS;AACrD,SAAO,IAAI,eAAe,OAAO,EAAE,SAAS,IAAI;AACjD;AAEA,SAAS,wBAAwB,UAAU;AAC1C,aAAW,SAAS,YAAY;AAChC,UAAQ,UAAU;AAAA,IACjB,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["debug","useColors","debug","initDebug","item","message","containerStyle","baseWidth","srcSetParts","baseSrc","baseTransform","DEFAULT_BASE_URL","DEFAULT_DEVICE_BREAKPOINTS","DEFAULT_IMAGE_BREAKPOINTS"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants/defaults.ts","../src/client/api-client.ts","../src/utils/helpers.ts","../src/core/uploader-controller.ts","../src/widget/styles.ts","../src/widget/uploader-element.ts","../src/viewtag/device.ts","../src/viewtag/transform.ts","../src/viewtag/url-builder.ts","../src/viewtag/responsive.ts","../src/viewtag/create-ar.ts","../src/viewtag/format-detection.ts","../src/index.ts"],"sourcesContent":["import type { IconSet, LabelSet, ThemeOptions, UploadSourceOption } from '../types';\n\nexport type Environment = 'prod' | 'dev';\n\nexport function getBaseUrl(environment: Environment = 'prod'): string {\n switch (environment) {\n case 'dev':\n return 'https://upload-dev.autorender.io/api/v1';\n case 'prod':\n default:\n return 'https://upload.autorender.io/api/v1';\n }\n}\n\nexport const DEFAULT_BASE_URL = getBaseUrl('prod');\n\nexport const DEFAULT_ASSET_DELIVERY_BASE_URL = 'https://dev.autorender.io';\n\n\nexport const DEFAULT_LABELS: Required<LabelSet> = {\n title: 'Upload files',\n description: 'Drag & drop files or click to browse.',\n selectButton: 'Upload files',\n selectFolderButton: 'Upload folder',\n uploadButton: 'Upload',\n uploading: 'Uploading...',\n uploadComplete: 'All files uploaded successfully.',\n uploadFailed: 'Unable to upload files. Please try again.',\n retry: 'Retry',\n remove: 'Remove',\n addMore: 'Add more',\n done: 'Done',\n clear: 'Clear',\n cancel: 'Cancel',\n dropzoneTitle: 'Drop files here',\n duplicateFileExists: 'The following file already exists in this folder:',\n duplicateFilesExist: 'The following files already exist in this folder:',\n duplicateFileError: 'File already exists in this folder.',\n invalidApiKey: 'Invalid API key. Please verify your credentials and try again.',\n};\n\nexport const DEFAULT_ICONS: Required<IconSet> = {\n upload: `\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M12 16a1 1 0 0 1-1-1V7.41l-2.3 2.3a1 1 0 1 1-1.4-1.42l4-4a1 1 0 0 1 1.4 0l4 4a1 1 0 1 1-1.4 1.42L13 7.41V15a1 1 0 0 1-1 1Z\" />\n <path d=\"M5 20a3 3 0 0 1-3-3v-1a1 1 0 0 1 2 0v1a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-1a1 1 0 1 1 2 0v1a3 3 0 0 1-3 3Z\" />\n </svg>\n `,\n success: `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M9.5 17a1 1 0 0 1-.7-.29l-3.5-3.5a1 1 0 1 1 1.4-1.42l2.8 2.79 7.1-7.09a1 1 0 0 1 1.4 1.42l-7.8 7.79a1 1 0 0 1-.7.3Z\" fill=\"currentColor\" />\n </svg>\n `,\n error: `\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" >\n <path d=\"m12 13.41 3.29 3.3a1 1 0 0 0 1.42-1.42L13.41 12l3.3-3.29a1 1 0 0 0-1.42-1.42L12 10.59l-3.29-3.3a1 1 0 1 0-1.42 1.42L10.59 12l-3.3 3.29a1 1 0 0 0 1.42 1.42L12 13.41Z\" />\n </svg>\n `,\n remove: `\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M9 5.25C9 4.55964 9.55964 4 10.25 4H13.75C14.4404 4 15 4.55964 15 5.25V7H9V5.25Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n />\n <path\n d=\"M5 7H19\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n <rect\n x=\"6.5\"\n y=\"7\"\n width=\"11\"\n height=\"12.5\"\n rx=\"2\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n />\n <path\n d=\"M10 11.5V16\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n <path\n d=\"M14 11.5V16\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n `,\n close: `\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M13.41 12 18 7.41 16.59 6 12 10.59 7.41 6 6 7.41 10.59 12 6 16.59 7.41 18 12 13.41 16.59 18 18 16.59 13.41 12Z\" />\n </svg>\n `,\n};\n\nexport const DEFAULT_SOURCES: UploadSourceOption[] = [\n {\n id: 'device',\n label: 'From device',\n kind: 'device',\n icon: `\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"4\" y=\"5\" width=\"16\" height=\"14\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"M9.5 4h5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n `,\n },\n {\n id: 'camera',\n label: 'Camera',\n kind: 'camera',\n icon: `\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 7h2l1-2h8l1 2h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" />\n <circle cx=\"12\" cy=\"13\" r=\"3.25\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n </svg>\n `,\n },\n {\n id: 'facebook',\n label: 'Facebook',\n kind: 'facebook',\n icon: `\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"M13 8h2V6h-2a3 3 0 0 0-3 3v1H8v2h2v6h2v-6h2v-2h-2V9a1 1 0 0 1 1-1Z\" fill=\"currentColor\" />\n </svg>\n `,\n },\n {\n id: 'google-drive',\n label: 'Google Drive',\n kind: 'google-drive',\n icon: `\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M6.5 18.5h11l3-5-5-8h-6l-5 8 2 3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" />\n <path d=\"M8 13.5h8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n `,\n },\n];\n\nexport const DEFAULT_THEME: Required<\n Pick<ThemeOptions, 'appearance' | 'borderRadius' | 'dropzoneBackground' | 'dropzoneBorder'>\n> = {\n appearance: 'light',\n borderRadius: 8,\n dropzoneBackground: 'var(--ar-color-muted)',\n dropzoneBorder: 'var(--ar-color-border)',\n};\n\n","import { getBaseUrl } from '../constants/defaults';\nimport type { AppRunnerResponse, UploadSettings, Environment } from '../types';\n\ninterface UploadFileParams {\n file: File;\n folderPath?: string;\n relativePath?: string;\n settings?: UploadSettings;\n}\n\ninterface NewUploadResponse {\n id: string;\n workspace_id: string;\n name: string;\n path: string;\n url: string;\n width?: number;\n height?: number;\n size: number;\n format?: string;\n mime_type?: string;\n hash?: string;\n tags?: string[];\n metadata?: Record<string, unknown> | null;\n custom_id?: string | null;\n is_private?: boolean;\n is_duplicate?: boolean;\n created_at: string;\n upload_source?: string;\n folder_no?: string | null;\n file_no?: string;\n}\n\nexport class AutorenderApiClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(opts: { apiKey: string; baseUrl?: string; environment?: Environment }) {\n if (!opts.apiKey) {\n throw new Error('apiKey is required');\n }\n this.apiKey = opts.apiKey;\n this.baseUrl = (opts.baseUrl || getBaseUrl(opts.environment || 'prod')).replace(/\\/+$/, '');\n }\n\n uploadFile(\n params: UploadFileParams,\n onProgress?: (progress: number) => void,\n signal?: AbortSignal\n ): Promise<AppRunnerResponse> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException('Upload aborted', 'AbortError'));\n return;\n }\n\n const xhr = new XMLHttpRequest();\n\n if (signal) {\n signal.addEventListener('abort', () => {\n xhr.abort();\n reject(new DOMException('Upload aborted', 'AbortError'));\n });\n }\n\n let lastProgress = 0;\n xhr.upload.onprogress = event => {\n if (event.lengthComputable && onProgress) {\n const progress = Math.round((event.loaded / event.total) * 100);\n lastProgress = progress;\n onProgress(progress);\n } else if (onProgress && event.loaded > 0) {\n const estimatedProgress = Math.min(\n 95,\n Math.round((event.loaded / (event.loaded + 1000000)) * 100)\n );\n if (estimatedProgress > lastProgress) {\n lastProgress = estimatedProgress;\n onProgress(estimatedProgress);\n }\n }\n };\n\n xhr.onerror = () => {\n reject(new Error(`Upload failed: ${xhr.statusText}`));\n };\n\n xhr.onload = () => {\n try {\n if (xhr.status < 200 || xhr.status >= 300) {\n const errorText = xhr.responseText || xhr.statusText;\n reject(new Error(`Upload failed: ${errorText}`));\n return;\n }\n const newResponse = JSON.parse(xhr.responseText) as NewUploadResponse;\n\n const response: AppRunnerResponse = {\n success: true,\n file_no: newResponse.file_no || newResponse.id,\n name: newResponse.name,\n url: newResponse.url,\n file_size: newResponse.size,\n format: newResponse.format,\n width: newResponse.width,\n height: newResponse.height,\n created_at: newResponse.created_at,\n path: newResponse.path,\n workspace_no: newResponse.workspace_id,\n isDuplicate: newResponse.is_duplicate || false,\n };\n\n resolve(response);\n } catch (error) {\n reject(new Error('Failed to parse response'));\n }\n };\n\n const endpoint = `${this.baseUrl}/uploads`;\n const formData = new FormData();\n formData.append('file', params.file);\n formData.append('file_name', params.file.name);\n if (params.folderPath) {\n formData.append('folder', params.folderPath);\n }\n if (params.settings?.tags?.length) {\n formData.append('tags', params.settings.tags.join(','));\n }\n if (params.settings?.pretransformations) {\n formData.append('transform', params.settings.pretransformations);\n }\n if (params.settings?.custom_id) {\n formData.append('custom_id', params.settings.custom_id);\n }\n\n xhr.open('POST', endpoint);\n xhr.setRequestHeader('Authorization', `Bearer ${this.apiKey}`);\n xhr.setRequestHeader('accept', 'application/json');\n xhr.send(formData);\n });\n }\n}\n\nexport {}\n\n","export function generateId(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n\n return 'id-' + Math.random().toString(36).slice(2, 11);\n}\n\nexport function chunkArray<T>(items: T[], chunkSize: number): T[][] {\n if (chunkSize <= 0) {\n return [items];\n }\n\n const chunks: T[][] = [];\n for (let i = 0; i < items.length; i += chunkSize) {\n chunks.push(items.slice(i, i + chunkSize));\n }\n return chunks;\n}\n\nexport function clamp(value: number, min = 0, max = 1) {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function formatBytes(bytes: number) {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const num = bytes / Math.pow(k, i);\n return `${num.toFixed(num > 10 ? 0 : 1)} ${sizes[i]}`;\n}\n\nexport function createElement<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n className?: string,\n textContent?: string\n): HTMLElementTagNameMap[T] {\n const element = document.createElement(tag);\n if (className) element.className = className;\n if (textContent) element.textContent = textContent;\n return element;\n}\n\nexport function resolveIcon(renderer: string | HTMLElement | (() => string | HTMLElement)) {\n if (typeof renderer === 'function') {\n return resolveIcon(renderer());\n }\n if (typeof renderer === 'string') {\n const template = document.createElement('template');\n template.innerHTML = renderer.trim();\n return template.content.firstElementChild as HTMLElement | null;\n }\n return renderer ? (renderer.cloneNode(true) as HTMLElement) : null;\n}\n\nexport function toCssVars(theme: {\n appearance?: 'light' | 'dark' | 'system';\n accentColor?: string;\n borderRadius?: number;\n fontFamily?: string;\n dropzoneBackground?: string;\n dropzoneBorder?: string;\n}) {\n const variables: Record<string, string> = {};\n if (theme.accentColor) {\n variables['--ar-accent'] = theme.accentColor;\n }\n if (theme.borderRadius !== undefined) {\n variables['--ar-radius'] = `${theme.borderRadius}px`;\n }\n if (theme.fontFamily) {\n variables['--ar-font-family'] = theme.fontFamily;\n }\n if (theme.dropzoneBackground) {\n variables['--ar-dropzone-bg'] = theme.dropzoneBackground;\n }\n if (theme.dropzoneBorder) {\n variables['--ar-dropzone-border'] = theme.dropzoneBorder;\n }\n return variables;\n}\n\nexport function applyCssVariables(\n element: HTMLElement,\n variables: Record<string, string>\n) {\n Object.entries(variables).forEach(([key, value]) => {\n element.style.setProperty(key, value);\n });\n}\n\nexport function getRelativeFolderPath(\n basePath: string | undefined,\n relativePath: string | undefined\n) {\n if (!relativePath) return undefined;\n\n const parts = relativePath\n .split('/')\n .map(segment => segment.trim())\n .filter(segment => segment && segment !== '.');\n\n if (parts.length <= 1) {\n return undefined;\n }\n\n const folderSegments = parts.slice(0, -1);\n\n if (basePath) {\n const baseSegments = basePath\n .split('/')\n .map(segment => segment.trim())\n .filter(segment => segment && segment !== '.');\n\n let offset = 0;\n while (\n offset < baseSegments.length &&\n offset < folderSegments.length &&\n folderSegments[offset] === baseSegments[offset]\n ) {\n offset += 1;\n }\n\n return offset < folderSegments.length\n ? folderSegments.slice(offset).join('/')\n : undefined;\n }\n\n return folderSegments.length ? folderSegments.join('/') : undefined;\n}\n\nexport function calculateBatchProgress(items: { progress: number }[]) {\n if (items.length === 0) return 0;\n const total = items.reduce((acc, item) => acc + item.progress, 0);\n return Math.round(total / items.length);\n}\n\nconst S3_URL_PATTERN = /^s3:\\/\\/([^/]+)\\/(.+)$/i;\n\nexport function sanitizeBaseUrl(baseUrl?: string): string | undefined {\n if (!baseUrl) return undefined;\n const trimmed = baseUrl.trim();\n if (!trimmed) return undefined;\n return trimmed.replace(/\\/+$/, '');\n}\n\nexport function extractWorkspaceFromUrl(url?: string): string | undefined {\n if (!url) return undefined;\n const s3Match = S3_URL_PATTERN.exec(url);\n if (s3Match) {\n return s3Match[1];\n }\n try {\n const parsed = new URL(url);\n const firstSegment = parsed.pathname.replace(/^\\/+/, '').split('/')[0];\n return firstSegment || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function extractPathFromUrl(url?: string): string | undefined {\n if (!url) return undefined;\n const s3Match = S3_URL_PATTERN.exec(url);\n if (s3Match) {\n return s3Match[2];\n }\n try {\n const parsed = new URL(url);\n const [, ...rest] = parsed.pathname.replace(/^\\/+/, '').split('/');\n return rest.length ? rest.join('/') : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function buildAssetDeliveryUrl(\n baseUrl: string | undefined,\n workspace?: string,\n path?: string,\n fallback?: string\n): string | undefined {\n const sanitizedBase = sanitizeBaseUrl(baseUrl);\n if (!sanitizedBase || !workspace || !path) {\n return fallback;\n }\n\n const normalizedPath = path\n .split('/')\n .filter(Boolean)\n .map(segment => encodeURIComponent(segment))\n .join('/');\n\n return `${sanitizedBase}/${workspace}/${normalizedPath}`.replace(/([^:]\\/)\\/+/g, '$1');\n}\n\n","import { AutorenderApiClient } from '../client/api-client';\nimport { DEFAULT_ASSET_DELIVERY_BASE_URL } from '../constants/defaults';\nimport type {\n CreateUploaderOptions,\n UploadItem,\n UploadedFileResponse,\n ThemeOptions,\n UploadSourceOption,\n AppRunnerResponse,\n UploadSuccessFile,\n} from '../types';\nimport {\n applyCssVariables,\n buildAssetDeliveryUrl,\n calculateBatchProgress,\n extractPathFromUrl,\n extractWorkspaceFromUrl,\n generateId,\n getRelativeFolderPath,\n sanitizeBaseUrl,\n toCssVars,\n} from '../utils/helpers';\n\nconst DEFAULT_PARALLEL_UPLOADS = 4;\nconst MAX_FILE_SIZE_BYTES = 100 * 1024 * 1024; // 100MB\n\ninterface FileSelection {\n file: File;\n relativePath?: string;\n}\n\nconst MIME_TYPE_BY_EXTENSION: Record<string, string> = {\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n avif: 'image/avif',\n svg: 'image/svg+xml',\n mp4: 'video/mp4',\n mov: 'video/quicktime',\n webm: 'video/webm',\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n pdf: 'application/pdf',\n};\n\nfunction inferMimeType(file: File): string {\n if (file.type && file.type !== 'application/octet-stream') {\n return file.type;\n }\n const extension = file.name.split('.').pop()?.toLowerCase();\n if (extension && MIME_TYPE_BY_EXTENSION[extension]) {\n return MIME_TYPE_BY_EXTENSION[extension];\n }\n return 'application/octet-stream';\n}\n\nexport interface ControllerOptions\n extends Omit<CreateUploaderOptions, 'target' | 'theme' | 'sources'> {\n theme?: ThemeOptions;\n sources?: UploadSourceOption[];\n}\n\nexport interface ControllerState {\n items: UploadItem[];\n isUploading: boolean;\n progress: number;\n duplicates: string[];\n}\n\ntype ControllerEvents =\n | 'statechange'\n | 'progress'\n | 'fileprogress'\n | 'error'\n | 'complete'\n | 'filesadded';\n\nexport class UploaderController extends EventTarget {\n private options: ControllerOptions;\n private readonly client: AutorenderApiClient;\n private items: UploadItem[] = [];\n private abortController: AbortController | null = null;\n private isUploading = false;\n private targetElement: HTMLElement;\n private duplicateConflicts = new Set<string>();\n\n private isAbortError(error: unknown): boolean {\n if (!error) return false;\n if (error instanceof DOMException && error.name === 'AbortError') return true;\n if (error instanceof Error && error.name === 'AbortError') return true;\n const message =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : '';\n return typeof message === 'string' && message.toLowerCase().includes('abort');\n }\n\n constructor(\n client: AutorenderApiClient,\n target: HTMLElement,\n options: ControllerOptions\n ) {\n super();\n this.client = client;\n this.targetElement = target;\n this.options = options;\n this.applyTheme();\n }\n\n setOptions(options: Partial<ControllerOptions>) {\n this.options = {\n ...this.options,\n ...options,\n };\n this.applyTheme();\n this.dispatch('statechange');\n }\n\n getOptions(): ControllerOptions {\n return this.options;\n }\n\n getState(): ControllerState {\n return {\n items: this.items,\n isUploading: this.isUploading,\n progress: calculateBatchProgress(this.items),\n duplicates: Array.from(this.duplicateConflicts),\n };\n }\n\n async addFiles(files: FileSelection[]) {\n const existingKeys = new Map<string, UploadItem>();\n const basePathKey = this.normalizePath(this.options.folderPath) ?? '';\n const buildKey = (file: File, folderPath?: string, relativePath?: string) =>\n `${basePathKey}::${folderPath ?? ''}::${relativePath ?? ''}::${file.name}::${file.size}`;\n\n this.items.forEach(item => {\n existingKeys.set(buildKey(item.file, item.folderPath, item.relativePath), item);\n });\n\n const filesWithMimeType = files.map(({ file, relativePath }) => ({\n file,\n relativePath,\n mimeType: inferMimeType(file),\n }));\n\n const newItems = filesWithMimeType.map(({ file, relativePath, mimeType }) => {\n const folderPath = getRelativeFolderPath(\n this.options.folderPath,\n relativePath\n ) ?? '';\n\n // Only create preview URL for images\n const previewUrl = mimeType.startsWith('image/')\n ? URL.createObjectURL(file)\n : undefined;\n\n // Check file size limit (100MB)\n const fileSizeMB = (file.size / (1024 * 1024)).toFixed(2);\n const info = file.size > MAX_FILE_SIZE_BYTES\n ? `File size (${fileSizeMB}MB) exceeds the maximum limit of 100MB`\n : undefined;\n\n const baseItem: UploadItem = {\n id: generateId(),\n file,\n relativePath,\n folderPath,\n status: 'pending' as const,\n progress: 0,\n previewUrl,\n info,\n };\n\n const key = buildKey(file, folderPath, relativePath);\n if (existingKeys.has(key)) {\n baseItem.status = 'completed';\n baseItem.progress = 100;\n baseItem.error = undefined;\n existingKeys.set(key, baseItem);\n return baseItem;\n }\n\n existingKeys.set(key, baseItem);\n return baseItem;\n });\n\n this.items = [...this.items, ...newItems];\n this.dispatch('filesadded', { items: newItems });\n\n const duplicates = newItems.filter(item => item.status === 'completed');\n if (duplicates.length) {\n this.markDuplicatesCompleted(duplicates);\n }\n\n this.dispatch('statechange');\n }\n\n removeFile(id: string) {\n const item = this.items.find(entry => entry.id === id);\n if (item?.previewUrl) {\n URL.revokeObjectURL(item.previewUrl);\n }\n this.items = this.items.filter(item => item.id !== id);\n if (item) {\n this.duplicateConflicts.delete(item.file.name);\n }\n this.dispatch('statechange');\n }\n\n reset() {\n this.abortController?.abort();\n this.abortController = null;\n this.isUploading = false;\n this.cleanupPreviews();\n this.items = [];\n this.duplicateConflicts.clear();\n this.dispatch('statechange');\n }\n\n async uploadAll() {\n if (this.isUploading) return;\n if (this.items.length === 0) return;\n\n this.duplicateConflicts.clear();\n this.isUploading = true;\n this.abortController = new AbortController();\n this.dispatch('statechange');\n\n try {\n await this.processUploads();\n const files = this.buildSuccessFiles();\n this.dispatch('complete', {\n items: this.items,\n files,\n });\n } catch (error) {\n if (this.isAbortError(error)) {\n this.dispatch('error', error);\n return;\n }\n this.annotateItemsWithError(error);\n this.dispatch('error', error);\n throw error;\n } finally {\n this.isUploading = false;\n this.abortController = null;\n this.dispatch('statechange');\n }\n }\n\n cancel() {\n this.abortController?.abort();\n this.abortController = null;\n }\n\n private isDuplicateError(error: unknown) {\n if (!error) return false;\n if (typeof error === 'object' && error !== null) {\n const status = (error as any).status ?? (error as any).statusCode;\n if (status === 409) {\n return true;\n }\n const code = (error as any).code;\n if (typeof code === 'string' && code.toLowerCase() === 'conflict') {\n return true;\n }\n }\n const message =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : '';\n const normalized = message.toLowerCase();\n return (\n normalized.includes('duplicate') ||\n normalized.includes('already exists') ||\n normalized.includes('status 409') ||\n normalized.includes('conflict 409') ||\n normalized.includes('409')\n );\n }\n\n private markDuplicatesCompleted(\n items: UploadItem[],\n duplicateNames?: string[],\n options: { annotateError?: boolean } = {}\n ): UploadItem[] {\n const normalizedNames =\n duplicateNames\n ?.map(name => name.trim().toLowerCase())\n .filter(Boolean) ?? [];\n const targetSet =\n normalizedNames.length > 0 ? new Set(normalizedNames) : null;\n\n const targetItems =\n targetSet !== null\n ? items.filter(item =>\n targetSet.has(item.file.name.trim().toLowerCase())\n )\n : items;\n\n const duplicates =\n targetSet !== null && targetItems.length === 0 ? items : targetItems;\n\n const { annotateError = true } = options;\n\n duplicates.forEach(item => {\n if (!item) return;\n\n const name = item.file.name;\n if (!this.duplicateConflicts.has(name)) {\n this.duplicateConflicts.add(name);\n }\n\n item.status = 'completed';\n item.progress = 100;\n item.error = annotateError ? 'duplicate' : undefined;\n this.dispatch('fileprogress', { item });\n });\n\n if (duplicates.length > 0) {\n this.dispatch('progress', {\n progress: calculateBatchProgress(this.items),\n items: this.items,\n });\n\n this.dispatch('statechange');\n }\n\n return duplicates;\n }\n\n private isAuthError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n const message =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : '';\n return (\n typeof message === 'string' &&\n message.toLowerCase().includes('unauthorized')\n );\n }\n\n const status = (error as any).status;\n if (typeof status === 'number' && (status === 401 || status === 403)) {\n return true;\n }\n\n const message =\n error instanceof Error\n ? error.message\n : typeof (error as any)?.message === 'string'\n ? (error as any).message\n : '';\n const normalized = String(message).toLowerCase();\n return (\n normalized.includes('unauthorized') ||\n normalized.includes('forbidden') ||\n normalized.includes('invalid api key')\n );\n }\n\n private annotateItemsWithError(error: unknown) {\n const isAuth = this.isAuthError(error);\n const fallbackMessage =\n error instanceof Error\n ? error.message\n : typeof (error as any)?.message === 'string'\n ? (error as any).message\n : 'Upload failed';\n\n let mutated = false;\n\n this.items.forEach(item => {\n if (item.status === 'completed') return;\n mutated = true;\n item.status = 'error';\n item.progress = item.progress ?? 0;\n item.error = isAuth ? 'invalid-api-key' : fallbackMessage;\n this.dispatch('fileprogress', { item });\n });\n\n if (mutated) {\n this.dispatch('progress', {\n progress: calculateBatchProgress(this.items),\n items: this.items,\n });\n this.dispatch('statechange');\n }\n }\n\n private async processUploads() {\n const allItems = this.items.filter(item => item.status !== 'completed');\n\n if (allItems.length === 0) {\n return;\n }\n\n const parallel = Math.max(1, this.options.parallelUploads ?? DEFAULT_PARALLEL_UPLOADS);\n const uploadSettings = this.options.uploadSettings;\n\n // Process all items in parallel with concurrency limit\n const tasks = allItems.map(item => async () => {\n if (this.abortController?.signal.aborted) {\n throw new Error('Upload cancelled');\n }\n\n try {\n await this.uploadSingleFile(item, uploadSettings);\n } catch (error) {\n if (this.isAbortError(error)) {\n return; // Don't mark as error for aborted uploads\n }\n if (this.isDuplicateError(error)) {\n this.markDuplicatesCompleted([item], [item.file.name], {\n annotateError: true,\n });\n } else {\n const err = error instanceof Error ? error : new Error(String(error));\n item.status = 'error';\n item.error = err.message;\n this.dispatch('fileprogress', { item });\n this.dispatch('statechange');\n }\n }\n });\n\n await this.runWithConcurrency(tasks, parallel);\n }\n\n private async uploadSingleFile(\n item: UploadItem,\n uploadSettings?: CreateUploaderOptions['uploadSettings']\n ) {\n // Check file size limit before uploading\n if (item.file.size > MAX_FILE_SIZE_BYTES) {\n // Don't upload, but keep status as pending and show info message\n const fileSizeMB = (item.file.size / (1024 * 1024)).toFixed(2);\n item.info = `File size (${fileSizeMB}MB) exceeds the maximum limit of 100MB`;\n this.dispatch('fileprogress', { item });\n this.dispatch('statechange');\n return; // Skip upload for files that are too large\n }\n\n item.status = 'uploading';\n item.progress = 0;\n this.dispatch('statechange');\n\n const folderPath = item.folderPath\n ? this.combinePaths(this.options.folderPath, item.folderPath)\n : this.normalizePath(this.options.folderPath);\n\n const appRunnerResponse: AppRunnerResponse = await this.client.uploadFile(\n {\n file: item.file,\n folderPath: folderPath ?? undefined,\n relativePath: item.relativePath,\n settings: uploadSettings\n ? {\n pretransformations: uploadSettings.pretransformations,\n tags: uploadSettings.tags,\n is_unique_suffix_name: uploadSettings.is_unique_suffix_name ?? false,\n custom_id: uploadSettings.custom_id,\n }\n : undefined,\n },\n progress => {\n item.progress = progress;\n this.dispatch('fileprogress', { item });\n this.dispatch('progress', {\n progress: calculateBatchProgress(this.items),\n items: this.items,\n });\n },\n this.abortController?.signal\n );\n\n if (!appRunnerResponse.success) {\n const error = new Error(appRunnerResponse.message ?? 'Upload failed');\n (error as any).code = appRunnerResponse.errorCode;\n throw error;\n }\n\n item.status = 'completed';\n item.progress = 100;\n item.response = {\n file_no: appRunnerResponse.file_no,\n name: appRunnerResponse.name,\n url: appRunnerResponse.url,\n file_size: appRunnerResponse.file_size,\n folder_no: undefined,\n path: appRunnerResponse.path,\n width: appRunnerResponse.width,\n height: appRunnerResponse.height,\n format: appRunnerResponse.format,\n workspace_no: appRunnerResponse.workspace_no,\n };\n item.uploadedAt = new Date(appRunnerResponse.created_at);\n\n if (appRunnerResponse.isDuplicate) {\n item.error = 'duplicate';\n }\n\n this.dispatch('fileprogress', { item });\n this.dispatch('progress', {\n progress: calculateBatchProgress(this.items),\n items: this.items,\n });\n this.dispatch('statechange');\n }\n\n\n\n private applyTheme() {\n if (!this.options.theme) return;\n const vars = toCssVars(this.options.theme);\n applyCssVariables(this.targetElement, vars);\n if (this.options.theme.appearance && this.options.theme.appearance !== 'system') {\n this.targetElement.dataset.theme = this.options.theme.appearance;\n } else {\n delete this.targetElement.dataset.theme;\n }\n }\n\n private dispatch(event: ControllerEvents, detail?: CustomEventInit['detail']) {\n const customEvent = new CustomEvent(event, { detail });\n this.dispatchEvent(customEvent);\n\n switch (event) {\n case 'progress':\n this.options.onProgress?.(\n (detail as any)?.progress ?? calculateBatchProgress(this.items),\n this.items\n );\n break;\n case 'fileprogress':\n this.options.onFileProgress?.((detail as any).item);\n break;\n case 'error':\n this.options.onError?.(\n detail instanceof Error ? detail : new Error(String(detail))\n );\n break;\n case 'complete':\n this.options.onSuccess?.((detail as any)?.files ?? []);\n break;\n default:\n break;\n }\n }\n\n private resolveAssetDeliveryBaseUrl() {\n return (\n sanitizeBaseUrl(this.options.assetDeliveryBaseUrl) ??\n DEFAULT_ASSET_DELIVERY_BASE_URL\n );\n }\n\n private buildSuccessFiles(): UploadSuccessFile[] {\n const baseUrl = this.resolveAssetDeliveryBaseUrl();\n\n return this.items\n .filter(item => item.status === 'completed' && item.response)\n .map(item => {\n const response = item.response as UploadedFileResponse;\n const workspace =\n response.workspace_no ?? extractWorkspaceFromUrl(response.url);\n const assetPath = response.path ?? extractPathFromUrl(response.url);\n const resolvedUrl =\n buildAssetDeliveryUrl(baseUrl, workspace, assetPath, response.url) ??\n response.url;\n\n return {\n id: item.id,\n previewUrl: item.previewUrl,\n file_no: response.file_no,\n name: response.name,\n url: resolvedUrl,\n input_file_size: item.file?.size ?? response.file_size ?? 0,\n output_file_size: response.file_size ?? 0,\n path: response.path ?? assetPath,\n width: response.width,\n height: response.height,\n format: response.format,\n workspace_no: workspace,\n uploadedAt: item.uploadedAt?.toISOString(),\n };\n });\n }\n\n private async runWithConcurrency(tasks: Array<() => Promise<void>>, limit: number) {\n const executing = new Set<Promise<void>>();\n\n for (const task of tasks) {\n if (this.abortController?.signal.aborted) {\n throw new Error('Upload cancelled');\n }\n\n const promise = task().finally(() => {\n executing.delete(promise);\n });\n executing.add(promise);\n\n if (executing.size >= limit) {\n await Promise.race(executing);\n }\n }\n\n await Promise.all(executing);\n }\n\n private cleanupPreviews() {\n this.items.forEach(item => {\n if (item.previewUrl) {\n URL.revokeObjectURL(item.previewUrl);\n item.previewUrl = undefined;\n }\n });\n }\n\n private normalizePath(path?: string): string | undefined {\n if (!path) {\n return undefined;\n }\n\n const normalized = path\n .split('/')\n .map(segment => segment.trim())\n .filter(Boolean)\n .join('/');\n\n return normalized.length > 0 ? normalized : undefined;\n }\n\n private combinePaths(basePath?: string, relativePath?: string): string | undefined {\n const base = this.normalizePath(basePath);\n const relative = this.normalizePath(relativePath);\n\n if (base && relative) {\n return `${base}/${relative}`;\n }\n\n return base || relative || undefined;\n }\n\n}\n","export const widgetStyles = /* css */ `\n:host {\n --ar-font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --ar-color-bg: hsl(0 0% 100%);\n --ar-color-bg-muted: hsl(210 40% 96%);\n --ar-color-border: hsl(214 32% 91%);\n --ar-color-text: hsl(222 47% 11%);\n --ar-color-muted-foreground: hsl(215 16% 47%);\n /* let palette or theme set accent */\n --ar-color-accent: unset;\n --ar-color-accent-hover: unset;\n --ar-color-accent-button: unset;\n --ar-radius: 8px;\n display: block;\n}\n\n/* Palette: Blue (default) */\n:host([data-palette='at-blue']),\n:host:not([data-palette]) {\n --ar-color-accent: #e0f2fe;\n --ar-color-accent-hover: #f0f9ff;\n --ar-color-accent-button: #0c55f9;\n}\n\n/* Palette: Purple */\n:host([data-palette='at-purple']) {\n --ar-color-accent: #f3e8ff;\n --ar-color-accent-hover: #faf5ff;\n --ar-color-accent-button: #8a3ffc;\n}\n\n/* Palette: Red */\n:host([data-palette='at-red']) {\n --ar-color-accent: #fee2e2;\n --ar-color-accent-hover: #fef2f2;\n --ar-color-accent-button: #da1e28;\n}\n\n/* Palette: Orange */\n:host([data-palette='at-orange']) {\n --ar-color-accent: #ffedd5;\n --ar-color-accent-hover: #fff7ed;\n --ar-color-accent-button: #ff832b;\n}\n\n/* Palette: Green */\n:host([data-palette='at-green']) {\n --ar-color-accent: #dcfce7;\n --ar-color-accent-hover: #f0fdf4;\n --ar-color-accent-button: #24a148;\n}\n\n/* Palette: Turquoise */\n:host([data-palette='at-turquoise']) {\n --ar-color-accent: #ccfbf1;\n --ar-color-accent-hover: #f0fdfa;\n --ar-color-accent-button: #0072c3;\n}\n\n/* Palette: Gray */\n:host([data-palette='at-gray']) {\n --ar-color-accent: #f3f4f6;\n --ar-color-accent-hover: #f9fafb;\n --ar-color-accent-button: #525252;\n}\n\n:host([data-trigger='inline']) .ar-uploader-root,\n:host([data-trigger='inline']) .ar-inline-upload,\n:host([data-trigger='inline']) .ar-inline-panel {\n width: 100%;\n min-width: 0;\n}\n\n:host([data-theme='dark']) {\n --ar-color-bg: hsl(222 41% 6%);\n --ar-color-bg-muted: hsl(217 33% 17%);\n --ar-color-border: hsl(217 19% 27%);\n --ar-color-text: hsl(213 31% 91%);\n --ar-color-muted-foreground: hsl(215 20% 65%);\n --ar-color-accent: unset;\n --ar-color-accent-hover: unset;\n}\n\n/* Dark theme palette overrides */\n:host([data-theme='dark'][data-palette='at-blue']),\n:host([data-theme='dark']:not([data-palette])) {\n --ar-color-accent: rgba(120, 169, 255, 0.8);\n --ar-color-accent-hover: rgba(120, 169, 255, 0.2);\n --ar-color-accent-button: #78a9ff;\n}\n\n:host([data-theme='dark'][data-palette='at-purple']) {\n --ar-color-accent: rgba(167, 139, 250, 0.8);\n --ar-color-accent-hover: rgba(167, 139, 250, 0.2);\n --ar-color-accent-button: #a78bfa;\n}\n\n:host([data-theme='dark'][data-palette='at-red']) {\n --ar-color-accent: rgba(255, 131, 137, 0.8);\n --ar-color-accent-hover: rgba(255, 131, 137, 0.2);\n --ar-color-accent-button: #ff8389;\n}\n\n:host([data-theme='dark'][data-palette='at-orange']) {\n --ar-color-accent: rgba(255, 179, 102, 0.8);\n --ar-color-accent-hover: rgba(255, 179, 102, 0.2);\n --ar-color-accent-button: #ffb366;\n}\n\n:host([data-theme='dark'][data-palette='at-green']) {\n --ar-color-accent: rgba(111, 220, 140, 0.8);\n --ar-color-accent-hover: rgba(111, 220, 140, 0.2);\n --ar-color-accent-button: #6fdc8c;\n}\n\n:host([data-theme='dark'][data-palette='at-turquoise']) {\n --ar-color-accent: rgba(130, 207, 255, 0.8);\n --ar-color-accent-hover: rgba(130, 207, 255, 0.2);\n --ar-color-accent-button: #82cfff;\n}\n\n:host([data-theme='dark'][data-palette='at-gray']) {\n --ar-color-accent: rgba(198, 198, 198, 0.8);\n --ar-color-accent-hover: rgba(198, 198, 198, 0.2);\n --ar-color-accent-button: #c6c6c6;\n}\n\n.ar-uploader-root {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n font-family: var(--ar-font-family);\n background-color: var(--ar-color-bg);\n color: var(--ar-color-text);\n border: 1px solid var(--ar-color-border);\n border-radius: var(--ar-radius);\n padding: 0.5rem 1rem 1rem 1rem;\n}\n\n/* Reduce root gap when sources are empty in inline mode */\n:host([data-trigger='inline']) .ar-uploader-root:has(.ar-inline-upload--no-sources) {\n gap: 0.75rem;\n}\n\n\n:host([data-theme='dark']) .ar-uploader-root {\n background-color: hsl(222 41% 6%);\n}\n\n.ar-uploader-root[data-trigger='button'] {\n border: none;\n padding: 0;\n box-shadow: none;\n background: transparent;\n}\n\n.ar-header {\n display: none;\n}\n\n.ar-uploader-root.has-items .ar-header {\n display: flex;\n}\n\n.ar-title {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n}\n\n.ar-description {\n margin: 0;\n color: var(--ar-color-muted-foreground);\n font-size: 0.95rem;\n}\n\n\n.ar-subtext {\n margin: 0;\n font-size: 0.8rem;\n color: var(--ar-color-muted-foreground);\n}\n\n.ar-button-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.45rem;\n padding: 0.55rem 1.25rem;\n font-weight: 600;\n border-radius: var(--ar-radius);\n border: 1px solid rgba(15, 23, 42, 0.08);\n background: rgba(248, 250, 252, 0.9);\n color: var(--ar-color-text);\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 6px 16px rgba(15, 23, 42, 0.06);\n}\n\n:host([data-theme='dark']) .ar-button-trigger {\n border: 1px solid rgba(148, 163, 184, 0.25);\n background: rgba(30, 41, 59, 0.75);\n color: var(--ar-color-text);\n}\n\n.ar-button-trigger:hover {\n transform: translateY(-1px);\n}\n\n.ar-button-trigger:active {\n transform: translateY(0);\n}\n\n.ar-button-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.ar-button-icon svg {\n width: 1rem;\n height: 1rem;\n fill: currentColor;\n}\n\n.ar-inline-upload {\n display: flex;\n flex-direction: column;\n gap: 1.1rem;\n}\n\n/* Reduce gap when sources are empty in inline mode */\n:host([data-trigger='inline']) .ar-inline-upload--no-sources {\n gap: 0.5rem;\n}\n\n.ar-inline-panel {\n display: flex;\n flex-direction: column;\n}\n\n.ar-dropzone {\n position: relative;\n border: 1.5px dashed var(--ar-dropzone-border, var(--ar-color-border));\n border-radius: var(--ar-radius);\n background: var(--ar-dropzone-bg, var(--ar-color-bg));\n padding: 3rem 2rem;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 1rem;\n cursor: pointer;\n transition: border-color 0.2s ease, background-color 0.2s ease, transform 0.2s ease;\n margin: 0.6rem 0rem 1rem 0rem;\n}\n\n/* Reduce bottom margin when sources are empty in inline mode */\n:host([data-trigger='inline']) .ar-modal-body--no-sources .ar-dropzone {\n margin-bottom: 0.25rem;\n}\n\n.ar-dropzone:hover {\n background-color: var(--ar-color-accent-hover);\n transform: translateY(-1px);\n}\n\n.ar-dropzone:hover .ar-dropzone-icon {\n background: var(--ar-color-accent);\n}\n\n.ar-dropzone.is-dragover {\n border-color: var(--ar-color-accent);\n background-color: var(--ar-color-accent-hover);\n}\n\n.ar-dropzone.is-dragover .ar-dropzone-icon {\n background: var(--ar-color-accent-hover);\n color: var(--ar-color-accent);\n}\n\n.ar-dropzone.is-dragover .ar-description {\n color: var(--ar-color-accent);\n}\n\n.ar-dropzone.is-dragging {\n border-color: var(--ar-color-accent);\n background: var(--ar-color-accent-hover);\n color: var(--ar-color-accent);\n}\n\n.ar-dropzone.is-dragging .ar-dropzone-icon {\n background: var(--ar-color-accent-hover);\n color: var(--ar-color-accent);\n}\n\n.ar-dropzone.is-dragging .ar-description {\n color: var(--ar-color-accent);\n}\n\n.ar-dropzone-icon {\n width: 3rem;\n height: 3rem;\n border-radius: 999px;\n background: rgba(148, 163, 184, 0.12);\n color: var(--ar-color-muted-foreground);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n:host([data-theme='dark']) .ar-dropzone-icon {\n color: var(--ar-color-text);\n}\n\n.ar-dropzone svg {\n width: 1.75rem;\n height: 1.75rem;\n fill: currentColor;\n}\n\n.ar-dropzone-actions {\n display: none;\n}\n\n.ar-file-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-bottom: 1rem;\n}\n\n.ar-file-list.is-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 1rem;\n}\n\n.ar-file-item {\n border: none;\n border-radius: var(--ar-radius);\n background: rgba(148, 163, 184, 0.15);\n padding: 0.5rem;\n display: flex;\n flex-direction: column;\n gap: 0.45rem;\n position: relative;\n box-sizing: border-box;\n min-height: 50px;\n overflow: hidden;\n}\n\n.ar-file-item.is-grid {\n height: auto;\n padding: 0px;\n background: none;\n}\n\n:host([data-theme='dark']) .ar-file-item {\n background: hsl(222 41% 10%);\n}\n\n.ar-file-header {\n display: flex;\n align-items: center;\n gap: 0.6rem;\n min-width: 0;\n flex: 1;\n}\n\n.ar-file-header.is-grid {\n flex-direction: column;\n align-items: stretch;\n}\n\n.ar-file-thumb {\n width: 32px;\n height: 32px;\n border-radius: calc(var(--ar-radius) * 0.5);\n background: var(--ar-color-accent-hover);\n color: var(--ar-color-accent);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.8rem;\n font-weight: 600;\n overflow: hidden;\n position: relative;\n}\n\n.ar-file-thumb-document {\n background: rgba(148, 163, 184, 0.15);\n color: var(--ar-color-muted-foreground);\n}\n\n.ar-file-thumb-document svg {\n width: 20px;\n height: 20px;\n color: currentColor;\n}\n\n.ar-file-thumb.is-grid {\n width: 100%;\n height: 140px;\n border-radius: calc(var(--ar-radius) * 0.75);\n font-size: 1rem;\n}\n\n.ar-file-thumb.is-grid.ar-file-thumb-document svg {\n width: 48px;\n height: 48px;\n}\n\n.ar-file-item.is-completed .ar-file-thumb {\n color: #fff;\n}\n\n.ar-thumb-status {\n position: absolute;\n bottom: -2px;\n right: -2px;\n width: 18px;\n height: 18px;\n border-radius: 999px;\n background: #1e9f6d;\n color: #fff;\n border: 2px solid var(--ar-color-bg);\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 6px rgba(15, 23, 42, 0.25);\n}\n\n.ar-thumb-status svg {\n width: 10px;\n height: 10px;\n color: currentColor;\n}\n\n.ar-thumb-status.is-error {\n background: rgba(225, 29, 72, 0.85);\n}\n\n.ar-file-name {\n font-size: 0.8rem;\n margin: 0;\n color: var(--ar-color-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n min-width: 0;\n}\n\n.ar-file-meta {\n display: block;\n margin-top: 0.25rem;\n font-size: 0.8rem;\n color: var(--ar-color-muted-foreground);\n width: 100%;\n flex-shrink: 0;\n}\n\n.ar-file-info {\n display: block;\n font-size: 0.75rem;\n color: var(--ar-color-muted-foreground);\n font-style: italic;\n padding: 0.25rem 0.5rem;\n background: rgba(148, 163, 184, 0.15);\n border-radius: calc(var(--ar-radius) * 0.5);\n width: 100%;\n box-sizing: border-box;\n word-wrap: break-word;\n overflow-wrap: break-word;\n}\n\n.ar-file-item.is-grid .ar-file-info {\n font-size: 0.7rem;\n padding: 0.2rem 0.4rem;\n}\n\n.ar-file-item.is-grid .ar-file-meta {\n justify-content: center;\n}\n\n.ar-remove-button {\n margin-left: auto;\n border: none;\n background: transparent;\n color: var(--ar-color-muted-foreground);\n cursor: pointer;\n padding: 0.25rem;\n border-radius: var(--ar-radius);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s ease, color 0.2s ease;\n}\n\n.ar-remove-button.is-grid {\n position: absolute;\n top: 0.6rem;\n right: 0.6rem;\n background: rgba(255, 255, 255, 0.95);\n color: var(--ar-color-text);\n padding: 0.35rem;\n border-radius: var(--ar-radius);\n box-shadow: 0 4px 12px rgba(15, 23, 42, 0.25);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.15s ease, background 0.2s ease, color 0.2s ease;\n}\n\n.ar-file-item.is-grid:hover .ar-remove-button.is-grid {\n opacity: 1;\n pointer-events: auto;\n}\n\n:host([data-theme='dark']) .ar-remove-button.is-grid {\n background: rgba(15, 23, 42, 0.92);\n color: var(--ar-color-text);\n box-shadow: 0 4px 18px rgba(8, 47, 73, 0.45);\n}\n\n.ar-remove-button svg {\n width: 20px;\n height: 20px;\n display: block;\n}\n\n.ar-remove-button svg path,\n.ar-remove-button svg line,\n.ar-remove-button svg rect,\n.ar-remove-button svg circle,\n.ar-remove-button svg polyline {\n stroke: currentColor;\n fill: none;\n}\n\n.ar-remove-button:hover:not([disabled]) {\n color: var(--ar-color-text);\n}\n\n.ar-progress-track {\n width: 100%;\n height: 4px;\n border-radius: var(--ar-radius);\n background-color: rgba(148, 163, 184, 0.35);\n overflow: hidden;\n}\n\n.ar-file-item.is-uploading {\n border-color: var(--ar-color-accent);\n}\n\n.ar-file-item.is-error {\n border: 1px solid rgba(225, 29, 72, 0.4);\n background: rgba(248, 113, 113, 0.12);\n}\n\n.ar-progress-border {\n opacity: 0;\n height: 2px;\n width: 96%;\n border-radius: 999px;\n background: var(--ar-color-accent-hover);\n overflow: hidden;\n margin-top: 0.35rem;\n position: absolute;\n bottom: 0;\n left: 6px;\n right: 6px;\n}\n\n.ar-progress-border.is-active,\n.ar-progress-border.is-complete {\n opacity: 1;\n}\n\n.ar-progress-border.is-train {\n background: var(--ar-color-accent-hover);\n}\n\n.ar-progress-fill {\n height: 100%;\n width: 0%;\n border-radius: inherit;\n background: var(--ar-color-accent);\n transition: width 0.25s ease;\n transform-origin: left center;\n animation: none;\n}\n\n.ar-progress-fill.is-train {\n background-image: linear-gradient(\n 90deg,\n rgba(245, 250, 241, 0.93) 0%,\n rgba(240, 242, 247, 0.85) 80%,\n rgb(30, 101, 212) 100%\n );\n background-size: 220% 100%;\n animation: ar-progress-train 2.4s linear infinite;\n}\n\n.ar-progress-border.is-complete {\n background: rgba(34, 197, 94, 0.25);\n}\n\n.ar-progress-border.is-complete .ar-progress-fill {\n background-image: linear-gradient(\n 90deg,\n rgba(52, 211, 153, 0.3) 0%,\n rgba(16, 185, 129, 0.85) 50%,\n rgba(52, 211, 153, 0.3) 100%\n );\n animation: none;\n}\n\n@keyframes ar-progress-train {\n 0% {\n background-position: 240% 0;\n }\n 100% {\n background-position: -240% 0;\n }\n}\n\n.ar-file-item.is-completed {\n border-color: rgba(30, 159, 109, 0.6);\n}\n\n.ar-file-item.is-grid .ar-file-name {\n text-align: left;\n font-size: 0.78rem;\n color: var(--ar-color-muted-foreground);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ar-status {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--ar-color-muted-foreground);\n}\n\n.ar-status svg {\n width: 1rem;\n height: 1rem;\n}\n\n.ar-status.is-success {\n color: #1e9f6d;\n}\n\n.ar-status.is-error {\n color: #e11d48;\n}\n\n.ar-status.is-warning {\n color: #d97706;\n}\n\n.ar-file-error {\n font-size: 0.78rem;\n color: #e11d48;\n}\n\n.ar-error-banner {\n display: none;\n margin: 0.5rem 0;\n color: #b91c1c;\n font-size: 0.82rem;\n font-weight: 600;\n line-height: 1.4;\n}\n\n.ar-error-banner:not([hidden]) {\n display: block;\n}\n\n:host([data-theme='dark']) .ar-error-banner {\n color: #fecaca;\n}\n\n.ar-actions {\n display: flex;\n justify-content: flex-end;\n}\n\n.ar-upload-button {\n border-radius: 10px;\n padding: 0.65rem 1.5rem;\n font-weight: 600;\n border: none;\n background: var(--ar-color-accent-button, var(--ar-color-accent));\n color: white;\n cursor: pointer;\n transition: filter 0.2s ease, transform 0.2s ease;\n min-width: 140px;\n}\n\n.ar-upload-button:hover:not([disabled]) {\n filter: brightness(1.05);\n transform: translateY(-1px);\n}\n\n.ar-upload-button[disabled] {\n opacity: 0.55;\n cursor: not-allowed;\n}\n\n.ar-footer {\n font-size: 0.78rem;\n color: var(--ar-color-muted-foreground);\n text-align: right;\n}\n\n.ar-modal {\n position: fixed;\n inset: 0;\n display: none;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n\n.ar-modal.is-portal {\n position: absolute;\n}\n\n.ar-modal.is-open {\n display: flex;\n}\n\n.ar-modal-backdrop {\n position: absolute;\n inset: 0;\n background: rgba(15, 23, 42, 0.45);\n}\n\n.ar-modal-dialog {\n position: relative;\n background: var(--ar-color-bg);\n border-radius: 16px;\n border: 1px solid var(--ar-color-border);\n box-shadow: 0 32px 80px rgba(15, 23, 42, 0.25);\n width: min(343px, 92vw);\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n padding: 0.5rem 1rem 1rem 1rem;\n}\n\n.ar-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n margin-bottom: 1rem;\n}\n\n.ar-modal-header.is-inline {\n justify-content: flex-start;\n align-items: center;\n gap: 0.5rem;\n padding-top:0.5rem;\n}\n\n.ar-modal-title {\n margin: 0;\n font-size: 1rem;\n font-weight: 500;\n}\n\n.ar-modal-close {\n border: none;\n background: transparent;\n color: var(--ar-color-muted-foreground);\n cursor: pointer;\n border-radius: 999px;\n padding: 0.3rem;\n transition: color 0.2s ease, background 0.2s ease;\n}\n\n.ar-modal-close:hover {\n background: rgba(148, 163, 184, 0.15);\n color: var(--ar-color-accent);\n}\n\n.ar-modal-close-icon svg {\n width: 1.2rem;\n height: 1.2rem;\n}\n\n.ar-modal-body {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n overflow-y: auto;\n padding-right: 0.25rem;\n}\n\n/* Reduce gap when source list is hidden in inline mode */\n:host([data-trigger='inline']) .ar-modal-body--no-sources {\n gap: 0.5rem;\n}\n\n.ar-modal-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n}\n\n.ar-modal-footer.is-inline {\n padding: 0;\n border-top: none;\n}\n\n.ar-modal-footer.is-inline .ar-modal-footer-actions {\n margin-left: auto;\n}\n\n.ar-modal-footer-actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.ar-modal-add-more,\n.ar-modal-clear {\n border-radius: var(--ar-radius);\n padding: 0.55rem 1.25rem;\n font-weight: 600;\n border: 1px solid var(--ar-color-border);\n background: var(--ar-color-bg);\n color: var(--ar-color-text);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.ar-modal-add-more:hover {\n border-color: var(--ar-color-accent-button, var(--ar-color-accent));\n color: var(--ar-color-accent-button, var(--ar-color-accent));\n}\n\n.ar-modal-clear {\n background: rgba(148, 163, 184, 0.12);\n}\n\n.ar-modal-clear[disabled] {\n opacity: 0.45;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.ar-modal-clear:hover {\n border-color: var(--ar-color-accent);\n color: var(--ar-color-accent);\n}\n\n.ar-modal-upload-button,\n.ar-modal-done {\n border-radius: var(--ar-radius);\n padding: 0.55rem 1.25rem;\n font-weight: 600;\n border: none;\n background: var(--ar-color-accent-button, var(--ar-color-accent));\n color: white;\n cursor: pointer;\n transition: filter 0.2s ease;\n}\n\n.ar-modal-upload-button:hover,\n.ar-modal-done:hover {\n filter: brightness(1.05);\n}\n\n.ar-uploaded-summary {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n border-top: 1px solid var(--ar-color-border);\n padding-top: 1rem;\n}\n\n.ar-uploader-root[data-trigger='button'] .ar-uploaded-summary {\n border: 1px solid var(--ar-color-border);\n border-radius: var(--ar-radius);\n padding: 1rem;\n background: var(--ar-color-bg-muted);\n}\n\n.ar-summary-title {\n margin: 0;\n font-size: 0.95rem;\n font-weight: 600;\n}\n\n.ar-summary-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.ar-summary-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.ar-summary-icon {\n width: 38px;\n height: 38px;\n border-radius: 12px;\n background: var(--ar-color-accent-hover);\n color: var(--ar-color-accent);\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n}\n\n.ar-summary-info {\n display: flex;\n flex-direction: column;\n gap: 0.2rem;\n}\n\n.ar-summary-name {\n font-weight: 600;\n font-size: 0.95rem;\n}\n\n.ar-summary-meta {\n font-size: 0.8rem;\n color: var(--ar-color-muted-foreground);\n}\n\n.ar-uploader-root.is-uploading .ar-dropzone {\n display: none;\n}\n\n.ar-uploader-root.has-items .ar-file-list {\n display: flex;\n}\n\n.ar-file-list:empty {\n display: none;\n}\n\n.ar-modal-upload {\n display: flex;\n flex-direction: column;\n}\n\n.ar-modal-upload.is-inline {\n gap: 1rem;\n}\n\n.ar-modal-body .ar-file-list {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n max-height: 220px;\n overflow-y: auto;\n border: none;\n background: transparent;\n padding: 0;\n}\n\nbutton,\n.ar-button-trigger,\n.ar-dropzone-button,\n.ar-upload-button,\n.ar-modal-footer button,\n.ar-actions button,\n.ar-remove-button,\n.ar-modal-header button {\n font-size: 1rem;\n font-weight: 400;\n}\n\n@media (max-width: 640px) {\n .ar-uploader-root {\n padding: 1rem;\n }\n\n .ar-dropzone {\n padding: 2.25rem 1.25rem;\n }\n\n .ar-modal-dialog {\n width: min(90vw, 343px);\n padding: 1.25rem;\n }\n}\n\n.ar-actions-sources,\n.ar-modal-sources {\n display: none;\n}\n\n.ar-actions-sources.is-visible,\n.ar-modal-sources.is-visible {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n}\n\n.ar-source-list {\n display: none;\n flex-direction: column;\n margin: 1rem 0rem;\n}\n\n/* Remove margin when source list is hidden in inline mode */\n:host([data-trigger='inline']) .ar-source-list:not(.ar-source-list--choices) {\n margin: 0;\n}\n\n.ar-source-list--choices {\n display: flex;\n}\n\n.ar-source-option {\n display: flex;\n align-items: center;\n gap: 0.65rem;\n width: 100%;\n border: none;\n border-radius: var(--ar-radius);\n background: transparent;\n padding: 0.55rem 0.75rem;\n text-align: left;\n color: var(--ar-color-text);\n cursor: pointer;\n transition: background-color 0.2s ease, color 0.2s ease;\n}\n\n.ar-source-option.is-primary {\n background: rgba(148, 163, 184, 0.12);\n color: var(--ar-color-muted-foreground);\n}\n\n:host([data-theme='dark']) .ar-source-option.is-primary {\n color: var(--ar-color-text);\n}\n\n.ar-source-option:hover:not([disabled]),\n.ar-source-option:focus-visible {\n background: var(--ar-color-accent-hover);\n}\n\n.ar-source-option[disabled] {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.ar-source-option-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--ar-color-muted-foreground);\n}\n\n.ar-source-option-label {\n flex: 1;\n font-size: 0.95rem;\n}\n\n.ar-source-inline {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n}\n\n.ar-source-inline-button {\n width: 36px;\n height: 36px;\n border-radius: 999px;\n border: 1px solid var(--ar-color-border);\n background: transparent;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--ar-color-text);\n transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;\n}\n\n.ar-source-inline-button:hover:not([disabled]) {\n background: var(--ar-color-accent-hover);\n color: var(--ar-color-accent);\n border-color: var(--ar-color-accent);\n}\n\n.ar-source-inline-button svg {\n width: 18px;\n height: 18px;\n display: block;\n}\n\n.ar-modal-cancel {\n background: rgba(148, 163, 184, 0.15);\n border: none;\n color: var(--ar-color-text);\n padding:0.5rem 1rem;\n border-radius: var(--ar-radius);\n}\n\n.ar-modal-cancel:hover:not([disabled]) {\n background: rgba(148, 163, 184, 0.25);\n}\n\n.ar-modal-cancel.is-fullwidth {\n width: 100%;\n justify-content: center;\n border-radius: var(--ar-radius);\n cursor: pointer;\n}\n\n.ar-modal-powered,\n.ar-inline-powered {\n margin-top: 12px;\n font-size: 0.75rem;\n color: var(--ar-color-muted-foreground);\n text-align: center;\n}\n\n/* Reduce margin when sources are empty in inline mode */\n:host([data-trigger='inline']) .ar-inline-upload--no-sources .ar-inline-powered {\n margin-top: 0.5rem;\n}\n\n.ar-duplicate-banner {\n display: none;\n margin: 0.75rem 0;\n padding: 0.75rem;\n border-radius: var(--ar-radius);\n background: rgba(248, 113, 113, 0.12);\n color: #9f1239;\n font-size: 0.85rem;\n line-height: 1.3;\n}\n\n.ar-duplicate-banner[hidden] {\n display: none !important;\n}\n\n`;\n\n","import { UploaderController, type ControllerOptions } from '../core/uploader-controller';\nimport { DEFAULT_ICONS, DEFAULT_LABELS, DEFAULT_THEME } from '../constants/defaults';\nimport type {\n IconSet,\n LabelSet,\n ThemeOptions,\n UploadItem,\n UploadSourceOption,\n UploaderClassNames,\n} from '../types';\nimport { resolveIcon } from '../utils/helpers';\nimport { widgetStyles } from './styles';\n\nconst HTMLElementShim: typeof HTMLElement =\n typeof globalThis === 'undefined' || typeof globalThis.HTMLElement === 'undefined'\n ? (class HTMLElementFallback {} as unknown as typeof HTMLElement)\n : globalThis.HTMLElement;\n\ninterface FilesAddedDetail {\n items: UploadItem[];\n}\n\ninterface FileSystemEntry {\n isFile: boolean;\n isDirectory: boolean;\n name: string;\n fullPath: string;\n}\n\ninterface FileSystemFileEntry extends FileSystemEntry {\n file: (callback: (file: File) => void, errorCallback?: (error: DOMException) => void) => void;\n}\n\ninterface FileSystemDirectoryEntry extends FileSystemEntry {\n createReader: () => FileSystemDirectoryReader;\n}\n\ninterface FileSystemDirectoryReader {\n readEntries: (\n successCallback: (entries: FileSystemEntry[]) => void,\n errorCallback?: (error: DOMException) => void\n ) => void;\n}\n\nexport class AutorenderUploaderElement extends HTMLElementShim {\n static tagName = 'autorender-uploader';\n\n private shadow: ShadowRoot;\n private controller: UploaderController | null = null;\n private options!: ControllerOptions;\n private labels: Required<LabelSet> = DEFAULT_LABELS;\n private icons: Required<IconSet> = DEFAULT_ICONS;\n private classNames: UploaderClassNames = {};\n private sourceOptions: UploadSourceOption[] = [];\n\n private triggerType: 'button' | 'inline' = 'inline';\n private isModalOpen = false;\n private fileLayout: 'list' | 'grid' = 'list';\n private showGridFileName = true;\n\n private rootElement: HTMLElement | null = null;\n private fileInput!: HTMLInputElement;\n private dropzone: HTMLDivElement | null = null;\n private fileList: HTMLUListElement | null = null;\n private sourceLists: HTMLElement[] = [];\n private modalBody: HTMLElement | null = null;\n private inlineUpload: HTMLElement | null = null;\n private uploadButton: HTMLButtonElement | null = null;\n private triggerButton: HTMLButtonElement | null = null;\n private modalElement: HTMLElement | null = null;\n private modalCloseButton: HTMLButtonElement | null = null;\n private modalDoneButton: HTMLButtonElement | null = null;\n private modalClearButton: HTMLButtonElement | null = null;\n private modalUploadButton: HTMLButtonElement | null = null;\n private modalCancelButton: HTMLButtonElement | null = null;\n private modalAddMoreButton: HTMLButtonElement | null = null;\n private modalFooterActions: HTMLElement | null = null;\n private modalSourceContainer: HTMLElement | null = null;\n private actionsSourceContainer: HTMLElement | null = null;\n private modalTitleElement: HTMLElement | null = null;\n private modalHeaderElement: HTMLElement | null = null;\n private modalPoweredElement: HTMLElement | null = null;\n private inlinePoweredElement: HTMLElement | null = null;\n private duplicateBanners: HTMLElement[] = [];\n private errorBannerElement: HTMLElement | null = null;\n private globalErrorMessage: string | null = null;\n private portalContainer: HTMLElement | null = null;\n private portalDiv: HTMLElement | null = null;\n private isInsideContainer: boolean = false;\n\n private isAbortError(error: unknown): boolean {\n if (!error) return false;\n if (error instanceof DOMException && error.name === 'AbortError') return true;\n if (error instanceof Error && error.name === 'AbortError') return true;\n const message =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : '';\n return typeof message === 'string' && message.toLowerCase().includes('abort');\n }\n\n private controllerListeners = new Map<string, (event: Event) => void>();\n private handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && this.isModalOpen) {\n this.isModalOpen = false;\n this.render();\n }\n };\n\n constructor() {\n super();\n this.shadow = this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n this.render();\n }\n\n disconnectedCallback() {\n this.detachController();\n window.removeEventListener('keydown', this.handleKeydown);\n this.cleanupPortal();\n }\n\n private setupPortal() {\n if (!this.options.container) {\n this.isInsideContainer = false;\n return;\n }\n\n const container = typeof this.options.container === 'string'\n ? document.querySelector<HTMLElement>(this.options.container)\n : this.options.container;\n\n if (!container) {\n console.warn(`Container \"${this.options.container}\" not found`);\n this.isInsideContainer = false;\n return;\n }\n\n // Check if the widget is already inside the container\n // If so, we don't need a portal - everything is already contained\n let currentParent: Node | null = this.parentNode;\n while (currentParent && currentParent !== document.body) {\n if (currentParent === container) {\n // Widget is already inside container, no portal needed\n // But we need to ensure container has position relative for absolute modal positioning\n const containerStyle = window.getComputedStyle(container);\n if (containerStyle.position === 'static') {\n container.style.position = 'relative';\n }\n this.portalContainer = null;\n this.portalDiv = null;\n this.isInsideContainer = true;\n return;\n }\n currentParent = currentParent.parentNode;\n }\n\n // Widget is not inside container, use portal for modal only\n // Ensure container has position relative or absolute for absolute positioning\n const containerStyle = window.getComputedStyle(container);\n if (containerStyle.position === 'static') {\n container.style.position = 'relative';\n }\n\n this.portalContainer = container;\n this.isInsideContainer = false;\n\n // Create or reuse portal div\n if (!this.portalDiv) {\n this.portalDiv = document.createElement('div');\n this.portalDiv.className = 'ar-sdk-portal';\n this.portalDiv.style.position = 'absolute';\n this.portalDiv.style.inset = '0';\n this.portalDiv.style.zIndex = '1000';\n container.appendChild(this.portalDiv);\n }\n }\n\n private cleanupPortal() {\n if (this.portalDiv) {\n this.portalDiv.remove();\n this.portalDiv = null;\n }\n this.portalContainer = null;\n this.isInsideContainer = false;\n }\n\n setController(controller: UploaderController, options: ControllerOptions) {\n this.detachController();\n this.controller = controller;\n this.globalErrorMessage = null;\n this.applyOptions(options);\n this.attachController();\n this.render();\n }\n\n updateOptions(options: Partial<ControllerOptions>) {\n if (!this.controller) return;\n this.applyOptions({ ...this.options, ...options });\n this.controller.setOptions(this.options);\n this.render();\n }\n\n openFileDialog() {\n if (this.triggerType === 'button' && !this.isModalOpen) {\n this.isModalOpen = true;\n this.render();\n requestAnimationFrame(() => this.fileInput?.click());\n return;\n }\n this.fileInput?.click();\n }\n\n private applyOptions(options: ControllerOptions) {\n const previousOptions = this.options ?? ({} as ControllerOptions);\n const themeInput = (options.theme ?? previousOptions.theme ?? DEFAULT_THEME) as ThemeOptions;\n const resolvedTheme = {\n appearance: themeInput.appearance ?? DEFAULT_THEME.appearance,\n borderRadius: themeInput.borderRadius ?? DEFAULT_THEME.borderRadius,\n dropzoneBackground: themeInput.dropzoneBackground ?? DEFAULT_THEME.dropzoneBackground,\n dropzoneBorder: themeInput.dropzoneBorder ?? DEFAULT_THEME.dropzoneBorder,\n fontFamily: themeInput.fontFamily ?? previousOptions.theme?.fontFamily,\n };\n\n // Sources are already normalized by normalizeOptions (empty array if all disabled)\n const resolvedSources = options.sources ?? previousOptions.sources ?? [];\n const previousSourceIds = this.sourceOptions?.map(s => s.id).sort().join(',') ?? '';\n\n // Resolve container\n const containerChanged = previousOptions.container !== options.container;\n if (containerChanged && this.portalDiv && this.portalContainer) {\n // Clean up old portal\n this.portalDiv.remove();\n this.portalDiv = null;\n this.portalContainer = null;\n }\n\n this.options = {\n ...previousOptions,\n ...options,\n theme: resolvedTheme,\n sources: resolvedSources,\n };\n\n // Setup portal if container is specified and widget is not already inside it\n if (this.options.container) {\n this.setupPortal();\n } else {\n this.cleanupPortal();\n }\n\n this.labels = {\n ...DEFAULT_LABELS,\n ...(this.options.labels ?? {}),\n };\n\n this.icons = DEFAULT_ICONS;\n\n const currentSourceIds = resolvedSources.map(s => s.id).sort().join(',');\n const sourcesChanged = previousSourceIds !== currentSourceIds;\n \n this.sourceOptions = resolvedSources;\n this.options.onSourceSelect = options.onSourceSelect ?? previousOptions.onSourceSelect;\n\n const requestedType = this.options.type ?? 'inline';\n this.triggerType = requestedType === 'button' ? 'button' : 'inline';\n this.fileLayout = this.options.fileLayout ?? 'list';\n this.showGridFileName = this.options.showGridFileName ?? true;\n this.classNames = this.options.classNames ?? {};\n\n if (this.options.autoUpload === undefined && this.triggerType === 'inline') {\n this.options.autoUpload = true;\n }\n\n // Re-render source list if sources changed and widget is already rendered\n if (this.rootElement && sourcesChanged) {\n const hasItems = (this.controller?.getState().items.length ?? 0) > 0;\n this.renderSourceOptions(hasItems);\n }\n }\n\n private attachController() {\n if (!this.controller) return;\n\n const stateListener = () => this.updateState();\n const progressListener = () => this.updateState();\n const filesAddedListener = (event: Event) => {\n const detail = (event as CustomEvent<FilesAddedDetail>).detail;\n if (this.options.autoUpload && detail?.items?.length) {\n void this.controller?.uploadAll();\n }\n };\n const completeListener = () => {\n this.clearGlobalError();\n this.render();\n };\n const errorListener = (event: Event) => {\n const detail = (event as CustomEvent).detail;\n this.handleControllerError(detail);\n };\n\n this.controller.addEventListener('statechange', stateListener);\n this.controller.addEventListener('progress', progressListener);\n this.controller.addEventListener('fileprogress', progressListener);\n this.controller.addEventListener('filesadded', filesAddedListener);\n this.controller.addEventListener('complete', completeListener);\n this.controller.addEventListener('error', errorListener);\n\n this.controllerListeners.set('statechange', stateListener);\n this.controllerListeners.set('progress', progressListener);\n this.controllerListeners.set('fileprogress', progressListener);\n this.controllerListeners.set('filesadded', filesAddedListener);\n this.controllerListeners.set('complete', completeListener);\n this.controllerListeners.set('error', errorListener);\n }\n\n private detachController() {\n if (!this.controller) return;\n for (const [event, handler] of this.controllerListeners.entries()) {\n this.controller.removeEventListener(event, handler);\n }\n this.controllerListeners.clear();\n this.controller = null;\n }\n\n private resolveClassName(key: keyof UploaderClassNames, fallback: string) {\n const extra = this.classNames[key];\n return extra ? `${fallback} ${extra}` : fallback;\n }\n\n private render() {\n if (!this.controller) return;\n\n this.setAttribute('data-trigger', this.triggerType);\n\n const duplicateBannerMarkup = `<div class=\"ar-duplicate-banner\" hidden></div>`;\n const errorBannerMarkup = `<div class=\"ar-error-banner\" role=\"alert\" hidden></div>`;\n\n const dropzoneMarkup = `\n <div class=\"${this.resolveClassName('dropzone', 'ar-dropzone')}\" role=\"button\" tabindex=\"0\">\n <div class=\"ar-dropzone-icon\"></div>\n <p class=\"ar-description\">${this.labels.dropzoneTitle}</p>\n </div>\n `;\n\n const fileListMarkup = `<ul class=\"${this.resolveClassName('fileList', 'ar-file-list')}\"></ul>`;\n const sourceListMarkup = '<div class=\"ar-source-list\"></div>';\n\n const modalHeaderMarkup = `\n <div class=\"ar-modal-header\">\n <h3 class=\"ar-modal-title\">${this.labels.title}</h3>\n <button type=\"button\" class=\"ar-modal-close\" aria-label=\"Close\"><span class=\"ar-modal-close-icon\"></span></button>\n </div>\n `;\n\n const inlineHeaderMarkup = `\n <div class=\"ar-modal-header is-inline\">\n <h3 class=\"ar-modal-title\">${this.labels.title}</h3>\n </div>\n `;\n\n const uploadPanelMarkup = `\n <div class=\"ar-modal-body\">\n <div class=\"ar-modal-upload${this.triggerType === 'inline' ? ' is-inline' : ''}\">\n ${dropzoneMarkup}\n ${errorBannerMarkup}\n ${duplicateBannerMarkup}\n ${sourceListMarkup}\n ${fileListMarkup}\n </div>\n </div>\n `;\n\n const footerMarkup = `\n <div class=\"ar-modal-footer${this.triggerType === 'inline' ? ' is-inline' : ''}\">\n <button type=\"button\" class=\"ar-modal-clear\">${this.labels.clear}</button>\n <button type=\"button\" class=\"ar-modal-cancel\">${this.labels.cancel}</button>\n <div class=\"ar-modal-footer-actions\">\n <div class=\"ar-modal-sources\"></div>\n <button type=\"button\" class=\"ar-modal-add-more\">${this.labels.addMore}</button>\n <button type=\"button\" class=\"ar-modal-upload-button\">${this.labels.uploadButton}</button>\n <button type=\"button\" class=\"ar-modal-done\">${this.labels.done}</button>\n </div>\n </div>\n `;\n\n // Add is-portal class if widget is inside container (for absolute positioning) or if using portal div\n const shouldUsePortalPositioning = this.portalDiv || this.isInsideContainer;\n const modalMarkup = this.triggerType === 'button'\n ? `\n <div class=\"${this.resolveClassName('modal', 'ar-modal')} ${this.isModalOpen ? 'is-open' : ''} ${shouldUsePortalPositioning ? 'is-portal' : ''}\">\n <div class=\"ar-modal-backdrop\"></div>\n <div class=\"ar-modal-dialog\">\n ${modalHeaderMarkup}\n ${uploadPanelMarkup}\n ${footerMarkup}\n <div class=\"ar-modal-powered\">Powered by Autorender</div>\n </div>\n </div>\n `\n : '';\n\n const inlineMarkup = this.triggerType === 'inline'\n ? `\n <div class=\"ar-inline-upload\">\n <div class=\"ar-inline-panel\">\n ${inlineHeaderMarkup}\n ${uploadPanelMarkup}\n ${footerMarkup}\n </div>\n <div class=\"ar-inline-powered\">Powered by Autorender</div>\n </div>\n `\n : '';\n\n const template = document.createElement('template');\n template.innerHTML = `\n <style>${widgetStyles}</style>\n <div class=\"${this.resolveClassName('root', 'ar-uploader-root')}\" data-trigger=\"${this.triggerType}\">\n <input type=\"file\" class=\"ar-file-input\" hidden />\n ${\n this.triggerType === 'button'\n ? `<button type=\"button\" class=\"${this.resolveClassName('triggerButton', 'ar-button-trigger')}\"><span class=\"ar-button-icon\"></span><span>${this.labels.selectButton}</span></button>`\n : inlineMarkup\n }\n ${this.portalDiv ? '' : modalMarkup}\n </div>\n `;\n\n this.shadow.innerHTML = '';\n this.shadow.appendChild(template.content.cloneNode(true));\n\n // Render modal in portal if container is specified\n if (this.portalDiv && this.triggerType === 'button') {\n const portalTemplate = document.createElement('template');\n portalTemplate.innerHTML = `<style>${widgetStyles}</style>${modalMarkup}`;\n this.portalDiv.innerHTML = '';\n this.portalDiv.appendChild(portalTemplate.content.cloneNode(true));\n } else if (this.portalDiv && !this.triggerType) {\n // Clean up portal if not needed\n this.portalDiv.innerHTML = '';\n }\n\n this.captureElements();\n this.applyDimensions();\n this.configureInputs();\n this.bindEvents();\n this.applyThemeVariables();\n this.updateState();\n\n if (this.triggerType === 'button') {\n if (this.isModalOpen) {\n window.addEventListener('keydown', this.handleKeydown);\n } else {\n window.removeEventListener('keydown', this.handleKeydown);\n }\n }\n }\n\n private queryModalElement(selector: string): Element | null {\n // Query from portal first if it exists, otherwise from shadow\n if (this.portalDiv) {\n return this.portalDiv.querySelector(selector) || this.shadow.querySelector(selector);\n }\n return this.shadow.querySelector(selector);\n }\n\n private queryModalElements(selector: string): Element[] {\n // Query from portal first if it exists, otherwise from shadow\n if (this.portalDiv) {\n const portalResults = Array.from(this.portalDiv.querySelectorAll(selector));\n const shadowResults = Array.from(this.shadow.querySelectorAll(selector));\n // Combine results (portal takes precedence)\n const combined: Element[] = [];\n portalResults.forEach(el => combined.push(el));\n shadowResults.forEach(el => {\n if (!combined.includes(el)) combined.push(el);\n });\n return combined;\n }\n return Array.from(this.shadow.querySelectorAll(selector));\n }\n\n private captureElements() {\n this.rootElement = this.shadow.querySelector('.ar-uploader-root');\n this.fileInput = this.shadow.querySelector('.ar-file-input') as HTMLInputElement;\n this.dropzone = this.shadow.querySelector('.ar-dropzone');\n this.fileList = this.shadow.querySelector('.ar-file-list');\n this.sourceLists = Array.from(this.shadow.querySelectorAll('.ar-source-list')) as HTMLElement[];\n this.modalBody = this.queryModalElement('.ar-modal-body') as HTMLElement | null;\n this.inlineUpload = this.shadow.querySelector('.ar-inline-upload');\n this.uploadButton = this.shadow.querySelector('.ar-upload-button');\n this.triggerButton = this.shadow.querySelector('.ar-button-trigger');\n this.modalElement = this.queryModalElement('.ar-modal') as HTMLElement | null;\n this.modalCloseButton = this.queryModalElement('.ar-modal-close') as HTMLButtonElement | null;\n this.modalDoneButton = this.queryModalElement('.ar-modal-done') as HTMLButtonElement | null;\n this.modalClearButton = this.queryModalElement('.ar-modal-clear') as HTMLButtonElement | null;\n this.modalUploadButton = this.queryModalElement('.ar-modal-upload-button') as HTMLButtonElement | null;\n this.modalCancelButton = this.queryModalElement('.ar-modal-cancel') as HTMLButtonElement | null;\n this.modalAddMoreButton = this.queryModalElement('.ar-modal-add-more') as HTMLButtonElement | null;\n this.modalFooterActions = this.queryModalElement('.ar-modal-footer-actions') as HTMLElement | null;\n this.modalSourceContainer = this.queryModalElement('.ar-modal-sources') as HTMLElement | null;\n this.actionsSourceContainer = this.shadow.querySelector('.ar-actions-sources');\n this.modalTitleElement = this.queryModalElement('.ar-modal-title') as HTMLElement | null;\n this.modalHeaderElement = this.queryModalElement('.ar-modal-header') as HTMLElement | null;\n this.modalPoweredElement = this.queryModalElement('.ar-modal-powered') as HTMLElement | null;\n this.inlinePoweredElement = this.shadow.querySelector('.ar-inline-powered');\n this.duplicateBanners = this.queryModalElements('.ar-duplicate-banner') as HTMLElement[];\n this.errorBannerElement = this.queryModalElement('.ar-error-banner') as HTMLElement | null;\n this.updateErrorBanner();\n\n const icon = resolveIcon(this.icons.upload);\n const iconContainer = this.shadow.querySelector('.ar-dropzone-icon');\n if (icon && iconContainer) {\n iconContainer.innerHTML = '';\n iconContainer.appendChild(icon);\n }\n const buttonIcon = resolveIcon(this.icons.upload);\n const triggerIconContainer = this.shadow.querySelector('.ar-button-icon');\n if (buttonIcon && triggerIconContainer) {\n triggerIconContainer.innerHTML = '';\n triggerIconContainer.appendChild(buttonIcon);\n }\n const closeIcon = resolveIcon(this.icons.close);\n const closeIconContainer = this.queryModalElement('.ar-modal-close-icon');\n if (closeIcon && closeIconContainer) {\n closeIconContainer.innerHTML = '';\n closeIconContainer.appendChild(closeIcon);\n }\n }\n\n private applyDimensions() {\n if (!this.rootElement) return;\n\n const requestedWidth = this.options.width;\n\n if (requestedWidth === undefined || requestedWidth === null || requestedWidth === '') {\n if (this.triggerType === 'inline') {\n this.rootElement.style.width = '100%';\n } else {\n this.rootElement.style.removeProperty('width');\n }\n return;\n }\n\n const normalizedWidth =\n typeof requestedWidth === 'number' ? `${requestedWidth}px` : requestedWidth;\n this.rootElement.style.width = normalizedWidth;\n }\n\n private configureInputs() {\n this.fileInput?.removeAttribute('webkitdirectory');\n this.fileInput?.removeAttribute('mozdirectory');\n this.fileInput?.removeAttribute('directory');\n\n if (this.options.allowMultiple === false) {\n this.fileInput?.removeAttribute('multiple');\n } else {\n this.fileInput?.setAttribute('multiple', '');\n }\n\n if (this.options.accept?.length) {\n this.fileInput.accept = this.options.accept.join(',');\n }\n }\n\n private bindEvents() {\n this.triggerButton?.addEventListener('click', () => {\n this.isModalOpen = true;\n this.render();\n });\n\n this.modalCloseButton?.addEventListener('click', () => {\n this.isModalOpen = false;\n this.render();\n });\n\n this.modalElement?.addEventListener('click', event => {\n const target = event.target as HTMLElement;\n if (!target) return;\n if (target === this.modalElement || target.classList.contains('ar-modal-backdrop')) {\n this.isModalOpen = false;\n this.render();\n }\n });\n\n this.modalUploadButton?.addEventListener('click', () => {\n if (!this.controller) return;\n if (this.controller.getState().isUploading) return;\n void this.controller.uploadAll();\n });\n\n this.modalDoneButton?.addEventListener('click', () => {\n if (!this.controller) return;\n const state = this.controller.getState();\n const allCompleted = state.items.length > 0 && state.items.every(item => item.status === 'completed');\n if (this.triggerType === 'inline') {\n if (state.isUploading) {\n return;\n }\n if (allCompleted || state.items.length === 0) {\n this.controller.reset();\n this.updateState();\n }\n return;\n }\n if (state.isUploading) {\n this.closeModal();\n return;\n }\n if (allCompleted) {\n this.closeModal();\n return;\n }\n this.closeModal();\n });\n\n this.modalClearButton?.addEventListener('click', () => {\n if (!this.controller) return;\n const { isUploading } = this.controller.getState();\n if (isUploading) {\n return;\n }\n this.controller.reset();\n this.updateState();\n });\n\n this.modalCancelButton?.addEventListener('click', () => {\n if (!this.controller) return;\n const currentState = this.controller.getState();\n if (currentState.isUploading) return;\n this.controller.reset();\n if (this.triggerType === 'inline') {\n this.updateState();\n return;\n }\n this.isModalOpen = false;\n this.render();\n });\n\n this.modalAddMoreButton?.addEventListener('click', () => {\n this.openFileDialog();\n });\n\n this.dropzone?.addEventListener('click', () => this.openFileDialog());\n this.dropzone?.addEventListener('dragenter', event => {\n event.preventDefault();\n this.dropzone?.classList.add('is-dragging');\n });\n this.dropzone?.addEventListener('dragover', event => {\n event.preventDefault();\n this.dropzone?.classList.add('is-dragging');\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'copy';\n }\n });\n this.dropzone?.addEventListener('dragleave', event => {\n if (event.target === this.dropzone) {\n this.dropzone?.classList.remove('is-dragging');\n }\n });\n this.dropzone?.addEventListener('drop', async event => {\n event.preventDefault();\n this.dropzone?.classList.remove('is-dragging');\n const files = await this.extractFilesFromEvent(event);\n if (files.length) {\n await this.controller?.addFiles(files);\n }\n if (this.fileInput) {\n this.fileInput.value = '';\n }\n });\n\n this.fileInput?.addEventListener('change', async () => {\n const files = this.fileInput?.files ? Array.from(this.fileInput.files) : [];\n const mapped = files.map(file => ({\n file,\n relativePath: (file as File & { webkitRelativePath?: string }).webkitRelativePath,\n }));\n await this.controller?.addFiles(mapped);\n if (this.fileInput) this.fileInput.value = '';\n });\n\n this.uploadButton?.addEventListener('click', () => {\n if (this.controller?.getState().isUploading) return;\n void this.controller?.uploadAll();\n });\n }\n\n private async extractFilesFromEvent(\n event: DragEvent\n ): Promise<Array<{ file: File; relativePath?: string }>> {\n const items = event.dataTransfer?.items;\n\n if (!items) {\n const files = event.dataTransfer?.files ? Array.from(event.dataTransfer.files) : [];\n return files.map(file => ({\n file,\n relativePath: (file as File & { webkitRelativePath?: string }).webkitRelativePath,\n }));\n }\n\n const entries = Array.from(items)\n .map(item => (item.webkitGetAsEntry ? item.webkitGetAsEntry() : null))\n .filter(Boolean) as FileSystemEntry[];\n\n const collected: Array<{ file: File; relativePath?: string }> = [];\n\n for (const entry of entries) {\n const files = await this.readEntry(entry, '');\n collected.push(...files);\n }\n\n return collected;\n }\n\n private readEntry(entry: FileSystemEntry, path = ''): Promise<Array<{ file: File; relativePath?: string }>> {\n return new Promise(resolve => {\n if (entry.isFile) {\n (entry as FileSystemFileEntry).file(file => {\n resolve([{ file, relativePath: path ? `${path}/${file.name}` : file.name }]);\n });\n } else if (entry.isDirectory) {\n const reader = (entry as FileSystemDirectoryEntry).createReader();\n reader.readEntries(async entries => {\n const results = await Promise.all(\n entries.map(child => this.readEntry(child, path ? `${path}/${entry.name}` : entry.name))\n );\n resolve(results.flat());\n });\n } else {\n resolve([]);\n }\n });\n }\n\n private closeModal() {\n this.isModalOpen = false;\n this.render();\n }\n\n private setGlobalError(message: string | null) {\n this.globalErrorMessage = message;\n this.updateErrorBanner();\n }\n\n private clearGlobalError() {\n this.setGlobalError(null);\n }\n\n private updateErrorBanner() {\n if (!this.errorBannerElement) return;\n if (this.globalErrorMessage) {\n this.errorBannerElement.hidden = false;\n this.errorBannerElement.textContent = this.globalErrorMessage;\n } else {\n this.errorBannerElement.hidden = true;\n this.errorBannerElement.textContent = '';\n }\n }\n\n private handleControllerError(error: unknown) {\n if (this.isAbortError(error)) {\n this.clearGlobalError();\n return;\n }\n\n const status =\n typeof error === 'object' && error !== null && 'status' in error\n ? (error as any).status\n : undefined;\n const messageCandidate =\n error instanceof Error\n ? error.message\n : typeof (error as any)?.message === 'string'\n ? (error as any).message\n : typeof error === 'string'\n ? error\n : '';\n\n const normalized = String(messageCandidate ?? '').toLowerCase();\n const isAuthError =\n (typeof status === 'number' && (status === 401 || status === 403)) ||\n normalized.includes('unauthorized') ||\n normalized.includes('forbidden') ||\n normalized.includes('invalid api key');\n\n if (isAuthError) {\n this.setGlobalError(this.labels.invalidApiKey);\n } else if (messageCandidate) {\n this.setGlobalError(String(messageCandidate));\n } else {\n this.setGlobalError(this.labels.uploadFailed);\n }\n }\n\n private updateState() {\n if (!this.controller) return;\n if (!this.fileList) return;\n\n const state = this.controller.getState();\n const { items, isUploading, duplicates } = state;\n const hasItems = items.length > 0;\n const hasAuthError = items.some(item => item.error === 'invalid-api-key');\n\n if (hasAuthError) {\n this.setGlobalError(this.labels.invalidApiKey);\n }\n\n if (this.rootElement) {\n this.rootElement.classList.toggle('is-uploading', isUploading);\n this.rootElement.classList.toggle('has-items', hasItems);\n }\n\n if (this.dropzone) {\n if (hasItems) {\n this.dropzone.style.display = 'none';\n } else {\n this.dropzone.style.display = 'flex';\n }\n }\n\n this.renderFileList(items);\n this.updateErrorBanner();\n this.renderSourceOptions(hasItems);\n this.updateModalTitle(items, isUploading);\n this.updateDuplicateBanners(duplicates);\n\n if (this.modalHeaderElement) {\n this.modalHeaderElement.style.display = hasItems ? '' : 'none';\n }\n if (this.modalPoweredElement) {\n this.modalPoweredElement.style.display = hasItems ? 'none' : '';\n }\n if (this.inlinePoweredElement) {\n this.inlinePoweredElement.style.display = hasItems ? 'none' : '';\n }\n\n if (this.triggerType === 'button' || this.triggerType === 'inline') {\n const completedCount = items.filter(item => item.status === 'completed').length;\n const allCompleted = hasItems && completedCount === items.length && completedCount > 0;\n\n if (this.modalFooterActions) {\n this.modalFooterActions.style.display = hasItems ? '' : 'none';\n }\n\n const uploadButton = this.modalUploadButton;\n const doneButton = this.modalDoneButton;\n const cancelButton = this.modalCancelButton;\n const clearButton = this.modalClearButton;\n const addMoreButton = this.modalAddMoreButton;\n\n const showUpload = hasItems && !isUploading && !allCompleted;\n const showAddMore = hasItems && !isUploading && !allCompleted;\n const showDone = hasItems && (isUploading || allCompleted);\n const showClear = hasItems && (isUploading || allCompleted);\n const showInlineCancel =\n this.triggerType === 'inline' && hasItems && !isUploading && !allCompleted;\n const showButtonCancel =\n this.triggerType === 'button' && !isUploading && (!allCompleted || !hasItems);\n const showCancel = showInlineCancel || showButtonCancel;\n\n if (uploadButton) {\n uploadButton.style.display = showUpload ? '' : 'none';\n uploadButton.toggleAttribute('disabled', !showUpload);\n }\n\n if (doneButton) {\n doneButton.style.display = showDone ? '' : 'none';\n doneButton.textContent = this.labels.done;\n doneButton.toggleAttribute('disabled', !showDone);\n }\n\n if (clearButton) {\n clearButton.style.display = showClear ? '' : 'none';\n clearButton.toggleAttribute('disabled', isUploading);\n }\n\n if (cancelButton) {\n cancelButton.style.display = showCancel ? '' : 'none';\n cancelButton.classList.toggle(\n 'is-fullwidth',\n this.triggerType === 'button' && !hasItems\n );\n }\n\n if (addMoreButton) {\n addMoreButton.style.display = showAddMore ? '' : 'none';\n addMoreButton.toggleAttribute('disabled', !showAddMore);\n }\n }\n }\n\n private renderFileList(items: UploadItem[]) {\n if (!this.fileList) return;\n this.fileList.innerHTML = '';\n if (items.length === 0) {\n this.fileList.style.display = 'none';\n this.fileList.classList.remove('is-grid');\n return;\n }\n\n const isGridLayout = this.fileLayout === 'grid';\n this.fileList.style.display = isGridLayout ? 'grid' : 'flex';\n this.fileList.classList.toggle('is-grid', isGridLayout);\n if (isGridLayout) {\n this.fileList.style.gridTemplateColumns = 'repeat(auto-fill, minmax(140px, 1fr))';\n this.fileList.style.gap = '1rem';\n } else {\n this.fileList.style.removeProperty('grid-template-columns');\n this.fileList.style.removeProperty('gap');\n }\n\n const isUploading = this.controller?.getState().isUploading ?? false;\n\n items.forEach(item => {\n const li = document.createElement('li');\n li.className = 'ar-file-item';\n li.classList.toggle('is-grid', isGridLayout);\n\n const isInvalidApiKeyError = item.error === 'invalid-api-key';\n\n if (item.status === 'uploading' || item.status === 'pending') li.classList.add('is-uploading');\n if (item.status === 'completed') li.classList.add('is-completed');\n if (item.status === 'error' && !isInvalidApiKeyError) li.classList.add('is-error');\n\n const header = document.createElement('div');\n header.className = 'ar-file-header';\n header.classList.toggle('is-grid', isGridLayout);\n\n const thumb = document.createElement('div');\n thumb.className = 'ar-file-thumb';\n thumb.classList.toggle('is-grid', isGridLayout);\n const isImage = item.file.type.startsWith('image/');\n if (item.previewUrl && isImage) {\n const img = document.createElement('img');\n img.src = item.previewUrl;\n img.alt = item.file.name;\n thumb.appendChild(img);\n } else {\n // Show document icon for non-images\n thumb.classList.add('ar-file-thumb-document');\n const documentIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n documentIcon.setAttribute('viewBox', '0 0 24 24');\n documentIcon.setAttribute('width', '24');\n documentIcon.setAttribute('height', '24');\n documentIcon.setAttribute('fill', 'none');\n documentIcon.setAttribute('aria-hidden', 'true');\n const path1 = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path1.setAttribute('d', 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6Z');\n path1.setAttribute('stroke', 'currentColor');\n path1.setAttribute('stroke-width', '1.5');\n path1.setAttribute('stroke-linecap', 'round');\n path1.setAttribute('stroke-linejoin', 'round');\n const path2 = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path2.setAttribute('d', 'M14 2v6h6');\n path2.setAttribute('stroke', 'currentColor');\n path2.setAttribute('stroke-width', '1.5');\n path2.setAttribute('stroke-linecap', 'round');\n path2.setAttribute('stroke-linejoin', 'round');\n documentIcon.appendChild(path1);\n documentIcon.appendChild(path2);\n thumb.appendChild(documentIcon);\n }\n\n if (item.status === 'completed') {\n const statusOverlay = document.createElement('div');\n statusOverlay.className = 'ar-thumb-status';\n const successIcon = resolveIcon(this.icons.success);\n if (successIcon) {\n statusOverlay.appendChild(successIcon);\n }\n thumb.appendChild(statusOverlay);\n } else if (item.status === 'error' && !isInvalidApiKeyError) {\n const statusOverlay = document.createElement('div');\n statusOverlay.className = 'ar-thumb-status is-error';\n const errorIcon = resolveIcon(this.icons.error);\n if (errorIcon) {\n statusOverlay.appendChild(errorIcon);\n }\n thumb.appendChild(statusOverlay);\n }\n\n const name = document.createElement('span');\n name.className = 'ar-file-name';\n name.textContent = item.file.name;\n if (isGridLayout && !this.showGridFileName) {\n name.style.display = 'none';\n } else {\n name.style.display = '';\n }\n\n const removeButton = document.createElement('button');\n removeButton.type = 'button';\n removeButton.className = 'ar-remove-button';\n const shouldShowRemove =\n (item.status === 'pending' ||\n (item.status === 'error' && isInvalidApiKeyError)) &&\n !isUploading;\n removeButton.disabled = !shouldShowRemove;\n removeButton.hidden = !shouldShowRemove;\n removeButton.style.display = shouldShowRemove ? 'inline-flex' : 'none';\n removeButton.classList.toggle('is-grid', isGridLayout);\n const removeIcon = resolveIcon(this.icons.remove);\n if (removeIcon) {\n removeButton.appendChild(removeIcon);\n }\n removeButton.addEventListener('click', () => {\n if (this.controller?.getState().isUploading) return;\n this.controller?.removeFile(item.id);\n });\n\n header.appendChild(thumb);\n header.appendChild(name);\n header.appendChild(removeButton);\n li.appendChild(header);\n\n // Display info message (not error) if present - show it right after header\n if (item.info) {\n const metaRow = document.createElement('div');\n metaRow.className = 'ar-file-meta';\n const infoText = document.createElement('span');\n infoText.className = 'ar-file-info';\n infoText.textContent = item.info;\n metaRow.appendChild(infoText);\n li.appendChild(metaRow);\n }\n\n const progressBorder = document.createElement('div');\n progressBorder.className = 'ar-progress-border';\n\n const progressFill = document.createElement('div');\n progressFill.className = 'ar-progress-fill';\n\n const isPendingStatus = item.status === 'pending';\n const isUploadingStatus = item.status === 'uploading';\n const isCompleteStatus = item.status === 'completed';\n const rawProgress = Math.max(0, Math.min(100, item.progress ?? 0));\n const calculatedTrain = !isCompleteStatus && rawProgress < 20;\n const shouldAnimateTrain = (isUploadingStatus || (isUploading && isPendingStatus)) && calculatedTrain;\n // Keep indicator active if uploading, even if progress hasn't updated recently\n const isActive = isUploadingStatus || shouldAnimateTrain || (rawProgress > 0 && !isCompleteStatus);\n const stateLabel = isCompleteStatus ? 'complete' : shouldAnimateTrain ? 'train' : rawProgress >= 20 ? 'progress' : isUploadingStatus ? 'progress' : 'idle';\n\n progressBorder.dataset.state = stateLabel;\n progressBorder.dataset.status = item.status;\n progressBorder.dataset.progress = rawProgress.toFixed(0);\n\n progressBorder.classList.toggle('is-active', isActive);\n progressBorder.classList.toggle('is-train', shouldAnimateTrain);\n progressBorder.classList.toggle('is-complete', isCompleteStatus);\n progressBorder.style.display = isCompleteStatus ? 'none' : '';\n\n progressFill.classList.toggle('is-train', shouldAnimateTrain);\n progressFill.classList.toggle('is-animating', shouldAnimateTrain);\n\n if (isCompleteStatus) {\n progressFill.style.width = '100%';\n } else if (shouldAnimateTrain) {\n progressFill.style.width = '100%';\n } else if (isUploadingStatus && rawProgress === 0) {\n // Show minimal progress for uploading items even if progress hasn't started\n progressFill.style.width = '3%';\n } else {\n const computedWidth = Math.max(rawProgress, 3);\n progressFill.style.width = `${Math.min(computedWidth, 100)}%`;\n }\n\n progressBorder.appendChild(progressFill);\n\n li.appendChild(progressBorder);\n\n this.fileList?.appendChild(li);\n });\n }\n\n private renderSourceOptions(hasItems: boolean) {\n // Filter out disabled sources - only show enabled ones\n const enabledSources = this.sourceOptions.filter(option => !option.disabled);\n const hasSourcesConfigured = enabledSources.length > 0;\n\n const renderChoiceList = (container: HTMLElement) => {\n container.innerHTML = '';\n if (!hasSourcesConfigured) {\n container.style.display = 'none';\n container.classList.remove('ar-source-list--choices');\n return;\n }\n\n container.style.display = hasItems ? 'none' : 'flex';\n container.classList.toggle('ar-source-list--choices', !hasItems);\n if (hasItems) return;\n\n // Only render enabled sources\n enabledSources.forEach(option => {\n const button = document.createElement('button');\n button.type = 'button';\n button.className = 'ar-source-option';\n\n const icon = resolveIcon(option.icon ?? this.icons.upload);\n if (icon) {\n const iconWrapper = document.createElement('span');\n iconWrapper.className = 'ar-source-option-icon';\n iconWrapper.appendChild(icon);\n button.appendChild(iconWrapper);\n }\n\n const label = document.createElement('span');\n label.className = 'ar-source-option-label';\n label.textContent = option.label;\n button.appendChild(label);\n\n button.addEventListener('click', () => this.handleSourceOption(option));\n container.appendChild(button);\n });\n };\n\n this.sourceLists.forEach(container => {\n renderChoiceList(container);\n });\n\n if (this.modalSourceContainer) {\n this.modalSourceContainer.classList.toggle('is-visible', hasSourcesConfigured && !hasItems);\n this.modalSourceContainer.style.display = hasSourcesConfigured ? '' : 'none';\n this.modalSourceContainer.innerHTML = '';\n }\n if (this.actionsSourceContainer) {\n this.actionsSourceContainer.classList.toggle('is-visible', hasSourcesConfigured && !hasItems);\n this.actionsSourceContainer.style.display = hasSourcesConfigured ? '' : 'none';\n this.actionsSourceContainer.innerHTML = '';\n }\n\n // Add class to modal body and inline upload when sources are empty in inline mode\n if (this.triggerType === 'inline') {\n if (this.modalBody) {\n this.modalBody.classList.toggle('ar-modal-body--no-sources', !hasSourcesConfigured);\n }\n if (this.inlineUpload) {\n this.inlineUpload.classList.toggle('ar-inline-upload--no-sources', !hasSourcesConfigured);\n }\n }\n }\n\n private updateModalTitle(items: UploadItem[], isUploading: boolean) {\n if (!this.modalTitleElement) return;\n if (items.length === 0) {\n this.modalTitleElement.textContent = isUploading\n ? this.labels.uploading\n : this.labels.title;\n this.modalTitleElement.classList.remove('is-dynamic', 'is-success');\n return;\n }\n\n const total = items.length;\n const modalTitle = this.modalTitleElement;\n\n const suffix = total === 1 ? 'file' : 'files';\n const completedCount = items.filter(item => item.status === 'completed').length;\n\n modalTitle.classList.add('is-dynamic');\n modalTitle.classList.toggle('is-success', completedCount === total);\n\n if (isUploading) {\n modalTitle.textContent = `Uploading ${completedCount}/${total} ${suffix}`;\n return;\n }\n\n if (completedCount === total) {\n modalTitle.textContent = `${total} ${suffix} uploaded`;\n return;\n }\n\n modalTitle.textContent = `${total} ${suffix} ready`;\n }\n\n private updateDuplicateBanners(duplicates: string[]) {\n const hasDuplicates = duplicates.length > 0;\n const prefix =\n duplicates.length === 1\n ? this.labels.duplicateFileExists\n : this.labels.duplicateFilesExist;\n const message = hasDuplicates\n ? `${prefix} ${duplicates.join(', ')}`\n : '';\n\n this.duplicateBanners.forEach(banner => {\n banner.hidden = !hasDuplicates;\n banner.textContent = message;\n });\n }\n\n private handleSourceOption(option: UploadSourceOption) {\n if (option.disabled) return;\n\n this.options.onSourceSelect?.(option);\n this.dispatchEvent(new CustomEvent('sourceselect', { detail: option }));\n\n if (option.kind === 'device' && !option.action) {\n this.openFileDialog();\n return;\n }\n\n if (option.action) {\n try {\n option.action();\n } catch (error) {\n console.error('[AutorenderUploader] Source action failed', error);\n }\n return;\n }\n\n console.warn('[AutorenderUploader] No handler configured for source option', option);\n }\n\n private applyThemeVariables() {\n const theme = (this.options.theme ?? {}) as ThemeOptions;\n const borderRadius = theme.borderRadius;\n const accentColor = theme.accentColor;\n const dropzoneBackground = theme.dropzoneBackground ?? DEFAULT_THEME.dropzoneBackground;\n const dropzoneBorder = theme.dropzoneBorder ?? DEFAULT_THEME.dropzoneBorder;\n const fontFamily = theme.fontFamily;\n\n if (borderRadius !== undefined) {\n this.style.setProperty(\n '--ar-radius',\n typeof borderRadius === 'number' ? `${borderRadius}px` : String(borderRadius)\n );\n } else {\n this.style.removeProperty('--ar-radius');\n }\n\n // Only set accent color if explicitly provided; otherwise let palette CSS handle it\n if (accentColor) {\n this.style.setProperty('--ar-color-accent', accentColor);\n } else {\n this.style.removeProperty('--ar-color-accent');\n }\n\n if (dropzoneBackground) {\n this.style.setProperty('--ar-dropzone-bg', dropzoneBackground);\n }\n if (dropzoneBorder) {\n this.style.setProperty('--ar-dropzone-border', dropzoneBorder);\n }\n if (fontFamily) {\n this.style.setProperty('--ar-font-family', fontFamily);\n }\n\n const appearance = theme.appearance ?? DEFAULT_THEME.appearance;\n let resolvedAppearance = appearance;\n if (appearance === 'system' && typeof window !== 'undefined') {\n resolvedAppearance = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n this.setAttribute('data-theme', resolvedAppearance);\n\n // Apply palette\n const palette = this.options.palette;\n if (palette) {\n this.setAttribute('data-palette', palette);\n } else {\n this.removeAttribute('data-palette');\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'autorender-uploader': AutorenderUploaderElement;\n }\n}","/**\n * Device detection utilities for DPR.\n */\n\nexport function getDPR(): number {\n if (typeof window === 'undefined') return 1;\n const dpr = window.devicePixelRatio || 1;\n // Round to 1 or 2 for most cases (can be extended to 3 for high-DPI)\n return dpr >= 2 ? 2 : 1;\n}\n\n","/**\n * Transformation builder - converts TransformOptions to URL transformation string\n * with deterministic sorting\n */\n\nimport type { TransformOptions, LayerOptions } from './types';\nimport { getDPR } from './device';\n\ninterface TransformationPart {\n param: string;\n value: string;\n sortKey: string; // For deterministic sorting\n}\n\nfunction normalizePosition(value: string): string {\n const normalized = value.trim().toLowerCase();\n const positionMap: Record<string, string> = {\n center: 'c',\n 'top-left': 'tl',\n 'top-right': 'tr',\n 'bottom-left': 'bl',\n 'bottom-right': 'br',\n top: 't',\n bottom: 'b',\n left: 'l',\n right: 'r',\n p_c: 'c',\n p_tl: 'tl',\n p_tr: 'tr',\n p_bl: 'bl',\n p_br: 'br',\n p_t: 't',\n p_b: 'b',\n p_l: 'l',\n p_r: 'r',\n };\n return positionMap[normalized] || normalized;\n}\n\n/** Output format is GIF — omit DPR and quality in delivery URLs (e.g. ARImage / animated GIF). */\nexport function isGifFormatOutput(transform?: TransformOptions | null): boolean {\n const f = transform?.f;\n return typeof f === 'string' && f.toLowerCase() === 'gif';\n}\n\n/**\n * Build transformation string from options\n * Transformations are sorted alphabetically by param prefix\n */\nexport function buildTransformString(\n transform: TransformOptions,\n defaults?: { f?: string; q?: string | number; [key: string]: any },\n enableDPR: boolean = true\n): string {\n const parts: TransformationPart[] = [];\n \n // Helper to add transformation part\n const addPart = (param: string, value: string | number | boolean) => {\n if (value === undefined || value === null) return;\n \n let valueStr: string;\n if (typeof value === 'boolean') {\n valueStr = value ? '' : '';\n if (!value) return; // Skip false booleans\n } else {\n valueStr = String(value);\n }\n \n // Create sort key: param prefix determines order\n // Special handling: dpr_ should come early, but after basic size params\n let sortKey = param;\n if (param.startsWith('dpr_')) {\n sortKey = 'dpr_' + param; // Keep dpr early\n } else if (param.startsWith('a_')) {\n sortKey = 'a_' + param; // Text rotation\n } else if (param.startsWith('ar_')) {\n sortKey = 'ar_' + param;\n } else if (param.startsWith('bg_')) {\n sortKey = 'bg_' + param;\n } else if (param.startsWith('c_')) {\n sortKey = 'c_' + param;\n } else if (param.startsWith('co_')) {\n sortKey = 'co_' + param; // Text color\n } else if (param.startsWith('e_')) {\n sortKey = 'e_' + param;\n } else if (param.startsWith('f_')) {\n sortKey = 'f_' + param;\n } else if (param.startsWith('fl_')) {\n sortKey = 'fl_' + param;\n } else if (param.startsWith('fo_')) {\n sortKey = 'fo_' + param;\n } else if (param.startsWith('flip_')) {\n sortKey = 'flip_' + param;\n } else if (param.startsWith('h_')) {\n sortKey = 'h_' + param;\n } else if (param.startsWith('ip_')) {\n sortKey = 'ip_' + param; // Image layer placement\n } else if (param.startsWith('k_')) {\n sortKey = 'k_' + param;\n } else if (param.startsWith('l_')) {\n sortKey = 'l_' + param;\n } else if (param.startsWith('la_')) {\n sortKey = 'la_' + param;\n } else if (param.startsWith('lar_')) {\n sortKey = 'lar_' + param;\n } else if (param.startsWith('lbg_')) {\n sortKey = 'lbg_' + param;\n } else if (param.startsWith('lc_')) {\n sortKey = 'lc_' + param;\n } else if (param.startsWith('le_')) {\n sortKey = 'le_' + param;\n } else if (param.startsWith('lf_')) {\n sortKey = 'lf_' + param;\n } else if (param.startsWith('lflip_')) {\n sortKey = 'lflip_' + param;\n } else if (param.startsWith('lh_')) {\n sortKey = 'lh_' + param;\n } else if (param.startsWith('lp_')) {\n sortKey = 'lp_' + param;\n } else if (param.startsWith('lq_')) {\n sortKey = 'lq_' + param;\n } else if (param.startsWith('lr_')) {\n sortKey = 'lr_' + param;\n } else if (param.startsWith('ltype_')) {\n sortKey = 'ltype_' + param;\n } else if (param.startsWith('lw_')) {\n sortKey = 'lw_' + param;\n } else if (param.startsWith('lzoom_')) {\n sortKey = 'lzoom_' + param;\n } else if (param.startsWith('lbr_')) {\n sortKey = 'lbr_' + param;\n } else if (param.startsWith('o_')) {\n sortKey = 'o_' + param; // Opacity\n } else if (param.startsWith('p_')) {\n sortKey = 'p_' + param;\n } else if (param.startsWith('ps_')) {\n sortKey = 'ps_' + param;\n } else if (param.startsWith('q_')) {\n sortKey = 'q_' + param;\n } else if (param.startsWith('r_')) {\n sortKey = 'r_' + param;\n } else if (param.startsWith('tp_')) {\n sortKey = 'tp_' + param; // Text placement\n } else if (param.startsWith('w_')) {\n sortKey = 'w_' + param;\n } else if (param.startsWith('x_')) {\n sortKey = 'x_' + param;\n } else if (param.startsWith('y_')) {\n sortKey = 'y_' + param;\n } else if (param.startsWith('z_')) {\n sortKey = 'z_' + param;\n } else if (param.startsWith('br_')) {\n sortKey = 'br_' + param;\n }\n \n parts.push({ param, value: valueStr, sortKey });\n };\n \n // Size & Crop\n if (transform.w !== undefined) addPart('w_', transform.w);\n if (transform.h !== undefined) addPart('h_', transform.h);\n if (transform.fit) {\n const fitMap: Record<string, string> = {\n crop: 'crop',\n fill: 'fill',\n fit: 'fit',\n scale: 'scale'\n };\n addPart('c_', fitMap[transform.fit] || transform.fit);\n }\n if (transform.ar) addPart('ar_', transform.ar);\n if (transform.position) addPart('p_', normalizePosition(transform.position));\n if (transform.position_startagy) {\n const strategy = String(transform.position_startagy).trim().toLowerCase().replace(/^ps_/, '');\n if (strategy === 'entropy' || strategy === 'attention') {\n addPart('ps_', strategy);\n }\n }\n if (transform.focus) addPart('fo_', transform.focus);\n\n // Video trim (seconds) → so_{n}, eo_{n}\n if (transform.so !== undefined) addPart('so_', transform.so);\n if (transform.eo !== undefined) addPart('eo_', transform.eo);\n \n // Transform\n if (transform.r !== undefined) addPart('r_', transform.r);\n if (transform.z !== undefined) addPart('z_', transform.z);\n if (transform.flip) addPart('flip_', transform.flip);\n if (transform.br !== undefined) addPart('br_', transform.br);\n \n const resolvedFormat = transform.f ?? defaults?.f;\n const isGifOutput =\n typeof resolvedFormat === 'string' && resolvedFormat.toLowerCase() === 'gif';\n if (resolvedFormat && resolvedFormat !== 'auto') addPart('f_', resolvedFormat);\n\n // Quality: for GIF, only honor explicit `transform.q` (e.g. 50 → q_50, 90 → q_90); skip defaults.q.\n const quality = isGifOutput ? transform.q : transform.q ?? defaults?.q;\n if (quality !== undefined && quality !== 'auto') addPart('q_', quality);\n\n // Background\n if (transform.bg) {\n if (transform.bg.startsWith('rgb:')) {\n addPart('bg_rgb:', transform.bg.replace('rgb:', ''));\n } else {\n addPart('bg_', transform.bg);\n }\n }\n \n // DPR (auto-inject if enabled and not explicitly set) — never for GIF output\n if (!isGifOutput) {\n if (enableDPR && transform.dpr === undefined) {\n const dpr = getDPR();\n if (dpr !== 1) addPart('dpr_', dpr);\n } else if (transform.dpr !== undefined) {\n addPart('dpr_', transform.dpr);\n }\n }\n \n // Effects (e_*)\n if (transform.improve !== undefined) {\n if (typeof transform.improve === 'boolean' && transform.improve) {\n addPart('e_improve', '');\n } else if (typeof transform.improve === 'string') {\n addPart('e_improve', transform.improve);\n } else if (typeof transform.improve === 'object') {\n const { mode, blend } = transform.improve;\n let value = mode || '';\n if (blend !== undefined) value += `:${blend}`;\n addPart('e_improve', value);\n }\n }\n if (transform.unsharpMask !== undefined) addPart('e_unsharp_mask:', transform.unsharpMask);\n if (transform.saturation !== undefined) addPart('e_saturation:', transform.saturation);\n if (transform.contrast !== undefined) addPart('e_contrast:', transform.contrast);\n if (transform.brightness !== undefined) addPart('e_brightness:', transform.brightness);\n if (transform.gamma !== undefined) addPart('e_gamma:', transform.gamma);\n if (transform.sharpen !== undefined) {\n if (typeof transform.sharpen === 'boolean' && transform.sharpen) {\n addPart('e_sharpen', '');\n } else {\n addPart('e_sharpen:', transform.sharpen);\n }\n }\n if (transform.grayscale) addPart('e_grayscale', '');\n if (transform.blackwhite !== undefined) addPart('e_blackwhite:', transform.blackwhite);\n if (transform.hue !== undefined) addPart('e_hue:', transform.hue);\n if (transform.warmth !== undefined) addPart('e_warmth:', transform.warmth);\n if (transform.tint !== undefined) addPart('e_tint:', transform.tint);\n if (transform.normalize) addPart('e_normalize', '');\n if (transform.invert) addPart('e_invert', '');\n if (transform.fade !== undefined) addPart('e_fade:', transform.fade);\n if (transform.vignette !== undefined) addPart('e_vignette:', transform.vignette);\n if (transform.highlights !== undefined) addPart('e_highlights:', transform.highlights);\n if (transform.shadows !== undefined) addPart('e_shadows:', transform.shadows);\n if (transform.exposure !== undefined) addPart('e_exposure:', transform.exposure);\n if (transform.structure !== undefined) addPart('e_structure:', transform.structure);\n if (transform.autoEnhance) addPart('e_auto_enhance', '');\n if (transform.temperature !== undefined) addPart('e_temperature:', transform.temperature);\n if (transform.linear) addPart('e_linear:', transform.linear);\n if (transform.recomb) addPart('e_recomb:', transform.recomb);\n if (transform.threshold !== undefined) addPart('e_threshold:', transform.threshold);\n if (transform.convolve) addPart('e_convolve:', transform.convolve);\n if (transform.unflatten) addPart('e_unflatten', '');\n if (transform.flatten) addPart('e_flatten', '');\n if (transform.median !== undefined) addPart('e_median:', transform.median);\n if (transform.blur !== undefined) addPart('e_blur:', transform.blur);\n if (transform.extend) addPart('e_extend:', transform.extend);\n if (transform.affine) addPart('e_affine:', transform.affine);\n if (transform.extract) addPart('e_extract:', transform.extract);\n if (transform.ensureAlpha) addPart('e_ensure_alpha', '');\n if (transform.removeAlpha) addPart('e_remove_alpha:', transform.removeAlpha);\n \n // Blend mode (for layers)\n if (transform.blend) addPart('e_', transform.blend);\n \n // Raw transformations (for advanced users)\n Object.keys(transform).forEach(key => {\n if (key.startsWith('_') || \n ['w', 'h', 'fit', 'ar', 'position', 'position_startagy', 'focus', 'so', 'eo', 'r', 'z', 'flip', 'br', 'f', 'q', 'bg', 'dpr',\n 'improve', 'unsharpMask', 'saturation', 'contrast', 'brightness', 'gamma', 'sharpen',\n 'grayscale', 'blackwhite', 'hue', 'warmth', 'tint', 'normalize', 'invert', 'fade',\n 'vignette', 'highlights', 'shadows', 'exposure', 'structure', 'autoEnhance', 'temperature',\n 'linear', 'recomb', 'threshold', 'convolve', 'unflatten', 'flatten', 'median', 'blur',\n 'extend', 'affine', 'extract', 'ensureAlpha', 'removeAlpha', 'blend', 'layers'].includes(key)) {\n return; // Skip already processed keys\n }\n \n // Allow raw transformation strings\n if (typeof transform[key] === 'string' || typeof transform[key] === 'number' || typeof transform[key] === 'boolean') {\n addPart(key, transform[key] as any);\n }\n });\n \n // Sort base transformation parts deterministically by param prefix\n parts.sort((a, b) => {\n // Extract prefix for comparison\n const prefixA = a.param.split('_')[0] + '_';\n const prefixB = b.param.split('_')[0] + '_';\n \n if (prefixA !== prefixB) {\n return prefixA.localeCompare(prefixB);\n }\n \n // Same prefix, compare full param\n return a.param.localeCompare(b.param);\n });\n \n // Build base transformation string\n const baseTransform = parts.map(p => {\n if (p.value === '') {\n return p.param; // Boolean flags without values\n }\n return `${p.param}${p.value}`;\n }).join(',');\n \n // Build layers separately - each layer must end with fl_layer_apply\n const layerParts: string[] = [];\n if (transform.layers && transform.layers.length > 0) {\n transform.layers.forEach(layer => {\n const layerTransformParts: TransformationPart[] = [];\n \n const addLayerPart = (param: string, value: string | number | boolean) => {\n if (value === undefined || value === null) return;\n \n let valueStr: string;\n if (typeof value === 'boolean') {\n valueStr = value ? '' : '';\n if (!value) return; // Skip false booleans\n } else {\n valueStr = String(value);\n }\n \n layerTransformParts.push({\n param,\n value: valueStr,\n sortKey: param\n });\n };\n \n buildLayerTransform(layer, addLayerPart);\n \n // Sort layer parts with specific order (not alphabetical)\n // Order: l_image/l_text first, then ip_/tp_, then other params, then fl_layer_apply\n const applyFlag = layerTransformParts.find(p => p.param === 'fl_layer_apply');\n const regularParts = layerTransformParts.filter(p => p.param !== 'fl_layer_apply');\n \n // Define order priority for layer parameters\n const getLayerParamOrder = (param: string): number => {\n // l_image or l_text must be first\n if (param.startsWith('l_image:') || param.startsWith('l_text:')) return 0;\n // ip_ (image placement) or tp_ (text placement) comes right after l_image/l_text\n if (param.startsWith('ip_') || param.startsWith('tp_')) return 1;\n // l_type comes after placement\n if (param.startsWith('l_type:')) return 2;\n // lw_, lh_ come after l_type\n if (param.startsWith('lw_')) return 3;\n if (param.startsWith('lh_')) return 4;\n // o_ (opacity) comes after dimensions\n if (param.startsWith('o_')) return 5;\n // Other l* layer params (not lzoom_; see below)\n if (param.startsWith('l') && !param.startsWith('lzoom_')) return 6;\n // co_ (color) for text\n if (param.startsWith('co_')) return 7;\n // a_ (rotation) for text\n if (param.startsWith('a_')) return 8;\n // lr_ (rotation) for image\n if (param.startsWith('lr_')) return 8;\n // lzoom_ after placement/color/rotation, before offsets\n if (param.startsWith('lzoom_')) return 9;\n // x_, y_ offsets\n if (param.startsWith('x_') || param.startsWith('y_')) return 10;\n // le_ (layer enhancements)\n if (param.startsWith('le_')) return 11;\n // e_ (blend mode)\n if (param.startsWith('e_')) return 12;\n // Everything else\n return 100;\n };\n \n regularParts.sort((a, b) => {\n const orderA = getLayerParamOrder(a.param);\n const orderB = getLayerParamOrder(b.param);\n \n if (orderA !== orderB) {\n return orderA - orderB;\n }\n \n // Same order priority, sort alphabetically\n return a.param.localeCompare(b.param);\n });\n \n // Build layer string: regular parts + fl_layer_apply at the end\n const layerString = [\n ...regularParts.map(p => p.value === '' ? p.param : `${p.param}${p.value}`),\n ...(applyFlag ? [applyFlag.param] : [])\n ].join(',');\n \n if (layerString) {\n layerParts.push(layerString);\n }\n });\n }\n \n // Combine: base transformations + layers\n const allParts = baseTransform ? [baseTransform, ...layerParts] : layerParts;\n return allParts.join(',');\n}\n\nfunction buildLayerTransform(layer: LayerOptions, addPart: (param: string, value: string | number | boolean) => void) {\n if (layer.type === 'text') {\n // Build text layer: l_text:fontFamily_fontSize_style:text\n // Example: l_text:arial_24_bold:Demo\n const parts: string[] = [];\n if (layer.fontFamily) parts.push(layer.fontFamily);\n if (layer.fontSize !== undefined) parts.push(String(layer.fontSize));\n if (layer.fontStyle) parts.push(layer.fontStyle);\n if (layer.align) parts.push(layer.align);\n \n const text = layer.text ? encodeURIComponent(layer.text) : '';\n const layerSpec = parts.length > 0 ? `${parts.join('_')}:${text}` : text;\n addPart('l_text:', layerSpec);\n \n // Text layer modifiers (after l_text)\n if (layer.fontColor) {\n // Remove # if present, convert to hex without #\n const color = layer.fontColor.replace('#', '');\n addPart('co_', color);\n }\n if (layer.placement) {\n // Convert placement to short form if needed\n const placement = normalizePlacement(layer.placement);\n if (placement) addPart('tp_', placement);\n }\n if (layer.rotation !== undefined) addPart('a_', layer.rotation);\n if (layer.x !== undefined) addPart('x_', layer.x);\n if (layer.y !== undefined) addPart('y_', layer.y);\n } else if (layer.type === 'image') {\n // Image layer: l_image:imagePath\n // Order: l_image, l_type, lw, lh, ip, o, fl_layer_apply\n // Example: l_image:fav.png,l_type:overlay,lw_200,lh_200,ip_ne,o_100,fl_layer_apply\n if (layer.imagePath) {\n addPart('l_image:', layer.imagePath);\n }\n \n // Image layer modifiers in correct order\n if (layer.layerType) addPart('l_type:', layer.layerType);\n if (layer.width !== undefined) addPart('lw_', layer.width);\n if (layer.height !== undefined) addPart('lh_', layer.height);\n if (layer.placement) {\n // Convert placement to short form if needed\n const placement = normalizePlacement(layer.placement);\n if (placement) addPart('ip_', placement);\n }\n if (layer.opacity !== undefined) addPart('o_', layer.opacity);\n if (layer.rotation !== undefined) addPart('lr_', layer.rotation);\n if (layer.crop) addPart('lc_', layer.crop);\n if (layer.aspectRatio) addPart('lar_', layer.aspectRatio);\n if (layer.quality !== undefined) addPart('lq_', layer.quality);\n if (layer.format) addPart('lf_', layer.format);\n if (layer.background) addPart('lbg_', layer.background);\n if (layer.position) addPart('lp_', layer.position);\n if (layer.borderRadius !== undefined) addPart('lbr_', layer.borderRadius);\n if (layer.flip) addPart('lflip_', layer.flip);\n if (layer.zoom !== undefined) addPart('lzoom_', layer.zoom);\n if (layer.x !== undefined) addPart('x_', layer.x);\n if (layer.y !== undefined) addPart('y_', layer.y);\n if (layer.blendMode) addPart('e_', layer.blendMode);\n \n // Layer enhancements (le_*)\n if (layer.enhance) {\n const enhance = layer.enhance;\n if (enhance.improve !== undefined) {\n if (typeof enhance.improve === 'boolean' && enhance.improve) {\n addPart('le_improve', '');\n } else if (typeof enhance.improve === 'string') {\n addPart('le_improve', enhance.improve);\n }\n }\n if (enhance.sharpen !== undefined) addPart('le_sharpen:', enhance.sharpen);\n if (enhance.brightness !== undefined) addPart('le_brightness:', enhance.brightness);\n if (enhance.saturation !== undefined) addPart('le_saturation:', enhance.saturation);\n if (enhance.contrast !== undefined) addPart('le_contrast:', enhance.contrast);\n if (enhance.hue !== undefined) addPart('le_hue:', enhance.hue);\n if (enhance.warmth !== undefined) addPart('le_warmth:', enhance.warmth);\n if (enhance.tint !== undefined) addPart('le_tint:', enhance.tint);\n if (enhance.normalize) addPart('le_normalize', '');\n if (enhance.invert) addPart('le_invert', '');\n if (enhance.fade !== undefined) addPart('le_fade:', enhance.fade);\n if (enhance.vignette !== undefined) addPart('le_vignette:', enhance.vignette);\n if (enhance.highlights !== undefined) addPart('le_highlights:', enhance.highlights);\n if (enhance.shadows !== undefined) addPart('le_shadows:', enhance.shadows);\n if (enhance.exposure !== undefined) addPart('le_exposure:', enhance.exposure);\n if (enhance.structure !== undefined) addPart('le_structure:', enhance.structure);\n if (enhance.autoEnhance) addPart('le_auto_enhance', '');\n if (enhance.temperature !== undefined) addPart('le_temperature:', enhance.temperature);\n if (enhance.blackwhite !== undefined) addPart('le_blackwhite:', enhance.blackwhite);\n if (enhance.gamma !== undefined) addPart('le_gamma:', enhance.gamma);\n if (enhance.unsharpMask !== undefined) addPart('le_unsharp_mask:', enhance.unsharpMask);\n if (enhance.grayscale) addPart('le_grayscale', '');\n }\n }\n \n // Layer apply flag (always at the end)\n addPart('fl_layer_apply', '');\n}\n\n/**\n * Normalize placement values to short form\n * north -> n, north-east -> ne, etc.\n */\nfunction normalizePlacement(placement: string): string {\n const normalized = placement.trim().toLowerCase().replace(/\\s+/g, ' ');\n const mapping: Record<string, string> = {\n 'north': 'n',\n 'south': 's',\n 'east': 'e',\n 'west': 'w',\n 'center': 'c',\n 'north-west': 'nw',\n 'north west': 'nw',\n 'north-east': 'ne',\n 'north east': 'ne',\n 'south-west': 'sw',\n 'south west': 'sw',\n 'south-east': 'se',\n 'south east': 'se',\n 'none': 'none'\n };\n return mapping[normalized] || normalized;\n}\n\n","/**\n * URL builder for AutoRender image URLs\n */\n\nimport { buildTransformString } from './transform';\nimport type { TransformOptions } from './types';\n\nconst ABSOLUTE_URL_RE = /^https?:\\/\\//i;\n\n/**\n * Workspace path segment for `ar.url()` / ARImage `src`.\n *\n * - Relative paths (`products/shoe.jpg`): each path segment is encoded separately.\n * - Absolute URLs (`https://demo.com/photo.jpg`): emitted as `fetch_<url>`.\n */\nexport function encodeAssetPathForDelivery(src: string): string {\n const trimmed = src.trim();\n if (!trimmed) {\n return '';\n }\n\n if (ABSOLUTE_URL_RE.test(trimmed)) {\n const fetchPayload = `fetch_${trimmed}`;\n return encodeURIComponent(fetchPayload);\n }\n\n if (trimmed.startsWith('fetch_')) {\n return encodeURIComponent(trimmed);\n }\n\n return trimmed\n .split('/')\n .filter(Boolean)\n .map(segment => encodeURIComponent(segment))\n .join('/');\n}\n\nexport function buildImageUrl(\n baseUrl: string,\n workspace: string,\n src: string,\n transform?: TransformOptions,\n defaults?: { f?: string; q?: string | number; [key: string]: any },\n enableDPR: boolean = true\n): string {\n // Normalize base URL (remove trailing slashes)\n const normalizedBase = baseUrl.replace(/\\/+$/, '');\n \n // Build transformation string\n const transformStr = buildTransformString(transform || {}, defaults, enableDPR);\n\n const trimmedSrc = src.trim();\n\n // Remote fetch support:\n // For `https://...` sources, the backend expects the `fetch_...` token to be part\n // of the transformation segment (comma-separated), not a separate path segment.\n if (ABSOLUTE_URL_RE.test(trimmedSrc)) {\n const fetchPart = `fetch_${trimmedSrc}`;\n const transformWithFetch = transformStr ? `${transformStr},${fetchPart}` : fetchPart;\n return `${normalizedBase}/${workspace}/${transformWithFetch}`;\n }\n\n // Support callers passing an already-prefixed fetch token.\n if (trimmedSrc.startsWith('fetch_')) {\n const fetchPart = trimmedSrc;\n const transformWithFetch = transformStr ? `${transformStr},${fetchPart}` : fetchPart;\n return `${normalizedBase}/${workspace}/${transformWithFetch}`;\n }\n\n const encodedPath = encodeAssetPathForDelivery(trimmedSrc);\n \n // Build URL: baseUrl/workspace/transformations/file_path\n if (transformStr) {\n return `${normalizedBase}/${workspace}/${transformStr}/${encodedPath}`;\n }\n\n return `${normalizedBase}/${workspace}/${encodedPath}`;\n}\n\n","/**\n * Responsive image attributes generator\n * Implements three strategies based on input options\n */\n\nimport { buildImageUrl } from './url-builder';\nimport type { ResponsiveOptions, ResponsiveAttributes, TransformOptions } from './types';\nimport { getDPR } from './device';\n\nconst DEFAULT_DEVICE_BREAKPOINTS = [640, 750, 828, 1080, 1200, 1920, 2048, 3840];\nconst DEFAULT_IMAGE_BREAKPOINTS = [16, 32, 48, 64, 96, 128, 256, 384];\n\n/**\n * Parse sizes attribute to extract minimum viewport width\n * Returns the smallest vw value found, or null if none found\n */\nfunction parseMinVWFromSizes(sizes: string): number | null {\n // Match patterns like \"33vw\", \"100vw\", \"(min-width: 800px) 33vw\"\n const vwMatches = sizes.match(/(\\d+(?:\\.\\d+)?)vw/g);\n if (!vwMatches || vwMatches.length === 0) return null;\n \n const vwValues = vwMatches.map(m => parseFloat(m));\n return Math.min(...vwValues);\n}\n\n/**\n * Generate responsive image attributes\n * \n * Rule 1: width only → DPR strategy (1x and 2x)\n * Rule 2: sizes provided → width-based strategy\n * Rule 3: neither → all device breakpoints\n */\nexport function generateResponsiveAttributes(\n baseUrl: string,\n workspace: string,\n options: ResponsiveOptions,\n defaults?: { f?: string; q?: string | number; [key: string]: any },\n deviceBreakpoints: number[] = DEFAULT_DEVICE_BREAKPOINTS,\n _imageBreakpoints: number[] = DEFAULT_IMAGE_BREAKPOINTS,\n enableDPR: boolean = true\n): ResponsiveAttributes {\n const { src, width, sizes, transform, breakpoints } = options;\n \n // Use custom breakpoints if provided, otherwise use defaults\n const effectiveBreakpoints = breakpoints || deviceBreakpoints;\n \n // Rule 1: width only → DPR strategy\n if (width !== undefined && !sizes) {\n const dpr = enableDPR ? getDPR() : 1;\n const baseWidth = width;\n \n // Generate 1x and 2x URLs\n const srcSetParts: string[] = [];\n \n // 1x URL\n const transform1x: TransformOptions = {\n ...transform,\n w: baseWidth,\n dpr: 1\n };\n const url1x = buildImageUrl(baseUrl, workspace, src, transform1x, defaults, false);\n srcSetParts.push(`${url1x} 1x`);\n \n // 2x URL (only if device DPR is actually >= 2)\n if (dpr >= 2) {\n const transform2x: TransformOptions = {\n ...transform,\n w: baseWidth,\n dpr: 2\n };\n const url2x = buildImageUrl(baseUrl, workspace, src, transform2x, defaults, false);\n srcSetParts.push(`${url2x} 2x`);\n }\n \n // Default `src` must match the 1x candidate (avoid enableDPR-only drift vs srcSet).\n const baseSrc = url1x;\n \n return {\n src: baseSrc,\n srcSet: srcSetParts.join(', '),\n width: baseWidth\n };\n }\n \n // Rule 2: sizes provided → width-based strategy\n if (sizes) {\n // Parsing retained for forward compatibility with viewport-aware filtering.\n void parseMinVWFromSizes(sizes);\n const filteredBreakpoints = effectiveBreakpoints;\n \n // Generate srcset with w descriptors\n const srcSetParts = filteredBreakpoints.map(bp => {\n const transformWithWidth: TransformOptions = {\n ...transform,\n w: bp\n };\n const url = buildImageUrl(baseUrl, workspace, src, transformWithWidth, defaults, enableDPR);\n return `${url} ${bp}w`;\n });\n \n // Base URL (use smallest breakpoint or provided width)\n const baseWidth = width || filteredBreakpoints[0] || effectiveBreakpoints[0];\n const baseTransform: TransformOptions = {\n ...transform,\n w: baseWidth\n };\n const baseSrc = buildImageUrl(baseUrl, workspace, src, baseTransform, defaults, enableDPR);\n \n return {\n src: baseSrc,\n srcSet: srcSetParts.join(', '),\n sizes: sizes,\n width: baseWidth\n };\n }\n \n // Rule 3: neither width nor sizes → all device breakpoints\n // Use all breakpoints with w descriptors\n const srcSetParts = effectiveBreakpoints.map(bp => {\n const transformWithWidth: TransformOptions = {\n ...transform,\n w: bp\n };\n const url = buildImageUrl(baseUrl, workspace, src, transformWithWidth, defaults, enableDPR);\n return `${url} ${bp}w`;\n });\n \n // Base URL (use smallest breakpoint)\n const baseWidth = effectiveBreakpoints[0];\n const baseTransform: TransformOptions = {\n ...transform,\n w: baseWidth\n };\n const baseSrc = buildImageUrl(baseUrl, workspace, src, baseTransform, defaults, enableDPR);\n \n return {\n src: baseSrc,\n srcSet: srcSetParts.join(', '),\n sizes: '100vw',\n width: baseWidth\n };\n}\n","/**\n * Main AutoRender client factory\n * Creates an AR instance with URL building and responsive image capabilities\n */\n\nimport { buildImageUrl } from './url-builder';\nimport { buildTransformString } from './transform';\nimport { generateResponsiveAttributes } from './responsive';\nimport { getDPR } from './device';\nimport type {\n CreateARConfig,\n ARInstance,\n TransformOptions,\n ResponsiveOptions,\n ResponsiveAttributes\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://assets.autorender.io';\nconst DEFAULT_DEVICE_BREAKPOINTS = [640, 750, 828, 1080, 1200, 1920, 2048, 3840];\nconst DEFAULT_IMAGE_BREAKPOINTS = [16, 32, 48, 64, 96, 128, 256, 384];\n\nexport function createAR(config: CreateARConfig): ARInstance {\n const {\n baseUrl = DEFAULT_BASE_URL,\n workspace,\n defaults = {},\n deviceBreakpoints = DEFAULT_DEVICE_BREAKPOINTS,\n imageBreakpoints = DEFAULT_IMAGE_BREAKPOINTS,\n enableDPR = true\n } = config;\n \n if (!workspace) {\n throw new Error('workspace is required');\n }\n \n const instance: ARInstance = {\n /**\n * Generate image URL with transformations\n */\n url(src: string, transform?: TransformOptions): string {\n return buildImageUrl(\n baseUrl,\n workspace,\n src,\n transform,\n defaults,\n enableDPR\n );\n },\n \n /**\n * Generate transformation string only (without URL)\n */\n transformString(transform: TransformOptions): string {\n return buildTransformString(\n transform,\n defaults,\n enableDPR\n );\n },\n \n /**\n * Generate responsive image attributes\n */\n responsiveImageAttributes(options: ResponsiveOptions): ResponsiveAttributes {\n // Allow per-call breakpoint override\n const effectiveDeviceBreakpoints = options.breakpoints || deviceBreakpoints;\n \n return generateResponsiveAttributes(\n baseUrl,\n workspace,\n options,\n defaults,\n effectiveDeviceBreakpoints,\n imageBreakpoints,\n enableDPR\n );\n },\n \n /**\n * Get current device pixel ratio\n */\n getDPR(): number {\n return getDPR();\n }\n };\n \n return instance;\n}\n\n","/**\n * Browser format detection utilities\n * Detects which image formats the browser supports\n */\n\nlet cachedFormat: string | null = null;\n\n/**\n * Detect the best image format supported by the browser\n * Priority: AVIF > WebP > JPEG\n * Uses synchronous detection for immediate results\n */\nexport function detectBestFormat(): string {\n if (cachedFormat !== null) {\n return cachedFormat;\n }\n\n if (typeof document === 'undefined' || typeof Image === 'undefined') {\n // Server-side or non-browser environment\n cachedFormat = 'webp';\n return cachedFormat;\n }\n\n // Synchronous detection using canvas.toDataURL\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n cachedFormat = 'webp';\n return cachedFormat;\n }\n\n // Test AVIF\n try {\n const avifDataURL = canvas.toDataURL('image/avif');\n if (avifDataURL && avifDataURL.indexOf('data:image/avif') === 0) {\n cachedFormat = 'avif';\n return cachedFormat;\n }\n } catch (e) {\n // AVIF not supported\n }\n\n // Test WebP\n try {\n const webpDataURL = canvas.toDataURL('image/webp');\n if (webpDataURL && webpDataURL.indexOf('data:image/webp') === 0) {\n cachedFormat = 'webp';\n return cachedFormat;\n }\n } catch (e) {\n // WebP not supported\n }\n\n // Fallback to JPEG\n cachedFormat = 'jpg';\n return cachedFormat;\n } catch (e) {\n // Fallback to WebP if detection fails\n cachedFormat = 'webp';\n return cachedFormat;\n }\n}\n\n\n/**\n * Get the best format synchronously (uses cached value or detects)\n */\nexport function getBestFormatSync(): string {\n if (cachedFormat !== null) {\n return cachedFormat;\n }\n return detectBestFormat();\n}\n\n/**\n * Reset cached format (useful for testing)\n */\nexport function resetFormatCache(): void {\n cachedFormat = null;\n}\n\n","import { AutorenderApiClient } from './client/api-client';\nimport { UploaderController } from './core/uploader-controller';\nimport type { ControllerOptions } from './core/uploader-controller';\nimport { DEFAULT_THEME, DEFAULT_SOURCES, DEFAULT_ASSET_DELIVERY_BASE_URL } from './constants/defaults';\nimport type {\n CreateUploaderOptions,\n UploaderInstance,\n ThemeOptions,\n UploadSourceOption,\n} from './types';\nimport { AutorenderUploaderElement } from './widget/uploader-element';\n\ntype ThemeName = 'light' | 'dark' | 'system';\n\nconst SOURCE_ALIAS_MAP: Record<string, string> = {\n local: 'device',\n device: 'device',\n fromdevice: 'device',\n camera: 'camera',\n facebook: 'facebook',\n fb: 'facebook',\n insta: 'facebook',\n instagram: 'facebook',\n gdrive: 'google-drive',\n googledrive: 'google-drive',\n google: 'google-drive',\n googledisk: 'google-drive',\n 'google-drive': 'google-drive',\n};\n\nfunction ensureCustomElement() {\n if (\n typeof globalThis === 'undefined' ||\n typeof globalThis.customElements === 'undefined'\n ) {\n return;\n }\n if (!globalThis.customElements.get(AutorenderUploaderElement.tagName)) {\n globalThis.customElements.define(\n AutorenderUploaderElement.tagName,\n AutorenderUploaderElement\n );\n }\n}\n\nfunction resolveTarget(target: string | HTMLElement): HTMLElement {\n if (typeof target === 'string') {\n const element = document.querySelector<HTMLElement>(target);\n if (!element) {\n throw new Error(`Target element \"${target}\" not found`);\n }\n return element;\n }\n return target;\n}\n\nfunction resolveContainer(container?: string | HTMLElement): HTMLElement | null {\n if (!container) return null;\n if (typeof container === 'string') {\n const element = document.querySelector<HTMLElement>(container);\n if (!element) {\n throw new Error(`Container element \"${container}\" not found`);\n }\n return element;\n }\n return container;\n}\n\nfunction resolveThemePreset(theme?: ThemeName): ThemeOptions {\n const base = {\n borderRadius: DEFAULT_THEME.borderRadius,\n dropzoneBackground: DEFAULT_THEME.dropzoneBackground,\n dropzoneBorder: DEFAULT_THEME.dropzoneBorder,\n };\n\n switch (theme) {\n case 'dark':\n return {\n appearance: 'dark',\n ...base,\n };\n case 'system':\n return {\n appearance: 'system',\n ...base,\n };\n default:\n return {\n appearance: 'light',\n ...base,\n };\n }\n}\n\nfunction resolveSourcesConfig(input?: string | string[]): UploadSourceOption[] {\n if (input === undefined || input === null) {\n return [];\n }\n\n const provided = Array.isArray(input)\n ? input\n : input\n .split(',')\n .map(entry => entry.trim())\n .filter(Boolean);\n\n if (provided.length === 0) {\n return [];\n }\n\n const resolved: UploadSourceOption[] = [];\n const seen = new Set<string>();\n\n for (const entry of provided) {\n const normalized = entry.toLowerCase().replace(/[\\s_-]+/g, '');\n const mappedId = SOURCE_ALIAS_MAP[normalized] ?? normalized;\n if (seen.has(mappedId)) continue;\n const match = DEFAULT_SOURCES.find(option => option.id === mappedId);\n if (match) {\n resolved.push(match);\n seen.add(mappedId);\n }\n }\n\n return resolved;\n}\n\nfunction normalizeOptions(\n options: Partial<CreateUploaderOptions>,\n applyDefaults = false\n): Partial<ControllerOptions> {\n const {\n type,\n theme,\n sources,\n classNames,\n labels,\n fileLayout,\n showGridFileName,\n apiKey: _apiKey,\n target: _target,\n ...rest\n } = options;\n\n const normalized: any = { ...rest };\n\n if (type !== undefined) {\n normalized.type = type === 'button' ? 'button' : 'inline';\n } else if (applyDefaults) {\n normalized.type = 'inline';\n }\n\n if (theme !== undefined) {\n normalized.theme = resolveThemePreset(theme);\n } else if (applyDefaults) {\n normalized.theme = resolveThemePreset('light');\n }\n\n if (options.palette !== undefined) {\n normalized.palette = options.palette;\n } else if (applyDefaults) {\n normalized.palette = 'at-blue';\n }\n\n if (sources !== undefined) {\n normalized.sources = resolveSourcesConfig(sources);\n } else if ('sources' in options) {\n // Explicitly undefined - means no sources (all disabled)\n normalized.sources = [];\n } else if (applyDefaults) {\n normalized.sources = [];\n }\n\n if (classNames !== undefined) {\n normalized.classNames = classNames;\n }\n\n if (labels !== undefined) {\n normalized.labels = labels;\n }\n\n if (fileLayout !== undefined) {\n normalized.fileLayout = fileLayout;\n } else if (applyDefaults) {\n normalized.fileLayout = 'list';\n }\n\n if (showGridFileName !== undefined) {\n normalized.showGridFileName = showGridFileName;\n } else if (applyDefaults) {\n normalized.showGridFileName = true;\n }\n\n if (options.assetDeliveryBaseUrl !== undefined) {\n normalized.assetDeliveryBaseUrl = options.assetDeliveryBaseUrl;\n } else if (applyDefaults) {\n normalized.assetDeliveryBaseUrl = DEFAULT_ASSET_DELIVERY_BASE_URL;\n }\n\n return normalized;\n}\n\nexport function createUploader(options: CreateUploaderOptions): UploaderInstance {\n // If container is provided, use it as the target so the entire widget renders inside it\n const container = resolveContainer(options.container);\n const defaultTarget = resolveTarget(options.target);\n const resolvedTarget = container || defaultTarget;\n \n ensureCustomElement();\n\n const widget = document.createElement(\n AutorenderUploaderElement.tagName\n ) as AutorenderUploaderElement;\n\n // Clear target and mount widget\n resolvedTarget.innerHTML = '';\n resolvedTarget.appendChild(widget);\n\n const client = new AutorenderApiClient({\n apiKey: options.apiKey,\n environment: options.environment,\n });\n\n const controllerOptions = normalizeOptions(options, true) as ControllerOptions;\n \n // Only set container in options if it's different from target (for portal logic)\n // If container is the same as target, we don't need portal\n if (container && container !== resolvedTarget) {\n controllerOptions.container = container;\n } else {\n // Clear container option if it's the same as target\n controllerOptions.container = undefined;\n }\n\n const controller = new UploaderController(\n client,\n widget,\n controllerOptions\n );\n\n widget.setController(controller, controllerOptions);\n\n return {\n openFileDialog: () => widget.openFileDialog(),\n startUpload: () => controller.uploadAll(),\n reset: () => controller.reset(),\n destroy: () => {\n controller.cancel();\n controller.reset();\n widget.remove();\n },\n updateOptions: (partialOptions: Partial<CreateUploaderOptions>) => {\n const normalized = normalizeOptions(partialOptions, false);\n controller.setOptions(normalized);\n widget.updateOptions(normalized);\n },\n getState: () => controller.getState(),\n };\n}\n\nexport * from './types';\nexport function registerAutorenderUploaderElement() {\n ensureCustomElement();\n}\n\n// ViewTag SDK exports\nexport { encodeAssetPathForDelivery } from './viewtag/url-builder';\nexport { isGifFormatOutput } from './viewtag/transform';\nexport { createAR } from './viewtag/create-ar';\nexport { detectBestFormat, getBestFormatSync, resetFormatCache } from './viewtag/format-detection';\nexport type {\n CreateARConfig,\n ARInstance,\n TransformOptions,\n ResponsiveOptions,\n ResponsiveAttributes,\n LayerOptions,\n LayerEnhancementOptions\n} from './viewtag/types';\n\n"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACatC,IAAM,kBACJ,OAAO,eAAe,eAAe,OAAO,WAAW,gBAAgB,cAClE,MAAM,oBAAoB;AAAC,IAC5B,WAAW;AA4BV,IAAM,4BAAN,cAAwC,gBAAgB;AAAA,EAmE7D,cAAc;AACZ,UAAM;AAhER,SAAQ,aAAwC;AAEhD,SAAQ,SAA6B;AACrC,SAAQ,QAA2B;AACnC,SAAQ,aAAiC,CAAC;AAC1C,SAAQ,gBAAsC,CAAC;AAE/C,SAAQ,cAAmC;AAC3C,SAAQ,cAAc;AACtB,SAAQ,aAA8B;AACtC,SAAQ,mBAAmB;AAE3B,SAAQ,cAAkC;AAE1C,SAAQ,WAAkC;AAC1C,SAAQ,WAAoC;AAC5C,SAAQ,cAA6B,CAAC;AACtC,SAAQ,YAAgC;AACxC,SAAQ,eAAmC;AAC3C,SAAQ,eAAyC;AACjD,SAAQ,gBAA0C;AAClD,SAAQ,eAAmC;AAC3C,SAAQ,mBAA6C;AACrD,SAAQ,kBAA4C;AACpD,SAAQ,mBAA6C;AACrD,SAAQ,oBAA8C;AACtD,SAAQ,oBAA8C;AACtD,SAAQ,qBAA+C;AACvD,SAAQ,qBAAyC;AACjD,SAAQ,uBAA2C;AACnD,SAAQ,yBAA6C;AACrD,SAAQ,oBAAwC;AAChD,SAAQ,qBAAyC;AACjD,SAAQ,sBAA0C;AAClD,SAAQ,uBAA2C;AACnD,SAAQ,mBAAkC,CAAC;AAC3C,SAAQ,qBAAyC;AACjD,SAAQ,qBAAoC;AAC5C,SAAQ,kBAAsC;AAC9C,SAAQ,YAAgC;AACxC,SAAQ,oBAA6B;AAerC,SAAQ,sBAAsB,oBAAI,IAAoC;AACtE,SAAQ,gBAAgB,CAAC,UAAyB;AAChD,UAAI,MAAM,QAAQ,YAAY,KAAK,aAAa;AAC9C,aAAK,cAAc;AACnB,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAIE,SAAK,SAAS,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAAA,EAClD;AAAA,EAxBQ,aAAa,OAAyB;AAC5C,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,iBAAiB,gBAAgB,MAAM,SAAS,aAAc,QAAO;AACzE,QAAI,iBAAiB,SAAS,MAAM,SAAS,aAAc,QAAO;AAClE,UAAM,UACJ,iBAAiB,QACb,MAAM,UACN,OAAO,UAAU,WACjB,QACA;AACN,WAAO,OAAO,YAAY,YAAY,QAAQ,YAAY,EAAE,SAAS,OAAO;AAAA,EAC9E;AAAA,EAeA,oBAAoB;AAClB,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,uBAAuB;AACrB,SAAK,iBAAiB;AACtB,WAAO,oBAAoB,WAAW,KAAK,aAAa;AACxD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,cAAc;AACpB,QAAI,CAAC,KAAK,QAAQ,WAAW;AAC3B,WAAK,oBAAoB;AACzB;AAAA,IACF;AAEA,UAAM,YAAY,OAAO,KAAK,QAAQ,cAAc,WAChD,SAAS,cAA2B,KAAK,QAAQ,SAAS,IAC1D,KAAK,QAAQ;AAEjB,QAAI,CAAC,WAAW;AACd,cAAQ,KAAK,cAAc,KAAK,QAAQ,SAAS,aAAa;AAC9D,WAAK,oBAAoB;AACzB;AAAA,IACF;AAIA,QAAI,gBAA6B,KAAK;AACtC,WAAO,iBAAiB,kBAAkB,SAAS,MAAM;AACvD,UAAI,kBAAkB,WAAW;AAG/B,cAAMC,kBAAiB,OAAO,iBAAiB,SAAS;AACxD,YAAIA,gBAAe,aAAa,UAAU;AACxC,oBAAU,MAAM,WAAW;AAAA,QAC7B;AACA,aAAK,kBAAkB;AACvB,aAAK,YAAY;AACjB,aAAK,oBAAoB;AACzB;AAAA,MACF;AACA,sBAAgB,cAAc;AAAA,IAChC;AAIA,UAAM,iBAAiB,OAAO,iBAAiB,SAAS;AACxD,QAAI,eAAe,aAAa,UAAU;AACxC,gBAAU,MAAM,WAAW;AAAA,IAC7B;AAEA,SAAK,kBAAkB;AACvB,SAAK,oBAAoB;AAGzB,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,WAAK,UAAU,YAAY;AAC3B,WAAK,UAAU,MAAM,WAAW;AAChC,WAAK,UAAU,MAAM,QAAQ;AAC7B,WAAK,UAAU,MAAM,SAAS;AAC9B,gBAAU,YAAY,KAAK,SAAS;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,gBAAgB;AACtB,QAAI,KAAK,WAAW;AAClB,WAAK,UAAU,OAAO;AACtB,WAAK,YAAY;AAAA,IACnB;AACA,SAAK,kBAAkB;AACvB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,cAAc,YAAgC,SAA4B;AACxE,SAAK,iBAAiB;AACtB,SAAK,aAAa;AAClB,SAAK,qBAAqB;AAC1B,SAAK,aAAa,OAAO;AACzB,SAAK,iBAAiB;AACtB,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,cAAc,SAAqC;AACjD,QAAI,CAAC,KAAK,WAAY;AACtB,SAAK,aAAa,EAAE,GAAG,KAAK,SAAS,GAAG,QAAQ,CAAC;AACjD,SAAK,WAAW,WAAW,KAAK,OAAO;AACvC,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,iBAAiB;AACf,QAAI,KAAK,gBAAgB,YAAY,CAAC,KAAK,aAAa;AACtD,WAAK,cAAc;AACnB,WAAK,OAAO;AACZ,4BAAsB,MAAM,KAAK,WAAW,MAAM,CAAC;AACnD;AAAA,IACF;AACA,SAAK,WAAW,MAAM;AAAA,EACxB;AAAA,EAEQ,aAAa,SAA4B;AAC/C,UAAM,kBAAkB,KAAK,WAAY,CAAC;AAC1C,UAAM,aAAc,QAAQ,SAAS,gBAAgB,SAAS;AAC9D,UAAM,gBAAgB;AAAA,MACpB,YAAY,WAAW,cAAc,cAAc;AAAA,MACnD,cAAc,WAAW,gBAAgB,cAAc;AAAA,MACvD,oBAAoB,WAAW,sBAAsB,cAAc;AAAA,MACnE,gBAAgB,WAAW,kBAAkB,cAAc;AAAA,MAC3D,YAAY,WAAW,cAAc,gBAAgB,OAAO;AAAA,IAC9D;AAGA,UAAM,kBAAkB,QAAQ,WAAW,gBAAgB,WAAW,CAAC;AACvE,UAAM,oBAAoB,KAAK,eAAe,IAAI,OAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK;AAGjF,UAAM,mBAAmB,gBAAgB,cAAc,QAAQ;AAC/D,QAAI,oBAAoB,KAAK,aAAa,KAAK,iBAAiB;AAE9D,WAAK,UAAU,OAAO;AACtB,WAAK,YAAY;AACjB,WAAK,kBAAkB;AAAA,IACzB;AAEA,SAAK,UAAU;AAAA,MACb,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAGA,QAAI,KAAK,QAAQ,WAAW;AAC1B,WAAK,YAAY;AAAA,IACnB,OAAO;AACL,WAAK,cAAc;AAAA,IACrB;AAEA,SAAK,SAAS;AAAA,MACZ,GAAG;AAAA,MACH,GAAI,KAAK,QAAQ,UAAU,CAAC;AAAA,IAC9B;AAEA,SAAK,QAAQ;AAEb,UAAM,mBAAmB,gBAAgB,IAAI,OAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG;AACvE,UAAM,iBAAiB,sBAAsB;AAE7C,SAAK,gBAAgB;AACrB,SAAK,QAAQ,iBAAiB,QAAQ,kBAAkB,gBAAgB;AAExE,UAAM,gBAAgB,KAAK,QAAQ,QAAQ;AAC3C,SAAK,cAAc,kBAAkB,WAAW,WAAW;AAC3D,SAAK,aAAa,KAAK,QAAQ,cAAc;AAC7C,SAAK,mBAAmB,KAAK,QAAQ,oBAAoB;AACzD,SAAK,aAAa,KAAK,QAAQ,cAAc,CAAC;AAE9C,QAAI,KAAK,QAAQ,eAAe,UAAa,KAAK,gBAAgB,UAAU;AAC1E,WAAK,QAAQ,aAAa;AAAA,IAC5B;AAGA,QAAI,KAAK,eAAe,gBAAgB;AACtC,YAAM,YAAY,KAAK,YAAY,SAAS,EAAE,MAAM,UAAU,KAAK;AACnE,WAAK,oBAAoB,QAAQ;AAAA,IACnC;AAAA,EACF;AAAA,EAEQ,mBAAmB;AACzB,QAAI,CAAC,KAAK,WAAY;AAEtB,UAAM,gBAAgB,MAAM,KAAK,YAAY;AAC7C,UAAM,mBAAmB,MAAM,KAAK,YAAY;AAChD,UAAM,qBAAqB,CAAC,UAAiB;AAC3C,YAAM,SAAU,MAAwC;AACxD,UAAI,KAAK,QAAQ,cAAc,QAAQ,OAAO,QAAQ;AACpD,aAAK,KAAK,YAAY,UAAU;AAAA,MAClC;AAAA,IACF;AACA,UAAM,mBAAmB,MAAM;AAC7B,WAAK,iBAAiB;AACtB,WAAK,OAAO;AAAA,IACd;AACA,UAAM,gBAAgB,CAAC,UAAiB;AACtC,YAAM,SAAU,MAAsB;AACtC,WAAK,sBAAsB,MAAM;AAAA,IACnC;AAEA,SAAK,WAAW,iBAAiB,eAAe,aAAa;AAC7D,SAAK,WAAW,iBAAiB,YAAY,gBAAgB;AAC7D,SAAK,WAAW,iBAAiB,gBAAgB,gBAAgB;AACjE,SAAK,WAAW,iBAAiB,cAAc,kBAAkB;AACjE,SAAK,WAAW,iBAAiB,YAAY,gBAAgB;AAC7D,SAAK,WAAW,iBAAiB,SAAS,aAAa;AAEvD,SAAK,oBAAoB,IAAI,eAAe,aAAa;AACzD,SAAK,oBAAoB,IAAI,YAAY,gBAAgB;AACzD,SAAK,oBAAoB,IAAI,gBAAgB,gBAAgB;AAC7D,SAAK,oBAAoB,IAAI,cAAc,kBAAkB;AAC7D,SAAK,oBAAoB,IAAI,YAAY,gBAAgB;AACzD,SAAK,oBAAoB,IAAI,SAAS,aAAa;AAAA,EACrD;AAAA,EAEQ,mBAAmB;AACzB,QAAI,CAAC,KAAK,WAAY;AACtB,eAAW,CAAC,OAAO,OAAO,KAAK,KAAK,oBAAoB,QAAQ,GAAG;AACjE,WAAK,WAAW,oBAAoB,OAAO,OAAO;AAAA,IACpD;AACA,SAAK,oBAAoB,MAAM;AAC/B,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,iBAAiB,KAA+B,UAAkB;AACxE,UAAM,QAAQ,KAAK,WAAW,GAAG;AACjC,WAAO,QAAQ,GAAG,QAAQ,IAAI,KAAK,KAAK;AAAA,EAC1C;AAAA,EAEQ,SAAS;AACf,QAAI,CAAC,KAAK,WAAY;AAEtB,SAAK,aAAa,gBAAgB,KAAK,WAAW;AAElD,UAAM,wBAAwB;AAC9B,UAAM,oBAAoB;AAE1B,UAAM,iBAAiB;AAAA,oBACP,KAAK,iBAAiB,YAAY,aAAa,CAAC;AAAA;AAAA,oCAEhC,KAAK,OAAO,aAAa;AAAA;AAAA;AAIzD,UAAM,iBAAiB,cAAc,KAAK,iBAAiB,YAAY,cAAc,CAAC;AACtF,UAAM,mBAAmB;AAEzB,UAAM,oBAAoB;AAAA;AAAA,qCAEO,KAAK,OAAO,KAAK;AAAA;AAAA;AAAA;AAKlD,UAAM,qBAAqB;AAAA;AAAA,qCAEM,KAAK,OAAO,KAAK;AAAA;AAAA;AAIlD,UAAM,oBAAoB;AAAA;AAAA,qCAEO,KAAK,gBAAgB,WAAW,eAAe,EAAE;AAAA,YAC1E,cAAc;AAAA,YACd,iBAAiB;AAAA,YACjB,qBAAqB;AAAA,YACrB,gBAAgB;AAAA,YAChB,cAAc;AAAA;AAAA;AAAA;AAKtB,UAAM,eAAe;AAAA,mCACU,KAAK,gBAAgB,WAAW,eAAe,EAAE;AAAA,uDAC7B,KAAK,OAAO,KAAK;AAAA,wDAChB,KAAK,OAAO,MAAM;AAAA;AAAA;AAAA,4DAGd,KAAK,OAAO,OAAO;AAAA,iEACd,KAAK,OAAO,YAAY;AAAA,wDACjC,KAAK,OAAO,IAAI;AAAA;AAAA;AAAA;AAMpE,UAAM,6BAA6B,KAAK,aAAa,KAAK;AAC1D,UAAM,cAAc,KAAK,gBAAgB,WACrC;AAAA,oBACY,KAAK,iBAAiB,SAAS,UAAU,CAAC,IAAI,KAAK,cAAc,YAAY,EAAE,IAAI,6BAA6B,cAAc,EAAE;AAAA;AAAA;AAAA,YAGxI,iBAAiB;AAAA,YACjB,iBAAiB;AAAA,YACjB,YAAY;AAAA;AAAA;AAAA;AAAA,QAKhB;AAEJ,UAAM,eAAe,KAAK,gBAAgB,WACtC;AAAA;AAAA;AAAA,cAGM,kBAAkB;AAAA,cAClB,iBAAiB;AAAA,cACjB,YAAY;AAAA;AAAA;AAAA;AAAA,UAKlB;AAEJ,UAAM,WAAW,SAAS,cAAc,UAAU;AAClD,aAAS,YAAY;AAAA,eACV,YAAY;AAAA,oBACP,KAAK,iBAAiB,QAAQ,kBAAkB,CAAC,mBAAmB,KAAK,WAAW;AAAA;AAAA,UAG9F,KAAK,gBAAgB,WACjB,gCAAgC,KAAK,iBAAiB,iBAAiB,mBAAmB,CAAC,+CAA+C,KAAK,OAAO,YAAY,qBAClK,YACN;AAAA,UACE,KAAK,YAAY,KAAK,WAAW;AAAA;AAAA;AAIvC,SAAK,OAAO,YAAY;AACxB,SAAK,OAAO,YAAY,SAAS,QAAQ,UAAU,IAAI,CAAC;AAGxD,QAAI,KAAK,aAAa,KAAK,gBAAgB,UAAU;AACnD,YAAM,iBAAiB,SAAS,cAAc,UAAU;AACxD,qBAAe,YAAY,UAAU,YAAY,WAAW,WAAW;AACvE,WAAK,UAAU,YAAY;AAC3B,WAAK,UAAU,YAAY,eAAe,QAAQ,UAAU,IAAI,CAAC;AAAA,IACnE,WAAW,KAAK,aAAa,CAAC,KAAK,aAAa;AAE9C,WAAK,UAAU,YAAY;AAAA,IAC7B;AAEA,SAAK,gBAAgB;AACrB,SAAK,gBAAgB;AACrB,SAAK,gBAAgB;AACrB,SAAK,WAAW;AAChB,SAAK,oBAAoB;AACzB,SAAK,YAAY;AAEjB,QAAI,KAAK,gBAAgB,UAAU;AACjC,UAAI,KAAK,aAAa;AACpB,eAAO,iBAAiB,WAAW,KAAK,aAAa;AAAA,MACvD,OAAO;AACL,eAAO,oBAAoB,WAAW,KAAK,aAAa;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAkB,UAAkC;AAE1D,QAAI,KAAK,WAAW;AAClB,aAAO,KAAK,UAAU,cAAc,QAAQ,KAAK,KAAK,OAAO,cAAc,QAAQ;AAAA,IACrF;AACA,WAAO,KAAK,OAAO,cAAc,QAAQ;AAAA,EAC3C;AAAA,EAEQ,mBAAmB,UAA6B;AAEtD,QAAI,KAAK,WAAW;AAClB,YAAM,gBAAgB,MAAM,KAAK,KAAK,UAAU,iBAAiB,QAAQ,CAAC;AAC1E,YAAM,gBAAgB,MAAM,KAAK,KAAK,OAAO,iBAAiB,QAAQ,CAAC;AAEvE,YAAM,WAAsB,CAAC;AAC7B,oBAAc,QAAQ,QAAM,SAAS,KAAK,EAAE,CAAC;AAC7C,oBAAc,QAAQ,QAAM;AAC1B,YAAI,CAAC,SAAS,SAAS,EAAE,EAAG,UAAS,KAAK,EAAE;AAAA,MAC9C,CAAC;AACD,aAAO;AAAA,IACT;AACA,WAAO,MAAM,KAAK,KAAK,OAAO,iBAAiB,QAAQ,CAAC;AAAA,EAC1D;AAAA,EAEQ,kBAAkB;AACxB,SAAK,cAAc,KAAK,OAAO,cAAc,mBAAmB;AAChE,SAAK,YAAY,KAAK,OAAO,cAAc,gBAAgB;AAC3D,SAAK,WAAW,KAAK,OAAO,cAAc,cAAc;AACxD,SAAK,WAAW,KAAK,OAAO,cAAc,eAAe;AACzD,SAAK,cAAc,MAAM,KAAK,KAAK,OAAO,iBAAiB,iBAAiB,CAAC;AAC7E,SAAK,YAAY,KAAK,kBAAkB,gBAAgB;AACxD,SAAK,eAAe,KAAK,OAAO,cAAc,mBAAmB;AACjE,SAAK,eAAe,KAAK,OAAO,cAAc,mBAAmB;AACjE,SAAK,gBAAgB,KAAK,OAAO,cAAc,oBAAoB;AACnE,SAAK,eAAe,KAAK,kBAAkB,WAAW;AACtD,SAAK,mBAAmB,KAAK,kBAAkB,iBAAiB;AAChE,SAAK,kBAAkB,KAAK,kBAAkB,gBAAgB;AAC9D,SAAK,mBAAmB,KAAK,kBAAkB,iBAAiB;AAChE,SAAK,oBAAoB,KAAK,kBAAkB,yBAAyB;AACzE,SAAK,oBAAoB,KAAK,kBAAkB,kBAAkB;AAClE,SAAK,qBAAqB,KAAK,kBAAkB,oBAAoB;AACrE,SAAK,qBAAqB,KAAK,kBAAkB,0BAA0B;AAC3E,SAAK,uBAAuB,KAAK,kBAAkB,mBAAmB;AACtE,SAAK,yBAAyB,KAAK,OAAO,cAAc,qBAAqB;AAC7E,SAAK,oBAAoB,KAAK,kBAAkB,iBAAiB;AACjE,SAAK,qBAAqB,KAAK,kBAAkB,kBAAkB;AACnE,SAAK,sBAAsB,KAAK,kBAAkB,mBAAmB;AACrE,SAAK,uBAAuB,KAAK,OAAO,cAAc,oBAAoB;AAC1E,SAAK,mBAAmB,KAAK,mBAAmB,sBAAsB;AACtE,SAAK,qBAAqB,KAAK,kBAAkB,kBAAkB;AACnE,SAAK,kBAAkB;AAEvB,UAAM,OAAO,YAAY,KAAK,MAAM,MAAM;AAC1C,UAAM,gBAAgB,KAAK,OAAO,cAAc,mBAAmB;AACnE,QAAI,QAAQ,eAAe;AACzB,oBAAc,YAAY;AAC1B,oBAAc,YAAY,IAAI;AAAA,IAChC;AACA,UAAM,aAAa,YAAY,KAAK,MAAM,MAAM;AAChD,UAAM,uBAAuB,KAAK,OAAO,cAAc,iBAAiB;AACxE,QAAI,cAAc,sBAAsB;AACtC,2BAAqB,YAAY;AACjC,2BAAqB,YAAY,UAAU;AAAA,IAC7C;AACA,UAAM,YAAY,YAAY,KAAK,MAAM,KAAK;AAC9C,UAAM,qBAAqB,KAAK,kBAAkB,sBAAsB;AACxE,QAAI,aAAa,oBAAoB;AACnC,yBAAmB,YAAY;AAC/B,yBAAmB,YAAY,SAAS;AAAA,IAC1C;AAAA,EACF;AAAA,EAEQ,kBAAkB;AACxB,QAAI,CAAC,KAAK,YAAa;AAEvB,UAAM,iBAAiB,KAAK,QAAQ;AAEpC,QAAI,mBAAmB,UAAa,mBAAmB,QAAQ,mBAAmB,IAAI;AACpF,UAAI,KAAK,gBAAgB,UAAU;AACjC,aAAK,YAAY,MAAM,QAAQ;AAAA,MACjC,OAAO;AACL,aAAK,YAAY,MAAM,eAAe,OAAO;AAAA,MAC/C;AACA;AAAA,IACF;AAEA,UAAM,kBACJ,OAAO,mBAAmB,WAAW,GAAG,cAAc,OAAO;AAC/D,SAAK,YAAY,MAAM,QAAQ;AAAA,EACjC;AAAA,EAEQ,kBAAkB;AACxB,SAAK,WAAW,gBAAgB,iBAAiB;AACjD,SAAK,WAAW,gBAAgB,cAAc;AAC9C,SAAK,WAAW,gBAAgB,WAAW;AAE3C,QAAI,KAAK,QAAQ,kBAAkB,OAAO;AACxC,WAAK,WAAW,gBAAgB,UAAU;AAAA,IAC5C,OAAO;AACL,WAAK,WAAW,aAAa,YAAY,EAAE;AAAA,IAC7C;AAEA,QAAI,KAAK,QAAQ,QAAQ,QAAQ;AAC/B,WAAK,UAAU,SAAS,KAAK,QAAQ,OAAO,KAAK,GAAG;AAAA,IACtD;AAAA,EACF;AAAA,EAEQ,aAAa;AACnB,SAAK,eAAe,iBAAiB,SAAS,MAAM;AAClD,WAAK,cAAc;AACnB,WAAK,OAAO;AAAA,IACd,CAAC;AAED,SAAK,kBAAkB,iBAAiB,SAAS,MAAM;AACrD,WAAK,cAAc;AACnB,WAAK,OAAO;AAAA,IACd,CAAC;AAED,SAAK,cAAc,iBAAiB,SAAS,WAAS;AACpD,YAAM,SAAS,MAAM;AACrB,UAAI,CAAC,OAAQ;AACb,UAAI,WAAW,KAAK,gBAAgB,OAAO,UAAU,SAAS,mBAAmB,GAAG;AAClF,aAAK,cAAc;AACnB,aAAK,OAAO;AAAA,MACd;AAAA,IACF,CAAC;AAED,SAAK,mBAAmB,iBAAiB,SAAS,MAAM;AACtD,UAAI,CAAC,KAAK,WAAY;AACtB,UAAI,KAAK,WAAW,SAAS,EAAE,YAAa;AAC5C,WAAK,KAAK,WAAW,UAAU;AAAA,IACjC,CAAC;AAED,SAAK,iBAAiB,iBAAiB,SAAS,MAAM;AACpD,UAAI,CAAC,KAAK,WAAY;AACtB,YAAM,QAAQ,KAAK,WAAW,SAAS;AACvC,YAAM,eAAe,MAAM,MAAM,SAAS,KAAK,MAAM,MAAM,MAAM,UAAQ,KAAK,WAAW,WAAW;AACpG,UAAI,KAAK,gBAAgB,UAAU;AACjC,YAAI,MAAM,aAAa;AACrB;AAAA,QACF;AACA,YAAI,gBAAgB,MAAM,MAAM,WAAW,GAAG;AAC5C,eAAK,WAAW,MAAM;AACtB,eAAK,YAAY;AAAA,QACnB;AACA;AAAA,MACF;AACA,UAAI,MAAM,aAAa;AACrB,aAAK,WAAW;AAChB;AAAA,MACF;AACA,UAAI,cAAc;AAChB,aAAK,WAAW;AAChB;AAAA,MACF;AACA,WAAK,WAAW;AAAA,IAClB,CAAC;AAED,SAAK,kBAAkB,iBAAiB,SAAS,MAAM;AACrD,UAAI,CAAC,KAAK,WAAY;AACtB,YAAM,EAAE,YAAY,IAAI,KAAK,WAAW,SAAS;AACjD,UAAI,aAAa;AACf;AAAA,MACF;AACA,WAAK,WAAW,MAAM;AACtB,WAAK,YAAY;AAAA,IACnB,CAAC;AAED,SAAK,mBAAmB,iBAAiB,SAAS,MAAM;AACtD,UAAI,CAAC,KAAK,WAAY;AACtB,YAAM,eAAe,KAAK,WAAW,SAAS;AAC9C,UAAI,aAAa,YAAa;AAC9B,WAAK,WAAW,MAAM;AACtB,UAAI,KAAK,gBAAgB,UAAU;AACjC,aAAK,YAAY;AACjB;AAAA,MACF;AACA,WAAK,cAAc;AACnB,WAAK,OAAO;AAAA,IACd,CAAC;AAED,SAAK,oBAAoB,iBAAiB,SAAS,MAAM;AACvD,WAAK,eAAe;AAAA,IACtB,CAAC;AAED,SAAK,UAAU,iBAAiB,SAAS,MAAM,KAAK,eAAe,CAAC;AACpE,SAAK,UAAU,iBAAiB,aAAa,WAAS;AACpD,YAAM,eAAe;AACrB,WAAK,UAAU,UAAU,IAAI,aAAa;AAAA,IAC5C,CAAC;AACD,SAAK,UAAU,iBAAiB,YAAY,WAAS;AACnD,YAAM,eAAe;AACrB,WAAK,UAAU,UAAU,IAAI,aAAa;AAC1C,UAAI,MAAM,cAAc;AACtB,cAAM,aAAa,aAAa;AAAA,MAClC;AAAA,IACF,CAAC;AACD,SAAK,UAAU,iBAAiB,aAAa,WAAS;AACpD,UAAI,MAAM,WAAW,KAAK,UAAU;AAClC,aAAK,UAAU,UAAU,OAAO,aAAa;AAAA,MAC/C;AAAA,IACF,CAAC;AACD,SAAK,UAAU,iBAAiB,QAAQ,OAAM,UAAS;AACrD,YAAM,eAAe;AACrB,WAAK,UAAU,UAAU,OAAO,aAAa;AAC7C,YAAM,QAAQ,MAAM,KAAK,sBAAsB,KAAK;AACpD,UAAI,MAAM,QAAQ;AAChB,cAAM,KAAK,YAAY,SAAS,KAAK;AAAA,MACvC;AACA,UAAI,KAAK,WAAW;AAClB,aAAK,UAAU,QAAQ;AAAA,MACzB;AAAA,IACF,CAAC;AAED,SAAK,WAAW,iBAAiB,UAAU,YAAY;AACrD,YAAM,QAAQ,KAAK,WAAW,QAAQ,MAAM,KAAK,KAAK,UAAU,KAAK,IAAI,CAAC;AAC1E,YAAM,SAAS,MAAM,IAAI,WAAS;AAAA,QAChC;AAAA,QACA,cAAe,KAAgD;AAAA,MACjE,EAAE;AACF,YAAM,KAAK,YAAY,SAAS,MAAM;AACtC,UAAI,KAAK,UAAW,MAAK,UAAU,QAAQ;AAAA,IAC7C,CAAC;AAED,SAAK,cAAc,iBAAiB,SAAS,MAAM;AACjD,UAAI,KAAK,YAAY,SAAS,EAAE,YAAa;AAC7C,WAAK,KAAK,YAAY,UAAU;AAAA,IAClC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,sBACZ,OACuD;AACvD,UAAM,QAAQ,MAAM,cAAc;AAElC,QAAI,CAAC,OAAO;AACV,YAAM,QAAQ,MAAM,cAAc,QAAQ,MAAM,KAAK,MAAM,aAAa,KAAK,IAAI,CAAC;AAClF,aAAO,MAAM,IAAI,WAAS;AAAA,QACxB;AAAA,QACA,cAAe,KAAgD;AAAA,MACjE,EAAE;AAAA,IACJ;AAEA,UAAM,UAAU,MAAM,KAAK,KAAK,EAC7B,IAAI,UAAS,KAAK,mBAAmB,KAAK,iBAAiB,IAAI,IAAK,EACpE,OAAO,OAAO;AAEjB,UAAM,YAA0D,CAAC;AAEjE,eAAW,SAAS,SAAS;AAC3B,YAAM,QAAQ,MAAM,KAAK,UAAU,OAAO,EAAE;AAC5C,gBAAU,KAAK,GAAG,KAAK;AAAA,IACzB;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,OAAwB,OAAO,IAA2D;AAC1G,WAAO,IAAI,QAAQ,aAAW;AAC5B,UAAI,MAAM,QAAQ;AAChB,QAAC,MAA8B,KAAK,UAAQ;AAC1C,kBAAQ,CAAC,EAAE,MAAM,cAAc,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,QAC7E,CAAC;AAAA,MACH,WAAW,MAAM,aAAa;AAC5B,cAAM,SAAU,MAAmC,aAAa;AAChE,eAAO,YAAY,OAAM,YAAW;AAClC,gBAAM,UAAU,MAAM,QAAQ;AAAA,YAC5B,QAAQ,IAAI,WAAS,KAAK,UAAU,OAAO,OAAO,GAAG,IAAI,IAAI,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;AAAA,UACzF;AACA,kBAAQ,QAAQ,KAAK,CAAC;AAAA,QACxB,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,CAAC,CAAC;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,aAAa;AACnB,SAAK,cAAc;AACnB,SAAK,OAAO;AAAA,EACd;AAAA,EAEQ,eAAe,SAAwB;AAC7C,SAAK,qBAAqB;AAC1B,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,mBAAmB;AACzB,SAAK,eAAe,IAAI;AAAA,EAC1B;AAAA,EAEQ,oBAAoB;AAC1B,QAAI,CAAC,KAAK,mBAAoB;AAC9B,QAAI,KAAK,oBAAoB;AAC3B,WAAK,mBAAmB,SAAS;AACjC,WAAK,mBAAmB,cAAc,KAAK;AAAA,IAC7C,OAAO;AACL,WAAK,mBAAmB,SAAS;AACjC,WAAK,mBAAmB,cAAc;AAAA,IACxC;AAAA,EACF;AAAA,EAEQ,sBAAsB,OAAgB;AAC5C,QAAI,KAAK,aAAa,KAAK,GAAG;AAC5B,WAAK,iBAAiB;AACtB;AAAA,IACF;AAEA,UAAM,SACJ,OAAO,UAAU,YAAY,UAAU,QAAQ,YAAY,QACtD,MAAc,SACf;AACN,UAAM,mBACJ,iBAAiB,QACb,MAAM,UACN,OAAQ,OAAe,YAAY,WAClC,MAAc,UACf,OAAO,UAAU,WACjB,QACA;AAEN,UAAM,aAAa,OAAO,oBAAoB,EAAE,EAAE,YAAY;AAC9D,UAAM,cACH,OAAO,WAAW,aAAa,WAAW,OAAO,WAAW,QAC7D,WAAW,SAAS,cAAc,KAClC,WAAW,SAAS,WAAW,KAC/B,WAAW,SAAS,iBAAiB;AAEvC,QAAI,aAAa;AACf,WAAK,eAAe,KAAK,OAAO,aAAa;AAAA,IAC/C,WAAW,kBAAkB;AAC3B,WAAK,eAAe,OAAO,gBAAgB,CAAC;AAAA,IAC9C,OAAO;AACL,WAAK,eAAe,KAAK,OAAO,YAAY;AAAA,IAC9C;AAAA,EACF;AAAA,EAEQ,cAAc;AACpB,QAAI,CAAC,KAAK,WAAY;AACtB,QAAI,CAAC,KAAK,SAAU;AAEpB,UAAM,QAAQ,KAAK,WAAW,SAAS;AACvC,UAAM,EAAE,OAAO,aAAa,WAAW,IAAI;AAC3C,UAAM,WAAW,MAAM,SAAS;AAChC,UAAM,eAAe,MAAM,KAAK,UAAQ,KAAK,UAAU,iBAAiB;AAExE,QAAI,cAAc;AAChB,WAAK,eAAe,KAAK,OAAO,aAAa;AAAA,IAC/C;AAEA,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,UAAU,OAAO,gBAAgB,WAAW;AAC7D,WAAK,YAAY,UAAU,OAAO,aAAa,QAAQ;AAAA,IACzD;AAEA,QAAI,KAAK,UAAU;AACjB,UAAI,UAAU;AACZ,aAAK,SAAS,MAAM,UAAU;AAAA,MAChC,OAAO;AACL,aAAK,SAAS,MAAM,UAAU;AAAA,MAChC;AAAA,IACF;AAEA,SAAK,eAAe,KAAK;AACzB,SAAK,kBAAkB;AACvB,SAAK,oBAAoB,QAAQ;AACjC,SAAK,iBAAiB,OAAO,WAAW;AACxC,SAAK,uBAAuB,UAAU;AAEtC,QAAI,KAAK,oBAAoB;AAC3B,WAAK,mBAAmB,MAAM,UAAU,WAAW,KAAK;AAAA,IAC1D;AACA,QAAI,KAAK,qBAAqB;AAC5B,WAAK,oBAAoB,MAAM,UAAU,WAAW,SAAS;AAAA,IAC/D;AACA,QAAI,KAAK,sBAAsB;AAC7B,WAAK,qBAAqB,MAAM,UAAU,WAAW,SAAS;AAAA,IAChE;AAEA,QAAI,KAAK,gBAAgB,YAAY,KAAK,gBAAgB,UAAU;AAClE,YAAM,iBAAiB,MAAM,OAAO,UAAQ,KAAK,WAAW,WAAW,EAAE;AACzE,YAAM,eAAe,YAAY,mBAAmB,MAAM,UAAU,iBAAiB;AAErF,UAAI,KAAK,oBAAoB;AAC3B,aAAK,mBAAmB,MAAM,UAAU,WAAW,KAAK;AAAA,MAC1D;AAEA,YAAM,eAAe,KAAK;AAC1B,YAAM,aAAa,KAAK;AACxB,YAAM,eAAe,KAAK;AAC1B,YAAM,cAAc,KAAK;AACzB,YAAM,gBAAgB,KAAK;AAE3B,YAAM,aAAa,YAAY,CAAC,eAAe,CAAC;AAChD,YAAM,cAAc,YAAY,CAAC,eAAe,CAAC;AACjD,YAAM,WAAW,aAAa,eAAe;AAC7C,YAAM,YAAY,aAAa,eAAe;AAC9C,YAAM,mBACJ,KAAK,gBAAgB,YAAY,YAAY,CAAC,eAAe,CAAC;AAChE,YAAM,mBACJ,KAAK,gBAAgB,YAAY,CAAC,gBAAgB,CAAC,gBAAgB,CAAC;AACtE,YAAM,aAAa,oBAAoB;AAEvC,UAAI,cAAc;AAChB,qBAAa,MAAM,UAAU,aAAa,KAAK;AAC/C,qBAAa,gBAAgB,YAAY,CAAC,UAAU;AAAA,MACtD;AAEA,UAAI,YAAY;AACd,mBAAW,MAAM,UAAU,WAAW,KAAK;AAC3C,mBAAW,cAAc,KAAK,OAAO;AACrC,mBAAW,gBAAgB,YAAY,CAAC,QAAQ;AAAA,MAClD;AAEA,UAAI,aAAa;AACf,oBAAY,MAAM,UAAU,YAAY,KAAK;AAC7C,oBAAY,gBAAgB,YAAY,WAAW;AAAA,MACrD;AAEA,UAAI,cAAc;AAChB,qBAAa,MAAM,UAAU,aAAa,KAAK;AAC/C,qBAAa,UAAU;AAAA,UACrB;AAAA,UACA,KAAK,gBAAgB,YAAY,CAAC;AAAA,QACpC;AAAA,MACF;AAEA,UAAI,eAAe;AACjB,sBAAc,MAAM,UAAU,cAAc,KAAK;AACjD,sBAAc,gBAAgB,YAAY,CAAC,WAAW;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe,OAAqB;AAC1C,QAAI,CAAC,KAAK,SAAU;AACpB,SAAK,SAAS,YAAY;AAC1B,QAAI,MAAM,WAAW,GAAG;AACtB,WAAK,SAAS,MAAM,UAAU;AAC9B,WAAK,SAAS,UAAU,OAAO,SAAS;AACxC;AAAA,IACF;AAEA,UAAM,eAAe,KAAK,eAAe;AACzC,SAAK,SAAS,MAAM,UAAU,eAAe,SAAS;AACtD,SAAK,SAAS,UAAU,OAAO,WAAW,YAAY;AACtD,QAAI,cAAc;AAChB,WAAK,SAAS,MAAM,sBAAsB;AAC1C,WAAK,SAAS,MAAM,MAAM;AAAA,IAC5B,OAAO;AACL,WAAK,SAAS,MAAM,eAAe,uBAAuB;AAC1D,WAAK,SAAS,MAAM,eAAe,KAAK;AAAA,IAC1C;AAEA,UAAM,cAAc,KAAK,YAAY,SAAS,EAAE,eAAe;AAE/D,UAAM,QAAQ,UAAQ;AACpB,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,SAAG,YAAY;AACf,SAAG,UAAU,OAAO,WAAW,YAAY;AAE3C,YAAM,uBAAuB,KAAK,UAAU;AAE5C,UAAI,KAAK,WAAW,eAAe,KAAK,WAAW,UAAW,IAAG,UAAU,IAAI,cAAc;AAC7F,UAAI,KAAK,WAAW,YAAa,IAAG,UAAU,IAAI,cAAc;AAChE,UAAI,KAAK,WAAW,WAAW,CAAC,qBAAsB,IAAG,UAAU,IAAI,UAAU;AAEjF,YAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,aAAO,YAAY;AACnB,aAAO,UAAU,OAAO,WAAW,YAAY;AAE/C,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,UAAU,OAAO,WAAW,YAAY;AAC9C,YAAM,UAAU,KAAK,KAAK,KAAK,WAAW,QAAQ;AAClD,UAAI,KAAK,cAAc,SAAS;AAC9B,cAAM,MAAM,SAAS,cAAc,KAAK;AACxC,YAAI,MAAM,KAAK;AACf,YAAI,MAAM,KAAK,KAAK;AACpB,cAAM,YAAY,GAAG;AAAA,MACvB,OAAO;AAEL,cAAM,UAAU,IAAI,wBAAwB;AAC5C,cAAM,eAAe,SAAS,gBAAgB,8BAA8B,KAAK;AACjF,qBAAa,aAAa,WAAW,WAAW;AAChD,qBAAa,aAAa,SAAS,IAAI;AACvC,qBAAa,aAAa,UAAU,IAAI;AACxC,qBAAa,aAAa,QAAQ,MAAM;AACxC,qBAAa,aAAa,eAAe,MAAM;AAC/C,cAAM,QAAQ,SAAS,gBAAgB,8BAA8B,MAAM;AAC3E,cAAM,aAAa,KAAK,iEAAiE;AACzF,cAAM,aAAa,UAAU,cAAc;AAC3C,cAAM,aAAa,gBAAgB,KAAK;AACxC,cAAM,aAAa,kBAAkB,OAAO;AAC5C,cAAM,aAAa,mBAAmB,OAAO;AAC7C,cAAM,QAAQ,SAAS,gBAAgB,8BAA8B,MAAM;AAC3E,cAAM,aAAa,KAAK,WAAW;AACnC,cAAM,aAAa,UAAU,cAAc;AAC3C,cAAM,aAAa,gBAAgB,KAAK;AACxC,cAAM,aAAa,kBAAkB,OAAO;AAC5C,cAAM,aAAa,mBAAmB,OAAO;AAC7C,qBAAa,YAAY,KAAK;AAC9B,qBAAa,YAAY,KAAK;AAC9B,cAAM,YAAY,YAAY;AAAA,MAChC;AAEA,UAAI,KAAK,WAAW,aAAa;AAC/B,cAAM,gBAAgB,SAAS,cAAc,KAAK;AAClD,sBAAc,YAAY;AAC1B,cAAM,cAAc,YAAY,KAAK,MAAM,OAAO;AAClD,YAAI,aAAa;AACf,wBAAc,YAAY,WAAW;AAAA,QACvC;AACA,cAAM,YAAY,aAAa;AAAA,MACjC,WAAW,KAAK,WAAW,WAAW,CAAC,sBAAsB;AAC3D,cAAM,gBAAgB,SAAS,cAAc,KAAK;AAClD,sBAAc,YAAY;AAC1B,cAAM,YAAY,YAAY,KAAK,MAAM,KAAK;AAC9C,YAAI,WAAW;AACb,wBAAc,YAAY,SAAS;AAAA,QACrC;AACA,cAAM,YAAY,aAAa;AAAA,MACjC;AAEA,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,YAAY;AACjB,WAAK,cAAc,KAAK,KAAK;AAC7B,UAAI,gBAAgB,CAAC,KAAK,kBAAkB;AAC1C,aAAK,MAAM,UAAU;AAAA,MACvB,OAAO;AACL,aAAK,MAAM,UAAU;AAAA,MACvB;AAEA,YAAM,eAAe,SAAS,cAAc,QAAQ;AACpD,mBAAa,OAAO;AACpB,mBAAa,YAAY;AACzB,YAAM,oBACH,KAAK,WAAW,aACd,KAAK,WAAW,WAAW,yBAC9B,CAAC;AACH,mBAAa,WAAW,CAAC;AACzB,mBAAa,SAAS,CAAC;AACvB,mBAAa,MAAM,UAAU,mBAAmB,gBAAgB;AAChE,mBAAa,UAAU,OAAO,WAAW,YAAY;AACrD,YAAM,aAAa,YAAY,KAAK,MAAM,MAAM;AAChD,UAAI,YAAY;AACd,qBAAa,YAAY,UAAU;AAAA,MACrC;AACA,mBAAa,iBAAiB,SAAS,MAAM;AAC3C,YAAI,KAAK,YAAY,SAAS,EAAE,YAAa;AAC7C,aAAK,YAAY,WAAW,KAAK,EAAE;AAAA,MACrC,CAAC;AAED,aAAO,YAAY,KAAK;AACxB,aAAO,YAAY,IAAI;AACvB,aAAO,YAAY,YAAY;AAC/B,SAAG,YAAY,MAAM;AAGrB,UAAI,KAAK,MAAM;AACb,cAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,gBAAQ,YAAY;AACpB,cAAM,WAAW,SAAS,cAAc,MAAM;AAC9C,iBAAS,YAAY;AACrB,iBAAS,cAAc,KAAK;AAC5B,gBAAQ,YAAY,QAAQ;AAC5B,WAAG,YAAY,OAAO;AAAA,MACxB;AAEA,YAAM,iBAAiB,SAAS,cAAc,KAAK;AACnD,qBAAe,YAAY;AAE3B,YAAM,eAAe,SAAS,cAAc,KAAK;AACjD,mBAAa,YAAY;AAEzB,YAAM,kBAAkB,KAAK,WAAW;AACxC,YAAM,oBAAoB,KAAK,WAAW;AAC1C,YAAM,mBAAmB,KAAK,WAAW;AACzC,YAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,YAAY,CAAC,CAAC;AACjE,YAAM,kBAAkB,CAAC,oBAAoB,cAAc;AAC3D,YAAM,sBAAsB,qBAAsB,eAAe,oBAAqB;AAEtF,YAAM,WAAW,qBAAqB,sBAAuB,cAAc,KAAK,CAAC;AACjF,YAAM,aAAa,mBAAmB,aAAa,qBAAqB,UAAU,eAAe,KAAK,aAAa,oBAAoB,aAAa;AAEpJ,qBAAe,QAAQ,QAAQ;AAC/B,qBAAe,QAAQ,SAAS,KAAK;AACrC,qBAAe,QAAQ,WAAW,YAAY,QAAQ,CAAC;AAEvD,qBAAe,UAAU,OAAO,aAAa,QAAQ;AACrD,qBAAe,UAAU,OAAO,YAAY,kBAAkB;AAC9D,qBAAe,UAAU,OAAO,eAAe,gBAAgB;AAC/D,qBAAe,MAAM,UAAU,mBAAmB,SAAS;AAE3D,mBAAa,UAAU,OAAO,YAAY,kBAAkB;AAC5D,mBAAa,UAAU,OAAO,gBAAgB,kBAAkB;AAEhE,UAAI,kBAAkB;AACpB,qBAAa,MAAM,QAAQ;AAAA,MAC7B,WAAW,oBAAoB;AAC7B,qBAAa,MAAM,QAAQ;AAAA,MAC7B,WAAW,qBAAqB,gBAAgB,GAAG;AAEjD,qBAAa,MAAM,QAAQ;AAAA,MAC7B,OAAO;AACL,cAAM,gBAAgB,KAAK,IAAI,aAAa,CAAC;AAC7C,qBAAa,MAAM,QAAQ,GAAG,KAAK,IAAI,eAAe,GAAG,CAAC;AAAA,MAC5D;AAEA,qBAAe,YAAY,YAAY;AAEvC,SAAG,YAAY,cAAc;AAE7B,WAAK,UAAU,YAAY,EAAE;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEQ,oBAAoB,UAAmB;AAE7C,UAAM,iBAAiB,KAAK,cAAc,OAAO,YAAU,CAAC,OAAO,QAAQ;AAC3E,UAAM,uBAAuB,eAAe,SAAS;AAErD,UAAM,mBAAmB,CAAC,cAA2B;AACnD,gBAAU,YAAY;AACtB,UAAI,CAAC,sBAAsB;AACzB,kBAAU,MAAM,UAAU;AAC1B,kBAAU,UAAU,OAAO,yBAAyB;AACpD;AAAA,MACF;AAEA,gBAAU,MAAM,UAAU,WAAW,SAAS;AAC9C,gBAAU,UAAU,OAAO,2BAA2B,CAAC,QAAQ;AAC/D,UAAI,SAAU;AAGd,qBAAe,QAAQ,YAAU;AAC/B,cAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,eAAO,OAAO;AACd,eAAO,YAAY;AAEnB,cAAM,OAAO,YAAY,OAAO,QAAQ,KAAK,MAAM,MAAM;AACzD,YAAI,MAAM;AACR,gBAAM,cAAc,SAAS,cAAc,MAAM;AACjD,sBAAY,YAAY;AACxB,sBAAY,YAAY,IAAI;AAC5B,iBAAO,YAAY,WAAW;AAAA,QAChC;AAEA,cAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,cAAM,YAAY;AAClB,cAAM,cAAc,OAAO;AAC3B,eAAO,YAAY,KAAK;AAExB,eAAO,iBAAiB,SAAS,MAAM,KAAK,mBAAmB,MAAM,CAAC;AACtE,kBAAU,YAAY,MAAM;AAAA,MAC9B,CAAC;AAAA,IACH;AAEA,SAAK,YAAY,QAAQ,eAAa;AACpC,uBAAiB,SAAS;AAAA,IAC5B,CAAC;AAED,QAAI,KAAK,sBAAsB;AAC7B,WAAK,qBAAqB,UAAU,OAAO,cAAc,wBAAwB,CAAC,QAAQ;AAC1F,WAAK,qBAAqB,MAAM,UAAU,uBAAuB,KAAK;AACtE,WAAK,qBAAqB,YAAY;AAAA,IACxC;AACA,QAAI,KAAK,wBAAwB;AAC/B,WAAK,uBAAuB,UAAU,OAAO,cAAc,wBAAwB,CAAC,QAAQ;AAC5F,WAAK,uBAAuB,MAAM,UAAU,uBAAuB,KAAK;AACxE,WAAK,uBAAuB,YAAY;AAAA,IAC1C;AAGA,QAAI,KAAK,gBAAgB,UAAU;AACjC,UAAI,KAAK,WAAW;AAClB,aAAK,UAAU,UAAU,OAAO,6BAA6B,CAAC,oBAAoB;AAAA,MACpF;AACA,UAAI,KAAK,cAAc;AACrB,aAAK,aAAa,UAAU,OAAO,gCAAgC,CAAC,oBAAoB;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAAiB,OAAqB,aAAsB;AAClE,QAAI,CAAC,KAAK,kBAAmB;AAC7B,QAAI,MAAM,WAAW,GAAG;AACtB,WAAK,kBAAkB,cAAc,cACjC,KAAK,OAAO,YACZ,KAAK,OAAO;AAChB,WAAK,kBAAkB,UAAU,OAAO,cAAc,YAAY;AAClE;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM;AACpB,UAAM,aAAa,KAAK;AAExB,UAAM,SAAS,UAAU,IAAI,SAAS;AACtC,UAAM,iBAAiB,MAAM,OAAO,UAAQ,KAAK,WAAW,WAAW,EAAE;AAEzE,eAAW,UAAU,IAAI,YAAY;AACrC,eAAW,UAAU,OAAO,cAAc,mBAAmB,KAAK;AAElE,QAAI,aAAa;AACf,iBAAW,cAAc,aAAa,cAAc,IAAI,KAAK,IAAI,MAAM;AACvE;AAAA,IACF;AAEA,QAAI,mBAAmB,OAAO;AAC5B,iBAAW,cAAc,GAAG,KAAK,IAAI,MAAM;AAC3C;AAAA,IACF;AAEA,eAAW,cAAc,GAAG,KAAK,IAAI,MAAM;AAAA,EAC7C;AAAA,EAEQ,uBAAuB,YAAsB;AACnD,UAAM,gBAAgB,WAAW,SAAS;AAC1C,UAAM,SACJ,WAAW,WAAW,IAClB,KAAK,OAAO,sBACZ,KAAK,OAAO;AAClB,UAAM,UAAU,gBACZ,GAAG,MAAM,IAAI,WAAW,KAAK,IAAI,CAAC,KAClC;AAEJ,SAAK,iBAAiB,QAAQ,YAAU;AACtC,aAAO,SAAS,CAAC;AACjB,aAAO,cAAc;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEQ,mBAAmB,QAA4B;AACrD,QAAI,OAAO,SAAU;AAErB,SAAK,QAAQ,iBAAiB,MAAM;AACpC,SAAK,cAAc,IAAI,YAAY,gBAAgB,EAAE,QAAQ,OAAO,CAAC,CAAC;AAEtE,QAAI,OAAO,SAAS,YAAY,CAAC,OAAO,QAAQ;AAC9C,WAAK,eAAe;AACpB;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ;AACjB,UAAI;AACF,eAAO,OAAO;AAAA,MAChB,SAAS,OAAO;AACd,gBAAQ,MAAM,6CAA6C,KAAK;AAAA,MAClE;AACA;AAAA,IACF;AAEA,YAAQ,KAAK,gEAAgE,MAAM;AAAA,EACrF;AAAA,EAEQ,sBAAsB;AAC5B,UAAM,QAAS,KAAK,QAAQ,SAAS,CAAC;AACtC,UAAM,eAAe,MAAM;AAC3B,UAAM,cAAc,MAAM;AAC1B,UAAM,qBAAqB,MAAM,sBAAsB,cAAc;AACrE,UAAM,iBAAiB,MAAM,kBAAkB,cAAc;AAC7D,UAAM,aAAa,MAAM;AAEzB,QAAI,iBAAiB,QAAW;AAC9B,WAAK,MAAM;AAAA,QACT;AAAA,QACA,OAAO,iBAAiB,WAAW,GAAG,YAAY,OAAO,OAAO,YAAY;AAAA,MAC9E;AAAA,IACF,OAAO;AACL,WAAK,MAAM,eAAe,aAAa;AAAA,IACzC;AAGA,QAAI,aAAa;AACf,WAAK,MAAM,YAAY,qBAAqB,WAAW;AAAA,IACzD,OAAO;AACL,WAAK,MAAM,eAAe,mBAAmB;AAAA,IAC/C;AAEA,QAAI,oBAAoB;AACtB,WAAK,MAAM,YAAY,oBAAoB,kBAAkB;AAAA,IAC/D;AACA,QAAI,gBAAgB;AAClB,WAAK,MAAM,YAAY,wBAAwB,cAAc;AAAA,IAC/D;AACA,QAAI,YAAY;AACd,WAAK,MAAM,YAAY,oBAAoB,UAAU;AAAA,IACvD;AAEA,UAAM,aAAa,MAAM,cAAc,cAAc;AACrD,QAAI,qBAAqB;AACzB,QAAI,eAAe,YAAY,OAAO,WAAW,aAAa;AAC5D,2BAAqB,OAAO,WAAW,8BAA8B,EAAE,UAAU,SAAS;AAAA,IAC5F;AACA,SAAK,aAAa,cAAc,kBAAkB;AAGlD,UAAM,UAAU,KAAK,QAAQ;AAC7B,QAAI,SAAS;AACX,WAAK,aAAa,gBAAgB,OAAO;AAAA,IAC3C,OAAO;AACL,WAAK,gBAAgB,cAAc;AAAA,IACrC;AAAA,EACF;AACF;AAvsCa,0BACJ,UAAU;;;ACzCZ,SAAS,SAAiB;AAC/B,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,QAAM,MAAM,OAAO,oBAAoB;AAEvC,SAAO,OAAO,IAAI,IAAI;AACxB;;;ACKA,SAAS,kBAAkB,OAAuB;AAChD,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,QAAM,cAAsC;AAAA,IAC1C,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACA,SAAO,YAAY,UAAU,KAAK;AACpC;AAGO,SAAS,kBAAkB,WAA8C;AAC9E,QAAM,IAAI,WAAW;AACrB,SAAO,OAAO,MAAM,YAAY,EAAE,YAAY,MAAM;AACtD;AAMO,SAAS,qBACd,WACA,UACA,YAAqB,MACb;AACR,QAAM,QAA8B,CAAC;AAGrC,QAAM,UAAU,CAAC,OAAe,UAAqC;AACnE,QAAI,UAAU,UAAa,UAAU,KAAM;AAE3C,QAAI;AACJ,QAAI,OAAO,UAAU,WAAW;AAC9B,iBAAW,QAAQ,KAAK;AACxB,UAAI,CAAC,MAAO;AAAA,IACd,OAAO;AACL,iBAAW,OAAO,KAAK;AAAA,IACzB;AAIA,QAAI,UAAU;AACd,QAAI,MAAM,WAAW,MAAM,GAAG;AAC5B,gBAAU,SAAS;AAAA,IACrB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,OAAO,GAAG;AACpC,gBAAU,UAAU;AAAA,IACtB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,MAAM,GAAG;AACnC,gBAAU,SAAS;AAAA,IACrB,WAAW,MAAM,WAAW,MAAM,GAAG;AACnC,gBAAU,SAAS;AAAA,IACrB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,QAAQ,GAAG;AACrC,gBAAU,WAAW;AAAA,IACvB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,QAAQ,GAAG;AACrC,gBAAU,WAAW;AAAA,IACvB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,QAAQ,GAAG;AACrC,gBAAU,WAAW;AAAA,IACvB,WAAW,MAAM,WAAW,MAAM,GAAG;AACnC,gBAAU,SAAS;AAAA,IACrB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,IAAI,GAAG;AACjC,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM,WAAW,KAAK,GAAG;AAClC,gBAAU,QAAQ;AAAA,IACpB;AAEA,UAAM,KAAK,EAAE,OAAO,OAAO,UAAU,QAAQ,CAAC;AAAA,EAChD;AAGA,MAAI,UAAU,MAAM,OAAW,SAAQ,MAAM,UAAU,CAAC;AACxD,MAAI,UAAU,MAAM,OAAW,SAAQ,MAAM,UAAU,CAAC;AACxD,MAAI,UAAU,KAAK;AACjB,UAAM,SAAiC;AAAA,MACrC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,OAAO;AAAA,IACT;AACA,YAAQ,MAAM,OAAO,UAAU,GAAG,KAAK,UAAU,GAAG;AAAA,EACtD;AACA,MAAI,UAAU,GAAI,SAAQ,OAAO,UAAU,EAAE;AAC7C,MAAI,UAAU,SAAU,SAAQ,MAAM,kBAAkB,UAAU,QAAQ,CAAC;AAC3E,MAAI,UAAU,mBAAmB;AAC/B,UAAM,WAAW,OAAO,UAAU,iBAAiB,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,QAAQ,EAAE;AAC5F,QAAI,aAAa,aAAa,aAAa,aAAa;AACtD,cAAQ,OAAO,QAAQ;AAAA,IACzB;AAAA,EACF;AACA,MAAI,UAAU,MAAO,SAAQ,OAAO,UAAU,KAAK;AAGnD,MAAI,UAAU,OAAO,OAAW,SAAQ,OAAO,UAAU,EAAE;AAC3D,MAAI,UAAU,OAAO,OAAW,SAAQ,OAAO,UAAU,EAAE;AAG3D,MAAI,UAAU,MAAM,OAAW,SAAQ,MAAM,UAAU,CAAC;AACxD,MAAI,UAAU,MAAM,OAAW,SAAQ,MAAM,UAAU,CAAC;AACxD,MAAI,UAAU,KAAM,SAAQ,SAAS,UAAU,IAAI;AACnD,MAAI,UAAU,OAAO,OAAW,SAAQ,OAAO,UAAU,EAAE;AAE3D,QAAM,iBAAiB,UAAU,KAAK,UAAU;AAChD,QAAM,cACJ,OAAO,mBAAmB,YAAY,eAAe,YAAY,MAAM;AACzE,MAAI,kBAAkB,mBAAmB,OAAQ,SAAQ,MAAM,cAAc;AAG7E,QAAM,UAAU,cAAc,UAAU,IAAI,UAAU,KAAK,UAAU;AACrE,MAAI,YAAY,UAAa,YAAY,OAAQ,SAAQ,MAAM,OAAO;AAGtE,MAAI,UAAU,IAAI;AAChB,QAAI,UAAU,GAAG,WAAW,MAAM,GAAG;AACnC,cAAQ,WAAW,UAAU,GAAG,QAAQ,QAAQ,EAAE,CAAC;AAAA,IACrD,OAAO;AACL,cAAQ,OAAO,UAAU,EAAE;AAAA,IAC7B;AAAA,EACF;AAGA,MAAI,CAAC,aAAa;AAChB,QAAI,aAAa,UAAU,QAAQ,QAAW;AAC5C,YAAM,MAAM,OAAO;AACnB,UAAI,QAAQ,EAAG,SAAQ,QAAQ,GAAG;AAAA,IACpC,WAAW,UAAU,QAAQ,QAAW;AACtC,cAAQ,QAAQ,UAAU,GAAG;AAAA,IAC/B;AAAA,EACF;AAGA,MAAI,UAAU,YAAY,QAAW;AACnC,QAAI,OAAO,UAAU,YAAY,aAAa,UAAU,SAAS;AAC/D,cAAQ,aAAa,EAAE;AAAA,IACzB,WAAW,OAAO,UAAU,YAAY,UAAU;AAChD,cAAQ,aAAa,UAAU,OAAO;AAAA,IACxC,WAAW,OAAO,UAAU,YAAY,UAAU;AAChD,YAAM,EAAE,MAAM,MAAM,IAAI,UAAU;AAClC,UAAI,QAAQ,QAAQ;AACpB,UAAI,UAAU,OAAW,UAAS,IAAI,KAAK;AAC3C,cAAQ,aAAa,KAAK;AAAA,IAC5B;AAAA,EACF;AACA,MAAI,UAAU,gBAAgB,OAAW,SAAQ,mBAAmB,UAAU,WAAW;AACzF,MAAI,UAAU,eAAe,OAAW,SAAQ,iBAAiB,UAAU,UAAU;AACrF,MAAI,UAAU,aAAa,OAAW,SAAQ,eAAe,UAAU,QAAQ;AAC/E,MAAI,UAAU,eAAe,OAAW,SAAQ,iBAAiB,UAAU,UAAU;AACrF,MAAI,UAAU,UAAU,OAAW,SAAQ,YAAY,UAAU,KAAK;AACtE,MAAI,UAAU,YAAY,QAAW;AACnC,QAAI,OAAO,UAAU,YAAY,aAAa,UAAU,SAAS;AAC/D,cAAQ,aAAa,EAAE;AAAA,IACzB,OAAO;AACL,cAAQ,cAAc,UAAU,OAAO;AAAA,IACzC;AAAA,EACF;AACA,MAAI,UAAU,UAAW,SAAQ,eAAe,EAAE;AAClD,MAAI,UAAU,eAAe,OAAW,SAAQ,iBAAiB,UAAU,UAAU;AACrF,MAAI,UAAU,QAAQ,OAAW,SAAQ,UAAU,UAAU,GAAG;AAChE,MAAI,UAAU,WAAW,OAAW,SAAQ,aAAa,UAAU,MAAM;AACzE,MAAI,UAAU,SAAS,OAAW,SAAQ,WAAW,UAAU,IAAI;AACnE,MAAI,UAAU,UAAW,SAAQ,eAAe,EAAE;AAClD,MAAI,UAAU,OAAQ,SAAQ,YAAY,EAAE;AAC5C,MAAI,UAAU,SAAS,OAAW,SAAQ,WAAW,UAAU,IAAI;AACnE,MAAI,UAAU,aAAa,OAAW,SAAQ,eAAe,UAAU,QAAQ;AAC/E,MAAI,UAAU,eAAe,OAAW,SAAQ,iBAAiB,UAAU,UAAU;AACrF,MAAI,UAAU,YAAY,OAAW,SAAQ,cAAc,UAAU,OAAO;AAC5E,MAAI,UAAU,aAAa,OAAW,SAAQ,eAAe,UAAU,QAAQ;AAC/E,MAAI,UAAU,cAAc,OAAW,SAAQ,gBAAgB,UAAU,SAAS;AAClF,MAAI,UAAU,YAAa,SAAQ,kBAAkB,EAAE;AACvD,MAAI,UAAU,gBAAgB,OAAW,SAAQ,kBAAkB,UAAU,WAAW;AACxF,MAAI,UAAU,OAAQ,SAAQ,aAAa,UAAU,MAAM;AAC3D,MAAI,UAAU,OAAQ,SAAQ,aAAa,UAAU,MAAM;AAC3D,MAAI,UAAU,cAAc,OAAW,SAAQ,gBAAgB,UAAU,SAAS;AAClF,MAAI,UAAU,SAAU,SAAQ,eAAe,UAAU,QAAQ;AACjE,MAAI,UAAU,UAAW,SAAQ,eAAe,EAAE;AAClD,MAAI,UAAU,QAAS,SAAQ,aAAa,EAAE;AAC9C,MAAI,UAAU,WAAW,OAAW,SAAQ,aAAa,UAAU,MAAM;AACzE,MAAI,UAAU,SAAS,OAAW,SAAQ,WAAW,UAAU,IAAI;AACnE,MAAI,UAAU,OAAQ,SAAQ,aAAa,UAAU,MAAM;AAC3D,MAAI,UAAU,OAAQ,SAAQ,aAAa,UAAU,MAAM;AAC3D,MAAI,UAAU,QAAS,SAAQ,cAAc,UAAU,OAAO;AAC9D,MAAI,UAAU,YAAa,SAAQ,kBAAkB,EAAE;AACvD,MAAI,UAAU,YAAa,SAAQ,mBAAmB,UAAU,WAAW;AAG3E,MAAI,UAAU,MAAO,SAAQ,MAAM,UAAU,KAAK;AAGlD,SAAO,KAAK,SAAS,EAAE,QAAQ,SAAO;AACpC,QAAI,IAAI,WAAW,GAAG,KAClB;AAAA,MAAC;AAAA,MAAK;AAAA,MAAK;AAAA,MAAO;AAAA,MAAM;AAAA,MAAY;AAAA,MAAqB;AAAA,MAAS;AAAA,MAAM;AAAA,MAAM;AAAA,MAAK;AAAA,MAAK;AAAA,MAAQ;AAAA,MAAM;AAAA,MAAK;AAAA,MAAK;AAAA,MAAM;AAAA,MACrH;AAAA,MAAW;AAAA,MAAe;AAAA,MAAc;AAAA,MAAY;AAAA,MAAc;AAAA,MAAS;AAAA,MAC3E;AAAA,MAAa;AAAA,MAAc;AAAA,MAAO;AAAA,MAAU;AAAA,MAAQ;AAAA,MAAa;AAAA,MAAU;AAAA,MAC3E;AAAA,MAAY;AAAA,MAAc;AAAA,MAAW;AAAA,MAAY;AAAA,MAAa;AAAA,MAAe;AAAA,MAC7E;AAAA,MAAU;AAAA,MAAU;AAAA,MAAa;AAAA,MAAY;AAAA,MAAa;AAAA,MAAW;AAAA,MAAU;AAAA,MAC/E;AAAA,MAAU;AAAA,MAAU;AAAA,MAAW;AAAA,MAAe;AAAA,MAAe;AAAA,MAAS;AAAA,IAAQ,EAAE,SAAS,GAAG,GAAG;AAClG;AAAA,IACF;AAGA,QAAI,OAAO,UAAU,GAAG,MAAM,YAAY,OAAO,UAAU,GAAG,MAAM,YAAY,OAAO,UAAU,GAAG,MAAM,WAAW;AACnH,cAAQ,KAAK,UAAU,GAAG,CAAQ;AAAA,IACpC;AAAA,EACF,CAAC;AAGD,QAAM,KAAK,CAAC,GAAG,MAAM;AAEnB,UAAM,UAAU,EAAE,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI;AACxC,UAAM,UAAU,EAAE,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI;AAExC,QAAI,YAAY,SAAS;AACvB,aAAO,QAAQ,cAAc,OAAO;AAAA,IACtC;AAGA,WAAO,EAAE,MAAM,cAAc,EAAE,KAAK;AAAA,EACtC,CAAC;AAGD,QAAM,gBAAgB,MAAM,IAAI,OAAK;AACnC,QAAI,EAAE,UAAU,IAAI;AAClB,aAAO,EAAE;AAAA,IACX;AACA,WAAO,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK;AAAA,EAC7B,CAAC,EAAE,KAAK,GAAG;AAGX,QAAM,aAAuB,CAAC;AAC9B,MAAI,UAAU,UAAU,UAAU,OAAO,SAAS,GAAG;AACnD,cAAU,OAAO,QAAQ,WAAS;AAChC,YAAM,sBAA4C,CAAC;AAEnD,YAAM,eAAe,CAAC,OAAe,UAAqC;AACxE,YAAI,UAAU,UAAa,UAAU,KAAM;AAE3C,YAAI;AACJ,YAAI,OAAO,UAAU,WAAW;AAC9B,qBAAW,QAAQ,KAAK;AACxB,cAAI,CAAC,MAAO;AAAA,QACd,OAAO;AACL,qBAAW,OAAO,KAAK;AAAA,QACzB;AAEA,4BAAoB,KAAK;AAAA,UACvB;AAAA,UACA,OAAO;AAAA,UACP,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAEA,0BAAoB,OAAO,YAAY;AAIvC,YAAM,YAAY,oBAAoB,KAAK,OAAK,EAAE,UAAU,gBAAgB;AAC5E,YAAM,eAAe,oBAAoB,OAAO,OAAK,EAAE,UAAU,gBAAgB;AAGjF,YAAM,qBAAqB,CAAC,UAA0B;AAEpD,YAAI,MAAM,WAAW,UAAU,KAAK,MAAM,WAAW,SAAS,EAAG,QAAO;AAExE,YAAI,MAAM,WAAW,KAAK,KAAK,MAAM,WAAW,KAAK,EAAG,QAAO;AAE/D,YAAI,MAAM,WAAW,SAAS,EAAG,QAAO;AAExC,YAAI,MAAM,WAAW,KAAK,EAAG,QAAO;AACpC,YAAI,MAAM,WAAW,KAAK,EAAG,QAAO;AAEpC,YAAI,MAAM,WAAW,IAAI,EAAG,QAAO;AAEnC,YAAI,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,WAAW,QAAQ,EAAG,QAAO;AAEjE,YAAI,MAAM,WAAW,KAAK,EAAG,QAAO;AAEpC,YAAI,MAAM,WAAW,IAAI,EAAG,QAAO;AAEnC,YAAI,MAAM,WAAW,KAAK,EAAG,QAAO;AAEpC,YAAI,MAAM,WAAW,QAAQ,EAAG,QAAO;AAEvC,YAAI,MAAM,WAAW,IAAI,KAAK,MAAM,WAAW,IAAI,EAAG,QAAO;AAE7D,YAAI,MAAM,WAAW,KAAK,EAAG,QAAO;AAEpC,YAAI,MAAM,WAAW,IAAI,EAAG,QAAO;AAEnC,eAAO;AAAA,MACT;AAEA,mBAAa,KAAK,CAAC,GAAG,MAAM;AAC1B,cAAM,SAAS,mBAAmB,EAAE,KAAK;AACzC,cAAM,SAAS,mBAAmB,EAAE,KAAK;AAEzC,YAAI,WAAW,QAAQ;AACrB,iBAAO,SAAS;AAAA,QAClB;AAGA,eAAO,EAAE,MAAM,cAAc,EAAE,KAAK;AAAA,MACtC,CAAC;AAGD,YAAM,cAAc;AAAA,QAClB,GAAG,aAAa,IAAI,OAAK,EAAE,UAAU,KAAK,EAAE,QAAQ,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,EAAE;AAAA,QAC1E,GAAI,YAAY,CAAC,UAAU,KAAK,IAAI,CAAC;AAAA,MACvC,EAAE,KAAK,GAAG;AAEV,UAAI,aAAa;AACf,mBAAW,KAAK,WAAW;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,WAAW,gBAAgB,CAAC,eAAe,GAAG,UAAU,IAAI;AAClE,SAAO,SAAS,KAAK,GAAG;AAC1B;AAEA,SAAS,oBAAoB,OAAqB,SAAoE;AACpH,MAAI,MAAM,SAAS,QAAQ;AAGzB,UAAM,QAAkB,CAAC;AACzB,QAAI,MAAM,WAAY,OAAM,KAAK,MAAM,UAAU;AACjD,QAAI,MAAM,aAAa,OAAW,OAAM,KAAK,OAAO,MAAM,QAAQ,CAAC;AACnE,QAAI,MAAM,UAAW,OAAM,KAAK,MAAM,SAAS;AAC/C,QAAI,MAAM,MAAO,OAAM,KAAK,MAAM,KAAK;AAEvC,UAAM,OAAO,MAAM,OAAO,mBAAmB,MAAM,IAAI,IAAI;AAC3D,UAAM,YAAY,MAAM,SAAS,IAAI,GAAG,MAAM,KAAK,GAAG,CAAC,IAAI,IAAI,KAAK;AACpE,YAAQ,WAAW,SAAS;AAG5B,QAAI,MAAM,WAAW;AAEnB,YAAM,QAAQ,MAAM,UAAU,QAAQ,KAAK,EAAE;AAC7C,cAAQ,OAAO,KAAK;AAAA,IACtB;AACA,QAAI,MAAM,WAAW;AAEnB,YAAM,YAAY,mBAAmB,MAAM,SAAS;AACpD,UAAI,UAAW,SAAQ,OAAO,SAAS;AAAA,IACzC;AACA,QAAI,MAAM,aAAa,OAAW,SAAQ,MAAM,MAAM,QAAQ;AAC9D,QAAI,MAAM,MAAM,OAAW,SAAQ,MAAM,MAAM,CAAC;AAChD,QAAI,MAAM,MAAM,OAAW,SAAQ,MAAM,MAAM,CAAC;AAAA,EAClD,WAAW,MAAM,SAAS,SAAS;AAIjC,QAAI,MAAM,WAAW;AACnB,cAAQ,YAAY,MAAM,SAAS;AAAA,IACrC;AAGA,QAAI,MAAM,UAAW,SAAQ,WAAW,MAAM,SAAS;AACvD,QAAI,MAAM,UAAU,OAAW,SAAQ,OAAO,MAAM,KAAK;AACzD,QAAI,MAAM,WAAW,OAAW,SAAQ,OAAO,MAAM,MAAM;AAC3D,QAAI,MAAM,WAAW;AAEnB,YAAM,YAAY,mBAAmB,MAAM,SAAS;AACpD,UAAI,UAAW,SAAQ,OAAO,SAAS;AAAA,IACzC;AACA,QAAI,MAAM,YAAY,OAAW,SAAQ,MAAM,MAAM,OAAO;AAC5D,QAAI,MAAM,aAAa,OAAW,SAAQ,OAAO,MAAM,QAAQ;AAC/D,QAAI,MAAM,KAAM,SAAQ,OAAO,MAAM,IAAI;AACzC,QAAI,MAAM,YAAa,SAAQ,QAAQ,MAAM,WAAW;AACxD,QAAI,MAAM,YAAY,OAAW,SAAQ,OAAO,MAAM,OAAO;AAC7D,QAAI,MAAM,OAAQ,SAAQ,OAAO,MAAM,MAAM;AAC7C,QAAI,MAAM,WAAY,SAAQ,QAAQ,MAAM,UAAU;AACtD,QAAI,MAAM,SAAU,SAAQ,OAAO,MAAM,QAAQ;AACjD,QAAI,MAAM,iBAAiB,OAAW,SAAQ,QAAQ,MAAM,YAAY;AACxE,QAAI,MAAM,KAAM,SAAQ,UAAU,MAAM,IAAI;AAC5C,QAAI,MAAM,SAAS,OAAW,SAAQ,UAAU,MAAM,IAAI;AAC1D,QAAI,MAAM,MAAM,OAAW,SAAQ,MAAM,MAAM,CAAC;AAChD,QAAI,MAAM,MAAM,OAAW,SAAQ,MAAM,MAAM,CAAC;AAChD,QAAI,MAAM,UAAW,SAAQ,MAAM,MAAM,SAAS;AAGlD,QAAI,MAAM,SAAS;AACjB,YAAM,UAAU,MAAM;AACtB,UAAI,QAAQ,YAAY,QAAW;AACjC,YAAI,OAAO,QAAQ,YAAY,aAAa,QAAQ,SAAS;AAC3D,kBAAQ,cAAc,EAAE;AAAA,QAC1B,WAAW,OAAO,QAAQ,YAAY,UAAU;AAC9C,kBAAQ,cAAc,QAAQ,OAAO;AAAA,QACvC;AAAA,MACF;AACA,UAAI,QAAQ,YAAY,OAAW,SAAQ,eAAe,QAAQ,OAAO;AACzE,UAAI,QAAQ,eAAe,OAAW,SAAQ,kBAAkB,QAAQ,UAAU;AAClF,UAAI,QAAQ,eAAe,OAAW,SAAQ,kBAAkB,QAAQ,UAAU;AAClF,UAAI,QAAQ,aAAa,OAAW,SAAQ,gBAAgB,QAAQ,QAAQ;AAC5E,UAAI,QAAQ,QAAQ,OAAW,SAAQ,WAAW,QAAQ,GAAG;AAC7D,UAAI,QAAQ,WAAW,OAAW,SAAQ,cAAc,QAAQ,MAAM;AACtE,UAAI,QAAQ,SAAS,OAAW,SAAQ,YAAY,QAAQ,IAAI;AAChE,UAAI,QAAQ,UAAW,SAAQ,gBAAgB,EAAE;AACjD,UAAI,QAAQ,OAAQ,SAAQ,aAAa,EAAE;AAC3C,UAAI,QAAQ,SAAS,OAAW,SAAQ,YAAY,QAAQ,IAAI;AAChE,UAAI,QAAQ,aAAa,OAAW,SAAQ,gBAAgB,QAAQ,QAAQ;AAC5E,UAAI,QAAQ,eAAe,OAAW,SAAQ,kBAAkB,QAAQ,UAAU;AAClF,UAAI,QAAQ,YAAY,OAAW,SAAQ,eAAe,QAAQ,OAAO;AACzE,UAAI,QAAQ,aAAa,OAAW,SAAQ,gBAAgB,QAAQ,QAAQ;AAC5E,UAAI,QAAQ,cAAc,OAAW,SAAQ,iBAAiB,QAAQ,SAAS;AAC/E,UAAI,QAAQ,YAAa,SAAQ,mBAAmB,EAAE;AACtD,UAAI,QAAQ,gBAAgB,OAAW,SAAQ,mBAAmB,QAAQ,WAAW;AACrF,UAAI,QAAQ,eAAe,OAAW,SAAQ,kBAAkB,QAAQ,UAAU;AAClF,UAAI,QAAQ,UAAU,OAAW,SAAQ,aAAa,QAAQ,KAAK;AACnE,UAAI,QAAQ,gBAAgB,OAAW,SAAQ,oBAAoB,QAAQ,WAAW;AACtF,UAAI,QAAQ,UAAW,SAAQ,gBAAgB,EAAE;AAAA,IACnD;AAAA,EACF;AAGA,UAAQ,kBAAkB,EAAE;AAC9B;AAMA,SAAS,mBAAmB,WAA2B;AACrD,QAAM,aAAa,UAAU,KAAK,EAAE,YAAY,EAAE,QAAQ,QAAQ,GAAG;AACrE,QAAM,UAAkC;AAAA,IACtC,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,QAAQ;AAAA,EACV;AACA,SAAO,QAAQ,UAAU,KAAK;AAChC;;;AC1gBA,IAAM,kBAAkB;AAQjB,SAAS,2BAA2B,KAAqB;AAC9D,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,KAAK,OAAO,GAAG;AACjC,UAAM,eAAe,SAAS,OAAO;AACrC,WAAO,mBAAmB,YAAY;AAAA,EACxC;AAEA,MAAI,QAAQ,WAAW,QAAQ,GAAG;AAChC,WAAO,mBAAmB,OAAO;AAAA,EACnC;AAEA,SAAO,QACJ,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAI,aAAW,mBAAmB,OAAO,CAAC,EAC1C,KAAK,GAAG;AACb;AAEO,SAAS,cACd,SACA,WACA,KACA,WACA,UACA,YAAqB,MACb;AAER,QAAM,iBAAiB,QAAQ,QAAQ,QAAQ,EAAE;AAGjD,QAAM,eAAe,qBAAqB,aAAa,CAAC,GAAG,UAAU,SAAS;AAE9E,QAAM,aAAa,IAAI,KAAK;AAK5B,MAAI,gBAAgB,KAAK,UAAU,GAAG;AACpC,UAAM,YAAY,SAAS,UAAU;AACrC,UAAM,qBAAqB,eAAe,GAAG,YAAY,IAAI,SAAS,KAAK;AAC3E,WAAO,GAAG,cAAc,IAAI,SAAS,IAAI,kBAAkB;AAAA,EAC7D;AAGA,MAAI,WAAW,WAAW,QAAQ,GAAG;AACnC,UAAM,YAAY;AAClB,UAAM,qBAAqB,eAAe,GAAG,YAAY,IAAI,SAAS,KAAK;AAC3E,WAAO,GAAG,cAAc,IAAI,SAAS,IAAI,kBAAkB;AAAA,EAC7D;AAEA,QAAM,cAAc,2BAA2B,UAAU;AAGzD,MAAI,cAAc;AAChB,WAAO,GAAG,cAAc,IAAI,SAAS,IAAI,YAAY,IAAI,WAAW;AAAA,EACtE;AAEA,SAAO,GAAG,cAAc,IAAI,SAAS,IAAI,WAAW;AACtD;;;ACpEA,IAAM,6BAA6B,CAAC,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI;AAC/E,IAAM,4BAA4B,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,GAAG;AAMpE,SAAS,oBAAoB,OAA8B;AAEzD,QAAM,YAAY,MAAM,MAAM,oBAAoB;AAClD,MAAI,CAAC,aAAa,UAAU,WAAW,EAAG,QAAO;AAEjD,QAAM,WAAW,UAAU,IAAI,OAAK,WAAW,CAAC,CAAC;AACjD,SAAO,KAAK,IAAI,GAAG,QAAQ;AAC7B;AASO,SAAS,6BACd,SACA,WACA,SACA,UACA,oBAA8B,4BAC9B,oBAA8B,2BAC9B,YAAqB,MACC;AACtB,QAAM,EAAE,KAAK,OAAO,OAAO,WAAW,YAAY,IAAI;AAGtD,QAAM,uBAAuB,eAAe;AAG5C,MAAI,UAAU,UAAa,CAAC,OAAO;AACjC,UAAM,MAAM,YAAY,OAAO,IAAI;AACnC,UAAMC,aAAY;AAGlB,UAAMC,eAAwB,CAAC;AAG/B,UAAM,cAAgC;AAAA,MACpC,GAAG;AAAA,MACH,GAAGD;AAAA,MACH,KAAK;AAAA,IACP;AACA,UAAM,QAAQ,cAAc,SAAS,WAAW,KAAK,aAAa,UAAU,KAAK;AACjF,IAAAC,aAAY,KAAK,GAAG,KAAK,KAAK;AAG9B,QAAI,OAAO,GAAG;AACZ,YAAM,cAAgC;AAAA,QACpC,GAAG;AAAA,QACH,GAAGD;AAAA,QACH,KAAK;AAAA,MACP;AACA,YAAM,QAAQ,cAAc,SAAS,WAAW,KAAK,aAAa,UAAU,KAAK;AACjF,MAAAC,aAAY,KAAK,GAAG,KAAK,KAAK;AAAA,IAChC;AAGA,UAAMC,WAAU;AAEhB,WAAO;AAAA,MACL,KAAKA;AAAA,MACL,QAAQD,aAAY,KAAK,IAAI;AAAA,MAC7B,OAAOD;AAAA,IACT;AAAA,EACF;AAGA,MAAI,OAAO;AAET,SAAK,oBAAoB,KAAK;AAC9B,UAAM,sBAAsB;AAG5B,UAAMC,eAAc,oBAAoB,IAAI,QAAM;AAChD,YAAM,qBAAuC;AAAA,QAC3C,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AACA,YAAM,MAAM,cAAc,SAAS,WAAW,KAAK,oBAAoB,UAAU,SAAS;AAC1F,aAAO,GAAG,GAAG,IAAI,EAAE;AAAA,IACrB,CAAC;AAGD,UAAMD,aAAY,SAAS,oBAAoB,CAAC,KAAK,qBAAqB,CAAC;AAC3E,UAAMG,iBAAkC;AAAA,MACtC,GAAG;AAAA,MACH,GAAGH;AAAA,IACL;AACA,UAAME,WAAU,cAAc,SAAS,WAAW,KAAKC,gBAAe,UAAU,SAAS;AAEzF,WAAO;AAAA,MACL,KAAKD;AAAA,MACL,QAAQD,aAAY,KAAK,IAAI;AAAA,MAC7B;AAAA,MACA,OAAOD;AAAA,IACT;AAAA,EACF;AAIA,QAAM,cAAc,qBAAqB,IAAI,QAAM;AACjD,UAAM,qBAAuC;AAAA,MAC3C,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AACA,UAAM,MAAM,cAAc,SAAS,WAAW,KAAK,oBAAoB,UAAU,SAAS;AAC1F,WAAO,GAAG,GAAG,IAAI,EAAE;AAAA,EACrB,CAAC;AAGD,QAAM,YAAY,qBAAqB,CAAC;AACxC,QAAM,gBAAkC;AAAA,IACtC,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,UAAU,cAAc,SAAS,WAAW,KAAK,eAAe,UAAU,SAAS;AAEzF,SAAO;AAAA,IACL,KAAK;AAAA,IACL,QAAQ,YAAY,KAAK,IAAI;AAAA,IAC7B,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACF;;;AC5HA,IAAMI,oBAAmB;AACzB,IAAMC,8BAA6B,CAAC,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI;AAC/E,IAAMC,6BAA4B,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,GAAG;AAE7D,SAAS,SAAS,QAAoC;AAC3D,QAAM;AAAA,IACJ,UAAUF;AAAA,IACV;AAAA,IACA,WAAW,CAAC;AAAA,IACZ,oBAAoBC;AAAA,IACpB,mBAAmBC;AAAA,IACnB,YAAY;AAAA,EACd,IAAI;AAEJ,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AAEA,QAAM,WAAuB;AAAA;AAAA;AAAA;AAAA,IAI3B,IAAI,KAAa,WAAsC;AACrD,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,gBAAgB,WAAqC;AACnD,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,0BAA0B,SAAkD;AAE1E,YAAM,6BAA6B,QAAQ,eAAe;AAE1D,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,SAAiB;AACf,aAAO,OAAO;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;;;ACnFA,IAAI,eAA8B;AAO3B,SAAS,mBAA2B;AACzC,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,aAAa,eAAe,OAAO,UAAU,aAAa;AAEnE,mBAAe;AACf,WAAO;AAAA,EACT;AAGA,MAAI;AACF,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ;AACf,WAAO,SAAS;AAChB,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,KAAK;AACR,qBAAe;AACf,aAAO;AAAA,IACT;AAGA,QAAI;AACF,YAAM,cAAc,OAAO,UAAU,YAAY;AACjD,UAAI,eAAe,YAAY,QAAQ,iBAAiB,MAAM,GAAG;AAC/D,uBAAe;AACf,eAAO;AAAA,MACT;AAAA,IACF,SAAS,GAAG;AAAA,IAEZ;AAGA,QAAI;AACF,YAAM,cAAc,OAAO,UAAU,YAAY;AACjD,UAAI,eAAe,YAAY,QAAQ,iBAAiB,MAAM,GAAG;AAC/D,uBAAe;AACf,eAAO;AAAA,MACT;AAAA,IACF,SAAS,GAAG;AAAA,IAEZ;AAGA,mBAAe;AACf,WAAO;AAAA,EACT,SAAS,GAAG;AAEV,mBAAe;AACf,WAAO;AAAA,EACT;AACF;AAMO,SAAS,oBAA4B;AAC1C,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,EACT;AACA,SAAO,iBAAiB;AAC1B;AAKO,SAAS,mBAAyB;AACvC,iBAAe;AACjB;;;ACpEA,IAAM,mBAA2C;AAAA,EAC/C,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,gBAAgB;AAClB;AAEA,SAAS,sBAAsB;AAC7B,MACE,OAAO,eAAe,eACtB,OAAO,WAAW,mBAAmB,aACrC;AACA;AAAA,EACF;AACA,MAAI,CAAC,WAAW,eAAe,IAAI,0BAA0B,OAAO,GAAG;AACrE,eAAW,eAAe;AAAA,MACxB,0BAA0B;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,QAA2C;AAChE,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,UAAU,SAAS,cAA2B,MAAM;AAC1D,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,mBAAmB,MAAM,aAAa;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,WAAsD;AAC9E,MAAI,CAAC,UAAW,QAAO;AACvB,MAAI,OAAO,cAAc,UAAU;AACjC,UAAM,UAAU,SAAS,cAA2B,SAAS;AAC7D,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,sBAAsB,SAAS,aAAa;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAiC;AAC3D,QAAM,OAAO;AAAA,IACX,cAAc,cAAc;AAAA,IAC5B,oBAAoB,cAAc;AAAA,IAClC,gBAAgB,cAAc;AAAA,EAChC;AAEA,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,GAAG;AAAA,MACL;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,GAAG;AAAA,MACL;AAAA,IACF;AACE,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,GAAG;AAAA,MACL;AAAA,EACJ;AACF;AAEA,SAAS,qBAAqB,OAAiD;AAC7E,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAW,MAAM,QAAQ,KAAK,IAChC,QACA,MACG,MAAM,GAAG,EACT,IAAI,WAAS,MAAM,KAAK,CAAC,EACzB,OAAO,OAAO;AAErB,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAiC,CAAC;AACxC,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,SAAS,UAAU;AAC5B,UAAM,aAAa,MAAM,YAAY,EAAE,QAAQ,YAAY,EAAE;AAC7D,UAAM,WAAW,iBAAiB,UAAU,KAAK;AACjD,QAAI,KAAK,IAAI,QAAQ,EAAG;AACxB,UAAM,QAAQ,gBAAgB,KAAK,YAAU,OAAO,OAAO,QAAQ;AACnE,QAAI,OAAO;AACT,eAAS,KAAK,KAAK;AACnB,WAAK,IAAI,QAAQ;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBACP,SACA,gBAAgB,OACY;AAC5B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,aAAkB,EAAE,GAAG,KAAK;AAElC,MAAI,SAAS,QAAW;AACtB,eAAW,OAAO,SAAS,WAAW,WAAW;AAAA,EACnD,WAAW,eAAe;AACxB,eAAW,OAAO;AAAA,EACpB;AAEA,MAAI,UAAU,QAAW;AACvB,eAAW,QAAQ,mBAAmB,KAAK;AAAA,EAC7C,WAAW,eAAe;AACxB,eAAW,QAAQ,mBAAmB,OAAO;AAAA,EAC/C;AAEA,MAAI,QAAQ,YAAY,QAAW;AACjC,eAAW,UAAU,QAAQ;AAAA,EAC/B,WAAW,eAAe;AACxB,eAAW,UAAU;AAAA,EACvB;AAEA,MAAI,YAAY,QAAW;AACzB,eAAW,UAAU,qBAAqB,OAAO;AAAA,EACnD,WAAW,aAAa,SAAS;AAE/B,eAAW,UAAU,CAAC;AAAA,EACxB,WAAW,eAAe;AACxB,eAAW,UAAU,CAAC;AAAA,EACxB;AAEA,MAAI,eAAe,QAAW;AAC5B,eAAW,aAAa;AAAA,EAC1B;AAEA,MAAI,WAAW,QAAW;AACxB,eAAW,SAAS;AAAA,EACtB;AAEA,MAAI,eAAe,QAAW;AAC5B,eAAW,aAAa;AAAA,EAC1B,WAAW,eAAe;AACxB,eAAW,aAAa;AAAA,EAC1B;AAEA,MAAI,qBAAqB,QAAW;AAClC,eAAW,mBAAmB;AAAA,EAChC,WAAW,eAAe;AACxB,eAAW,mBAAmB;AAAA,EAChC;AAEA,MAAI,QAAQ,yBAAyB,QAAW;AAC9C,eAAW,uBAAuB,QAAQ;AAAA,EAC5C,WAAW,eAAe;AACxB,eAAW,uBAAuB;AAAA,EACpC;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,SAAkD;AAE/E,QAAM,YAAY,iBAAiB,QAAQ,SAAS;AACpD,QAAM,gBAAgB,cAAc,QAAQ,MAAM;AAClD,QAAM,iBAAiB,aAAa;AAEpC,sBAAoB;AAEpB,QAAM,SAAS,SAAS;AAAA,IACtB,0BAA0B;AAAA,EAC5B;AAGA,iBAAe,YAAY;AAC3B,iBAAe,YAAY,MAAM;AAEjC,QAAM,SAAS,IAAI,oBAAoB;AAAA,IACrC,QAAQ,QAAQ;AAAA,IAChB,aAAa,QAAQ;AAAA,EACvB,CAAC;AAED,QAAM,oBAAoB,iBAAiB,SAAS,IAAI;AAIxD,MAAI,aAAa,cAAc,gBAAgB;AAC7C,sBAAkB,YAAY;AAAA,EAChC,OAAO;AAEL,sBAAkB,YAAY;AAAA,EAChC;AAEA,QAAM,aAAa,IAAI;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,cAAc,YAAY,iBAAiB;AAElD,SAAO;AAAA,IACL,gBAAgB,MAAM,OAAO,eAAe;AAAA,IAC5C,aAAa,MAAM,WAAW,UAAU;AAAA,IACxC,OAAO,MAAM,WAAW,MAAM;AAAA,IAC9B,SAAS,MAAM;AACb,iBAAW,OAAO;AAClB,iBAAW,MAAM;AACjB,aAAO,OAAO;AAAA,IAChB;AAAA,IACA,eAAe,CAAC,mBAAmD;AACjE,YAAM,aAAa,iBAAiB,gBAAgB,KAAK;AACzD,iBAAW,WAAW,UAAU;AAChC,aAAO,cAAc,UAAU;AAAA,IACjC;AAAA,IACA,UAAU,MAAM,WAAW,SAAS;AAAA,EACtC;AACF;AAGO,SAAS,oCAAoC;AAClD,sBAAoB;AACtB;","names":["item","message","containerStyle","baseWidth","srcSetParts","baseSrc","baseTransform","DEFAULT_BASE_URL","DEFAULT_DEVICE_BREAKPOINTS","DEFAULT_IMAGE_BREAKPOINTS"]}
|