__vite_ssr_exportName__("inlineCodeFilePathCandidate", () => { try { return inlineCodeFilePathCandidate } catch {} });
__vite_ssr_exportName__("safeDecodeURIComponent", () => { try { return safeDecodeURIComponent } catch {} });
__vite_ssr_exportName__("normalizeMarkdownLinkDestination", () => { try { return normalizeMarkdownLinkDestination } catch {} });
__vite_ssr_exportName__("splitMarkdownLinkSearchAndHash", () => { try { return splitMarkdownLinkSearchAndHash } catch {} });
__vite_ssr_exportName__("isMarkdownFileLinkLabel", () => { try { return isMarkdownFileLinkLabel } catch {} });
__vite_ssr_exportName__("isRelativeFilePath", () => { try { return isRelativeFilePath } catch {} });
__vite_ssr_exportName__("parseMarkdownFileLink", () => { try { return parseMarkdownFileLink } catch {} });
__vite_ssr_exportName__("extractInlineCodeSpans", () => { try { return extractInlineCodeSpans } catch {} });
__vite_ssr_exportName__("extractMarkdownLinkHrefs", () => { try { return extractMarkdownLinkHrefs } catch {} });
__vite_ssr_exportName__("resolveMarkdownFileLinkTarget", () => { try { return resolveMarkdownFileLinkTarget } catch {} });
__vite_ssr_exportName__("isWindowsDrivePathHref", () => { try { return isWindowsDrivePathHref } catch {} });
const __vite_ssr_import_0__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/shared/src/path.ts", {"importedNames":["isNetworkPath","isWindowsAbsolutePath","stripSlashPrefixedWindowsDrive","workspaceRelativeFilePath"]});
const __vite_ssr_import_1__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/shared/src/fileLinks.ts", {"importedNames":["formatFilePathPosition","parseFileUrlHref","resolvePathLinkTarget","splitFilePathPosition"]});


