livemark 0.27.1 → 0.27.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Keep Tailwind's source scan out of the target's dependency link, which reaches the
3
+ * whole install (and, through a self-link, the whole project) from inside the Vite root.
4
+ */
5
+ export declare function excludeDependencySources(props: {
6
+ css: string;
7
+ targetDir: string;
8
+ }): string | undefined;
@@ -0,0 +1,13 @@
1
+ import { join, sep } from "node:path";
2
+ const TAILWIND_IMPORT = /@import\s+(["'])tailwindcss(\/utilities)?\1/;
3
+ /**
4
+ * Keep Tailwind's source scan out of the target's dependency link, which reaches the
5
+ * whole install (and, through a self-link, the whole project) from inside the Vite root.
6
+ */
7
+ export function excludeDependencySources(props) {
8
+ if (!TAILWIND_IMPORT.test(props.css))
9
+ return undefined;
10
+ const link = join(props.targetDir, "node_modules").split(sep).join("/");
11
+ return `${props.css}\n@source not "${link}";\n`;
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbHdpbmQtc291cmNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9oZWxwZXJzL3RhaWx3aW5kLXNvdXJjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFckMsTUFBTSxlQUFlLEdBQUcsNkNBQTZDLENBQUE7QUFFckU7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLEtBQXlDO0lBQ2hGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQTtJQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3ZFLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxrQkFBa0IsSUFBSSxNQUFNLENBQUE7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4sIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIlxuXG5jb25zdCBUQUlMV0lORF9JTVBPUlQgPSAvQGltcG9ydFxccysoW1wiJ10pdGFpbHdpbmRjc3MoXFwvdXRpbGl0aWVzKT9cXDEvXG5cbi8qKlxuICogS2VlcCBUYWlsd2luZCdzIHNvdXJjZSBzY2FuIG91dCBvZiB0aGUgdGFyZ2V0J3MgZGVwZW5kZW5jeSBsaW5rLCB3aGljaCByZWFjaGVzIHRoZVxuICogd2hvbGUgaW5zdGFsbCAoYW5kLCB0aHJvdWdoIGEgc2VsZi1saW5rLCB0aGUgd2hvbGUgcHJvamVjdCkgZnJvbSBpbnNpZGUgdGhlIFZpdGUgcm9vdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4Y2x1ZGVEZXBlbmRlbmN5U291cmNlcyhwcm9wczogeyBjc3M6IHN0cmluZzsgdGFyZ2V0RGlyOiBzdHJpbmcgfSkge1xuICBpZiAoIVRBSUxXSU5EX0lNUE9SVC50ZXN0KHByb3BzLmNzcykpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgbGluayA9IGpvaW4ocHJvcHMudGFyZ2V0RGlyLCBcIm5vZGVfbW9kdWxlc1wiKS5zcGxpdChzZXApLmpvaW4oXCIvXCIpXG4gIHJldHVybiBgJHtwcm9wcy5jc3N9XFxuQHNvdXJjZSBub3QgXCIke2xpbmt9XCI7XFxuYFxufVxuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ import { describe, expect, it } from "vite-plus/test";
2
+ import { excludeDependencySources } from "./tailwind-sources.js";
3
+ const targetDir = "/project/.livemark/.target";
4
+ describe("excludeDependencySources", () => {
5
+ it("excludes the dependency link from a Tailwind entry", () => {
6
+ const css = `@import "tailwindcss";\n@import "./shape.css";`;
7
+ expect(excludeDependencySources({ css, targetDir })).toBe(`${css}\n@source not "/project/.livemark/.target/node_modules";\n`);
8
+ });
9
+ it("accepts single quotes, import options and a bare utilities layer", () => {
10
+ for (const css of [
11
+ `@import 'tailwindcss' source(none);`,
12
+ `@import "tailwindcss/utilities" layer(utilities);`,
13
+ ]) {
14
+ expect(excludeDependencySources({ css, targetDir })).toContain("@source not");
15
+ }
16
+ });
17
+ it("leaves other stylesheets alone", () => {
18
+ expect(excludeDependencySources({ css: `@import "tw-animate-css";`, targetDir })).toBeUndefined();
19
+ expect(excludeDependencySources({ css: `@import "tailwindcss/theme";`, targetDir })).toBeUndefined();
20
+ });
21
+ });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbHdpbmQtc291cmNlcy51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvdGFpbHdpbmQtc291cmNlcy51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3JELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBRWhFLE1BQU0sU0FBUyxHQUFHLDRCQUE0QixDQUFBO0FBRTlDLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDeEMsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtRQUM1RCxNQUFNLEdBQUcsR0FBRyxnREFBZ0QsQ0FBQTtRQUM1RCxNQUFNLENBQUMsd0JBQXdCLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDdkQsR0FBRyxHQUFHLDREQUE0RCxDQUNuRSxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsa0VBQWtFLEVBQUUsR0FBRyxFQUFFO1FBQzFFLEtBQUssTUFBTSxHQUFHLElBQUk7WUFDaEIscUNBQXFDO1lBQ3JDLG1EQUFtRDtTQUNwRCxFQUFFLENBQUM7WUFDRixNQUFNLENBQUMsd0JBQXdCLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUMvRSxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQ3hDLE1BQU0sQ0FDSix3QkFBd0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSwyQkFBMkIsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUMxRSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ2pCLE1BQU0sQ0FDSix3QkFBd0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSw4QkFBOEIsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUM3RSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQ25CLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlLXBsdXMvdGVzdFwiXG5pbXBvcnQgeyBleGNsdWRlRGVwZW5kZW5jeVNvdXJjZXMgfSBmcm9tIFwiLi90YWlsd2luZC1zb3VyY2VzLnRzXCJcblxuY29uc3QgdGFyZ2V0RGlyID0gXCIvcHJvamVjdC8ubGl2ZW1hcmsvLnRhcmdldFwiXG5cbmRlc2NyaWJlKFwiZXhjbHVkZURlcGVuZGVuY3lTb3VyY2VzXCIsICgpID0+IHtcbiAgaXQoXCJleGNsdWRlcyB0aGUgZGVwZW5kZW5jeSBsaW5rIGZyb20gYSBUYWlsd2luZCBlbnRyeVwiLCAoKSA9PiB7XG4gICAgY29uc3QgY3NzID0gYEBpbXBvcnQgXCJ0YWlsd2luZGNzc1wiO1xcbkBpbXBvcnQgXCIuL3NoYXBlLmNzc1wiO2BcbiAgICBleHBlY3QoZXhjbHVkZURlcGVuZGVuY3lTb3VyY2VzKHsgY3NzLCB0YXJnZXREaXIgfSkpLnRvQmUoXG4gICAgICBgJHtjc3N9XFxuQHNvdXJjZSBub3QgXCIvcHJvamVjdC8ubGl2ZW1hcmsvLnRhcmdldC9ub2RlX21vZHVsZXNcIjtcXG5gLFxuICAgIClcbiAgfSlcblxuICBpdChcImFjY2VwdHMgc2luZ2xlIHF1b3RlcywgaW1wb3J0IG9wdGlvbnMgYW5kIGEgYmFyZSB1dGlsaXRpZXMgbGF5ZXJcIiwgKCkgPT4ge1xuICAgIGZvciAoY29uc3QgY3NzIG9mIFtcbiAgICAgIGBAaW1wb3J0ICd0YWlsd2luZGNzcycgc291cmNlKG5vbmUpO2AsXG4gICAgICBgQGltcG9ydCBcInRhaWx3aW5kY3NzL3V0aWxpdGllc1wiIGxheWVyKHV0aWxpdGllcyk7YCxcbiAgICBdKSB7XG4gICAgICBleHBlY3QoZXhjbHVkZURlcGVuZGVuY3lTb3VyY2VzKHsgY3NzLCB0YXJnZXREaXIgfSkpLnRvQ29udGFpbihcIkBzb3VyY2Ugbm90XCIpXG4gICAgfVxuICB9KVxuXG4gIGl0KFwibGVhdmVzIG90aGVyIHN0eWxlc2hlZXRzIGFsb25lXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBleGNsdWRlRGVwZW5kZW5jeVNvdXJjZXMoeyBjc3M6IGBAaW1wb3J0IFwidHctYW5pbWF0ZS1jc3NcIjtgLCB0YXJnZXREaXIgfSksXG4gICAgKS50b0JlVW5kZWZpbmVkKClcbiAgICBleHBlY3QoXG4gICAgICBleGNsdWRlRGVwZW5kZW5jeVNvdXJjZXMoeyBjc3M6IGBAaW1wb3J0IFwidGFpbHdpbmRjc3MvdGhlbWVcIjtgLCB0YXJnZXREaXIgfSksXG4gICAgKS50b0JlVW5kZWZpbmVkKClcbiAgfSlcbn0pXG4iXX0=
@@ -4,6 +4,7 @@ import { mergeConfig } from "vite";
4
4
  import packageJson from "../../package.json" with { type: "json" };
5
5
  import { buildTarget } from "../actions/target/build.js";
6
6
  import { renderInlineMarkdown } from "../helpers/render-inline-markdown.js";
7
+ import { excludeDependencySources } from "../helpers/tailwind-sources.js";
7
8
  import { resolveTargetExport } from "../helpers/target-export.js";
8
9
  import { WebsiteConfig } from "../models/config.js";
9
10
  import { ESCAPABLE_FILES, ESCAPABLE_FOLDERS } from "../settings.js";
@@ -68,6 +69,14 @@ export function livemark(opts) {
68
69
  const override = await resolveViteOverride(opts.config.vite, env);
69
70
  return override ? mergeConfig(base, override) : base;
70
71
  },
72
+ // Here, not in `styles/general.css`, so an escaped stylesheet keeps it. Works only
73
+ // while this plugin precedes `tailwind()`: both are `pre`, so array order decides.
74
+ transform: {
75
+ filter: { id: /\.css(\?|$)/ },
76
+ handler(css) {
77
+ return excludeDependencySources({ css, targetDir });
78
+ },
79
+ },
71
80
  resolveId(id) {
72
81
  if (id === VIRTUAL_ID)
73
82
  return VIRTUAL_RESOLVED_ID;
@@ -184,4 +193,4 @@ async function resolveViteOverride(vite, env) {
184
193
  function isObject(v) {
185
194
  return v !== null && typeof v === "object";
186
195
  }
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1saXZlbWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtbGl2ZW1hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUM5RCxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUVyQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ2xDLE9BQU8sV0FBVyxNQUFNLG9CQUFvQixDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFBO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUMzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTtBQUVqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBTW5FLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDbEQsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsZUFBZSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBRXBFOzs7Ozs7Ozs7Ozs7NkJBWTZCO0FBQzdCLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFBO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQTtBQUU3Qzs7OzttRUFJbUU7QUFDbkUsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUFxQjtJQUM1QyxNQUFNLGFBQWEsR0FB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QTtRQUMxRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDekMsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUNyQyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBVTtJQUMxQixPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFBO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcFN5bmMsIGV4aXN0c1N5bmMsIHJtU3luYywgc3RhdFN5bmMgfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBqb2luLCBzZXAgfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB0eXBlIHsgQ29uZmlnRW52LCBQbHVnaW4sIFVzZXJDb25maWcgYXMgVml0ZVVzZXJDb25maWcgfSBmcm9tIFwidml0ZVwiXG5pbXBvcnQgeyBtZXJnZUNvbmZpZyB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCBwYWNrYWdlSnNvbiBmcm9tIFwiLi4vLi4vcGFja2FnZS5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH1cbmltcG9ydCB7IGJ1aWxkVGFyZ2V0IH0gZnJvbSBcIi4uL2FjdGlvbnMvdGFyZ2V0L2J1aWxkLnRzXCJcbmltcG9ydCB7IHJlbmRlcklubGluZU1hcmtkb3duIH0gZnJvbSBcIi4uL2hlbHBlcnMvcmVuZGVyLWlubGluZS1tYXJrZG93bi50c1wiXG5pbXBvcnQgeyByZXNvbHZlVGFyZ2V0RXhwb3J0IH0gZnJvbSBcIi4uL2hlbHBlcnMvdGFyZ2V0LWV4cG9ydC50c1wiXG5pbXBvcnQgdHlwZSB7IENvbmZpZyB9IGZyb20gXCIuLi9tb2RlbHMvY29uZmlnLnRzXCJcbmltcG9ydCB7IFdlYnNpdGVDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgeyBFU0NBUEFCTEVfRklMRVMsIEVTQ0FQQUJMRV9GT0xERVJTIH0gZnJvbSBcIi4uL3NldHRpbmdzLnRzXCJcblxuZXhwb3J0IGludGVyZmFjZSBMaXZlbWFya09wdGlvbnMge1xuICBjb25maWc6IENvbmZpZ1xufVxuXG5jb25zdCBTT1VSQ0VfRElSID0gam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIpXG5jb25zdCBJU19JTlNUQUxMRUQgPSBTT1VSQ0VfRElSLmluY2x1ZGVzKGAke3NlcH1ub2RlX21vZHVsZXMke3NlcH1gKVxuXG4vKiogU2luZ2xlIHZpcnR1YWwgbW9kdWxlIGV4cG9zaW5nIGxpdmVtYXJrJ3MgcnVudGltZSB2YWx1ZXMgdG8gY29uc3VtZXJcbiAqICBvdmVycmlkZSBmaWxlcyB2aWEgbmFtZWQgZXhwb3J0czpcbiAqXG4gKiAgICAgIGltcG9ydCB7IGNvbmZpZyB9IGZyb20gXCJsaXZlbWFyazp2aXJ0dWFsXCJcbiAqXG4gKiAgQ3VycmVudGx5IGV4cG9ydHMgYGNvbmZpZ2AgKHZhbGlkYXRlZCBgV2Vic2l0ZUNvbmZpZ2ApIGFuZCBgYmFubmVySHRtbGBcbiAqICAoYGNvbmZpZy5iYW5uZXJgIHJlbmRlcmVkIGZyb20gaW5saW5lIE1hcmtkb3duIGF0IGJ1aWxkIHRpbWUpOyBmdXR1cmVcbiAqICBhZGRpdGlvbnMgKGUuZy4gYGFydGljbGVzYCwgYHNlY3Rpb25zYCkgbGFuZCBoZXJlIGFzIG5ldyBuYW1lZFxuICogIGV4cG9ydHMgd2l0aG91dCBjb25zdW1lcnMgY2hhbmdpbmcgdGhlaXIgaW1wb3J0IHN0YXRlbWVudHMuXG4gKlxuICogIFRoZSBgXFwwYCBwcmVmaXggb24gdGhlIHJlc29sdmVkIGlkIGlzIFZpdGUncyBjb252ZW50aW9uIHRvIHNpZ25hbFxuICogIFwidGhpcyBpcyBhIHZpcnR1YWwgbW9kdWxlIOKAlCBubyBvdGhlciBwbHVnaW4gc2hvdWxkIHRyeSB0byByZXNvbHZlXG4gKiAgb3IgbG9hZCBpdCBmcm9tIGRpc2tcIi4gKi9cbmNvbnN0IFZJUlRVQUxfSUQgPSBcImxpdmVtYXJrOnZpcnR1YWxcIlxuY29uc3QgVklSVFVBTF9SRVNPTFZFRF9JRCA9IGBcXDAke1ZJUlRVQUxfSUR9YFxuXG4vKiogT3ducyB0aGUgcHJvamVjdCdzIGAubGl2ZW1hcmsvLnRhcmdldC9gIG1vdW50OiBzeW50aGVzaXplcyBpdCB2aWFcbiAqICBgYnVpbGRUYXJnZXQoKWAsIHJldHVybnMgdGhlIFZpdGUgY29uZmlnIHRoYXQgYW5jaG9ycyB0aGVyZSwgYW5kXG4gKiAgY29waWVzIGAubGl2ZW1hcmsvYCBlZGl0cyAocGx1cyBsaXZlbWFyaydzIGBzb3VyY2UvYCBpbiBpdHMgb3duIGRldilcbiAqICBpbnRvIHRoZSB0YXJnZXQuIFZpdGUgd2F0Y2hlcyB0aGUgdGFyZ2V0IG5hdGl2ZWx5LCBzbyBpdHMgb3duIEhNUlxuICogIGRlY2lkZXMgYmV0d2VlbiBGYXN0IFJlZnJlc2gsIENTUyB1cGRhdGVzIGFuZCBhIHBhZ2UgcmVsb2FkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdmVtYXJrKG9wdHM6IExpdmVtYXJrT3B0aW9ucyk6IFBsdWdpbiB7XG4gIGNvbnN0IG92ZXJyaWRlc1Jvb3QgPSBqb2luKG9wdHMuY29uZmlnLnJvb3QsIFwiLmxpdmVtYXJrXCIpXG4gIGNvbnN0IG91dERpciA9IGpvaW4ob3ZlcnJpZGVzUm9vdCwgXCJidWlsZFwiKVxuICBsZXQgdGFyZ2V0RGlyID0gXCJcIlxuICByZXR1cm4ge1xuICAgIG5hbWU6IFwibGl2ZW1hcmtcIixcbiAgICBlbmZvcmNlOiBcInByZVwiLFxuICAgIGFzeW5jIGNvbmZpZyhfLCBlbnYpIHtcbiAgICAgIHRhcmdldERpciA9IGJ1aWxkVGFyZ2V0KHtcbiAgICAgICAgY29uZmlnUGF0aDogb3B0cy5jb25maWcuY29uZmlnUGF0aCxcbiAgICAgICAgc291cmNlRGlyOiBTT1VSQ0VfRElSLFxuICAgICAgfSlcbiAgICAgIGNvbnN0IGJhc2U6IFZpdGVVc2VyQ29uZmlnID0ge1xuICAgICAgICByb290OiB0YXJnZXREaXIsXG4gICAgICAgIC8vIFRoZSBkZWZhdWx0IGA8cm9vdD4vbm9kZV9tb2R1bGVzLy52aXRlYCB3b3VsZCBsYW5kIGluc2lkZSB0aGVcbiAgICAgICAgLy8gZGVwZW5kZW5jeSBsaW5rLCBpLmUuIGluIGxpdmVtYXJrJ3Mgc2hhcmVkIGluc3RhbGwuXG4gICAgICAgIGNhY2hlRGlyOiBqb2luKHRhcmdldERpciwgXCIudml0ZVwiKSxcbiAgICAgICAgLy8gTW91bnQgZXZlcnl0aGluZyAoYXNzZXQgVVJMcywgbW9kdWxlcHJlbG9hZHMsIGRldiBzZXJ2ZXIpIHVuZGVyXG4gICAgICAgIC8vIGBjb25maWcuYmFzZWAgc28gdGhlIHNhbWUgYnVpbGQgd29ya3MgYXQgcm9vdCBvciBhdCBhIHN1Yi1wYXRoXG4gICAgICAgIC8vIChlLmcuIEdpdEh1YiBQYWdlcyBgaHR0cHM6Ly91c2VyLmdpdGh1Yi5pby9yZXBvL2ApLiBUaGUgcm91dGVyXG4gICAgICAgIC8vIGFuZCBhc3NldC1wYXRoIHJlc29sdmVyIG1pcnJvciB0aGlzIGF0IHJ1bnRpbWUuXG4gICAgICAgIGJhc2U6IG9wdHMuY29uZmlnLmJhc2UgPyBgJHtvcHRzLmNvbmZpZy5iYXNlfS9gIDogXCIvXCIsXG4gICAgICAgIC8vIG91dERpciBsaXZlcyBvdXRzaWRlIHRoZSB0YXJnZXQgcm9vdCwgc28gVml0ZSdzIHJlZnVzYWwgdG9cbiAgICAgICAgLy8gZW1wdHkgb3V0LW9mLXJvb3QgZGlyZWN0b3JpZXMgbmVlZHMgYGVtcHR5T3V0RGlyYC5cbiAgICAgICAgYnVpbGQ6IHsgb3V0RGlyLCBlbXB0eU91dERpcjogdHJ1ZSB9LFxuICAgICAgICByZXNvbHZlOiB7IGRlZHVwZTogW1wicmVhY3RcIiwgXCJyZWFjdC1kb21cIl0gfSxcbiAgICAgICAgLy8gRm9yIHRoZSBTU1IgYnVpbGQgb25seSwgaW5saW5lIGV2ZXJ5IG5vZGVfbW9kdWxlcyBkZXAgaW50b1xuICAgICAgICAvLyBzZXJ2ZXIuanMuIFRoZSBwcmVyZW5kZXIgc3RlcCAod2hpY2ggcnVucyBzZXJ2ZXIuanMgd2l0aFxuICAgICAgICAvLyBOb2RlKSB3YWxrcyBub2RlX21vZHVsZXMgZnJvbSB0aGUgYnVpbGQvIGRpciBhbmQgY2FuJ3QgcmVhY2hcbiAgICAgICAgLy8gcGFja2FnZXMgYnVyaWVkIGluIHBucG0ncyBgLnBucG0vKi9ub2RlX21vZHVsZXMvYCAoZS5nLlxuICAgICAgICAvLyBUYW5TdGFjay1pbnRlcm5hbCBhbGlhc2VzIGxpa2UgYGgzLXYyYCkuIFNlbGYtY29udGFpbmVkXG4gICAgICAgIC8vIGJ1bmRsZSBieXBhc3NlcyB0aGUgaXNzdWUuIERldiBTU1Iga2VlcHMgZXh0ZXJuYWxzIChmYXN0ZXIpLlxuICAgICAgICAuLi4oZW52LmNvbW1hbmQgPT09IFwiYnVpbGRcIiAmJiB7XG4gICAgICAgICAgZW52aXJvbm1lbnRzOiB7IHNzcjogeyByZXNvbHZlOiB7IG5vRXh0ZXJuYWw6IHRydWUgfSB9IH0sXG4gICAgICAgIH0pLFxuICAgICAgfVxuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBhd2FpdCByZXNvbHZlVml0ZU92ZXJyaWRlKG9wdHMuY29uZmlnLnZpdGUsIGVudilcbiAgICAgIHJldHVybiBvdmVycmlkZSA/IG1lcmdlQ29uZmlnKGJhc2UsIG92ZXJyaWRlKSA6IGJhc2VcbiAgICB9LFxuICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgaWYgKGlkID09PSBWSVJUVUFMX0lEKSByZXR1cm4gVklSVFVBTF9SRVNPTFZFRF9JRFxuICAgICAgcmV0dXJuIHJlc29sdmVUYXJnZXRFeHBvcnQoeyBpZCwgdGFyZ2V0RGlyLCBleHBvcnRzOiBwYWNrYWdlSnNvbi5leHBvcnRzIH0pID8/IG51bGxcbiAgICB9LFxuICAgIGxvYWQoaWQpIHtcbiAgICAgIGlmIChpZCAhPT0gVklSVFVBTF9SRVNPTFZFRF9JRCkgcmV0dXJuIG51bGxcbiAgICAgIGNvbnN0IGNvbmZpZyA9IFdlYnNpdGVDb25maWcucGFyc2Uob3B0cy5jb25maWcpXG4gICAgICBjb25zdCBiYW5uZXJIdG1sID0gY29uZmlnLmJhbm5lclxuICAgICAgICA/IHJlbmRlcklubGluZU1hcmtkb3duKGNvbmZpZy5iYW5uZXIsIGNvbmZpZy5iYXNlKVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgYGV4cG9ydCBjb25zdCBjb25maWcgPSAke0pTT04uc3RyaW5naWZ5KGNvbmZpZyl9YCxcbiAgICAgICAgYGV4cG9ydCBjb25zdCBiYW5uZXJIdG1sID0gJHtKU09OLnN0cmluZ2lmeShiYW5uZXJIdG1sKX1gLFxuICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgfSxcbiAgICBjb25maWd1cmVTZXJ2ZXIoc2VydmVyKSB7XG4gICAgICAvLyBWaXRlIHdhdGNoZXMgb25seSBpdHMgcm9vdCAodGhlIHRhcmdldCk7IHRoZSBmaWxlcyB0aGUgdGFyZ2V0IGlzXG4gICAgICAvLyBjb3BpZWQgZnJvbSBqb2luIGl0cyB3YXRjaGVyIGhlcmUuIGAubGl2ZW1hcmsvYCBhbHdheXMgZXhpc3RzXG4gICAgICAvLyBiZWNhdXNlIHRoZSB0YXJnZXQgbGl2ZXMgaW5zaWRlIGl0LlxuICAgICAgc2VydmVyLndhdGNoZXIuYWRkKFtvcHRzLmNvbmZpZy5jb25maWdQYXRoLCBvdmVycmlkZXNSb290XSlcbiAgICAgIGlmICghSVNfSU5TVEFMTEVEKSBzZXJ2ZXIud2F0Y2hlci5hZGQoU09VUkNFX0RJUilcbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwiY2hhbmdlXCIsIGZpbGUgPT4gb25DaGFuZ2UoZmlsZSwgXCJjaGFuZ2VcIikpXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5vbihcImFkZFwiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwiYWRkXCIpKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJ1bmxpbmtcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcInVubGlua1wiKSlcbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwidW5saW5rRGlyXCIsIGZpbGUgPT4gb25DaGFuZ2UoZmlsZSwgXCJ1bmxpbmtcIikpXG5cbiAgICAgIGZ1bmN0aW9uIG9uQ2hhbmdlKGZpbGU6IHN0cmluZywga2luZDogXCJjaGFuZ2VcIiB8IFwiYWRkXCIgfCBcInVubGlua1wiKSB7XG4gICAgICAgIGlmIChmaWxlID09PSBvcHRzLmNvbmZpZy5jb25maWdQYXRoKSB7XG4gICAgICAgICAgc2VydmVyLnJlc3RhcnQoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpc1dpdGhpbihmaWxlLCB0YXJnZXREaXIpIHx8IGlzV2l0aGluKGZpbGUsIG91dERpcikpIHJldHVyblxuICAgICAgICBjb25zdCBvdmVybGF5SGl0ID0gbWF0Y2hQYXRoKGZpbGUsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgIGlmIChvdmVybGF5SGl0KSB7XG4gICAgICAgICAgc3luY092ZXJsYXkob3ZlcmxheUhpdCwga2luZCwgdGFyZ2V0RGlyLCBvdmVycmlkZXNSb290KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZUhpdCA9IG1hdGNoUGF0aChmaWxlLCBTT1VSQ0VfRElSKVxuICAgICAgICBpZiAoc291cmNlSGl0ICYmICFzb3VyY2VIaXQucmVsLmluY2x1ZGVzKFwicm91dGVUcmVlLmdlbi50c1wiKSkge1xuICAgICAgICAgIHN5bmNTb3VyY2Uoc291cmNlSGl0LCBraW5kLCB0YXJnZXREaXIsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9XG59XG5cbmludGVyZmFjZSBIaXQge1xuICByZWw6IHN0cmluZ1xuICBjYXRlZ29yeTogXCJmb2xkZXJcIiB8IFwiZmlsZVwiIHwgbnVsbFxufVxuXG5mdW5jdGlvbiBtYXRjaFBhdGgoZmlsZTogc3RyaW5nLCByb290OiBzdHJpbmcpOiBIaXQgfCBudWxsIHtcbiAgaWYgKCFpc1dpdGhpbihmaWxlLCByb290KSB8fCBmaWxlID09PSByb290KSByZXR1cm4gbnVsbFxuICBjb25zdCByZWwgPSBmaWxlLnNsaWNlKHJvb3QubGVuZ3RoICsgc2VwLmxlbmd0aClcbiAgcmV0dXJuIHsgcmVsLCBjYXRlZ29yeTogY2xhc3NpZnkocmVsKSB9XG59XG5cbmZ1bmN0aW9uIGlzV2l0aGluKGZpbGU6IHN0cmluZywgZGlyOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZpbGUgPT09IGRpciB8fCBmaWxlLnN0YXJ0c1dpdGgoYCR7ZGlyfSR7c2VwfWApXG59XG5cbmZ1bmN0aW9uIGNsYXNzaWZ5KHJlbDogc3RyaW5nKTogXCJmb2xkZXJcIiB8IFwiZmlsZVwiIHwgbnVsbCB7XG4gIGNvbnN0IFtoZWFkXSA9IHJlbC5zcGxpdChzZXApXG4gIGlmIChoZWFkICYmIEVTQ0FQQUJMRV9GT0xERVJTLmluY2x1ZGVzKGhlYWQpKSByZXR1cm4gXCJmb2xkZXJcIlxuICBpZiAoRVNDQVBBQkxFX0ZJTEVTLmluY2x1ZGVzKHJlbCkpIHJldHVybiBcImZpbGVcIlxuICAvLyBOb24tZXNjYXBhYmxlIHNvdXJjZSBmaWxlcyBzdGlsbCBuZWVkIHRvIGZsb3cgaW50byB0YXJnZXQgZHVyaW5nXG4gIC8vIGxpdmVtYXJrJ3Mgb3duIGRldiDigJQgdGhlIHVzZXIgaXMgZWRpdGluZyB0aGUgY2Fub25pY2FsIHNvdXJjZS5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gc3luY092ZXJsYXkoXG4gIGhpdDogSGl0LFxuICBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIsXG4gIHRhcmdldERpcjogc3RyaW5nLFxuICBvdmVycmlkZXNSb290OiBzdHJpbmcsXG4pIHtcbiAgaWYgKCFoaXQuY2F0ZWdvcnkpIHJldHVyblxuICBjb25zdCBkZXN0ID0gam9pbih0YXJnZXREaXIsIGhpdC5yZWwpXG4gIGNvbnN0IHNvdXJjZSA9IGpvaW4oU09VUkNFX0RJUiwgaGl0LnJlbClcbiAgaWYgKGtpbmQgPT09IFwidW5saW5rXCIpIHtcbiAgICAvLyBDb3B5IGEgZmlsZSdzIGRlZmF1bHQgb3ZlciB0aGUgZXNjYXBlIGluIG9uZSB3cml0ZTogYW4gdW5saW5rIHRoZW5cbiAgICAvLyBhbiBhZGQgcmVhY2hlcyBWaXRlIGFzIHR3byBldmVudHMgYW5kIGNvc3RzIGEgcGFnZSByZWxvYWQuXG4gICAgaWYgKCFleGlzdHNTeW5jKHNvdXJjZSkgfHwgc3RhdFN5bmMoc291cmNlKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBybVN5bmMoZGVzdCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgfVxuICAgIGlmIChleGlzdHNTeW5jKHNvdXJjZSkpIGNwU3luYyhzb3VyY2UsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IG92ZXJsYXkgPSBqb2luKG92ZXJyaWRlc1Jvb3QsIGhpdC5yZWwpXG4gIGlmIChleGlzdHNTeW5jKG92ZXJsYXkpKSBjcFN5bmMob3ZlcmxheSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG59XG5cbmZ1bmN0aW9uIHN5bmNTb3VyY2UoXG4gIGhpdDogSGl0LFxuICBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIsXG4gIHRhcmdldERpcjogc3RyaW5nLFxuICBvdmVycmlkZXNSb290OiBzdHJpbmcsXG4pIHtcbiAgLy8gSWYgdGhlIGNvbnN1bWVyIGhhcyBhbiBvdmVybGF5IGZvciB0aGlzIGZpbGUgKGFuZCBpdCdzIGVzY2FwYWJsZSksXG4gIC8vIHRoZSBvdmVybGF5IHdpbnMg4oCUIGlnbm9yZSBzb3VyY2UgY2hhbmdlcy5cbiAgaWYgKGhpdC5jYXRlZ29yeSAmJiBleGlzdHNTeW5jKGpvaW4ob3ZlcnJpZGVzUm9vdCwgaGl0LnJlbCkpKSByZXR1cm5cbiAgY29uc3QgZGVzdCA9IGpvaW4odGFyZ2V0RGlyLCBoaXQucmVsKVxuICBjb25zdCBzb3VyY2UgPSBqb2luKFNPVVJDRV9ESVIsIGhpdC5yZWwpXG4gIGlmIChraW5kID09PSBcInVubGlua1wiKSB7XG4gICAgcm1TeW5jKGRlc3QsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIHJldHVyblxuICB9XG4gIGlmIChleGlzdHNTeW5jKHNvdXJjZSkpIGNwU3luYyhzb3VyY2UsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxufVxuXG4vKiogUmVzb2x2ZSBsaXZlbWFyay5jb25maWcudHMncyBgdml0ZWAgZmllbGQg4oCUIGVpdGhlciBhIGNvbmZpZyBvYmplY3RcbiAqICBvciBhIGZ1bmN0aW9uIGAoZW52KSA9PiBjb25maWdgIChtYXRjaGluZyBWaXRlJ3Mgb3duIGBkZWZpbmVDb25maWdgKS5cbiAqICBTY2hlbWEgc3RvcmVzIGl0IGFzIGB1bmtub3duYDsgdHlwaW5nIGZvciB0aGUgY29uc3VtZXIncyBlZGl0b3JcbiAqICBsaXZlcyBvbiB7QGxpbmsgVml0ZU92ZXJyaWRlfS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVWaXRlT3ZlcnJpZGUoXG4gIHZpdGU6IHVua25vd24sXG4gIGVudjogQ29uZmlnRW52LFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw+IHtcbiAgaWYgKCF2aXRlKSByZXR1cm4gbnVsbFxuICBpZiAodHlwZW9mIHZpdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFJlZmxlY3QuYXBwbHkodml0ZSwgdW5kZWZpbmVkLCBbZW52XSlcbiAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IG51bGxcbiAgfVxuICByZXR1cm4gaXNPYmplY3Qodml0ZSkgPyB2aXRlIDogbnVsbFxufVxuXG5mdW5jdGlvbiBpc09iamVjdCh2OiB1bmtub3duKTogdiBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB2ICE9PSBudWxsICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiXG59XG4iXX0=
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1saXZlbWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtbGl2ZW1hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUM5RCxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUVyQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ2xDLE9BQU8sV0FBVyxNQUFNLG9CQUFvQixDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFBO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUMzRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTtBQUVqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBTW5FLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDbEQsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsZUFBZSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBRXBFOzs7Ozs7Ozs7Ozs7NkJBWTZCO0FBQzdCLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFBO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQTtBQUU3Qzs7OzttRUFJbUU7QUFDbkUs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cUNBR3FDO0FBQ3JDLEtBQUssVUFBVSxtQkFBbUIsQ0FDaEMsSUFBYSxFQUNiLEdBQWM7SUFFZCxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ3RCLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQzFELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUN6QyxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQ3JDLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxDQUFVO0lBQzFCLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUE7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNwU3luYywgZXhpc3RzU3luYywgcm1TeW5jLCBzdGF0U3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGpvaW4sIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHR5cGUgeyBDb25maWdFbnYsIFBsdWdpbiwgVXNlckNvbmZpZyBhcyBWaXRlVXNlckNvbmZpZyB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCB7IG1lcmdlQ29uZmlnIH0gZnJvbSBcInZpdGVcIlxuaW1wb3J0IHBhY2thZ2VKc29uIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfVxuaW1wb3J0IHsgYnVpbGRUYXJnZXQgfSBmcm9tIFwiLi4vYWN0aW9ucy90YXJnZXQvYnVpbGQudHNcIlxuaW1wb3J0IHsgcmVuZGVySW5saW5lTWFya2Rvd24gfSBmcm9tIFwiLi4vaGVscGVycy9yZW5kZXItaW5saW5lLW1hcmtkb3duLnRzXCJcbmltcG9ydCB7IGV4Y2x1ZGVEZXBlbmRlbmN5U291cmNlcyB9IGZyb20gXCIuLi9oZWxwZXJzL3RhaWx3aW5kLXNvdXJjZXMudHNcIlxuaW1wb3J0IHsgcmVzb2x2ZVRhcmdldEV4cG9ydCB9IGZyb20gXCIuLi9oZWxwZXJzL3RhcmdldC1leHBvcnQudHNcIlxuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgeyBXZWJzaXRlQ29uZmlnIH0gZnJvbSBcIi4uL21vZGVscy9jb25maWcudHNcIlxuaW1wb3J0IHsgRVNDQVBBQkxFX0ZJTEVTLCBFU0NBUEFCTEVfRk9MREVSUyB9IGZyb20gXCIuLi9zZXR0aW5ncy50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGl2ZW1hcmtPcHRpb25zIHtcbiAgY29uZmlnOiBDb25maWdcbn1cblxuY29uc3QgU09VUkNFX0RJUiA9IGpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiKVxuY29uc3QgSVNfSU5TVEFMTEVEID0gU09VUkNFX0RJUi5pbmNsdWRlcyhgJHtzZXB9bm9kZV9tb2R1bGVzJHtzZXB9YClcblxuLyoqIFNpbmdsZSB2aXJ0dWFsIG1vZHVsZSBleHBvc2luZyBsaXZlbWFyaydzIHJ1bnRpbWUgdmFsdWVzIHRvIGNvbnN1bWVyXG4gKiAgb3ZlcnJpZGUgZmlsZXMgdmlhIG5hbWVkIGV4cG9ydHM6XG4gKlxuICogICAgICBpbXBvcnQgeyBjb25maWcgfSBmcm9tIFwibGl2ZW1hcms6dmlydHVhbFwiXG4gKlxuICogIEN1cnJlbnRseSBleHBvcnRzIGBjb25maWdgICh2YWxpZGF0ZWQgYFdlYnNpdGVDb25maWdgKSBhbmQgYGJhbm5lckh0bWxgXG4gKiAgKGBjb25maWcuYmFubmVyYCByZW5kZXJlZCBmcm9tIGlubGluZSBNYXJrZG93biBhdCBidWlsZCB0aW1lKTsgZnV0dXJlXG4gKiAgYWRkaXRpb25zIChlLmcuIGBhcnRpY2xlc2AsIGBzZWN0aW9uc2ApIGxhbmQgaGVyZSBhcyBuZXcgbmFtZWRcbiAqICBleHBvcnRzIHdpdGhvdXQgY29uc3VtZXJzIGNoYW5naW5nIHRoZWlyIGltcG9ydCBzdGF0ZW1lbnRzLlxuICpcbiAqICBUaGUgYFxcMGAgcHJlZml4IG9uIHRoZSByZXNvbHZlZCBpZCBpcyBWaXRlJ3MgY29udmVudGlvbiB0byBzaWduYWxcbiAqICBcInRoaXMgaXMgYSB2aXJ0dWFsIG1vZHVsZSDigJQgbm8gb3RoZXIgcGx1Z2luIHNob3VsZCB0cnkgdG8gcmVzb2x2ZVxuICogIG9yIGxvYWQgaXQgZnJvbSBkaXNrXCIuICovXG5jb25zdCBWSVJUVUFMX0lEID0gXCJsaXZlbWFyazp2aXJ0dWFsXCJcbmNvbnN0IFZJUlRVQUxfUkVTT0xWRURfSUQgPSBgXFwwJHtWSVJUVUFMX0lEfWBcblxuLyoqIE93bnMgdGhlIHByb2plY3QncyBgLmxpdmVtYXJrLy50YXJnZXQvYCBtb3VudDogc3ludGhlc2l6ZXMgaXQgdmlhXG4gKiAgYGJ1aWxkVGFyZ2V0KClgLCByZXR1cm5zIHRoZSBWaXRlIGNvbmZpZyB0aGF0IGFuY2hvcnMgdGhlcmUsIGFuZFxuICogIGNvcGllcyBgLmxpdmVtYXJrL2AgZWRpdHMgKHBsdXMgbGl2ZW1hcmsncyBgc291cmNlL2AgaW4gaXRzIG93biBkZXYpXG4gKiAgaW50byB0aGUgdGFyZ2V0LiBWaXRlIHdhdGNoZXMgdGhlIHRhcmdldCBuYXRpdmVseSwgc28gaXRzIG93biBITVJcbiAqICBkZWNpZGVzIGJldHdlZW4gRmFzdCBSZWZyZXNoLCBDU1MgdXBkYXRlcyBhbmQgYSBwYWdlIHJlbG9hZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXZlbWFyayhvcHRzOiBMaXZlbWFya09wdGlvbnMpOiBQbHVnaW4ge1xuICBjb25zdCBvdmVycmlkZXNSb290ID0gam9pbihvcHRzLmNvbmZpZy5yb290LCBcIi5saXZlbWFya1wiKVxuICBjb25zdCBvdXREaXIgPSBqb2luKG92ZXJyaWRlc1Jvb3QsIFwiYnVpbGRcIilcbiAgbGV0IHRhcmdldERpciA9IFwiXCJcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBcImxpdmVtYXJrXCIsXG4gICAgZW5mb3JjZTogXCJwcmVcIixcbiAgICBhc3luYyBjb25maWcoXywgZW52KSB7XG4gICAgICB0YXJnZXREaXIgPSBidWlsZFRhcmdldCh7XG4gICAgICAgIGNvbmZpZ1BhdGg6IG9wdHMuY29uZmlnLmNvbmZpZ1BhdGgsXG4gICAgICAgIHNvdXJjZURpcjogU09VUkNFX0RJUixcbiAgICAgIH0pXG4gICAgICBjb25zdCBiYXNlOiBWaXRlVXNlckNvbmZpZyA9IHtcbiAgICAgICAgcm9vdDogdGFyZ2V0RGlyLFxuICAgICAgICAvLyBUaGUgZGVmYXVsdCBgPHJvb3Q+L25vZGVfbW9kdWxlcy8udml0ZWAgd291bGQgbGFuZCBpbnNpZGUgdGhlXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgbGluaywgaS5lLiBpbiBsaXZlbWFyaydzIHNoYXJlZCBpbnN0YWxsLlxuICAgICAgICBjYWNoZURpcjogam9pbih0YXJnZXREaXIsIFwiLnZpdGVcIiksXG4gICAgICAgIC8vIE1vdW50IGV2ZXJ5dGhpbmcgKGFzc2V0IFVSTHMsIG1vZHVsZXByZWxvYWRzLCBkZXYgc2VydmVyKSB1bmRlclxuICAgICAgICAvLyBgY29uZmlnLmJhc2VgIHNvIHRoZSBzYW1lIGJ1aWxkIHdvcmtzIGF0IHJvb3Qgb3IgYXQgYSBzdWItcGF0aFxuICAgICAgICAvLyAoZS5nLiBHaXRIdWIgUGFnZXMgYGh0dHBzOi8vdXNlci5naXRodWIuaW8vcmVwby9gKS4gVGhlIHJvdXRlclxuICAgICAgICAvLyBhbmQgYXNzZXQtcGF0aCByZXNvbHZlciBtaXJyb3IgdGhpcyBhdCBydW50aW1lLlxuICAgICAgICBiYXNlOiBvcHRzLmNvbmZpZy5iYXNlID8gYCR7b3B0cy5jb25maWcuYmFzZX0vYCA6IFwiL1wiLFxuICAgICAgICAvLyBvdXREaXIgbGl2ZXMgb3V0c2lkZSB0aGUgdGFyZ2V0IHJvb3QsIHNvIFZpdGUncyByZWZ1c2FsIHRvXG4gICAgICAgIC8vIGVtcHR5IG91dC1vZi1yb290IGRpcmVjdG9yaWVzIG5lZWRzIGBlbXB0eU91dERpcmAuXG4gICAgICAgIGJ1aWxkOiB7IG91dERpciwgZW1wdHlPdXREaXI6IHRydWUgfSxcbiAgICAgICAgcmVzb2x2ZTogeyBkZWR1cGU6IFtcInJlYWN0XCIsIFwicmVhY3QtZG9tXCJdIH0sXG4gICAgICAgIC8vIEZvciB0aGUgU1NSIGJ1aWxkIG9ubHksIGlubGluZSBldmVyeSBub2RlX21vZHVsZXMgZGVwIGludG9cbiAgICAgICAgLy8gc2VydmVyLmpzLiBUaGUgcHJlcmVuZGVyIHN0ZXAgKHdoaWNoIHJ1bnMgc2VydmVyLmpzIHdpdGhcbiAgICAgICAgLy8gTm9kZSkgd2Fsa3Mgbm9kZV9tb2R1bGVzIGZyb20gdGhlIGJ1aWxkLyBkaXIgYW5kIGNhbid0IHJlYWNoXG4gICAgICAgIC8vIHBhY2thZ2VzIGJ1cmllZCBpbiBwbnBtJ3MgYC5wbnBtLyovbm9kZV9tb2R1bGVzL2AgKGUuZy5cbiAgICAgICAgLy8gVGFuU3RhY2staW50ZXJuYWwgYWxpYXNlcyBsaWtlIGBoMy12MmApLiBTZWxmLWNvbnRhaW5lZFxuICAgICAgICAvLyBidW5kbGUgYnlwYXNzZXMgdGhlIGlzc3VlLiBEZXYgU1NSIGtlZXBzIGV4dGVybmFscyAoZmFzdGVyKS5cbiAgICAgICAgLi4uKGVudi5jb21tYW5kID09PSBcImJ1aWxkXCIgJiYge1xuICAgICAgICAgIGVudmlyb25tZW50czogeyBzc3I6IHsgcmVzb2x2ZTogeyBub0V4dGVybmFsOiB0cnVlIH0gfSB9LFxuICAgICAgICB9KSxcbiAgICAgIH1cbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gYXdhaXQgcmVzb2x2ZVZpdGVPdmVycmlkZShvcHRzLmNvbmZpZy52aXRlLCBlbnYpXG4gICAgICByZXR1cm4gb3ZlcnJpZGUgPyBtZXJnZUNvbmZpZyhiYXNlLCBvdmVycmlkZSkgOiBiYXNlXG4gICAgfSxcbiAgICAvLyBIZXJlLCBub3QgaW4gYHN0eWxlcy9nZW5lcmFsLmNzc2AsIHNvIGFuIGVzY2FwZWQgc3R5bGVzaGVldCBrZWVwcyBpdC4gV29ya3Mgb25seVxuICAgIC8vIHdoaWxlIHRoaXMgcGx1Z2luIHByZWNlZGVzIGB0YWlsd2luZCgpYDogYm90aCBhcmUgYHByZWAsIHNvIGFycmF5IG9yZGVyIGRlY2lkZXMuXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBmaWx0ZXI6IHsgaWQ6IC9cXC5jc3MoXFw/fCQpLyB9LFxuICAgICAgaGFuZGxlcihjc3MpIHtcbiAgICAgICAgcmV0dXJuIGV4Y2x1ZGVEZXBlbmRlbmN5U291cmNlcyh7IGNzcywgdGFyZ2V0RGlyIH0pXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVzb2x2ZUlkKGlkKSB7XG4gICAgICBpZiAoaWQgPT09IFZJUlRVQUxfSUQpIHJldHVybiBWSVJUVUFMX1JFU09MVkVEX0lEXG4gICAgICByZXR1cm4gcmVzb2x2ZVRhcmdldEV4cG9ydCh7IGlkLCB0YXJnZXREaXIsIGV4cG9ydHM6IHBhY2thZ2VKc29uLmV4cG9ydHMgfSkgPz8gbnVsbFxuICAgIH0sXG4gICAgbG9hZChpZCkge1xuICAgICAgaWYgKGlkICE9PSBWSVJUVUFMX1JFU09MVkVEX0lEKSByZXR1cm4gbnVsbFxuICAgICAgY29uc3QgY29uZmlnID0gV2Vic2l0ZUNvbmZpZy5wYXJzZShvcHRzLmNvbmZpZylcbiAgICAgIGNvbnN0IGJhbm5lckh0bWwgPSBjb25maWcuYmFubmVyXG4gICAgICAgID8gcmVuZGVySW5saW5lTWFya2Rvd24oY29uZmlnLmJhbm5lciwgY29uZmlnLmJhc2UpXG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgICByZXR1cm4gW1xuICAgICAgICBgZXhwb3J0IGNvbnN0IGNvbmZpZyA9ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnKX1gLFxuICAgICAgICBgZXhwb3J0IGNvbnN0IGJhbm5lckh0bWwgPSAke0pTT04uc3RyaW5naWZ5KGJhbm5lckh0bWwpfWAsXG4gICAgICBdLmpvaW4oXCJcXG5cIilcbiAgICB9LFxuICAgIGNvbmZpZ3VyZVNlcnZlcihzZXJ2ZXIpIHtcbiAgICAgIC8vIFZpdGUgd2F0Y2hlcyBvbmx5IGl0cyByb290ICh0aGUgdGFyZ2V0KTsgdGhlIGZpbGVzIHRoZSB0YXJnZXQgaXNcbiAgICAgIC8vIGNvcGllZCBmcm9tIGpvaW4gaXRzIHdhdGNoZXIgaGVyZS4gYC5saXZlbWFyay9gIGFsd2F5cyBleGlzdHNcbiAgICAgIC8vIGJlY2F1c2UgdGhlIHRhcmdldCBsaXZlcyBpbnNpZGUgaXQuXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5hZGQoW29wdHMuY29uZmlnLmNvbmZpZ1BhdGgsIG92ZXJyaWRlc1Jvb3RdKVxuICAgICAgaWYgKCFJU19JTlNUQUxMRUQpIHNlcnZlci53YXRjaGVyLmFkZChTT1VSQ0VfRElSKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJjaGFuZ2VcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcImNoYW5nZVwiKSlcbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwiYWRkXCIsIGZpbGUgPT4gb25DaGFuZ2UoZmlsZSwgXCJhZGRcIikpXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5vbihcInVubGlua1wiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwidW5saW5rXCIpKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJ1bmxpbmtEaXJcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcInVubGlua1wiKSlcblxuICAgICAgZnVuY3Rpb24gb25DaGFuZ2UoZmlsZTogc3RyaW5nLCBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIpIHtcbiAgICAgICAgaWYgKGZpbGUgPT09IG9wdHMuY29uZmlnLmNvbmZpZ1BhdGgpIHtcbiAgICAgICAgICBzZXJ2ZXIucmVzdGFydCgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzV2l0aGluKGZpbGUsIHRhcmdldERpcikgfHwgaXNXaXRoaW4oZmlsZSwgb3V0RGlyKSkgcmV0dXJuXG4gICAgICAgIGNvbnN0IG92ZXJsYXlIaXQgPSBtYXRjaFBhdGgoZmlsZSwgb3ZlcnJpZGVzUm9vdClcbiAgICAgICAgaWYgKG92ZXJsYXlIaXQpIHtcbiAgICAgICAgICBzeW5jT3ZlcmxheShvdmVybGF5SGl0LCBraW5kLCB0YXJnZXREaXIsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlSGl0ID0gbWF0Y2hQYXRoKGZpbGUsIFNPVVJDRV9ESVIpXG4gICAgICAgIGlmIChzb3VyY2VIaXQgJiYgIXNvdXJjZUhpdC5yZWwuaW5jbHVkZXMoXCJyb3V0ZVRyZWUuZ2VuLnRzXCIpKSB7XG4gICAgICAgICAgc3luY1NvdXJjZShzb3VyY2VIaXQsIGtpbmQsIHRhcmdldERpciwgb3ZlcnJpZGVzUm9vdClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH1cbn1cblxuaW50ZXJmYWNlIEhpdCB7XG4gIHJlbDogc3RyaW5nXG4gIGNhdGVnb3J5OiBcImZvbGRlclwiIHwgXCJmaWxlXCIgfCBudWxsXG59XG5cbmZ1bmN0aW9uIG1hdGNoUGF0aChmaWxlOiBzdHJpbmcsIHJvb3Q6IHN0cmluZyk6IEhpdCB8IG51bGwge1xuICBpZiAoIWlzV2l0aGluKGZpbGUsIHJvb3QpIHx8IGZpbGUgPT09IHJvb3QpIHJldHVybiBudWxsXG4gIGNvbnN0IHJlbCA9IGZpbGUuc2xpY2Uocm9vdC5sZW5ndGggKyBzZXAubGVuZ3RoKVxuICByZXR1cm4geyByZWwsIGNhdGVnb3J5OiBjbGFzc2lmeShyZWwpIH1cbn1cblxuZnVuY3Rpb24gaXNXaXRoaW4oZmlsZTogc3RyaW5nLCBkaXI6IHN0cmluZykge1xuICByZXR1cm4gZmlsZSA9PT0gZGlyIHx8IGZpbGUuc3RhcnRzV2l0aChgJHtkaXJ9JHtzZXB9YClcbn1cblxuZnVuY3Rpb24gY2xhc3NpZnkocmVsOiBzdHJpbmcpOiBcImZvbGRlclwiIHwgXCJmaWxlXCIgfCBudWxsIHtcbiAgY29uc3QgW2hlYWRdID0gcmVsLnNwbGl0KHNlcClcbiAgaWYgKGhlYWQgJiYgRVNDQVBBQkxFX0ZPTERFUlMuaW5jbHVkZXMoaGVhZCkpIHJldHVybiBcImZvbGRlclwiXG4gIGlmIChFU0NBUEFCTEVfRklMRVMuaW5jbHVkZXMocmVsKSkgcmV0dXJuIFwiZmlsZVwiXG4gIC8vIE5vbi1lc2NhcGFibGUgc291cmNlIGZpbGVzIHN0aWxsIG5lZWQgdG8gZmxvdyBpbnRvIHRhcmdldCBkdXJpbmdcbiAgLy8gbGl2ZW1hcmsncyBvd24gZGV2IOKAlCB0aGUgdXNlciBpcyBlZGl0aW5nIHRoZSBjYW5vbmljYWwgc291cmNlLlxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBzeW5jT3ZlcmxheShcbiAgaGl0OiBIaXQsXG4gIGtpbmQ6IFwiY2hhbmdlXCIgfCBcImFkZFwiIHwgXCJ1bmxpbmtcIixcbiAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gIG92ZXJyaWRlc1Jvb3Q6IHN0cmluZyxcbikge1xuICBpZiAoIWhpdC5jYXRlZ29yeSkgcmV0dXJuXG4gIGNvbnN0IGRlc3QgPSBqb2luKHRhcmdldERpciwgaGl0LnJlbClcbiAgY29uc3Qgc291cmNlID0gam9pbihTT1VSQ0VfRElSLCBoaXQucmVsKVxuICBpZiAoa2luZCA9PT0gXCJ1bmxpbmtcIikge1xuICAgIC8vIENvcHkgYSBmaWxlJ3MgZGVmYXVsdCBvdmVyIHRoZSBlc2NhcGUgaW4gb25lIHdyaXRlOiBhbiB1bmxpbmsgdGhlblxuICAgIC8vIGFuIGFkZCByZWFjaGVzIFZpdGUgYXMgdHdvIGV2ZW50cyBhbmQgY29zdHMgYSBwYWdlIHJlbG9hZC5cbiAgICBpZiAoIWV4aXN0c1N5bmMoc291cmNlKSB8fCBzdGF0U3luYyhzb3VyY2UpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJtU3luYyhkZXN0LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICB9XG4gICAgaWYgKGV4aXN0c1N5bmMoc291cmNlKSkgY3BTeW5jKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3Qgb3ZlcmxheSA9IGpvaW4ob3ZlcnJpZGVzUm9vdCwgaGl0LnJlbClcbiAgaWYgKGV4aXN0c1N5bmMob3ZlcmxheSkpIGNwU3luYyhvdmVybGF5LCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbn1cblxuZnVuY3Rpb24gc3luY1NvdXJjZShcbiAgaGl0OiBIaXQsXG4gIGtpbmQ6IFwiY2hhbmdlXCIgfCBcImFkZFwiIHwgXCJ1bmxpbmtcIixcbiAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gIG92ZXJyaWRlc1Jvb3Q6IHN0cmluZyxcbikge1xuICAvLyBJZiB0aGUgY29uc3VtZXIgaGFzIGFuIG92ZXJsYXkgZm9yIHRoaXMgZmlsZSAoYW5kIGl0J3MgZXNjYXBhYmxlKSxcbiAgLy8gdGhlIG92ZXJsYXkgd2lucyDigJQgaWdub3JlIHNvdXJjZSBjaGFuZ2VzLlxuICBpZiAoaGl0LmNhdGVnb3J5ICYmIGV4aXN0c1N5bmMoam9pbihvdmVycmlkZXNSb290LCBoaXQucmVsKSkpIHJldHVyblxuICBjb25zdCBkZXN0ID0gam9pbih0YXJnZXREaXIsIGhpdC5yZWwpXG4gIGNvbnN0IHNvdXJjZSA9IGpvaW4oU09VUkNFX0RJUiwgaGl0LnJlbClcbiAgaWYgKGtpbmQgPT09IFwidW5saW5rXCIpIHtcbiAgICBybVN5bmMoZGVzdCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGV4aXN0c1N5bmMoc291cmNlKSkgY3BTeW5jKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG59XG5cbi8qKiBSZXNvbHZlIGxpdmVtYXJrLmNvbmZpZy50cydzIGB2aXRlYCBmaWVsZCDigJQgZWl0aGVyIGEgY29uZmlnIG9iamVjdFxuICogIG9yIGEgZnVuY3Rpb24gYChlbnYpID0+IGNvbmZpZ2AgKG1hdGNoaW5nIFZpdGUncyBvd24gYGRlZmluZUNvbmZpZ2ApLlxuICogIFNjaGVtYSBzdG9yZXMgaXQgYXMgYHVua25vd25gOyB0eXBpbmcgZm9yIHRoZSBjb25zdW1lcidzIGVkaXRvclxuICogIGxpdmVzIG9uIHtAbGluayBWaXRlT3ZlcnJpZGV9LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVZpdGVPdmVycmlkZShcbiAgdml0ZTogdW5rbm93bixcbiAgZW52OiBDb25maWdFbnYsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbD4ge1xuICBpZiAoIXZpdGUpIHJldHVybiBudWxsXG4gIGlmICh0eXBlb2Ygdml0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUmVmbGVjdC5hcHBseSh2aXRlLCB1bmRlZmluZWQsIFtlbnZdKVxuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogbnVsbFxuICB9XG4gIHJldHVybiBpc09iamVjdCh2aXRlKSA/IHZpdGUgOiBudWxsXG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHY6IHVua25vd24pOiB2IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHYgIT09IG51bGwgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCJcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "livemark",
3
- "version": "0.27.1",
3
+ "version": "0.27.2",
4
4
  "description": "Livemark description",
5
5
  "license": "MIT",
6
6
  "author": "Evgeny Karev",
@@ -0,0 +1,13 @@
1
+ import { join, sep } from "node:path"
2
+
3
+ const TAILWIND_IMPORT = /@import\s+(["'])tailwindcss(\/utilities)?\1/
4
+
5
+ /**
6
+ * Keep Tailwind's source scan out of the target's dependency link, which reaches the
7
+ * whole install (and, through a self-link, the whole project) from inside the Vite root.
8
+ */
9
+ export function excludeDependencySources(props: { css: string; targetDir: string }) {
10
+ if (!TAILWIND_IMPORT.test(props.css)) return undefined
11
+ const link = join(props.targetDir, "node_modules").split(sep).join("/")
12
+ return `${props.css}\n@source not "${link}";\n`
13
+ }
@@ -0,0 +1,31 @@
1
+ import { describe, expect, it } from "vite-plus/test"
2
+ import { excludeDependencySources } from "./tailwind-sources.ts"
3
+
4
+ const targetDir = "/project/.livemark/.target"
5
+
6
+ describe("excludeDependencySources", () => {
7
+ it("excludes the dependency link from a Tailwind entry", () => {
8
+ const css = `@import "tailwindcss";\n@import "./shape.css";`
9
+ expect(excludeDependencySources({ css, targetDir })).toBe(
10
+ `${css}\n@source not "/project/.livemark/.target/node_modules";\n`,
11
+ )
12
+ })
13
+
14
+ it("accepts single quotes, import options and a bare utilities layer", () => {
15
+ for (const css of [
16
+ `@import 'tailwindcss' source(none);`,
17
+ `@import "tailwindcss/utilities" layer(utilities);`,
18
+ ]) {
19
+ expect(excludeDependencySources({ css, targetDir })).toContain("@source not")
20
+ }
21
+ })
22
+
23
+ it("leaves other stylesheets alone", () => {
24
+ expect(
25
+ excludeDependencySources({ css: `@import "tw-animate-css";`, targetDir }),
26
+ ).toBeUndefined()
27
+ expect(
28
+ excludeDependencySources({ css: `@import "tailwindcss/theme";`, targetDir }),
29
+ ).toBeUndefined()
30
+ })
31
+ })
@@ -5,6 +5,7 @@ import { mergeConfig } from "vite"
5
5
  import packageJson from "../../package.json" with { type: "json" }
6
6
  import { buildTarget } from "../actions/target/build.ts"
7
7
  import { renderInlineMarkdown } from "../helpers/render-inline-markdown.ts"
8
+ import { excludeDependencySources } from "../helpers/tailwind-sources.ts"
8
9
  import { resolveTargetExport } from "../helpers/target-export.ts"
9
10
  import type { Config } from "../models/config.ts"
10
11
  import { WebsiteConfig } from "../models/config.ts"
@@ -77,6 +78,14 @@ export function livemark(opts: LivemarkOptions): Plugin {
77
78
  const override = await resolveViteOverride(opts.config.vite, env)
78
79
  return override ? mergeConfig(base, override) : base
79
80
  },
81
+ // Here, not in `styles/general.css`, so an escaped stylesheet keeps it. Works only
82
+ // while this plugin precedes `tailwind()`: both are `pre`, so array order decides.
83
+ transform: {
84
+ filter: { id: /\.css(\?|$)/ },
85
+ handler(css) {
86
+ return excludeDependencySources({ css, targetDir })
87
+ },
88
+ },
80
89
  resolveId(id) {
81
90
  if (id === VIRTUAL_ID) return VIRTUAL_RESOLVED_ID
82
91
  return resolveTargetExport({ id, targetDir, exports: packageJson.exports }) ?? null