livemark 0.10.1 → 0.10.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "livemark",
3
- "version": "0.10.1",
3
+ "version": "0.10.2",
4
4
  "description": "Livemark description",
5
5
  "license": "MIT",
6
6
  "author": "Evgeny Karev",
@@ -9,40 +9,50 @@ export interface LivemarkOptions {
9
9
  configPath: string
10
10
  }
11
11
 
12
- /** Bare specifiers that TanStack Start's compiler tries to resolve from
13
- * arbitrary importer files (including transitive packages). Under pnpm's
14
- * isolated layout these are unreachable from non-livemark importers, so we
15
- * bridge them by re-resolving from livemark's own location. */
16
- const PINNED_SPECIFIERS = ["@tanstack/react-start"] as const
17
-
18
- function isPinnedSpecifier(id: string) {
19
- for (const spec of PINNED_SPECIFIERS) {
20
- if (id === spec || id.startsWith(`${spec}/`)) return true
21
- }
22
- return false
23
- }
12
+ /** Match bare specifiers (`react`, `@scope/pkg`, `react/jsx-runtime`) but
13
+ * not relative (`./foo`), absolute (`/foo`), URL, or virtual (`\0...`)
14
+ * paths. */
15
+ const BARE_SPECIFIER_RE = /^(@[^/]+\/)?[a-z0-9_][^?#]*$/i
24
16
 
25
17
  /** Livemark dev/build integration:
18
+ * - Anchors every bare-specifier resolution at livemark's own location so
19
+ * the entire build pipeline runs inside livemark's package boundary,
20
+ * regardless of which file (consumer override, transitive package,
21
+ * livemark source) issues the import. Removes pnpm-isolation hazards
22
+ * without forcing peerDependencies on the consumer.
26
23
  * - Redirects imports that land in `<defaultsRoot>/<subdir>/` to the matching
27
24
  * user file under `<overridesRoot>/<subdir>/` when it exists.
28
25
  * - Watches `livemark.config.ts` and `.livemark/**` so edits, additions and
29
26
  * deletions trigger the right reload without manual restart. */
30
27
  export function livemark(opts: LivemarkOptions): Plugin {
31
28
  const EXT_RE = /\.(tsx|ts|jsx|js|css)(\?|$)/
29
+ const livemarkAnchor = join(opts.defaultsRoot, "index.ts")
32
30
  return {
33
31
  name: "livemark",
34
32
  enforce: "pre",
35
33
  async resolveId(id, importer, options) {
36
- // Pin TanStack's deeply-resolved packages to livemark's own copy so
37
- // pnpm's isolated layout doesn't strand them when start-compiler-plugin
38
- // walks transitive package files.
39
- if (isPinnedSpecifier(id)) {
40
- const anchor = join(opts.defaultsRoot, "index.ts")
41
- const resolved = await this.resolve(id, anchor, {
34
+ // Encapsulation bridge: if the importer can resolve `id` itself
35
+ // (its own subtree has the right version), use that — preserves
36
+ // version isolation between transitive packages (e.g. recharts and
37
+ // mermaid both pulling different d3 majors). Only when the importer
38
+ // *can't* resolve do we fall back to livemark's own location, which
39
+ // covers React, the @tanstack/react-* cluster, and anything else
40
+ // that lives only inside livemark's tree but gets requested from a
41
+ // file that doesn't declare it (consumer overrides, foreign
42
+ // packages compiled by TanStack's transforms, etc.).
43
+ if (BARE_SPECIFIER_RE.test(id)) {
44
+ const fromImporter = importer
45
+ ? await this.resolve(id, importer, {
46
+ ...options,
47
+ skipSelf: true,
48
+ })
49
+ : null
50
+ if (fromImporter) return fromImporter
51
+ const fromLivemark = await this.resolve(id, livemarkAnchor, {
42
52
  ...options,
43
53
  skipSelf: true,
44
54
  })
45
- if (resolved) return resolved
55
+ if (fromLivemark) return fromLivemark
46
56
  }
47
57
 
48
58
  if (!importer || !EXT_RE.test(id)) return null
@@ -6,6 +6,11 @@ export interface LivemarkOptions {
6
6
  configPath: string;
7
7
  }
8
8
  /** Livemark dev/build integration:
9
+ * - Anchors every bare-specifier resolution at livemark's own location so
10
+ * the entire build pipeline runs inside livemark's package boundary,
11
+ * regardless of which file (consumer override, transitive package,
12
+ * livemark source) issues the import. Removes pnpm-isolation hazards
13
+ * without forcing peerDependencies on the consumer.
9
14
  * - Redirects imports that land in `<defaultsRoot>/<subdir>/` to the matching
10
15
  * user file under `<overridesRoot>/<subdir>/` when it exists.
11
16
  * - Watches `livemark.config.ts` and `.livemark/**` so edits, additions and
@@ -1,39 +1,50 @@
1
1
  import { existsSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- /** Bare specifiers that TanStack Start's compiler tries to resolve from
4
- * arbitrary importer files (including transitive packages). Under pnpm's
5
- * isolated layout these are unreachable from non-livemark importers, so we
6
- * bridge them by re-resolving from livemark's own location. */
7
- const PINNED_SPECIFIERS = ["@tanstack/react-start"];
8
- function isPinnedSpecifier(id) {
9
- for (const spec of PINNED_SPECIFIERS) {
10
- if (id === spec || id.startsWith(`${spec}/`))
11
- return true;
12
- }
13
- return false;
14
- }
3
+ /** Match bare specifiers (`react`, `@scope/pkg`, `react/jsx-runtime`) but
4
+ * not relative (`./foo`), absolute (`/foo`), URL, or virtual (`\0...`)
5
+ * paths. */
6
+ const BARE_SPECIFIER_RE = /^(@[^/]+\/)?[a-z0-9_][^?#]*$/i;
15
7
  /** Livemark dev/build integration:
8
+ * - Anchors every bare-specifier resolution at livemark's own location so
9
+ * the entire build pipeline runs inside livemark's package boundary,
10
+ * regardless of which file (consumer override, transitive package,
11
+ * livemark source) issues the import. Removes pnpm-isolation hazards
12
+ * without forcing peerDependencies on the consumer.
16
13
  * - Redirects imports that land in `<defaultsRoot>/<subdir>/` to the matching
17
14
  * user file under `<overridesRoot>/<subdir>/` when it exists.
18
15
  * - Watches `livemark.config.ts` and `.livemark/**` so edits, additions and
19
16
  * deletions trigger the right reload without manual restart. */
20
17
  export function livemark(opts) {
21
18
  const EXT_RE = /\.(tsx|ts|jsx|js|css)(\?|$)/;
19
+ const livemarkAnchor = join(opts.defaultsRoot, "index.ts");
22
20
  return {
23
21
  name: "livemark",
24
22
  enforce: "pre",
25
23
  async resolveId(id, importer, options) {
26
- // Pin TanStack's deeply-resolved packages to livemark's own copy so
27
- // pnpm's isolated layout doesn't strand them when start-compiler-plugin
28
- // walks transitive package files.
29
- if (isPinnedSpecifier(id)) {
30
- const anchor = join(opts.defaultsRoot, "index.ts");
31
- const resolved = await this.resolve(id, anchor, {
24
+ // Encapsulation bridge: if the importer can resolve `id` itself
25
+ // (its own subtree has the right version), use that — preserves
26
+ // version isolation between transitive packages (e.g. recharts and
27
+ // mermaid both pulling different d3 majors). Only when the importer
28
+ // *can't* resolve do we fall back to livemark's own location, which
29
+ // covers React, the @tanstack/react-* cluster, and anything else
30
+ // that lives only inside livemark's tree but gets requested from a
31
+ // file that doesn't declare it (consumer overrides, foreign
32
+ // packages compiled by TanStack's transforms, etc.).
33
+ if (BARE_SPECIFIER_RE.test(id)) {
34
+ const fromImporter = importer
35
+ ? await this.resolve(id, importer, {
36
+ ...options,
37
+ skipSelf: true,
38
+ })
39
+ : null;
40
+ if (fromImporter)
41
+ return fromImporter;
42
+ const fromLivemark = await this.resolve(id, livemarkAnchor, {
32
43
  ...options,
33
44
  skipSelf: true,
34
45
  });
35
- if (resolved)
36
- return resolved;
46
+ if (fromLivemark)
47
+ return fromLivemark;
37
48
  }
38
49
  if (!importer || !EXT_RE.test(id))
39
50
  return null;
@@ -97,4 +108,4 @@ export function livemark(opts) {
97
108
  },
98
109
  };
99
110
  }
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1saXZlbWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtbGl2ZW1hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBVWhDOzs7Z0VBR2dFO0FBQ2hFLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBVSxDQUFBO0FBRTVELFNBQVMsaUJBQWlCLENBQUMsRUFBVTtJQUNuQyxLQUFLLE1BQU0sSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDckMsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFBO0lBQzNELENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7OztrRUFJa0U7QUFDbEUsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUFxQjtJQUM1QyxNQUFNLE1BQU0sR0FBRyw2QkFBNkIsQ0FBQTtJQUM1QyxPQUFPO1FBQ0wsSUFBSSxFQUFFLFVBQVU7UUFDaEIsT0FBTyxFQUFFLEtBQUs7UUFDZCxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTztZQUNuQyxvRUFBb0U7WUFDcEUsd0VBQXdFO1lBQ3hFLGtDQUFrQztZQUNsQyxJQUFJLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFBO2dCQUNsRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRTtvQkFDOUMsR0FBRyxPQUFPO29CQUNWLFFBQVEs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S0FDRixDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gXCJ2aXRlXCJcblxuZXhwb3J0IGludGVyZmFjZSBMaXZlbWFya09wdGlvbnMge1xuICBkZWZhdWx0c1Jvb3Q6IHN0cmluZ1xuICBvdmVycmlkZXNSb290OiBzdHJpbmdcbiAgc3ViZGlyczogc3RyaW5nW11cbiAgY29uZmlnUGF0aDogc3RyaW5nXG59XG5cbi8qKiBCYXJlIHNwZWNpZmllcnMgdGhhdCBUYW5TdGFjayBTdGFydCdzIGNvbXBpbGVyIHRyaWVzIHRvIHJlc29sdmUgZnJvbVxuICogIGFyYml0cmFyeSBpbXBvcnRlciBmaWxlcyAoaW5jbHVkaW5nIHRyYW5zaXRpdmUgcGFja2FnZXMpLiBVbmRlciBwbnBtJ3NcbiAqICBpc29sYXRlZCBsYXlvdXQgdGhlc2UgYXJlIHVucmVhY2hhYmxlIGZyb20gbm9uLWxpdmVtYXJrIGltcG9ydGVycywgc28gd2VcbiAqICBicmlkZ2UgdGhlbSBieSByZS1yZXNvbHZpbmcgZnJvbSBsaXZlbWFyaydzIG93biBsb2NhdGlvbi4gKi9cbmNvbnN0IFBJTk5FRF9TUEVDSUZJRVJTID0gW1wiQHRhbnN0YWNrL3JlYWN0LXN0YXJ0XCJdIGFzIGNvbnN0XG5cbmZ1bmN0aW9uIGlzUGlubmVkU3BlY2lmaWVyKGlkOiBzdHJpbmcpIHtcbiAgZm9yIChjb25zdCBzcGVjIG9mIFBJTk5FRF9TUEVDSUZJRVJTKSB7XG4gICAgaWYgKGlkID09PSBzcGVjIHx8IGlkLnN0YXJ0c1dpdGgoYCR7c3BlY30vYCkpIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKiBMaXZlbWFyayBkZXYvYnVpbGQgaW50ZWdyYXRpb246XG4gKiAtIFJlZGlyZWN0cyBpbXBvcnRzIHRoYXQgbGFuZCBpbiBgPGRlZmF1bHRzUm9vdD4vPHN1YmRpcj4vYCB0byB0aGUgbWF0Y2hpbmdcbiAqICAgdXNlciBmaWxlIHVuZGVyIGA8b3ZlcnJpZGVzUm9vdD4vPHN1YmRpcj4vYCB3aGVuIGl0IGV4aXN0cy5cbiAqIC0gV2F0Y2hlcyBgbGl2ZW1hcmsuY29uZmlnLnRzYCBhbmQgYC5saXZlbWFyay8qKmAgc28gZWRpdHMsIGFkZGl0aW9ucyBhbmRcbiAqICAgZGVsZXRpb25zIHRyaWdnZXIgdGhlIHJpZ2h0IHJlbG9hZCB3aXRob3V0IG1hbnVhbCByZXN0YXJ0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdmVtYXJrKG9wdHM6IExpdmVtYXJrT3B0aW9ucyk6IFBsdWdpbiB7XG4gIGNvbnN0IEVYVF9SRSA9IC9cXC4odHN4fHRzfGpzeHxqc3xjc3MpKFxcP3wkKS9cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBcImxpdmVtYXJrXCIsXG4gICAgZW5mb3JjZTogXCJwcmVcIixcbiAgICBhc3luYyByZXNvbHZlSWQoaWQsIGltcG9ydGVyLCBvcHRpb25zKSB7XG4gICAgICAvLyBQaW4gVGFuU3RhY2sncyBkZWVwbHktcmVzb2x2ZWQgcGFja2FnZXMgdG8gbGl2ZW1hcmsncyBvd24gY29weSBzb1xuICAgICAgLy8gcG5wbSdzIGlzb2xhdGVkIGxheW91dCBkb2Vzbid0IHN0cmFuZCB0aGVtIHdoZW4gc3RhcnQtY29tcGlsZXItcGx1Z2luXG4gICAgICAvLyB3YWxrcyB0cmFuc2l0aXZlIHBhY2thZ2UgZmlsZXMuXG4gICAgICBpZiAoaXNQaW5uZWRTcGVjaWZpZXIoaWQpKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IGpvaW4ob3B0cy5kZWZhdWx0c1Jvb3QsIFwiaW5kZXgudHNcIilcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLnJlc29sdmUoaWQsIGFuY2hvciwge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgc2tpcFNlbGY6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgICB9XG5cbiAgICAgIGlmICghaW1wb3J0ZXIgfHwgIUVYVF9SRS50ZXN0KGlkKSkgcmV0dXJuIG51bGxcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgdGhpcy5yZXNvbHZlKGlkLCBpbXBvcnRlciwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBza2lwU2VsZjogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBpZiAoIXJlc29sdmVkKSByZXR1cm4gbnVsbFxuICAgICAgY29uc3QgcXVlcnlJZHggPSByZXNvbHZlZC5pZC5pbmRleE9mKFwiP1wiKVxuICAgICAgY29uc3QgcGF0aCA9XG4gICAgICAgIHF1ZXJ5SWR4ID09PSAtMSA/IHJlc29sdmVkLmlkIDogcmVzb2x2ZWQuaWQuc2xpY2UoMCwgcXVlcnlJZHgpXG4gICAgICBjb25zdCBxdWVyeSA9IHF1ZXJ5SWR4ID09PSAtMSA/IFwiXCIgOiByZXNvbHZlZC5pZC5zbGljZShxdWVyeUlkeClcbiAgICAgIGZvciAoY29uc3Qgc3ViZGlyIG9mIG9wdHMuc3ViZGlycykge1xuICAgICAgICBjb25zdCBkZWZhdWx0c1N1YmRpciA9IGAke2pvaW4ob3B0cy5kZWZhdWx0c1Jvb3QsIHN1YmRpcil9L2BcbiAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoZGVmYXVsdHNTdWJkaXIpKSBjb250aW51ZVxuICAgICAgICBjb25zdCByZWwgPSBwYXRoLnNsaWNlKGRlZmF1bHRzU3ViZGlyLmxlbmd0aClcbiAgICAgICAgY29uc3QgdXNlclBhdGggPSBqb2luKG9wdHMub3ZlcnJpZGVzUm9vdCwgc3ViZGlyLCByZWwpXG4gICAgICAgIGlmIChleGlzdHNTeW5jKHVzZXJQYXRoKSkgcmV0dXJuIHVzZXJQYXRoICsgcXVlcnlcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcbiAgICBjb25maWd1cmVTZXJ2ZXIoc2VydmVyKSB7XG4gICAgICBzZXJ2ZXIud2F0Y2hlci5hZGQob3B0cy5jb25maWdQYXRoKVxuICAgICAgc2VydmVyLndhdGNoZXIuYWRkKGpvaW4ob3B0cy5vdmVycmlkZXNSb290LCBcIioqLypcIikpXG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlUm9vdHMgPSBvcHRzLnN1YmRpcnMubWFwKFxuICAgICAgICBzdWJkaXIgPT4gYCR7am9pbihvcHRzLm92ZXJyaWRlc1Jvb3QsIHN1YmRpcil9L2AsXG4gICAgICApXG4gICAgICBjb25zdCByb3V0ZXNSb290ID0gYCR7am9pbihvcHRzLm92ZXJyaWRlc1Jvb3QsIFwicm91dGVzXCIpfS9gXG5cbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoZmlsZSA9PT0gb3B0cy5jb25maWdQYXRoKSB7XG4gICAgICAgICAgc2VydmVyLnJlc3RhcnQoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aChyb3V0ZXNSb290KSkge1xuICAgICAgICAgIHNlcnZlci5yZXN0YXJ0KClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0cy5zdWJkaXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgcm9vdCA9IG92ZXJyaWRlUm9vdHNbaV1cbiAgICAgICAgICBpZiAoIXJvb3QgfHwgIWZpbGUuc3RhcnRzV2l0aChyb290KSkgY29udGludWVcbiAgICAgICAgICBjb25zdCByZWwgPSBmaWxlLnNsaWNlKHJvb3QubGVuZ3RoKVxuICAgICAgICAgIGNvbnN0IHN1YmRpciA9IG9wdHMuc3ViZGlyc1tpXVxuICAgICAgICAgIGlmICghc3ViZGlyKSBjb250aW51ZVxuICAgICAgICAgIGNvbnN0IGRlZmF1bHRQYXRoID0gam9pbihvcHRzLmRlZmF1bHRzUm9vdCwgc3ViZGlyLCByZWwpXG4gICAgICAgICAgY29uc3QgbW9kID0gc2VydmVyLm1vZHVsZUdyYXBoLmdldE1vZHVsZUJ5SWQoZGVmYXVsdFBhdGgpXG4gICAgICAgICAgaWYgKG1vZCkgc2VydmVyLm1vZHVsZUdyYXBoLmludmFsaWRhdGVNb2R1bGUobW9kKVxuICAgICAgICAgIHNlcnZlci53cy5zZW5kKHsgdHlwZTogXCJmdWxsLXJlbG9hZFwiIH0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJhZGRcIiwgb25DaGFuZ2UpXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5vbihcInVubGlua1wiLCBvbkNoYW5nZSlcbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwiY2hhbmdlXCIsIGZpbGUgPT4ge1xuICAgICAgICBpZiAoZmlsZSA9PT0gb3B0cy5jb25maWdQYXRoKSBzZXJ2ZXIucmVzdGFydCgpXG4gICAgICB9KVxuICAgIH0sXG4gIH1cbn1cbiJdfQ==
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1saXZlbWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtbGl2ZW1hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBVWhDOzthQUVhO0FBQ2IsTUFBTSxpQkFBaUIsR0FBRywrQkFBK0IsQ0FBQTtBQUV6RDs7Ozs7Ozs7O2tFQVNrRTtBQUNsRSxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQXFCO0lBQzVDLE1BQU0sTUFBTSxHQUFHLDZCQUE2QixDQUFBO0lBQzVDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQzFELE9BQU87UUFDTCxJQUFJLEVBQUUsVUFBVTtRQUNoQixPQUFPLEVBQUUsS0FBSztRQUNkLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPO1lBQ25DLGdFQUFnRTtZQUNoRSxnRUFBZ0U7WUFDaEUsbUVBQW1FO1lBQ25FLG9FQUFvRTtZQUNwRSxvRUFBb0U7WUFDcEUsaUVBQWlFO1lBQ2pFLG1FQUFtRTtZQUNuRSw0REFBNEQ7WUFDNUQscURBQXFEO1lBQ3JELElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sWUFBWSxHQUFHLFFBQVE7b0JBQzNCLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRTt3QkFDL0IsR0FBRyxPQUFPO3dCQUNWLFFBQVEsRUFBRSxJQUFJO3FCQUNmLENBQUM7b0JBQ0osQ0FBQyxDQUFDLElBQUksQ0FBQTtnQkFDUixJQUFJLFlBQVk7b0JBQUUsT0FBTyxZQUFZLENBQUE7Z0JBQ3JDLE1BQU0sWUFBWSxH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SUFBSSxDQUFDLFVBQVU7b0JBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQ2hELENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztLQUNGLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSBcInZpdGVcIlxuXG5leHBvcnQgaW50ZXJmYWNlIExpdmVtYXJrT3B0aW9ucyB7XG4gIGRlZmF1bHRzUm9vdDogc3RyaW5nXG4gIG92ZXJyaWRlc1Jvb3Q6IHN0cmluZ1xuICBzdWJkaXJzOiBzdHJpbmdbXVxuICBjb25maWdQYXRoOiBzdHJpbmdcbn1cblxuLyoqIE1hdGNoIGJhcmUgc3BlY2lmaWVycyAoYHJlYWN0YCwgYEBzY29wZS9wa2dgLCBgcmVhY3QvanN4LXJ1bnRpbWVgKSBidXRcbiAqICBub3QgcmVsYXRpdmUgKGAuL2Zvb2ApLCBhYnNvbHV0ZSAoYC9mb29gKSwgVVJMLCBvciB2aXJ0dWFsIChgXFwwLi4uYClcbiAqICBwYXRocy4gKi9cbmNvbnN0IEJBUkVfU1BFQ0lGSUVSX1JFID0gL14oQFteL10rXFwvKT9bYS16MC05X11bXj8jXSokL2lcblxuLyoqIExpdmVtYXJrIGRldi9idWlsZCBpbnRlZ3JhdGlvbjpcbiAqIC0gQW5jaG9ycyBldmVyeSBiYXJlLXNwZWNpZmllciByZXNvbHV0aW9uIGF0IGxpdmVtYXJrJ3Mgb3duIGxvY2F0aW9uIHNvXG4gKiAgIHRoZSBlbnRpcmUgYnVpbGQgcGlwZWxpbmUgcnVucyBpbnNpZGUgbGl2ZW1hcmsncyBwYWNrYWdlIGJvdW5kYXJ5LFxuICogICByZWdhcmRsZXNzIG9mIHdoaWNoIGZpbGUgKGNvbnN1bWVyIG92ZXJyaWRlLCB0cmFuc2l0aXZlIHBhY2thZ2UsXG4gKiAgIGxpdmVtYXJrIHNvdXJjZSkgaXNzdWVzIHRoZSBpbXBvcnQuIFJlbW92ZXMgcG5wbS1pc29sYXRpb24gaGF6YXJkc1xuICogICB3aXRob3V0IGZvcmNpbmcgcGVlckRlcGVuZGVuY2llcyBvbiB0aGUgY29uc3VtZXIuXG4gKiAtIFJlZGlyZWN0cyBpbXBvcnRzIHRoYXQgbGFuZCBpbiBgPGRlZmF1bHRzUm9vdD4vPHN1YmRpcj4vYCB0byB0aGUgbWF0Y2hpbmdcbiAqICAgdXNlciBmaWxlIHVuZGVyIGA8b3ZlcnJpZGVzUm9vdD4vPHN1YmRpcj4vYCB3aGVuIGl0IGV4aXN0cy5cbiAqIC0gV2F0Y2hlcyBgbGl2ZW1hcmsuY29uZmlnLnRzYCBhbmQgYC5saXZlbWFyay8qKmAgc28gZWRpdHMsIGFkZGl0aW9ucyBhbmRcbiAqICAgZGVsZXRpb25zIHRyaWdnZXIgdGhlIHJpZ2h0IHJlbG9hZCB3aXRob3V0IG1hbnVhbCByZXN0YXJ0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdmVtYXJrKG9wdHM6IExpdmVtYXJrT3B0aW9ucyk6IFBsdWdpbiB7XG4gIGNvbnN0IEVYVF9SRSA9IC9cXC4odHN4fHRzfGpzeHxqc3xjc3MpKFxcP3wkKS9cbiAgY29uc3QgbGl2ZW1hcmtBbmNob3IgPSBqb2luKG9wdHMuZGVmYXVsdHNSb290LCBcImluZGV4LnRzXCIpXG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJsaXZlbWFya1wiLFxuICAgIGVuZm9yY2U6IFwicHJlXCIsXG4gICAgYXN5bmMgcmVzb2x2ZUlkKGlkLCBpbXBvcnRlciwgb3B0aW9ucykge1xuICAgICAgLy8gRW5jYXBzdWxhdGlvbiBicmlkZ2U6IGlmIHRoZSBpbXBvcnRlciBjYW4gcmVzb2x2ZSBgaWRgIGl0c2VsZlxuICAgICAgLy8gKGl0cyBvd24gc3VidHJlZSBoYXMgdGhlIHJpZ2h0IHZlcnNpb24pLCB1c2UgdGhhdCDigJQgcHJlc2VydmVzXG4gICAgICAvLyB2ZXJzaW9uIGlzb2xhdGlvbiBiZXR3ZWVuIHRyYW5zaXRpdmUgcGFja2FnZXMgKGUuZy4gcmVjaGFydHMgYW5kXG4gICAgICAvLyBtZXJtYWlkIGJvdGggcHVsbGluZyBkaWZmZXJlbnQgZDMgbWFqb3JzKS4gT25seSB3aGVuIHRoZSBpbXBvcnRlclxuICAgICAgLy8gKmNhbid0KiByZXNvbHZlIGRvIHdlIGZhbGwgYmFjayB0byBsaXZlbWFyaydzIG93biBsb2NhdGlvbiwgd2hpY2hcbiAgICAgIC8vIGNvdmVycyBSZWFjdCwgdGhlIEB0YW5zdGFjay9yZWFjdC0qIGNsdXN0ZXIsIGFuZCBhbnl0aGluZyBlbHNlXG4gICAgICAvLyB0aGF0IGxpdmVzIG9ubHkgaW5zaWRlIGxpdmVtYXJrJ3MgdHJlZSBidXQgZ2V0cyByZXF1ZXN0ZWQgZnJvbSBhXG4gICAgICAvLyBmaWxlIHRoYXQgZG9lc24ndCBkZWNsYXJlIGl0IChjb25zdW1lciBvdmVycmlkZXMsIGZvcmVpZ25cbiAgICAgIC8vIHBhY2thZ2VzIGNvbXBpbGVkIGJ5IFRhblN0YWNrJ3MgdHJhbnNmb3JtcywgZXRjLikuXG4gICAgICBpZiAoQkFSRV9TUEVDSUZJRVJfUkUudGVzdChpZCkpIHtcbiAgICAgICAgY29uc3QgZnJvbUltcG9ydGVyID0gaW1wb3J0ZXJcbiAgICAgICAgICA/IGF3YWl0IHRoaXMucmVzb2x2ZShpZCwgaW1wb3J0ZXIsIHtcbiAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgc2tpcFNlbGY6IHRydWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogbnVsbFxuICAgICAgICBpZiAoZnJvbUltcG9ydGVyKSByZXR1cm4gZnJvbUltcG9ydGVyXG4gICAgICAgIGNvbnN0IGZyb21MaXZlbWFyayA9IGF3YWl0IHRoaXMucmVzb2x2ZShpZCwgbGl2ZW1hcmtBbmNob3IsIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIHNraXBTZWxmOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgICBpZiAoZnJvbUxpdmVtYXJrKSByZXR1cm4gZnJvbUxpdmVtYXJrXG4gICAgICB9XG5cbiAgICAgIGlmICghaW1wb3J0ZXIgfHwgIUVYVF9SRS50ZXN0KGlkKSkgcmV0dXJuIG51bGxcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgdGhpcy5yZXNvbHZlKGlkLCBpbXBvcnRlciwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBza2lwU2VsZjogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBpZiAoIXJlc29sdmVkKSByZXR1cm4gbnVsbFxuICAgICAgY29uc3QgcXVlcnlJZHggPSByZXNvbHZlZC5pZC5pbmRleE9mKFwiP1wiKVxuICAgICAgY29uc3QgcGF0aCA9XG4gICAgICAgIHF1ZXJ5SWR4ID09PSAtMSA/IHJlc29sdmVkLmlkIDogcmVzb2x2ZWQuaWQuc2xpY2UoMCwgcXVlcnlJZHgpXG4gICAgICBjb25zdCBxdWVyeSA9IHF1ZXJ5SWR4ID09PSAtMSA/IFwiXCIgOiByZXNvbHZlZC5pZC5zbGljZShxdWVyeUlkeClcbiAgICAgIGZvciAoY29uc3Qgc3ViZGlyIG9mIG9wdHMuc3ViZGlycykge1xuICAgICAgICBjb25zdCBkZWZhdWx0c1N1YmRpciA9IGAke2pvaW4ob3B0cy5kZWZhdWx0c1Jvb3QsIHN1YmRpcil9L2BcbiAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoZGVmYXVsdHNTdWJkaXIpKSBjb250aW51ZVxuICAgICAgICBjb25zdCByZWwgPSBwYXRoLnNsaWNlKGRlZmF1bHRzU3ViZGlyLmxlbmd0aClcbiAgICAgICAgY29uc3QgdXNlclBhdGggPSBqb2luKG9wdHMub3ZlcnJpZGVzUm9vdCwgc3ViZGlyLCByZWwpXG4gICAgICAgIGlmIChleGlzdHNTeW5jKHVzZXJQYXRoKSkgcmV0dXJuIHVzZXJQYXRoICsgcXVlcnlcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcbiAgICBjb25maWd1cmVTZXJ2ZXIoc2VydmVyKSB7XG4gICAgICBzZXJ2ZXIud2F0Y2hlci5hZGQob3B0cy5jb25maWdQYXRoKVxuICAgICAgc2VydmVyLndhdGNoZXIuYWRkKGpvaW4ob3B0cy5vdmVycmlkZXNSb290LCBcIioqLypcIikpXG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlUm9vdHMgPSBvcHRzLnN1YmRpcnMubWFwKFxuICAgICAgICBzdWJkaXIgPT4gYCR7am9pbihvcHRzLm92ZXJyaWRlc1Jvb3QsIHN1YmRpcil9L2AsXG4gICAgICApXG4gICAgICBjb25zdCByb3V0ZXNSb290ID0gYCR7am9pbihvcHRzLm92ZXJyaWRlc1Jvb3QsIFwicm91dGVzXCIpfS9gXG5cbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoZmlsZSA9PT0gb3B0cy5jb25maWdQYXRoKSB7XG4gICAgICAgICAgc2VydmVyLnJlc3RhcnQoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aChyb3V0ZXNSb290KSkge1xuICAgICAgICAgIHNlcnZlci5yZXN0YXJ0KClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0cy5zdWJkaXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgcm9vdCA9IG92ZXJyaWRlUm9vdHNbaV1cbiAgICAgICAgICBpZiAoIXJvb3QgfHwgIWZpbGUuc3RhcnRzV2l0aChyb290KSkgY29udGludWVcbiAgICAgICAgICBjb25zdCByZWwgPSBmaWxlLnNsaWNlKHJvb3QubGVuZ3RoKVxuICAgICAgICAgIGNvbnN0IHN1YmRpciA9IG9wdHMuc3ViZGlyc1tpXVxuICAgICAgICAgIGlmICghc3ViZGlyKSBjb250aW51ZVxuICAgICAgICAgIGNvbnN0IGRlZmF1bHRQYXRoID0gam9pbihvcHRzLmRlZmF1bHRzUm9vdCwgc3ViZGlyLCByZWwpXG4gICAgICAgICAgY29uc3QgbW9kID0gc2VydmVyLm1vZHVsZUdyYXBoLmdldE1vZHVsZUJ5SWQoZGVmYXVsdFBhdGgpXG4gICAgICAgICAgaWYgKG1vZCkgc2VydmVyLm1vZHVsZUdyYXBoLmludmFsaWRhdGVNb2R1bGUobW9kKVxuICAgICAgICAgIHNlcnZlci53cy5zZW5kKHsgdHlwZTogXCJmdWxsLXJlbG9hZFwiIH0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJhZGRcIiwgb25DaGFuZ2UpXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5vbihcInVubGlua1wiLCBvbkNoYW5nZSlcbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwiY2hhbmdlXCIsIGZpbGUgPT4ge1xuICAgICAgICBpZiAoZmlsZSA9PT0gb3B0cy5jb25maWdQYXRoKSBzZXJ2ZXIucmVzdGFydCgpXG4gICAgICB9KVxuICAgIH0sXG4gIH1cbn1cbiJdfQ==