@mnaoumov/obsidian-dev-toolkit 3.2.0 → 3.3.0

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.
Files changed (96) hide show
  1. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +1 -75
  2. package/dist/lib/cjs/bundlers/esbuild-impl/dependency.cjs +3 -77
  3. package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.cjs +1 -75
  4. package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +1 -75
  5. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +1 -75
  6. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +1 -75
  7. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +3 -76
  8. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +1 -1
  9. package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.cjs +1 -75
  10. package/dist/lib/cjs/bundlers/esbuild.cjs +1 -75
  11. package/dist/lib/cjs/bundlers/index.cjs +1 -75
  12. package/dist/lib/cjs/bundlers/obsidian-cli-reload.cjs +1 -75
  13. package/dist/lib/cjs/bundlers/obsidian-plugin-build.cjs +1 -75
  14. package/dist/lib/cjs/bundlers/obsidian-plugin-features.cjs +1 -75
  15. package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.cjs +1 -75
  16. package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.cjs +1 -75
  17. package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.cjs +32 -85
  18. package/dist/lib/cjs/bundlers/parcel.cjs +112 -81
  19. package/dist/lib/cjs/bundlers/parcel.d.cts +13 -6
  20. package/dist/lib/cjs/bundlers/rollup-compatible-features.cjs +1 -75
  21. package/dist/lib/cjs/bundlers/rollup-compatible.cjs +1 -75
  22. package/dist/lib/cjs/bundlers/rollup.cjs +1 -75
  23. package/dist/lib/cjs/bundlers/vite.cjs +1 -75
  24. package/dist/lib/cjs/bundlers/webpack.cjs +3 -77
  25. package/dist/lib/cjs/demo-vault-app-json.cjs +1 -75
  26. package/dist/lib/cjs/demo-vault-buttons.cjs +1 -75
  27. package/dist/lib/cjs/demo-vault-cli.cjs +1 -75
  28. package/dist/lib/cjs/demo-vault-coverage.cjs +139 -118
  29. package/dist/lib/cjs/demo-vault-coverage.d.cts +100 -5
  30. package/dist/lib/cjs/demo-vault.cjs +3 -77
  31. package/dist/lib/cjs/docs-site/index.cjs +1 -75
  32. package/dist/lib/cjs/docs-site/obsidian-external-type-links.cjs +1 -75
  33. package/dist/lib/cjs/formatters/dprint.cjs +1 -75
  34. package/dist/lib/cjs/formatters/index.cjs +1 -75
  35. package/dist/lib/cjs/index.cjs +1 -81
  36. package/dist/lib/cjs/index.d.cts +0 -2
  37. package/dist/lib/cjs/integration-test-setup.cjs +1 -75
  38. package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +1 -75
  39. package/dist/lib/cjs/jest-setup.cjs +1 -75
  40. package/dist/lib/cjs/linters/eslint-config.cjs +1 -75
  41. package/dist/lib/cjs/linters/eslint-rules/index.cjs +1 -75
  42. package/dist/lib/cjs/linters/eslint-rules/manifest-description.cjs +1 -75
  43. package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.cjs +1 -75
  44. package/dist/lib/cjs/linters/eslint-rules/manifest-id.cjs +1 -75
  45. package/dist/lib/cjs/linters/eslint-rules/manifest-name.cjs +1 -75
  46. package/dist/lib/cjs/linters/eslint-rules/manifest-schema.cjs +1 -75
  47. package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.cjs +1 -75
  48. package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.cjs +2 -77
  49. package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.cjs +1 -75
  50. package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-toolkit-plugin.cjs +1 -75
  51. package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.cjs +1 -75
  52. package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.cjs +1 -75
  53. package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.cjs +1 -75
  54. package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.cjs +1 -75
  55. package/dist/lib/cjs/linters/eslint.cjs +1 -75
  56. package/dist/lib/cjs/linters/index.cjs +1 -75
  57. package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +1 -75
  58. package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +1 -75
  59. package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.cjs +1 -75
  60. package/dist/lib/cjs/linters/markdownlint.cjs +1 -75
  61. package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.cjs +1 -75
  62. package/dist/lib/cjs/linters/plugin-names.cjs +1 -75
  63. package/dist/lib/cjs/obsidian-plugin-repo-paths.cjs +1 -75
  64. package/dist/lib/cjs/setup.cjs +1 -75
  65. package/dist/lib/cjs/templates.cjs +3 -77
  66. package/dist/lib/cjs/test-runners/coverage-badge-cli.cjs +1 -75
  67. package/dist/lib/cjs/test-runners/coverage-badge.cjs +1 -75
  68. package/dist/lib/cjs/test-runners/e2e-runner-support.cjs +1 -75
  69. package/dist/lib/cjs/test-runners/index.cjs +1 -78
  70. package/dist/lib/cjs/test-runners/index.d.cts +0 -1
  71. package/dist/lib/cjs/test-runners/integration-test-plugin.cjs +3 -77
  72. package/dist/lib/cjs/test-runners/jest-config.cjs +1 -75
  73. package/dist/lib/cjs/test-runners/obsidian-test-runner.cjs +1 -75
  74. package/dist/lib/cjs/test-runners/performance-eval-cap.cjs +4 -75
  75. package/dist/lib/cjs/test-runners/performance-eval-cap.d.cts +12 -3
  76. package/dist/lib/cjs/test-runners/stale-build-global-setup.cjs +1 -75
  77. package/dist/lib/cjs/test-runners/vitest-config.cjs +4 -80
  78. package/dist/lib/cjs/test-runners/wdio-obsidian.cjs +1 -75
  79. package/dist/lib/cjs/version.cjs +1 -75
  80. package/dist/lib/cjs/vitest-setup.cjs +1 -75
  81. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +1 -1
  82. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +3 -2
  83. package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.mjs +32 -15
  84. package/dist/lib/esm/bundlers/parcel.d.mts +13 -6
  85. package/dist/lib/esm/bundlers/parcel.mjs +110 -5
  86. package/dist/lib/esm/demo-vault-coverage.d.mts +100 -5
  87. package/dist/lib/esm/demo-vault-coverage.mjs +139 -44
  88. package/dist/lib/esm/index.d.mts +0 -2
  89. package/dist/lib/esm/index.mjs +1 -5
  90. package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.mjs +2 -2
  91. package/dist/lib/esm/test-runners/index.d.mts +0 -1
  92. package/dist/lib/esm/test-runners/index.mjs +1 -3
  93. package/dist/lib/esm/test-runners/performance-eval-cap.d.mts +12 -3
  94. package/dist/lib/esm/test-runners/performance-eval-cap.mjs +3 -1
  95. package/dist/lib/esm/test-runners/vitest-config.mjs +4 -5
  96. package/package.json +3 -2
@@ -61,6 +61,20 @@
61
61
  * or a misspelled directive all fail: an exemption nobody can justify, that nothing needs any more, or that
62
62
  * silently does nothing is worse than no exemption at all.
63
63
  *
64
+ * They also check that every `Try it` section — a heading of any level starting `Try it`, up to the next
65
+ * heading of the same or a higher level — holds a `code-button` that performs its setup, because a reader
66
+ * asked to configure things by hand is a reader the demo lost. A section whose steps really cannot be
67
+ * scripted says so with the same directive, naming the `demo-vault-validation/try-it-code-button` rule on
68
+ * the heading, and with the same checks on the directive itself:
69
+ *
70
+ * ```markdown
71
+ * <!-- obsidian-dev-utils-disable-next-line demo-vault-validation/try-it-code-button -- Dragging a file in from outside Obsidian cannot be scripted. -->
72
+ * ## Try it
73
+ * ```
74
+ *
75
+ * That check ships as a warning ({@link DemoVaultAuthoringSpec.tryItCodeButtons}), so a vault written
76
+ * before it existed keeps passing while it is brought up to it.
77
+ *
64
78
  * Two layers are exposed:
65
79
  * - {@link DemoVaultCoverageChecker} — a framework-agnostic core that reads the corpus, parses interface /
