obsidian-dev-utils
Version:
This is the collection of useful functions that you can use for your Obsidian plugin development
608 lines (606 loc) • 87.4 kB
JavaScript
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
(function initCjs(){const globalThisRecord=globalThis;globalThisRecord["__name"]??=name;const originalRequire=require;if(originalRequire&&!originalRequire.__isPatched){require=Object.assign(id=>requirePatched(id),originalRequire,{__isPatched:true})}const newFuncs={__extractDefault:__name(()=>extractDefault,"__extractDefault"),process:__name(()=>{const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};return browserProcess},"process")};for(const key of Object.keys(newFuncs)){globalThisRecord[key]??=newFuncs[key]?.()}function name(obj){return obj}__name(name,"name");function extractDefault(module){return module&&module.__esModule&&"default"in module?module.default:module}__name(extractDefault,"extractDefault");function requirePatched(id){const module=originalRequire?.(id);if(module){return extractDefault(module)}if(id==="process"||id==="node:process"){console.error(`Module not found: ${id}. Fake process object is returned instead.`);return globalThis.process}console.error(`Module not found: ${id}. Empty object is returned instead.`);return{}}__name(requirePatched,"requirePatched")})();
"use strict";
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var Link_exports = {};
__export(Link_exports, {
convertLink: () => convertLink,
editBacklinks: () => editBacklinks,
editLinks: () => editLinks,
editLinksInContent: () => editLinksInContent,
encodeUrl: () => encodeUrl,
extractLinkFile: () => extractLinkFile,
fixFrontmatterMarkdownLinks: () => fixFrontmatterMarkdownLinks,
generateMarkdownLink: () => generateMarkdownLink,
parseLink: () => parseLink,
parseLinks: () => parseLinks,
shouldResetAlias: () => shouldResetAlias,
splitSubpath: () => splitSubpath,
testAngleBrackets: () => testAngleBrackets,
testEmbed: () => testEmbed,
testLeadingDot: () => testLeadingDot,
testWikilink: () => testWikilink,
updateLink: () => updateLink,
updateLinksInContent: () => updateLinksInContent,
updateLinksInFile: () => updateLinksInFile
});
module.exports = __toCommonJS(Link_exports);
var import_obsidian = require('obsidian');
var import_implementations = require('obsidian-typings/implementations');
var import_remark = require('remark');
var import_remark_parse = __toESM(__extractDefault(require('remark-parse')), 1);
var import_remark_wiki_link = require('remark-wiki-link');
var import_unist_util_visit = require('unist-util-visit');
var import_ObjectUtils = require('../ObjectUtils.cjs');
var import_Path = require('../Path.cjs');
var import_String = require('../String.cjs');
var import_url = require('../url.cjs');
var import_FileChange = require('./FileChange.cjs');
var import_FileSystem = require('./FileSystem.cjs');
var import_MetadataCache = require('./MetadataCache.cjs');
var import_ObsidianSettings = require('./ObsidianSettings.cjs');
var import_Reference = require('./Reference.cjs');
const ESCAPED_WIKILINK_DIVIDER = "\\|";
const SPECIAL_LINK_SYMBOLS_REGEXP = /[\\\x00\x08\x0B\x0C\x0E-\x1F ]/g;
const SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX = /[\\[\]<>_*~=`$]/g;
const UNESCAPED_WIKILINK_DIVIDER_REGEXP = /(?<!\\)\|/g;
const WIKILINK_DIVIDER = "|";
function convertLink(options) {
const targetFile = extractLinkFile(options.app, options.link, options.oldSourcePathOrFile ?? options.newSourcePathOrFile);
if (!targetFile) {
return options.link.original;
}
return updateLink((0, import_ObjectUtils.normalizeOptionalProperties)({
app: options.app,
link: options.link,
newSourcePathOrFile: options.newSourcePathOrFile,
newTargetPathOrFile: targetFile,
oldSourcePathOrFile: options.oldSourcePathOrFile,
shouldForceMarkdownLinks: options.shouldForceMarkdownLinks,
shouldUpdateFileNameAlias: options.shouldUpdateFileNameAlias
}));
}
async function editBacklinks(app, pathOrFile, linkConverter, processOptions = {}) {
const backlinks = await (0, import_MetadataCache.getBacklinksForFileSafe)(app, pathOrFile, processOptions);
for (const backlinkNotePath of backlinks.keys()) {
const currentLinks = backlinks.get(backlinkNotePath) ?? [];
const linkJsons = new Set(currentLinks.map((link) => (0, import_ObjectUtils.toJson)(link)));
await editLinks(app, backlinkNotePath, (link) => {
const linkJson = (0, import_ObjectUtils.toJson)(link);
if (!linkJsons.has(linkJson)) {
return;
}
return linkConverter(link);
}, processOptions);
}
}
async function editLinks(app, pathOrFile, linkConverter, processOptions = {}) {
await (0, import_FileChange.applyFileChanges)(app, pathOrFile, async () => {
const cache = await (0, import_MetadataCache.getCacheSafe)(app, pathOrFile);
return await getFileChanges(cache, (0, import_FileSystem.isCanvasFile)(app, pathOrFile), linkConverter);
}, processOptions);
}
async function editLinksInContent(app, content, linkConverter) {
const newContent = await (0, import_FileChange.applyContentChanges)(content, "", async () => {
const cache = await (0, import_MetadataCache.parseMetadata)(app, content);
return await getFileChanges(cache, false, linkConverter);
});
if (newContent === null) {
throw new Error("Failed to update links in content");
}
return newContent;
}
function encodeUrl(url) {
return (0, import_String.replaceAll)(url, SPECIAL_LINK_SYMBOLS_REGEXP, ({ substring: specialLinkSymbol }) => encodeURIComponent(specialLinkSymbol));
}
function extractLinkFile(app, link, sourcePathOrFile, shouldAllowNonExistingFile = false) {
const { linkPath } = splitSubpath(link.link);
const sourcePath = (0, import_FileSystem.getPath)(app, sourcePathOrFile);
const file = app.metadataCache.getFirstLinkpathDest(linkPath, sourcePath);
if (file) {
return file;
}
if (!shouldAllowNonExistingFile) {
return null;
}
if (linkPath.startsWith("/")) {
return (0, import_FileSystem.getFile)(app, linkPath, true);
}
const fullLinkPath = (0, import_Path.join)((0, import_Path.dirname)(sourcePath), `./${linkPath}`);
if (fullLinkPath.startsWith("../")) {
return null;
}
return (0, import_FileSystem.getFile)(app, fullLinkPath, true);
}
function fixFrontmatterMarkdownLinks(cache) {
return _fixFrontmatterMarkdownLinks(cache.frontmatter, "", cache);
}
function generateMarkdownLink(options) {
const { app } = options;
const configurableDefaultOptionsFn = app.fileManager.generateMarkdownLink.defaultOptionsFn ?? (() => ({}));
const configurableDefaultOptions = configurableDefaultOptionsFn();
const DEFAULT_OPTIONS = {
isEmptyEmbedAliasAllowed: true
};
options = { ...DEFAULT_OPTIONS, ...configurableDefaultOptions, ...options };
const targetFile = (0, import_FileSystem.getFile)(app, options.targetPathOrFile, options.isNonExistingFileAllowed);
return (0, import_MetadataCache.tempRegisterFilesAndRun)(app, [targetFile], () => generateMarkdownLinkImpl(options));
}
function parseLink(str) {
const links = parseLinks(str);
return links[0]?.raw === str ? links[0] : null;
}
function parseLinks(str) {
const embedSymbolOffsets = /* @__PURE__ */ new Set();
const EMBED_LINK_PREFIX = "![";
const NO_EMBED_LINK_PREFIX = " [";
const noEmbedStr = (0, import_String.replaceAll)(str, EMBED_LINK_PREFIX, (args) => {
embedSymbolOffsets.add(args.offset);
return NO_EMBED_LINK_PREFIX;
});
const processor = (0, import_remark.remark)().use(import_remark_parse.default).use(import_remark_wiki_link.wikiLinkPlugin, { aliasDivider: WIKILINK_DIVIDER });
const root = processor.parse(noEmbedStr);
const links = [];
const textLinks = [];
(0, import_unist_util_visit.visit)(root, (node) => {
let link;
switch (node.type) {
case "link":
link = parseLinkNode(node, str);
break;
case "wikiLink":
link = parseWikilinkNode(node, str);
break;
default:
return;
}
if (embedSymbolOffsets.has(link.startOffset - 1)) {
link.isEmbed = true;
link.startOffset--;
link.raw = `!${link.raw}`;
}
links.push(link);
});
links.sort((a, b) => a.startOffset - b.startOffset);
let textStartOffset = 0;
for (const link of links) {
extractTextLinks(str, textStartOffset, link.startOffset - 1, textLinks);
textStartOffset = link.endOffset + 1;
}
extractTextLinks(str, textStartOffset, str.length - 1, textLinks);
links.push(...textLinks);
links.sort((a, b) => a.startOffset - b.startOffset);
return links;
}
function shouldResetAlias(options) {
const {
app,
displayText,
isWikilink,
newSourcePathOrFile,
oldSourcePathOrFile,
oldTargetPath,
targetPathOrFile
} = options;
if (isWikilink === false) {
return false;
}
if (!displayText) {
return true;
}
const targetFile = (0, import_FileSystem.getFile)(app, targetPathOrFile, true);
const newSourcePath = (0, import_FileSystem.getPath)(app, newSourcePathOrFile);
const oldSourcePath = (0, import_FileSystem.getPath)(app, oldSourcePathOrFile ?? newSourcePathOrFile);
const newSourceFolder = (0, import_Path.dirname)(newSourcePath);
const oldSourceFolder = (0, import_Path.dirname)(oldSourcePath);
const aliasesToReset = /* @__PURE__ */ new Set();
for (const pathOrFile of [targetFile.path, oldTargetPath]) {
if (!pathOrFile) {
continue;
}
const path = (0, import_FileSystem.getPath)(app, pathOrFile);
aliasesToReset.add(path);
aliasesToReset.add((0, import_Path.basename)(path));
aliasesToReset.add((0, import_Path.relative)(newSourceFolder, path));
aliasesToReset.add((0, import_Path.relative)(oldSourceFolder, path));
}
for (const sourcePath of [oldSourcePath, newSourcePath]) {
aliasesToReset.add(app.metadataCache.fileToLinktext(targetFile, sourcePath, false));
}
const cleanDisplayText = (0, import_String.replaceAll)((0, import_obsidian.normalizePath)(displayText.split(" > ")[0] ?? ""), /^\.\//g, "").toLowerCase();
for (const alias of aliasesToReset) {
if (alias.toLowerCase() === cleanDisplayText) {
return true;
}
const folder = (0, import_Path.dirname)(alias);
const base = (0, import_Path.basename)(alias, (0, import_Path.extname)(alias));
if ((0, import_Path.join)(folder, base).toLowerCase() === cleanDisplayText) {
return true;
}
}
return false;
}
function splitSubpath(link) {
const parsed = (0, import_obsidian.parseLinktext)((0, import_String.normalize)(link));
return {
linkPath: parsed.path,
subpath: parsed.subpath
};
}
function testAngleBrackets(link) {
const parseLinkResult = parseLink(link);
return parseLinkResult?.hasAngleBrackets ?? false;
}
function testEmbed(link) {
const parseLinkResult = parseLink(link);
return parseLinkResult?.isEmbed ?? false;
}
function testLeadingDot(link) {
const parseLinkResult = parseLink(link);
return parseLinkResult?.url.startsWith("./") ?? false;
}
function testWikilink(link) {
const parseLinkResult = parseLink(link);
return parseLinkResult?.isWikilink ?? false;
}
function updateLink(options) {
const {
app,
link,
newSourcePathOrFile,
newTargetPathOrFile,
oldSourcePathOrFile,
oldTargetPathOrFile,
shouldForceMarkdownLinks,
shouldUpdateFileNameAlias
} = options;
if (!newTargetPathOrFile) {
return link.original;
}
const targetFile = (0, import_FileSystem.getFile)(app, newTargetPathOrFile, true);
const oldTargetPath = (0, import_FileSystem.getPath)(app, oldTargetPathOrFile ?? newTargetPathOrFile);
const isWikilink = testWikilink(link.original) && shouldForceMarkdownLinks !== true;
const { subpath } = splitSubpath(link.link);
let shouldKeepAlias = !shouldUpdateFileNameAlias;
if ((0, import_FileSystem.isCanvasFile)(app, newSourcePathOrFile)) {
if ((0, import_Reference.isCanvasFileNodeReference)(link)) {
return targetFile.path + subpath;
}
}
let alias;
if (isWikilink) {
const parseLinkResult = parseLink(link.original);
if (parseLinkResult?.alias) {
alias = parseLinkResult.alias;
shouldKeepAlias = true;
}
}
alias ??= shouldResetAlias((0, import_ObjectUtils.normalizeOptionalProperties)({
app,
displayText: link.displayText,
isWikilink,
newSourcePathOrFile,
oldSourcePathOrFile,
oldTargetPath,
targetPathOrFile: targetFile
})) ? void 0 : link.displayText;
if (!shouldKeepAlias) {
if (alias === (0, import_Path.basename)(oldTargetPath, (0, import_Path.extname)(oldTargetPath))) {
alias = targetFile.basename;
} else if (alias === (0, import_Path.basename)(oldTargetPath)) {
alias = targetFile.name;
}
}
const newLink = generateMarkdownLink((0, import_ObjectUtils.normalizeOptionalProperties)({
alias,
app,
isWikilink: shouldForceMarkdownLinks ? false : void 0,
originalLink: link.original,
sourcePathOrFile: newSourcePathOrFile,
subpath,
targetPathOrFile: targetFile
}));
return newLink;
}
async function updateLinksInContent(options) {
const {
app,
content,
newSourcePathOrFile,
oldSourcePathOrFile,
shouldForceMarkdownLinks,
shouldUpdateEmbedOnlyLinks,
shouldUpdateFileNameAlias
} = options;
return await editLinksInContent(app, content, (link) => {
const isEmbedLink = testEmbed(link.original);
if (shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink) {
return;
}
return convertLink((0, import_ObjectUtils.normalizeOptionalProperties)({
app,
link,
newSourcePathOrFile,
oldSourcePathOrFile,
shouldForceMarkdownLinks,
shouldUpdateFileNameAlias
}));
});
}
async function updateLinksInFile(options) {
const {
app,
newSourcePathOrFile,
oldSourcePathOrFile,
shouldForceMarkdownLinks,
shouldUpdateEmbedOnlyLinks,
shouldUpdateFileNameAlias
} = options;
if ((0, import_FileSystem.isCanvasFile)(app, newSourcePathOrFile) && !app.internalPlugins.getEnabledPluginById(import_implementations.InternalPluginName.Canvas)) {
return;
}
await editLinks(app, newSourcePathOrFile, (link) => {
const isEmbedLink = testEmbed(link.original);
if (shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink) {
return;
}
return convertLink((0, import_ObjectUtils.normalizeOptionalProperties)({
app,
link,
newSourcePathOrFile,
oldSourcePathOrFile,
shouldForceMarkdownLinks,
shouldUpdateFileNameAlias
}));
}, options);
}
function _fixFrontmatterMarkdownLinks(value, key, cache) {
if (typeof value === "string") {
const parseLinkResult = parseLink(value);
if (!parseLinkResult || parseLinkResult.isWikilink || parseLinkResult.isExternal) {
return false;
}
cache.frontmatterLinks ??= [];
let link = cache.frontmatterLinks.find((frontmatterLink) => frontmatterLink.key === key);
if (!link) {
link = {
key,
link: "",
original: ""
};
cache.frontmatterLinks.push(link);
}
link.link = parseLinkResult.url;
link.original = value;
if (parseLinkResult.alias !== void 0) {
link.displayText = parseLinkResult.alias;
}
return true;
}
if (typeof value !== "object" || value === null) {
return false;
}
let hasFrontmatterLinks = false;
for (const [childKey, childValue] of Object.entries(value)) {
const hasChildFrontmatterLinks = _fixFrontmatterMarkdownLinks(childValue, key ? `${key}.${childKey}` : childKey, cache);
hasFrontmatterLinks ||= hasChildFrontmatterLinks;
}
return hasFrontmatterLinks;
}
function extractTextLinks(str, startOffset, endOffset, textLinks) {
if (startOffset > endOffset) {
return;
}
const textPart = str.slice(startOffset, endOffset + 1);
(0, import_String.replaceAll)(textPart, /(?<Url>\S+)/g, (args, url) => {
if (!(0, import_url.isUrl)(url)) {
return;
}
textLinks.push({
encodedUrl: encodeUrl(url),
endOffset: startOffset + args.offset + url.length,
hasAngleBrackets: false,
isEmbed: false,
isExternal: true,
isWikilink: false,
raw: url,
startOffset: startOffset + args.offset,
url
});
});
}
function generateLinkText(app, targetFile, sourcePath, subpath, config) {
if (sourcePath === "/") {
sourcePath = "";
}
let linkText;
if (targetFile.path === sourcePath && subpath) {
linkText = subpath;
} else if (config.shouldForceRelativePath) {
linkText = (0, import_Path.relative)((0, import_Path.dirname)(sourcePath), config.isWikilink ? (0, import_FileSystem.trimMarkdownExtension)(app, targetFile) : targetFile.path) + subpath;
} else {
linkText = app.metadataCache.fileToLinktext(targetFile, sourcePath, config.isWikilink) + subpath;
}
if (config.shouldForceRelativePath && config.shouldUseLeadingDot && !linkText.startsWith(".") && !linkText.startsWith("#")) {
linkText = `./${linkText}`;
}
return linkText;
}
function generateMarkdownLinkImpl(options) {
const { app } = options;
const targetFile = (0, import_FileSystem.getFile)(app, options.targetPathOrFile, options.isNonExistingFileAllowed);
const sourcePath = (0, import_FileSystem.getPath)(app, options.sourcePathOrFile);
const subpath = options.subpath ?? "";
const linkConfig = getLinkConfig(options, targetFile);
const linkText = generateLinkText(app, targetFile, sourcePath, subpath, linkConfig);
return linkConfig.isWikilink ? generateWikiLink(linkText, options.alias, linkConfig.isEmbed) : generateMarkdownStyleLink(linkText, targetFile, options, linkConfig);
}
function generateMarkdownStyleLink(linkText, targetFile, options, config) {
const { app } = options;
const embedPrefix = config.isEmbed ? "!" : "";
const processedLinkText = config.shouldUseAngleBrackets ? `<${linkText}>` : encodeUrl(linkText);
let alias = options.alias ?? "";
if (!alias && (!config.isEmbed || !options.isEmptyEmbedAliasAllowed)) {
alias = !options.shouldIncludeAttachmentExtensionToEmbedAlias || (0, import_FileSystem.isMarkdownFile)(app, targetFile) ? targetFile.basename : targetFile.name;
}
const escapedAlias = (0, import_String.replaceAll)(alias, SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX, "\\$&");
return `${embedPrefix}[${escapedAlias}](${processedLinkText})`;
}
function generateWikiLink(linkText, alias, isEmbed) {
const embedPrefix = isEmbed ? "!" : "";
const normalizedAlias = alias ?? "";
if (normalizedAlias && normalizedAlias.toLowerCase() === linkText.toLowerCase()) {
return `${embedPrefix}[[${normalizedAlias}]]`;
}
const aliasPart = normalizedAlias ? `|${normalizedAlias}` : "";
return `${embedPrefix}[[${linkText}${aliasPart}]]`;
}
async function getFileChanges(cache, isCanvasFileCache, linkConverter) {
if (!cache) {
return [];
}
const changes = [];
const tablePositions = (cache.sections ?? []).filter((section) => section.type === "table").map((section) => ({
end: section.position.end.offset,
start: section.position.start.offset
}));
for (const link of (0, import_MetadataCache.getAllLinks)(cache)) {
const newContent = await linkConverter(link);
if (newContent === void 0) {
continue;
}
const fileChange = (0, import_Reference.referenceToFileChange)(link, newContent);
if (isCanvasFileCache) {
if ((0, import_FileChange.isCanvasChange)(fileChange)) {
changes.push(fileChange);
} else {
console.warn("Unsupported file change", fileChange);
}
} else {
if (shouldEscapeWikilinkDivider(fileChange, tablePositions)) {
fileChange.newContent = fileChange.newContent.replaceAll(UNESCAPED_WIKILINK_DIVIDER_REGEXP, ESCAPED_WIKILINK_DIVIDER);
}
changes.push(fileChange);
}
}
return changes;
}
function getLinkConfig(options, targetFile) {
const { app } = options;
return {
isEmbed: options.isEmbed ?? (options.originalLink ? testEmbed(options.originalLink) : void 0) ?? !(0, import_FileSystem.isMarkdownFile)(app, targetFile),
isWikilink: options.isWikilink ?? (options.originalLink ? testWikilink(options.originalLink) : void 0) ?? (0, import_ObsidianSettings.shouldUseWikilinks)(app),
shouldForceRelativePath: options.shouldForceRelativePath ?? (0, import_ObsidianSettings.shouldUseRelativeLinks)(app),
shouldUseAngleBrackets: options.shouldUseAngleBrackets ?? (options.originalLink ? testAngleBrackets(options.originalLink) : void 0) ?? false,
shouldUseLeadingDot: options.shouldUseLeadingDot ?? (options.originalLink ? testLeadingDot(options.originalLink) : void 0) ?? false
};
}
function getRawLink(node, str) {
return str.slice(node.position?.start.offset ?? 0, node.position?.end.offset ?? 0);
}
function parseLinkNode(node, str) {
const OPEN_ANGLE_BRACKET = "<";
const LINK_ALIAS_SUFFIX = "](";
const LINK_SUFFIX = ")";
const raw = getRawLink(node, str);
const aliasNode = node.children[0];
const rawUrl = str.slice((aliasNode?.position?.end.offset ?? 1) + LINK_ALIAS_SUFFIX.length, (node.position?.end.offset ?? 0) - LINK_SUFFIX.length);
const hasAngleBrackets = raw.startsWith(OPEN_ANGLE_BRACKET) || rawUrl.startsWith(OPEN_ANGLE_BRACKET);
const isExternal = (0, import_url.isUrl)(node.url);
let url = node.url;
if (!isExternal && !hasAngleBrackets) {
try {
url = decodeURIComponent(url);
} catch (error) {
console.error(`Failed to decode URL ${url}`, error);
}
}
return (0, import_ObjectUtils.normalizeOptionalProperties)({
alias: aliasNode?.value,
encodedUrl: isExternal ? encodeUrl(url) : void 0,
endOffset: node.position?.end.offset ?? 0,
hasAngleBrackets,
isEmbed: false,
isExternal,
isWikilink: false,
raw,
startOffset: node.position?.start.offset ?? 0,
title: node.title ?? void 0,
url
});
}
function parseWikilinkNode(node, str) {
return (0, import_ObjectUtils.normalizeOptionalProperties)({
alias: str.includes(WIKILINK_DIVIDER) ? node.data.alias : void 0,
endOffset: node.position?.end.offset ?? 0,
isEmbed: false,
isExternal: false,
isWikilink: true,
raw: getRawLink(node, str),
startOffset: node.position?.start.offset ?? 0,
url: node.value
});
}
function shouldEscapeWikilinkDivider(fileChange, tablePositions) {
if (!(0, import_FileChange.isContentChange)(fileChange)) {
return false;
}
if (!UNESCAPED_WIKILINK_DIVIDER_REGEXP.test(fileChange.newContent)) {
return false;
}
return tablePositions.some(
(tablePosition) => tablePosition.start <= fileChange.reference.position.start.offset && fileChange.reference.position.end.offset <= tablePosition.end
);
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
convertLink,
editBacklinks,
editLinks,
editLinksInContent,
encodeUrl,
extractLinkFile,
fixFrontmatterMarkdownLinks,
generateMarkdownLink,
parseLink,
parseLinks,
shouldResetAlias,
splitSubpath,
testAngleBrackets,
testEmbed,
testLeadingDot,
testWikilink,
updateLink,
updateLinksInContent,
updateLinksInFile
});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBoYW5kbGluZyBhbmQgdXBkYXRpbmcgbGlua3Mgd2l0aGluIE9ic2lkaWFuIHZhdWx0cy4gSXQgaW5jbHVkZXNcbiAqIGZ1bmN0aW9ucyB0byBzcGxpdCBwYXRocywgdXBkYXRlIGxpbmtzIGluIGZpbGVzLCBhbmQgZ2VuZXJhdGUgbWFya2Rvd24gbGlua3Mgd2l0aCB2YXJpb3VzIG9wdGlvbnMuXG4gKiBUaGUgZnVuY3Rpb25zIGludGVncmF0ZSB3aXRoIE9ic2lkaWFuJ3MgQVBJIHRvIGVuc3VyZSB0aGF0IGxpbmtzIGFyZSBtYW5hZ2VkIGNvcnJlY3RseSB3aXRoaW4gdGhlIHZhdWx0LlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgTGluayxcbiAgVGV4dFxufSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgTm9kZSB9IGZyb20gJ3VuaXN0JztcblxuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyc2VMaW5rdGV4dFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBJbnRlcm5hbFBsdWdpbk5hbWUgfSBmcm9tICdvYnNpZGlhbi10eXBpbmdzL2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyByZW1hcmsgfSBmcm9tICdyZW1hcmsnO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gJ3JlbWFyay1wYXJzZSc7XG5pbXBvcnQgeyB3aWtpTGlua1BsdWdpbiB9IGZyb20gJ3JlbWFyay13aWtpLWxpbmsnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICd1bmlzdC11dGlsLXZpc2l0JztcblxuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnLi4vT2JqZWN0VXRpbHMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXliZVJldHVybiB9IGZyb20gJy4uL1R5cGUudHMnO1xuaW1wb3J0IHR5cGUgeyBGaWxlQ2hhbmdlIH0gZnJvbSAnLi9GaWxlQ2hhbmdlLnRzJztcbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vRmlsZVN5c3RlbS50cyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NPcHRpb25zIH0gZnJvbSAnLi9WYXVsdC50cyc7XG5cbmltcG9ydCB7XG4gIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyxcbiAgdG9Kc29uXG59IGZyb20gJy4uL09iamVjdFV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi9QYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZSxcbiAgcmVwbGFjZUFsbFxufSBmcm9tICcuLi9TdHJpbmcudHMnO1xuaW1wb3J0IHsgaXNVcmwgfSBmcm9tICcuLi91cmwudHMnO1xuaW1wb3J0IHtcbiAgYXBwbHlDb250ZW50Q2hhbmdlcyxcbiAgYXBwbHlGaWxlQ2hhbmdlcyxcbiAgaXNDYW52YXNDaGFuZ2UsXG4gIGlzQ29udGVudENoYW5nZVxufSBmcm9tICcuL0ZpbGVDaGFuZ2UudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0UGF0aCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgdHJpbU1hcmtkb3duRXh0ZW5zaW9uXG59IGZyb20gJy4vRmlsZVN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBnZXRBbGxMaW5rcyxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIGdldENhY2hlU2FmZSxcbiAgcGFyc2VNZXRhZGF0YSxcbiAgdGVtcFJlZ2lzdGVyRmlsZXNBbmRSdW5cbn0gZnJvbSAnLi9NZXRhZGF0YUNhY2hlLnRzJztcbmltcG9ydCB7XG4gIHNob3VsZFVzZVJlbGF0aXZlTGlua3MsXG4gIHNob3VsZFVzZVdpa2lsaW5rc1xufSBmcm9tICcuL09ic2lkaWFuU2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZSxcbiAgcmVmZXJlbmNlVG9GaWxlQ2hhbmdlXG59IGZyb20gJy4vUmVmZXJlbmNlLnRzJztcblxuY29uc3QgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSID0gJ1xcXFx8JztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNwZWNpYWwgbGluayBzeW1ib2xzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuY29uc3QgU1BFQ0lBTF9MSU5LX1NZTUJPTFNfUkVHRVhQID0gL1tcXFxcXFx4MDBcXHgwOFxceDBCXFx4MENcXHgwRS1cXHgxRiBdL2c7XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIGZvciBzcGVjaWFsIG1hcmtkb3duIGxpbmsgc3ltYm9scy5cbiAqL1xuY29uc3QgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVggPSAvW1xcXFxbXFxdPD5fKn49YCRdL2c7XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIGZvciB1bmVzY2FwZWQgcGlwZXMuXG4gKi9cbmNvbnN0IFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCA9IC8oPzwhXFxcXClcXHwvZztcblxuY29uc3QgV0lLSUxJTktfRElWSURFUiA9ICd8JztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb252ZXJ0aW5nIGEgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb252ZXJ0TGlua09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJlbmNlIGZvciB0aGUgbGluay5cbiAgICovXG4gIGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBtYXJrZG93biBsaW5rcy5cbiAgICovXG4gIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogV3JhcHBlciBmb3IgZGVmYXVsdCBvcHRpb25zIGZvciBnZW5lcmF0aW5nIG1hcmtkb3duIGxpbmtzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNXcmFwcGVyIHtcbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgbWFya2Rvd24gbGlua3MuXG4gICAqL1xuICBkZWZhdWx0T3B0aW9uc0ZuOiAoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucz47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZ2VuZXJhdGluZyBhIG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBhbGlhcyBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICBhbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIGJlIGVtYmVkZGVkLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgaW5mZXJyZWQgYmFzZWQgb24gdGhlIGZpbGUgdHlwZS5cbiAgICovXG4gIGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBJZiBgZmFsc2VgIGFuZCBgcGF0aE9yRmlsZWAgaXMgYSBub24tZXhpc3RpbmcgZmlsZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBpc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIGJlIGEgd2lraWxpbmsuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBpc1dpa2lsaW5rPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIGxpbmsgdGV4dC4gSWYgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBpbmZlciB0aGUgdmFsdWVzIG9mIGBpc0VtYmVkYCwgYGlzV2lraWxpbmtgLCBgdXNlTGVhZGluZ0RvdGAsIGFuZCBgdXNlQW5nbGVCcmFja2V0c2AuXG4gICAqIFRoZXNlIGluZmVycmVkIHZhbHVlcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgY29ycmVzcG9uZGluZyBzZXR0aW5ncyBpZiBzcGVjaWZpZWQuXG4gICAqL1xuICBvcmlnaW5hbExpbms/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgYmUgcmVsYXRpdmUuIElmIG5vdCBwcm92aWRlZCBvciBgZmFsc2VgLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIHNob3VsZEZvcmNlUmVsYXRpdmVQYXRoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuIEhhcyBubyBlZmZlY3QgaWYgYGFsbG93RW1wdHlFbWJlZEFsaWFzYCBpcyBgdHJ1ZWAuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLiBEZWZhdWx0cyB0byBgZmFsc2VgLiBIYXMgbm8gZWZmZWN0IGlmIGBpc1dpa2lsaW5rYCBpcyBgdHJ1ZWBcbiAgICovXG4gIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgZG90LiBEZWZhdWx0cyB0byBgZmFsc2VgLiBIYXMgbm8gZWZmZWN0IGlmIGBpc1dpa2lsaW5rYCBpcyBgdHJ1ZWAgb3IgYGlzUmVsYXRpdmVgIGlzIGBmYWxzZWAuXG4gICAqL1xuICBzaG91bGRVc2VMZWFkaW5nRG90PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgc291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICBzdWJwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiBwYXJzaW5nIGEgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZUxpbmtSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgYWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmNvZGVkIFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIGVuY29kZWRVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgZW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBoYXMgYW5nbGUgYnJhY2tldHMuXG4gICAqL1xuICBoYXNBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmsuXG4gICAqL1xuICBpc0VtYmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgZXh0ZXJuYWwuXG4gICAqL1xuICBpc0V4dGVybmFsOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICovXG4gIGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSByYXcgbGluayB0ZXh0LlxuICAgKi9cbiAgcmF3OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGxpbmsgaW4gdGhlIG9yaWdpbmFsIHRleHQuXG4gICAqL1xuICBzdGFydE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhlIGxpbmsuXG4gICAqL1xuICB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBkZXRlcm1pbmluZyBpZiB0aGUgYWxpYXMgb2YgYSBsaW5rIHNob3VsZCBiZSByZXNldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaG91bGRSZXNldEFsaWFzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXNwbGF5IHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICBkaXNwbGF5VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICovXG4gIGlzV2lraWxpbms/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIG9sZCB0YXJnZXQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIG9sZFRhcmdldFBhdGg6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIGxpbmtQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdWJwYXRoLlxuICAgKi9cbiAgc3VicGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHVwZGF0aW5nIGEgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay5cbiAgICovXG4gIG5ld1RhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICBvbGRUYXJnZXRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBtYXJrZG93biBsaW5rcy5cbiAgICovXG4gIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdXBkYXRpbmcgbGlua3MgaW4gYSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtzSW5GaWxlT3B0aW9ucyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBvYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZpbGUgdG8gdXBkYXRlIHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgcGF0aCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIHRoZSBsaW5rcyB0byBiZSBpbiBNYXJrZG93biBmb3JtYXQuXG4gICAqL1xuICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgTGlua0NvbmZpZyB7XG4gIGlzRW1iZWQ6IGJvb2xlYW47XG4gIGlzV2lraWxpbms6IGJvb2xlYW47XG4gIHNob3VsZEZvcmNlUmVsYXRpdmVQYXRoOiBib29sZWFuO1xuICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBib29sZWFuO1xuICBzaG91bGRVc2VMZWFkaW5nRG90OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVGFibGVQb3NpdGlvbiB7XG4gIGVuZDogbnVtYmVyO1xuICBzdGFydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb25zIGZvciB1cGRhdGluZyB0aGUgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZy5cbiAqL1xuaW50ZXJmYWNlIFVwZGF0ZUxpbmtzSW5Db250ZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdG8gdXBkYXRlIHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5ldyBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIG9sZCBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgbWFya2Rvd24gbGlua3MuXG4gICAqL1xuICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFdpa2lMaW5rTm9kZSBleHRlbmRzIE5vZGUge1xuICBkYXRhOiB7XG4gICAgYWxpYXM6IHN0cmluZztcbiAgfTtcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxpbmsgdG8gYSBuZXcgcGF0aC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBjb252ZXJ0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydExpbmsob3B0aW9uczogQ29udmVydExpbmtPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGV4dHJhY3RMaW5rRmlsZShvcHRpb25zLmFwcCwgb3B0aW9ucy5saW5rLCBvcHRpb25zLm9sZFNvdXJjZVBhdGhPckZpbGUgPz8gb3B0aW9ucy5uZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgaWYgKCF0YXJnZXRGaWxlKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubGluay5vcmlnaW5hbDtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rT3B0aW9ucz4oe1xuICAgIGFwcDogb3B0aW9ucy5hcHAsXG4gICAgbGluazogb3B0aW9ucy5saW5rLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IG9wdGlvbnMubmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBuZXdUYXJnZXRQYXRoT3JGaWxlOiB0YXJnZXRGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGU6IG9wdGlvbnMub2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3M6IG9wdGlvbnMuc2hvdWxkRm9yY2VNYXJrZG93bkxpbmtzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IG9wdGlvbnMuc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9KSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBiYWNrbGlua3MgZm9yLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gcHJvY2Vzc09wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIGZvciByZXRyeWluZyB0aGUgb3BlcmF0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgcGF0aE9yRmlsZSwgcHJvY2Vzc09wdGlvbnMpO1xuICBmb3IgKGNvbnN0IGJhY2tsaW5rTm90ZVBhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgIGNvbnN0IGN1cnJlbnRMaW5rcyA9IGJhY2tsaW5rcy5nZXQoYmFja2xpbmtOb3RlUGF0aCkgPz8gW107XG4gICAgY29uc3QgbGlua0pzb25zID0gbmV3IFNldDxzdHJpbmc+KGN1cnJlbnRMaW5rcy5tYXAoKGxpbmspID0+IHRvSnNvbihsaW5rKSkpO1xuICAgIGF3YWl0IGVkaXRMaW5rcyhhcHAsIGJhY2tsaW5rTm90ZVBhdGgsIChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBsaW5rSnNvbiA9IHRvSnNvbihsaW5rKTtcbiAgICAgIGlmICghbGlua0pzb25zLmhhcyhsaW5rSnNvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGlua0NvbnZlcnRlcihsaW5rKTtcbiAgICB9LCBwcm9jZXNzT3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGVkaXQgdGhlIGJhY2tsaW5rcyBmb3IuXG4gKiBAcGFyYW0gbGlua0NvbnZlcnRlciAtIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAqIEBwYXJhbSBwcm9jZXNzT3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgZm9yIHJldHJ5aW5nIHRoZSBvcGVyYXRpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhY2tsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdExpbmtzKFxuICBhcHA6IEFwcCxcbiAgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSxcbiAgbGlua0NvbnZlcnRlcjogKGxpbms6IFJlZmVyZW5jZSkgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PixcbiAgcHJvY2Vzc09wdGlvbnM6IFByb2Nlc3NPcHRpb25zID0ge31cbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBhcHBseUZpbGVDaGFuZ2VzKGFwcCwgcGF0aE9yRmlsZSwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgZ2V0Q2FjaGVTYWZlKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgcmV0dXJuIGF3YWl0IGdldEZpbGVDaGFuZ2VzKGNhY2hlLCBpc0NhbnZhc0ZpbGUoYXBwLCBwYXRoT3JGaWxlKSwgbGlua0NvbnZlcnRlcik7XG4gIH0sIHByb2Nlc3NPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIGNvbnRlbnQgLSBUaGUgY29udGVudCB0byBlZGl0IHRoZSBsaW5rcyBpbi5cbiAqIEBwYXJhbSBsaW5rQ29udmVydGVyIC0gVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICogQHJldHVybnMgVGhlIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBjb250ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdExpbmtzSW5Db250ZW50KFxuICBhcHA6IEFwcCxcbiAgY29udGVudDogc3RyaW5nLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+XG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgYXBwbHlDb250ZW50Q2hhbmdlcyhjb250ZW50LCAnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgcGFyc2VNZXRhZGF0YShhcHAsIGNvbnRlbnQpO1xuICAgIHJldHVybiBhd2FpdCBnZXRGaWxlQ2hhbmdlcyhjYWNoZSwgZmFsc2UsIGxpbmtDb252ZXJ0ZXIpO1xuICB9KTtcblxuICBpZiAobmV3Q29udGVudCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHVwZGF0ZSBsaW5rcyBpbiBjb250ZW50Jyk7XG4gIH1cblxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIGEgVVJMLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIGVuY29kZS5cbiAqIEByZXR1cm5zIFRoZSBlbmNvZGVkIFVSTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByZXBsYWNlQWxsKHVybCwgU1BFQ0lBTF9MSU5LX1NZTUJPTFNfUkVHRVhQLCAoeyBzdWJzdHJpbmc6IHNwZWNpYWxMaW5rU3ltYm9sIH0pID0+IGVuY29kZVVSSUNvbXBvbmVudChzcGVjaWFsTGlua1N5bWJvbCkpO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhIGxpbmsuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBsaW5rIC0gVGhlIHJlZmVyZW5jZSBjYWNoZSBmb3IgdGhlIGxpbmsuXG4gKiBAcGFyYW0gc291cmNlUGF0aE9yRmlsZSAtIFRoZSBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICogQHBhcmFtIHNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlIC0gV2hldGhlciB0byBhbGxvdyBub24tZXhpc3RpbmcgZmlsZXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKiBAcmV0dXJucyBUaGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmssIG9yIG51bGwgaWYgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdExpbmtGaWxlKGFwcDogQXBwLCBsaW5rOiBSZWZlcmVuY2UsIHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlID0gZmFsc2UpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7IGxpbmtQYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBzb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtQYXRoLCBzb3VyY2VQYXRoKTtcbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGlmICghc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaW5rUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gZ2V0RmlsZShhcHAsIGxpbmtQYXRoLCB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IGZ1bGxMaW5rUGF0aCA9IGpvaW4oZGlybmFtZShzb3VyY2VQYXRoKSwgYC4vJHtsaW5rUGF0aH1gKTtcblxuICBpZiAoZnVsbExpbmtQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZ2V0RmlsZShhcHAsIGZ1bGxMaW5rUGF0aCwgdHJ1ZSk7XG59XG5cbi8qKlxuICogRml4ZXMgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIHdlcmUgZml4ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3MoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiBfZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzKGNhY2hlLmZyb250bWF0dGVyLCAnJywgY2FjaGUpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rKG9wdGlvbnM6IEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IGNvbmZpZ3VyYWJsZURlZmF1bHRPcHRpb25zRm4gPSAoYXBwLmZpbGVNYW5hZ2VyLmdlbmVyYXRlTWFya2Rvd25MaW5rIGFzIFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0T3B0aW9uc1dyYXBwZXI+KS5kZWZhdWx0T3B0aW9uc0ZuXG4gICAgPz8gKCgpOiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucz4gPT4gKHt9KSk7XG4gIGNvbnN0IGNvbmZpZ3VyYWJsZURlZmF1bHRPcHRpb25zID0gY29uZmlndXJhYmxlRGVmYXVsdE9wdGlvbnNGbigpO1xuXG4gIGNvbnN0IERFRkFVTFRfT1BUSU9OUzogUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnM+ID0ge1xuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZDogdHJ1ZVxuICB9O1xuXG4gIG9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfT1BUSU9OUywgLi4uY29uZmlndXJhYmxlRGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcblxuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShhcHAsIG9wdGlvbnMudGFyZ2V0UGF0aE9yRmlsZSwgb3B0aW9ucy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQpO1xuXG4gIHJldHVybiB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1bihhcHAsIFt0YXJnZXRGaWxlXSwgKCkgPT4gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKG9wdGlvbnMpKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBsaW5rIGludG8gaXRzIGNvbXBvbmVudHMuXG4gKlxuICogQHBhcmFtIHN0ciAtIFRoZSBsaW5rIHRvIHBhcnNlLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaW5rKHN0cjogc3RyaW5nKTogbnVsbCB8IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IGxpbmtzID0gcGFyc2VMaW5rcyhzdHIpO1xuICByZXR1cm4gbGlua3NbMF0/LnJhdyA9PT0gc3RyID8gbGlua3NbMF0gOiBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhbGwgbGlua3MgaW4gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHN0ciAtIFRoZSBzdHJpbmcgdG8gcGFyc2UgdGhlIGxpbmtzIGluLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBsaW5rcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlua3Moc3RyOiBzdHJpbmcpOiBQYXJzZUxpbmtSZXN1bHRbXSB7XG4gIGNvbnN0IGVtYmVkU3ltYm9sT2Zmc2V0cyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIGNvbnN0IEVNQkVEX0xJTktfUFJFRklYID0gJyFbJztcbiAgY29uc3QgTk9fRU1CRURfTElOS19QUkVGSVggPSAnIFsnO1xuXG4gIGNvbnN0IG5vRW1iZWRTdHIgPSByZXBsYWNlQWxsKHN0ciwgRU1CRURfTElOS19QUkVGSVgsIChhcmdzKSA9PiB7XG4gICAgZW1iZWRTeW1ib2xPZmZzZXRzLmFkZChhcmdzLm9mZnNldCk7XG4gICAgcmV0dXJuIE5PX0VNQkVEX0xJTktfUFJFRklYO1xuICB9KTtcblxuICBjb25zdCBwcm9jZXNzb3IgPSByZW1hcmsoKS51c2UocmVtYXJrUGFyc2UpLnVzZSh3aWtpTGlua1BsdWdpbiwgeyBhbGlhc0RpdmlkZXI6IFdJS0lMSU5LX0RJVklERVIgfSk7XG4gIGNvbnN0IHJvb3QgPSBwcm9jZXNzb3IucGFyc2Uobm9FbWJlZFN0cik7XG5cbiAgY29uc3QgbGlua3M6IFBhcnNlTGlua1Jlc3VsdFtdID0gW107XG4gIGNvbnN0IHRleHRMaW5rczogUGFyc2VMaW5rUmVzdWx0W10gPSBbXTtcblxuICB2aXNpdChyb290LCAobm9kZTogTm9kZSkgPT4ge1xuICAgIGxldCBsaW5rOiBQYXJzZUxpbmtSZXN1bHQ7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgICBsaW5rID0gcGFyc2VMaW5rTm9kZShub2RlIGFzIExpbmssIHN0cik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2lraUxpbmsnOlxuICAgICAgICBsaW5rID0gcGFyc2VXaWtpbGlua05vZGUobm9kZSBhcyBXaWtpTGlua05vZGUsIHN0cik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlbWJlZFN5bWJvbE9mZnNldHMuaGFzKGxpbmsuc3RhcnRPZmZzZXQgLSAxKSkge1xuICAgICAgbGluay5pc0VtYmVkID0gdHJ1ZTtcbiAgICAgIGxpbmsuc3RhcnRPZmZzZXQtLTtcbiAgICAgIGxpbmsucmF3ID0gYCEke2xpbmsucmF3fWA7XG4gICAgfVxuICAgIGxpbmtzLnB1c2gobGluayk7XG4gIH0pO1xuXG4gIGxpbmtzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRPZmZzZXQgLSBiLnN0YXJ0T2Zmc2V0KTtcblxuICBsZXQgdGV4dFN0YXJ0T2Zmc2V0ID0gMDtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICBleHRyYWN0VGV4dExpbmtzKHN0ciwgdGV4dFN0YXJ0T2Zmc2V0LCBsaW5rLnN0YXJ0T2Zmc2V0IC0gMSwgdGV4dExpbmtzKTtcbiAgICB0ZXh0U3RhcnRPZmZzZXQgPSBsaW5rLmVuZE9mZnNldCArIDE7XG4gIH1cblxuICBleHRyYWN0VGV4dExpbmtzKHN0ciwgdGV4dFN0YXJ0T2Zmc2V0LCBzdHIubGVuZ3RoIC0gMSwgdGV4dExpbmtzKTtcblxuICBsaW5rcy5wdXNoKC4uLnRleHRMaW5rcyk7XG4gIGxpbmtzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRPZmZzZXQgLSBiLnN0YXJ0T2Zmc2V0KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgYWxpYXMgb2YgYSBsaW5rIHNob3VsZCBiZSByZXNldC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBkZXRlcm1pbmluZyBpZiB0aGUgYWxpYXMgc2hvdWxkIGJlIHJlc2V0LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgYWxpYXMgc2hvdWxkIGJlIHJlc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkUmVzZXRBbGlhcyhvcHRpb25zOiBTaG91bGRSZXNldEFsaWFzT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGRpc3BsYXlUZXh0LFxuICAgIGlzV2lraWxpbmssXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZVxuICB9ID0gb3B0aW9ucztcbiAgaWYgKGlzV2lraWxpbmsgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFkaXNwbGF5VGV4dCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCB0YXJnZXRQYXRoT3JGaWxlLCB0cnVlKTtcbiAgY29uc3QgbmV3U291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgb2xkU291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBvbGRTb3VyY2VQYXRoT3JGaWxlID8/IG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBuZXdTb3VyY2VGb2xkZXIgPSBkaXJuYW1lKG5ld1NvdXJjZVBhdGgpO1xuICBjb25zdCBvbGRTb3VyY2VGb2xkZXIgPSBkaXJuYW1lKG9sZFNvdXJjZVBhdGgpO1xuICBjb25zdCBhbGlhc2Vz