@repka-kit/ts
Version:
Next generation build tools for monorepo: lint, bundle and package your TypeScript projects
153 lines (147 loc) • 21.7 kB
JavaScript
import { readFile, stat, writeFile } from 'node:fs/promises';
import { join } from 'node:path';
import { c as configFilePath } from './chunk.1WcKPfKf.js';
import { o as onceAsync, r as repositoryRootPath } from './chunk.dnsVc6Jo.js';
import { load } from 'js-yaml';
import { m as moduleRootDirectory, b as binPath } from './chunk.gqGVJwT_.js';
import 'node:assert';
import { s as spawnToPromise, d as cliArgsPipe, e as setScript, r as removeLogLevelOption, f as setDefaultArgs, g as includesAnyOf, h as removeInputArgs } from './chunk.2EX25_CG.js';
const cwdPackageJsonPath = () => join(process.cwd(), "./package.json");
async function readPackageJsonAt(path, deps = { readFile: (path2) => readFile(path2, "utf-8") }) {
return await deps.readFile(path).then((result) => JSON.parse(result));
}
const readCwdPackageJson = onceAsync(
() => readPackageJsonAt(cwdPackageJsonPath())
);
async function readPackageJson(path, deps = { readFile: (path2) => readFile(path2, "utf-8") }) {
return path === cwdPackageJsonPath() ? await readCwdPackageJson() : await readPackageJsonAt(path, deps);
}
const ourPackageJson = onceAsync(
async (deps = {
readFile: (path) => readFile(path, "utf-8")
}) => {
const packageJsonPath = join(moduleRootDirectory(), "package.json");
return await readPackageJsonAt(packageJsonPath, {
readFile: deps.readFile
});
}
);
async function tryReadingPnpmWorkspaceYaml(monorepoRoot) {
const text = await readFile(
join(monorepoRoot, "pnpm-workspace.yaml"),
"utf-8"
);
const rootPath = load(text);
return Array.isArray(rootPath.packages) && rootPath.packages.length > 0 ? rootPath.packages : void 0;
}
async function tryReadingPackageJsonWorkspaces(monorepoRoot) {
const packageJson = await readPackageJson(join(monorepoRoot, "package.json"));
const workspaces = packageJson["workspaces"];
return Array.isArray(workspaces) && workspaces.length > 0 ? workspaces.flatMap((entry) => typeof entry === "string" ? [entry] : []) : void 0;
}
const readPackagesGlobsAt = async (monorepoRoot) => {
const [pnpmWorkspaces, packageJsonWorkspaces] = await Promise.all([
tryReadingPnpmWorkspaceYaml(monorepoRoot).catch(() => void 0),
tryReadingPackageJsonWorkspaces(monorepoRoot).catch(() => void 0)
]);
return pnpmWorkspaces || packageJsonWorkspaces || [];
};
const readMonorepoPackagesGlobs = onceAsync(async () => {
const root = await repositoryRootPath();
const packagesGlobs = await readPackagesGlobsAt(root);
return {
root,
packagesGlobs
};
});
const defaultDeps = {
fileExists: (path) => stat(path).then((result) => result.isFile()).catch(() => false),
readFile: (path) => readFile(path, { encoding: "utf-8" }),
writeFile: (path, data) => writeFile(path, data, { encoding: "utf-8" })
};
async function ensureEslintTsConfigExists(opts, deps = defaultDeps) {
const path = join(opts.directory, "tsconfig.eslint.json");
const eslintConfigExists = await deps.fileExists(path);
if (eslintConfigExists) {
return;
}
const text = await deps.readFile(
configFilePath("eslint/tsconfig.eslint.json")
);
const globs = new Set(
opts.packagesGlobs.map((glob) => glob !== "*" ? `${glob}/*.ts` : `*.ts`)
);
await deps.writeFile(
path,
text.replace(
'["GLOBS"]',
JSON.stringify(globs.size === 0 ? ["*.ts"] : [...globs])
)
);
}
async function ensureEslintRootConfigExists(opts, deps = defaultDeps) {
const path = join(opts.directory, ".eslintrc.cjs");
const eslintConfigExists = await deps.fileExists(path);
if (eslintConfigExists) {
return;
}
const text = await deps.readFile(configFilePath("eslint/eslint-ref.cjs"));
await deps.writeFile(path, text);
}
async function ensureEslintConfigFilesExist() {
const { root, packagesGlobs } = await readMonorepoPackagesGlobs();
await Promise.all([
ensureEslintTsConfigExists({
directory: root,
packagesGlobs
}),
ensureEslintRootConfigExists({
directory: root
})
]);
}
const eslintBinPath = () => binPath({
binName: "eslint",
binScriptPath: "eslint/bin/eslint.js"
});
const eslintConfigPath = () => configFilePath("./eslint/eslint-root.cjs");
const eslint = async (processArgs) => {
return spawnToPromise(
process.execPath,
cliArgsPipe(
[
setScript(await eslintBinPath()),
removeLogLevelOption(),
setDefaultArgs(
["--ext"],
[[".ts", ".tsx", ".js", ".jsx", ".cjs", ".json"].join(",")]
),
setDefaultArgs(["--config", "-c"], [eslintConfigPath()]),
setDefaultArgs(
["--fix"],
[],
(args) => !includesAnyOf(args.inputArgs, ["--no-fix"])
),
setDefaultArgs(
["--resolve-plugins-relative-to"],
[process.cwd()],
(state) => !includesAnyOf(state.inputArgs, ["-c", "--config"])
),
// remove non-standard --no-fix parameter
removeInputArgs(["--no-fix"]),
(args) => ({
...args,
// if user did not specify files to lint - default to .
inputArgs: args.inputArgs.length === 0 ? ["."] : args.inputArgs
})
],
processArgs
),
{
stdio: "inherit",
exitCodes: "inherit"
}
);
};
export { eslintBinPath as a, readPackageJson as b, eslint as c, ensureEslintRootConfigExists as d, ensureEslintConfigFilesExist as e, ensureEslintTsConfigExists as f, readCwdPackageJson as g, ourPackageJson as o, readMonorepoPackagesGlobs as r };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2h1bmsuN09xb0c5c1MuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9wYWNrYWdlLWpzb24vcmVhZFBhY2thZ2VKc29uLnRzIiwiLi4vc3JjL3V0aWxzL3JlYWRQYWNrYWdlc0dsb2JzLnRzIiwiLi4vc3JjL2VzbGludC9lbnN1cmVFc2xpbnRDb25maWdGaWxlc0V4aXN0LnRzIiwiLi4vc3JjL2VzbGludC9lc2xpbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBvbmNlQXN5bmMgfSBmcm9tICdAdXRpbHMvdHMnO1xuXG5pbXBvcnQgeyBtb2R1bGVSb290RGlyZWN0b3J5IH0gZnJvbSAnLi4vdXRpbHMvbW9kdWxlUm9vdERpcmVjdG9yeSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9wYWNrYWdlSnNvbic7XG5cbmNvbnN0IGN3ZFBhY2thZ2VKc29uUGF0aCA9ICgpID0+IGpvaW4ocHJvY2Vzcy5jd2QoKSwgJy4vcGFja2FnZS5qc29uJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbkF0KFxuICBwYXRoOiBzdHJpbmcsXG4gIGRlcHMgPSB7IHJlYWRGaWxlOiAocGF0aDogc3RyaW5nKSA9PiByZWFkRmlsZShwYXRoLCAndXRmLTgnKSB9XG4pOiBQcm9taXNlPFBhY2thZ2VKc29uPiB7XG4gIHJldHVybiBhd2FpdCBkZXBzXG4gICAgLnJlYWRGaWxlKHBhdGgpXG4gICAgLnRoZW4oKHJlc3VsdCkgPT4gSlNPTi5wYXJzZShyZXN1bHQpIGFzIFBhY2thZ2VKc29uKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlYWRDd2RQYWNrYWdlSnNvbiA9IG9uY2VBc3luYygoKSA9PlxuICByZWFkUGFja2FnZUpzb25BdChjd2RQYWNrYWdlSnNvblBhdGgoKSlcbik7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oXG4gIHBhdGg6IHN0cmluZyxcbiAgZGVwcyA9IHsgcmVhZEZpbGU6IChwYXRoOiBzdHJpbmcpID0+IHJlYWRGaWxlKHBhdGgsICd1dGYtOCcpIH1cbik6IFByb21pc2U8UGFja2FnZUpzb24+IHtcbiAgLy8gYXNzdW1pbmcgY3VycmVudCBkaXJlY3RvcnkgZG9lc24ndCBjaGFuZ2Ugd2hpbGUgYXBwIGlzIHJ1bm5pbmdcbiAgcmV0dXJuIHBhdGggPT09IGN3ZFBhY2thZ2VKc29uUGF0aCgpXG4gICAgPyBhd2FpdCByZWFkQ3dkUGFja2FnZUpzb24oKVxuICAgIDogYXdhaXQgcmVhZFBhY2thZ2VKc29uQXQocGF0aCwgZGVwcyk7XG59XG5cbi8qKlxuICogUmVhZCBwYWNrYWdlIGpzb24gb2YgdGhlIGN1cnJlbnQgbGlicmFyeSAoQHJlcGthLWtpdC90cylcbiAqL1xuZXhwb3J0IGNvbnN0IG91clBhY2thZ2VKc29uID0gb25jZUFzeW5jKFxuICBhc3luYyAoXG4gICAgZGVwcyA9IHtcbiAgICAgIHJlYWRGaWxlOiAocGF0aDogc3RyaW5nKSA9PiByZWFkRmlsZShwYXRoLCAndXRmLTgnKSxcbiAgICB9XG4gICkgPT4ge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4obW9kdWxlUm9vdERpcmVjdG9yeSgpLCAncGFja2FnZS5qc29uJyk7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRQYWNrYWdlSnNvbkF0KHBhY2thZ2VKc29uUGF0aCwge1xuICAgICAgcmVhZEZpbGU6IGRlcHMucmVhZEZpbGUsXG4gICAgfSk7XG4gIH1cbik7XG4iLCJpbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IG9uY2VBc3luYyB9IGZyb20gJ0B1dGlscy90cyc7XG5pbXBvcnQgeyBsb2FkIH0gZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IHJlYWRQYWNrYWdlSnNvbiB9IGZyb20gJy4uL3BhY2thZ2UtanNvbi9yZWFkUGFja2FnZUpzb24nO1xuaW1wb3J0IHsgcmVwb3NpdG9yeVJvb3RQYXRoIH0gZnJvbSAnLi9yZXBvc2l0b3J5Um9vdFBhdGgnO1xuXG5hc3luYyBmdW5jdGlvbiB0cnlSZWFkaW5nUG5wbVdvcmtzcGFjZVlhbWwobW9ub3JlcG9Sb290OiBzdHJpbmcpIHtcbiAgY29uc3QgdGV4dCA9IGF3YWl0IHJlYWRGaWxlKFxuICAgIGpvaW4obW9ub3JlcG9Sb290LCAncG5wbS13b3Jrc3BhY2UueWFtbCcpLFxuICAgICd1dGYtOCdcbiAgKTtcbiAgY29uc3Qgcm9vdFBhdGggPSBsb2FkKHRleHQpIGFzIHtcbiAgICBwYWNrYWdlcz86IHN0cmluZ1tdO1xuICB9O1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShyb290UGF0aC5wYWNrYWdlcykgJiYgcm9vdFBhdGgucGFja2FnZXMubGVuZ3RoID4gMFxuICAgID8gcm9vdFBhdGgucGFja2FnZXNcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdHJ5UmVhZGluZ1BhY2thZ2VKc29uV29ya3NwYWNlcyhtb25vcmVwb1Jvb3Q6IHN0cmluZykge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihqb2luKG1vbm9yZXBvUm9vdCwgJ3BhY2thZ2UuanNvbicpKTtcbiAgY29uc3Qgd29ya3NwYWNlcyA9IHBhY2thZ2VKc29uWyd3b3Jrc3BhY2VzJ107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHdvcmtzcGFjZXMpICYmIHdvcmtzcGFjZXMubGVuZ3RoID4gMFxuICAgID8gd29ya3NwYWNlcy5mbGF0TWFwKChlbnRyeSkgPT4gKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycgPyBbZW50cnldIDogW10pKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5jb25zdCByZWFkUGFja2FnZXNHbG9ic0F0ID0gYXN5bmMgKG1vbm9yZXBvUm9vdDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IFtwbnBtV29ya3NwYWNlcywgcGFja2FnZUpzb25Xb3Jrc3BhY2VzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICB0cnlSZWFkaW5nUG5wbVdvcmtzcGFjZVlhbWwobW9ub3JlcG9Sb290KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpLFxuICAgIHRyeVJlYWRpbmdQYWNrYWdlSnNvbldvcmtzcGFjZXMobW9ub3JlcG9Sb290KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpLFxuICBdKTtcbiAgcmV0dXJuIHBucG1Xb3Jrc3BhY2VzIHx8IHBhY2thZ2VKc29uV29ya3NwYWNlcyB8fCBbXTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIG1vbm9yZXBvIHBhY2thZ2VzIGdsb2IgYnkgcmVhZGluZyBvbmUgb2YgdGhlIHN1cHBvcnRlZFxuICogZmlsZXNcbiAqXG4gKiBOT1RFOiBvbmx5IHBucG0gaXMgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IHJlYWRNb25vcmVwb1BhY2thZ2VzR2xvYnMgPSBvbmNlQXN5bmMoYXN5bmMgKCkgPT4ge1xuICBjb25zdCByb290ID0gYXdhaXQgcmVwb3NpdG9yeVJvb3RQYXRoKCk7XG4gIGNvbnN0IHBhY2thZ2VzR2xvYnMgPSBhd2FpdCByZWFkUGFja2FnZXNHbG9ic0F0KHJvb3QpO1xuICByZXR1cm4ge1xuICAgIHJvb3QsXG4gICAgcGFja2FnZXNHbG9icyxcbiAgfTtcbn0pO1xuIiwiaW1wb3J0IHsgcmVhZEZpbGUsIHN0YXQsIHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZ0ZpbGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvY29uZmlnRmlsZVBhdGgnO1xuaW1wb3J0IHsgcmVhZE1vbm9yZXBvUGFja2FnZXNHbG9icyB9IGZyb20gJy4uL3V0aWxzL3JlYWRQYWNrYWdlc0dsb2JzJztcblxuY29uc3QgZGVmYXVsdERlcHMgPSB7XG4gIGZpbGVFeGlzdHM6IChwYXRoOiBzdHJpbmcpID0+XG4gICAgc3RhdChwYXRoKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4gcmVzdWx0LmlzRmlsZSgpKVxuICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKSxcbiAgcmVhZEZpbGU6IChwYXRoOiBzdHJpbmcpID0+IHJlYWRGaWxlKHBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSksXG4gIHdyaXRlRmlsZTogKHBhdGg6IHN0cmluZywgZGF0YTogc3RyaW5nKSA9PlxuICAgIHdyaXRlRmlsZShwYXRoLCBkYXRhLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUVzbGludFRzQ29uZmlnRXhpc3RzKFxuICBvcHRzOiB7XG4gICAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gICAgcGFja2FnZXNHbG9iczogc3RyaW5nW107XG4gIH0sXG4gIGRlcHMgPSBkZWZhdWx0RGVwc1xuKSB7XG4gIGNvbnN0IHBhdGggPSBqb2luKG9wdHMuZGlyZWN0b3J5LCAndHNjb25maWcuZXNsaW50Lmpzb24nKTtcbiAgY29uc3QgZXNsaW50Q29uZmlnRXhpc3RzID0gYXdhaXQgZGVwcy5maWxlRXhpc3RzKHBhdGgpO1xuXG4gIGlmIChlc2xpbnRDb25maWdFeGlzdHMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdGV4dCA9IGF3YWl0IGRlcHMucmVhZEZpbGUoXG4gICAgY29uZmlnRmlsZVBhdGgoJ2VzbGludC90c2NvbmZpZy5lc2xpbnQuanNvbicpXG4gICk7XG5cbiAgY29uc3QgZ2xvYnMgPSBuZXcgU2V0KFxuICAgIG9wdHMucGFja2FnZXNHbG9icy5tYXAoKGdsb2IpID0+IChnbG9iICE9PSAnKicgPyBgJHtnbG9ifS8qLnRzYCA6IGAqLnRzYCkpXG4gICk7XG5cbiAgYXdhaXQgZGVwcy53cml0ZUZpbGUoXG4gICAgcGF0aCxcbiAgICB0ZXh0LnJlcGxhY2UoXG4gICAgICAnW1wiR0xPQlNcIl0nLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoZ2xvYnMuc2l6ZSA9PT0gMCA/IFsnKi50cyddIDogWy4uLmdsb2JzXSlcbiAgICApXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVFc2xpbnRSb290Q29uZmlnRXhpc3RzKFxuICBvcHRzOiB7IGRpcmVjdG9yeTogc3RyaW5nIH0sXG4gIGRlcHMgPSBkZWZhdWx0RGVwc1xuKSB7XG4gIGNvbnN0IHBhdGggPSBqb2luKG9wdHMuZGlyZWN0b3J5LCAnLmVzbGludHJjLmNqcycpO1xuICBjb25zdCBlc2xpbnRDb25maWdFeGlzdHMgPSBhd2FpdCBkZXBzLmZpbGVFeGlzdHMocGF0aCk7XG5cbiAgaWYgKGVzbGludENvbmZpZ0V4aXN0cykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0ZXh0ID0gYXdhaXQgZGVwcy5yZWFkRmlsZShjb25maWdGaWxlUGF0aCgnZXNsaW50L2VzbGludC1yZWYuY2pzJykpO1xuICBhd2FpdCBkZXBzLndyaXRlRmlsZShwYXRoLCB0ZXh0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUVzbGludENvbmZpZ0ZpbGVzRXhpc3QoKSB7XG4gIGNvbnN0IHsgcm9vdCwgcGFja2FnZXNHbG9icyB9ID0gYXdhaXQgcmVhZE1vbm9yZXBvUGFja2FnZXNHbG9icygpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZW5zdXJlRXNsaW50VHNDb25maWdFeGlzdHMoe1xuICAgICAgZGlyZWN0b3J5OiByb290LFxuICAgICAgcGFja2FnZXNHbG9icyxcbiAgICB9KSxcbiAgICBlbnN1cmVFc2xpbnRSb290Q29uZmlnRXhpc3RzKHtcbiAgICAgIGRpcmVjdG9yeTogcm9vdCxcbiAgICB9KSxcbiAgXSk7XG59XG4iLCJpbXBvcnQgeyBzcGF3blRvUHJvbWlzZSB9IGZyb20gJy4uL2NoaWxkLXByb2Nlc3MnO1xuaW1wb3J0IHsgYmluUGF0aCB9IGZyb20gJy4uL3V0aWxzL2JpblBhdGgnO1xuaW1wb3J0IHtcbiAgY2xpQXJnc1BpcGUsXG4gIGluY2x1ZGVzQW55T2YsXG4gIHJlbW92ZUlucHV0QXJncyxcbiAgcmVtb3ZlTG9nTGV2ZWxPcHRpb24sXG4gIHNldERlZmF1bHRBcmdzLFxuICBzZXRTY3JpcHQsXG59IGZyb20gJy4uL3V0aWxzL2NsaUFyZ3NQaXBlJztcbmltcG9ydCB7IGNvbmZpZ0ZpbGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvY29uZmlnRmlsZVBhdGgnO1xuXG5leHBvcnQgY29uc3QgZXNsaW50QmluUGF0aCA9ICgpID0+XG4gIGJpblBhdGgoe1xuICAgIGJpbk5hbWU6ICdlc2xpbnQnLFxuICAgIGJpblNjcmlwdFBhdGg6ICdlc2xpbnQvYmluL2VzbGludC5qcycsXG4gIH0pO1xuXG5jb25zdCBlc2xpbnRDb25maWdQYXRoID0gKCkgPT4gY29uZmlnRmlsZVBhdGgoJy4vZXNsaW50L2VzbGludC1yb290LmNqcycpO1xuXG5leHBvcnQgY29uc3QgZXNsaW50ID0gYXN5bmMgKHByb2Nlc3NBcmdzOiBzdHJpbmdbXSkgPT4ge1xuICByZXR1cm4gc3Bhd25Ub1Byb21pc2UoXG4gICAgcHJvY2Vzcy5leGVjUGF0aCxcbiAgICBjbGlBcmdzUGlwZShcbiAgICAgIFtcbiAgICAgICAgc2V0U2NyaXB0KGF3YWl0IGVzbGludEJpblBhdGgoKSksXG4gICAgICAgIHJlbW92ZUxvZ0xldmVsT3B0aW9uKCksXG4gICAgICAgIHNldERlZmF1bHRBcmdzKFxuICAgICAgICAgIFsnLS1leHQnXSxcbiAgICAgICAgICBbWycudHMnLCAnLnRzeCcsICcuanMnLCAnLmpzeCcsICcuY2pzJywgJy5qc29uJ10uam9pbignLCcpXVxuICAgICAgICApLFxuICAgICAgICBzZXREZWZhdWx0QXJncyhbJy0tY29uZmlnJywgJy1jJ10sIFtlc2xpbnRDb25maWdQYXRoKCldKSxcbiAgICAgICAgc2V0RGVmYXVsdEFyZ3MoXG4gICAgICAgICAgWyctLWZpeCddLFxuICAgICAgICAgIFtdLFxuICAgICAgICAgIChhcmdzKSA9PiAhaW5jbHVkZXNBbnlPZihhcmdzLmlucHV0QXJncywgWyctLW5vLWZpeCddKVxuICAgICAgICApLFxuICAgICAgICBzZXREZWZhdWx0QXJncyhcbiAgICAgICAgICBbJy0tcmVzb2x2ZS1wbHVnaW5zLXJlbGF0aXZlLXRvJ10sXG4gICAgICAgICAgW3Byb2Nlc3MuY3dkKCldLFxuICAgICAgICAgIChzdGF0ZSkgPT4gIWluY2x1ZGVzQW55T2Yoc3RhdGUuaW5wdXRBcmdzLCBbJy1jJywgJy0tY29uZmlnJ10pXG4gICAgICAgICksXG4gICAgICAgIC8vIHJlbW92ZSBub24tc3RhbmRhcmQgLS1uby1maXggcGFyYW1ldGVyXG4gICAgICAgIHJlbW92ZUlucHV0QXJncyhbJy0tbm8tZml4J10pLFxuICAgICAgICAoYXJncykgPT4gKHtcbiAgICAgICAgICAuLi5hcmdzLFxuICAgICAgICAgIC8vIGlmIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IGZpbGVzIHRvIGxpbnQgLSBkZWZhdWx0IHRvIC5cbiAgICAgICAgICBpbnB1dEFyZ3M6IGFyZ3MuaW5wdXRBcmdzLmxlbmd0aCA9PT0gMCA/IFsnLiddIDogYXJncy5pbnB1dEFyZ3MsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIHByb2Nlc3NBcmdzXG4gICAgKSxcbiAgICB7XG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgZXhpdENvZGVzOiAnaW5oZXJpdCcsXG4gICAgfVxuICApO1xufTtcbiJdLCJuYW1lcyI6WyJwYXRoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFRQSxNQUFNLHFCQUFxQixNQUFNLElBQUEsQ0FBSyxPQUFRLENBQUEsR0FBQSxJQUFPLGdCQUFnQixDQUFBLENBQUE7QUFFckUsZUFBZSxpQkFBQSxDQUNiLElBQ0EsRUFBQSxJQUFBLEdBQU8sRUFBRSxRQUFBLEVBQVUsQ0FBQ0EsS0FBQUEsS0FBaUIsUUFBU0EsQ0FBQUEsS0FBQUEsRUFBTSxPQUFPLENBQUEsRUFDckMsRUFBQTtBQUN0QixFQUFPLE9BQUEsTUFBTSxJQUNWLENBQUEsUUFBQSxDQUFTLElBQUksQ0FBQSxDQUNiLElBQUssQ0FBQSxDQUFDLE1BQVcsS0FBQSxJQUFBLENBQUssS0FBTSxDQUFBLE1BQU0sQ0FBZ0IsQ0FBQSxDQUFBO0FBQ3ZELENBQUE7QUFFTyxNQUFNLGtCQUFxQixHQUFBLFNBQUE7QUFBQSxFQUFVLE1BQzFDLGlCQUFrQixDQUFBLGtCQUFBLEVBQW9CLENBQUE7QUFDeEMsRUFBQTtBQUVBLGVBQXNCLGVBQUEsQ0FDcEIsSUFDQSxFQUFBLElBQUEsR0FBTyxFQUFFLFFBQUEsRUFBVSxDQUFDQSxLQUFBQSxLQUFpQixRQUFTQSxDQUFBQSxLQUFBQSxFQUFNLE9BQU8sQ0FBQSxFQUNyQyxFQUFBO0FBRXRCLEVBQU8sT0FBQSxJQUFBLEtBQVMsb0JBQ1osR0FBQSxNQUFNLG9CQUNOLEdBQUEsTUFBTSxpQkFBa0IsQ0FBQSxJQUFBLEVBQU0sSUFBSSxDQUFBLENBQUE7QUFDeEMsQ0FBQTtBQUtPLE1BQU0sY0FBaUIsR0FBQSxTQUFBO0FBQUEsRUFDNUIsT0FDRSxJQUFPLEdBQUE7QUFBQSxJQUNMLFFBQVUsRUFBQSxDQUFDLElBQWlCLEtBQUEsUUFBQSxDQUFTLE1BQU0sT0FBTyxDQUFBO0FBQUEsR0FFakQsS0FBQTtBQUNILElBQUEsTUFBTSxlQUFrQixHQUFBLElBQUEsQ0FBSyxtQkFBb0IsRUFBQSxFQUFHLGNBQWMsQ0FBQSxDQUFBO0FBQ2xFLElBQU8sT0FBQSxNQUFNLGtCQUFrQixlQUFpQixFQUFBO0FBQUEsTUFDOUMsVUFBVSxJQUFLLENBQUEsUUFBQTtBQUFBLEtBQ2hCLENBQUEsQ0FBQTtBQUFBLEdBQ0g7QUFDRjs7QUN0Q0EsZUFBZSw0QkFBNEIsWUFBc0IsRUFBQTtBQUMvRCxFQUFBLE1BQU0sT0FBTyxNQUFNLFFBQUE7QUFBQSxJQUNqQixJQUFBLENBQUssY0FBYyxxQkFBcUIsQ0FBQTtBQUFBLElBQ3hDLE9BQUE7QUFBQSxHQUNGLENBQUE7QUFDQSxFQUFNLE1BQUEsUUFBQSxHQUFXLEtBQUssSUFBSSxDQUFBLENBQUE7QUFHMUIsRUFBTyxPQUFBLEtBQUEsQ0FBTSxPQUFRLENBQUEsUUFBQSxDQUFTLFFBQVEsQ0FBQSxJQUFLLFNBQVMsUUFBUyxDQUFBLE1BQUEsR0FBUyxDQUNsRSxHQUFBLFFBQUEsQ0FBUyxRQUNULEdBQUEsS0FBQSxDQUFBLENBQUE7QUFDTixDQUFBO0FBRUEsZUFBZSxnQ0FBZ0MsWUFBc0IsRUFBQTtBQUNuRSxFQUFBLE1BQU0sY0FBYyxNQUFNLGVBQUEsQ0FBZ0IsSUFBSyxDQUFBLFlBQUEsRUFBYyxjQUFjLENBQUMsQ0FBQSxDQUFBO0FBQzVFLEVBQU0sTUFBQSxVQUFBLEdBQWEsWUFBWSxZQUFZLENBQUEsQ0FBQTtBQUMzQyxFQUFBLE9BQU8sTUFBTSxPQUFRLENBQUEsVUFBVSxLQUFLLFVBQVcsQ0FBQSxNQUFBLEdBQVMsSUFDcEQsVUFBVyxDQUFBLE9BQUEsQ0FBUSxDQUFDLEtBQVcsS0FBQSxPQUFPLFVBQVUsUUFBVyxHQUFBLENBQUMsS0FBSyxDQUFJLEdBQUEsRUFBRyxDQUN4RSxHQUFBLEtBQUEsQ0FBQSxDQUFBO0FBQ04sQ0FBQTtBQUVBLE1BQU0sbUJBQUEsR0FBc0IsT0FBTyxZQUF5QixLQUFBO0FBQzFELEVBQUEsTUFBTSxDQUFDLGNBQWdCLEVBQUEscUJBQXFCLENBQUksR0FBQSxNQUFNLFFBQVEsR0FBSSxDQUFBO0FBQUEsSUFDaEUsMkJBQTRCLENBQUEsWUFBWSxDQUFFLENBQUEsS0FBQSxDQUFNLE1BQU0sS0FBUyxDQUFBLENBQUE7QUFBQSxJQUMvRCwrQkFBZ0MsQ0FBQSxZQUFZLENBQUUsQ0FBQSxLQUFBLENBQU0sTUFBTSxLQUFTLENBQUEsQ0FBQTtBQUFBLEdBQ3BFLENBQUEsQ0FBQTtBQUNELEVBQU8sT0FBQSxjQUFBLElBQWtCLHlCQUF5QixFQUFDLENBQUE7QUFDckQsQ0FBQSxDQUFBO0FBUWEsTUFBQSx5QkFBQSxHQUE0QixVQUFVLFlBQVk7QUFDN0QsRUFBTSxNQUFBLElBQUEsR0FBTyxNQUFNLGtCQUFtQixFQUFBLENBQUE7QUFDdEMsRUFBTSxNQUFBLGFBQUEsR0FBZ0IsTUFBTSxtQkFBQSxDQUFvQixJQUFJLENBQUEsQ0FBQTtBQUNwRCxFQUFPLE9BQUE7QUFBQSxJQUNMLElBQUE7QUFBQSxJQUNBLGFBQUE7QUFBQSxHQUNGLENBQUE7QUFDRixDQUFDOztBQzdDRCxNQUFNLFdBQWMsR0FBQTtBQUFBLEVBQ2xCLFVBQVksRUFBQSxDQUFDLElBQ1gsS0FBQSxJQUFBLENBQUssSUFBSSxDQUNOLENBQUEsSUFBQSxDQUFLLENBQUMsTUFBQSxLQUFXLE9BQU8sTUFBTyxFQUFDLENBQ2hDLENBQUEsS0FBQSxDQUFNLE1BQU0sS0FBSyxDQUFBO0FBQUEsRUFDdEIsUUFBQSxFQUFVLENBQUMsSUFBaUIsS0FBQSxRQUFBLENBQVMsTUFBTSxFQUFFLFFBQUEsRUFBVSxTQUFTLENBQUE7QUFBQSxFQUNoRSxTQUFBLEVBQVcsQ0FBQyxJQUFBLEVBQWMsSUFDeEIsS0FBQSxTQUFBLENBQVUsTUFBTSxJQUFNLEVBQUEsRUFBRSxRQUFVLEVBQUEsT0FBQSxFQUFTLENBQUE7QUFDL0MsQ0FBQSxDQUFBO0FBRUEsZUFBc0IsMEJBQUEsQ0FDcEIsSUFJQSxFQUFBLElBQUEsR0FBTyxXQUNQLEVBQUE7QUFDQSxFQUFBLE1BQU0sSUFBTyxHQUFBLElBQUEsQ0FBSyxJQUFLLENBQUEsU0FBQSxFQUFXLHNCQUFzQixDQUFBLENBQUE7QUFDeEQsRUFBQSxNQUFNLGtCQUFxQixHQUFBLE1BQU0sSUFBSyxDQUFBLFVBQUEsQ0FBVyxJQUFJLENBQUEsQ0FBQTtBQUVyRCxFQUFBLElBQUksa0JBQW9CLEVBQUE7QUFDdEIsSUFBQSxPQUFBO0FBQUEsR0FDRjtBQUNBLEVBQU0sTUFBQSxJQUFBLEdBQU8sTUFBTSxJQUFLLENBQUEsUUFBQTtBQUFBLElBQ3RCLGVBQWUsNkJBQTZCLENBQUE7QUFBQSxHQUM5QyxDQUFBO0FBRUEsRUFBQSxNQUFNLFFBQVEsSUFBSSxHQUFBO0FBQUEsSUFDaEIsSUFBQSxDQUFLLGFBQWMsQ0FBQSxHQUFBLENBQUksQ0FBQyxJQUFBLEtBQVUsU0FBUyxHQUFNLEdBQUEsQ0FBQSxFQUFHLElBQUksQ0FBQSxLQUFBLENBQUEsR0FBVSxDQUFPLElBQUEsQ0FBQSxDQUFBO0FBQUEsR0FDM0UsQ0FBQTtBQUVBLEVBQUEsTUFBTSxJQUFLLENBQUEsU0FBQTtBQUFBLElBQ1QsSUFBQTtBQUFBLElBQ0EsSUFBSyxDQUFBLE9BQUE7QUFBQSxNQUNILFdBQUE7QUFBQSxNQUNBLElBQUEsQ0FBSyxTQUFVLENBQUEsS0FBQSxDQUFNLElBQVMsS0FBQSxDQUFBLEdBQUksQ0FBQyxNQUFNLENBQUksR0FBQSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUE7QUFBQSxLQUN6RDtBQUFBLEdBQ0YsQ0FBQTtBQUNGLENBQUE7QUFFQSxlQUFzQiw0QkFBQSxDQUNwQixJQUNBLEVBQUEsSUFBQSxHQUFPLFdBQ1AsRUFBQTtBQUNBLEVBQUEsTUFBTSxJQUFPLEdBQUEsSUFBQSxDQUFLLElBQUssQ0FBQSxTQUFBLEVBQVcsZUFBZSxDQUFBLENBQUE7QUFDakQsRUFBQSxNQUFNLGtCQUFxQixHQUFBLE1BQU0sSUFBSyxDQUFBLFVBQUEsQ0FBVyxJQUFJLENBQUEsQ0FBQTtBQUVyRCxFQUFBLElBQUksa0JBQW9CLEVBQUE7QUFDdEIsSUFBQSxPQUFBO0FBQUEsR0FDRjtBQUNBLEVBQUEsTUFBTSxPQUFPLE1BQU0sSUFBQSxDQUFLLFFBQVMsQ0FBQSxjQUFBLENBQWUsdUJBQXVCLENBQUMsQ0FBQSxDQUFBO0FBQ3hFLEVBQU0sTUFBQSxJQUFBLENBQUssU0FBVSxDQUFBLElBQUEsRUFBTSxJQUFJLENBQUEsQ0FBQTtBQUNqQyxDQUFBO0FBRUEsZUFBc0IsNEJBQStCLEdBQUE7QUFDbkQsRUFBQSxNQUFNLEVBQUUsSUFBQSxFQUFNLGFBQWMsRUFBQSxHQUFJLE1BQU0seUJBQTBCLEVBQUEsQ0FBQTtBQUNoRSxFQUFBLE1BQU0sUUFBUSxHQUFJLENBQUE7QUFBQSxJQUNoQiwwQkFBMkIsQ0FBQTtBQUFBLE1BQ3pCLFNBQVcsRUFBQSxJQUFBO0FBQUEsTUFDWCxhQUFBO0FBQUEsS0FDRCxDQUFBO0FBQUEsSUFDRCw0QkFBNkIsQ0FBQTtBQUFBLE1BQzNCLFNBQVcsRUFBQSxJQUFBO0FBQUEsS0FDWixDQUFBO0FBQUEsR0FDRixDQUFBLENBQUE7QUFDSDs7QUMzRGEsTUFBQSxhQUFBLEdBQWdCLE1BQzNCLE9BQVEsQ0FBQTtBQUFBLEVBQ04sT0FBUyxFQUFBLFFBQUE7QUFBQSxFQUNULGFBQWUsRUFBQSxzQkFBQTtBQUNqQixDQUFDLEVBQUE7QUFFSCxNQUFNLGdCQUFBLEdBQW1CLE1BQU0sY0FBQSxDQUFlLDBCQUEwQixDQUFBLENBQUE7QUFFM0QsTUFBQSxNQUFBLEdBQVMsT0FBTyxXQUEwQixLQUFBO0FBQ3JELEVBQU8sT0FBQSxjQUFBO0FBQUEsSUFDTCxPQUFRLENBQUEsUUFBQTtBQUFBLElBQ1IsV0FBQTtBQUFBLE1BQ0U7QUFBQSxRQUNFLFNBQUEsQ0FBVSxNQUFNLGFBQUEsRUFBZSxDQUFBO0FBQUEsUUFDL0Isb0JBQXFCLEVBQUE7QUFBQSxRQUNyQixjQUFBO0FBQUEsVUFDRSxDQUFDLE9BQU8sQ0FBQTtBQUFBLFVBQ1IsQ0FBQyxDQUFDLEtBQUEsRUFBTyxNQUFRLEVBQUEsS0FBQSxFQUFPLE1BQVEsRUFBQSxNQUFBLEVBQVEsT0FBTyxDQUFBLENBQUUsSUFBSyxDQUFBLEdBQUcsQ0FBQyxDQUFBO0FBQUEsU0FDNUQ7QUFBQSxRQUNBLGNBQUEsQ0FBZSxDQUFDLFVBQVksRUFBQSxJQUFJLEdBQUcsQ0FBQyxnQkFBQSxFQUFrQixDQUFDLENBQUE7QUFBQSxRQUN2RCxjQUFBO0FBQUEsVUFDRSxDQUFDLE9BQU8sQ0FBQTtBQUFBLFVBQ1IsRUFBQztBQUFBLFVBQ0QsQ0FBQyxTQUFTLENBQUMsYUFBQSxDQUFjLEtBQUssU0FBVyxFQUFBLENBQUMsVUFBVSxDQUFDLENBQUE7QUFBQSxTQUN2RDtBQUFBLFFBQ0EsY0FBQTtBQUFBLFVBQ0UsQ0FBQywrQkFBK0IsQ0FBQTtBQUFBLFVBQ2hDLENBQUMsT0FBUSxDQUFBLEdBQUEsRUFBSyxDQUFBO0FBQUEsVUFDZCxDQUFDLFVBQVUsQ0FBQyxhQUFBLENBQWMsTUFBTSxTQUFXLEVBQUEsQ0FBQyxJQUFNLEVBQUEsVUFBVSxDQUFDLENBQUE7QUFBQSxTQUMvRDtBQUFBO0FBQUEsUUFFQSxlQUFBLENBQWdCLENBQUMsVUFBVSxDQUFDLENBQUE7QUFBQSxRQUM1QixDQUFDLElBQVUsTUFBQTtBQUFBLFVBQ1QsR0FBRyxJQUFBO0FBQUE7QUFBQSxVQUVILFNBQUEsRUFBVyxLQUFLLFNBQVUsQ0FBQSxNQUFBLEtBQVcsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFLLENBQUEsU0FBQTtBQUFBLFNBQ3hELENBQUE7QUFBQSxPQUNGO0FBQUEsTUFDQSxXQUFBO0FBQUEsS0FDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLEtBQU8sRUFBQSxTQUFBO0FBQUEsTUFDUCxTQUFXLEVBQUEsU0FBQTtBQUFBLEtBQ2I7QUFBQSxHQUNGLENBQUE7QUFDRjs7OzsifQ==