Index: imaps-frontend/node_modules/webpack/lib/css/CssGenerator.js
===================================================================
--- imaps-frontend/node_modules/webpack/lib/css/CssGenerator.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
+++ imaps-frontend/node_modules/webpack/lib/css/CssGenerator.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
@@ -0,0 +1,261 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Sergey Melyukov @smelukov
+*/
+
+"use strict";
+
+const { ReplaceSource, RawSource, ConcatSource } = require("webpack-sources");
+const { UsageState } = require("../ExportsInfo");
+const Generator = require("../Generator");
+const InitFragment = require("../InitFragment");
+const {
+	JS_AND_CSS_EXPORT_TYPES,
+	JS_AND_CSS_TYPES
+} = require("../ModuleSourceTypesConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").CssAutoGeneratorOptions} CssAutoGeneratorOptions */
+/** @typedef {import("../../declarations/WebpackOptions").CssGlobalGeneratorOptions} CssGlobalGeneratorOptions */
+/** @typedef {import("../../declarations/WebpackOptions").CssModuleGeneratorOptions} CssModuleGeneratorOptions */
+/** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").CssData} CssData */
+/** @typedef {import("../DependencyTemplate").CssDependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Generator").GenerateContext} GenerateContext */
+/** @typedef {import("../Generator").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
+/** @typedef {import("../Module").SourceTypes} SourceTypes */
+/** @typedef {import("../NormalModule")} NormalModule */
+/** @typedef {import("../util/Hash")} Hash */
+
+class CssGenerator extends Generator {
+	/**
+	 * @param {CssAutoGeneratorOptions | CssGlobalGeneratorOptions | CssModuleGeneratorOptions} options options
+	 */
+	constructor(options) {
+		super();
+		this.convention = options.exportsConvention;
+		this.localIdentName = options.localIdentName;
+		this.exportsOnly = options.exportsOnly;
+		this.esModule = options.esModule;
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the bailout reason should be determined
+	 * @param {ConcatenationBailoutReasonContext} context context
+	 * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated
+	 */
+	getConcatenationBailoutReason(module, context) {
+		if (!this.esModule) {
+			return "Module is not an ECMAScript module";
+		}
+
+		return undefined;
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the code should be generated
+	 * @param {GenerateContext} generateContext context for generate
+	 * @returns {Source | null} generated code
+	 */
+	generate(module, generateContext) {
+		const source =
+			generateContext.type === "javascript"
+				? new ReplaceSource(new RawSource(""))
+				: new ReplaceSource(/** @type {Source} */ (module.originalSource()));
+
+		/** @type {InitFragment<GenerateContext>[]} */
+		const initFragments = [];
+		/** @type {CssData} */
+		const cssData = {
+			esModule: this.esModule,
+			exports: new Map()
+		};
+
+		/** @type {InitFragment<GenerateContext>[] | undefined} */
+		let chunkInitFragments;
+		/** @type {DependencyTemplateContext} */
+		const templateContext = {
+			runtimeTemplate: generateContext.runtimeTemplate,
+			dependencyTemplates: generateContext.dependencyTemplates,
+			moduleGraph: generateContext.moduleGraph,
+			chunkGraph: generateContext.chunkGraph,
+			module,
+			runtime: generateContext.runtime,
+			runtimeRequirements: generateContext.runtimeRequirements,
+			concatenationScope: generateContext.concatenationScope,
+			codeGenerationResults:
+				/** @type {CodeGenerationResults} */
+				(generateContext.codeGenerationResults),
+			initFragments,
+			cssData,
+			get chunkInitFragments() {
+				if (!chunkInitFragments) {
+					const data =
+						/** @type {NonNullable<GenerateContext["getData"]>} */
+						(generateContext.getData)();
+					chunkInitFragments = data.get("chunkInitFragments");
+					if (!chunkInitFragments) {
+						chunkInitFragments = [];
+						data.set("chunkInitFragments", chunkInitFragments);
+					}
+				}
+
+				return chunkInitFragments;
+			}
+		};
+
+		/**
+		 * @param {Dependency} dependency dependency
+		 */
+		const handleDependency = dependency => {
+			const constructor =
+				/** @type {new (...args: EXPECTED_ANY[]) => Dependency} */
+				(dependency.constructor);
+			const template = generateContext.dependencyTemplates.get(constructor);
+			if (!template) {
+				throw new Error(
+					`No template for dependency: ${dependency.constructor.name}`
+				);
+			}
+
+			template.apply(dependency, source, templateContext);
+		};
+
+		for (const dependency of module.dependencies) {
+			handleDependency(dependency);
+		}
+
+		switch (generateContext.type) {
+			case "javascript": {
+				module.buildInfo.cssData = cssData;
+
+				generateContext.runtimeRequirements.add(RuntimeGlobals.module);
+
+				if (generateContext.concatenationScope) {
+					const source = new ConcatSource();
+					const usedIdentifiers = new Set();
+					for (const [name, v] of cssData.exports) {
+						const usedName = generateContext.moduleGraph
+							.getExportInfo(module, name)
+							.getUsedName(name, generateContext.runtime);
+						if (!usedName) {
+							continue;
+						}
+						let identifier = Template.toIdentifier(usedName);
+						const { RESERVED_IDENTIFIER } = require("../util/propertyName");
+						if (RESERVED_IDENTIFIER.has(identifier)) {
+							identifier = `_${identifier}`;
+						}
+						const i = 0;
+						while (usedIdentifiers.has(identifier)) {
+							identifier = Template.toIdentifier(name + i);
+						}
+						usedIdentifiers.add(identifier);
+						generateContext.concatenationScope.registerExport(name, identifier);
+						source.add(
+							`${
+								generateContext.runtimeTemplate.supportsConst()
+									? "const"
+									: "var"
+							} ${identifier} = ${JSON.stringify(v)};\n`
+						);
+					}
+					return source;
+				}
+
+				const needNsObj =
+					this.esModule &&
+					generateContext.moduleGraph
+						.getExportsInfo(module)
+						.otherExportsInfo.getUsed(generateContext.runtime) !==
+						UsageState.Unused;
+
+				if (needNsObj) {
+					generateContext.runtimeRequirements.add(
+						RuntimeGlobals.makeNamespaceObject
+					);
+				}
+
+				const exports = [];
+
+				for (const [name, v] of cssData.exports) {
+					exports.push(`\t${JSON.stringify(name)}: ${JSON.stringify(v)}`);
+				}
+
+				return new RawSource(
+					`${needNsObj ? `${RuntimeGlobals.makeNamespaceObject}(` : ""}${
+						module.moduleArgument
+					}.exports = {\n${exports.join(",\n")}\n}${needNsObj ? ")" : ""};`
+				);
+			}
+			case "css": {
+				if (module.presentationalDependencies !== undefined) {
+					for (const dependency of module.presentationalDependencies) {
+						handleDependency(dependency);
+					}
+				}
+
+				generateContext.runtimeRequirements.add(RuntimeGlobals.hasCssModules);
+
+				return InitFragment.addToSource(source, initFragments, generateContext);
+			}
+		}
+	}
+
+	/**
+	 * @param {NormalModule} module fresh module
+	 * @returns {SourceTypes} available types (do not mutate)
+	 */
+	getTypes(module) {
+		// TODO, find a better way to prevent the original module from being removed after concatenation, maybe it is a bug
+		return this.exportsOnly ? JS_AND_CSS_EXPORT_TYPES : JS_AND_CSS_TYPES;
+	}
+
+	/**
+	 * @param {NormalModule} module the module
+	 * @param {string=} type source type
+	 * @returns {number} estimate size of the module
+	 */
+	getSize(module, type) {
+		switch (type) {
+			case "javascript": {
+				if (!module.buildInfo.cssData) {
+					return 42;
+				}
+
+				const exports = module.buildInfo.cssData.exports;
+				const stringifiedExports = JSON.stringify(
+					Array.from(exports).reduce((obj, [key, value]) => {
+						obj[key] = value;
+						return obj;
+					}, {})
+				);
+
+				return stringifiedExports.length + 42;
+			}
+			case "css": {
+				const originalSource = module.originalSource();
+
+				if (!originalSource) {
+					return 0;
+				}
+
+				return originalSource.size();
+			}
+		}
+	}
+
+	/**
+	 * @param {Hash} hash hash that will be modified
+	 * @param {UpdateHashContext} updateHashContext context for updating hash
+	 */
+	updateHash(hash, { module }) {
+		hash.update(this.esModule.toString());
+	}
+}
+
+module.exports = CssGenerator;
Index: imaps-frontend/node_modules/webpack/lib/css/CssLoadingRuntimeModule.js
===================================================================
--- imaps-frontend/node_modules/webpack/lib/css/CssLoadingRuntimeModule.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
+++ imaps-frontend/node_modules/webpack/lib/css/CssLoadingRuntimeModule.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
@@ -0,0 +1,503 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { SyncWaterfallHook } = require("tapable");
+const Compilation = require("../Compilation");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+const compileBooleanMatcher = require("../util/compileBooleanMatcher");
+const { chunkHasCss } = require("./CssModulesPlugin");
+
+/** @typedef {import("../../declarations/WebpackOptions").Environment} Environment */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Compilation").RuntimeRequirementsContext} RuntimeRequirementsContext */
+/** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
+
+/**
+ * @typedef {object} CssLoadingRuntimeModulePluginHooks
+ * @property {SyncWaterfallHook<[string, Chunk]>} createStylesheet
+ * @property {SyncWaterfallHook<[string, Chunk]>} linkPreload
+ * @property {SyncWaterfallHook<[string, Chunk]>} linkPrefetch
+ */
+
+/** @type {WeakMap<Compilation, CssLoadingRuntimeModulePluginHooks>} */
+const compilationHooksMap = new WeakMap();
+
+class CssLoadingRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @returns {CssLoadingRuntimeModulePluginHooks} hooks
+	 */
+	static getCompilationHooks(compilation) {
+		if (!(compilation instanceof Compilation)) {
+			throw new TypeError(
+				"The 'compilation' argument must be an instance of Compilation"
+			);
+		}
+		let hooks = compilationHooksMap.get(compilation);
+		if (hooks === undefined) {
+			hooks = {
+				createStylesheet: new SyncWaterfallHook(["source", "chunk"]),
+				linkPreload: new SyncWaterfallHook(["source", "chunk"]),
+				linkPrefetch: new SyncWaterfallHook(["source", "chunk"])
+			};
+			compilationHooksMap.set(compilation, hooks);
+		}
+		return hooks;
+	}
+
+	/**
+	 * @param {ReadOnlyRuntimeRequirements} runtimeRequirements runtime requirements
+	 */
+	constructor(runtimeRequirements) {
+		super("css loading", 10);
+
+		this._runtimeRequirements = runtimeRequirements;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const { _runtimeRequirements } = this;
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const chunk = /** @type {Chunk} */ (this.chunk);
+		const {
+			chunkGraph,
+			runtimeTemplate,
+			outputOptions: {
+				crossOriginLoading,
+				uniqueName,
+				chunkLoadTimeout: loadTimeout
+			}
+		} = compilation;
+		const fn = RuntimeGlobals.ensureChunkHandlers;
+		const conditionMap = chunkGraph.getChunkConditionMap(
+			/** @type {Chunk} */ (chunk),
+			/**
+			 * @param {Chunk} chunk the chunk
+			 * @param {ChunkGraph} chunkGraph the chunk graph
+			 * @returns {boolean} true, if the chunk has css
+			 */
+			(chunk, chunkGraph) =>
+				Boolean(chunkGraph.getChunkModulesIterableBySourceType(chunk, "css"))
+		);
+		const hasCssMatcher = compileBooleanMatcher(conditionMap);
+
+		const withLoading =
+			_runtimeRequirements.has(RuntimeGlobals.ensureChunkHandlers) &&
+			hasCssMatcher !== false;
+		/** @type {boolean} */
+		const withHmr = _runtimeRequirements.has(
+			RuntimeGlobals.hmrDownloadUpdateHandlers
+		);
+		/** @type {Set<number | string | null>} */
+		const initialChunkIds = new Set();
+		for (const c of /** @type {Chunk} */ (chunk).getAllInitialChunks()) {
+			if (chunkHasCss(c, chunkGraph)) {
+				initialChunkIds.add(c.id);
+			}
+		}
+
+		if (!withLoading && !withHmr) {
+			return null;
+		}
+
+		const environment =
+			/** @type {Environment} */
+			(compilation.outputOptions.environment);
+		const isNeutralPlatform = runtimeTemplate.isNeutralPlatform();
+		const withPrefetch =
+			this._runtimeRequirements.has(RuntimeGlobals.prefetchChunkHandlers) &&
+			(environment.document || isNeutralPlatform) &&
+			chunk.hasChildByOrder(chunkGraph, "prefetch", true, chunkHasCss);
+		const withPreload =
+			this._runtimeRequirements.has(RuntimeGlobals.preloadChunkHandlers) &&
+			(environment.document || isNeutralPlatform) &&
+			chunk.hasChildByOrder(chunkGraph, "preload", true, chunkHasCss);
+
+		const { linkPreload, linkPrefetch } =
+			CssLoadingRuntimeModule.getCompilationHooks(compilation);
+
+		const withFetchPriority = _runtimeRequirements.has(
+			RuntimeGlobals.hasFetchPriority
+		);
+
+		const { createStylesheet } =
+			CssLoadingRuntimeModule.getCompilationHooks(compilation);
+
+		const stateExpression = withHmr
+			? `${RuntimeGlobals.hmrRuntimeStatePrefix}_css`
+			: undefined;
+
+		const code = Template.asString([
+			"link = document.createElement('link');",
+			`if (${RuntimeGlobals.scriptNonce}) {`,
+			Template.indent(
+				`link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});`
+			),
+			"}",
+			uniqueName
+				? 'link.setAttribute("data-webpack", uniqueName + ":" + key);'
+				: "",
+			withFetchPriority
+				? Template.asString([
+						"if(fetchPriority) {",
+						Template.indent(
+							'link.setAttribute("fetchpriority", fetchPriority);'
+						),
+						"}"
+					])
+				: "",
+			"link.setAttribute(loadingAttribute, 1);",
+			'link.rel = "stylesheet";',
+			"link.href = url;",
+			crossOriginLoading
+				? crossOriginLoading === "use-credentials"
+					? 'link.crossOrigin = "use-credentials";'
+					: Template.asString([
+							"if (link.href.indexOf(window.location.origin + '/') !== 0) {",
+							Template.indent(
+								`link.crossOrigin = ${JSON.stringify(crossOriginLoading)};`
+							),
+							"}"
+						])
+				: ""
+		]);
+
+		return Template.asString([
+			"// object to store loaded and loading chunks",
+			"// undefined = chunk not loaded, null = chunk preloaded/prefetched",
+			"// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded",
+			`var installedChunks = ${
+				stateExpression ? `${stateExpression} = ${stateExpression} || ` : ""
+			}{`,
+			Template.indent(
+				Array.from(initialChunkIds, id => `${JSON.stringify(id)}: 0`).join(
+					",\n"
+				)
+			),
+			"};",
+			"",
+			uniqueName
+				? `var uniqueName = ${JSON.stringify(
+						runtimeTemplate.outputOptions.uniqueName
+					)};`
+				: "// data-webpack is not used as build has no uniqueName",
+			withLoading || withHmr
+				? Template.asString([
+						'var loadingAttribute = "data-webpack-loading";',
+						`var loadStylesheet = ${runtimeTemplate.basicFunction(
+							`chunkId, url, done${
+								withFetchPriority ? ", fetchPriority" : ""
+							}${withHmr ? ", hmr" : ""}`,
+							[
+								'var link, needAttach, key = "chunk-" + chunkId;',
+								withHmr ? "if(!hmr) {" : "",
+								'var links = document.getElementsByTagName("link");',
+								"for(var i = 0; i < links.length; i++) {",
+								Template.indent([
+									"var l = links[i];",
+									`if(l.rel == "stylesheet" && (${
+										withHmr
+											? 'l.href.startsWith(url) || l.getAttribute("href").startsWith(url)'
+											: 'l.href == url || l.getAttribute("href") == url'
+									}${
+										uniqueName
+											? ' || l.getAttribute("data-webpack") == uniqueName + ":" + key'
+											: ""
+									})) { link = l; break; }`
+								]),
+								"}",
+								"if(!done) return link;",
+								withHmr ? "}" : "",
+								"if(!link) {",
+								Template.indent([
+									"needAttach = true;",
+									createStylesheet.call(code, /** @type {Chunk} */ (this.chunk))
+								]),
+								"}",
+								`var onLinkComplete = ${runtimeTemplate.basicFunction(
+									"prev, event",
+									Template.asString([
+										"link.onerror = link.onload = null;",
+										"link.removeAttribute(loadingAttribute);",
+										"clearTimeout(timeout);",
+										'if(event && event.type != "load") link.parentNode.removeChild(link)',
+										"done(event);",
+										"if(prev) return prev(event);"
+									])
+								)};`,
+								"if(link.getAttribute(loadingAttribute)) {",
+								Template.indent([
+									`var timeout = setTimeout(onLinkComplete.bind(null, undefined, { type: 'timeout', target: link }), ${loadTimeout});`,
+									"link.onerror = onLinkComplete.bind(null, link.onerror);",
+									"link.onload = onLinkComplete.bind(null, link.onload);"
+								]),
+								"} else onLinkComplete(undefined, { type: 'load', target: link });", // We assume any existing stylesheet is render blocking
+								withHmr && withFetchPriority
+									? 'if (hmr && hmr.getAttribute("fetchpriority")) link.setAttribute("fetchpriority", hmr.getAttribute("fetchpriority"));'
+									: "",
+								withHmr ? "hmr ? document.head.insertBefore(link, hmr) :" : "",
+								"needAttach && document.head.appendChild(link);",
+								"return link;"
+							]
+						)};`
+					])
+				: "",
+			withLoading
+				? Template.asString([
+						`${fn}.css = ${runtimeTemplate.basicFunction(
+							`chunkId, promises${withFetchPriority ? " , fetchPriority" : ""}`,
+							[
+								"// css chunk loading",
+								`var installedChunkData = ${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;`,
+								'if(installedChunkData !== 0) { // 0 means "already installed".',
+								Template.indent([
+									"",
+									'// a Promise means "currently loading".',
+									"if(installedChunkData) {",
+									Template.indent(["promises.push(installedChunkData[2]);"]),
+									"} else {",
+									Template.indent([
+										hasCssMatcher === true
+											? "if(true) { // all chunks have CSS"
+											: `if(${hasCssMatcher("chunkId")}) {`,
+										Template.indent([
+											"// setup Promise in chunk cache",
+											`var promise = new Promise(${runtimeTemplate.expressionFunction(
+												"installedChunkData = installedChunks[chunkId] = [resolve, reject]",
+												"resolve, reject"
+											)});`,
+											"promises.push(installedChunkData[2] = promise);",
+											"",
+											"// start chunk loading",
+											`var url = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkCssFilename}(chunkId);`,
+											"// create error before stack unwound to get useful stacktrace later",
+											"var error = new Error();",
+											`var loadingEnded = ${runtimeTemplate.basicFunction(
+												"event",
+												[
+													`if(${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId)) {`,
+													Template.indent([
+														"installedChunkData = installedChunks[chunkId];",
+														"if(installedChunkData !== 0) installedChunks[chunkId] = undefined;",
+														"if(installedChunkData) {",
+														Template.indent([
+															'if(event.type !== "load") {',
+															Template.indent([
+																"var errorType = event && event.type;",
+																"var realHref = event && event.target && event.target.href;",
+																"error.message = 'Loading css chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realHref + ')';",
+																"error.name = 'ChunkLoadError';",
+																"error.type = errorType;",
+																"error.request = realHref;",
+																"installedChunkData[1](error);"
+															]),
+															"} else {",
+															Template.indent([
+																"installedChunks[chunkId] = 0;",
+																"installedChunkData[0]();"
+															]),
+															"}"
+														]),
+														"}"
+													]),
+													"}"
+												]
+											)};`,
+											isNeutralPlatform
+												? "if (typeof document !== 'undefined') {"
+												: "",
+											Template.indent([
+												`loadStylesheet(chunkId, url, loadingEnded${
+													withFetchPriority ? ", fetchPriority" : ""
+												});`
+											]),
+											isNeutralPlatform
+												? "} else { loadingEnded({ type: 'load' }); }"
+												: ""
+										]),
+										"} else installedChunks[chunkId] = 0;"
+									]),
+									"}"
+								]),
+								"}"
+							]
+						)};`
+					])
+				: "// no chunk loading",
+			"",
+			withPrefetch && hasCssMatcher !== false
+				? `${
+						RuntimeGlobals.prefetchChunkHandlers
+					}.s = ${runtimeTemplate.basicFunction("chunkId", [
+						`if((!${
+							RuntimeGlobals.hasOwnProperty
+						}(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && ${
+							hasCssMatcher === true ? "true" : hasCssMatcher("chunkId")
+						}) {`,
+						Template.indent([
+							"installedChunks[chunkId] = null;",
+							isNeutralPlatform
+								? "if (typeof document === 'undefined') return;"
+								: "",
+							linkPrefetch.call(
+								Template.asString([
+									"var link = document.createElement('link');",
+									crossOriginLoading
+										? `link.crossOrigin = ${JSON.stringify(
+												crossOriginLoading
+											)};`
+										: "",
+									`if (${RuntimeGlobals.scriptNonce}) {`,
+									Template.indent(
+										`link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});`
+									),
+									"}",
+									'link.rel = "prefetch";',
+									'link.as = "style";',
+									`link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkCssFilename}(chunkId);`
+								]),
+								chunk
+							),
+							"document.head.appendChild(link);"
+						]),
+						"}"
+					])};`
+				: "// no prefetching",
+			"",
+			withPreload && hasCssMatcher !== false
+				? `${
+						RuntimeGlobals.preloadChunkHandlers
+					}.s = ${runtimeTemplate.basicFunction("chunkId", [
+						`if((!${
+							RuntimeGlobals.hasOwnProperty
+						}(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && ${
+							hasCssMatcher === true ? "true" : hasCssMatcher("chunkId")
+						}) {`,
+						Template.indent([
+							"installedChunks[chunkId] = null;",
+							isNeutralPlatform
+								? "if (typeof document === 'undefined') return;"
+								: "",
+							linkPreload.call(
+								Template.asString([
+									"var link = document.createElement('link');",
+									"link.charset = 'utf-8';",
+									`if (${RuntimeGlobals.scriptNonce}) {`,
+									Template.indent(
+										`link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});`
+									),
+									"}",
+									'link.rel = "preload";',
+									'link.as = "style";',
+									`link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkCssFilename}(chunkId);`,
+									crossOriginLoading
+										? crossOriginLoading === "use-credentials"
+											? 'link.crossOrigin = "use-credentials";'
+											: Template.asString([
+													"if (link.href.indexOf(window.location.origin + '/') !== 0) {",
+													Template.indent(
+														`link.crossOrigin = ${JSON.stringify(
+															crossOriginLoading
+														)};`
+													),
+													"}"
+												])
+										: ""
+								]),
+								chunk
+							),
+							"document.head.appendChild(link);"
+						]),
+						"}"
+					])};`
+				: "// no preloaded",
+			withHmr
+				? Template.asString([
+						"var oldTags = [];",
+						"var newTags = [];",
+						`var applyHandler = ${runtimeTemplate.basicFunction("options", [
+							`return { dispose: ${runtimeTemplate.basicFunction("", [
+								"while(oldTags.length) {",
+								Template.indent([
+									"var oldTag = oldTags.pop();",
+									"if(oldTag.parentNode) oldTag.parentNode.removeChild(oldTag);"
+								]),
+								"}"
+							])}, apply: ${runtimeTemplate.basicFunction("", [
+								"while(newTags.length) {",
+								Template.indent([
+									"var newTag = newTags.pop();",
+									"newTag.sheet.disabled = false"
+								]),
+								"}"
+							])} };`
+						])}`,
+						`var cssTextKey = ${runtimeTemplate.returningFunction(
+							`Array.from(link.sheet.cssRules, ${runtimeTemplate.returningFunction(
+								"r.cssText",
+								"r"
+							)}).join()`,
+							"link"
+						)};`,
+						`${
+							RuntimeGlobals.hmrDownloadUpdateHandlers
+						}.css = ${runtimeTemplate.basicFunction(
+							"chunkIds, removedChunks, removedModules, promises, applyHandlers, updatedModulesList",
+							[
+								isNeutralPlatform
+									? "if (typeof document === 'undefined') return;"
+									: "",
+								"applyHandlers.push(applyHandler);",
+								`chunkIds.forEach(${runtimeTemplate.basicFunction("chunkId", [
+									`var filename = ${RuntimeGlobals.getChunkCssFilename}(chunkId);`,
+									`var url = ${RuntimeGlobals.publicPath} + filename;`,
+									"var oldTag = loadStylesheet(chunkId, url);",
+									"if(!oldTag) return;",
+									`promises.push(new Promise(${runtimeTemplate.basicFunction(
+										"resolve, reject",
+										[
+											`var link = loadStylesheet(chunkId, url + (url.indexOf("?") < 0 ? "?" : "&") + "hmr=" + Date.now(), ${runtimeTemplate.basicFunction(
+												"event",
+												[
+													'if(event.type !== "load") {',
+													Template.indent([
+														"var errorType = event && event.type;",
+														"var realHref = event && event.target && event.target.href;",
+														"error.message = 'Loading css hot update chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realHref + ')';",
+														"error.name = 'ChunkLoadError';",
+														"error.type = errorType;",
+														"error.request = realHref;",
+														"reject(error);"
+													]),
+													"} else {",
+													Template.indent([
+														"try { if(cssTextKey(oldTag) == cssTextKey(link)) { if(link.parentNode) link.parentNode.removeChild(link); return resolve(); } } catch(e) {}",
+														"link.sheet.disabled = true;",
+														"oldTags.push(oldTag);",
+														"newTags.push(link);",
+														"resolve();"
+													]),
+													"}"
+												]
+											)}, ${withFetchPriority ? "undefined," : ""} oldTag);`
+										]
+									)}));`
+								])});`
+							]
+						)}`
+					])
+				: "// no hmr"
+		]);
+	}
+}
+
+module.exports = CssLoadingRuntimeModule;
Index: imaps-frontend/node_modules/webpack/lib/css/CssModulesPlugin.js
===================================================================
--- imaps-frontend/node_modules/webpack/lib/css/CssModulesPlugin.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
+++ imaps-frontend/node_modules/webpack/lib/css/CssModulesPlugin.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
@@ -0,0 +1,887 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { SyncWaterfallHook, SyncHook } = require("tapable");
+const {
+	ConcatSource,
+	PrefixSource,
+	ReplaceSource,
+	CachedSource,
+	RawSource
+} = require("webpack-sources");
+const Compilation = require("../Compilation");
+const CssModule = require("../CssModule");
+const { tryRunOrWebpackError } = require("../HookWebpackError");
+const HotUpdateChunk = require("../HotUpdateChunk");
+const {
+	CSS_MODULE_TYPE,
+	CSS_MODULE_TYPE_GLOBAL,
+	CSS_MODULE_TYPE_MODULE,
+	CSS_MODULE_TYPE_AUTO
+} = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const SelfModuleFactory = require("../SelfModuleFactory");
+const Template = require("../Template");
+const WebpackError = require("../WebpackError");
+const CssIcssExportDependency = require("../dependencies/CssIcssExportDependency");
+const CssIcssImportDependency = require("../dependencies/CssIcssImportDependency");
+const CssIcssSymbolDependency = require("../dependencies/CssIcssSymbolDependency");
+const CssImportDependency = require("../dependencies/CssImportDependency");
+const CssLocalIdentifierDependency = require("../dependencies/CssLocalIdentifierDependency");
+const CssSelfLocalIdentifierDependency = require("../dependencies/CssSelfLocalIdentifierDependency");
+const CssUrlDependency = require("../dependencies/CssUrlDependency");
+const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
+const JavascriptModulesPlugin = require("../javascript/JavascriptModulesPlugin");
+const { compareModulesByIdentifier } = require("../util/comparators");
+const createSchemaValidation = require("../util/create-schema-validation");
+const createHash = require("../util/createHash");
+const { getUndoPath } = require("../util/identifier");
+const memoize = require("../util/memoize");
+const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
+const CssGenerator = require("./CssGenerator");
+const CssParser = require("./CssParser");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} OutputOptions */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */
+/** @typedef {import("../Compilation").ChunkHashContext} ChunkHashContext */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../CssModule").Inheritance} Inheritance */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Template").RuntimeTemplate} RuntimeTemplate */
+/** @typedef {import("../TemplatedPathPlugin").TemplatePath} TemplatePath */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/createHash").Algorithm} Algorithm */
+/** @typedef {import("../util/memoize")} Memoize */
+
+/**
+ * @typedef {object} RenderContext
+ * @property {Chunk} chunk the chunk
+ * @property {ChunkGraph} chunkGraph the chunk graph
+ * @property {CodeGenerationResults} codeGenerationResults results of code generation
+ * @property {RuntimeTemplate} runtimeTemplate the runtime template
+ * @property {string} uniqueName the unique name
+ * @property {string} undoPath undo path to css file
+ * @property {CssModule[]} modules modules
+ */
+
+/**
+ * @typedef {object} ChunkRenderContext
+ * @property {Chunk} chunk the chunk
+ * @property {ChunkGraph} chunkGraph the chunk graph
+ * @property {CodeGenerationResults} codeGenerationResults results of code generation
+ * @property {RuntimeTemplate} runtimeTemplate the runtime template
+ * @property {string} undoPath undo path to css file
+ */
+
+/**
+ * @typedef {object} CompilationHooks
+ * @property {SyncWaterfallHook<[Source, Module, ChunkRenderContext]>} renderModulePackage
+ * @property {SyncHook<[Chunk, Hash, ChunkHashContext]>} chunkHash
+ */
+
+const getCssLoadingRuntimeModule = memoize(() =>
+	require("./CssLoadingRuntimeModule")
+);
+
+/**
+ * @param {string} name name
+ * @returns {{oneOf: [{$ref: string}], definitions: *}} schema
+ */
+const getSchema = name => {
+	const { definitions } = require("../../schemas/WebpackOptions.json");
+	return {
+		definitions,
+		oneOf: [{ $ref: `#/definitions/${name}` }]
+	};
+};
+
+const generatorValidationOptions = {
+	name: "Css Modules Plugin",
+	baseDataPath: "generator"
+};
+const validateGeneratorOptions = {
+	css: createSchemaValidation(
+		require("../../schemas/plugins/css/CssGeneratorOptions.check.js"),
+		() => getSchema("CssGeneratorOptions"),
+		generatorValidationOptions
+	),
+	"css/auto": createSchemaValidation(
+		require("../../schemas/plugins/css/CssAutoGeneratorOptions.check.js"),
+		() => getSchema("CssAutoGeneratorOptions"),
+		generatorValidationOptions
+	),
+	"css/module": createSchemaValidation(
+		require("../../schemas/plugins/css/CssModuleGeneratorOptions.check.js"),
+		() => getSchema("CssModuleGeneratorOptions"),
+		generatorValidationOptions
+	),
+	"css/global": createSchemaValidation(
+		require("../../schemas/plugins/css/CssGlobalGeneratorOptions.check.js"),
+		() => getSchema("CssGlobalGeneratorOptions"),
+		generatorValidationOptions
+	)
+};
+
+const parserValidationOptions = {
+	name: "Css Modules Plugin",
+	baseDataPath: "parser"
+};
+const validateParserOptions = {
+	css: createSchemaValidation(
+		require("../../schemas/plugins/css/CssParserOptions.check.js"),
+		() => getSchema("CssParserOptions"),
+		parserValidationOptions
+	),
+	"css/auto": createSchemaValidation(
+		require("../../schemas/plugins/css/CssAutoParserOptions.check.js"),
+		() => getSchema("CssAutoParserOptions"),
+		parserValidationOptions
+	),
+	"css/module": createSchemaValidation(
+		require("../../schemas/plugins/css/CssModuleParserOptions.check.js"),
+		() => getSchema("CssModuleParserOptions"),
+		parserValidationOptions
+	),
+	"css/global": createSchemaValidation(
+		require("../../schemas/plugins/css/CssGlobalParserOptions.check.js"),
+		() => getSchema("CssGlobalParserOptions"),
+		parserValidationOptions
+	)
+};
+
+/** @type {WeakMap<Compilation, CompilationHooks>} */
+const compilationHooksMap = new WeakMap();
+
+const PLUGIN_NAME = "CssModulesPlugin";
+
+class CssModulesPlugin {
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @returns {CompilationHooks} the attached hooks
+	 */
+	static getCompilationHooks(compilation) {
+		if (!(compilation instanceof Compilation)) {
+			throw new TypeError(
+				"The 'compilation' argument must be an instance of Compilation"
+			);
+		}
+		let hooks = compilationHooksMap.get(compilation);
+		if (hooks === undefined) {
+			hooks = {
+				renderModulePackage: new SyncWaterfallHook([
+					"source",
+					"module",
+					"renderContext"
+				]),
+				chunkHash: new SyncHook(["chunk", "hash", "context"])
+			};
+			compilationHooksMap.set(compilation, hooks);
+		}
+		return hooks;
+	}
+
+	constructor() {
+		/** @type {WeakMap<Source, { undoPath: string, inheritance: Inheritance, source: CachedSource }>} */
+		this._moduleFactoryCache = new WeakMap();
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				const hooks = CssModulesPlugin.getCompilationHooks(compilation);
+				const selfFactory = new SelfModuleFactory(compilation.moduleGraph);
+				compilation.dependencyFactories.set(
+					CssImportDependency,
+					normalModuleFactory
+				);
+				compilation.dependencyTemplates.set(
+					CssImportDependency,
+					new CssImportDependency.Template()
+				);
+				compilation.dependencyFactories.set(
+					CssUrlDependency,
+					normalModuleFactory
+				);
+				compilation.dependencyTemplates.set(
+					CssUrlDependency,
+					new CssUrlDependency.Template()
+				);
+				compilation.dependencyTemplates.set(
+					CssLocalIdentifierDependency,
+					new CssLocalIdentifierDependency.Template()
+				);
+				compilation.dependencyFactories.set(
+					CssSelfLocalIdentifierDependency,
+					selfFactory
+				);
+				compilation.dependencyTemplates.set(
+					CssSelfLocalIdentifierDependency,
+					new CssSelfLocalIdentifierDependency.Template()
+				);
+				compilation.dependencyFactories.set(
+					CssIcssImportDependency,
+					normalModuleFactory
+				);
+				compilation.dependencyTemplates.set(
+					CssIcssImportDependency,
+					new CssIcssImportDependency.Template()
+				);
+				compilation.dependencyTemplates.set(
+					CssIcssExportDependency,
+					new CssIcssExportDependency.Template()
+				);
+				compilation.dependencyTemplates.set(
+					CssIcssSymbolDependency,
+					new CssIcssSymbolDependency.Template()
+				);
+				compilation.dependencyTemplates.set(
+					StaticExportsDependency,
+					new StaticExportsDependency.Template()
+				);
+				for (const type of [
+					CSS_MODULE_TYPE,
+					CSS_MODULE_TYPE_GLOBAL,
+					CSS_MODULE_TYPE_MODULE,
+					CSS_MODULE_TYPE_AUTO
+				]) {
+					normalModuleFactory.hooks.createParser
+						.for(type)
+						.tap(PLUGIN_NAME, parserOptions => {
+							validateParserOptions[type](parserOptions);
+							const { url, import: importOption, namedExports } = parserOptions;
+
+							switch (type) {
+								case CSS_MODULE_TYPE:
+									return new CssParser({
+										importOption,
+										url,
+										namedExports
+									});
+								case CSS_MODULE_TYPE_GLOBAL:
+									return new CssParser({
+										defaultMode: "global",
+										importOption,
+										url,
+										namedExports
+									});
+								case CSS_MODULE_TYPE_MODULE:
+									return new CssParser({
+										defaultMode: "local",
+										importOption,
+										url,
+										namedExports
+									});
+								case CSS_MODULE_TYPE_AUTO:
+									return new CssParser({
+										defaultMode: "auto",
+										importOption,
+										url,
+										namedExports
+									});
+							}
+						});
+					normalModuleFactory.hooks.createGenerator
+						.for(type)
+						.tap(PLUGIN_NAME, generatorOptions => {
+							validateGeneratorOptions[type](generatorOptions);
+
+							return new CssGenerator(generatorOptions);
+						});
+					normalModuleFactory.hooks.createModuleClass
+						.for(type)
+						.tap(PLUGIN_NAME, (createData, resolveData) => {
+							if (resolveData.dependencies.length > 0) {
+								// When CSS is imported from CSS there is only one dependency
+								const dependency = resolveData.dependencies[0];
+
+								if (dependency instanceof CssImportDependency) {
+									const parent =
+										/** @type {CssModule} */
+										(compilation.moduleGraph.getParentModule(dependency));
+
+									if (parent instanceof CssModule) {
+										/** @type {import("../CssModule").Inheritance | undefined} */
+										let inheritance;
+
+										if (
+											parent.cssLayer !== undefined ||
+											parent.supports ||
+											parent.media
+										) {
+											if (!inheritance) {
+												inheritance = [];
+											}
+
+											inheritance.push([
+												parent.cssLayer,
+												parent.supports,
+												parent.media
+											]);
+										}
+
+										if (parent.inheritance) {
+											if (!inheritance) {
+												inheritance = [];
+											}
+
+											inheritance.push(...parent.inheritance);
+										}
+
+										return new CssModule({
+											...createData,
+											cssLayer: dependency.layer,
+											supports: dependency.supports,
+											media: dependency.media,
+											inheritance
+										});
+									}
+
+									return new CssModule({
+										...createData,
+										cssLayer: dependency.layer,
+										supports: dependency.supports,
+										media: dependency.media
+									});
+								}
+							}
+
+							return new CssModule(createData);
+						});
+				}
+
+				JavascriptModulesPlugin.getCompilationHooks(
+					compilation
+				).renderModuleContent.tap(PLUGIN_NAME, (source, module) => {
+					if (module instanceof CssModule && module.hot) {
+						const exports = module.buildInfo.cssData.exports;
+						const stringifiedExports = JSON.stringify(
+							JSON.stringify(
+								Array.from(exports).reduce((obj, [key, value]) => {
+									obj[key] = value;
+									return obj;
+								}, {})
+							)
+						);
+
+						const hmrCode = Template.asString([
+							"",
+							`var __webpack_css_exports__ = ${stringifiedExports};`,
+							"// only invalidate when locals change",
+							"if (module.hot.data && module.hot.data.__webpack_css_exports__ && module.hot.data.__webpack_css_exports__ != __webpack_css_exports__) {",
+							Template.indent("module.hot.invalidate();"),
+							"} else {",
+							Template.indent("module.hot.accept();"),
+							"}",
+							"module.hot.dispose(function(data) { data.__webpack_css_exports__ = __webpack_css_exports__; });"
+						]);
+
+						return new ConcatSource(source, "\n", new RawSource(hmrCode));
+					}
+				});
+				const orderedCssModulesPerChunk = new WeakMap();
+				compilation.hooks.afterCodeGeneration.tap(PLUGIN_NAME, () => {
+					const { chunkGraph } = compilation;
+					for (const chunk of compilation.chunks) {
+						if (CssModulesPlugin.chunkHasCss(chunk, chunkGraph)) {
+							orderedCssModulesPerChunk.set(
+								chunk,
+								this.getOrderedChunkCssModules(chunk, chunkGraph, compilation)
+							);
+						}
+					}
+				});
+				compilation.hooks.chunkHash.tap(PLUGIN_NAME, (chunk, hash, context) => {
+					hooks.chunkHash.call(chunk, hash, context);
+				});
+				compilation.hooks.contentHash.tap(PLUGIN_NAME, chunk => {
+					const {
+						chunkGraph,
+						codeGenerationResults,
+						moduleGraph,
+						runtimeTemplate,
+						outputOptions: {
+							hashSalt,
+							hashDigest,
+							hashDigestLength,
+							hashFunction
+						}
+					} = compilation;
+					const hash = createHash(/** @type {Algorithm} */ (hashFunction));
+					if (hashSalt) hash.update(hashSalt);
+					hooks.chunkHash.call(chunk, hash, {
+						chunkGraph,
+						codeGenerationResults,
+						moduleGraph,
+						runtimeTemplate
+					});
+					const modules = orderedCssModulesPerChunk.get(chunk);
+					if (modules) {
+						for (const module of modules) {
+							hash.update(chunkGraph.getModuleHash(module, chunk.runtime));
+						}
+					}
+					const digest = /** @type {string} */ (hash.digest(hashDigest));
+					chunk.contentHash.css = nonNumericOnlyHash(
+						digest,
+						/** @type {number} */
+						(hashDigestLength)
+					);
+				});
+				compilation.hooks.renderManifest.tap(PLUGIN_NAME, (result, options) => {
+					const { chunkGraph } = compilation;
+					const { hash, chunk, codeGenerationResults, runtimeTemplate } =
+						options;
+
+					if (chunk instanceof HotUpdateChunk) return result;
+
+					/** @type {CssModule[] | undefined} */
+					const modules = orderedCssModulesPerChunk.get(chunk);
+					if (modules !== undefined) {
+						const { path: filename, info } = compilation.getPathWithInfo(
+							CssModulesPlugin.getChunkFilenameTemplate(
+								chunk,
+								compilation.outputOptions
+							),
+							{
+								hash,
+								runtime: chunk.runtime,
+								chunk,
+								contentHashType: "css"
+							}
+						);
+						const undoPath = getUndoPath(
+							filename,
+							/** @type {string} */
+							(compilation.outputOptions.path),
+							false
+						);
+						result.push({
+							render: () =>
+								this.renderChunk(
+									{
+										chunk,
+										chunkGraph,
+										codeGenerationResults,
+										uniqueName: compilation.outputOptions.uniqueName,
+										undoPath,
+										modules,
+										runtimeTemplate
+									},
+									hooks
+								),
+							filename,
+							info,
+							identifier: `css${chunk.id}`,
+							hash: chunk.contentHash.css
+						});
+					}
+					return result;
+				});
+				const globalChunkLoading = compilation.outputOptions.chunkLoading;
+				/**
+				 * @param {Chunk} chunk the chunk
+				 * @returns {boolean} true, when enabled
+				 */
+				const isEnabledForChunk = chunk => {
+					const options = chunk.getEntryOptions();
+					const chunkLoading =
+						options && options.chunkLoading !== undefined
+							? options.chunkLoading
+							: globalChunkLoading;
+					return chunkLoading === "jsonp" || chunkLoading === "import";
+				};
+				const onceForChunkSet = new WeakSet();
+				/**
+				 * @param {Chunk} chunk chunk to check
+				 * @param {Set<string>} set runtime requirements
+				 */
+				const handler = (chunk, set) => {
+					if (onceForChunkSet.has(chunk)) return;
+					onceForChunkSet.add(chunk);
+					if (!isEnabledForChunk(chunk)) return;
+
+					set.add(RuntimeGlobals.makeNamespaceObject);
+
+					const CssLoadingRuntimeModule = getCssLoadingRuntimeModule();
+					compilation.addRuntimeModule(chunk, new CssLoadingRuntimeModule(set));
+				};
+				compilation.hooks.runtimeRequirementInTree
+					.for(RuntimeGlobals.hasCssModules)
+					.tap(PLUGIN_NAME, handler);
+				compilation.hooks.runtimeRequirementInTree
+					.for(RuntimeGlobals.ensureChunkHandlers)
+					.tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => {
+						if (!isEnabledForChunk(chunk)) return;
+						if (
+							!chunkGraph.hasModuleInGraph(
+								chunk,
+								m =>
+									m.type === CSS_MODULE_TYPE ||
+									m.type === CSS_MODULE_TYPE_GLOBAL ||
+									m.type === CSS_MODULE_TYPE_MODULE ||
+									m.type === CSS_MODULE_TYPE_AUTO
+							)
+						) {
+							return;
+						}
+
+						set.add(RuntimeGlobals.hasOwnProperty);
+						set.add(RuntimeGlobals.publicPath);
+						set.add(RuntimeGlobals.getChunkCssFilename);
+					});
+				compilation.hooks.runtimeRequirementInTree
+					.for(RuntimeGlobals.hmrDownloadUpdateHandlers)
+					.tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => {
+						if (!isEnabledForChunk(chunk)) return;
+						if (
+							!chunkGraph.hasModuleInGraph(
+								chunk,
+								m =>
+									m.type === CSS_MODULE_TYPE ||
+									m.type === CSS_MODULE_TYPE_GLOBAL ||
+									m.type === CSS_MODULE_TYPE_MODULE ||
+									m.type === CSS_MODULE_TYPE_AUTO
+							)
+						) {
+							return;
+						}
+						set.add(RuntimeGlobals.publicPath);
+						set.add(RuntimeGlobals.getChunkCssFilename);
+					});
+			}
+		);
+	}
+
+	/**
+	 * @param {Chunk} chunk chunk
+	 * @param {Iterable<Module>} modules unordered modules
+	 * @param {Compilation} compilation compilation
+	 * @returns {Module[]} ordered modules
+	 */
+	getModulesInOrder(chunk, modules, compilation) {
+		if (!modules) return [];
+
+		/** @type {Module[]} */
+		const modulesList = [...modules];
+
+		// Get ordered list of modules per chunk group
+		// Lists are in reverse order to allow to use Array.pop()
+		const modulesByChunkGroup = Array.from(chunk.groupsIterable, chunkGroup => {
+			const sortedModules = modulesList
+				.map(module => ({
+					module,
+					index: chunkGroup.getModulePostOrderIndex(module)
+				}))
+				.filter(item => item.index !== undefined)
+				.sort(
+					(a, b) =>
+						/** @type {number} */ (b.index) - /** @type {number} */ (a.index)
+				)
+				.map(item => item.module);
+
+			return { list: sortedModules, set: new Set(sortedModules) };
+		});
+
+		if (modulesByChunkGroup.length === 1)
+			return modulesByChunkGroup[0].list.reverse();
+
+		/**
+		 * @param {{ list: Module[] }} a a
+		 * @param {{ list: Module[] }} b b
+		 * @returns {-1 | 0 | 1} result
+		 */
+		const compareModuleLists = ({ list: a }, { list: b }) => {
+			if (a.length === 0) {
+				return b.length === 0 ? 0 : 1;
+			}
+			if (b.length === 0) return -1;
+			return compareModulesByIdentifier(a[a.length - 1], b[b.length - 1]);
+		};
+
+		modulesByChunkGroup.sort(compareModuleLists);
+
+		/** @type {Module[]} */
+		const finalModules = [];
+
+		for (;;) {
+			const failedModules = new Set();
+			const list = modulesByChunkGroup[0].list;
+			if (list.length === 0) {
+				// done, everything empty
+				break;
+			}
+			/** @type {Module} */
+			let selectedModule = list[list.length - 1];
+			let hasFailed;
+			outer: for (;;) {
+				for (const { list, set } of modulesByChunkGroup) {
+					if (list.length === 0) continue;
+					const lastModule = list[list.length - 1];
+					if (lastModule === selectedModule) continue;
+					if (!set.has(selectedModule)) continue;
+					failedModules.add(selectedModule);
+					if (failedModules.has(lastModule)) {
+						// There is a conflict, try other alternatives
+						hasFailed = lastModule;
+						continue;
+					}
+					selectedModule = lastModule;
+					hasFailed = false;
+					continue outer; // restart
+				}
+				break;
+			}
+			if (hasFailed) {
+				// There is a not resolve-able conflict with the selectedModule
+				// TODO print better warning
+				compilation.warnings.push(
+					new WebpackError(
+						`chunk ${chunk.name || chunk.id}\nConflicting order between ${
+							/** @type {Module} */
+							(hasFailed).readableIdentifier(compilation.requestShortener)
+						} and ${selectedModule.readableIdentifier(
+							compilation.requestShortener
+						)}`
+					)
+				);
+				selectedModule = /** @type {Module} */ (hasFailed);
+			}
+			// Insert the selected module into the final modules list
+			finalModules.push(selectedModule);
+			// Remove the selected module from all lists
+			for (const { list, set } of modulesByChunkGroup) {
+				const lastModule = list[list.length - 1];
+				if (lastModule === selectedModule) list.pop();
+				else if (hasFailed && set.has(selectedModule)) {
+					const idx = list.indexOf(selectedModule);
+					if (idx >= 0) list.splice(idx, 1);
+				}
+			}
+			modulesByChunkGroup.sort(compareModuleLists);
+		}
+		return finalModules;
+	}
+
+	/**
+	 * @param {Chunk} chunk chunk
+	 * @param {ChunkGraph} chunkGraph chunk graph
+	 * @param {Compilation} compilation compilation
+	 * @returns {Module[]} ordered css modules
+	 */
+	getOrderedChunkCssModules(chunk, chunkGraph, compilation) {
+		return [
+			...this.getModulesInOrder(
+				chunk,
+				/** @type {Iterable<Module>} */
+				(
+					chunkGraph.getOrderedChunkModulesIterableBySourceType(
+						chunk,
+						"css-import",
+						compareModulesByIdentifier
+					)
+				),
+				compilation
+			),
+			...this.getModulesInOrder(
+				chunk,
+				/** @type {Iterable<Module>} */
+				(
+					chunkGraph.getOrderedChunkModulesIterableBySourceType(
+						chunk,
+						"css",
+						compareModulesByIdentifier
+					)
+				),
+				compilation
+			)
+		];
+	}
+
+	/**
+	 * @param {CssModule}  module css module
+	 * @param {ChunkRenderContext} renderContext options object
+	 * @param {CompilationHooks} hooks hooks
+	 * @returns {Source} css module source
+	 */
+	renderModule(module, renderContext, hooks) {
+		const { codeGenerationResults, chunk, undoPath } = renderContext;
+		const codeGenResult = codeGenerationResults.get(module, chunk.runtime);
+		const moduleSourceContent =
+			/** @type {Source} */
+			(
+				codeGenResult.sources.get("css") ||
+					codeGenResult.sources.get("css-import")
+			);
+		const cacheEntry = this._moduleFactoryCache.get(moduleSourceContent);
+
+		/** @type {Inheritance} */
+		const inheritance = [[module.cssLayer, module.supports, module.media]];
+		if (module.inheritance) {
+			inheritance.push(...module.inheritance);
+		}
+
+		let source;
+		if (
+			cacheEntry &&
+			cacheEntry.undoPath === undoPath &&
+			cacheEntry.inheritance.every(([layer, supports, media], i) => {
+				const item = inheritance[i];
+				if (Array.isArray(item)) {
+					return layer === item[0] && supports === item[1] && media === item[2];
+				}
+				return false;
+			})
+		) {
+			source = cacheEntry.source;
+		} else {
+			const moduleSourceCode =
+				/** @type {string} */
+				(moduleSourceContent.source());
+			const publicPathAutoRegex = new RegExp(
+				CssUrlDependency.PUBLIC_PATH_AUTO,
+				"g"
+			);
+			/** @type {Source} */
+			let moduleSource = new ReplaceSource(moduleSourceContent);
+			let match;
+			while ((match = publicPathAutoRegex.exec(moduleSourceCode))) {
+				/** @type {ReplaceSource} */ (moduleSource).replace(
+					match.index,
+					(match.index += match[0].length - 1),
+					undoPath
+				);
+			}
+
+			for (let i = 0; i < inheritance.length; i++) {
+				const layer = inheritance[i][0];
+				const supports = inheritance[i][1];
+				const media = inheritance[i][2];
+
+				if (media) {
+					moduleSource = new ConcatSource(
+						`@media ${media} {\n`,
+						new PrefixSource("\t", moduleSource),
+						"}\n"
+					);
+				}
+
+				if (supports) {
+					moduleSource = new ConcatSource(
+						`@supports (${supports}) {\n`,
+						new PrefixSource("\t", moduleSource),
+						"}\n"
+					);
+				}
+
+				// Layer can be anonymous
+				if (layer !== undefined && layer !== null) {
+					moduleSource = new ConcatSource(
+						`@layer${layer ? ` ${layer}` : ""} {\n`,
+						new PrefixSource("\t", moduleSource),
+						"}\n"
+					);
+				}
+			}
+
+			if (moduleSource) {
+				moduleSource = new ConcatSource(moduleSource, "\n");
+			}
+
+			source = new CachedSource(moduleSource);
+			this._moduleFactoryCache.set(moduleSourceContent, {
+				inheritance,
+				undoPath,
+				source
+			});
+		}
+
+		return tryRunOrWebpackError(
+			() => hooks.renderModulePackage.call(source, module, renderContext),
+			"CssModulesPlugin.getCompilationHooks().renderModulePackage"
+		);
+	}
+
+	/**
+	 * @param {RenderContext} renderContext the render context
+	 * @param {CompilationHooks} hooks hooks
+	 * @returns {Source} generated source
+	 */
+	renderChunk(
+		{
+			undoPath,
+			chunk,
+			chunkGraph,
+			codeGenerationResults,
+			modules,
+			runtimeTemplate
+		},
+		hooks
+	) {
+		const source = new ConcatSource();
+		for (const module of modules) {
+			try {
+				const moduleSource = this.renderModule(
+					module,
+					{
+						undoPath,
+						chunk,
+						chunkGraph,
+						codeGenerationResults,
+						runtimeTemplate
+					},
+					hooks
+				);
+				source.add(moduleSource);
+			} catch (err) {
+				/** @type {Error} */
+				(err).message += `\nduring rendering of css ${module.identifier()}`;
+				throw err;
+			}
+		}
+		chunk.rendered = true;
+		return source;
+	}
+
+	/**
+	 * @param {Chunk} chunk chunk
+	 * @param {OutputOptions} outputOptions output options
+	 * @returns {TemplatePath} used filename template
+	 */
+	static getChunkFilenameTemplate(chunk, outputOptions) {
+		if (chunk.cssFilenameTemplate) {
+			return chunk.cssFilenameTemplate;
+		} else if (chunk.canBeInitial()) {
+			return /** @type {TemplatePath} */ (outputOptions.cssFilename);
+		}
+		return /** @type {TemplatePath} */ (outputOptions.cssChunkFilename);
+	}
+
+	/**
+	 * @param {Chunk} chunk chunk
+	 * @param {ChunkGraph} chunkGraph chunk graph
+	 * @returns {boolean} true, when the chunk has css
+	 */
+	static chunkHasCss(chunk, chunkGraph) {
+		return (
+			Boolean(chunkGraph.getChunkModulesIterableBySourceType(chunk, "css")) ||
+			Boolean(
+				chunkGraph.getChunkModulesIterableBySourceType(chunk, "css-import")
+			)
+		);
+	}
+}
+
+module.exports = CssModulesPlugin;
Index: imaps-frontend/node_modules/webpack/lib/css/CssParser.js
===================================================================
--- imaps-frontend/node_modules/webpack/lib/css/CssParser.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
+++ imaps-frontend/node_modules/webpack/lib/css/CssParser.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
@@ -0,0 +1,1602 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const vm = require("vm");
+const CommentCompilationWarning = require("../CommentCompilationWarning");
+const ModuleDependencyWarning = require("../ModuleDependencyWarning");
+const { CSS_MODULE_TYPE_AUTO } = require("../ModuleTypeConstants");
+const Parser = require("../Parser");
+const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
+const WebpackError = require("../WebpackError");
+const ConstDependency = require("../dependencies/ConstDependency");
+const CssIcssExportDependency = require("../dependencies/CssIcssExportDependency");
+const CssIcssImportDependency = require("../dependencies/CssIcssImportDependency");
+const CssIcssSymbolDependency = require("../dependencies/CssIcssSymbolDependency");
+const CssImportDependency = require("../dependencies/CssImportDependency");
+const CssLocalIdentifierDependency = require("../dependencies/CssLocalIdentifierDependency");
+const CssSelfLocalIdentifierDependency = require("../dependencies/CssSelfLocalIdentifierDependency");
+const CssUrlDependency = require("../dependencies/CssUrlDependency");
+const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
+const binarySearchBounds = require("../util/binarySearchBounds");
+const { parseResource } = require("../util/identifier");
+const {
+	webpackCommentRegExp,
+	createMagicCommentContext
+} = require("../util/magicComment");
+const walkCssTokens = require("./walkCssTokens");
+
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../Parser").ParserState} ParserState */
+/** @typedef {import("../Parser").PreparsedAst} PreparsedAst */
+/** @typedef {import("./walkCssTokens").CssTokenCallbacks} CssTokenCallbacks */
+
+/** @typedef {[number, number]} Range */
+/** @typedef {{ line: number, column: number }} Position */
+/** @typedef {{ value: string, range: Range, loc: { start: Position, end: Position } }} Comment */
+
+const CC_COLON = ":".charCodeAt(0);
+const CC_SLASH = "/".charCodeAt(0);
+const CC_LEFT_PARENTHESIS = "(".charCodeAt(0);
+const CC_RIGHT_PARENTHESIS = ")".charCodeAt(0);
+const CC_LOWER_F = "f".charCodeAt(0);
+const CC_UPPER_F = "F".charCodeAt(0);
+
+// https://www.w3.org/TR/css-syntax-3/#newline
+// We don't have `preprocessing` stage, so we need specify all of them
+const STRING_MULTILINE = /\\[\n\r\f]/g;
+// https://www.w3.org/TR/css-syntax-3/#whitespace
+const TRIM_WHITE_SPACES = /(^[ \t\n\r\f]*|[ \t\n\r\f]*$)/g;
+const UNESCAPE = /\\([0-9a-fA-F]{1,6}[ \t\n\r\f]?|[\s\S])/g;
+const IMAGE_SET_FUNCTION = /^(-\w+-)?image-set$/i;
+const OPTIONALLY_VENDOR_PREFIXED_KEYFRAMES_AT_RULE = /^@(-\w+-)?keyframes$/;
+const OPTIONALLY_VENDOR_PREFIXED_ANIMATION_PROPERTY =
+	/^(-\w+-)?animation(-name)?$/i;
+const IS_MODULES = /\.module(s)?\.[^.]+$/i;
+const CSS_COMMENT = /\/\*((?!\*\/).*?)\*\//g;
+
+/**
+ * @param {string} str url string
+ * @param {boolean} isString is url wrapped in quotes
+ * @returns {string} normalized url
+ */
+const normalizeUrl = (str, isString) => {
+	// Remove extra spaces and newlines:
+	// `url("im\
+	// g.png")`
+	if (isString) {
+		str = str.replace(STRING_MULTILINE, "");
+	}
+
+	str = str
+		// Remove unnecessary spaces from `url("   img.png	 ")`
+		.replace(TRIM_WHITE_SPACES, "")
+		// Unescape
+		.replace(UNESCAPE, match => {
+			if (match.length > 2) {
+				return String.fromCharCode(Number.parseInt(match.slice(1).trim(), 16));
+			}
+			return match[1];
+		});
+
+	if (/^data:/i.test(str)) {
+		return str;
+	}
+
+	if (str.includes("%")) {
+		// Convert `url('%2E/img.png')` -> `url('./img.png')`
+		try {
+			str = decodeURIComponent(str);
+		} catch (_err) {
+			// Ignore
+		}
+	}
+
+	return str;
+};
+
+// eslint-disable-next-line no-useless-escape
+const regexSingleEscape = /[ -,.\/:-@[\]\^`{-~]/;
+const regexExcessiveSpaces =
+	/(^|\\+)?(\\[A-F0-9]{1,6})\u0020(?![a-fA-F0-9\u0020])/g;
+
+/**
+ * @param {string} str string
+ * @returns {string} escaped identifier
+ */
+const escapeIdentifier = str => {
+	let output = "";
+	let counter = 0;
+
+	while (counter < str.length) {
+		const character = str.charAt(counter++);
+
+		let value;
+
+		if (/[\t\n\f\r\u000B]/.test(character)) {
+			const codePoint = character.charCodeAt(0);
+
+			value = `\\${codePoint.toString(16).toUpperCase()} `;
+		} else if (character === "\\" || regexSingleEscape.test(character)) {
+			value = `\\${character}`;
+		} else {
+			value = character;
+		}
+
+		output += value;
+	}
+
+	const firstChar = str.charAt(0);
+
+	if (/^-[-\d]/.test(output)) {
+		output = `\\-${output.slice(1)}`;
+	} else if (/\d/.test(firstChar)) {
+		output = `\\3${firstChar} ${output.slice(1)}`;
+	}
+
+	// Remove spaces after `\HEX` escapes that are not followed by a hex digit,
+	// since they’re redundant. Note that this is only possible if the escape
+	// sequence isn’t preceded by an odd number of backslashes.
+	output = output.replace(regexExcessiveSpaces, ($0, $1, $2) => {
+		if ($1 && $1.length % 2) {
+			// It’s not safe to remove the space, so don’t.
+			return $0;
+		}
+
+		// Strip the space.
+		return ($1 || "") + $2;
+	});
+
+	return output;
+};
+
+const CONTAINS_ESCAPE = /\\/;
+
+/**
+ * @param {string} str string
+ * @returns {[string, number] | undefined} hex
+ */
+const gobbleHex = str => {
+	const lower = str.toLowerCase();
+	let hex = "";
+	let spaceTerminated = false;
+
+	for (let i = 0; i < 6 && lower[i] !== undefined; i++) {
+		const code = lower.charCodeAt(i);
+		// check to see if we are dealing with a valid hex char [a-f|0-9]
+		const valid = (code >= 97 && code <= 102) || (code >= 48 && code <= 57);
+		// https://drafts.csswg.org/css-syntax/#consume-escaped-code-point
+		spaceTerminated = code === 32;
+		if (!valid) break;
+		hex += lower[i];
+	}
+
+	if (hex.length === 0) return undefined;
+
+	const codePoint = Number.parseInt(hex, 16);
+	const isSurrogate = codePoint >= 0xd800 && codePoint <= 0xdfff;
+
+	// Add special case for
+	// "If this number is zero, or is for a surrogate, or is greater than the maximum allowed code point"
+	// https://drafts.csswg.org/css-syntax/#maximum-allowed-code-point
+	if (isSurrogate || codePoint === 0x0000 || codePoint > 0x10ffff) {
+		return ["\uFFFD", hex.length + (spaceTerminated ? 1 : 0)];
+	}
+
+	return [
+		String.fromCodePoint(codePoint),
+		hex.length + (spaceTerminated ? 1 : 0)
+	];
+};
+
+/**
+ * @param {string} str string
+ * @returns {string} unescaped string
+ */
+const unescapeIdentifier = str => {
+	const needToProcess = CONTAINS_ESCAPE.test(str);
+	if (!needToProcess) return str;
+	let ret = "";
+	for (let i = 0; i < str.length; i++) {
+		if (str[i] === "\\") {
+			const gobbled = gobbleHex(str.slice(i + 1, i + 7));
+			if (gobbled !== undefined) {
+				ret += gobbled[0];
+				i += gobbled[1];
+				continue;
+			}
+			// Retain a pair of \\ if double escaped `\\\\`
+			// https://github.com/postcss/postcss-selector-parser/commit/268c9a7656fb53f543dc620aa5b73a30ec3ff20e
+			if (str[i + 1] === "\\") {
+				ret += "\\";
+				i += 1;
+				continue;
+			}
+			// if \\ is at the end of the string retain it
+			// https://github.com/postcss/postcss-selector-parser/commit/01a6b346e3612ce1ab20219acc26abdc259ccefb
+			if (str.length === i + 1) {
+				ret += str[i];
+			}
+			continue;
+		}
+		ret += str[i];
+	}
+
+	return ret;
+};
+
+class LocConverter {
+	/**
+	 * @param {string} input input
+	 */
+	constructor(input) {
+		this._input = input;
+		this.line = 1;
+		this.column = 0;
+		this.pos = 0;
+	}
+
+	/**
+	 * @param {number} pos position
+	 * @returns {LocConverter} location converter
+	 */
+	get(pos) {
+		if (this.pos !== pos) {
+			if (this.pos < pos) {
+				const str = this._input.slice(this.pos, pos);
+				let i = str.lastIndexOf("\n");
+				if (i === -1) {
+					this.column += str.length;
+				} else {
+					this.column = str.length - i - 1;
+					this.line++;
+					while (i > 0 && (i = str.lastIndexOf("\n", i - 1)) !== -1)
+						this.line++;
+				}
+			} else {
+				let i = this._input.lastIndexOf("\n", this.pos);
+				while (i >= pos) {
+					this.line--;
+					i = i > 0 ? this._input.lastIndexOf("\n", i - 1) : -1;
+				}
+				this.column = pos - i;
+			}
+			this.pos = pos;
+		}
+		return this;
+	}
+}
+
+const EMPTY_COMMENT_OPTIONS = {
+	options: null,
+	errors: null
+};
+
+const CSS_MODE_TOP_LEVEL = 0;
+const CSS_MODE_IN_BLOCK = 1;
+
+const eatUntilSemi = walkCssTokens.eatUntil(";");
+const eatUntilLeftCurly = walkCssTokens.eatUntil("{");
+const eatSemi = walkCssTokens.eatUntil(";");
+
+class CssParser extends Parser {
+	/**
+	 * @param {object} options options
+	 * @param {boolean=} options.importOption need handle `@import`
+	 * @param {boolean=} options.url need handle URLs
+	 * @param {("pure" | "global" | "local" | "auto")=} options.defaultMode default mode
+	 * @param {boolean=} options.namedExports is named exports
+	 */
+	constructor({
+		defaultMode = "pure",
+		importOption = true,
+		url = true,
+		namedExports = true
+	} = {}) {
+		super();
+		this.defaultMode = defaultMode;
+		this.import = importOption;
+		this.url = url;
+		this.namedExports = namedExports;
+		/** @type {Comment[] | undefined} */
+		this.comments = undefined;
+		this.magicCommentContext = createMagicCommentContext();
+	}
+
+	/**
+	 * @param {ParserState} state parser state
+	 * @param {string} message warning message
+	 * @param {LocConverter} locConverter location converter
+	 * @param {number} start start offset
+	 * @param {number} end end offset
+	 */
+	_emitWarning(state, message, locConverter, start, end) {
+		const { line: sl, column: sc } = locConverter.get(start);
+		const { line: el, column: ec } = locConverter.get(end);
+
+		state.current.addWarning(
+			new ModuleDependencyWarning(state.module, new WebpackError(message), {
+				start: { line: sl, column: sc },
+				end: { line: el, column: ec }
+			})
+		);
+	}
+
+	/**
+	 * @param {string | Buffer | PreparsedAst} source the source to parse
+	 * @param {ParserState} state the parser state
+	 * @returns {ParserState} the parser state
+	 */
+	parse(source, state) {
+		if (Buffer.isBuffer(source)) {
+			source = source.toString("utf-8");
+		} else if (typeof source === "object") {
+			throw new Error("webpackAst is unexpected for the CssParser");
+		}
+		if (source[0] === "\uFEFF") {
+			source = source.slice(1);
+		}
+
+		let mode = this.defaultMode;
+
+		const module = state.module;
+
+		if (
+			mode === "auto" &&
+			module.type === CSS_MODULE_TYPE_AUTO &&
+			IS_MODULES.test(
+				parseResource(module.matchResource || module.resource).path
+			)
+		) {
+			mode = "local";
+		}
+
+		const isModules = mode === "global" || mode === "local";
+
+		const locConverter = new LocConverter(source);
+
+		/** @type {number} */
+		let scope = CSS_MODE_TOP_LEVEL;
+		/** @type {boolean} */
+		let allowImportAtRule = true;
+		/** @type [string, number, number][] */
+		const balanced = [];
+		let lastTokenEndForComments = 0;
+
+		/** @type {boolean} */
+		let isNextRulePrelude = isModules;
+		/** @type {number} */
+		let blockNestingLevel = 0;
+		/** @type {"local" | "global" | undefined} */
+		let modeData;
+		/** @type {boolean} */
+		let inAnimationProperty = false;
+		/** @type {[number, number, boolean] | undefined} */
+		let lastIdentifier;
+		/** @type {Set<string>} */
+		const declaredCssVariables = new Set();
+		/** @type {Map<string, { path?: string, value: string }>} */
+		const icssDefinitions = new Map();
+
+		/**
+		 * @param {string} input input
+		 * @param {number} pos position
+		 * @returns {boolean} true, when next is nested syntax
+		 */
+		const isNextNestedSyntax = (input, pos) => {
+			pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
+
+			if (input[pos] === "}") {
+				return false;
+			}
+
+			// According spec only identifier can be used as a property name
+			const isIdentifier = walkCssTokens.isIdentStartCodePoint(
+				input.charCodeAt(pos)
+			);
+
+			return !isIdentifier;
+		};
+		/**
+		 * @returns {boolean} true, when in local scope
+		 */
+		const isLocalMode = () =>
+			modeData === "local" || (mode === "local" && modeData === undefined);
+
+		/**
+		 * @param {string} input input
+		 * @param {number} pos start position
+		 * @param {(input: string, pos: number) => number} eater eater
+		 * @returns {[number,string]} new position and text
+		 */
+		const eatText = (input, pos, eater) => {
+			let text = "";
+			for (;;) {
+				if (input.charCodeAt(pos) === CC_SLASH) {
+					const newPos = walkCssTokens.eatComments(input, pos);
+					if (pos !== newPos) {
+						pos = newPos;
+						if (pos === input.length) break;
+					} else {
+						text += "/";
+						pos++;
+						if (pos === input.length) break;
+					}
+				}
+				const newPos = eater(input, pos);
+				if (pos !== newPos) {
+					text += input.slice(pos, newPos);
+					pos = newPos;
+				} else {
+					break;
+				}
+				if (pos === input.length) break;
+			}
+			return [pos, text.trimEnd()];
+		};
+
+		/**
+		 * @param {0 | 1} type import or export
+		 * @param {string} input input
+		 * @param {number} pos start position
+		 * @returns {number} position after parse
+		 */
+		const parseImportOrExport = (type, input, pos) => {
+			pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
+			let importPath;
+			if (type === 0) {
+				let cc = input.charCodeAt(pos);
+				if (cc !== CC_LEFT_PARENTHESIS) {
+					this._emitWarning(
+						state,
+						`Unexpected '${input[pos]}' at ${pos} during parsing of ':import' (expected '(')`,
+						locConverter,
+						pos,
+						pos
+					);
+					return pos;
+				}
+				pos++;
+				const stringStart = pos;
+				const str = walkCssTokens.eatString(input, pos);
+				if (!str) {
+					this._emitWarning(
+						state,
+						`Unexpected '${input[pos]}' at ${pos} during parsing of ':import' (expected string)`,
+						locConverter,
+						stringStart,
+						pos
+					);
+					return pos;
+				}
+				importPath = input.slice(str[0] + 1, str[1] - 1);
+				pos = str[1];
+				pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
+				cc = input.charCodeAt(pos);
+				if (cc !== CC_RIGHT_PARENTHESIS) {
+					this._emitWarning(
+						state,
+						`Unexpected '${input[pos]}' at ${pos} during parsing of ':import' (expected ')')`,
+						locConverter,
+						pos,
+						pos
+					);
+					return pos;
+				}
+				pos++;
+				pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
+			}
+
+			/**
+			 * @param {string} name name
+			 * @param {string} value value
+			 * @param {number} start start of position
+			 * @param {number} end end of position
+			 */
+			const createDep = (name, value, start, end) => {
+				if (type === 0) {
+					icssDefinitions.set(name, {
+						path: /** @type {string} */ (importPath),
+						value
+					});
+				} else if (type === 1) {
+					const dep = new CssIcssExportDependency(name, value);
+					const { line: sl, column: sc } = locConverter.get(start);
+					const { line: el, column: ec } = locConverter.get(end);
+					dep.setLoc(sl, sc, el, ec);
+					module.addDependency(dep);
+				}
+			};
+
+			let needTerminate = false;
+			let balanced = 0;
+			/** @type {undefined | 0 | 1 | 2} */
+			let scope;
+
+			/** @type {[number, number] | undefined} */
+			let name;
+			/** @type {number | undefined} */
+			let value;
+
+			/** @type {CssTokenCallbacks} */
+			const callbacks = {
+				leftCurlyBracket: (_input, _start, end) => {
+					balanced++;
+
+					if (scope === undefined) {
+						scope = 0;
+					}
+
+					return end;
+				},
+				rightCurlyBracket: (_input, _start, end) => {
+					balanced--;
+
+					if (scope === 2) {
+						createDep(
+							input.slice(name[0], name[1]),
+							input.slice(value, end - 1).trim(),
+							name[1],
+							end - 1
+						);
+						scope = 0;
+					}
+
+					if (balanced === 0 && scope === 0) {
+						needTerminate = true;
+					}
+
+					return end;
+				},
+				identifier: (_input, start, end) => {
+					if (scope === 0) {
+						name = [start, end];
+						scope = 1;
+					}
+
+					return end;
+				},
+				colon: (_input, _start, end) => {
+					if (scope === 1) {
+						scope = 2;
+						value = walkCssTokens.eatWhitespace(input, end);
+						return value;
+					}
+
+					return end;
+				},
+				semicolon: (input, _start, end) => {
+					if (scope === 2) {
+						createDep(
+							input.slice(name[0], name[1]),
+							input.slice(value, end - 1),
+							name[1],
+							end - 1
+						);
+						scope = 0;
+					}
+
+					return end;
+				},
+				needTerminate: () => needTerminate
+			};
+
+			pos = walkCssTokens(input, pos, callbacks);
+			pos = walkCssTokens.eatWhiteLine(input, pos);
+
+			return pos;
+		};
+		const eatPropertyName = walkCssTokens.eatUntil(":{};");
+		/**
+		 * @param {string} input input
+		 * @param {number} pos name start position
+		 * @param {number} end name end position
+		 * @returns {number} position after handling
+		 */
+		const processLocalDeclaration = (input, pos, end) => {
+			modeData = undefined;
+			pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
+			const propertyNameStart = pos;
+			const [propertyNameEnd, propertyName] = eatText(
+				input,
+				pos,
+				eatPropertyName
+			);
+			if (input.charCodeAt(propertyNameEnd) !== CC_COLON) return end;
+			pos = propertyNameEnd + 1;
+			if (propertyName.startsWith("--") && propertyName.length >= 3) {
+				// CSS Variable
+				const { line: sl, column: sc } = locConverter.get(propertyNameStart);
+				const { line: el, column: ec } = locConverter.get(propertyNameEnd);
+				const name = unescapeIdentifier(propertyName.slice(2));
+				const dep = new CssLocalIdentifierDependency(
+					name,
+					[propertyNameStart, propertyNameEnd],
+					"--"
+				);
+				dep.setLoc(sl, sc, el, ec);
+				module.addDependency(dep);
+				declaredCssVariables.add(name);
+			} else if (
+				OPTIONALLY_VENDOR_PREFIXED_ANIMATION_PROPERTY.test(propertyName)
+			) {
+				inAnimationProperty = true;
+			}
+			return pos;
+		};
+		/**
+		 * @param {string} input input
+		 */
+		const processDeclarationValueDone = input => {
+			if (inAnimationProperty && lastIdentifier) {
+				const { line: sl, column: sc } = locConverter.get(lastIdentifier[0]);
+				const { line: el, column: ec } = locConverter.get(lastIdentifier[1]);
+				const name = unescapeIdentifier(
+					lastIdentifier[2]
+						? input.slice(lastIdentifier[0], lastIdentifier[1])
+						: input.slice(lastIdentifier[0] + 1, lastIdentifier[1] - 1)
+				);
+				const dep = new CssSelfLocalIdentifierDependency(name, [
+					lastIdentifier[0],
+					lastIdentifier[1]
+				]);
+				dep.setLoc(sl, sc, el, ec);
+				module.addDependency(dep);
+				lastIdentifier = undefined;
+			}
+		};
+
+		/**
+		 * @param {string} input input
+		 * @param {number} start start
+		 * @param {number} end end
+		 * @returns {number} end
+		 */
+		const comment = (input, start, end) => {
+			if (!this.comments) this.comments = [];
+			const { line: sl, column: sc } = locConverter.get(start);
+			const { line: el, column: ec } = locConverter.get(end);
+
+			/** @type {Comment} */
+			const comment = {
+				value: input.slice(start + 2, end - 2),
+				range: [start, end],
+				loc: {
+					start: { line: sl, column: sc },
+					end: { line: el, column: ec }
+				}
+			};
+			this.comments.push(comment);
+			return end;
+		};
+
+		walkCssTokens(source, 0, {
+			comment,
+			leftCurlyBracket: (input, start, end) => {
+				switch (scope) {
+					case CSS_MODE_TOP_LEVEL: {
+						allowImportAtRule = false;
+						scope = CSS_MODE_IN_BLOCK;
+
+						if (isModules) {
+							blockNestingLevel = 1;
+							isNextRulePrelude = isNextNestedSyntax(input, end);
+						}
+
+						break;
+					}
+					case CSS_MODE_IN_BLOCK: {
+						if (isModules) {
+							blockNestingLevel++;
+							isNextRulePrelude = isNextNestedSyntax(input, end);
+						}
+						break;
+					}
+				}
+				return end;
+			},
+			rightCurlyBracket: (input, start, end) => {
+				switch (scope) {
+					case CSS_MODE_IN_BLOCK: {
+						if (--blockNestingLevel === 0) {
+							scope = CSS_MODE_TOP_LEVEL;
+
+							if (isModules) {
+								isNextRulePrelude = true;
+								modeData = undefined;
+							}
+						} else if (isModules) {
+							if (isLocalMode()) {
+								processDeclarationValueDone(input);
+								inAnimationProperty = false;
+							}
+
+							isNextRulePrelude = isNextNestedSyntax(input, end);
+						}
+						break;
+					}
+				}
+				return end;
+			},
+			url: (input, start, end, contentStart, contentEnd) => {
+				if (!this.url) {
+					return end;
+				}
+
+				const { options, errors: commentErrors } = this.parseCommentOptions([
+					lastTokenEndForComments,
+					end
+				]);
+				if (commentErrors) {
+					for (const e of commentErrors) {
+						const { comment } = e;
+						state.module.addWarning(
+							new CommentCompilationWarning(
+								`Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
+								comment.loc
+							)
+						);
+					}
+				}
+				if (options && options.webpackIgnore !== undefined) {
+					if (typeof options.webpackIgnore !== "boolean") {
+						const { line: sl, column: sc } = locConverter.get(
+							lastTokenEndForComments
+						);
+						const { line: el, column: ec } = locConverter.get(end);
+
+						state.module.addWarning(
+							new UnsupportedFeatureWarning(
+								`\`webpackIgnore\` expected a boolean, but received: ${options.webpackIgnore}.`,
+								{
+									start: { line: sl, column: sc },
+									end: { line: el, column: ec }
+								}
+							)
+						);
+					} else if (options.webpackIgnore) {
+						return end;
+					}
+				}
+				const value = normalizeUrl(
+					input.slice(contentStart, contentEnd),
+					false
+				);
+				// Ignore `url()`, `url('')` and `url("")`, they are valid by spec
+				if (value.length === 0) return end;
+				const dep = new CssUrlDependency(value, [start, end], "url");
+				const { line: sl, column: sc } = locConverter.get(start);
+				const { line: el, column: ec } = locConverter.get(end);
+				dep.setLoc(sl, sc, el, ec);
+				module.addDependency(dep);
+				module.addCodeGenerationDependency(dep);
+				return end;
+			},
+			string: (_input, start, end) => {
+				switch (scope) {
+					case CSS_MODE_IN_BLOCK: {
+						if (inAnimationProperty && balanced.length === 0) {
+							lastIdentifier = [start, end, false];
+						}
+					}
+				}
+				return end;
+			},
+			atKeyword: (input, start, end) => {
+				const name = input.slice(start, end).toLowerCase();
+
+				switch (name) {
+					case "@namespace": {
+						this._emitWarning(
+							state,
+							"'@namespace' is not supported in bundled CSS",
+							locConverter,
+							start,
+							end
+						);
+
+						return eatUntilSemi(input, start);
+					}
+					case "@import": {
+						if (!this.import) {
+							return eatSemi(input, end);
+						}
+
+						if (!allowImportAtRule) {
+							this._emitWarning(
+								state,
+								"Any '@import' rules must precede all other rules",
+								locConverter,
+								start,
+								end
+							);
+							return end;
+						}
+
+						const tokens = walkCssTokens.eatImportTokens(input, end, {
+							comment
+						});
+						if (!tokens[3]) return end;
+						const semi = tokens[3][1];
+						if (!tokens[0]) {
+							this._emitWarning(
+								state,
+								`Expected URL in '${input.slice(start, semi)}'`,
+								locConverter,
+								start,
+								semi
+							);
+							return end;
+						}
+
+						const urlToken = tokens[0];
+						const url = normalizeUrl(
+							input.slice(urlToken[2], urlToken[3]),
+							true
+						);
+						const newline = walkCssTokens.eatWhiteLine(input, semi);
+						const { options, errors: commentErrors } = this.parseCommentOptions(
+							[end, urlToken[1]]
+						);
+						if (commentErrors) {
+							for (const e of commentErrors) {
+								const { comment } = e;
+								state.module.addWarning(
+									new CommentCompilationWarning(
+										`Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
+										comment.loc
+									)
+								);
+							}
+						}
+						if (options && options.webpackIgnore !== undefined) {
+							if (typeof options.webpackIgnore !== "boolean") {
+								const { line: sl, column: sc } = locConverter.get(start);
+								const { line: el, column: ec } = locConverter.get(newline);
+
+								state.module.addWarning(
+									new UnsupportedFeatureWarning(
+										`\`webpackIgnore\` expected a boolean, but received: ${options.webpackIgnore}.`,
+										{
+											start: { line: sl, column: sc },
+											end: { line: el, column: ec }
+										}
+									)
+								);
+							} else if (options.webpackIgnore) {
+								return newline;
+							}
+						}
+						if (url.length === 0) {
+							const { line: sl, column: sc } = locConverter.get(start);
+							const { line: el, column: ec } = locConverter.get(newline);
+							const dep = new ConstDependency("", [start, newline]);
+							module.addPresentationalDependency(dep);
+							dep.setLoc(sl, sc, el, ec);
+
+							return newline;
+						}
+
+						let layer;
+
+						if (tokens[1]) {
+							layer = input.slice(tokens[1][0] + 6, tokens[1][1] - 1).trim();
+						}
+
+						let supports;
+
+						if (tokens[2]) {
+							supports = input.slice(tokens[2][0] + 9, tokens[2][1] - 1).trim();
+						}
+
+						const last = tokens[2] || tokens[1] || tokens[0];
+						const mediaStart = walkCssTokens.eatWhitespaceAndComments(
+							input,
+							last[1]
+						);
+
+						let media;
+
+						if (mediaStart !== semi - 1) {
+							media = input.slice(mediaStart, semi - 1).trim();
+						}
+
+						const { line: sl, column: sc } = locConverter.get(start);
+						const { line: el, column: ec } = locConverter.get(newline);
+						const dep = new CssImportDependency(
+							url,
+							[start, newline],
+							layer,
+							supports && supports.length > 0 ? supports : undefined,
+							media && media.length > 0 ? media : undefined
+						);
+						dep.setLoc(sl, sc, el, ec);
+						module.addDependency(dep);
+
+						return newline;
+					}
+					default: {
+						if (isModules) {
+							if (name === "@value") {
+								const semi = eatUntilSemi(input, end);
+								const atRuleEnd = semi + 1;
+								const params = input.slice(end, semi);
+								let [alias, from] = params.split(/\s*from\s*/);
+
+								if (from) {
+									const aliases = alias
+										.replace(CSS_COMMENT, " ")
+										.trim()
+										.replace(/^\(|\)$/g, "")
+										.split(/\s*,\s*/);
+
+									from = from.replace(CSS_COMMENT, "").trim();
+
+									const isExplicitImport = from[0] === "'" || from[0] === '"';
+
+									if (isExplicitImport) {
+										from = from.slice(1, -1);
+									}
+
+									for (const alias of aliases) {
+										const [name, aliasName] = alias.split(/\s*as\s*/);
+
+										icssDefinitions.set(aliasName || name, {
+											value: name,
+											path: from
+										});
+									}
+								} else {
+									const ident = walkCssTokens.eatIdentSequence(alias, 0);
+
+									if (!ident) {
+										this._emitWarning(
+											state,
+											`Broken '@value' at-rule: ${input.slice(
+												start,
+												atRuleEnd
+											)}'`,
+											locConverter,
+											start,
+											atRuleEnd
+										);
+
+										const dep = new ConstDependency("", [start, atRuleEnd]);
+										module.addPresentationalDependency(dep);
+										return atRuleEnd;
+									}
+
+									const pos = walkCssTokens.eatWhitespaceAndComments(
+										alias,
+										ident[1]
+									);
+
+									const name = alias.slice(ident[0], ident[1]);
+									let value =
+										alias.charCodeAt(pos) === CC_COLON
+											? alias.slice(pos + 1)
+											: alias.slice(ident[1]);
+
+									if (value && !/^\s+$/.test(value)) {
+										value = value.trim();
+									}
+
+									if (icssDefinitions.has(value)) {
+										const def = icssDefinitions.get(value);
+
+										value = def.value;
+									}
+
+									icssDefinitions.set(name, { value });
+
+									const dep = new CssIcssExportDependency(name, value);
+									const { line: sl, column: sc } = locConverter.get(start);
+									const { line: el, column: ec } = locConverter.get(end);
+									dep.setLoc(sl, sc, el, ec);
+									module.addDependency(dep);
+								}
+
+								const dep = new ConstDependency("", [start, atRuleEnd]);
+								module.addPresentationalDependency(dep);
+								return atRuleEnd;
+							} else if (
+								OPTIONALLY_VENDOR_PREFIXED_KEYFRAMES_AT_RULE.test(name) &&
+								isLocalMode()
+							) {
+								const ident = walkCssTokens.eatIdentSequenceOrString(
+									input,
+									end
+								);
+								if (!ident) return end;
+								const name = unescapeIdentifier(
+									ident[2] === true
+										? input.slice(ident[0], ident[1])
+										: input.slice(ident[0] + 1, ident[1] - 1)
+								);
+								const { line: sl, column: sc } = locConverter.get(ident[0]);
+								const { line: el, column: ec } = locConverter.get(ident[1]);
+								const dep = new CssLocalIdentifierDependency(name, [
+									ident[0],
+									ident[1]
+								]);
+								dep.setLoc(sl, sc, el, ec);
+								module.addDependency(dep);
+								return ident[1];
+							} else if (name === "@property" && isLocalMode()) {
+								const ident = walkCssTokens.eatIdentSequence(input, end);
+								if (!ident) return end;
+								let name = input.slice(ident[0], ident[1]);
+								if (!name.startsWith("--") || name.length < 3) return end;
+								name = unescapeIdentifier(name.slice(2));
+								declaredCssVariables.add(name);
+								const { line: sl, column: sc } = locConverter.get(ident[0]);
+								const { line: el, column: ec } = locConverter.get(ident[1]);
+								const dep = new CssLocalIdentifierDependency(
+									name,
+									[ident[0], ident[1]],
+									"--"
+								);
+								dep.setLoc(sl, sc, el, ec);
+								module.addDependency(dep);
+								return ident[1];
+							} else if (name === "@scope") {
+								isNextRulePrelude = true;
+								return end;
+							}
+
+							isNextRulePrelude = false;
+						}
+					}
+				}
+
+				return end;
+			},
+			semicolon: (input, start, end) => {
+				if (isModules && scope === CSS_MODE_IN_BLOCK) {
+					if (isLocalMode()) {
+						processDeclarationValueDone(input);
+						inAnimationProperty = false;
+					}
+
+					isNextRulePrelude = isNextNestedSyntax(input, end);
+				}
+				return end;
+			},
+			identifier: (input, start, end) => {
+				if (isModules) {
+					if (icssDefinitions.has(input.slice(start, end))) {
+						const name = input.slice(start, end);
+						let { path, value } = icssDefinitions.get(name);
+
+						if (path) {
+							if (icssDefinitions.has(path)) {
+								const definition = icssDefinitions.get(path);
+
+								path = definition.value.slice(1, -1);
+							}
+
+							const dep = new CssIcssImportDependency(path, value, [
+								start,
+								end - 1
+							]);
+							const { line: sl, column: sc } = locConverter.get(start);
+							const { line: el, column: ec } = locConverter.get(end - 1);
+							dep.setLoc(sl, sc, el, ec);
+							module.addDependency(dep);
+						} else {
+							const { line: sl, column: sc } = locConverter.get(start);
+							const { line: el, column: ec } = locConverter.get(end);
+							const dep = new CssIcssSymbolDependency(name, value, [
+								start,
+								end
+							]);
+							dep.setLoc(sl, sc, el, ec);
+							module.addDependency(dep);
+						}
+
+						return end;
+					}
+
+					switch (scope) {
+						case CSS_MODE_IN_BLOCK: {
+							if (isLocalMode()) {
+								// Handle only top level values and not inside functions
+								if (inAnimationProperty && balanced.length === 0) {
+									lastIdentifier = [start, end, true];
+								} else {
+									return processLocalDeclaration(input, start, end);
+								}
+							}
+							break;
+						}
+					}
+				}
+
+				return end;
+			},
+			delim: (input, start, end) => {
+				if (isNextRulePrelude && isLocalMode()) {
+					const ident = walkCssTokens.skipCommentsAndEatIdentSequence(
+						input,
+						end
+					);
+					if (!ident) return end;
+					const name = unescapeIdentifier(input.slice(ident[0], ident[1]));
+					const dep = new CssLocalIdentifierDependency(name, [
+						ident[0],
+						ident[1]
+					]);
+					const { line: sl, column: sc } = locConverter.get(ident[0]);
+					const { line: el, column: ec } = locConverter.get(ident[1]);
+					dep.setLoc(sl, sc, el, ec);
+					module.addDependency(dep);
+					return ident[1];
+				}
+
+				return end;
+			},
+			hash: (input, start, end, isID) => {
+				if (isNextRulePrelude && isLocalMode() && isID) {
+					const valueStart = start + 1;
+					const name = unescapeIdentifier(input.slice(valueStart, end));
+					const dep = new CssLocalIdentifierDependency(name, [valueStart, end]);
+					const { line: sl, column: sc } = locConverter.get(start);
+					const { line: el, column: ec } = locConverter.get(end);
+					dep.setLoc(sl, sc, el, ec);
+					module.addDependency(dep);
+				}
+
+				return end;
+			},
+			colon: (input, start, end) => {
+				if (isModules) {
+					const ident = walkCssTokens.skipCommentsAndEatIdentSequence(
+						input,
+						end
+					);
+					if (!ident) return end;
+					const name = input.slice(ident[0], ident[1]).toLowerCase();
+
+					switch (scope) {
+						case CSS_MODE_TOP_LEVEL: {
+							if (name === "import") {
+								const pos = parseImportOrExport(0, input, ident[1]);
+								const dep = new ConstDependency("", [start, pos]);
+								module.addPresentationalDependency(dep);
+								return pos;
+							} else if (name === "export") {
+								const pos = parseImportOrExport(1, input, ident[1]);
+								const dep = new ConstDependency("", [start, pos]);
+								module.addPresentationalDependency(dep);
+								return pos;
+							}
+						}
+						// falls through
+						default: {
+							if (isNextRulePrelude) {
+								const isFn = input.charCodeAt(ident[1]) === CC_LEFT_PARENTHESIS;
+
+								if (isFn && name === "local") {
+									const end = ident[1] + 1;
+									modeData = "local";
+									const dep = new ConstDependency("", [start, end]);
+									module.addPresentationalDependency(dep);
+									balanced.push([":local", start, end]);
+									return end;
+								} else if (name === "local") {
+									modeData = "local";
+									// Eat extra whitespace
+									end = walkCssTokens.eatWhitespace(input, ident[1]);
+
+									if (ident[1] === end) {
+										this._emitWarning(
+											state,
+											`Missing whitespace after ':local' in '${input.slice(
+												start,
+												eatUntilLeftCurly(input, end) + 1
+											)}'`,
+											locConverter,
+											start,
+											end
+										);
+									}
+
+									const dep = new ConstDependency("", [start, end]);
+									module.addPresentationalDependency(dep);
+									return end;
+								} else if (isFn && name === "global") {
+									const end = ident[1] + 1;
+									modeData = "global";
+									const dep = new ConstDependency("", [start, end]);
+									module.addPresentationalDependency(dep);
+									balanced.push([":global", start, end]);
+									return end;
+								} else if (name === "global") {
+									modeData = "global";
+									// Eat extra whitespace
+									end = walkCssTokens.eatWhitespace(input, ident[1]);
+
+									if (ident[1] === end) {
+										this._emitWarning(
+											state,
+											`Missing whitespace after ':global' in '${input.slice(
+												start,
+												eatUntilLeftCurly(input, end) + 1
+											)}'`,
+											locConverter,
+											start,
+											end
+										);
+									}
+
+									const dep = new ConstDependency("", [start, end]);
+									module.addPresentationalDependency(dep);
+									return end;
+								}
+							}
+						}
+					}
+				}
+
+				lastTokenEndForComments = end;
+
+				return end;
+			},
+			function: (input, start, end) => {
+				const name = input
+					.slice(start, end - 1)
+					.replace(/\\/g, "")
+					.toLowerCase();
+
+				balanced.push([name, start, end]);
+
+				switch (name) {
+					case "src":
+					case "url": {
+						if (!this.url) {
+							return end;
+						}
+
+						const string = walkCssTokens.eatString(input, end);
+						if (!string) return end;
+						const { options, errors: commentErrors } = this.parseCommentOptions(
+							[lastTokenEndForComments, end]
+						);
+						if (commentErrors) {
+							for (const e of commentErrors) {
+								const { comment } = e;
+								state.module.addWarning(
+									new CommentCompilationWarning(
+										`Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
+										comment.loc
+									)
+								);
+							}
+						}
+						if (options && options.webpackIgnore !== undefined) {
+							if (typeof options.webpackIgnore !== "boolean") {
+								const { line: sl, column: sc } = locConverter.get(string[0]);
+								const { line: el, column: ec } = locConverter.get(string[1]);
+
+								state.module.addWarning(
+									new UnsupportedFeatureWarning(
+										`\`webpackIgnore\` expected a boolean, but received: ${options.webpackIgnore}.`,
+										{
+											start: { line: sl, column: sc },
+											end: { line: el, column: ec }
+										}
+									)
+								);
+							} else if (options.webpackIgnore) {
+								return end;
+							}
+						}
+						const value = normalizeUrl(
+							input.slice(string[0] + 1, string[1] - 1),
+							true
+						);
+						// Ignore `url()`, `url('')` and `url("")`, they are valid by spec
+						if (value.length === 0) return end;
+						const isUrl = name === "url" || name === "src";
+						const dep = new CssUrlDependency(
+							value,
+							[string[0], string[1]],
+							isUrl ? "string" : "url"
+						);
+						const { line: sl, column: sc } = locConverter.get(string[0]);
+						const { line: el, column: ec } = locConverter.get(string[1]);
+						dep.setLoc(sl, sc, el, ec);
+						module.addDependency(dep);
+						module.addCodeGenerationDependency(dep);
+						return string[1];
+					}
+					default: {
+						if (this.url && IMAGE_SET_FUNCTION.test(name)) {
+							lastTokenEndForComments = end;
+							const values = walkCssTokens.eatImageSetStrings(input, end, {
+								comment
+							});
+							if (values.length === 0) return end;
+							for (const [index, string] of values.entries()) {
+								const value = normalizeUrl(
+									input.slice(string[0] + 1, string[1] - 1),
+									true
+								);
+								if (value.length === 0) return end;
+								const { options, errors: commentErrors } =
+									this.parseCommentOptions([
+										index === 0 ? start : values[index - 1][1],
+										string[1]
+									]);
+								if (commentErrors) {
+									for (const e of commentErrors) {
+										const { comment } = e;
+										state.module.addWarning(
+											new CommentCompilationWarning(
+												`Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
+												comment.loc
+											)
+										);
+									}
+								}
+								if (options && options.webpackIgnore !== undefined) {
+									if (typeof options.webpackIgnore !== "boolean") {
+										const { line: sl, column: sc } = locConverter.get(
+											string[0]
+										);
+										const { line: el, column: ec } = locConverter.get(
+											string[1]
+										);
+
+										state.module.addWarning(
+											new UnsupportedFeatureWarning(
+												`\`webpackIgnore\` expected a boolean, but received: ${options.webpackIgnore}.`,
+												{
+													start: { line: sl, column: sc },
+													end: { line: el, column: ec }
+												}
+											)
+										);
+									} else if (options.webpackIgnore) {
+										continue;
+									}
+								}
+								const dep = new CssUrlDependency(
+									value,
+									[string[0], string[1]],
+									"url"
+								);
+								const { line: sl, column: sc } = locConverter.get(string[0]);
+								const { line: el, column: ec } = locConverter.get(string[1]);
+								dep.setLoc(sl, sc, el, ec);
+								module.addDependency(dep);
+								module.addCodeGenerationDependency(dep);
+							}
+							// Can contain `url()` inside, so let's return end to allow parse them
+							return end;
+						} else if (isLocalMode()) {
+							// Don't rename animation name when we have `var()` function
+							if (inAnimationProperty && balanced.length === 1) {
+								lastIdentifier = undefined;
+							}
+
+							if (name === "var") {
+								const customIdent = walkCssTokens.eatIdentSequence(input, end);
+								if (!customIdent) return end;
+								let name = input.slice(customIdent[0], customIdent[1]);
+								// A custom property is any property whose name starts with two dashes (U+002D HYPHEN-MINUS), like --foo.
+								// The <custom-property-name> production corresponds to this:
+								// it’s defined as any <dashed-ident> (a valid identifier that starts with two dashes),
+								// except -- itself, which is reserved for future use by CSS.
+								if (!name.startsWith("--") || name.length < 3) return end;
+								name = unescapeIdentifier(
+									input.slice(customIdent[0] + 2, customIdent[1])
+								);
+								const afterCustomIdent = walkCssTokens.eatWhitespaceAndComments(
+									input,
+									customIdent[1]
+								);
+								if (
+									input.charCodeAt(afterCustomIdent) === CC_LOWER_F ||
+									input.charCodeAt(afterCustomIdent) === CC_UPPER_F
+								) {
+									const fromWord = walkCssTokens.eatIdentSequence(
+										input,
+										afterCustomIdent
+									);
+									if (
+										!fromWord ||
+										input.slice(fromWord[0], fromWord[1]).toLowerCase() !==
+											"from"
+									) {
+										return end;
+									}
+									const from = walkCssTokens.eatIdentSequenceOrString(
+										input,
+										walkCssTokens.eatWhitespaceAndComments(input, fromWord[1])
+									);
+									if (!from) {
+										return end;
+									}
+									const path = input.slice(from[0], from[1]);
+									if (from[2] === true && path === "global") {
+										const dep = new ConstDependency("", [
+											customIdent[1],
+											from[1]
+										]);
+										module.addPresentationalDependency(dep);
+										return end;
+									} else if (from[2] === false) {
+										const dep = new CssIcssImportDependency(
+											path.slice(1, -1),
+											name,
+											[customIdent[0], from[1] - 1]
+										);
+										const { line: sl, column: sc } = locConverter.get(
+											customIdent[0]
+										);
+										const { line: el, column: ec } = locConverter.get(
+											from[1] - 1
+										);
+										dep.setLoc(sl, sc, el, ec);
+										module.addDependency(dep);
+									}
+								} else {
+									const { line: sl, column: sc } = locConverter.get(
+										customIdent[0]
+									);
+									const { line: el, column: ec } = locConverter.get(
+										customIdent[1]
+									);
+									const dep = new CssSelfLocalIdentifierDependency(
+										name,
+										[customIdent[0], customIdent[1]],
+										"--",
+										declaredCssVariables
+									);
+									dep.setLoc(sl, sc, el, ec);
+									module.addDependency(dep);
+									return end;
+								}
+							}
+						}
+					}
+				}
+
+				return end;
+			},
+			leftParenthesis: (input, start, end) => {
+				balanced.push(["(", start, end]);
+
+				return end;
+			},
+			rightParenthesis: (input, start, end) => {
+				const popped = balanced.pop();
+
+				if (
+					isModules &&
+					popped &&
+					(popped[0] === ":local" || popped[0] === ":global")
+				) {
+					modeData = balanced[balanced.length - 1]
+						? /** @type {"local" | "global"} */
+							(balanced[balanced.length - 1][0])
+						: undefined;
+					const dep = new ConstDependency("", [start, end]);
+					module.addPresentationalDependency(dep);
+				}
+
+				return end;
+			},
+			comma: (input, start, end) => {
+				if (isModules) {
+					// Reset stack for `:global .class :local .class-other` selector after
+					modeData = undefined;
+
+					if (scope === CSS_MODE_IN_BLOCK && isLocalMode()) {
+						processDeclarationValueDone(input);
+					}
+				}
+
+				lastTokenEndForComments = start;
+
+				return end;
+			}
+		});
+
+		/** @type {BuildInfo} */
+		(module.buildInfo).strict = true;
+		/** @type {BuildMeta} */
+		(module.buildMeta).exportsType = this.namedExports
+			? "namespace"
+			: "default";
+
+		if (!this.namedExports) {
+			/** @type {BuildMeta} */
+			(module.buildMeta).defaultObject = "redirect";
+		}
+
+		module.addDependency(new StaticExportsDependency([], true));
+		return state;
+	}
+
+	/**
+	 * @param {Range} range range
+	 * @returns {Comment[]} comments in the range
+	 */
+	getComments(range) {
+		if (!this.comments) return [];
+		const [rangeStart, rangeEnd] = range;
+		/**
+		 * @param {Comment} comment comment
+		 * @param {number} needle needle
+		 * @returns {number} compared
+		 */
+		const compare = (comment, needle) =>
+			/** @type {Range} */ (comment.range)[0] - needle;
+		const comments = /** @type {Comment[]} */ (this.comments);
+		let idx = binarySearchBounds.ge(comments, rangeStart, compare);
+		/** @type {Comment[]} */
+		const commentsInRange = [];
+		while (
+			comments[idx] &&
+			/** @type {Range} */ (comments[idx].range)[1] <= rangeEnd
+		) {
+			commentsInRange.push(comments[idx]);
+			idx++;
+		}
+
+		return commentsInRange;
+	}
+
+	/**
+	 * @param {Range} range range of the comment
+	 * @returns {{ options: Record<string, any> | null, errors: (Error & { comment: Comment })[] | null }} result
+	 */
+	parseCommentOptions(range) {
+		const comments = this.getComments(range);
+		if (comments.length === 0) {
+			return EMPTY_COMMENT_OPTIONS;
+		}
+		/** @type {Record<string, EXPECTED_ANY> } */
+		const options = {};
+		/** @type {(Error & { comment: Comment })[]} */
+		const errors = [];
+		for (const comment of comments) {
+			const { value } = comment;
+			if (value && webpackCommentRegExp.test(value)) {
+				// try compile only if webpack options comment is present
+				try {
+					for (let [key, val] of Object.entries(
+						vm.runInContext(
+							`(function(){return {${value}};})()`,
+							this.magicCommentContext
+						)
+					)) {
+						if (typeof val === "object" && val !== null) {
+							val =
+								val.constructor.name === "RegExp"
+									? new RegExp(val)
+									: JSON.parse(JSON.stringify(val));
+						}
+						options[key] = val;
+					}
+				} catch (err) {
+					const newErr = new Error(String(/** @type {Error} */ (err).message));
+					newErr.stack = String(/** @type {Error} */ (err).stack);
+					Object.assign(newErr, { comment });
+					errors.push(/** @type (Error & { comment: Comment }) */ (newErr));
+				}
+			}
+		}
+		return { options, errors };
+	}
+}
+
+module.exports = CssParser;
+module.exports.escapeIdentifier = escapeIdentifier;
+module.exports.unescapeIdentifier = unescapeIdentifier;
Index: imaps-frontend/node_modules/webpack/lib/css/walkCssTokens.js
===================================================================
--- imaps-frontend/node_modules/webpack/lib/css/walkCssTokens.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
+++ imaps-frontend/node_modules/webpack/lib/css/walkCssTokens.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
@@ -0,0 +1,1627 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/**
+ * @typedef {object} CssTokenCallbacks
+ * @property {(function(string, number, number, number, number): number)=} url
+ * @property {(function(string, number, number): number)=} comment
+ * @property {(function(string, number, number): number)=} string
+ * @property {(function(string, number, number): number)=} leftParenthesis
+ * @property {(function(string, number, number): number)=} rightParenthesis
+ * @property {(function(string, number, number): number)=} function
+ * @property {(function(string, number, number): number)=} colon
+ * @property {(function(string, number, number): number)=} atKeyword
+ * @property {(function(string, number, number): number)=} delim
+ * @property {(function(string, number, number): number)=} identifier
+ * @property {(function(string, number, number, boolean): number)=} hash
+ * @property {(function(string, number, number): number)=} leftCurlyBracket
+ * @property {(function(string, number, number): number)=} rightCurlyBracket
+ * @property {(function(string, number, number): number)=} semicolon
+ * @property {(function(string, number, number): number)=} comma
+ * @property {(function(): boolean)=} needTerminate
+ */
+
+/** @typedef {function(string, number, CssTokenCallbacks): number} CharHandler */
+
+// spec: https://drafts.csswg.org/css-syntax/
+
+const CC_LINE_FEED = "\n".charCodeAt(0);
+const CC_CARRIAGE_RETURN = "\r".charCodeAt(0);
+const CC_FORM_FEED = "\f".charCodeAt(0);
+
+const CC_TAB = "\t".charCodeAt(0);
+const CC_SPACE = " ".charCodeAt(0);
+
+const CC_SOLIDUS = "/".charCodeAt(0);
+const CC_REVERSE_SOLIDUS = "\\".charCodeAt(0);
+const CC_ASTERISK = "*".charCodeAt(0);
+
+const CC_LEFT_PARENTHESIS = "(".charCodeAt(0);
+const CC_RIGHT_PARENTHESIS = ")".charCodeAt(0);
+const CC_LEFT_CURLY = "{".charCodeAt(0);
+const CC_RIGHT_CURLY = "}".charCodeAt(0);
+const CC_LEFT_SQUARE = "[".charCodeAt(0);
+const CC_RIGHT_SQUARE = "]".charCodeAt(0);
+
+const CC_QUOTATION_MARK = '"'.charCodeAt(0);
+const CC_APOSTROPHE = "'".charCodeAt(0);
+
+const CC_FULL_STOP = ".".charCodeAt(0);
+const CC_COLON = ":".charCodeAt(0);
+const CC_SEMICOLON = ";".charCodeAt(0);
+const CC_COMMA = ",".charCodeAt(0);
+const CC_PERCENTAGE = "%".charCodeAt(0);
+const CC_AT_SIGN = "@".charCodeAt(0);
+
+const CC_LOW_LINE = "_".charCodeAt(0);
+const CC_LOWER_A = "a".charCodeAt(0);
+const CC_LOWER_F = "f".charCodeAt(0);
+const CC_LOWER_E = "e".charCodeAt(0);
+const CC_LOWER_U = "u".charCodeAt(0);
+const CC_LOWER_Z = "z".charCodeAt(0);
+const CC_UPPER_A = "A".charCodeAt(0);
+const CC_UPPER_F = "F".charCodeAt(0);
+const CC_UPPER_E = "E".charCodeAt(0);
+const CC_UPPER_U = "E".charCodeAt(0);
+const CC_UPPER_Z = "Z".charCodeAt(0);
+const CC_0 = "0".charCodeAt(0);
+const CC_9 = "9".charCodeAt(0);
+
+const CC_NUMBER_SIGN = "#".charCodeAt(0);
+const CC_PLUS_SIGN = "+".charCodeAt(0);
+const CC_HYPHEN_MINUS = "-".charCodeAt(0);
+
+const CC_LESS_THAN_SIGN = "<".charCodeAt(0);
+const CC_GREATER_THAN_SIGN = ">".charCodeAt(0);
+
+/** @type {CharHandler} */
+const consumeSpace = (input, pos, _callbacks) => {
+	// Consume as much whitespace as possible.
+	while (_isWhiteSpace(input.charCodeAt(pos))) {
+		pos++;
+	}
+
+	// Return a <whitespace-token>.
+	return pos;
+};
+
+// U+000A LINE FEED. Note that U+000D CARRIAGE RETURN and U+000C FORM FEED are not included in this definition,
+// as they are converted to U+000A LINE FEED during preprocessing.
+//
+// Replace any U+000D CARRIAGE RETURN (CR) code points, U+000C FORM FEED (FF) code points, or pairs of U+000D CARRIAGE RETURN (CR) followed by U+000A LINE FEED (LF) in input by a single U+000A LINE FEED (LF) code point.
+
+/**
+ * @param {number} cc char code
+ * @returns {boolean} true, if cc is a newline
+ */
+const _isNewline = cc =>
+	cc === CC_LINE_FEED || cc === CC_CARRIAGE_RETURN || cc === CC_FORM_FEED;
+
+/**
+ * @param {number} cc char code
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position
+ */
+const consumeExtraNewline = (cc, input, pos) => {
+	if (cc === CC_CARRIAGE_RETURN && input.charCodeAt(pos) === CC_LINE_FEED) {
+		pos++;
+	}
+
+	return pos;
+};
+
+/**
+ * @param {number} cc char code
+ * @returns {boolean} true, if cc is a space (U+0009 CHARACTER TABULATION or U+0020 SPACE)
+ */
+const _isSpace = cc => cc === CC_TAB || cc === CC_SPACE;
+
+/**
+ * @param {number} cc char code
+ * @returns {boolean} true, if cc is a whitespace
+ */
+const _isWhiteSpace = cc => _isNewline(cc) || _isSpace(cc);
+
+/**
+ * ident-start code point
+ *
+ * A letter, a non-ASCII code point, or U+005F LOW LINE (_).
+ * @param {number} cc char code
+ * @returns {boolean} true, if cc is a start code point of an identifier
+ */
+const isIdentStartCodePoint = cc =>
+	(cc >= CC_LOWER_A && cc <= CC_LOWER_Z) ||
+	(cc >= CC_UPPER_A && cc <= CC_UPPER_Z) ||
+	cc === CC_LOW_LINE ||
+	cc >= 0x80;
+
+/** @type {CharHandler} */
+const consumeDelimToken = (input, pos, _callbacks) =>
+	// Return a <delim-token> with its value set to the current input code point.
+	pos;
+
+/** @type {CharHandler} */
+const consumeComments = (input, pos, callbacks) => {
+	// This section describes how to consume comments from a stream of code points. It returns nothing.
+	// If the next two input code point are U+002F SOLIDUS (/) followed by a U+002A ASTERISK (*),
+	// consume them and all following code points up to and including the first U+002A ASTERISK (*)
+	// followed by a U+002F SOLIDUS (/), or up to an EOF code point.
+	// Return to the start of this step.
+	while (
+		input.charCodeAt(pos) === CC_SOLIDUS &&
+		input.charCodeAt(pos + 1) === CC_ASTERISK
+	) {
+		const start = pos;
+		pos += 2;
+
+		for (;;) {
+			if (pos === input.length) {
+				// If the preceding paragraph ended by consuming an EOF code point, this is a parse error.
+				return pos;
+			}
+
+			if (
+				input.charCodeAt(pos) === CC_ASTERISK &&
+				input.charCodeAt(pos + 1) === CC_SOLIDUS
+			) {
+				pos += 2;
+
+				if (callbacks.comment) {
+					pos = callbacks.comment(input, start, pos);
+				}
+
+				break;
+			}
+
+			pos++;
+		}
+	}
+
+	return pos;
+};
+
+/**
+ * @param {number} cc char code
+ * @returns {boolean} true, if cc is a hex digit
+ */
+const _isHexDigit = cc =>
+	_isDigit(cc) ||
+	(cc >= CC_UPPER_A && cc <= CC_UPPER_F) ||
+	(cc >= CC_LOWER_A && cc <= CC_LOWER_F);
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position
+ */
+const _consumeAnEscapedCodePoint = (input, pos) => {
+	// This section describes how to consume an escaped code point.
+	// It assumes that the U+005C REVERSE SOLIDUS (\) has already been consumed and that the next input code point has already been verified to be part of a valid escape.
+	// It will return a code point.
+
+	// Consume the next input code point.
+	const cc = input.charCodeAt(pos);
+	pos++;
+
+	// EOF
+	// This is a parse error. Return U+FFFD REPLACEMENT CHARACTER (�).
+	if (pos === input.length) {
+		return pos;
+	}
+
+	// hex digit
+	// Consume as many hex digits as possible, but no more than 5.
+	// Note that this means 1-6 hex digits have been consumed in total.
+	// If the next input code point is whitespace, consume it as well.
+	// Interpret the hex digits as a hexadecimal number.
+	// If this number is zero, or is for a surrogate, or is greater than the maximum allowed code point, return U+FFFD REPLACEMENT CHARACTER (�).
+	// Otherwise, return the code point with that value.
+	if (_isHexDigit(cc)) {
+		for (let i = 0; i < 5; i++) {
+			if (_isHexDigit(input.charCodeAt(pos))) {
+				pos++;
+			}
+		}
+
+		const cc = input.charCodeAt(pos);
+
+		if (_isWhiteSpace(cc)) {
+			pos++;
+			pos = consumeExtraNewline(cc, input, pos);
+		}
+
+		return pos;
+	}
+
+	// anything else
+	// Return the current input code point.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeAStringToken = (input, pos, callbacks) => {
+	// This section describes how to consume a string token from a stream of code points.
+	// It returns either a <string-token> or <bad-string-token>.
+	//
+	// This algorithm may be called with an ending code point, which denotes the code point that ends the string.
+	// If an ending code point is not specified, the current input code point is used.
+	const start = pos - 1;
+	const endingCodePoint = input.charCodeAt(pos - 1);
+
+	// Initially create a <string-token> with its value set to the empty string.
+
+	// Repeatedly consume the next input code point from the stream:
+	for (;;) {
+		// EOF
+		// This is a parse error. Return the <string-token>.
+		if (pos === input.length) {
+			if (callbacks.string !== undefined) {
+				return callbacks.string(input, start, pos);
+			}
+
+			return pos;
+		}
+
+		const cc = input.charCodeAt(pos);
+		pos++;
+
+		// ending code point
+		// Return the <string-token>.
+		if (cc === endingCodePoint) {
+			if (callbacks.string !== undefined) {
+				return callbacks.string(input, start, pos);
+			}
+
+			return pos;
+		}
+		// newline
+		// This is a parse error.
+		// Reconsume the current input code point, create a <bad-string-token>, and return it.
+		else if (_isNewline(cc)) {
+			pos--;
+			// bad string
+			return pos;
+		}
+		// U+005C REVERSE SOLIDUS (\)
+		else if (cc === CC_REVERSE_SOLIDUS) {
+			// If the next input code point is EOF, do nothing.
+			if (pos === input.length) {
+				return pos;
+			}
+			// Otherwise, if the next input code point is a newline, consume it.
+			else if (_isNewline(input.charCodeAt(pos))) {
+				const cc = input.charCodeAt(pos);
+				pos++;
+				pos = consumeExtraNewline(cc, input, pos);
+			}
+			// Otherwise, (the stream starts with a valid escape) consume an escaped code point and append the returned code point to the <string-token>’s value.
+			else if (_ifTwoCodePointsAreValidEscape(input, pos)) {
+				pos = _consumeAnEscapedCodePoint(input, pos);
+			}
+		}
+		// anything else
+		// Append the current input code point to the <string-token>’s value.
+		else {
+			// Append
+		}
+	}
+};
+
+/**
+ * @param {number} cc char code
+ * @param {number} q char code
+ * @returns {boolean} is non-ASCII code point
+ */
+const isNonASCIICodePoint = (cc, q) =>
+	// Simplify
+	cc > 0x80;
+/**
+ * @param {number} cc char code
+ * @returns {boolean} is letter
+ */
+const isLetter = cc =>
+	(cc >= CC_LOWER_A && cc <= CC_LOWER_Z) ||
+	(cc >= CC_UPPER_A && cc <= CC_UPPER_Z);
+
+/**
+ * @param {number} cc char code
+ * @param {number} q char code
+ * @returns {boolean} is identifier start code
+ */
+const _isIdentStartCodePoint = (cc, q) =>
+	isLetter(cc) || isNonASCIICodePoint(cc, q) || cc === CC_LOW_LINE;
+
+/**
+ * @param {number} cc char code
+ * @param {number} q char code
+ * @returns {boolean} is identifier code
+ */
+const _isIdentCodePoint = (cc, q) =>
+	_isIdentStartCodePoint(cc, q) || _isDigit(cc) || cc === CC_HYPHEN_MINUS;
+/**
+ * @param {number} cc char code
+ * @returns {boolean} is digit
+ */
+const _isDigit = cc => cc >= CC_0 && cc <= CC_9;
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @param {number=} f first code point
+ * @param {number=} s second code point
+ * @returns {boolean} true if two code points are a valid escape
+ */
+const _ifTwoCodePointsAreValidEscape = (input, pos, f, s) => {
+	// This section describes how to check if two code points are a valid escape.
+	// The algorithm described here can be called explicitly with two code points, or can be called with the input stream itself.
+	// In the latter case, the two code points in question are the current input code point and the next input code point, in that order.
+
+	// Note: This algorithm will not consume any additional code point.
+	const first = f || input.charCodeAt(pos - 1);
+	const second = s || input.charCodeAt(pos);
+
+	// If the first code point is not U+005C REVERSE SOLIDUS (\), return false.
+	if (first !== CC_REVERSE_SOLIDUS) return false;
+	// Otherwise, if the second code point is a newline, return false.
+	if (_isNewline(second)) return false;
+	// Otherwise, return true.
+	return true;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @param {number=} f first
+ * @param {number=} s second
+ * @param {number=} t third
+ * @returns {boolean} true, if input at pos starts an identifier
+ */
+const _ifThreeCodePointsWouldStartAnIdentSequence = (input, pos, f, s, t) => {
+	// This section describes how to check if three code points would start an ident sequence.
+	// The algorithm described here can be called explicitly with three code points, or can be called with the input stream itself.
+	// In the latter case, the three code points in question are the current input code point and the next two input code points, in that order.
+
+	// Note: This algorithm will not consume any additional code points.
+
+	const first = f || input.charCodeAt(pos - 1);
+	const second = s || input.charCodeAt(pos);
+	const third = t || input.charCodeAt(pos + 1);
+
+	// Look at the first code point:
+
+	// U+002D HYPHEN-MINUS
+	if (first === CC_HYPHEN_MINUS) {
+		// If the second code point is an ident-start code point or a U+002D HYPHEN-MINUS
+		// or a U+002D HYPHEN-MINUS, or the second and third code points are a valid escape, return true.
+		if (
+			_isIdentStartCodePoint(second, pos) ||
+			second === CC_HYPHEN_MINUS ||
+			_ifTwoCodePointsAreValidEscape(input, pos, second, third)
+		) {
+			return true;
+		}
+		return false;
+	}
+	// ident-start code point
+	else if (_isIdentStartCodePoint(first, pos - 1)) {
+		return true;
+	}
+	// U+005C REVERSE SOLIDUS (\)
+	// If the first and second code points are a valid escape, return true. Otherwise, return false.
+	else if (first === CC_REVERSE_SOLIDUS) {
+		if (_ifTwoCodePointsAreValidEscape(input, pos, first, second)) {
+			return true;
+		}
+
+		return false;
+	}
+	// anything else
+	// Return false.
+	return false;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @param {number=} f first
+ * @param {number=} s second
+ * @param {number=} t third
+ * @returns {boolean} true, if input at pos starts an identifier
+ */
+const _ifThreeCodePointsWouldStartANumber = (input, pos, f, s, t) => {
+	// This section describes how to check if three code points would start a number.
+	// The algorithm described here can be called explicitly with three code points, or can be called with the input stream itself.
+	// In the latter case, the three code points in question are the current input code point and the next two input code points, in that order.
+
+	// Note: This algorithm will not consume any additional code points.
+
+	const first = f || input.charCodeAt(pos - 1);
+	const second = s || input.charCodeAt(pos);
+	const third = t || input.charCodeAt(pos);
+
+	// Look at the first code point:
+
+	// U+002B PLUS SIGN (+)
+	// U+002D HYPHEN-MINUS (-)
+	//
+	// If the second code point is a digit, return true.
+	// Otherwise, if the second code point is a U+002E FULL STOP (.) and the third code point is a digit, return true.
+	// Otherwise, return false.
+	if (first === CC_PLUS_SIGN || first === CC_HYPHEN_MINUS) {
+		if (_isDigit(second)) {
+			return true;
+		} else if (second === CC_FULL_STOP && _isDigit(third)) {
+			return true;
+		}
+
+		return false;
+	}
+	// U+002E FULL STOP (.)
+	// If the second code point is a digit, return true. Otherwise, return false.
+	else if (first === CC_FULL_STOP) {
+		if (_isDigit(second)) {
+			return true;
+		}
+
+		return false;
+	}
+	// digit
+	// Return true.
+	else if (_isDigit(first)) {
+		return true;
+	}
+
+	// anything else
+	// Return false.
+	return false;
+};
+
+/** @type {CharHandler} */
+const consumeNumberSign = (input, pos, callbacks) => {
+	// If the next input code point is an ident code point or the next two input code points are a valid escape, then:
+	// - Create a <hash-token>.
+	// - If the next 3 input code points would start an ident sequence, set the <hash-token>’s type flag to "id".
+	// - Consume an ident sequence, and set the <hash-token>’s value to the returned string.
+	// - Return the <hash-token>.
+	const start = pos - 1;
+	const first = input.charCodeAt(pos);
+	const second = input.charCodeAt(pos + 1);
+
+	if (
+		_isIdentCodePoint(first, pos - 1) ||
+		_ifTwoCodePointsAreValidEscape(input, pos, first, second)
+	) {
+		const third = input.charCodeAt(pos + 2);
+		let isId = false;
+
+		if (
+			_ifThreeCodePointsWouldStartAnIdentSequence(
+				input,
+				pos,
+				first,
+				second,
+				third
+			)
+		) {
+			isId = true;
+		}
+
+		pos = _consumeAnIdentSequence(input, pos, callbacks);
+
+		if (callbacks.hash !== undefined) {
+			return callbacks.hash(input, start, pos, isId);
+		}
+
+		return pos;
+	}
+
+	// Otherwise, return a <delim-token> with its value set to the current input code point.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeHyphenMinus = (input, pos, callbacks) => {
+	// If the input stream starts with a number, reconsume the current input code point, consume a numeric token, and return it.
+	if (_ifThreeCodePointsWouldStartANumber(input, pos)) {
+		pos--;
+		return consumeANumericToken(input, pos, callbacks);
+	}
+	// Otherwise, if the next 2 input code points are U+002D HYPHEN-MINUS U+003E GREATER-THAN SIGN (->), consume them and return a <CDC-token>.
+	else if (
+		input.charCodeAt(pos) === CC_HYPHEN_MINUS &&
+		input.charCodeAt(pos + 1) === CC_GREATER_THAN_SIGN
+	) {
+		return pos + 2;
+	}
+	// Otherwise, if the input stream starts with an ident sequence, reconsume the current input code point, consume an ident-like token, and return it.
+	else if (_ifThreeCodePointsWouldStartAnIdentSequence(input, pos)) {
+		pos--;
+		return consumeAnIdentLikeToken(input, pos, callbacks);
+	}
+
+	// Otherwise, return a <delim-token> with its value set to the current input code point.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeFullStop = (input, pos, callbacks) => {
+	const start = pos - 1;
+
+	// If the input stream starts with a number, reconsume the current input code point, consume a numeric token, and return it.
+	if (_ifThreeCodePointsWouldStartANumber(input, pos)) {
+		pos--;
+		return consumeANumericToken(input, pos, callbacks);
+	}
+
+	// Otherwise, return a <delim-token> with its value set to the current input code point.
+	if (callbacks.delim !== undefined) {
+		return callbacks.delim(input, start, pos);
+	}
+
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumePlusSign = (input, pos, callbacks) => {
+	// If the input stream starts with a number, reconsume the current input code point, consume a numeric token, and return it.
+	if (_ifThreeCodePointsWouldStartANumber(input, pos)) {
+		pos--;
+		return consumeANumericToken(input, pos, callbacks);
+	}
+
+	// Otherwise, return a <delim-token> with its value set to the current input code point.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const _consumeANumber = (input, pos) => {
+	// This section describes how to consume a number from a stream of code points.
+	// It returns a numeric value, and a type which is either "integer" or "number".
+
+	// Execute the following steps in order:
+	// Initially set type to "integer". Let repr be the empty string.
+
+	// If the next input code point is U+002B PLUS SIGN (+) or U+002D HYPHEN-MINUS (-), consume it and append it to repr.
+	if (
+		input.charCodeAt(pos) === CC_HYPHEN_MINUS ||
+		input.charCodeAt(pos) === CC_PLUS_SIGN
+	) {
+		pos++;
+	}
+
+	// While the next input code point is a digit, consume it and append it to repr.
+	while (_isDigit(input.charCodeAt(pos))) {
+		pos++;
+	}
+
+	// If the next 2 input code points are U+002E FULL STOP (.) followed by a digit, then:
+	// 1. Consume the next input code point and append it to number part.
+	// 2. While the next input code point is a digit, consume it and append it to number part.
+	// 3. Set type to "number".
+	if (
+		input.charCodeAt(pos) === CC_FULL_STOP &&
+		_isDigit(input.charCodeAt(pos + 1))
+	) {
+		pos++;
+
+		while (_isDigit(input.charCodeAt(pos))) {
+			pos++;
+		}
+	}
+
+	// If the next 2 or 3 input code points are U+0045 LATIN CAPITAL LETTER E (E) or U+0065 LATIN SMALL LETTER E (e), optionally followed by U+002D HYPHEN-MINUS (-) or U+002B PLUS SIGN (+), followed by a digit, then:
+	// 1. Consume the next input code point.
+	// 2. If the next input code point is "+" or "-", consume it and append it to exponent part.
+	// 3. While the next input code point is a digit, consume it and append it to exponent part.
+	// 4. Set type to "number".
+	if (
+		(input.charCodeAt(pos) === CC_LOWER_E ||
+			input.charCodeAt(pos) === CC_UPPER_E) &&
+		(((input.charCodeAt(pos + 1) === CC_HYPHEN_MINUS ||
+			input.charCodeAt(pos + 1) === CC_PLUS_SIGN) &&
+			_isDigit(input.charCodeAt(pos + 2))) ||
+			_isDigit(input.charCodeAt(pos + 1)))
+	) {
+		pos++;
+
+		if (
+			input.charCodeAt(pos) === CC_PLUS_SIGN ||
+			input.charCodeAt(pos) === CC_HYPHEN_MINUS
+		) {
+			pos++;
+		}
+
+		while (_isDigit(input.charCodeAt(pos))) {
+			pos++;
+		}
+	}
+
+	// Let value be the result of interpreting number part as a base-10 number.
+
+	// If exponent part is non-empty, interpret it as a base-10 integer, then raise 10 to the power of the result, multiply it by value, and set value to that result.
+
+	// Return value and type.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeANumericToken = (input, pos, callbacks) => {
+	// This section describes how to consume a numeric token from a stream of code points.
+	// It returns either a <number-token>, <percentage-token>, or <dimension-token>.
+
+	// Consume a number and let number be the result.
+	pos = _consumeANumber(input, pos, callbacks);
+
+	// If the next 3 input code points would start an ident sequence, then:
+	//
+	// - Create a <dimension-token> with the same value and type flag as number, and a unit set initially to the empty string.
+	// - Consume an ident sequence. Set the <dimension-token>’s unit to the returned value.
+	// - Return the <dimension-token>.
+
+	const first = input.charCodeAt(pos);
+	const second = input.charCodeAt(pos + 1);
+	const third = input.charCodeAt(pos + 2);
+
+	if (
+		_ifThreeCodePointsWouldStartAnIdentSequence(
+			input,
+			pos,
+			first,
+			second,
+			third
+		)
+	) {
+		return _consumeAnIdentSequence(input, pos, callbacks);
+	}
+	// Otherwise, if the next input code point is U+0025 PERCENTAGE SIGN (%), consume it.
+	// Create a <percentage-token> with the same value as number, and return it.
+	else if (first === CC_PERCENTAGE) {
+		return pos + 1;
+	}
+
+	// Otherwise, create a <number-token> with the same value and type flag as number, and return it.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeColon = (input, pos, callbacks) => {
+	// Return a <colon-token>.
+	if (callbacks.colon !== undefined) {
+		return callbacks.colon(input, pos - 1, pos);
+	}
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeLeftParenthesis = (input, pos, callbacks) => {
+	// Return a <(-token>.
+	if (callbacks.leftParenthesis !== undefined) {
+		return callbacks.leftParenthesis(input, pos - 1, pos);
+	}
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeRightParenthesis = (input, pos, callbacks) => {
+	// Return a <)-token>.
+	if (callbacks.rightParenthesis !== undefined) {
+		return callbacks.rightParenthesis(input, pos - 1, pos);
+	}
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeLeftSquareBracket = (input, pos, callbacks) =>
+	// Return a <]-token>.
+	pos;
+
+/** @type {CharHandler} */
+const consumeRightSquareBracket = (input, pos, callbacks) =>
+	// Return a <]-token>.
+	pos;
+
+/** @type {CharHandler} */
+const consumeLeftCurlyBracket = (input, pos, callbacks) => {
+	// Return a <{-token>.
+	if (callbacks.leftCurlyBracket !== undefined) {
+		return callbacks.leftCurlyBracket(input, pos - 1, pos);
+	}
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeRightCurlyBracket = (input, pos, callbacks) => {
+	// Return a <}-token>.
+	if (callbacks.rightCurlyBracket !== undefined) {
+		return callbacks.rightCurlyBracket(input, pos - 1, pos);
+	}
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeSemicolon = (input, pos, callbacks) => {
+	// Return a <semicolon-token>.
+	if (callbacks.semicolon !== undefined) {
+		return callbacks.semicolon(input, pos - 1, pos);
+	}
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeComma = (input, pos, callbacks) => {
+	// Return a <comma-token>.
+	if (callbacks.comma !== undefined) {
+		return callbacks.comma(input, pos - 1, pos);
+	}
+	return pos;
+};
+
+/** @type {CharHandler} */
+const _consumeAnIdentSequence = (input, pos) => {
+	// This section describes how to consume an ident sequence from a stream of code points.
+	// It returns a string containing the largest name that can be formed from adjacent code points in the stream, starting from the first.
+
+	// Note: This algorithm does not do the verification of the first few code points that are necessary to ensure the returned code points would constitute an <ident-token>.
+	// If that is the intended use, ensure that the stream starts with an ident sequence before calling this algorithm.
+
+	// Let result initially be an empty string.
+
+	// Repeatedly consume the next input code point from the stream:
+	for (;;) {
+		const cc = input.charCodeAt(pos);
+		pos++;
+
+		// ident code point
+		// Append the code point to result.
+		if (_isIdentCodePoint(cc, pos - 1)) {
+			// Nothing
+		}
+		// the stream starts with a valid escape
+		// Consume an escaped code point. Append the returned code point to result.
+		else if (_ifTwoCodePointsAreValidEscape(input, pos)) {
+			pos = _consumeAnEscapedCodePoint(input, pos);
+		}
+		// anything else
+		// Reconsume the current input code point. Return result.
+		else {
+			return pos - 1;
+		}
+	}
+};
+
+/**
+ * @param {number} cc char code
+ * @returns {boolean} true, when cc is the non-printable code point, otherwise false
+ */
+const _isNonPrintableCodePoint = cc =>
+	(cc >= 0x00 && cc <= 0x08) ||
+	cc === 0x0b ||
+	(cc >= 0x0e && cc <= 0x1f) ||
+	cc === 0x7f;
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position
+ */
+const consumeTheRemnantsOfABadUrl = (input, pos) => {
+	// This section describes how to consume the remnants of a bad url from a stream of code points,
+	// "cleaning up" after the tokenizer realizes that it’s in the middle of a <bad-url-token> rather than a <url-token>.
+	// It returns nothing; its sole use is to consume enough of the input stream to reach a recovery point where normal tokenizing can resume.
+
+	// Repeatedly consume the next input code point from the stream:
+	for (;;) {
+		// EOF
+		// Return.
+		if (pos === input.length) {
+			return pos;
+		}
+
+		const cc = input.charCodeAt(pos);
+		pos++;
+
+		// U+0029 RIGHT PARENTHESIS ())
+		// Return.
+		if (cc === CC_RIGHT_PARENTHESIS) {
+			return pos;
+		}
+		// the input stream starts with a valid escape
+		// Consume an escaped code point.
+		// This allows an escaped right parenthesis ("\)") to be encountered without ending the <bad-url-token>.
+		// This is otherwise identical to the "anything else" clause.
+		else if (_ifTwoCodePointsAreValidEscape(input, pos)) {
+			pos = _consumeAnEscapedCodePoint(input, pos);
+		}
+		// anything else
+		// Do nothing.
+		else {
+			// Do nothing.
+		}
+	}
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @param {number} fnStart start
+ * @param {CssTokenCallbacks} callbacks callbacks
+ * @returns {pos} pos
+ */
+const consumeAUrlToken = (input, pos, fnStart, callbacks) => {
+	// This section describes how to consume a url token from a stream of code points.
+	// It returns either a <url-token> or a <bad-url-token>.
+
+	// Note: This algorithm assumes that the initial "url(" has already been consumed.
+	// This algorithm also assumes that it’s being called to consume an "unquoted" value, like url(foo).
+	// A quoted value, like url("foo"), is parsed as a <function-token>.
+	// Consume an ident-like token automatically handles this distinction; this algorithm shouldn’t be called directly otherwise.
+
+	// Initially create a <url-token> with its value set to the empty string.
+
+	// Consume as much whitespace as possible.
+	while (_isWhiteSpace(input.charCodeAt(pos))) {
+		pos++;
+	}
+
+	const contentStart = pos;
+
+	// Repeatedly consume the next input code point from the stream:
+	for (;;) {
+		// EOF
+		// This is a parse error. Return the <url-token>.
+		if (pos === input.length) {
+			if (callbacks.url !== undefined) {
+				return callbacks.url(input, fnStart, pos, contentStart, pos - 1);
+			}
+
+			return pos;
+		}
+
+		const cc = input.charCodeAt(pos);
+		pos++;
+
+		// U+0029 RIGHT PARENTHESIS ())
+		// Return the <url-token>.
+		if (cc === CC_RIGHT_PARENTHESIS) {
+			if (callbacks.url !== undefined) {
+				return callbacks.url(input, fnStart, pos, contentStart, pos - 1);
+			}
+
+			return pos;
+		}
+		// whitespace
+		// Consume as much whitespace as possible.
+		// If the next input code point is U+0029 RIGHT PARENTHESIS ()) or EOF, consume it and return the <url-token>
+		// (if EOF was encountered, this is a parse error); otherwise, consume the remnants of a bad url, create a <bad-url-token>, and return it.
+		else if (_isWhiteSpace(cc)) {
+			const end = pos - 1;
+
+			while (_isWhiteSpace(input.charCodeAt(pos))) {
+				pos++;
+			}
+
+			if (pos === input.length) {
+				if (callbacks.url !== undefined) {
+					return callbacks.url(input, fnStart, pos, contentStart, end);
+				}
+
+				return pos;
+			}
+
+			if (input.charCodeAt(pos) === CC_RIGHT_PARENTHESIS) {
+				pos++;
+
+				if (callbacks.url !== undefined) {
+					return callbacks.url(input, fnStart, pos, contentStart, end);
+				}
+
+				return pos;
+			}
+
+			// Don't handle bad urls
+			return consumeTheRemnantsOfABadUrl(input, pos);
+		}
+		// U+0022 QUOTATION MARK (")
+		// U+0027 APOSTROPHE (')
+		// U+0028 LEFT PARENTHESIS (()
+		// non-printable code point
+		// This is a parse error. Consume the remnants of a bad url, create a <bad-url-token>, and return it.
+		else if (
+			cc === CC_QUOTATION_MARK ||
+			cc === CC_APOSTROPHE ||
+			cc === CC_LEFT_PARENTHESIS ||
+			_isNonPrintableCodePoint(cc)
+		) {
+			// Don't handle bad urls
+			return consumeTheRemnantsOfABadUrl(input, pos);
+		}
+		// // U+005C REVERSE SOLIDUS (\)
+		// // If the stream starts with a valid escape, consume an escaped code point and append the returned code point to the <url-token>’s value.
+		// // Otherwise, this is a parse error. Consume the remnants of a bad url, create a <bad-url-token>, and return it.
+		else if (cc === CC_REVERSE_SOLIDUS) {
+			if (_ifTwoCodePointsAreValidEscape(input, pos)) {
+				pos = _consumeAnEscapedCodePoint(input, pos);
+			} else {
+				// Don't handle bad urls
+				return consumeTheRemnantsOfABadUrl(input, pos);
+			}
+		}
+		// anything else
+		// Append the current input code point to the <url-token>’s value.
+		else {
+			// Nothing
+		}
+	}
+};
+
+/** @type {CharHandler} */
+const consumeAnIdentLikeToken = (input, pos, callbacks) => {
+	const start = pos;
+	// This section describes how to consume an ident-like token from a stream of code points.
+	// It returns an <ident-token>, <function-token>, <url-token>, or <bad-url-token>.
+	pos = _consumeAnIdentSequence(input, pos, callbacks);
+
+	// If string’s value is an ASCII case-insensitive match for "url", and the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.
+	// While the next two input code points are whitespace, consume the next input code point.
+	// If the next one or two input code points are U+0022 QUOTATION MARK ("), U+0027 APOSTROPHE ('), or whitespace followed by U+0022 QUOTATION MARK (") or U+0027 APOSTROPHE ('), then create a <function-token> with its value set to string and return it.
+	// Otherwise, consume a url token, and return it.
+	if (
+		input.slice(start, pos).toLowerCase() === "url" &&
+		input.charCodeAt(pos) === CC_LEFT_PARENTHESIS
+	) {
+		pos++;
+		const end = pos;
+
+		while (
+			_isWhiteSpace(input.charCodeAt(pos)) &&
+			_isWhiteSpace(input.charCodeAt(pos + 1))
+		) {
+			pos++;
+		}
+
+		if (
+			input.charCodeAt(pos) === CC_QUOTATION_MARK ||
+			input.charCodeAt(pos) === CC_APOSTROPHE ||
+			(_isWhiteSpace(input.charCodeAt(pos)) &&
+				(input.charCodeAt(pos + 1) === CC_QUOTATION_MARK ||
+					input.charCodeAt(pos + 1) === CC_APOSTROPHE))
+		) {
+			if (callbacks.function !== undefined) {
+				return callbacks.function(input, start, end);
+			}
+
+			return pos;
+		}
+
+		return consumeAUrlToken(input, pos, start, callbacks);
+	}
+
+	// Otherwise, if the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.
+	// Create a <function-token> with its value set to string and return it.
+	if (input.charCodeAt(pos) === CC_LEFT_PARENTHESIS) {
+		pos++;
+
+		if (callbacks.function !== undefined) {
+			return callbacks.function(input, start, pos);
+		}
+
+		return pos;
+	}
+
+	// Otherwise, create an <ident-token> with its value set to string and return it.
+	if (callbacks.identifier !== undefined) {
+		return callbacks.identifier(input, start, pos);
+	}
+
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeLessThan = (input, pos, _callbacks) => {
+	// If the next 3 input code points are U+0021 EXCLAMATION MARK U+002D HYPHEN-MINUS U+002D HYPHEN-MINUS (!--), consume them and return a <CDO-token>.
+	if (input.slice(pos, pos + 3) === "!--") {
+		return pos + 3;
+	}
+
+	// Otherwise, return a <delim-token> with its value set to the current input code point.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeCommercialAt = (input, pos, callbacks) => {
+	const start = pos - 1;
+
+	// If the next 3 input code points would start an ident sequence, consume an ident sequence, create an <at-keyword-token> with its value set to the returned value, and return it.
+	if (
+		_ifThreeCodePointsWouldStartAnIdentSequence(
+			input,
+			pos,
+			input.charCodeAt(pos),
+			input.charCodeAt(pos + 1),
+			input.charCodeAt(pos + 2)
+		)
+	) {
+		pos = _consumeAnIdentSequence(input, pos, callbacks);
+
+		if (callbacks.atKeyword !== undefined) {
+			pos = callbacks.atKeyword(input, start, pos);
+		}
+
+		return pos;
+	}
+
+	// Otherwise, return a <delim-token> with its value set to the current input code point.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeReverseSolidus = (input, pos, callbacks) => {
+	// If the input stream starts with a valid escape, reconsume the current input code point, consume an ident-like token, and return it.
+	if (_ifTwoCodePointsAreValidEscape(input, pos)) {
+		pos--;
+		return consumeAnIdentLikeToken(input, pos, callbacks);
+	}
+
+	// Otherwise, this is a parse error. Return a <delim-token> with its value set to the current input code point.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeAToken = (input, pos, callbacks) => {
+	const cc = input.charCodeAt(pos - 1);
+
+	// https://drafts.csswg.org/css-syntax/#consume-token
+	switch (cc) {
+		// whitespace
+		case CC_LINE_FEED:
+		case CC_CARRIAGE_RETURN:
+		case CC_FORM_FEED:
+		case CC_TAB:
+		case CC_SPACE:
+			return consumeSpace(input, pos, callbacks);
+		// U+0022 QUOTATION MARK (")
+		case CC_QUOTATION_MARK:
+			return consumeAStringToken(input, pos, callbacks);
+		// U+0023 NUMBER SIGN (#)
+		case CC_NUMBER_SIGN:
+			return consumeNumberSign(input, pos, callbacks);
+		// U+0027 APOSTROPHE (')
+		case CC_APOSTROPHE:
+			return consumeAStringToken(input, pos, callbacks);
+		// U+0028 LEFT PARENTHESIS (()
+		case CC_LEFT_PARENTHESIS:
+			return consumeLeftParenthesis(input, pos, callbacks);
+		// U+0029 RIGHT PARENTHESIS ())
+		case CC_RIGHT_PARENTHESIS:
+			return consumeRightParenthesis(input, pos, callbacks);
+		// U+002B PLUS SIGN (+)
+		case CC_PLUS_SIGN:
+			return consumePlusSign(input, pos, callbacks);
+		// U+002C COMMA (,)
+		case CC_COMMA:
+			return consumeComma(input, pos, callbacks);
+		// U+002D HYPHEN-MINUS (-)
+		case CC_HYPHEN_MINUS:
+			return consumeHyphenMinus(input, pos, callbacks);
+		// U+002E FULL STOP (.)
+		case CC_FULL_STOP:
+			return consumeFullStop(input, pos, callbacks);
+		// U+003A COLON (:)
+		case CC_COLON:
+			return consumeColon(input, pos, callbacks);
+		// U+003B SEMICOLON (;)
+		case CC_SEMICOLON:
+			return consumeSemicolon(input, pos, callbacks);
+		// U+003C LESS-THAN SIGN (<)
+		case CC_LESS_THAN_SIGN:
+			return consumeLessThan(input, pos, callbacks);
+		// U+0040 COMMERCIAL AT (@)
+		case CC_AT_SIGN:
+			return consumeCommercialAt(input, pos, callbacks);
+		// U+005B LEFT SQUARE BRACKET ([)
+		case CC_LEFT_SQUARE:
+			return consumeLeftSquareBracket(input, pos, callbacks);
+		// U+005C REVERSE SOLIDUS (\)
+		case CC_REVERSE_SOLIDUS:
+			return consumeReverseSolidus(input, pos, callbacks);
+		// U+005D RIGHT SQUARE BRACKET (])
+		case CC_RIGHT_SQUARE:
+			return consumeRightSquareBracket(input, pos, callbacks);
+		// U+007B LEFT CURLY BRACKET ({)
+		case CC_LEFT_CURLY:
+			return consumeLeftCurlyBracket(input, pos, callbacks);
+		// U+007D RIGHT CURLY BRACKET (})
+		case CC_RIGHT_CURLY:
+			return consumeRightCurlyBracket(input, pos, callbacks);
+		default:
+			// digit
+			// Reconsume the current input code point, consume a numeric token, and return it.
+			if (_isDigit(cc)) {
+				pos--;
+				return consumeANumericToken(input, pos, callbacks);
+			} else if (cc === CC_LOWER_U || cc === CC_UPPER_U) {
+				// If unicode ranges allowed is true and the input stream would start a unicode-range,
+				// reconsume the current input code point, consume a unicode-range token, and return it.
+				// Skip now
+				// if (_ifThreeCodePointsWouldStartAUnicodeRange(input, pos)) {
+				// 	pos--;
+				// 	return consumeAUnicodeRangeToken(input, pos, callbacks);
+				// }
+
+				// Otherwise, reconsume the current input code point, consume an ident-like token, and return it.
+				pos--;
+				return consumeAnIdentLikeToken(input, pos, callbacks);
+			}
+			// ident-start code point
+			// Reconsume the current input code point, consume an ident-like token, and return it.
+			else if (isIdentStartCodePoint(cc)) {
+				pos--;
+				return consumeAnIdentLikeToken(input, pos, callbacks);
+			}
+
+			// EOF, but we don't have it
+
+			// anything else
+			// Return a <delim-token> with its value set to the current input code point.
+			return consumeDelimToken(input, pos, callbacks);
+	}
+};
+
+/**
+ * @param {string} input input css
+ * @param {number=} pos pos
+ * @param {CssTokenCallbacks=} callbacks callbacks
+ * @returns {number} pos
+ */
+module.exports = (input, pos = 0, callbacks = {}) => {
+	// This section describes how to consume a token from a stream of code points. It will return a single token of any type.
+	while (pos < input.length) {
+		// Consume comments.
+		pos = consumeComments(input, pos, callbacks);
+
+		// Consume the next input code point.
+		pos++;
+		pos = consumeAToken(input, pos, callbacks);
+
+		if (callbacks.needTerminate && callbacks.needTerminate()) {
+			break;
+		}
+	}
+
+	return pos;
+};
+
+module.exports.isIdentStartCodePoint = isIdentStartCodePoint;
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position after comments
+ */
+module.exports.eatComments = (input, pos) => {
+	for (;;) {
+		const originalPos = pos;
+		pos = consumeComments(input, pos, {});
+		if (originalPos === pos) {
+			break;
+		}
+	}
+
+	return pos;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position after whitespace
+ */
+module.exports.eatWhitespace = (input, pos) => {
+	while (_isWhiteSpace(input.charCodeAt(pos))) {
+		pos++;
+	}
+
+	return pos;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position after whitespace and comments
+ */
+module.exports.eatWhitespaceAndComments = (input, pos) => {
+	for (;;) {
+		const originalPos = pos;
+		pos = consumeComments(input, pos, {});
+		while (_isWhiteSpace(input.charCodeAt(pos))) {
+			pos++;
+		}
+		if (originalPos === pos) {
+			break;
+		}
+	}
+
+	return pos;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position after whitespace and comments
+ */
+module.exports.eatComments = (input, pos) => {
+	for (;;) {
+		const originalPos = pos;
+		pos = consumeComments(input, pos, {});
+		if (originalPos === pos) {
+			break;
+		}
+	}
+
+	return pos;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position after whitespace
+ */
+module.exports.eatWhiteLine = (input, pos) => {
+	for (;;) {
+		const cc = input.charCodeAt(pos);
+		if (_isSpace(cc)) {
+			pos++;
+			continue;
+		}
+		if (_isNewline(cc)) pos++;
+		pos = consumeExtraNewline(cc, input, pos);
+		break;
+	}
+
+	return pos;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {[number, number] | undefined} positions of ident sequence
+ */
+module.exports.skipCommentsAndEatIdentSequence = (input, pos) => {
+	pos = module.exports.eatComments(input, pos);
+
+	const start = pos;
+
+	if (
+		_ifThreeCodePointsWouldStartAnIdentSequence(
+			input,
+			pos,
+			input.charCodeAt(pos),
+			input.charCodeAt(pos + 1),
+			input.charCodeAt(pos + 2)
+		)
+	) {
+		return [start, _consumeAnIdentSequence(input, pos, {})];
+	}
+
+	return undefined;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {[number, number] | undefined} positions of ident sequence
+ */
+module.exports.eatString = (input, pos) => {
+	pos = module.exports.eatWhitespaceAndComments(input, pos);
+
+	const start = pos;
+
+	if (
+		input.charCodeAt(pos) === CC_QUOTATION_MARK ||
+		input.charCodeAt(pos) === CC_APOSTROPHE
+	) {
+		return [start, consumeAStringToken(input, pos + 1, {})];
+	}
+
+	return undefined;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @param {CssTokenCallbacks} cbs callbacks
+ * @returns {[number, number][]} positions of ident sequence
+ */
+module.exports.eatImageSetStrings = (input, pos, cbs) => {
+	/** @type {[number, number][]} */
+	const result = [];
+
+	let isFirst = true;
+	let needStop = false;
+	// We already in `func(` token
+	let balanced = 1;
+
+	/** @type {CssTokenCallbacks} */
+	const callbacks = {
+		...cbs,
+		string: (_input, start, end) => {
+			if (isFirst && balanced === 1) {
+				result.push([start, end]);
+				isFirst = false;
+			}
+
+			return end;
+		},
+		comma: (_input, _start, end) => {
+			if (balanced === 1) {
+				isFirst = true;
+			}
+
+			return end;
+		},
+		leftParenthesis: (input, start, end) => {
+			balanced++;
+
+			return end;
+		},
+		function: (_input, start, end) => {
+			balanced++;
+
+			return end;
+		},
+		rightParenthesis: (_input, _start, end) => {
+			balanced--;
+
+			if (balanced === 0) {
+				needStop = true;
+			}
+
+			return end;
+		}
+	};
+
+	while (pos < input.length) {
+		// Consume comments.
+		pos = consumeComments(input, pos, callbacks);
+
+		// Consume the next input code point.
+		pos++;
+		pos = consumeAToken(input, pos, callbacks);
+
+		if (needStop) {
+			break;
+		}
+	}
+
+	return result;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @param {CssTokenCallbacks} cbs callbacks
+ * @returns {[[number, number, number, number] | undefined, [number, number] | undefined, [number, number] | undefined, [number, number] | undefined]} positions of top level tokens
+ */
+module.exports.eatImportTokens = (input, pos, cbs) => {
+	const result =
+		/** @type {[[number, number, number, number] | undefined, [number, number] | undefined, [number, number] | undefined, [number, number] | undefined]} */
+		(new Array(4));
+
+	/** @type {0 | 1 | 2 | undefined} */
+	let scope;
+	let needStop = false;
+	let balanced = 0;
+
+	/** @type {CssTokenCallbacks} */
+	const callbacks = {
+		...cbs,
+		url: (_input, start, end, contentStart, contentEnd) => {
+			if (
+				result[0] === undefined &&
+				balanced === 0 &&
+				result[1] === undefined &&
+				result[2] === undefined &&
+				result[3] === undefined
+			) {
+				result[0] = [start, end, contentStart, contentEnd];
+				scope = undefined;
+			}
+
+			return end;
+		},
+		string: (_input, start, end) => {
+			if (
+				balanced === 0 &&
+				result[0] === undefined &&
+				result[1] === undefined &&
+				result[2] === undefined &&
+				result[3] === undefined
+			) {
+				result[0] = [start, end, start + 1, end - 1];
+				scope = undefined;
+			} else if (result[0] !== undefined && scope === 0) {
+				result[0][2] = start + 1;
+				result[0][3] = end - 1;
+			}
+
+			return end;
+		},
+		leftParenthesis: (_input, _start, end) => {
+			balanced++;
+
+			return end;
+		},
+		rightParenthesis: (_input, _start, end) => {
+			balanced--;
+
+			if (balanced === 0 && scope !== undefined) {
+				/** @type {[number, number]} */
+				(result[scope])[1] = end;
+				scope = undefined;
+			}
+
+			return end;
+		},
+		function: (input, start, end) => {
+			if (balanced === 0) {
+				const name = input
+					.slice(start, end - 1)
+					.replace(/\\/g, "")
+					.toLowerCase();
+
+				if (
+					name === "url" &&
+					result[0] === undefined &&
+					result[1] === undefined &&
+					result[2] === undefined &&
+					result[3] === undefined
+				) {
+					scope = 0;
+					result[scope] = [start, end + 1, end + 1, end + 1];
+				} else if (
+					name === "layer" &&
+					result[1] === undefined &&
+					result[2] === undefined
+				) {
+					scope = 1;
+					result[scope] = [start, end];
+				} else if (name === "supports" && result[2] === undefined) {
+					scope = 2;
+					result[scope] = [start, end];
+				} else {
+					scope = undefined;
+				}
+			}
+
+			balanced++;
+
+			return end;
+		},
+		identifier: (input, start, end) => {
+			if (
+				balanced === 0 &&
+				result[1] === undefined &&
+				result[2] === undefined
+			) {
+				const name = input.slice(start, end).replace(/\\/g, "").toLowerCase();
+
+				if (name === "layer") {
+					result[1] = [start, end];
+					scope = undefined;
+				}
+			}
+
+			return end;
+		},
+		semicolon: (_input, start, end) => {
+			if (balanced === 0) {
+				needStop = true;
+				result[3] = [start, end];
+			}
+
+			return end;
+		}
+	};
+
+	while (pos < input.length) {
+		// Consume comments.
+		pos = consumeComments(input, pos, callbacks);
+
+		// Consume the next input code point.
+		pos++;
+		pos = consumeAToken(input, pos, callbacks);
+
+		if (needStop) {
+			break;
+		}
+	}
+
+	return result;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {[number, number] | undefined} positions of ident sequence
+ */
+module.exports.eatIdentSequence = (input, pos) => {
+	pos = module.exports.eatWhitespaceAndComments(input, pos);
+
+	const start = pos;
+
+	if (
+		_ifThreeCodePointsWouldStartAnIdentSequence(
+			input,
+			pos,
+			input.charCodeAt(pos),
+			input.charCodeAt(pos + 1),
+			input.charCodeAt(pos + 2)
+		)
+	) {
+		return [start, _consumeAnIdentSequence(input, pos, {})];
+	}
+
+	return undefined;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {[number, number, boolean] | undefined} positions of ident sequence or string
+ */
+module.exports.eatIdentSequenceOrString = (input, pos) => {
+	pos = module.exports.eatWhitespaceAndComments(input, pos);
+
+	const start = pos;
+
+	if (
+		input.charCodeAt(pos) === CC_QUOTATION_MARK ||
+		input.charCodeAt(pos) === CC_APOSTROPHE
+	) {
+		return [start, consumeAStringToken(input, pos + 1, {}), false];
+	} else if (
+		_ifThreeCodePointsWouldStartAnIdentSequence(
+			input,
+			pos,
+			input.charCodeAt(pos),
+			input.charCodeAt(pos + 1),
+			input.charCodeAt(pos + 2)
+		)
+	) {
+		return [start, _consumeAnIdentSequence(input, pos, {}), true];
+	}
+
+	return undefined;
+};
+
+/**
+ * @param {string} chars characters
+ * @returns {(input: string, pos: number) => number} function to eat characters
+ */
+module.exports.eatUntil = chars => {
+	const charCodes = Array.from({ length: chars.length }, (_, i) =>
+		chars.charCodeAt(i)
+	);
+	const arr = Array.from(
+		{ length: charCodes.reduce((a, b) => Math.max(a, b), 0) + 1 },
+		() => false
+	);
+	for (const cc of charCodes) {
+		arr[cc] = true;
+	}
+
+	return (input, pos) => {
+		for (;;) {
+			const cc = input.charCodeAt(pos);
+			if (cc < arr.length && arr[cc]) {
+				return pos;
+			}
+			pos++;
+			if (pos === input.length) return pos;
+		}
+	};
+};