66
80
  * class / enum members and exported functions, and returns diagnostic arrays (what is undemonstrated / stale
@@ -83,7 +97,17 @@ export interface DemoVaultAuthoringSpec {
83
97
  * `00 Start.md`.
84
98
  */
85
99
  readonly startNote?: string;
100
+ /**
101
+ * How a `Try it` section with no `code-button` and no directive explaining why is reported: `'warn'`
102
+ * prints the sections and passes, `'error'` fails the suite. Defaults to `'warn'`.
103
+ */
104
+ readonly tryItCodeButtons?: DemoVaultCheckSeverity;
86
105
  }
106
+ /**
107
+ * How a check that is being introduced gradually reports what it finds: `'warn'` prints it and passes,
108
+ * `'error'` fails.
109
+ */
110
+ export type DemoVaultCheckSeverity = 'error' | 'warn';
87
111
  /**
88
112
  * Reflects a config interface whose options are demonstrated by their bare name.
89
113
  */
@@ -268,6 +292,46 @@ export interface DemoVaultNote {
268
292
  */
269
293
  readonly relativePath: string;
270
294
  }
295
+ /**
296
+ * What a note's inline `obsidian-dev-utils-disable…` directives allow, rule by rule, and what is wrong with
297
+ * them.
298
+ */
299
+ export interface DirectiveScan {
300
+ /**
301
+ * For each rule, the zero-based line numbers a directive exempts from it.
302
+ */
303
+ readonly allowedLineIndexesByRule: ReadonlyMap<string, ReadonlySet<number>>;
304
+ /**
305
+ * The directive mistakes found, each phrased for a failing assertion.
306
+ */
307
+ readonly problems: string[];
308
+ }
309
+ /**
310
+ * The running state of a directive scan, threaded through the per-line helpers.
311
+ */
312
+ export interface DirectiveScanState {
313
+ /**
314
+ * For each rule, the lines a directive has exempted from it so far.
315
+ */
316
+ readonly allowedLineIndexesByRule: Map<string, Set<number>>;
317
+ /**
318
+ * For each rule, the region currently open, and whether it has covered a target yet.
319
+ */
320
+ readonly openRegionsByRule: Map<string, OpenDirectiveRegion>;
321
+ /**
322
+ * For each rule, the line a `disable-next-line` was read on, while it still waits for the line it covers.
323
+ */
324
+ readonly pendingNextLineIndexesByRule: Map<string, number>;
325
+ /**
326
+ * The directive mistakes found so far.
327
+ */
328
+ readonly problems: string[];
329
+ /**
330
+ * For each rule, the lines of the note that break it — the lines a directive for it has to cover to be
331
+ * doing any work.
332
+ */
333
+ readonly targetLineIndexesByRule: ReadonlyMap<string, ReadonlySet<number>>;
334
+ }
271
335
  /**
272
336
  * The parsed members of a source interface, class, or enum.
273
337
  */
@@ -302,6 +366,22 @@ export interface NoteLine {
302
366
  /**
303
367
  * A `disable` region that has been opened and not yet enabled again.
304
368
  */
369
+ export interface OpenDirectiveRegion {
370
+ /**
371
+ * Whether the region has covered a line breaking its rule, which is what stops it being reported as
372
+ * pointless.
373
+ */
374
+ isUsed: boolean;
375
+ /**
376
+ * The line the region was opened on.
377
+ */
378
+ readonly lineIndex: number;
379
+ }
380
+ /**
381
+ * A `disable` region that has been opened and not yet enabled again.
382
+ *
383
+ * @deprecated Use {@link OpenDirectiveRegion}: the directives now serve more than the wikilink rule.
384
+ */
305
385
  export interface OpenWikilinkDirectiveRegion {
306
386
  /**
307
387
  * Whether the region has covered a wikilink, which is what stops it being reported as pointless.
@@ -351,6 +431,8 @@ export interface RegisterDemoVaultCoverageSuiteParams {
351
431
  }
352
432
  /**
353
433
  * What a note's inline `obsidian-dev-utils-disable…` directives allow, and what is wrong with them.
434
+ *
435
+ * @deprecated Use {@link DirectiveScan}: the directives now serve more than the wikilink rule.
354
436
  */
355
437
  export interface WikilinkDirectiveScan {
356
438
  /**
@@ -364,6 +446,8 @@ export interface WikilinkDirectiveScan {
364
446
  }
365
447
  /**
366
448
  * The running state of a directive scan, threaded through the per-line helpers.
449
+ *
450
+ * @deprecated Use {@link DirectiveScanState}: the directives now serve more than the wikilink rule.
367
451
  */
368
452
  export interface WikilinkDirectiveScanState {
369
453
  /**
@@ -373,7 +457,7 @@ export interface WikilinkDirectiveScanState {
373
457
  /**
374
458
  * The region currently open, and whether it has covered a wikilink yet.
375
459
  */
376
- openRegion: null | OpenWikilinkDirectiveRegion;
460
+ openRegion: null | OpenDirectiveRegion;
377
461
  /**
378
462
  * The line a `disable-next-line` was read on, while it still waits for the line it covers.
379
463
  */
@@ -448,11 +532,12 @@ export declare class DemoVaultCoverageChecker {
448
532
  */
449
533
  findNotesWithoutIntroProse(): string[];
450
534
  /**
451
- * Finds notes whose wikilink allowance is not doing any work — declared without a reason, or on a note
452
- * that carries no wikilink at all. Both are drift: an exemption nobody can justify, and one nothing needs
453
- * any more, which would go on hiding the next wikilink somebody adds by accident.
535
+ * Finds notes whose exemptions are not doing any work — a wikilink allowance or an inline directive for
536
+ * any rule declared without a reason, misspelled, or covering nothing that breaks its rule. All of them
537
+ * are drift: an exemption nobody can justify, and one nothing needs any more, which would go on hiding
538
+ * the next mistake somebody makes by accident.
454
539
  *
455
- * @returns The relative paths of the offending notes.
540
+ * @returns One `<note>: <problem>` entry per problem found.
456
541
  */
457
542
  findNotesWithUnjustifiedWikilinkAllowance(): string[];
458
543
  /**
@@ -471,6 +556,16 @@ export declare class DemoVaultCoverageChecker {
471
556
  * @returns The distinct stale member names referenced in the demo corpus.
472
557
  */
473
558
  findStaleReferences(params: DemoVaultCoverageCheckerFindStaleReferencesParams): string[];
559
+ /**
560
+ * Finds `Try it` sections with no `code-button` in them. A `Try it` section is a heading of any level
561
+ * starting `Try it`, up to the next heading of the same or a higher level; the setup it asks for is
562
+ * what a button is for, so a section that leaves the reader to do it by hand is the shape this check
563
+ * rejects. A section whose heading a `demo-vault-validation/try-it-code-button` directive covers has
564
+ * stated why it cannot be scripted, and is skipped — see the file overview.
565
+ *
566
+ * @returns One `<note>: line <n>` entry per offending section, naming the line of its heading.
567
+ */
568
+ findTryItSectionsWithoutCodeButton(): string[];
474
569
  /**
475
570
  * Finds members that are not demonstrated anywhere in the demo corpus.
476
571
  *
@@ -29,80 +29,6 @@ function ensureBrowserProcess() {
29
29
 
30
30
  ensureBrowserProcess();
31
31
  })();
32
- (function patchObsidianRequire() {
33
- const originalRequire = require;
34
- if (!originalRequire || originalRequire.__isPatched) {
35
- return;
36
- }
37
-
38
- require = Object.assign(
39
- (id) => requirePatched(id),
40
- originalRequire,
41
- {
42
- __isPatched: true
43
- }
44
- );
45
-
46
- function extractDefault(module) {
47
- return module && module.__esModule && 'default' in module ? module.default : module;
48
- }
49
-
50
- const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
51
- '@codemirror/autocomplete',
52
- '@codemirror/collab',
53
- '@codemirror/commands',
54
- '@codemirror/language',
55
- '@codemirror/lint',
56
- '@codemirror/search',
57
- '@codemirror/state',
58
- '@codemirror/text',
59
- '@codemirror/view',
60
- '@lezer/common',
61
- '@lezer/highlight',
62
- '@lezer/lr',
63
- 'obsidian']
64
- );
65
-
66
- const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
67
- '@codemirror/closebrackets',
68
- '@codemirror/comment',
69
- '@codemirror/fold',
70
- '@codemirror/gutter',
71
- '@codemirror/highlight',
72
- '@codemirror/history',
73
- '@codemirror/matchbrackets',
74
- '@codemirror/panel',
75
- '@codemirror/rangeset',
76
- '@codemirror/rectangular-selection',
77
- '@codemirror/stream-parser',
78
- '@codemirror/tooltip']
79
- );
80
-
81
- function requirePatched(id) {
82
- if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
83
- return originalRequire?.(id);
84
- }
85
-
86
- // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
87
- if (globalThis.app.isMobile) {
88
- if (id === 'process' || id === 'node:process') {
89
- // eslint-disable-next-line no-console -- Valid usage.
90
- console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
91
-
92
- return process;
93
- }
94
- } else {
95
- const module = originalRequire?.(id);
96
- if (module) {
97
- return extractDefault(module);
98
- }
99
- }
100
-
101
- // eslint-disable-next-line no-console -- Valid usage.
102
- console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
103
- return {};
104
- }
105
- })();
106
32
 
107
33
  "use strict";
108
34
  var __defProp = Object.defineProperty;
@@ -136,7 +62,7 @@ var import_node_fs = require('node:fs');
136
62
  var import_promises = require('node:fs/promises');
137
63
  var import_demo_vault_app_json = require('./demo-vault-app-json.cjs');
138
64
  var import_obsidian_plugin_repo_paths = require('./obsidian-plugin-repo-paths.cjs');
139
- var __import_meta_url = globalThis["import.meta.url"] ?? (function getObsidianCjsImportMetaUrl() {
65
+ var __import_meta_url = globalThis["import.meta.url"] ?? (function getCjsImportMetaUrl() {
140
66
  if (typeof __filename === "string") {
141
67
  const localRequire = require;
142
68
  const url = localRequire("node:url");
@@ -144,7 +70,7 @@ var __import_meta_url = globalThis["import.meta.url"] ?? (function getObsidianCj
144
70
  return url.pathToFileURL(__filename).href;
145
71
  }
146
72
  }
147
- return typeof window === "undefined" ? "" : activeWindow.location.href;
73
+ return globalThis.location?.href ?? "";
148
74
  })();
149
75
  const DEMO_VAULT_HELPER_PLUGIN_ID = "demo-vault-helper";
150
76
  const DATA_JSON_FILE_NAME = "data.json";
@@ -274,4 +200,4 @@ async function readDemoVaultEntries(params) {
274
200
  0 && (module.exports = {
275
201
  archivePluginDemoVault
276
202
  });
277
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vLXZhdWx0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2ltcG9ydF9tZXRhX3VybCA9IGdsb2JhbFRoaXNbJ2ltcG9ydC5tZXRhLnVybCddID8/IChmdW5jdGlvbiBnZXRPYnNpZGlhbkNqc0ltcG9ydE1ldGFVcmwoKSB7XG4gIGlmICh0eXBlb2YgX19maWxlbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBsb2NhbFJlcXVpcmUgPSByZXF1aXJlO1xuICAgIGNvbnN0IHVybCA9IGxvY2FsUmVxdWlyZSgnbm9kZTp1cmwnKTtcbiAgICBpZiAodHlwZW9mIHVybC5wYXRoVG9GaWxlVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdXJsLnBhdGhUb0ZpbGVVUkwoX19maWxlbmFtZSkuaHJlZjtcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGVudmlyb25tZW50IGlzIHVua25vd25cbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gJycgOiBhY3RpdmVXaW5kb3cubG9jYXRpb24uaHJlZjtcbn0pKCk7XG4vKipcbiAqIEBmaWxlXG4gKlxuICogQXJjaGl2ZXMgYSBwbHVnaW4ncyBkZW1vIHZhdWx0IGFzIGEgcmVsZWFzZSBhcnRpZmFjdC5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gc2hpcCBhIGN1cmF0ZWQgZGVtbyB2YXVsdCBhdCBgZGVtby12YXVsdC9gIGluIGl0cyByZXBvIHJvb3QuIEF0IHJlbGVhc2UgdGltZSB0aGlzXG4gKiBtb2R1bGUgaW5zdGFsbHMgdGhlIGZyZXNobHkgYnVpbHQgcGx1Z2luIGludG8gdGhhdCB2YXVsdCdzIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+L2AgZm9sZGVyIGFuZFxuICogemlwcyB0aGUgd2hvbGUgdmF1bHQgaW50byBgZGlzdC9idWlsZC88cGx1Z2luLWlkPi1kZW1vLXZhdWx0LnppcGAsIHNvIHRoZSBleGlzdGluZyBHaXRIdWItcmVsZWFzZVxuICogc3RlcCAod2hpY2ggdXBsb2FkcyBldmVyeSBmaWxlIGluIGBkaXN0L2J1aWxkL2ApIGF0dGFjaGVzIGl0IGF1dG9tYXRpY2FsbHkuXG4gKlxuICogVGhlIHZlcnNpb24gaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBmcm9tIHRoYXQgbmFtZSBhbmQgbGl2ZXMgSU5TSURFIHRoZSBhcmNoaXZlIGluc3RlYWQg4oCUIHNlZVxuICogYG9ic2lkaWFuL2RlbW8tdmF1bHQtbmFtaW5nLnRzYCBmb3Igd2h5IOKAlCBpbiB0aGUgdHdvIHBsYWNlcyBhIHBlcnNvbiBhY3R1YWxseSBtZWV0cyBpdDogdGhlIHZhdWx0XG4gKiBzaXRzIHVuZGVyIGEgc2luZ2xlIGA8cGx1Z2luLWlkPi1kZW1vLXZhdWx0LTx2ZXJzaW9uPi9gIGZvbGRlciwgc28gdW56aXBwaW5nIHNldmVyYWwgcmVsZWFzZXMgYnkgaGFuZFxuICogaW50byBvbmUgZm9sZGVyIG5laXRoZXIgY29sbGlkZXMgbm9yIHByb2R1Y2VzIGFub255bW91cyBkaXJlY3RvcmllcywgYW5kIHRoZSB2YXVsdCdzIGBSRUFETUUubWRgXG4gKiBoZWFkaW5nIGdhaW5zIHRoZSB2ZXJzaW9uIGl0IGRlbW9uc3RyYXRlcy5cbiAqXG4gKiBUaGUgYXJjaGl2ZWQgY29weSBhbHNvIGNhcnJpZXMgdGhlIGAub2JzaWRpYW4vYXBwLmpzb25gIHNldHRpbmdzIHRoaXMgcGFja2FnZSBvd25zIChzZWVcbiAqIGBkZW1vLXZhdWx0LWFwcC1qc29uLnRzYCkuIFRob3NlIHNldHRpbmdzIGFuZCB0aGUgUkVBRE1FIGhlYWRpbmcgYXJlIHdyaXR0ZW4gaW50byB0aGUgWklQIEVOVFJZIGFuZFxuICogbmV2ZXIgaW50byB0aGUgcmVwbyBmb2xkZXI6IGJvdGggZmlsZXMgYXJlIHRyYWNrZWQsIGFuZCBgdXBkYXRlVmVyc2lvbmAgYXJjaGl2ZXMgYWZ0ZXIgaXQgaGFzIGFscmVhZHlcbiAqIHB1c2hlZCwgc28gYW4gaW4tcGxhY2Ugd3JpdGUgd291bGQgbGVhdmUgYW4gdW5jb21taXR0ZWQgY2hhbmdlIGJlaGluZCBhIHB1Ymxpc2hlZCByZWxlYXNlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGVtb1ZhdWx0SGVscGVyU2V0dGluZ3MgfSBmcm9tICdAbW5hb3Vtb3Yvb2JzaWRpYW4tbGliL2RlbW8tdmF1bHQtaGVscGVyLXNldHRpbmdzJztcblxuaW1wb3J0IHtcbiAgZ2V0RGVtb1ZhdWx0QXJjaGl2ZUZpbGVOYW1lLFxuICBnZXREZW1vVmF1bHRGb2xkZXJOYW1lXG59IGZyb20gJ0BtbmFvdW1vdi9vYnNpZGlhbi1saWIvZGVtby12YXVsdC1uYW1pbmcnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXQvZnMnO1xuaW1wb3J0IHtcbiAgZ2V0Um9vdEZvbGRlcixcbiAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXQvcm9vdCc7XG5pbXBvcnQge1xuICBnZXRGb2xkZXJOYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyB6aXBTeW5jIH0gZnJvbSAnZmZsYXRlJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIGNwLFxuICBta2RpcixcbiAgcmVhZEZpbGUsXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUgeyBEZW1vVmF1bHRBcHBKc29uIH0gZnJvbSAnLi9kZW1vLXZhdWx0LWFwcC1qc29uLnRzJztcblxuaW1wb3J0IHtcbiAgYnVpbGRBcmNoaXZlZERlbW9WYXVsdEFwcEpzb25Db250ZW50LFxuICBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MsXG4gIHBhcnNlRGVtb1ZhdWx0QXBwSnNvblxufSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcblxuY29uc3QgREVNT19WQVVMVF9IRUxQRVJfUExVR0lOX0lEID0gJ2RlbW8tdmF1bHQtaGVscGVyJztcbmNvbnN0IERBVEFfSlNPTl9GSUxFX05BTUUgPSAnZGF0YS5qc29uJztcbmNvbnN0IERBVEFfSlNPTl9JTkRFTlQgPSAyO1xuY29uc3QgUkVBRE1FX0ZJTEVfTkFNRSA9ICdSRUFETUUubWQnO1xuXG4vLyBUaGUgUkVBRE1FJ3Mgb3BlbmluZyBgIyBIMWAsIGFuZCBvbmx5IHRoYXQgb25lOiB3aXRob3V0IHRoZSBgbWAgZmxhZyB0aGUgbWF0Y2ggaXMgYW5jaG9yZWQgdG8gdGhlIHN0YXJ0XG4vLyBvZiB0aGUgZmlsZSwgYW5kIGAuYCBzdG9wcyBhdCB0aGUgbmV3bGluZSB0aGF0IGVuZHMgdGhlIGxpbmUuXG5jb25zdCBPUEVOSU5HX0hFQURJTkdfUkVHX0VYUCA9IC9eIyAuKi87XG5cbi8qKlxuICogVGhlIGFyY2hpdmUncyBlbnRyaWVzLCBrZXllZCBieSB0aGUgbmFtZSBlYWNoIG9uZSB0YWtlcyBpbnNpZGUgdGhlIFpJUC5cbiAqXG4gKiBUaGUgd2hvbGUgYXJjaGl2ZSBpcyBhc3NlbWJsZWQgYXMgdGhpcyBtYXAgYW5kIHNlcmlhbGl6ZWQgb25jZSwgc28gaW5qZWN0aW5nIGFuIGVudHJ5IGlzIGFuIG9yZGluYXJ5XG4gKiBgc2V0YCByYXRoZXIgdGhhbiBhIG11dGF0aW9uIG9mIGEgaGFsZi1idWlsdCBhcmNoaXZlIG9iamVjdC5cbiAqL1xudHlwZSBEZW1vVmF1bHRaaXBFbnRyaWVzID0gTWFwPHN0cmluZywgQnVmZmVyPjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW5qZWN0QXBwSnNvbn0uXG4gKi9cbmludGVyZmFjZSBJbmplY3RBcHBKc29uUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21taXR0ZWQgc2V0dGluZ3MgdGhlIG93bmVkIG9uZXMgYXJlIG1lcmdlZCBvdmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwSnNvbjogRGVtb1ZhdWx0QXBwSnNvbjtcblxuICAvKipcbiAgICogVGhlIGFyY2hpdmUncyBlbnRyaWVzLCBlZGl0ZWQgaW4gcGxhY2UuXG4gICAqL1xuICByZWFkb25seSBlbnRyaWVzOiBEZW1vVmF1bHRaaXBFbnRyaWVzO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJjaGl2ZSdzIHNpbmdsZSB0b3AtbGV2ZWwgZm9sZGVyLCB3aGljaCBldmVyeSBlbnRyeSBuYW1lIGlzIHJlbGF0aXZlIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlck5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW5qZWN0UmVhZG1lVmVyc2lvbn0uXG4gKi9cbmludGVyZmFjZSBJbmplY3RSZWFkbWVWZXJzaW9uUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcmNoaXZlJ3MgZW50cmllcywgZWRpdGVkIGluIHBsYWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cmllczogRGVtb1ZhdWx0WmlwRW50cmllcztcblxuICAvKipcbiAgICogVGhlIGFyY2hpdmUncyBzaW5nbGUgdG9wLWxldmVsIGZvbGRlciwgd2hpY2ggZXZlcnkgZW50cnkgbmFtZSBpcyByZWxhdGl2ZSB0by5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXJOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gdmVyc2lvbiB0aGUgdmF1bHQgZGVtb25zdHJhdGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBtaW5pbWFsIHNoYXBlIG9mIGEgcGx1Z2luIGBtYW5pZmVzdC5qc29uYCByZWFkIGJ5IHtAbGluayBhcmNoaXZlUGx1Z2luRGVtb1ZhdWx0fS5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpbk1hbmlmZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQsIHVzZWQgYXMgdGhlIGZvbGRlciBuYW1lIHVuZGVyIGBkZW1vLXZhdWx0Ly5vYnNpZGlhbi9wbHVnaW5zL2AuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHZlcnNpb24sIGVtYmVkZGVkIGluIHRoZSBhcmNoaXZlJ3MgdG9wLWxldmVsIGZvbGRlciBuYW1lIGFuZCBpdHMgUkVBRE1FIGhlYWRpbmcuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlYWREZW1vVmF1bHRFbnRyaWVzfS5cbiAqL1xuaW50ZXJmYWNlIFJlYWREZW1vVmF1bHRFbnRyaWVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB2YXVsdCBmb2xkZXIgdG8gcmVhZCwgYXMgYW4gYWJzb2x1dGUgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGRlbW9WYXVsdFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFyY2hpdmUncyBzaW5nbGUgdG9wLWxldmVsIGZvbGRlciwgd2hpY2ggZXZlcnkgZW50cnkgbmFtZSBpcyByZWxhdGl2ZSB0by5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXJOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXJjaGl2ZXMgdGhlIHBsdWdpbidzIGRlbW8gdmF1bHQgKGBkZW1vLXZhdWx0L2AgaW4gdGhlIHJlcG8gcm9vdCkgYXMgYSByZWxlYXNlIGFydGlmYWN0LlxuICpcbiAqIEluc3RhbGxzIHRoZSBmcmVzaGx5IGJ1aWx0IHBsdWdpbiBmcm9tIGBkaXN0L2J1aWxkL2AgaW50byB0aGUgdmF1bHQnc1xuICogYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYCBmb2xkZXIsIHRoZW4gemlwcyB0aGUgd2hvbGUgdmF1bHQgdG9cbiAqIGBkaXN0L2J1aWxkLzxwbHVnaW4taWQ+LWRlbW8tdmF1bHQuemlwYCwgdW5kZXIgYSBzaW5nbGUgYDxwbHVnaW4taWQ+LWRlbW8tdmF1bHQtPHZlcnNpb24+L2AgZm9sZGVyLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGNyZWF0ZWQgemlwIGFyY2hpdmUsIG9yXG4gKiBgbnVsbGAgaWYgdGhlIHJlcG8gaGFzIG5vIGBkZW1vLXZhdWx0L2AgZm9sZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXJjaGl2ZVBsdWdpbkRlbW9WYXVsdCgpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgY29uc3QgZGVtb1ZhdWx0UGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0IH0pO1xuICBpZiAoIWV4aXN0c1N5bmMoZGVtb1ZhdWx0UGF0aCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uIH0pO1xuICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUobWFuaWZlc3RQYXRoLCAndXRmLTgnKSkgYXMgUGx1Z2luTWFuaWZlc3Q7XG5cbiAgY29uc3QgcGx1Z2luRm9sZGVyID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQsXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbixcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlBsdWdpbnMsXG4gICAgICBtYW5pZmVzdC5pZFxuICAgIClcbiAgfSk7XG4gIGF3YWl0IG1rZGlyKHBsdWdpbkZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgZGlzdEJ1aWxkUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkIH0pO1xuICBhd2FpdCBjcChkaXN0QnVpbGRQYXRoLCBwbHVnaW5Gb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGF3YWl0IGluamVjdERlbW9WYXVsdEhlbHBlcihtYW5pZmVzdC5pZCk7XG5cbiAgY29uc3QgemlwUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCwgZ2V0RGVtb1ZhdWx0QXJjaGl2ZUZpbGVOYW1lKG1hbmlmZXN0LmlkKSlcbiAgfSk7XG4gIGNvbnN0IHJvb3RGb2xkZXJOYW1lID0gZ2V0RGVtb1ZhdWx0Rm9sZGVyTmFtZSh7XG4gICAgcGx1Z2luSWQ6IG1hbmlmZXN0LmlkLFxuICAgIHZlcnNpb246IG1hbmlmZXN0LnZlcnNpb25cbiAgfSk7XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkRGVtb1ZhdWx0RW50cmllcyh7XG4gICAgZGVtb1ZhdWx0UGF0aCxcbiAgICByb290Rm9sZGVyTmFtZVxuICB9KTtcbiAgaW5qZWN0QXBwSnNvbih7XG4gICAgYXBwSnNvbjogYXdhaXQgcmVhZENvbW1pdHRlZEFwcEpzb24oKSxcbiAgICBlbnRyaWVzLFxuICAgIHJvb3RGb2xkZXJOYW1lXG4gIH0pO1xuICBpbmplY3RSZWFkbWVWZXJzaW9uKHtcbiAgICBlbnRyaWVzLFxuICAgIHJvb3RGb2xkZXJOYW1lLFxuICAgIHZlcnNpb246IG1hbmlmZXN0LnZlcnNpb25cbiAgfSk7XG4gIC8vIEV2ZXJ5IGVudHJ5IGlzIHN0YW1wZWQgd2l0aCB0aGUgbW9tZW50IHRoZSBhcmNoaXZlIGlzIGJ1aWx0IHJhdGhlciB0aGFuIHRoZSBmaWxlJ3Mgb3duIG10aW1lLCB3aGljaCBpc1xuICAvLyB3aGF0IHRoZSBwcmV2aW91cyBhcmNoaXZlciB3cm90ZS4gQSBkZW1vIHZhdWx0J3MgY29tbWl0dGVkIHRpbWVzdGFtcHMgYXJlIGNoZWNrb3V0IGFydGlmYWN0cyBvZiB3aG9ldmVyXG4gIC8vIHJhbiB0aGUgcmVsZWFzZSwgc28gdGhleSBjYXJyeSBub3RoaW5nIGEgcmVhZGVyIGNvdWxkIHVzZTsgdGhlIGJ1aWxkIHRpbWUgYXQgbGVhc3QgZGVzY3JpYmVzIHRoZVxuICAvLyBhcmNoaXZlLlxuICBhd2FpdCB3cml0ZUZpbGUoemlwUGF0aCwgemlwU3luYyhPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcykpKTtcbiAgcmV0dXJuIHppcFBhdGg7XG59XG5cbi8vIFN0b3JlcyB0aGUgYXJjaGl2ZWQgdmF1bHQncyBgLm9ic2lkaWFuL2FwcC5qc29uYCDigJQgdGhlIGNvbW1pdHRlZCBzZXR0aW5ncyB3aXRoIHRoZSBvd25lZCBvbmVzIG1lcmdlZFxuLy8gb3ZlciB0aGVtLiBUaGUgRU5UUlkgaXMgd3JpdHRlbiByYXRoZXIgdGhhbiB0aGUgZmlsZSwgc28gdGhlIHJlcG8gZm9sZGVyIGlzIGxlZnQgZXhhY3RseSBhcyBpdCB3YXMsIGFuZFxuLy8gQSB2YXVsdCB3aXRoIG5vdGhpbmcgZWxzZSB0byBjb25maWd1cmUg4oCUIHdoaWNoIGNvbW1pdHMgbm8gYGFwcC5qc29uYCBhdCBhbGwg4oCUIGdldHMgb25lIGhlcmUgcmVnYXJkbGVzcy5cbmZ1bmN0aW9uIGluamVjdEFwcEpzb24ocGFyYW1zOiBJbmplY3RBcHBKc29uUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBhcHBKc29uLFxuICAgIGVudHJpZXMsXG4gICAgcm9vdEZvbGRlck5hbWVcbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBlbnRyeU5hbWUgPSBqb2luKHJvb3RGb2xkZXJOYW1lLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbiwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQXBwSnNvbik7XG4gIGVudHJpZXMuc2V0KGVudHJ5TmFtZSwgQnVmZmVyLmZyb20oYnVpbGRBcmNoaXZlZERlbW9WYXVsdEFwcEpzb25Db250ZW50KHsgYXBwSnNvbiB9KSwgJ3V0Zi04JykpO1xufVxuXG4vLyBJbmplY3RzIHRoZSBidWlsdCwgYG9ic2lkaWFuLWRldi11dGlsc2Atb3duZWQgYGRlbW8tdmF1bHQtaGVscGVyYCBib290c3RyYXAgcGx1Z2luIChzaGlwcGVkIGluIHRoaXMgcGFja2FnZSkgaW50byB0aGUgZGVtbyB2YXVsdCwgc28gbm8gcGVyLXZhdWx0IGNvcHkgaXMgY29tbWl0dGVkIGFuZCBhbiBgb2JzaWRpYW4tZGV2LXV0aWxzYCBidW1wIHByb3BhZ2F0ZXMgZml4ZXMuXG4vL1xuLy8gQWxvbmdzaWRlIHRoZSBiaW5hcmllcyBpdCB3cml0ZXMgdGhlIGhlbHBlcidzIG93biBgZGF0YS5qc29uYCBuYW1pbmcgdGhlIGRlbW9uc3RyYXRlZCBwbHVnaW4uIFRoYXQgaXNcbi8vIHRoZSBvbmUgbW9tZW50IHRoZSBpZCBpcyBrbm93biBmb3IgY2VydGFpbiDigJQgaXQgY29tZXMgZnJvbSB0aGUgcGx1Z2luJ3Mgb3duIG1hbmlmZXN0IOKAlCB3aGVyZWFzIHRoZVxuLy8gb3BlbmVkIHZhdWx0IG9ubHkgb2ZmZXJzIHBsdWdpbiBmb2xkZXJzIHRvIGNvdW50LCB3aGljaCB0aGUgYm9vdHN0cmFwIGl0c2VsZiBhZGRzIHRvIChzZWVcbi8vIGBEZW1vVmF1bHRIZWxwZXJTZXR0aW5nc2ApLlxuYXN5bmMgZnVuY3Rpb24gaW5qZWN0RGVtb1ZhdWx0SGVscGVyKGRlbW9lZFBsdWdpbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZUZvbGRlciA9IGdldFJvb3RGb2xkZXIoZ2V0Rm9sZGVyTmFtZShpbXBvcnQubWV0YS51cmwpKTtcbiAgaWYgKCFwYWNrYWdlRm9sZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgcmVzb2x2ZSB0aGUgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0IHBhY2thZ2UgZm9sZGVyIHRvIGluamVjdCB0aGUgZGVtby12YXVsdC1oZWxwZXIgcGx1Z2luLicpO1xuICB9XG5cbiAgY29uc3QgaGVscGVyU291cmNlUGF0aCA9IGpvaW4ocGFja2FnZUZvbGRlciwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdERlbW9WYXVsdEhlbHBlcik7XG4gIGNvbnN0IGhlbHBlckZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5QbHVnaW5zLFxuICAgICAgREVNT19WQVVMVF9IRUxQRVJfUExVR0lOX0lEXG4gICAgKVxuICB9KTtcbiAgYXdhaXQgbWtkaXIoaGVscGVyRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY3AoaGVscGVyU291cmNlUGF0aCwgaGVscGVyRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBzZXR0aW5nczogRGVtb1ZhdWx0SGVscGVyU2V0dGluZ3MgPSB7IGRlbW9lZFBsdWdpbklkIH07XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKGhlbHBlckZvbGRlciwgREFUQV9KU09OX0ZJTEVfTkFNRSksIGAke0pTT04uc3RyaW5naWZ5KHNldHRpbmdzLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKX1cXG5gLCAndXRmLTgnKTtcbn1cblxuLy8gTmFtZXMgdGhlIHZlcnNpb24gb24gdGhlIGFyY2hpdmVkIGBSRUFETUUubWRgJ3MgaGVhZGluZywgc28gdGhlIHZhdWx0IHNheXMgd2hpY2ggcmVsZWFzZSBpdCBkZW1vbnN0cmF0ZXNcbi8vIGhvd2V2ZXIgZmFyIGl0IHRyYXZlbHMgZnJvbSB0aGUgcmVsZWFzZSBwYWdlIGl0IHdhcyBkb3dubG9hZGVkIGZyb20uXG4vL1xuLy8gRW50cnktb25seSwgZm9yIHRoZSBzYW1lIHJlYXNvbiBgaW5qZWN0QXBwSnNvbmAgaXM6IHRoZSBjb21taXR0ZWQgUkVBRE1FIGlzIGEgdHJhY2tlZCwgaGFuZC1hdXRob3JlZFxuLy8gZmlsZSBhbmQgYHVwZGF0ZVZlcnNpb25gIGFyY2hpdmVzIGFmdGVyIGl0IGhhcyBhbHJlYWR5IHB1c2hlZC5cbi8vXG4vLyBBIHZhdWx0IHRoYXQgc2hpcHMgbm8gUkVBRE1FLCBvciBvbmUgb3BlbmluZyBvbiBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBgIyBIMWAsIGlzIGxlZnQgYWxvbmUgcmF0aGVyXG4vLyB0aGFuIGNvcnJlY3RlZC4gVGhlIGRlbW8tdmF1bHQgY292ZXJhZ2Ugc3VpdGUgZXhlbXB0cyBgUkVBRE1FLm1kYCBmcm9tIGl0cyBIMSBjaGVjaywgc28gbmVpdGhlciBzaGFwZVxuLy8gaXMgYSBkZWZlY3Qg4oCUIGFuZCBhIHJlbGVhc2UgaXMgdGhlIHdyb25nIG1vbWVudCB0byBzdGFydCBmYWlsaW5nIG9uIG9uZS5cbmZ1bmN0aW9uIGluamVjdFJlYWRtZVZlcnNpb24ocGFyYW1zOiBJbmplY3RSZWFkbWVWZXJzaW9uUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBlbnRyaWVzLFxuICAgIHJvb3RGb2xkZXJOYW1lLFxuICAgIHZlcnNpb25cbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBlbnRyeU5hbWUgPSBqb2luKHJvb3RGb2xkZXJOYW1lLCBSRUFETUVfRklMRV9OQU1FKTtcbiAgY29uc3QgZW50cnkgPSBlbnRyaWVzLmdldChlbnRyeU5hbWUpO1xuICBpZiAoIWVudHJ5KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29udGVudCA9IGVudHJ5LnRvU3RyaW5nKCd1dGYtOCcpO1xuICBjb25zdCB2ZXJzaW9uZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlKE9QRU5JTkdfSEVBRElOR19SRUdfRVhQLCAoaGVhZGluZykgPT4gYCR7aGVhZGluZ30gdiR7dmVyc2lvbn1gKTtcbiAgaWYgKHZlcnNpb25lZENvbnRlbnQgPT09IGNvbnRlbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBlbnRyaWVzLnNldChlbnRyeU5hbWUsIEJ1ZmZlci5mcm9tKHZlcnNpb25lZENvbnRlbnQsICd1dGYtOCcpKTtcbn1cblxuLy8gUmVhZHMgdGhlIGRlbW8gdmF1bHQncyBjb21taXR0ZWQgYC5vYnNpZGlhbi9hcHAuanNvbmAsIHJlZnVzaW5nIHRoZSBzZXR0aW5ncyB0aGlzIHBhY2thZ2Ugb3ducy5cbi8vXG4vLyBUaG9zZSBzZXR0aW5ncyBhcmUgaW5qZWN0ZWQgaW50byB0aGUgYXJjaGl2ZSwgc28gYSBjb21taXR0ZWQgb25lIGlzIGEgc2Vjb25kIHNvdXJjZSBvZiB0cnV0aCB0aGF0XG4vLyBub3RoaW5nIGtlZXBzIGluIHN0ZXAuIFRoZSBkZW1vLXZhdWx0IGNvdmVyYWdlIHN1aXRlIGFscmVhZHkgZmFpbHMgb24gaXQsIHdoaWNoIG1lYW5zIHJlYWNoaW5nIGhlcmVcbi8vIG1lYW5zIHRoYXQgZ2F0ZSB3YXMgc2tpcHBlZCDigJQgc28gdGhpcyByZWZ1c2VzIHJhdGhlciB0aGFuIG92ZXJ3cml0aW5nIGEgdmFsdWUgc29tZWJvZHkgY2hvc2Ugb24gcHVycG9zZS5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDb21taXR0ZWRBcHBKc29uKCk6IFByb21pc2U8RGVtb1ZhdWx0QXBwSnNvbj4ge1xuICBjb25zdCBhcHBKc29uUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkFwcEpzb24pXG4gIH0pO1xuICBjb25zdCBjb250ZW50ID0gZXhpc3RzU3luYyhhcHBKc29uUGF0aCkgPyBhd2FpdCByZWFkRmlsZShhcHBKc29uUGF0aCwgJ3V0Zi04JykgOiBudWxsO1xuICBjb25zdCBhcHBKc29uID0gcGFyc2VEZW1vVmF1bHRBcHBKc29uKHsgY29udGVudCwgcGF0aDogYXBwSnNvblBhdGggfSk7XG5cbiAgY29uc3Qgb3duZWRTZXR0aW5ncyA9IGZpbmRPd25lZERlbW9WYXVsdEFwcEpzb25TZXR0aW5ncyh7IGFwcEpzb24gfSk7XG4gIGlmIChvd25lZFNldHRpbmdzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHthcHBKc29uUGF0aH0gc2V0cyAke293bmVkU2V0dGluZ3Muam9pbignLCAnKX0sIHdoaWNoIG9ic2lkaWFuLWRldi11dGlscyBvd25zIGFuZCB3cml0ZXMgaW50byB0aGUgYXJjaGl2ZWQgZGVtbyB2YXVsdC4gU2V0dGluZ3MgaXQgb3ducyBtdXN0IG5vdCBiZSBjb21taXR0ZWQuYFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gYXBwSnNvbjtcbn1cblxuLy8gUmVhZHMgZXZlcnkgZmlsZSBpbiB0aGUgZGVtbyB2YXVsdCBhcyBhbiBhcmNoaXZlIGVudHJ5LCB1bmRlciB0aGUgc2luZ2xlIHRvcC1sZXZlbCBmb2xkZXIgdGhlIGFyY2hpdmVcbi8vIHNpdHMgaW4uXG4vL1xuLy8gT25seSBGSUxFUyBiZWNvbWUgZW50cmllcy4gR2l0IGNhbm5vdCB0cmFjayBhbiBlbXB0eSBmb2xkZXIsIHNvIGEgY29tbWl0dGVkIGRlbW8gdmF1bHQgaGFzIG5vbmUg4oCUIGFuZFxuLy8gYGV4dHJhY3RaaXBBcmNoaXZlYCBjcmVhdGVzIGFuIGVudHJ5J3MgcGFyZW50IGZvbGRlcnMgd2hldGhlciBvciBub3QgdGhlIGFyY2hpdmUgZGVjbGFyZWQgdGhlbSwgc28gYVxuLy8gZm9sZGVyIGVudHJ5IHdvdWxkIGVhcm4gbm90aGluZyBldmVuIGlmIG9uZSBjb3VsZCBleGlzdC5cbmFzeW5jIGZ1bmN0aW9uIHJlYWREZW1vVmF1bHRFbnRyaWVzKHBhcmFtczogUmVhZERlbW9WYXVsdEVudHJpZXNQYXJhbXMpOiBQcm9taXNlPERlbW9WYXVsdFppcEVudHJpZXM+IHtcbiAgY29uc3Qge1xuICAgIGRlbW9WYXVsdFBhdGgsXG4gICAgcm9vdEZvbGRlck5hbWVcbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBlbnRyaWVzOiBEZW1vVmF1bHRaaXBFbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEJ1ZmZlcj4oKTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgcmVhZGRpclBvc2l4KGRlbW9WYXVsdFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFkaXJlbnQuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBqb2luKGRpcmVudC5wYXJlbnRQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgZW50cmllcy5zZXQoam9pbihyb290Rm9sZGVyTmFtZSwgcmVsYXRpdmUoZGVtb1ZhdWx0UGF0aCwgcGF0aCkpLCBhd2FpdCByZWFkRmlsZShwYXRoKSk7XG4gIH1cblxuICByZXR1cm4gZW50cmllcztcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFvQ0EsK0JBR087QUFDUCxnQkFBNkI7QUFDN0Isa0JBR087QUFDUCxrQkFJTztBQUNQLG9CQUF3QjtBQUN4QixxQkFBMkI7QUFDM0Isc0JBS087QUFJUCxpQ0FJTztBQUNQLHdDQUF3QztBQWxFeEMsSUFBSSxvQkFBb0IsV0FBVyxpQkFBaUIsTUFBTSxTQUFTLDhCQUE4QjtBQUMvRixNQUFJLE9BQU8sZUFBZSxVQUFVO0FBQ2xDLFVBQU0sZUFBZTtBQUNyQixVQUFNLE1BQU0sYUFBYSxV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
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vLXZhdWx0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2ltcG9ydF9tZXRhX3VybCA9IGdsb2JhbFRoaXNbJ2ltcG9ydC5tZXRhLnVybCddID8/IChmdW5jdGlvbiBnZXRDanNJbXBvcnRNZXRhVXJsKCkge1xuICBpZiAodHlwZW9mIF9fZmlsZW5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBsb2NhbFJlcXVpcmUgPSByZXF1aXJlO1xuICAgIGNvbnN0IHVybCA9IGxvY2FsUmVxdWlyZShcIm5vZGU6dXJsXCIpO1xuICAgIGlmICh0eXBlb2YgdXJsLnBhdGhUb0ZpbGVVUkwgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHVybC5wYXRoVG9GaWxlVVJMKF9fZmlsZW5hbWUpLmhyZWY7XG4gICAgfVxuICB9XG4gIHJldHVybiBnbG9iYWxUaGlzLmxvY2F0aW9uPy5ocmVmID8/IFwiXCI7XG59KSgpO1xuLyoqXG4gKiBAZmlsZVxuICpcbiAqIEFyY2hpdmVzIGEgcGx1Z2luJ3MgZGVtbyB2YXVsdCBhcyBhIHJlbGVhc2UgYXJ0aWZhY3QuXG4gKlxuICogQSBwbHVnaW4gY2FuIHNoaXAgYSBjdXJhdGVkIGRlbW8gdmF1bHQgYXQgYGRlbW8tdmF1bHQvYCBpbiBpdHMgcmVwbyByb290LiBBdCByZWxlYXNlIHRpbWUgdGhpc1xuICogbW9kdWxlIGluc3RhbGxzIHRoZSBmcmVzaGx5IGJ1aWx0IHBsdWdpbiBpbnRvIHRoYXQgdmF1bHQncyBgLm9ic2lkaWFuL3BsdWdpbnMvPGlkPi9gIGZvbGRlciBhbmRcbiAqIHppcHMgdGhlIHdob2xlIHZhdWx0IGludG8gYGRpc3QvYnVpbGQvPHBsdWdpbi1pZD4tZGVtby12YXVsdC56aXBgLCBzbyB0aGUgZXhpc3RpbmcgR2l0SHViLXJlbGVhc2VcbiAqIHN0ZXAgKHdoaWNoIHVwbG9hZHMgZXZlcnkgZmlsZSBpbiBgZGlzdC9idWlsZC9gKSBhdHRhY2hlcyBpdCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIFRoZSB2ZXJzaW9uIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgZnJvbSB0aGF0IG5hbWUgYW5kIGxpdmVzIElOU0lERSB0aGUgYXJjaGl2ZSBpbnN0ZWFkIOKAlCBzZWVcbiAqIGBvYnNpZGlhbi9kZW1vLXZhdWx0LW5hbWluZy50c2AgZm9yIHdoeSDigJQgaW4gdGhlIHR3byBwbGFjZXMgYSBwZXJzb24gYWN0dWFsbHkgbWVldHMgaXQ6IHRoZSB2YXVsdFxuICogc2l0cyB1bmRlciBhIHNpbmdsZSBgPHBsdWdpbi1pZD4tZGVtby12YXVsdC08dmVyc2lvbj4vYCBmb2xkZXIsIHNvIHVuemlwcGluZyBzZXZlcmFsIHJlbGVhc2VzIGJ5IGhhbmRcbiAqIGludG8gb25lIGZvbGRlciBuZWl0aGVyIGNvbGxpZGVzIG5vciBwcm9kdWNlcyBhbm9ueW1vdXMgZGlyZWN0b3JpZXMsIGFuZCB0aGUgdmF1bHQncyBgUkVBRE1FLm1kYFxuICogaGVhZGluZyBnYWlucyB0aGUgdmVyc2lvbiBpdCBkZW1vbnN0cmF0ZXMuXG4gKlxuICogVGhlIGFyY2hpdmVkIGNvcHkgYWxzbyBjYXJyaWVzIHRoZSBgLm9ic2lkaWFuL2FwcC5qc29uYCBzZXR0aW5ncyB0aGlzIHBhY2thZ2Ugb3ducyAoc2VlXG4gKiBgZGVtby12YXVsdC1hcHAtanNvbi50c2ApLiBUaG9zZSBzZXR0aW5ncyBhbmQgdGhlIFJFQURNRSBoZWFkaW5nIGFyZSB3cml0dGVuIGludG8gdGhlIFpJUCBFTlRSWSBhbmRcbiAqIG5ldmVyIGludG8gdGhlIHJlcG8gZm9sZGVyOiBib3RoIGZpbGVzIGFyZSB0cmFja2VkLCBhbmQgYHVwZGF0ZVZlcnNpb25gIGFyY2hpdmVzIGFmdGVyIGl0IGhhcyBhbHJlYWR5XG4gKiBwdXNoZWQsIHNvIGFuIGluLXBsYWNlIHdyaXRlIHdvdWxkIGxlYXZlIGFuIHVuY29tbWl0dGVkIGNoYW5nZSBiZWhpbmQgYSBwdWJsaXNoZWQgcmVsZWFzZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERlbW9WYXVsdEhlbHBlclNldHRpbmdzIH0gZnJvbSAnQG1uYW91bW92L29ic2lkaWFuLWxpYi9kZW1vLXZhdWx0LWhlbHBlci1zZXR0aW5ncyc7XG5cbmltcG9ydCB7XG4gIGdldERlbW9WYXVsdEFyY2hpdmVGaWxlTmFtZSxcbiAgZ2V0RGVtb1ZhdWx0Rm9sZGVyTmFtZVxufSBmcm9tICdAbW5hb3Vtb3Yvb2JzaWRpYW4tbGliL2RlbW8tdmF1bHQtbmFtaW5nJztcbmltcG9ydCB7IHJlYWRkaXJQb3NpeCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2ZzJztcbmltcG9ydCB7XG4gIGdldFJvb3RGb2xkZXIsXG4gIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L3Jvb3QnO1xuaW1wb3J0IHtcbiAgZ2V0Rm9sZGVyTmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgemlwU3luYyB9IGZyb20gJ2ZmbGF0ZSc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbmltcG9ydCB0eXBlIHsgRGVtb1ZhdWx0QXBwSnNvbiB9IGZyb20gJy4vZGVtby12YXVsdC1hcHAtanNvbi50cyc7XG5cbmltcG9ydCB7XG4gIGJ1aWxkQXJjaGl2ZWREZW1vVmF1bHRBcHBKc29uQ29udGVudCxcbiAgZmluZE93bmVkRGVtb1ZhdWx0QXBwSnNvblNldHRpbmdzLFxuICBwYXJzZURlbW9WYXVsdEFwcEpzb25cbn0gZnJvbSAnLi9kZW1vLXZhdWx0LWFwcC1qc29uLnRzJztcbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyc7XG5cbmNvbnN0IERFTU9fVkFVTFRfSEVMUEVSX1BMVUdJTl9JRCA9ICdkZW1vLXZhdWx0LWhlbHBlcic7XG5jb25zdCBEQVRBX0pTT05fRklMRV9OQU1FID0gJ2RhdGEuanNvbic7XG5jb25zdCBEQVRBX0pTT05fSU5ERU5UID0gMjtcbmNvbnN0IFJFQURNRV9GSUxFX05BTUUgPSAnUkVBRE1FLm1kJztcblxuLy8gVGhlIFJFQURNRSdzIG9wZW5pbmcgYCMgSDFgLCBhbmQgb25seSB0aGF0IG9uZTogd2l0aG91dCB0aGUgYG1gIGZsYWcgdGhlIG1hdGNoIGlzIGFuY2hvcmVkIHRvIHRoZSBzdGFydFxuLy8gb2YgdGhlIGZpbGUsIGFuZCBgLmAgc3RvcHMgYXQgdGhlIG5ld2xpbmUgdGhhdCBlbmRzIHRoZSBsaW5lLlxuY29uc3QgT1BFTklOR19IRUFESU5HX1JFR19FWFAgPSAvXiMgLiovO1xuXG4vKipcbiAqIFRoZSBhcmNoaXZlJ3MgZW50cmllcywga2V5ZWQgYnkgdGhlIG5hbWUgZWFjaCBvbmUgdGFrZXMgaW5zaWRlIHRoZSBaSVAuXG4gKlxuICogVGhlIHdob2xlIGFyY2hpdmUgaXMgYXNzZW1ibGVkIGFzIHRoaXMgbWFwIGFuZCBzZXJpYWxpemVkIG9uY2UsIHNvIGluamVjdGluZyBhbiBlbnRyeSBpcyBhbiBvcmRpbmFyeVxuICogYHNldGAgcmF0aGVyIHRoYW4gYSBtdXRhdGlvbiBvZiBhIGhhbGYtYnVpbHQgYXJjaGl2ZSBvYmplY3QuXG4gKi9cbnR5cGUgRGVtb1ZhdWx0WmlwRW50cmllcyA9IE1hcDxzdHJpbmcsIEJ1ZmZlcj47XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGluamVjdEFwcEpzb259LlxuICovXG5pbnRlcmZhY2UgSW5qZWN0QXBwSnNvblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tbWl0dGVkIHNldHRpbmdzIHRoZSBvd25lZCBvbmVzIGFyZSBtZXJnZWQgb3Zlci5cbiAgICovXG4gIHJlYWRvbmx5IGFwcEpzb246IERlbW9WYXVsdEFwcEpzb247XG5cbiAgLyoqXG4gICAqIFRoZSBhcmNoaXZlJ3MgZW50cmllcywgZWRpdGVkIGluIHBsYWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cmllczogRGVtb1ZhdWx0WmlwRW50cmllcztcblxuICAvKipcbiAgICogVGhlIGFyY2hpdmUncyBzaW5nbGUgdG9wLWxldmVsIGZvbGRlciwgd2hpY2ggZXZlcnkgZW50cnkgbmFtZSBpcyByZWxhdGl2ZSB0by5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXJOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGluamVjdFJlYWRtZVZlcnNpb259LlxuICovXG5pbnRlcmZhY2UgSW5qZWN0UmVhZG1lVmVyc2lvblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXJjaGl2ZSdzIGVudHJpZXMsIGVkaXRlZCBpbiBwbGFjZS5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IERlbW9WYXVsdFppcEVudHJpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBhcmNoaXZlJ3Mgc2luZ2xlIHRvcC1sZXZlbCBmb2xkZXIsIHdoaWNoIGV2ZXJ5IGVudHJ5IG5hbWUgaXMgcmVsYXRpdmUgdG8uXG4gICAqL1xuICByZWFkb25seSByb290Rm9sZGVyTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHZlcnNpb24gdGhlIHZhdWx0IGRlbW9uc3RyYXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgbWluaW1hbCBzaGFwZSBvZiBhIHBsdWdpbiBgbWFuaWZlc3QuanNvbmAgcmVhZCBieSB7QGxpbmsgYXJjaGl2ZVBsdWdpbkRlbW9WYXVsdH0uXG4gKi9cbmludGVyZmFjZSBQbHVnaW5NYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlkLCB1c2VkIGFzIHRoZSBmb2xkZXIgbmFtZSB1bmRlciBgZGVtby12YXVsdC8ub2JzaWRpYW4vcGx1Z2lucy9gLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiB2ZXJzaW9uLCBlbWJlZGRlZCBpbiB0aGUgYXJjaGl2ZSdzIHRvcC1sZXZlbCBmb2xkZXIgbmFtZSBhbmQgaXRzIFJFQURNRSBoZWFkaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZWFkRGVtb1ZhdWx0RW50cmllc30uXG4gKi9cbmludGVyZmFjZSBSZWFkRGVtb1ZhdWx0RW50cmllc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgdmF1bHQgZm9sZGVyIHRvIHJlYWQsIGFzIGFuIGFic29sdXRlIHBhdGguXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhcmNoaXZlJ3Mgc2luZ2xlIHRvcC1sZXZlbCBmb2xkZXIsIHdoaWNoIGV2ZXJ5IGVudHJ5IG5hbWUgaXMgcmVsYXRpdmUgdG8uXG4gICAqL1xuICByZWFkb25seSByb290Rm9sZGVyTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFyY2hpdmVzIHRoZSBwbHVnaW4ncyBkZW1vIHZhdWx0IChgZGVtby12YXVsdC9gIGluIHRoZSByZXBvIHJvb3QpIGFzIGEgcmVsZWFzZSBhcnRpZmFjdC5cbiAqXG4gKiBJbnN0YWxscyB0aGUgZnJlc2hseSBidWlsdCBwbHVnaW4gZnJvbSBgZGlzdC9idWlsZC9gIGludG8gdGhlIHZhdWx0J3NcbiAqIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+L2AgZm9sZGVyLCB0aGVuIHppcHMgdGhlIHdob2xlIHZhdWx0IHRvXG4gKiBgZGlzdC9idWlsZC88cGx1Z2luLWlkPi1kZW1vLXZhdWx0LnppcGAsIHVuZGVyIGEgc2luZ2xlIGA8cGx1Z2luLWlkPi1kZW1vLXZhdWx0LTx2ZXJzaW9uPi9gIGZvbGRlci5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBjcmVhdGVkIHppcCBhcmNoaXZlLCBvclxuICogYG51bGxgIGlmIHRoZSByZXBvIGhhcyBubyBgZGVtby12YXVsdC9gIGZvbGRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFyY2hpdmVQbHVnaW5EZW1vVmF1bHQoKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gIGNvbnN0IGRlbW9WYXVsdFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCB9KTtcbiAgaWYgKCFleGlzdHNTeW5jKGRlbW9WYXVsdFBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtYW5pZmVzdFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbiB9KTtcbiAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuXG4gIGNvbnN0IHBsdWdpbkZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5QbHVnaW5zLFxuICAgICAgbWFuaWZlc3QuaWRcbiAgICApXG4gIH0pO1xuICBhd2FpdCBta2RpcihwbHVnaW5Gb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGRpc3RCdWlsZFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCB9KTtcbiAgYXdhaXQgY3AoZGlzdEJ1aWxkUGF0aCwgcGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBhd2FpdCBpbmplY3REZW1vVmF1bHRIZWxwZXIobWFuaWZlc3QuaWQpO1xuXG4gIGNvbnN0IHppcFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7XG4gICAgcGF0aDogam9pbihPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQsIGdldERlbW9WYXVsdEFyY2hpdmVGaWxlTmFtZShtYW5pZmVzdC5pZCkpXG4gIH0pO1xuICBjb25zdCByb290Rm9sZGVyTmFtZSA9IGdldERlbW9WYXVsdEZvbGRlck5hbWUoe1xuICAgIHBsdWdpbklkOiBtYW5pZmVzdC5pZCxcbiAgICB2ZXJzaW9uOiBtYW5pZmVzdC52ZXJzaW9uXG4gIH0pO1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZERlbW9WYXVsdEVudHJpZXMoe1xuICAgIGRlbW9WYXVsdFBhdGgsXG4gICAgcm9vdEZvbGRlck5hbWVcbiAgfSk7XG4gIGluamVjdEFwcEpzb24oe1xuICAgIGFwcEpzb246IGF3YWl0IHJlYWRDb21taXR0ZWRBcHBKc29uKCksXG4gICAgZW50cmllcyxcbiAgICByb290Rm9sZGVyTmFtZVxuICB9KTtcbiAgaW5qZWN0UmVhZG1lVmVyc2lvbih7XG4gICAgZW50cmllcyxcbiAgICByb290Rm9sZGVyTmFtZSxcbiAgICB2ZXJzaW9uOiBtYW5pZmVzdC52ZXJzaW9uXG4gIH0pO1xuICAvLyBFdmVyeSBlbnRyeSBpcyBzdGFtcGVkIHdpdGggdGhlIG1vbWVudCB0aGUgYXJjaGl2ZSBpcyBidWlsdCByYXRoZXIgdGhhbiB0aGUgZmlsZSdzIG93biBtdGltZSwgd2hpY2ggaXNcbiAgLy8gd2hhdCB0aGUgcHJldmlvdXMgYXJjaGl2ZXIgd3JvdGUuIEEgZGVtbyB2YXVsdCdzIGNvbW1pdHRlZCB0aW1lc3RhbXBzIGFyZSBjaGVja291dCBhcnRpZmFjdHMgb2Ygd2hvZXZlclxuICAvLyByYW4gdGhlIHJlbGVhc2UsIHNvIHRoZXkgY2Fycnkgbm90aGluZyBhIHJlYWRlciBjb3VsZCB1c2U7IHRoZSBidWlsZCB0aW1lIGF0IGxlYXN0IGRlc2NyaWJlcyB0aGVcbiAgLy8gYXJjaGl2ZS5cbiAgYXdhaXQgd3JpdGVGaWxlKHppcFBhdGgsIHppcFN5bmMoT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpKSk7XG4gIHJldHVybiB6aXBQYXRoO1xufVxuXG4vLyBTdG9yZXMgdGhlIGFyY2hpdmVkIHZhdWx0J3MgYC5vYnNpZGlhbi9hcHAuanNvbmAg4oCUIHRoZSBjb21taXR0ZWQgc2V0dGluZ3Mgd2l0aCB0aGUgb3duZWQgb25lcyBtZXJnZWRcbi8vIG92ZXIgdGhlbS4gVGhlIEVOVFJZIGlzIHdyaXR0ZW4gcmF0aGVyIHRoYW4gdGhlIGZpbGUsIHNvIHRoZSByZXBvIGZvbGRlciBpcyBsZWZ0IGV4YWN0bHkgYXMgaXQgd2FzLCBhbmRcbi8vIEEgdmF1bHQgd2l0aCBub3RoaW5nIGVsc2UgdG8gY29uZmlndXJlIOKAlCB3aGljaCBjb21taXRzIG5vIGBhcHAuanNvbmAgYXQgYWxsIOKAlCBnZXRzIG9uZSBoZXJlIHJlZ2FyZGxlc3MuXG5mdW5jdGlvbiBpbmplY3RBcHBKc29uKHBhcmFtczogSW5qZWN0QXBwSnNvblBhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7XG4gICAgYXBwSnNvbixcbiAgICBlbnRyaWVzLFxuICAgIHJvb3RGb2xkZXJOYW1lXG4gIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgZW50cnlOYW1lID0gam9pbihyb290Rm9sZGVyTmFtZSwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkFwcEpzb24pO1xuICBlbnRyaWVzLnNldChlbnRyeU5hbWUsIEJ1ZmZlci5mcm9tKGJ1aWxkQXJjaGl2ZWREZW1vVmF1bHRBcHBKc29uQ29udGVudCh7IGFwcEpzb24gfSksICd1dGYtOCcpKTtcbn1cblxuLy8gSW5qZWN0cyB0aGUgYnVpbHQsIGBvYnNpZGlhbi1kZXYtdXRpbHNgLW93bmVkIGBkZW1vLXZhdWx0LWhlbHBlcmAgYm9vdHN0cmFwIHBsdWdpbiAoc2hpcHBlZCBpbiB0aGlzIHBhY2thZ2UpIGludG8gdGhlIGRlbW8gdmF1bHQsIHNvIG5vIHBlci12YXVsdCBjb3B5IGlzIGNvbW1pdHRlZCBhbmQgYW4gYG9ic2lkaWFuLWRldi11dGlsc2AgYnVtcCBwcm9wYWdhdGVzIGZpeGVzLlxuLy9cbi8vIEFsb25nc2lkZSB0aGUgYmluYXJpZXMgaXQgd3JpdGVzIHRoZSBoZWxwZXIncyBvd24gYGRhdGEuanNvbmAgbmFtaW5nIHRoZSBkZW1vbnN0cmF0ZWQgcGx1Z2luLiBUaGF0IGlzXG4vLyB0aGUgb25lIG1vbWVudCB0aGUgaWQgaXMga25vd24gZm9yIGNlcnRhaW4g4oCUIGl0IGNvbWVzIGZyb20gdGhlIHBsdWdpbidzIG93biBtYW5pZmVzdCDigJQgd2hlcmVhcyB0aGVcbi8vIG9wZW5lZCB2YXVsdCBvbmx5IG9mZmVycyBwbHVnaW4gZm9sZGVycyB0byBjb3VudCwgd2hpY2ggdGhlIGJvb3RzdHJhcCBpdHNlbGYgYWRkcyB0byAoc2VlXG4vLyBgRGVtb1ZhdWx0SGVscGVyU2V0dGluZ3NgKS5cbmFzeW5jIGZ1bmN0aW9uIGluamVjdERlbW9WYXVsdEhlbHBlcihkZW1vZWRQbHVnaW5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VGb2xkZXIgPSBnZXRSb290Rm9sZGVyKGdldEZvbGRlck5hbWUoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIGlmICghcGFja2FnZUZvbGRlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHJlc29sdmUgdGhlIEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdCBwYWNrYWdlIGZvbGRlciB0byBpbmplY3QgdGhlIGRlbW8tdmF1bHQtaGVscGVyIHBsdWdpbi4nKTtcbiAgfVxuXG4gIGNvbnN0IGhlbHBlclNvdXJjZVBhdGggPSBqb2luKHBhY2thZ2VGb2xkZXIsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3REZW1vVmF1bHRIZWxwZXIpO1xuICBjb25zdCBoZWxwZXJGb2xkZXIgPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7XG4gICAgcGF0aDogam9pbihcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCxcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRvdE9ic2lkaWFuLFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuUGx1Z2lucyxcbiAgICAgIERFTU9fVkFVTFRfSEVMUEVSX1BMVUdJTl9JRFxuICAgIClcbiAgfSk7XG4gIGF3YWl0IG1rZGlyKGhlbHBlckZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGNwKGhlbHBlclNvdXJjZVBhdGgsIGhlbHBlckZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3Qgc2V0dGluZ3M6IERlbW9WYXVsdEhlbHBlclNldHRpbmdzID0geyBkZW1vZWRQbHVnaW5JZCB9O1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbihoZWxwZXJGb2xkZXIsIERBVEFfSlNPTl9GSUxFX05BTUUpLCBgJHtKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgbnVsbCwgREFUQV9KU09OX0lOREVOVCl9XFxuYCwgJ3V0Zi04Jyk7XG59XG5cbi8vIE5hbWVzIHRoZSB2ZXJzaW9uIG9uIHRoZSBhcmNoaXZlZCBgUkVBRE1FLm1kYCdzIGhlYWRpbmcsIHNvIHRoZSB2YXVsdCBzYXlzIHdoaWNoIHJlbGVhc2UgaXQgZGVtb25zdHJhdGVzXG4vLyBob3dldmVyIGZhciBpdCB0cmF2ZWxzIGZyb20gdGhlIHJlbGVhc2UgcGFnZSBpdCB3YXMgZG93bmxvYWRlZCBmcm9tLlxuLy9cbi8vIEVudHJ5LW9ubHksIGZvciB0aGUgc2FtZSByZWFzb24gYGluamVjdEFwcEpzb25gIGlzOiB0aGUgY29tbWl0dGVkIFJFQURNRSBpcyBhIHRyYWNrZWQsIGhhbmQtYXV0aG9yZWRcbi8vIGZpbGUgYW5kIGB1cGRhdGVWZXJzaW9uYCBhcmNoaXZlcyBhZnRlciBpdCBoYXMgYWxyZWFkeSBwdXNoZWQuXG4vL1xuLy8gQSB2YXVsdCB0aGF0IHNoaXBzIG5vIFJFQURNRSwgb3Igb25lIG9wZW5pbmcgb24gc29tZXRoaW5nIG90aGVyIHRoYW4gYW4gYCMgSDFgLCBpcyBsZWZ0IGFsb25lIHJhdGhlclxuLy8gdGhhbiBjb3JyZWN0ZWQuIFRoZSBkZW1vLXZhdWx0IGNvdmVyYWdlIHN1aXRlIGV4ZW1wdHMgYFJFQURNRS5tZGAgZnJvbSBpdHMgSDEgY2hlY2ssIHNvIG5laXRoZXIgc2hhcGVcbi8vIGlzIGEgZGVmZWN0IOKAlCBhbmQgYSByZWxlYXNlIGlzIHRoZSB3cm9uZyBtb21lbnQgdG8gc3RhcnQgZmFpbGluZyBvbiBvbmUuXG5mdW5jdGlvbiBpbmplY3RSZWFkbWVWZXJzaW9uKHBhcmFtczogSW5qZWN0UmVhZG1lVmVyc2lvblBhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7XG4gICAgZW50cmllcyxcbiAgICByb290Rm9sZGVyTmFtZSxcbiAgICB2ZXJzaW9uXG4gIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgZW50cnlOYW1lID0gam9pbihyb290Rm9sZGVyTmFtZSwgUkVBRE1FX0ZJTEVfTkFNRSk7XG4gIGNvbnN0IGVudHJ5ID0gZW50cmllcy5nZXQoZW50cnlOYW1lKTtcbiAgaWYgKCFlbnRyeSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBlbnRyeS50b1N0cmluZygndXRmLTgnKTtcbiAgY29uc3QgdmVyc2lvbmVkQ29udGVudCA9IGNvbnRlbnQucmVwbGFjZShPUEVOSU5HX0hFQURJTkdfUkVHX0VYUCwgKGhlYWRpbmcpID0+IGAke2hlYWRpbmd9IHYke3ZlcnNpb259YCk7XG4gIGlmICh2ZXJzaW9uZWRDb250ZW50ID09PSBjb250ZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZW50cmllcy5zZXQoZW50cnlOYW1lLCBCdWZmZXIuZnJvbSh2ZXJzaW9uZWRDb250ZW50LCAndXRmLTgnKSk7XG59XG5cbi8vIFJlYWRzIHRoZSBkZW1vIHZhdWx0J3MgY29tbWl0dGVkIGAub2JzaWRpYW4vYXBwLmpzb25gLCByZWZ1c2luZyB0aGUgc2V0dGluZ3MgdGhpcyBwYWNrYWdlIG93bnMuXG4vL1xuLy8gVGhvc2Ugc2V0dGluZ3MgYXJlIGluamVjdGVkIGludG8gdGhlIGFyY2hpdmUsIHNvIGEgY29tbWl0dGVkIG9uZSBpcyBhIHNlY29uZCBzb3VyY2Ugb2YgdHJ1dGggdGhhdFxuLy8gbm90aGluZyBrZWVwcyBpbiBzdGVwLiBUaGUgZGVtby12YXVsdCBjb3ZlcmFnZSBzdWl0ZSBhbHJlYWR5IGZhaWxzIG9uIGl0LCB3aGljaCBtZWFucyByZWFjaGluZyBoZXJlXG4vLyBtZWFucyB0aGF0IGdhdGUgd2FzIHNraXBwZWQg4oCUIHNvIHRoaXMgcmVmdXNlcyByYXRoZXIgdGhhbiBvdmVyd3JpdGluZyBhIHZhbHVlIHNvbWVib2R5IGNob3NlIG9uIHB1cnBvc2UuXG5hc3luYyBmdW5jdGlvbiByZWFkQ29tbWl0dGVkQXBwSnNvbigpOiBQcm9taXNlPERlbW9WYXVsdEFwcEpzb24+IHtcbiAgY29uc3QgYXBwSnNvblBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7XG4gICAgcGF0aDogam9pbihPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRvdE9ic2lkaWFuLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5BcHBKc29uKVxuICB9KTtcbiAgY29uc3QgY29udGVudCA9IGV4aXN0c1N5bmMoYXBwSnNvblBhdGgpID8gYXdhaXQgcmVhZEZpbGUoYXBwSnNvblBhdGgsICd1dGYtOCcpIDogbnVsbDtcbiAgY29uc3QgYXBwSnNvbiA9IHBhcnNlRGVtb1ZhdWx0QXBwSnNvbih7IGNvbnRlbnQsIHBhdGg6IGFwcEpzb25QYXRoIH0pO1xuXG4gIGNvbnN0IG93bmVkU2V0dGluZ3MgPSBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MoeyBhcHBKc29uIH0pO1xuICBpZiAob3duZWRTZXR0aW5ncy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7YXBwSnNvblBhdGh9IHNldHMgJHtvd25lZFNldHRpbmdzLmpvaW4oJywgJyl9LCB3aGljaCBvYnNpZGlhbi1kZXYtdXRpbHMgb3ducyBhbmQgd3JpdGVzIGludG8gdGhlIGFyY2hpdmVkIGRlbW8gdmF1bHQuIFNldHRpbmdzIGl0IG93bnMgbXVzdCBub3QgYmUgY29tbWl0dGVkLmBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGFwcEpzb247XG59XG5cbi8vIFJlYWRzIGV2ZXJ5IGZpbGUgaW4gdGhlIGRlbW8gdmF1bHQgYXMgYW4gYXJjaGl2ZSBlbnRyeSwgdW5kZXIgdGhlIHNpbmdsZSB0b3AtbGV2ZWwgZm9sZGVyIHRoZSBhcmNoaXZlXG4vLyBzaXRzIGluLlxuLy9cbi8vIE9ubHkgRklMRVMgYmVjb21lIGVudHJpZXMuIEdpdCBjYW5ub3QgdHJhY2sgYW4gZW1wdHkgZm9sZGVyLCBzbyBhIGNvbW1pdHRlZCBkZW1vIHZhdWx0IGhhcyBub25lIOKAlCBhbmRcbi8vIGBleHRyYWN0WmlwQXJjaGl2ZWAgY3JlYXRlcyBhbiBlbnRyeSdzIHBhcmVudCBmb2xkZXJzIHdoZXRoZXIgb3Igbm90IHRoZSBhcmNoaXZlIGRlY2xhcmVkIHRoZW0sIHNvIGFcbi8vIGZvbGRlciBlbnRyeSB3b3VsZCBlYXJuIG5vdGhpbmcgZXZlbiBpZiBvbmUgY291bGQgZXhpc3QuXG5hc3luYyBmdW5jdGlvbiByZWFkRGVtb1ZhdWx0RW50cmllcyhwYXJhbXM6IFJlYWREZW1vVmF1bHRFbnRyaWVzUGFyYW1zKTogUHJvbWlzZTxEZW1vVmF1bHRaaXBFbnRyaWVzPiB7XG4gIGNvbnN0IHtcbiAgICBkZW1vVmF1bHRQYXRoLFxuICAgIHJvb3RGb2xkZXJOYW1lXG4gIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgZW50cmllczogRGVtb1ZhdWx0WmlwRW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBCdWZmZXI+KCk7XG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IHJlYWRkaXJQb3NpeChkZW1vVmF1bHRQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZGlyZW50LmlzRmlsZSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gam9pbihkaXJlbnQucGFyZW50UGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgIGVudHJpZXMuc2V0KGpvaW4ocm9vdEZvbGRlck5hbWUsIHJlbGF0aXZlKGRlbW9WYXVsdFBhdGgsIHBhdGgpKSwgYXdhaXQgcmVhZEZpbGUocGF0aCkpO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXM7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtDQSwrQkFHTztBQUNQLGdCQUE2QjtBQUM3QixrQkFHTztBQUNQLGtCQUlPO0FBQ1Asb0JBQXdCO0FBQ3hCLHFCQUEyQjtBQUMzQixzQkFLTztBQUlQLGlDQUlPO0FBQ1Asd0NBQXdDO0FBaEV4QyxJQUFJLG9CQUFvQixXQUFXLGlCQUFpQixNQUFNLFNBQVMsc0JBQXNCO0FBQ3ZGLE1BQUksT0FBTyxlQUFlLFVBQVU7QUFDbEMsVUFBTSxlQUFlO0FBQ3JCLFVBQU0sTUFBTSxhQUFhLFVBQVU7QUFDbkMsUUFBSSxPQUFPLElBQUksa0JBQWtCLFlBQVk7QUFDM0MsYUFBTyxJQUFJLGNBQWMsVUFBVSxFQUFFO0FBQUEsSUFDdkM7QUFBQSxFQUNGO0FBQ0EsU0FBTyxXQUFXLFVBQVUsUUFBUTtBQUN0QyxHQUFHO0FBeURILE1BQU0sOEJBQThCO0FBQ3BDLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0s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
@@ -2,80 +2,6 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
- (function patchObsidianRequire() {
6
- const originalRequire = require;
7
- if (!originalRequire || originalRequire.__isPatched) {
8
- return;
9
- }
10
-
11
- require = Object.assign(
12
- (id) => requirePatched(id),
13
- originalRequire,
14
- {
15
- __isPatched: true
16
- }
17
- );
18
-
19
- function extractDefault(module) {
20
- return module && module.__esModule && 'default' in module ? module.default : module;
21
- }
22
-
23
- const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
24
- '@codemirror/autocomplete',
25
- '@codemirror/collab',
26
- '@codemirror/commands',
27
- '@codemirror/language',
28
- '@codemirror/lint',
29
- '@codemirror/search',
30
- '@codemirror/state',
31
- '@codemirror/text',
32
- '@codemirror/view',
33
- '@lezer/common',
34
- '@lezer/highlight',
35
- '@lezer/lr',
36
- 'obsidian']
37
- );
38
-
39
- const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
40
- '@codemirror/closebrackets',
41
- '@codemirror/comment',
42
- '@codemirror/fold',
43
- '@codemirror/gutter',
44
- '@codemirror/highlight',
45
- '@codemirror/history',
46
- '@codemirror/matchbrackets',
47
- '@codemirror/panel',
48
- '@codemirror/rangeset',
49
- '@codemirror/rectangular-selection',
50
- '@codemirror/stream-parser',
51
- '@codemirror/tooltip']
52
- );
53
-
54
- function requirePatched(id) {
55
- if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
56
- return originalRequire?.(id);
57
- }
58
-
59
- // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
60
- if (globalThis.app.isMobile) {
61
- if (id === 'process' || id === 'node:process') {
62
- // eslint-disable-next-line no-console -- Valid usage.
63
- console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
64
-
65
- return process;
66
- }
67
- } else {
68
- const module = originalRequire?.(id);
69
- if (module) {
70
- return extractDefault(module);
71
- }
72
- }
73
-
74
- // eslint-disable-next-line no-console -- Valid usage.
75
- console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
76
- return {};
77
- }
78
- })();
79
5
 
80
6
  "use strict";
81
7
  var __create = Object.create;
@@ -115,4 +41,4 @@ var obsidian_external_type_links = __toESM(((module) => module && module.__esMod
115
41
  0 && (module.exports = {
116
42
  "obsidian-external-type-links": null
117
43
  });
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdvYnNpZGlhbi1leHRlcm5hbC10eXBlLWxpbmtzJyBmcm9tICcuL29ic2lkaWFuLWV4dGVybmFsLXR5cGUtbGlua3MudHMnO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQSx3Q0FBQUE7QUFBQTtBQUFBO0FBRUEsSUFBQUEsK0JBQWdEOyIsIm5hbWVzIjpbIm9ic2lkaWFuLWV4dGVybmFsLXR5cGUtbGlua3MiXX0=
44
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdvYnNpZGlhbi1leHRlcm5hbC10eXBlLWxpbmtzJyBmcm9tICcuL29ic2lkaWFuLWV4dGVybmFsLXR5cGUtbGlua3MudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBLHdDQUFBQTtBQUFBO0FBQUE7QUFFQSxJQUFBQSwrQkFBZ0Q7IiwKICAibmFtZXMiOiBbIm9ic2lkaWFuLWV4dGVybmFsLXR5cGUtbGlua3MiXQp9Cg==
@@ -2,80 +2,6 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
- (function patchObsidianRequire() {
6
- const originalRequire = require;
7
- if (!originalRequire || originalRequire.__isPatched) {
8
- return;
9
- }
10
-
11
- require = Object.assign(
12
- (id) => requirePatched(id),
13
- originalRequire,
14
- {
15
- __isPatched: true
16
- }
17
- );
18
-
19
- function extractDefault(module) {
20
- return module && module.__esModule && 'default' in module ? module.default : module;
21
- }
22
-
23
- const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
24
- '@codemirror/autocomplete',
25
- '@codemirror/collab',
26
- '@codemirror/commands',
27
- '@codemirror/language',
28
- '@codemirror/lint',
29
- '@codemirror/search',
30
- '@codemirror/state',
31
- '@codemirror/text',
32
- '@codemirror/view',
33
- '@lezer/common',
34
- '@lezer/highlight',
35
- '@lezer/lr',
36
- 'obsidian']
37
- );
38
-
39
- const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
40
- '@codemirror/closebrackets',
41
- '@codemirror/comment',
42
- '@codemirror/fold',
43
- '@codemirror/gutter',
44
- '@codemirror/highlight',
45
- '@codemirror/history',
46
- '@codemirror/matchbrackets',
47
- '@codemirror/panel',
48
- '@codemirror/rangeset',
49
- '@codemirror/rectangular-selection',
50
- '@codemirror/stream-parser',
51
- '@codemirror/tooltip']
52
- );
53
-
54
- function requirePatched(id) {
55
- if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
56
- return originalRequire?.(id);
57
- }
58
-
59
- // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
60
- if (globalThis.app.isMobile) {
61
- if (id === 'process' || id === 'node:process') {
62
- // eslint-disable-next-line no-console -- Valid usage.
63
- console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
64
-
65
- return process;
66
- }
67
- } else {
68
- const module = originalRequire?.(id);
69
- if (module) {
70
- return extractDefault(module);
71
- }
72
- }
73
-
74
- // eslint-disable-next-line no-console -- Valid usage.
75
- console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
76
- return {};
77
- }
78
- })();
79
5
 
80
6
  "use strict";
81
7
  var __defProp = Object.defineProperty;
@@ -116,4 +42,4 @@ const OBSIDIAN_EXTERNAL_TYPE_LINKS = /* @__PURE__ */ new Map([
116
42
  0 && (module.exports = {
117
43
  OBSIDIAN_EXTERNAL_TYPE_LINKS
118
44
  });
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvb2JzaWRpYW4tZXh0ZXJuYWwtdHlwZS1saW5rcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIE9ic2lkaWFuIGxheWVyIG9mIGEgZG9jdW1lbnRhdGlvbiBzaXRlJ3MgZXh0ZXJuYWwgdHlwZSBsaW5rcywgZm9yIGBEb2NzU2l0ZUNvbmZpZy5leHRlcm5hbFR5cGVMaW5rc2Agb2ZcbiAqIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9kb2NzLXNpdGUvZG9jcy1zaXRlLWNvbmZpZ2AuXG4gKlxuICogVGhlIGdlbmVyaWMgYnVpbGRlcidzIG93biBtYXAgY292ZXJzIHRoZSBUeXBlU2NyaXB0IGFuZCBET00gbGlicmFyaWVzIG9ubHksIGxlYXZpbmcgYW4gZWNvc3lzdGVtJ3MgcmVmZXJlbmNlcyB0b1xuICogdGhlIGxheWVyIGRvY3VtZW50aW5nIGl0LCBhcyB0aGlzIHBhY2thZ2UncyBFU0xpbnQgY29uZmlnIGxheWVycyBvbiB0aGUgZ2VuZXJpYyBvbmUuIEFuIE9ic2lkaWFuIHBsdWdpbidzIEFQSSBuYW1lc1xuICogdGhlIENvZGVNaXJyb3IgYW5kIE1vbWVudCB0eXBlcyBPYnNpZGlhbiByZS1leHBvcnRzLCB3aGljaCBubyBkb2N1bWVudGVkIHBhY2thZ2UgZGVjbGFyZXMuXG4gKi9cblxuLy8gQ3NwZWxsOmRpc2FibGUgLS0gVVJMIGZyYWdtZW50cyBhcmUgbm90IHdvcmRzXG4vKipcbiAqIFRoZSBDb2RlTWlycm9yIGFuZCBNb21lbnQgdHlwZSBuYW1lcyBhbiBPYnNpZGlhbiBwYWNrYWdlJ3MgQVBJIG5hbWVzLCBtYXBwZWQgdG8gdGhlIHBhZ2UgdGhlaXIgcmVmZXJlbmNlcyBsaW5rIHRvLlxuICpcbiAqIFBhc3MgaXQgYXMgYSBzaXRlJ3MgYGV4dGVybmFsVHlwZUxpbmtzYCwgb3Igc3ByZWFkIGl0IGludG8gYSBsYXJnZXIgbWFwOlxuICpcbiAqIGBgYHRzXG4gKiBleHBvcnQgY29uc3QgRE9DU19TSVRFX0NPTkZJRzogRG9jc1NpdGVDb25maWcgPSB7XG4gKiAgIGV4dGVybmFsVHlwZUxpbmtzOiBPQlNJRElBTl9FWFRFUk5BTF9UWVBFX0xJTktTLFxuICogICByZXBvOiAnbXktcGFja2FnZScsXG4gKiAgIHRpdGxlOiAnTXkgUGFja2FnZSdcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IE9CU0lESUFOX0VYVEVSTkFMX1RZUEVfTElOS1M6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFtcbiAgWydDaGFuZ2VTcGVjJywgJ2h0dHBzOi8vY29kZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZVNwZWMnXSxcbiAgWydDaGFyQ2F0ZWdvcnknLCAnaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuQ2hhckNhdGVnb3J5J10sXG4gIFsnRGVjb3JhdGlvblNldCcsICdodHRwczovL2NvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb25TZXQnXSxcbiAgWydEaXJlY3Rpb24nLCAnaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5EaXJlY3Rpb24nXSxcbiAgWydET01FdmVudEhhbmRsZXJzJywgJ2h0dHBzOi8vY29kZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRE9NRXZlbnRIYW5kbGVycyddLFxuICBbJ0V4dGVuc2lvbicsICdodHRwczovL2NvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5FeHRlbnNpb24nXSxcbiAgWydGYWNldFJlYWRlcicsICdodHRwczovL2NvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5GYWNldFJlYWRlciddLFxuICBbJ01vbWVudCcsICdodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyMvcGFyc2luZy8nXSxcbiAgWydNb21lbnRJbnB1dCcsICdodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyMvcGFyc2luZy8nXSxcbiAgWydSYW5nZUN1cnNvcicsICdodHRwczovL2NvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZUN1cnNvciddXG5dKTtcbi8vIENzcGVsbDplbmFibGVcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF5Qk8sTUFBTSwrQkFBNEQsb0JBQUksSUFBb0I7QUFBQSxFQUMvRixDQUFDLGNBQWMsbURBQW1EO0FBQUEsRUFDbEUsQ0FBQyxnQkFBZ0IscURBQXFEO0FBQUEsRUFDdEUsQ0FBQyxpQkFBaUIscURBQXFEO0FBQUEsRUFDdkUsQ0FBQyxhQUFhLGlEQUFpRDtBQUFBLEVBQy9ELENBQUMsb0JBQW9CLHdEQUF3RDtBQUFBLEVBQzdFLENBQUMsYUFBYSxrREFBa0Q7QUFBQSxFQUNoRSxDQUFDLGVBQWUsb0RBQW9EO0FBQUEsRUFDcEUsQ0FBQyxVQUFVLHNDQUFzQztBQUFBLEVBQ2pELENBQUMsZUFBZSxzQ0FBc0M7QUFBQSxFQUN0RCxDQUFDLGVBQWUsb0RBQW9EO0FBQ3RFLENBQUM7IiwibmFtZXMiOltdfQ==
45
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9vYnNpZGlhbi1leHRlcm5hbC10eXBlLWxpbmtzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIE9ic2lkaWFuIGxheWVyIG9mIGEgZG9jdW1lbnRhdGlvbiBzaXRlJ3MgZXh0ZXJuYWwgdHlwZSBsaW5rcywgZm9yIGBEb2NzU2l0ZUNvbmZpZy5leHRlcm5hbFR5cGVMaW5rc2Agb2ZcbiAqIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9kb2NzLXNpdGUvZG9jcy1zaXRlLWNvbmZpZ2AuXG4gKlxuICogVGhlIGdlbmVyaWMgYnVpbGRlcidzIG93biBtYXAgY292ZXJzIHRoZSBUeXBlU2NyaXB0IGFuZCBET00gbGlicmFyaWVzIG9ubHksIGxlYXZpbmcgYW4gZWNvc3lzdGVtJ3MgcmVmZXJlbmNlcyB0b1xuICogdGhlIGxheWVyIGRvY3VtZW50aW5nIGl0LCBhcyB0aGlzIHBhY2thZ2UncyBFU0xpbnQgY29uZmlnIGxheWVycyBvbiB0aGUgZ2VuZXJpYyBvbmUuIEFuIE9ic2lkaWFuIHBsdWdpbidzIEFQSSBuYW1lc1xuICogdGhlIENvZGVNaXJyb3IgYW5kIE1vbWVudCB0eXBlcyBPYnNpZGlhbiByZS1leHBvcnRzLCB3aGljaCBubyBkb2N1bWVudGVkIHBhY2thZ2UgZGVjbGFyZXMuXG4gKi9cblxuLy8gQ3NwZWxsOmRpc2FibGUgLS0gVVJMIGZyYWdtZW50cyBhcmUgbm90IHdvcmRzXG4vKipcbiAqIFRoZSBDb2RlTWlycm9yIGFuZCBNb21lbnQgdHlwZSBuYW1lcyBhbiBPYnNpZGlhbiBwYWNrYWdlJ3MgQVBJIG5hbWVzLCBtYXBwZWQgdG8gdGhlIHBhZ2UgdGhlaXIgcmVmZXJlbmNlcyBsaW5rIHRvLlxuICpcbiAqIFBhc3MgaXQgYXMgYSBzaXRlJ3MgYGV4dGVybmFsVHlwZUxpbmtzYCwgb3Igc3ByZWFkIGl0IGludG8gYSBsYXJnZXIgbWFwOlxuICpcbiAqIGBgYHRzXG4gKiBleHBvcnQgY29uc3QgRE9DU19TSVRFX0NPTkZJRzogRG9jc1NpdGVDb25maWcgPSB7XG4gKiAgIGV4dGVybmFsVHlwZUxpbmtzOiBPQlNJRElBTl9FWFRFUk5BTF9UWVBFX0xJTktTLFxuICogICByZXBvOiAnbXktcGFja2FnZScsXG4gKiAgIHRpdGxlOiAnTXkgUGFja2FnZSdcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IE9CU0lESUFOX0VYVEVSTkFMX1RZUEVfTElOS1M6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFtcbiAgWydDaGFuZ2VTcGVjJywgJ2h0dHBzOi8vY29kZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZVNwZWMnXSxcbiAgWydDaGFyQ2F0ZWdvcnknLCAnaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuQ2hhckNhdGVnb3J5J10sXG4gIFsnRGVjb3JhdGlvblNldCcsICdodHRwczovL2NvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb25TZXQnXSxcbiAgWydEaXJlY3Rpb24nLCAnaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5EaXJlY3Rpb24nXSxcbiAgWydET01FdmVudEhhbmRsZXJzJywgJ2h0dHBzOi8vY29kZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRE9NRXZlbnRIYW5kbGVycyddLFxuICBbJ0V4dGVuc2lvbicsICdodHRwczovL2NvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5FeHRlbnNpb24nXSxcbiAgWydGYWNldFJlYWRlcicsICdodHRwczovL2NvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5GYWNldFJlYWRlciddLFxuICBbJ01vbWVudCcsICdodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyMvcGFyc2luZy8nXSxcbiAgWydNb21lbnRJbnB1dCcsICdodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyMvcGFyc2luZy8nXSxcbiAgWydSYW5nZUN1cnNvcicsICdodHRwczovL2NvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZUN1cnNvciddXG5dKTtcbi8vIENzcGVsbDplbmFibGVcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXlCTyxNQUFNLCtCQUE0RCxvQkFBSSxJQUFvQjtBQUFBLEVBQy9GLENBQUMsY0FBYyxtREFBbUQ7QUFBQSxFQUNsRSxDQUFDLGdCQUFnQixxREFBcUQ7QUFBQSxFQUN0RSxDQUFDLGlCQUFpQixxREFBcUQ7QUFBQSxFQUN2RSxDQUFDLGFBQWEsaURBQWlEO0FBQUEsRUFDL0QsQ0FBQyxvQkFBb0Isd0RBQXdEO0FBQUEsRUFDN0UsQ0FBQyxhQUFhLGtEQUFrRDtBQUFBLEVBQ2hFLENBQUMsZUFBZSxvREFBb0Q7QUFBQSxFQUNwRSxDQUFDLFVBQVUsc0NBQXNDO0FBQUEsRUFDakQsQ0FBQyxlQUFlLHNDQUFzQztBQUFBLEVBQ3RELENBQUMsZUFBZSxvREFBb0Q7QUFDdEUsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -29,80 +29,6 @@ function ensureBrowserProcess() {
29
29
 
30
30
  ensureBrowserProcess();
31
31
  })();
32
- (function patchObsidianRequire() {
33
- const originalRequire = require;
34
- if (!originalRequire || originalRequire.__isPatched) {
35
- return;
36
- }
37
-
38
- require = Object.assign(
39
- (id) => requirePatched(id),
40
- originalRequire,
41
- {
42
- __isPatched: true
43
- }
44
- );
45
-
46
- function extractDefault(module) {
47
- return module && module.__esModule && 'default' in module ? module.default : module;
48
- }
49
-
50
- const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
51
- '@codemirror/autocomplete',
52
- '@codemirror/collab',
53
- '@codemirror/commands',
54
- '@codemirror/language',
55
- '@codemirror/lint',
56
- '@codemirror/search',
57
- '@codemirror/state',
58
- '@codemirror/text',
59
- '@codemirror/view',
60
- '@lezer/common',
61
- '@lezer/highlight',
62
- '@lezer/lr',
63
- 'obsidian']
64
- );
65
-
66
- const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
67
- '@codemirror/closebrackets',
68
- '@codemirror/comment',
69
- '@codemirror/fold',
70
- '@codemirror/gutter',
71
- '@codemirror/highlight',
72
- '@codemirror/history',
73
- '@codemirror/matchbrackets',
74
- '@codemirror/panel',
75
- '@codemirror/rangeset',
76
- '@codemirror/rectangular-selection',
77
- '@codemirror/stream-parser',
78
- '@codemirror/tooltip']
79
- );
80
-
81
- function requirePatched(id) {
82
- if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
83
- return originalRequire?.(id);
84
- }
85
-
86
- // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
87
- if (globalThis.app.isMobile) {
88
- if (id === 'process' || id === 'node:process') {
89
- // eslint-disable-next-line no-console -- Valid usage.
90
- console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
91
-
92
- return process;
93
- }
94
- } else {
95
- const module = originalRequire?.(id);
96
- if (module) {
97
- return extractDefault(module);
98
- }
99
- }
100
-
101
- // eslint-disable-next-line no-console -- Valid usage.
102
- console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
103
- return {};
104
- }
105
- })();
106
32
 
107
33
  "use strict";
108
34
  var __defProp = Object.defineProperty;
@@ -138,4 +64,4 @@ async function format(options) {
138
64
  0 && (module.exports = {
139
65
  format
140
66
  });
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mb3JtYXR0ZXJzL2RwcmludC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogRm9ybWF0cyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCBkcHJpbnQ6IHRoZSBnZW5lcmljIHJ1bm5lciBmcm9tIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdGAsIGZhbGxpbmdcbiAqIGJhY2sgdG8gdGhpcyBwYWNrYWdlJ3MgYGRwcmludC5qc29uYCB0ZW1wbGF0ZSB3aGVuIHRoZSBwcm9qZWN0IGhhcyBub25lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRm9ybWF0T3B0aW9ucyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2Zvcm1hdHRlcnMvZHByaW50JztcblxuaW1wb3J0IHsgZm9ybWF0IGFzIGZvcm1hdEdlbmVyaWMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9mb3JtYXR0ZXJzL2RwcmludCc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZXBvLXBhdGhzJztcblxuaW1wb3J0IHsgZ2V0VGVtcGxhdGVGaWxlUGF0aCB9IGZyb20gJy4uL3RlbXBsYXRlcy50cyc7XG5cbi8qKlxuICogRm9ybWF0cyB0aGUgc291cmNlIGNvZGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEZvcm1hdE9wdGlvbnN9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZm9ybWF0KG9wdGlvbnM/OiBGb3JtYXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZvcm1hdEdlbmVyaWMoeyBkZWZhdWx0Q29uZmlnRmlsZVBhdGg6IGdldFRlbXBsYXRlRmlsZVBhdGgoUmVwb1BhdGhzLkRwcmludEpzb24pLCAuLi5vcHRpb25zIH0pO1xufVxuZXhwb3J0IHsgdHlwZSBGb3JtYXRPcHRpb25zIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXQvZm9ybWF0dGVycy9kcHJpbnQnO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBLG9CQUF3QztBQUN4Qyx3QkFBMEI7QUFFMUIsdUJBQW9DO0FBVXBDLElBQUFBLGlCQUFtQztBQUhuQyxlQUFzQixPQUFPLFNBQXdDO0FBQ25FLFlBQU0sY0FBQUMsUUFBYyxFQUFFLDJCQUF1QixzQ0FBb0IsNEJBQVUsVUFBVSxHQUFHLEdBQUcsUUFBUSxDQUFDO0FBQ3RHOyIsIm5hbWVzIjpbImltcG9ydF9kcHJpbnQiLCJmb3JtYXRHZW5lcmljIl19
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mb3JtYXR0ZXJzL2RwcmludC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogRm9ybWF0cyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCBkcHJpbnQ6IHRoZSBnZW5lcmljIHJ1bm5lciBmcm9tIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdGAsIGZhbGxpbmdcbiAqIGJhY2sgdG8gdGhpcyBwYWNrYWdlJ3MgYGRwcmludC5qc29uYCB0ZW1wbGF0ZSB3aGVuIHRoZSBwcm9qZWN0IGhhcyBub25lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRm9ybWF0T3B0aW9ucyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2Zvcm1hdHRlcnMvZHByaW50JztcblxuaW1wb3J0IHsgZm9ybWF0IGFzIGZvcm1hdEdlbmVyaWMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9mb3JtYXR0ZXJzL2RwcmludCc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZXBvLXBhdGhzJztcblxuaW1wb3J0IHsgZ2V0VGVtcGxhdGVGaWxlUGF0aCB9IGZyb20gJy4uL3RlbXBsYXRlcy50cyc7XG5cbi8qKlxuICogRm9ybWF0cyB0aGUgc291cmNlIGNvZGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEZvcm1hdE9wdGlvbnN9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZm9ybWF0KG9wdGlvbnM/OiBGb3JtYXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZvcm1hdEdlbmVyaWMoeyBkZWZhdWx0Q29uZmlnRmlsZVBhdGg6IGdldFRlbXBsYXRlRmlsZVBhdGgoUmVwb1BhdGhzLkRwcmludEpzb24pLCAuLi5vcHRpb25zIH0pO1xufVxuZXhwb3J0IHsgdHlwZSBGb3JtYXRPcHRpb25zIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXQvZm9ybWF0dGVycy9kcHJpbnQnO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQSxvQkFBd0M7QUFDeEMsd0JBQTBCO0FBRTFCLHVCQUFvQztBQVVwQyxJQUFBQSxpQkFBbUM7QUFIbkMsZUFBc0IsT0FBTyxTQUF3QztBQUNuRSxZQUFNLGNBQUFDLFFBQWMsRUFBRSwyQkFBdUIsc0NBQW9CLDRCQUFVLFVBQVUsR0FBRyxHQUFHLFFBQVEsQ0FBQztBQUN0RzsiLCJuYW1lcyI6WyJpbXBvcnRfZHByaW50IiwiZm9ybWF0R2VuZXJpYyJdfQ==