const RELATIVE_PATH_PREFIX_PATTERN = /^(~\/|\.{1,2}\/)/;
// The final segment is optional so an explicit folder link may end in `/`
// (`patches/`, `docs/My Folder/`). A bare name with no slash still fails.
const RELATIVE_FILE_PATH_PATTERN = /^(?:[A-Za-z0-9._-]+(?: +[A-Za-z0-9._-]+)*\/)+(?:[A-Za-z0-9._-]+(?: +[A-Za-z0-9._-]+)*(?::\d+){0,2})?$/;
const RELATIVE_FILE_NAME_PATTERN = /^[A-Za-z0-9._-]+(?: +[A-Za-z0-9._-]+)*\.[A-Za-z0-9_-]+(?::\d+){0,2}$/;
const EXTERNAL_SCHEME_PATTERN = /^([A-Za-z][A-Za-z0-9+.-]*):(.*)$/;
const POSITION_SUFFIX_PATTERN = /:\d+(?::\d+)?$/;
const POSITION_ONLY_PATTERN = /^\d+(?::\d+)?$/;
const INLINE_CODE_DISQUALIFIER_PATTERN = /[\s`]/;
const PATH_SEPARATOR_PATTERN = /[\\/]/;
const FILE_EXTENSION_PATTERN = /\.[A-Za-z0-9_-]+$/;
const VERSION_SUFFIX_PATTERN = /\d\.\d[^.]*$/;
const NUMERIC_DOTTED_PATTERN = /^\d+(?:\.\d+)+$/;
const POSIX_FILE_ROOT_PREFIXES = [
	"/Users/",
	"/home/",
	"/tmp/",
	"/var/",
	"/etc/",
	"/opt/",
	"/mnt/",
	"/Volumes/",
	"/private/",
	"/root/",
	"/usr/",
	"/bin/",
	"/sbin/",
	"/lib/",
	"/lib64/",
	"/srv/",
	"/dev/",
	"/proc/",
	"/sys/",
	"/run/",
	"/boot/",
	"/media/",
	"/workspace/",
	"/workspaces/"
];
const EXTENSIONLESS_FILE_NAMES = new Set([
	"Makefile",
	"makefile",
	"GNUmakefile",
	"Dockerfile",
	"Containerfile",
	"Justfile",
	"justfile",
	"Rakefile",
	"Gemfile",
	"Procfile",
	"Brewfile",
	"Caddyfile",
	"Vagrantfile",
	"Jenkinsfile",
	"Podfile",
	"Fastfile",
	"BUILD",
	"WORKSPACE",
	"LICENSE",
	"LICENCE",
	"COPYING",
	"NOTICE",
	"AUTHORS",
	"CONTRIBUTORS",
	"CHANGELOG",
	"README",
	"CODEOWNERS"
]);
const SINGLE_LABEL_HOSTNAMES = new Set(["localhost"]);
const GENERIC_HOSTNAME_TLDS = new Set([
	"com",
	"net",
	"org",
	"io",
	"dev",
	"app",
	"ai",
	"co",
	"edu",
	"gov",
	"mil",
	"info",
	"biz",
	"xyz",
	"me",
	"tv",
	"cc",
	"gg",
	"chat",
	"cloud",
	"site",
	"online",
	"tech",
	"store",
	"link"
]);
const COUNTRY_HOSTNAME_TLDS = new Set([
	"uk",
	"de",
	"fr",
	"nl",
	"se",
	"no",
	"fi",
	"dk",
	"pl",
	"ch",
	"at",
	"be",
	"es",
	"it",
	"pt",
	"eu",
	"us",
	"ca",
	"au",
	"nz",
	"jp",
	"kr",
	"cn",
	"br",
	"ru",
	"mx",
	"ie",
	"cz",
	"tr",
	"sg",
	"hk"
]);
function looksLikeHostname(segment, hasPosition) {
	if (segment.startsWith(".")) return false;
	const lowered = segment.toLowerCase();
	if (SINGLE_LABEL_HOSTNAMES.has(lowered)) return true;
	if (NUMERIC_DOTTED_PATTERN.test(segment)) return true;
	const labels = lowered.split(".");
	const lastLabel = labels.at(-1);
	if (labels.length < 2 || lastLabel === undefined) return false;
	if (GENERIC_HOSTNAME_TLDS.has(lastLabel)) return true;
	return !hasPosition && COUNTRY_HOSTNAME_TLDS.has(lastLabel);
}
function inlineCodeFilePathCandidate(codeText) {
	const trimmed = codeText.trim();
	if (trimmed.length === 0 || INLINE_CODE_DISQUALIFIER_PATTERN.test(trimmed)) return null;
	const candidate = (0,__vite_ssr_import_0__.isWindowsAbsolutePath)(trimmed) ? trimmed : trimmed.replaceAll("\\", "/");
	const hasPosition = POSITION_SUFFIX_PATTERN.test(candidate);
	if (!hasPosition && !PATH_SEPARATOR_PATTERN.test(candidate)) return null;
	const hasExplicitPathShape = RELATIVE_PATH_PREFIX_PATTERN.test(candidate) || candidate.startsWith("/") || (0,__vite_ssr_import_0__.isWindowsAbsolutePath)(candidate);
	if (!hasExplicitPathShape) {
		const withoutPosition = candidate.replace(POSITION_SUFFIX_PATTERN, "");
		// Markdown destinations accept `patches/`. Inline code still needs a
		// file-shaped final segment, so a trailing slash stays plain code.
		if (withoutPosition.endsWith("/")) return null;
		const firstSegment = withoutPosition.split("/")[0] ?? withoutPosition;
		if (looksLikeHostname(firstSegment, hasPosition)) return null;
		const basename = withoutPosition.replace(/[/\\]+$/, "").split(/[\\/]/).at(-1) ?? "";
		if (VERSION_SUFFIX_PATTERN.test(basename)) return null;
		if (!hasPosition && !FILE_EXTENSION_PATTERN.test(basename)) return null;
	};
	return candidate;
};
function safeDecodeURIComponent(value) {
	try {
		return decodeURIComponent(value);
	} catch {
		return value;
	}
};
function normalizeMarkdownLinkDestination(value) {
	const trimmed = value.trim();
	return trimmed.startsWith("<") && trimmed.endsWith(">") ? trimmed.slice(1, -1) : trimmed;
};
function splitMarkdownLinkSearchAndHash(value) {
	const hashIndex = value.indexOf("#");
	const pathWithSearch = hashIndex >= 0 ? value.slice(0, hashIndex) : value;
	const hash = hashIndex >= 0 ? value.slice(hashIndex) : "";
	const queryIndex = pathWithSearch.indexOf("?");
	return {
		path: queryIndex >= 0 ? pathWithSearch.slice(0, queryIndex) : pathWithSearch,
		hash
	};
};
function isMarkdownFileLinkLabel(label, href) {
	const destination = parseMarkdownFileLink(href);
	if (!destination) return false;
	const normalize = (path) => path.replaceAll("\\", "/").replace(/^\.\//, "").replace(/\/+$/, "");
	const labelPosition = (0,__vite_ssr_import_1__.splitFilePathPosition)(label.trim());
	if (labelPosition.line !== undefined && labelPosition.line !== destination.line || labelPosition.column !== undefined && labelPosition.column !== destination.column) {
		return false;
	};
	let labelPath = normalize(labelPosition.path);
	let destinationPath = normalize(destination.path);
	if (labelPath.length === 0) return true;
	if ((0,__vite_ssr_import_0__.isWindowsAbsolutePath)(destination.path)) {
		labelPath = labelPath.toLowerCase();
		destinationPath = destinationPath.toLowerCase();
	};
	return destinationPath === labelPath || destinationPath.endsWith(`/${labelPath}`);
};
function isRelativeFilePath(path) {
	return RELATIVE_PATH_PREFIX_PATTERN.test(path) || !path.startsWith("/") && !(0,__vite_ssr_import_0__.isWindowsAbsolutePath)(path);
};
function looksLikePosixFilesystemPath(path) {
	if (!path.startsWith("/")) return false;
	if (POSIX_FILE_ROOT_PREFIXES.some((prefix) => path.startsWith(prefix))) return true;
	if (POSITION_SUFFIX_PATTERN.test(path)) return true;
	const basename = path.slice(path.lastIndexOf("/") + 1);
	return EXTENSIONLESS_FILE_NAMES.has(basename) || FILE_EXTENSION_PATTERN.test(basename);
}
function looksLikeFilePath(path, authoredPath) {
	if ((0,__vite_ssr_import_0__.isWindowsAbsolutePath)(path) || RELATIVE_PATH_PREFIX_PATTERN.test(path)) return true;
	if (path.startsWith("/")) return looksLikePosixFilesystemPath(authoredPath);
	if (EXTENSIONLESS_FILE_NAMES.has(path)) return true;
	return RELATIVE_FILE_PATH_PATTERN.test(authoredPath) || RELATIVE_FILE_NAME_PATTERN.test(path);
}
function hasExternalScheme(path) {
	if ((0,__vite_ssr_import_0__.isWindowsAbsolutePath)(path)) return false;
	const match = path.match(EXTERNAL_SCHEME_PATTERN);
	if (!match) return false;
	const rest = match[2] ?? "";
	if (rest.startsWith("//")) return true;
	return !POSITION_ONLY_PATTERN.test(rest);
}
function parseMarkdownFileLink(href) {
	const normalized = normalizeMarkdownLinkDestination(href);
	if (normalized.length === 0 || normalized.startsWith("#") || normalized.startsWith("//")) {
		return null;
	};
	const source = (normalized.toLowerCase().startsWith("file:") ? (0,__vite_ssr_import_1__.parseFileUrlHref)(normalized) : null) ?? splitMarkdownLinkSearchAndHash(normalized);
	const path = (0,__vite_ssr_import_0__.stripSlashPrefixedWindowsDrive)(safeDecodeURIComponent(source.path.trim()));
	const hash = safeDecodeURIComponent(source.hash.trim());
	if (path.length === 0 || hasExternalScheme(path)) return null;
	const position = (0,__vite_ssr_import_1__.splitFilePathPosition)(path, hash);
	return looksLikeFilePath(position.path, path) ? position : null;
};
const FENCED_CODE_SEGMENT_PATTERN = /(```[\s\S]*?(?:```|$))/;
const INLINE_CODE_SPAN_PATTERN = /`([^`\n]+)`/g;
function extractInlineCodeSpans(text) {
	const spans = [];
	const segments = text.split(FENCED_CODE_SEGMENT_PATTERN);
	for (let index = 0; index < segments.length; index += 2) {
		for (const match of (segments[index] ?? "").matchAll(INLINE_CODE_SPAN_PATTERN)) {
			const span = match[1]?.trim();
			if (span) spans.push(span);
		}
	};
	return spans;
};
function markdownRunEndFinder(markdown, delimiter) {
	let runStart = -1;
	let runEnd = -1;
	return (start) => {
		if (start >= runStart && start <= runEnd) return runEnd;
		delimiter.lastIndex = start;
		runStart = start;
		runEnd = delimiter.exec(markdown)?.index ?? markdown.length;
		return runEnd;
	};
}
function markdownLinkTailScanner(markdown) {
	const whitespaceEnd = markdownRunEndFinder(markdown, /\S/g);
	const titleEnd = markdownRunEndFinder(markdown, /["']/g);
	const titleWhitespaceEnd = markdownRunEndFinder(markdown, /\S/g);
	return (start) => {
		const end = whitespaceEnd(start);
		if (markdown[end] === ")") return end + 1;
		if (end === start || markdown[end] !== "\"" && markdown[end] !== "'") return null;
		const quoteEnd = titleEnd(end + 1);
		if (quoteEnd === markdown.length) return null;
		const close = titleWhitespaceEnd(quoteEnd + 1);
		return markdown[close] === ")" ? close + 1 : null;
	};
}
function markdownLinkDestinationScanner(markdown) {
	const whitespaceEnd = markdownRunEndFinder(markdown, /\S/g);
	const angleEnd = markdownRunEndFinder(markdown, /[>\n]/g);
	const bareEnd = markdownRunEndFinder(markdown, /[\s)]/g);
	// Separate caches keep scans moving forward when angle destinations fall back to bare ones.
	const angleTail = markdownLinkTailScanner(markdown);
	const bareTail = markdownLinkTailScanner(markdown);
	return (start) => {
		if (markdown[start] !== "(") return null;
		const hrefStart = whitespaceEnd(start + 1);
		if (markdown[hrefStart] === "<") {
			const hrefEnd = angleEnd(hrefStart + 1);
			if (hrefEnd > hrefStart + 1 && markdown[hrefEnd] === ">") {
				const end = angleTail(hrefEnd + 1);
				if (end !== null) return {
					hrefStart: hrefStart + 1,
					hrefEnd,
					end
				};
			}
		};
		const hrefEnd = bareEnd(hrefStart);
		if (hrefEnd === hrefStart) return null;
		const end = bareTail(hrefEnd);
		return end === null ? null : {
			hrefStart,
			hrefEnd,
			end
		};
	};
}
function extractMarkdownLinkHrefs(markdown) {
	const hrefs = [];
	const scanDestination = markdownLinkDestinationScanner(markdown);
	let cursor = 0;
	while (cursor < markdown.length) {
		const labelStart = markdown.indexOf("[", cursor);
		if (labelStart === -1) break;
		const labelEnd = markdown.indexOf("]", labelStart + 1);
		if (labelEnd === -1) break;
		// Skip a failed label once; nested openings share its closing bracket.
		cursor = labelEnd + 1;
		const destination = scanDestination(cursor);
		if (!destination) continue;
		cursor = destination.end;
		const href = markdown.slice(destination.hrefStart, destination.hrefEnd).trim();
		if (href) hrefs.push(href);
	};
	return hrefs;
};
function resolveMarkdownFileLinkTarget(href, cwd, baseDir = cwd) {
	if (!href) return null;
	const target = parseMarkdownFileLink(href);
	if (!target) return null;
	const pathWithPosition = (0,__vite_ssr_import_1__.formatFilePathPosition)(target);
	if (!isRelativeFilePath(pathWithPosition)) {
		// Opening a network path makes Windows sign in to its host with the user's
		// NTLM credentials, so only the project's own share becomes a file link.
		return (0,__vite_ssr_import_0__.isNetworkPath)(target.path) && (0,__vite_ssr_import_0__.workspaceRelativeFilePath)(target.path, cwd) === null ? null : pathWithPosition;
	};
	if (!baseDir) return null;
	return (0,__vite_ssr_import_1__.resolvePathLinkTarget)(pathWithPosition, baseDir);
};
function isWindowsDrivePathHref(href) {
	return /^[A-Za-z]:[\\/]/.test(safeDecodeURIComponent(href));
}
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,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LFVBQThCLEtBQ2Y7Q0FDZixJQUFJLENBQUMsTUFBTSxPQUFPO0NBQ2xCLE1BQU0sU0FBUyxzQkFBc0IsSUFBSTtDQUN6QyxJQUFJLENBQUMsUUFBUSxPQUFPO0NBRXBCLE1BQU0sbUJBQW1CLGlEQUF1QixNQUFNO0NBQ3RELElBQUksQ0FBQyxtQkFBbUIsZ0JBQWdCLEdBQUc7OztFQUd6QyxPQUFPLHdDQUFjLE9BQU8sSUFBSSxLQUFLLG9EQUEwQixPQUFPLE1BQU0sR0FBRyxNQUFNLE9BQ2pGLE9BQ0E7Q0FDTjtDQUNBLElBQUksQ0FBQyxTQUFTLE9BQU87Q0FDckIsT0FBTyxnREFBc0Isa0JBQWtCLE9BQU87QUFDeEQ7QUFFTyxTQUFTLHVCQUF1QixNQUF1QjtDQUM1RCxPQUFPLGtCQUFrQixLQUFLLHVCQUF1QixJQUFJLENBQUM7QUFDNUQiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIm1hcmtkb3duTGlua3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgaXNOZXR3b3JrUGF0aCxcbiAgaXNXaW5kb3dzQWJzb2x1dGVQYXRoLFxuICBzdHJpcFNsYXNoUHJlZml4ZWRXaW5kb3dzRHJpdmUsXG4gIHdvcmtzcGFjZVJlbGF0aXZlRmlsZVBhdGgsXG59IGZyb20gXCIuL3BhdGgudHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgRmlsZVBhdGhQb3NpdGlvbixcbiAgZm9ybWF0RmlsZVBhdGhQb3NpdGlvbixcbiAgcGFyc2VGaWxlVXJsSHJlZixcbiAgcmVzb2x2ZVBhdGhMaW5rVGFyZ2V0LFxuICBzcGxpdEZpbGVQYXRoUG9zaXRpb24sXG59IGZyb20gXCIuL2ZpbGVMaW5rcy50c1wiO1xuXG5jb25zdCBSRUxBVElWRV9QQVRIX1BSRUZJWF9QQVRURVJOID0gL14oflxcL3xcXC57MSwyfVxcLykvO1xuXG4vLyBUaGUgZmluYWwgc2VnbWVudCBpcyBvcHRpb25hbCBzbyBhbiBleHBsaWNpdCBmb2xkZXIgbGluayBtYXkgZW5kIGluIGAvYFxuLy8gKGBwYXRjaGVzL2AsIGBkb2NzL015IEZvbGRlci9gKS4gQSBiYXJlIG5hbWUgd2l0aCBubyBzbGFzaCBzdGlsbCBmYWlscy5cbmNvbnN0IFJFTEFUSVZFX0ZJTEVfUEFUSF9QQVRURVJOID1cbiAgL14oPzpbQS1aYS16MC05Ll8tXSsoPzogK1tBLVphLXowLTkuXy1dKykqXFwvKSsoPzpbQS1aYS16MC05Ll8tXSsoPzogK1tBLVphLXowLTkuXy1dKykqKD86OlxcZCspezAsMn0pPyQvO1xuXG5jb25zdCBSRUxBVElWRV9GSUxFX05BTUVfUEFUVEVSTiA9XG4gIC9eW0EtWmEtejAtOS5fLV0rKD86ICtbQS1aYS16MC05Ll8tXSspKlxcLltBLVphLXowLTlfLV0rKD86OlxcZCspezAsMn0kLztcblxuY29uc3QgRVhURVJOQUxfU0NIRU1FX1BBVFRFUk4gPSAvXihbQS1aYS16XVtBLVphLXowLTkrLi1dKik6KC4qKSQvO1xuXG5jb25zdCBQT1NJVElPTl9TVUZGSVhfUEFUVEVSTiA9IC86XFxkKyg/OjpcXGQrKT8kLztcblxuY29uc3QgUE9TSVRJT05fT05MWV9QQVRURVJOID0gL15cXGQrKD86OlxcZCspPyQvO1xuXG5jb25zdCBJTkxJTkVfQ09ERV9ESVNRVUFMSUZJRVJfUEFUVEVSTiA9IC9bXFxzYF0vO1xuXG5jb25zdCBQQVRIX1NFUEFSQVRPUl9QQVRURVJOID0gL1tcXFxcL10vO1xuXG5jb25zdCBGSUxFX0VYVEVOU0lPTl9QQVRURVJOID0gL1xcLltBLVphLXowLTlfLV0rJC87XG5jb25zdCBWRVJTSU9OX1NVRkZJWF9QQVRURVJOID0gL1xcZFxcLlxcZFteLl0qJC87XG5jb25zdCBOVU1FUklDX0RPVFRFRF9QQVRURVJOID0gL15cXGQrKD86XFwuXFxkKykrJC87XG5cbmNvbnN0IFBPU0lYX0ZJTEVfUk9PVF9QUkVGSVhFUyA9IFtcbiAgXCIvVXNlcnMvXCIsXG4gIFwiL2hvbWUvXCIsXG4gIFwiL3RtcC9cIixcbiAgXCIvdmFyL1wiLFxuICBcIi9ldGMvXCIsXG4gIFwiL29wdC9cIixcbiAgXCIvbW50L1wiLFxuICBcIi9Wb2x1bWVzL1wiLFxuICBcIi9wcml2YXRlL1wiLFxuICBcIi9yb290L1wiLFxuICBcIi91c3IvXCIsXG4gIFwiL2Jpbi9cIixcbiAgXCIvc2Jpbi9cIixcbiAgXCIvbGliL1wiLFxuICBcIi9saWI2NC9cIixcbiAgXCIvc3J2L1wiLFxuICBcIi9kZXYvXCIsXG4gIFwiL3Byb2MvXCIsXG4gIFwiL3N5cy9cIixcbiAgXCIvcnVuL1wiLFxuICBcIi9ib290L1wiLFxuICBcIi9tZWRpYS9cIixcbiAgXCIvd29ya3NwYWNlL1wiLFxuICBcIi93b3Jrc3BhY2VzL1wiLFxuXSBhcyBjb25zdDtcblxuY29uc3QgRVhURU5TSU9OTEVTU19GSUxFX05BTUVTID0gbmV3IFNldChbXG4gIFwiTWFrZWZpbGVcIixcbiAgXCJtYWtlZmlsZVwiLFxuICBcIkdOVW1ha2VmaWxlXCIsXG4gIFwiRG9ja2VyZmlsZVwiLFxuICBcIkNvbnRhaW5lcmZpbGVcIixcbiAgXCJKdXN0ZmlsZVwiLFxuICBcImp1c3RmaWxlXCIsXG4gIFwiUmFrZWZpbGVcIixcbiAgXCJHZW1maWxlXCIsXG4gIFwiUHJvY2ZpbGVcIixcbiAgXCJCcmV3ZmlsZVwiLFxuICBcIkNhZGR5ZmlsZVwiLFxuICBcIlZhZ3JhbnRmaWxlXCIsXG4gIFwiSmVua2luc2ZpbGVcIixcbiAgXCJQb2RmaWxlXCIsXG4gIFwiRmFzdGZpbGVcIixcbiAgXCJCVUlMRFwiLFxuICBcIldPUktTUEFDRVwiLFxuICBcIkxJQ0VOU0VcIixcbiAgXCJMSUNFTkNFXCIsXG4gIFwiQ09QWUlOR1wiLFxuICBcIk5PVElDRVwiLFxuICBcIkFVVEhPUlNcIixcbiAgXCJDT05UUklCVVRPUlNcIixcbiAgXCJDSEFOR0VMT0dcIixcbiAgXCJSRUFETUVcIixcbiAgXCJDT0RFT1dORVJTXCIsXG5dKTtcblxuY29uc3QgU0lOR0xFX0xBQkVMX0hPU1ROQU1FUyA9IG5ldyBTZXQoW1wibG9jYWxob3N0XCJdKTtcblxuY29uc3QgR0VORVJJQ19IT1NUTkFNRV9UTERTID0gbmV3IFNldChbXG4gIFwiY29tXCIsXG4gIFwibmV0XCIsXG4gIFwib3JnXCIsXG4gIFwiaW9cIixcbiAgXCJkZXZcIixcbiAgXCJhcHBcIixcbiAgXCJhaVwiLFxuICBcImNvXCIsXG4gIFwiZWR1XCIsXG4gIFwiZ292XCIsXG4gIFwibWlsXCIsXG4gIFwiaW5mb1wiLFxuICBcImJpelwiLFxuICBcInh5elwiLFxuICBcIm1lXCIsXG4gIFwidHZcIixcbiAgXCJjY1wiLFxuICBcImdnXCIsXG4gIFwiY2hhdFwiLFxuICBcImNsb3VkXCIsXG4gIFwic2l0ZVwiLFxuICBcIm9ubGluZVwiLFxuICBcInRlY2hcIixcbiAgXCJzdG9yZVwiLFxuICBcImxpbmtcIixcbl0pO1xuXG5jb25zdCBDT1VOVFJZX0hPU1ROQU1FX1RMRFMgPSBuZXcgU2V0KFtcbiAgXCJ1a1wiLFxuICBcImRlXCIsXG4gIFwiZnJcIixcbiAgXCJubFwiLFxuICBcInNlXCIsXG4gIFwibm9cIixcbiAgXCJmaVwiLFxuICBcImRrXCIsXG4gIFwicGxcIixcbiAgXCJjaFwiLFxuICBcImF0XCIsXG4gIFwiYmVcIixcbiAgXCJlc1wiLFxuICBcIml0XCIsXG4gIFwicHRcIixcbiAgXCJldVwiLFxuICBcInVzXCIsXG4gIFwiY2FcIixcbiAgXCJhdVwiLFxuICBcIm56XCIsXG4gIFwianBcIixcbiAgXCJrclwiLFxuICBcImNuXCIsXG4gIFwiYnJcIixcbiAgXCJydVwiLFxuICBcIm14XCIsXG4gIFwiaWVcIixcbiAgXCJjelwiLFxuICBcInRyXCIsXG4gIFwic2dcIixcbiAgXCJoa1wiLFxuXSk7XG5cbmZ1bmN0aW9uIGxvb2tzTGlrZUhvc3RuYW1lKHNlZ21lbnQ6IHN0cmluZywgaGFzUG9zaXRpb246IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgaWYgKHNlZ21lbnQuc3RhcnRzV2l0aChcIi5cIikpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbG93ZXJlZCA9IHNlZ21lbnQudG9Mb3dlckNhc2UoKTtcbiAgaWYgKFNJTkdMRV9MQUJFTF9IT1NUTkFNRVMuaGFzKGxvd2VyZWQpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE5VTUVSSUNfRE9UVEVEX1BBVFRFUk4udGVzdChzZWdtZW50KSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGxhYmVscyA9IGxvd2VyZWQuc3BsaXQoXCIuXCIpO1xuICBjb25zdCBsYXN0TGFiZWwgPSBsYWJlbHMuYXQoLTEpO1xuICBpZiAobGFiZWxzLmxlbmd0aCA8IDIgfHwgbGFzdExhYmVsID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgaWYgKEdFTkVSSUNfSE9TVE5BTUVfVExEUy5oYXMobGFzdExhYmVsKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhaGFzUG9zaXRpb24gJiYgQ09VTlRSWV9IT1NUTkFNRV9UTERTLmhhcyhsYXN0TGFiZWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5saW5lQ29kZUZpbGVQYXRoQ2FuZGlkYXRlKGNvZGVUZXh0OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgdHJpbW1lZCA9IGNvZGVUZXh0LnRyaW0oKTtcbiAgaWYgKHRyaW1tZWQubGVuZ3RoID09PSAwIHx8IElOTElORV9DT0RFX0RJU1FVQUxJRklFUl9QQVRURVJOLnRlc3QodHJpbW1lZCkpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IGlzV2luZG93c0Fic29sdXRlUGF0aCh0cmltbWVkKSA/IHRyaW1tZWQgOiB0cmltbWVkLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKTtcbiAgY29uc3QgaGFzUG9zaXRpb24gPSBQT1NJVElPTl9TVUZGSVhfUEFUVEVSTi50ZXN0KGNhbmRpZGF0ZSk7XG4gIGlmICghaGFzUG9zaXRpb24gJiYgIVBBVEhfU0VQQVJBVE9SX1BBVFRFUk4udGVzdChjYW5kaWRhdGUpKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBoYXNFeHBsaWNpdFBhdGhTaGFwZSA9XG4gICAgUkVMQVRJVkVfUEFUSF9QUkVGSVhfUEFUVEVSTi50ZXN0KGNhbmRpZGF0ZSkgfHxcbiAgICBjYW5kaWRhdGUuc3RhcnRzV2l0aChcIi9cIikgfHxcbiAgICBpc1dpbmRvd3NBYnNvbHV0ZVBhdGgoY2FuZGlkYXRlKTtcbiAgaWYgKCFoYXNFeHBsaWNpdFBhdGhTaGFwZSkge1xuICAgIGNvbnN0IHdpdGhvdXRQb3NpdGlvbiA9IGNhbmRpZGF0ZS5yZXBsYWNlKFBPU0lUSU9OX1NVRkZJWF9QQVRURVJOLCBcIlwiKTtcbiAgICAvLyBNYXJrZG93biBkZXN0aW5hdGlvbnMgYWNjZXB0IGBwYXRjaGVzL2AuIElubGluZSBjb2RlIHN0aWxsIG5lZWRzIGFcbiAgICAvLyBmaWxlLXNoYXBlZCBmaW5hbCBzZWdtZW50LCBzbyBhIHRyYWlsaW5nIHNsYXNoIHN0YXlzIHBsYWluIGNvZGUuXG4gICAgaWYgKHdpdGhvdXRQb3NpdGlvbi5lbmRzV2l0aChcIi9cIikpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGZpcnN0U2VnbWVudCA9IHdpdGhvdXRQb3NpdGlvbi5zcGxpdChcIi9cIilbMF0gPz8gd2l0aG91dFBvc2l0aW9uO1xuICAgIGlmIChsb29rc0xpa2VIb3N0bmFtZShmaXJzdFNlZ21lbnQsIGhhc1Bvc2l0aW9uKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgYmFzZW5hbWUgPVxuICAgICAgd2l0aG91dFBvc2l0aW9uXG4gICAgICAgIC5yZXBsYWNlKC9bL1xcXFxdKyQvLCBcIlwiKVxuICAgICAgICAuc3BsaXQoL1tcXFxcL10vKVxuICAgICAgICAuYXQoLTEpID8/IFwiXCI7XG4gICAgaWYgKFZFUlNJT05fU1VGRklYX1BBVFRFUk4udGVzdChiYXNlbmFtZSkpIHJldHVybiBudWxsO1xuICAgIGlmICghaGFzUG9zaXRpb24gJiYgIUZJTEVfRVhURU5TSU9OX1BBVFRFUk4udGVzdChiYXNlbmFtZSkpIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBjYW5kaWRhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYWZlRGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU1hcmtkb3duTGlua0Rlc3RpbmF0aW9uKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpO1xuICByZXR1cm4gdHJpbW1lZC5zdGFydHNXaXRoKFwiPFwiKSAmJiB0cmltbWVkLmVuZHNXaXRoKFwiPlwiKSA/IHRyaW1tZWQuc2xpY2UoMSwgLTEpIDogdHJpbW1lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0TWFya2Rvd25MaW5rU2VhcmNoQW5kSGFzaCh2YWx1ZTogc3RyaW5nKToge1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhhc2g6IHN0cmluZztcbn0ge1xuICBjb25zdCBoYXNoSW5kZXggPSB2YWx1ZS5pbmRleE9mKFwiI1wiKTtcbiAgY29uc3QgcGF0aFdpdGhTZWFyY2ggPSBoYXNoSW5kZXggPj0gMCA/IHZhbHVlLnNsaWNlKDAsIGhhc2hJbmRleCkgOiB2YWx1ZTtcbiAgY29uc3QgaGFzaCA9IGhhc2hJbmRleCA+PSAwID8gdmFsdWUuc2xpY2UoaGFzaEluZGV4KSA6IFwiXCI7XG4gIGNvbnN0IHF1ZXJ5SW5kZXggPSBwYXRoV2l0aFNlYXJjaC5pbmRleE9mKFwiP1wiKTtcbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBxdWVyeUluZGV4ID49IDAgPyBwYXRoV2l0aFNlYXJjaC5zbGljZSgwLCBxdWVyeUluZGV4KSA6IHBhdGhXaXRoU2VhcmNoLFxuICAgIGhhc2gsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hcmtkb3duRmlsZUxpbmtMYWJlbChsYWJlbDogc3RyaW5nLCBocmVmOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBwYXJzZU1hcmtkb3duRmlsZUxpbmsoaHJlZik7XG4gIGlmICghZGVzdGluYXRpb24pIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgbm9ybWFsaXplID0gKHBhdGg6IHN0cmluZykgPT5cbiAgICBwYXRoLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKS5yZXBsYWNlKC9eXFwuXFwvLywgXCJcIikucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgY29uc3QgbGFiZWxQb3NpdGlvbiA9IHNwbGl0RmlsZVBhdGhQb3NpdGlvbihsYWJlbC50cmltKCkpO1xuICBpZiAoXG4gICAgKGxhYmVsUG9zaXRpb24ubGluZSAhPT0gdW5kZWZpbmVkICYmIGxhYmVsUG9zaXRpb24ubGluZSAhPT0gZGVzdGluYXRpb24ubGluZSkgfHxcbiAgICAobGFiZWxQb3NpdGlvbi5jb2x1bW4gIT09IHVuZGVmaW5lZCAmJiBsYWJlbFBvc2l0aW9uLmNvbHVtbiAhPT0gZGVzdGluYXRpb24uY29sdW1uKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGxhYmVsUGF0aCA9IG5vcm1hbGl6ZShsYWJlbFBvc2l0aW9uLnBhdGgpO1xuICBsZXQgZGVzdGluYXRpb25QYXRoID0gbm9ybWFsaXplKGRlc3RpbmF0aW9uLnBhdGgpO1xuICBpZiAobGFiZWxQYXRoLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gIGlmIChpc1dpbmRvd3NBYnNvbHV0ZVBhdGgoZGVzdGluYXRpb24ucGF0aCkpIHtcbiAgICBsYWJlbFBhdGggPSBsYWJlbFBhdGgudG9Mb3dlckNhc2UoKTtcbiAgICBkZXN0aW5hdGlvblBhdGggPSBkZXN0aW5hdGlvblBhdGgudG9Mb3dlckNhc2UoKTtcbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb25QYXRoID09PSBsYWJlbFBhdGggfHwgZGVzdGluYXRpb25QYXRoLmVuZHNXaXRoKGAvJHtsYWJlbFBhdGh9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbGF0aXZlRmlsZVBhdGgocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgUkVMQVRJVkVfUEFUSF9QUkVGSVhfUEFUVEVSTi50ZXN0KHBhdGgpIHx8XG4gICAgKCFwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpICYmICFpc1dpbmRvd3NBYnNvbHV0ZVBhdGgocGF0aCkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGxvb2tzTGlrZVBvc2l4RmlsZXN5c3RlbVBhdGgocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghcGF0aC5zdGFydHNXaXRoKFwiL1wiKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoUE9TSVhfRklMRV9ST09UX1BSRUZJWEVTLnNvbWUoKHByZWZpeCkgPT4gcGF0aC5zdGFydHNXaXRoKHByZWZpeCkpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKFBPU0lUSU9OX1NVRkZJWF9QQVRURVJOLnRlc3QocGF0aCkpIHJldHVybiB0cnVlO1xuICBjb25zdCBiYXNlbmFtZSA9IHBhdGguc2xpY2UocGF0aC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcbiAgcmV0dXJuIEVYVEVOU0lPTkxFU1NfRklMRV9OQU1FUy5oYXMoYmFzZW5hbWUpIHx8IEZJTEVfRVhURU5TSU9OX1BBVFRFUk4udGVzdChiYXNlbmFtZSk7XG59XG5cbmZ1bmN0aW9uIGxvb2tzTGlrZUZpbGVQYXRoKHBhdGg6IHN0cmluZywgYXV0aG9yZWRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGlzV2luZG93c0Fic29sdXRlUGF0aChwYXRoKSB8fCBSRUxBVElWRV9QQVRIX1BSRUZJWF9QQVRURVJOLnRlc3QocGF0aCkpIHJldHVybiB0cnVlO1xuICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkgcmV0dXJuIGxvb2tzTGlrZVBvc2l4RmlsZXN5c3RlbVBhdGgoYXV0aG9yZWRQYXRoKTtcbiAgaWYgKEVYVEVOU0lPTkxFU1NfRklMRV9OQU1FUy5oYXMocGF0aCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gUkVMQVRJVkVfRklMRV9QQVRIX1BBVFRFUk4udGVzdChhdXRob3JlZFBhdGgpIHx8IFJFTEFUSVZFX0ZJTEVfTkFNRV9QQVRURVJOLnRlc3QocGF0aCk7XG59XG5cbmZ1bmN0aW9uIGhhc0V4dGVybmFsU2NoZW1lKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoaXNXaW5kb3dzQWJzb2x1dGVQYXRoKHBhdGgpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IG1hdGNoID0gcGF0aC5tYXRjaChFWFRFUk5BTF9TQ0hFTUVfUEFUVEVSTik7XG4gIGlmICghbWF0Y2gpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcmVzdCA9IG1hdGNoWzJdID8/IFwiXCI7XG4gIGlmIChyZXN0LnN0YXJ0c1dpdGgoXCIvL1wiKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhUE9TSVRJT05fT05MWV9QQVRURVJOLnRlc3QocmVzdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1hcmtkb3duRmlsZUxpbmsoaHJlZjogc3RyaW5nKTogRmlsZVBhdGhQb3NpdGlvbiB8IG51bGwge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplTWFya2Rvd25MaW5rRGVzdGluYXRpb24oaHJlZik7XG4gIGlmIChub3JtYWxpemVkLmxlbmd0aCA9PT0gMCB8fCBub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCIjXCIpIHx8IG5vcm1hbGl6ZWQuc3RhcnRzV2l0aChcIi8vXCIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzb3VyY2UgPVxuICAgIChub3JtYWxpemVkLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcImZpbGU6XCIpID8gcGFyc2VGaWxlVXJsSHJlZihub3JtYWxpemVkKSA6IG51bGwpID8/XG4gICAgc3BsaXRNYXJrZG93bkxpbmtTZWFyY2hBbmRIYXNoKG5vcm1hbGl6ZWQpO1xuICBjb25zdCBwYXRoID0gc3RyaXBTbGFzaFByZWZpeGVkV2luZG93c0RyaXZlKHNhZmVEZWNvZGVVUklDb21wb25lbnQoc291cmNlLnBhdGgudHJpbSgpKSk7XG4gIGNvbnN0IGhhc2ggPSBzYWZlRGVjb2RlVVJJQ29tcG9uZW50KHNvdXJjZS5oYXNoLnRyaW0oKSk7XG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCB8fCBoYXNFeHRlcm5hbFNjaGVtZShwYXRoKSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcG9zaXRpb24gPSBzcGxpdEZpbGVQYXRoUG9zaXRpb24ocGF0aCwgaGFzaCk7XG4gIHJldHVybiBsb29rc0xpa2VGaWxlUGF0aChwb3NpdGlvbi5wYXRoLCBwYXRoKSA/IHBvc2l0aW9uIDogbnVsbDtcbn1cblxuY29uc3QgRkVOQ0VEX0NPREVfU0VHTUVOVF9QQVRURVJOID0gLyhgYGBbXFxzXFxTXSo/KD86YGBgfCQpKS87XG5cbmNvbnN0IElOTElORV9DT0RFX1NQQU5fUEFUVEVSTiA9IC9gKFteYFxcbl0rKWAvZztcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJbmxpbmVDb2RlU3BhbnModGV4dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBzcGFuczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2VnbWVudHMgPSB0ZXh0LnNwbGl0KEZFTkNFRF9DT0RFX1NFR01FTlRfUEFUVEVSTik7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzZWdtZW50cy5sZW5ndGg7IGluZGV4ICs9IDIpIHtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIChzZWdtZW50c1tpbmRleF0gPz8gXCJcIikubWF0Y2hBbGwoSU5MSU5FX0NPREVfU1BBTl9QQVRURVJOKSkge1xuICAgICAgY29uc3Qgc3BhbiA9IG1hdGNoWzFdPy50cmltKCk7XG4gICAgICBpZiAoc3Bhbikgc3BhbnMucHVzaChzcGFuKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNwYW5zO1xufVxuXG5mdW5jdGlvbiBtYXJrZG93blJ1bkVuZEZpbmRlcihtYXJrZG93bjogc3RyaW5nLCBkZWxpbWl0ZXI6IFJlZ0V4cCkge1xuICBsZXQgcnVuU3RhcnQgPSAtMTtcbiAgbGV0IHJ1bkVuZCA9IC0xO1xuICByZXR1cm4gKHN0YXJ0OiBudW1iZXIpID0+IHtcbiAgICBpZiAoc3RhcnQgPj0gcnVuU3RhcnQgJiYgc3RhcnQgPD0gcnVuRW5kKSByZXR1cm4gcnVuRW5kO1xuICAgIGRlbGltaXRlci5sYXN0SW5kZXggPSBzdGFydDtcbiAgICBydW5TdGFydCA9IHN0YXJ0O1xuICAgIHJ1bkVuZCA9IGRlbGltaXRlci5leGVjKG1hcmtkb3duKT8uaW5kZXggPz8gbWFya2Rvd24ubGVuZ3RoO1xuICAgIHJldHVybiBydW5FbmQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG1hcmtkb3duTGlua1RhaWxTY2FubmVyKG1hcmtkb3duOiBzdHJpbmcpIHtcbiAgY29uc3Qgd2hpdGVzcGFjZUVuZCA9IG1hcmtkb3duUnVuRW5kRmluZGVyKG1hcmtkb3duLCAvXFxTL2cpO1xuICBjb25zdCB0aXRsZUVuZCA9IG1hcmtkb3duUnVuRW5kRmluZGVyKG1hcmtkb3duLCAvW1wiJ10vZyk7XG4gIGNvbnN0IHRpdGxlV2hpdGVzcGFjZUVuZCA9IG1hcmtkb3duUnVuRW5kRmluZGVyKG1hcmtkb3duLCAvXFxTL2cpO1xuICByZXR1cm4gKHN0YXJ0OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBlbmQgPSB3aGl0ZXNwYWNlRW5kKHN0YXJ0KTtcbiAgICBpZiAobWFya2Rvd25bZW5kXSA9PT0gXCIpXCIpIHJldHVybiBlbmQgKyAxO1xuICAgIGlmIChlbmQgPT09IHN0YXJ0IHx8IChtYXJrZG93bltlbmRdICE9PSAnXCInICYmIG1hcmtkb3duW2VuZF0gIT09IFwiJ1wiKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcXVvdGVFbmQgPSB0aXRsZUVuZChlbmQgKyAxKTtcbiAgICBpZiAocXVvdGVFbmQgPT09IG1hcmtkb3duLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY2xvc2UgPSB0aXRsZVdoaXRlc3BhY2VFbmQocXVvdGVFbmQgKyAxKTtcbiAgICByZXR1cm4gbWFya2Rvd25bY2xvc2VdID09PSBcIilcIiA/IGNsb3NlICsgMSA6IG51bGw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG1hcmtkb3duTGlua0Rlc3RpbmF0aW9uU2Nhbm5lcihtYXJrZG93bjogc3RyaW5nKSB7XG4gIGNvbnN0IHdoaXRlc3BhY2VFbmQgPSBtYXJrZG93blJ1bkVuZEZpbmRlcihtYXJrZG93biwgL1xcUy9nKTtcbiAgY29uc3QgYW5nbGVFbmQgPSBtYXJrZG93blJ1bkVuZEZpbmRlcihtYXJrZG93biwgL1s+XFxuXS9nKTtcbiAgY29uc3QgYmFyZUVuZCA9IG1hcmtkb3duUnVuRW5kRmluZGVyKG1hcmtkb3duLCAvW1xccyldL2cpO1xuICAvLyBTZXBhcmF0ZSBjYWNoZXMga2VlcCBzY2FucyBtb3ZpbmcgZm9yd2FyZCB3aGVuIGFuZ2xlIGRlc3RpbmF0aW9ucyBmYWxsIGJhY2sgdG8gYmFyZSBvbmVzLlxuICBjb25zdCBhbmdsZVRhaWwgPSBtYXJrZG93bkxpbmtUYWlsU2Nhbm5lcihtYXJrZG93bik7XG4gIGNvbnN0IGJhcmVUYWlsID0gbWFya2Rvd25MaW5rVGFpbFNjYW5uZXIobWFya2Rvd24pO1xuICByZXR1cm4gKHN0YXJ0OiBudW1iZXIpID0+IHtcbiAgICBpZiAobWFya2Rvd25bc3RhcnRdICE9PSBcIihcIikgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaHJlZlN0YXJ0ID0gd2hpdGVzcGFjZUVuZChzdGFydCArIDEpO1xuICAgIGlmIChtYXJrZG93bltocmVmU3RhcnRdID09PSBcIjxcIikge1xuICAgICAgY29uc3QgaHJlZkVuZCA9IGFuZ2xlRW5kKGhyZWZTdGFydCArIDEpO1xuICAgICAgaWYgKGhyZWZFbmQgPiBocmVmU3RhcnQgKyAxICYmIG1hcmtkb3duW2hyZWZFbmRdID09PSBcIj5cIikge1xuICAgICAgICBjb25zdCBlbmQgPSBhbmdsZVRhaWwoaHJlZkVuZCArIDEpO1xuICAgICAgICBpZiAoZW5kICE9PSBudWxsKSByZXR1cm4geyBocmVmU3RhcnQ6IGhyZWZTdGFydCArIDEsIGhyZWZFbmQsIGVuZCB9O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBocmVmRW5kID0gYmFyZUVuZChocmVmU3RhcnQpO1xuICAgIGlmIChocmVmRW5kID09PSBocmVmU3RhcnQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGVuZCA9IGJhcmVUYWlsKGhyZWZFbmQpO1xuICAgIHJldHVybiBlbmQgPT09IG51bGwgPyBudWxsIDogeyBocmVmU3RhcnQsIGhyZWZFbmQsIGVuZCB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1hcmtkb3duTGlua0hyZWZzKG1hcmtkb3duOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhyZWZzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzY2FuRGVzdGluYXRpb24gPSBtYXJrZG93bkxpbmtEZXN0aW5hdGlvblNjYW5uZXIobWFya2Rvd24pO1xuICBsZXQgY3Vyc29yID0gMDtcbiAgd2hpbGUgKGN1cnNvciA8IG1hcmtkb3duLmxlbmd0aCkge1xuICAgIGNvbnN0IGxhYmVsU3RhcnQgPSBtYXJrZG93bi5pbmRleE9mKFwiW1wiLCBjdXJzb3IpO1xuICAgIGlmIChsYWJlbFN0YXJ0ID09PSAtMSkgYnJlYWs7XG4gICAgY29uc3QgbGFiZWxFbmQgPSBtYXJrZG93bi5pbmRleE9mKFwiXVwiLCBsYWJlbFN0YXJ0ICsgMSk7XG4gICAgaWYgKGxhYmVsRW5kID09PSAtMSkgYnJlYWs7XG5cbiAgICAvLyBTa2lwIGEgZmFpbGVkIGxhYmVsIG9uY2U7IG5lc3RlZCBvcGVuaW5ncyBzaGFyZSBpdHMgY2xvc2luZyBicmFja2V0LlxuICAgIGN1cnNvciA9IGxhYmVsRW5kICsgMTtcbiAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHNjYW5EZXN0aW5hdGlvbihjdXJzb3IpO1xuICAgIGlmICghZGVzdGluYXRpb24pIGNvbnRpbnVlO1xuICAgIGN1cnNvciA9IGRlc3RpbmF0aW9uLmVuZDtcbiAgICBjb25zdCBocmVmID0gbWFya2Rvd24uc2xpY2UoZGVzdGluYXRpb24uaHJlZlN0YXJ0LCBkZXN0aW5hdGlvbi5ocmVmRW5kKS50cmltKCk7XG4gICAgaWYgKGhyZWYpIGhyZWZzLnB1c2goaHJlZik7XG4gIH1cbiAgcmV0dXJuIGhyZWZzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1hcmtkb3duRmlsZUxpbmtUYXJnZXQoXG4gIGhyZWY6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY3dkPzogc3RyaW5nLFxuICBiYXNlRGlyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBjd2QsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFocmVmKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgdGFyZ2V0ID0gcGFyc2VNYXJrZG93bkZpbGVMaW5rKGhyZWYpO1xuICBpZiAoIXRhcmdldCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcGF0aFdpdGhQb3NpdGlvbiA9IGZvcm1hdEZpbGVQYXRoUG9zaXRpb24odGFyZ2V0KTtcbiAgaWYgKCFpc1JlbGF0aXZlRmlsZVBhdGgocGF0aFdpdGhQb3NpdGlvbikpIHtcbiAgICAvLyBPcGVuaW5nIGEgbmV0d29yayBwYXRoIG1ha2VzIFdpbmRvd3Mgc2lnbiBpbiB0byBpdHMgaG9zdCB3aXRoIHRoZSB1c2VyJ3NcbiAgICAvLyBOVExNIGNyZWRlbnRpYWxzLCBzbyBvbmx5IHRoZSBwcm9qZWN0J3Mgb3duIHNoYXJlIGJlY29tZXMgYSBmaWxlIGxpbmsuXG4gICAgcmV0dXJuIGlzTmV0d29ya1BhdGgodGFyZ2V0LnBhdGgpICYmIHdvcmtzcGFjZVJlbGF0aXZlRmlsZVBhdGgodGFyZ2V0LnBhdGgsIGN3ZCkgPT09IG51bGxcbiAgICAgID8gbnVsbFxuICAgICAgOiBwYXRoV2l0aFBvc2l0aW9uO1xuICB9XG4gIGlmICghYmFzZURpcikgcmV0dXJuIG51bGw7XG4gIHJldHVybiByZXNvbHZlUGF0aExpbmtUYXJnZXQocGF0aFdpdGhQb3NpdGlvbiwgYmFzZURpcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dpbmRvd3NEcml2ZVBhdGhIcmVmKGhyZWY6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15bQS1aYS16XTpbXFxcXC9dLy50ZXN0KHNhZmVEZWNvZGVVUklDb21wb25lbnQoaHJlZikpO1xufVxuIl0sImZpbGUiOiIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL3NoYXJlZC9zcmMvbWFya2Rvd25MaW5rcy50cyJ9

//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvc2hhcmVkL3NyYy9tYXJrZG93bkxpbmtzLnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9zaGFyZWQvc3JjL21hcmtkb3duTGlua3MudHMiLHsidXJscyI6IjYiLCJpZHMiOiI3In0sWyI4IiwiOSJdLFtdLFsiOCIsIjkiXSx7fSwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9zaGFyZWQvc3JjL3BhdGgudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL3NoYXJlZC9zcmMvZmlsZUxpbmtzLnRzIl0=