obsidian-dev-utils 101.4.0 → 101.5.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 (43) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/integration-test-plugin/main.js +105 -10
  3. package/dist/lib/cjs/__merged.cjs +7 -1
  4. package/dist/lib/cjs/__merged.d.cts +2 -2
  5. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  6. package/dist/lib/cjs/obsidian/html-element.cjs +14 -3
  7. package/dist/lib/cjs/obsidian/html-element.d.cts +46 -2
  8. package/dist/lib/cjs/obsidian/link.cjs +50 -8
  9. package/dist/lib/cjs/obsidian/link.d.cts +289 -1
  10. package/dist/lib/cjs/obsidian/modals/prompt.cjs +9 -2
  11. package/dist/lib/cjs/obsidian/modals/prompt.d.cts +12 -0
  12. package/dist/lib/cjs/obsidian/modals/select-item.cjs +13 -1
  13. package/dist/lib/cjs/obsidian/modals/select-item.d.cts +14 -0
  14. package/dist/lib/cjs/obsidian/obsidian-settings.cjs +28 -1
  15. package/dist/lib/cjs/obsidian/obsidian-settings.d.cts +30 -0
  16. package/dist/lib/cjs/script-utils/gate.cjs +195 -0
  17. package/dist/lib/cjs/script-utils/gate.d.cts +78 -0
  18. package/dist/lib/cjs/script-utils/index.cjs +4 -1
  19. package/dist/lib/cjs/script-utils/index.d.cts +1 -0
  20. package/dist/lib/cjs/script-utils/test-runners/vitest-config.cjs +12 -3
  21. package/dist/lib/cjs/script-utils/version.cjs +7 -15
  22. package/dist/lib/esm/__merged.d.mts +2 -2
  23. package/dist/lib/esm/__merged.mjs +11 -3
  24. package/dist/lib/esm/generated-during-build.mjs +1 -1
  25. package/dist/lib/esm/obsidian/html-element.d.mts +46 -2
  26. package/dist/lib/esm/obsidian/html-element.mjs +15 -2
  27. package/dist/lib/esm/obsidian/link.d.mts +289 -1
  28. package/dist/lib/esm/obsidian/link.mjs +54 -9
  29. package/dist/lib/esm/obsidian/modals/prompt.d.mts +12 -0
  30. package/dist/lib/esm/obsidian/modals/prompt.mjs +10 -3
  31. package/dist/lib/esm/obsidian/modals/select-item.d.mts +14 -0
  32. package/dist/lib/esm/obsidian/modals/select-item.mjs +13 -1
  33. package/dist/lib/esm/obsidian/obsidian-settings.d.mts +30 -0
  34. package/dist/lib/esm/obsidian/obsidian-settings.mjs +26 -1
  35. package/dist/lib/esm/script-utils/gate.d.mts +78 -0
  36. package/dist/lib/esm/script-utils/gate.mjs +93 -0
  37. package/dist/lib/esm/script-utils/index.d.mts +1 -0
  38. package/dist/lib/esm/script-utils/index.mjs +3 -1
  39. package/dist/lib/esm/script-utils/test-runners/vitest-config.mjs +12 -3
  40. package/dist/lib/esm/script-utils/version.mjs +7 -18
  41. package/dist/templates/scripts/gate/gate.ts +10 -0
  42. package/package.json +15 -13
  43. package/script-utils/gate/package.json +6 -0
@@ -5,6 +5,28 @@
5
5
  * This module provides utility functions for working with Obsidian settings.
6
6
  */
7
7
  import type { App } from 'obsidian' with { 'resolution-mode': 'import' };
8
+ /**
9
+ * A way an input decides whether it is spell-checked.
10
+ *
11
+ * The `spellcheck` attribute is the whole mechanism: Obsidian never calls Electron's
12
+ * `setSpellCheckerEnabled`, it only sets the attribute per element. So `AlwaysOn` really does spell-check
13
+ * with `Editor > Spellcheck` off, and what it invokes is Chromium's built-in checker.
14
+ */
15
+ export declare enum SpellcheckMode {
16
+ /**
17
+ * Always spell-check the input, whatever `Editor > Spellcheck` says.
18
+ */
19
+ AlwaysOn = "AlwaysOn",
20
+ /**
21
+ * Follow `Editor > Spellcheck`, the way Obsidian's own name-entry surfaces do — the inline note title,
22
+ * the file explorer's inline rename, the properties fields.
23
+ */
24
+ FollowObsidianSetting = "FollowObsidianSetting",
25
+ /**
26
+ * Never spell-check the input, whatever `Editor > Spellcheck` says.
27
+ */
28
+ Off = "Off"
29
+ }
8
30
  /**
9
31
  * A format of the new link.
10
32
  */
@@ -23,6 +45,14 @@ export declare function getNewLinkFormat(app: App): NewLinkFormat;
23
45
  * @returns Whether the spellcheck is enabled.
24
46
  */
25
47
  export declare function isSpellcheckEnabled(app: App): boolean;
48
+ /**
49
+ * Resolves a {@link SpellcheckMode} against the Obsidian settings.
50
+ *
51
+ * @param app - The Obsidian app instance.
52
+ * @param spellcheckMode - The mode to resolve.
53
+ * @returns Whether the input should be spell-checked.
54
+ */
55
+ export declare function isSpellcheckEnabledForMode(app: App, spellcheckMode: SpellcheckMode): boolean;
26
56
  /**
27
57
  * Retrieves whether to use wikilinks based on the Obsidian settings.
28
58
  *
@@ -0,0 +1,195 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureBrowserProcess() {
8
+ const browserProcess = {
9
+ browser: true,
10
+ cwd() {
11
+ return '/';
12
+ },
13
+ env: {},
14
+ platform: 'android'
15
+ };
16
+
17
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
18
+ const existingProcess = globalThis.process;
19
+
20
+ if (!existingProcess) {
21
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+
26
+ if (existingProcess.versions?.node) {
27
+ return;
28
+ }
29
+
30
+ const existingProcessRecord = existingProcess;
31
+
32
+ for (const [key, value] of Object.entries(browserProcess)) {
33
+ existingProcessRecord[key] ??= value;
34
+ }
35
+
36
+ existingProcessRecord['browser'] = true;
37
+ }
38
+
39
+ function keepName($unknown) {
40
+ return $unknown;
41
+ }
42
+
43
+ (function initCjs() {
44
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
45
+ const globalThisRecord = globalThis;
46
+ globalThisRecord['__name'] ??= keepName;
47
+ const originalRequire = require;
48
+ if (originalRequire && !originalRequire.__isPatched) {
49
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
50
+ require = Object.assign(
51
+ (id) => requirePatched(id),
52
+ originalRequire,
53
+ {
54
+ __isPatched: true
55
+ }
56
+ );
57
+ }
58
+
59
+ globalThisRecord['__extractDefault'] ??= extractDefault;
60
+
61
+ ensureBrowserProcess();
62
+
63
+ function extractDefault(module) {
64
+ return module && module.__esModule && 'default' in module ? module.default : module;
65
+ }
66
+
67
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
68
+ '@codemirror/autocomplete',
69
+ '@codemirror/collab',
70
+ '@codemirror/commands',
71
+ '@codemirror/language',
72
+ '@codemirror/lint',
73
+ '@codemirror/search',
74
+ '@codemirror/state',
75
+ '@codemirror/text',
76
+ '@codemirror/view',
77
+ '@lezer/common',
78
+ '@lezer/highlight',
79
+ '@lezer/lr',
80
+ 'obsidian']
81
+ );
82
+
83
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
84
+ '@codemirror/closebrackets',
85
+ '@codemirror/comment',
86
+ '@codemirror/fold',
87
+ '@codemirror/gutter',
88
+ '@codemirror/highlight',
89
+ '@codemirror/history',
90
+ '@codemirror/matchbrackets',
91
+ '@codemirror/panel',
92
+ '@codemirror/rangeset',
93
+ '@codemirror/rectangular-selection',
94
+ '@codemirror/stream-parser',
95
+ '@codemirror/tooltip']
96
+ );
97
+
98
+ function requirePatched(id) {
99
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
100
+ return originalRequire?.(id);
101
+ }
102
+
103
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
104
+ if (globalThis.app.isMobile) {
105
+ if (id === 'process' || id === 'node:process') {
106
+ // eslint-disable-next-line no-console -- Valid usage.
107
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
108
+
109
+ return process;
110
+ }
111
+ } else {
112
+ const module = originalRequire?.(id);
113
+ if (module) {
114
+ return extractDefault(module);
115
+ }
116
+ }
117
+
118
+ // eslint-disable-next-line no-console -- Valid usage.
119
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
120
+ return {};
121
+ }
122
+ })();
123
+ })();
124
+
125
+ "use strict";
126
+ var __defProp = Object.defineProperty;
127
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
128
+ var __getOwnPropNames = Object.getOwnPropertyNames;
129
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
130
+ var __export = (target, all) => {
131
+ for (var name in all)
132
+ __defProp(target, name, { get: all[name], enumerable: true });
133
+ };
134
+ var __copyProps = (to, from, except, desc) => {
135
+ if (from && typeof from === "object" || typeof from === "function") {
136
+ for (let key of __getOwnPropNames(from))
137
+ if (!__hasOwnProp.call(to, key) && key !== except)
138
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
139
+ }
140
+ return to;
141
+ };
142
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
143
+ var gate_exports = {};
144
+ __export(gate_exports, {
145
+ gate: () => gate,
146
+ parseGateArguments: () => parseGateArguments
147
+ });
148
+ module.exports = __toCommonJS(gate_exports);
149
+ var import_node_util = require('node:util');
150
+ var import_npm_run = require('./npm-run.cjs');
151
+ async function gate(options = {}) {
152
+ const {
153
+ shouldBuild = true,
154
+ shouldRunChecks = true,
155
+ shouldRunIntegrationTests = false
156
+ } = options;
157
+ if (shouldRunChecks) {
158
+ await (0, import_npm_run.npmRun)("format:check");
159
+ await (0, import_npm_run.npmRun)("spellcheck");
160
+ await (0, import_npm_run.npmRun)("lint:md");
161
+ }
162
+ if (shouldBuild) {
163
+ await (0, import_npm_run.npmRun)("build");
164
+ }
165
+ if (shouldRunChecks) {
166
+ await (0, import_npm_run.npmRun)("lint");
167
+ await (0, import_npm_run.npmRunOptional)("find-overexposed");
168
+ if (await (0, import_npm_run.npmRunOptional)("test:coverage") === import_npm_run.NpmRunOptionalResult.Skipped) {
169
+ await (0, import_npm_run.npmRunOptional)("test");
170
+ }
171
+ if (shouldRunIntegrationTests) {
172
+ await (0, import_npm_run.npmRunOptional)("test:integration");
173
+ }
174
+ }
175
+ }
176
+ function parseGateArguments($arguments) {
177
+ const { values } = (0, import_node_util.parseArgs)({
178
+ // eslint-disable-next-line unicorn/name-replacements -- `args` is the option name Node's `parseArgs` reads.
179
+ args: $arguments,
180
+ options: {
181
+ "no-build": { type: "boolean" },
182
+ "no-checks": { type: "boolean" }
183
+ }
184
+ });
185
+ return {
186
+ shouldBuild: !(values["no-build"] ?? false),
187
+ shouldRunChecks: !(values["no-checks"] ?? false)
188
+ };
189
+ }
190
+ // Annotate the CommonJS export names for ESM import in node:
191
+ 0 && (module.exports = {
192
+ gate,
193
+ parseGateArguments
194
+ });
195
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9nYXRlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGJyYW5jaCBnYXRlOiB0aGUgdmVyaWZpY2F0aW9uIHNlcXVlbmNlIHRoYXQgYHVwZGF0ZVZlcnNpb25gIHJ1bnMgYXMgaXRzIHJlbGVhc2UgcHJlZmxpZ2h0LCBhdmFpbGFibGVcbiAqIGFzIGEgY29tbWFuZCBvZiBpdHMgb3duLlxuICpcbiAqIEZvdXIgb2YgdGhlIHByZWZsaWdodCdzIGNoZWNrcyBcdTIwMTQgYGZvcm1hdDpjaGVja2AsIGBzcGVsbGNoZWNrYCwgYGZpbmQtb3ZlcmV4cG9zZWRgIGFuZCBgdGVzdDpjb3ZlcmFnZWAgXHUyMDE0XG4gKiBhcmUgcmVhY2hhYmxlIGJ5IG5vIG90aGVyIHJvdXRpbmUgY29tbWFuZC4gU28gdGhlIG5hdHVyYWwgYnJhbmNoIGdhdGUgKGJ1aWxkLCBsaW50LCB0ZXN0KSBjYW4gYmUgZ3JlZW5cbiAqIHdoaWxlIHRoZSByZWxlYXNlIGlzIHN0aWxsIGdvaW5nIHRvIGZhaWwsIGFuZCB0aGUgZmFpbHVyZSBhcnJpdmVzIGF0IHJlbGVhc2UgdGltZSByYXRoZXIgdGhhbiBpbiBzZWNvbmRzXG4gKiBvbiB0aGUgYnJhbmNoLlxuICpcbiAqIFRoaXMgbW9kdWxlIGV4aXN0cyBzbyB0aGUgdHdvIGFyZSB0aGUgc2FtZSBjb2RlIHJhdGhlciB0aGFuIHR3byBsaXN0cyB0aGF0IGFncmVlIHRvZGF5OiBgdXBkYXRlVmVyc2lvbmBcbiAqIGNhbGxzIHtAbGluayBnYXRlfSwgYW5kIGEgY2hlY2sgYWRkZWQgaGVyZSBpcyByZWFjaGFibGUgZnJvbSBib3RoLiBXaGF0IHRoZSBnYXRlIGRlbGliZXJhdGVseSBsZWF2ZXMgdG9cbiAqIHRoZSByZWxlYXNlIHBhdGggaXMgdGhlIGNsZWFuLXJlcG8gYXNzZXJ0aW9uIFx1MjAxNCBhIGJyYW5jaCBnYXRlIGlzIHJ1biBvbiBhIGRpcnR5IHRyZWUsIHdoaWNoIGlzIHRoZSB3aG9sZVxuICogcG9pbnQgb2YgcnVubmluZyBpdCBiZWZvcmUgY29tbWl0dGluZyBcdTIwMTQgYW5kIHRoZSBpbnRlZ3JhdGlvbiBzdWl0ZSwgd2hpY2ggaGFzIHRvIHJ1biBpbiBzZXF1ZW5jZSBhY3Jvc3NcbiAqIHRoZSB3aG9sZSBmbGVldCBhbmQgc28gY2Fubm90IGJlIHBhcnQgb2YgYSBjb21tYW5kIHJ1biBjYXN1YWxseS5cbiAqXG4gKiBUaGUgdGVzdHMgcnVuIE9OQ0UsIHRocm91Z2ggYHRlc3Q6Y292ZXJhZ2VgIHdoZXJlIHRoZSBwcm9qZWN0IGRlZmluZXMgaXQgYW5kIHRocm91Z2ggYHRlc3RgIG90aGVyd2lzZS5cbiAqIFJ1bm5pbmcgYm90aCwgYXMgdGhpcyBkaWQgdW50aWwgMjAyNi0wOS0wNSwgd2FzIGEgZHVwbGljYXRlIGV2ZXJ5d2hlcmUgaXQgbWF0dGVyZWQ6IGEgcHJvamVjdCBzY29wZXMgaXRzXG4gKiB0d28gdGVzdCBzY3JpcHRzIHRvIHRoZSBzYW1lIHZpdGVzdCBwcm9qZWN0cyBcdTIwMTQgZXZlcnkgcmVwbyBpbiB0aGlzIHdvcmtzcGFjZSBwYXNzZXMgdGhlIHNhbWUgYHByb2plY3RzYFxuICogYXJyYXkgdG8gYm90aCBcdTIwMTQgc28gYHRlc3Q6Y292ZXJhZ2VgIGlzIGB0ZXN0YCBwbHVzIHRoZSB0aHJlc2hvbGQgZmxhZ3MsIG92ZXIgdGhlIGlkZW50aWNhbCBmaWxlcy4gSXQgYnV5c1xuICogbm8gZmFpbC1mYXN0IGVpdGhlciwgYmVjYXVzZSB0aGUgY292ZXJhZ2UgcnVuIGZhaWxzIG9uIGV4YWN0bHkgdGhlIGZhaWx1cmVzIHRoZSBwbGFpbiBydW4gd291bGQgaGF2ZVxuICogY2F1Z2h0LiBUaGUgb25lIHRoaW5nIGxvc3QgaXMgdGhlIGFiaWxpdHkgdG8gc3dpdGNoIG9mZiBvbmx5IHRoZSBjb3ZlcmFnZSBoYWxmOiBgVEVTVF9DT1ZFUkFHRT0wYCBub3dcbiAqIHR1cm5zIG9mZiB0aGUgZ2F0ZSdzIHdob2xlIHRlc3Qgc3RlcCByYXRoZXIgdGhhbiBkZW1vdGluZyBpdCB0byBgdGVzdGAuXG4gKi9cblxuaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSAnbm9kZTp1dGlsJztcblxuaW1wb3J0IHtcbiAgbnBtUnVuLFxuICBucG1SdW5PcHRpb25hbCxcbiAgTnBtUnVuT3B0aW9uYWxSZXN1bHRcbn0gZnJvbSAnLi9ucG0tcnVuLnRzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZ2F0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2F0ZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIGJ1aWxkLiBUaGUgYnVpbGQgaXMgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrIFx1MjAxNCBpdCBpcyBrZXB0IGluIHRoZSBnYXRlIGJlY2F1c2UgaXQgaXNcbiAgICogdGhlIG9ubHkgc3RlcCB0aGF0IHR5cGUtY2hlY2tzIHRoZSBwcm9qZWN0LCBhbmQgYSBncmVlbiBsaW50IGlzIG5vdCBhIHR5cGUtY2hlY2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQnVpbGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgdmVyaWZpY2F0aW9uIGNoZWNrcy4gV2hlbiBgZmFsc2VgLCBvbmx5IHRoZSBidWlsZCBydW5zLCB3aGljaCBpcyB3aGF0XG4gICAqIGBucG0gcnVuIHZlcnNpb24gLS0gLS1uby1jaGVja3NgIGRvZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUnVuQ2hlY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIGludGVncmF0aW9uIHRlc3Qgc3VpdGUuIE9mZiBieSBkZWZhdWx0OiBpbnRlZ3JhdGlvbiBydW5zIGhhdmUgdG8gYmUgc2VyaWFsaXplZFxuICAgKiBhY3Jvc3MgdGhlIHdob2xlIHNldCBvZiBzaWJsaW5nIHJlcG9zaXRvcmllcywgc28gYSBnYXRlIHRoYXQgYWx3YXlzIHJhbiB0aGVtIHdvdWxkIGNvbGxpZGUgd2l0aFxuICAgKiBhbm90aGVyIHNlc3Npb24ncyBydW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJ1bkludGVncmF0aW9uVGVzdHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHZlcmlmaWNhdGlvbiBzZXF1ZW5jZSB0aGF0IGBucG0gcnVuIHZlcnNpb25gIHJ1bnMgYXMgaXRzIHByZWZsaWdodC5cbiAqXG4gKiBUaGUgb3JkZXIgaXMgZGVsaWJlcmF0ZTogdGhlIGNoZWNrcyB0aGF0IGZpbmlzaCBpbiBzZWNvbmRzIChgZm9ybWF0OmNoZWNrYCwgYHNwZWxsY2hlY2tgLCBgbGludDptZGApIHJ1blxuICogZmlyc3QsIHNvIGEgdHlwbyBmYWlscyB0aGUgZ2F0ZSBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIGFmdGVyIHRoZSBjb3ZlcmFnZSBydW4uIEVhY2ggc3RlcCBpcyBkaXNwYXRjaGVkXG4gKiB0aHJvdWdoIHRoZSBwYWNrYWdlIG1hbmFnZXIsIHNvIGEgcHJvamVjdCBvdmVycmlkaW5nIG9uZSBvZiB0aGVzZSBzY3JpcHRzIGdldHMgaXRzIG93biB2ZXJzaW9uLCBhbmQgZWFjaFxuICogc3RlcCBjYXJyaWVzIGl0cyBvd24gZW52aXJvbm1lbnQgb2ZmIHN3aXRjaC5cbiAqXG4gKiBUaGUgc3RlcHMgdGhhdCBhcmUgcnVuIHdpdGgge0BsaW5rIG5wbVJ1bk9wdGlvbmFsfSBhcmUgc2tpcHBlZCB3aGVuIHRoZSBwcm9qZWN0IGRvZXMgbm90IGRlZmluZSB0aGVtOyB0aGVcbiAqIHJlc3QgYXJlIHJlcXVpcmVkLiBUaGUgdGVzdCBzdGVwIGlzIHRoZSBvbmUgcGxhY2UgdGhhdCByZWFkcyB0aGF0IHNraXA6IGB0ZXN0OmNvdmVyYWdlYCBpcyBwcmVmZXJyZWQsIGFuZFxuICogYHRlc3RgIHJ1bnMgb25seSBhcyBpdHMgZmFsbGJhY2ssIHNvIHRoZSBzdWl0ZSBpcyBuZXZlciBydW4gdHdpY2UuIFRoZSB1bml0IHRlc3RzIHN0YXkgYWhlYWQgb2ZcbiAqIGB0ZXN0OmludGVncmF0aW9uYCBmb3IgdGhlIHNhbWUgZmFzdGVzdC1maXJzdCByZWFzb24gXHUyMDE0IGEgYnJva2VuIHVuaXQgdGVzdCBzaG91bGQgZmFpbCBiZWZvcmUgYW5cbiAqIGludGVncmF0aW9uIHN1aXRlIGlzIHN0YXJ0ZWQsIG5vdCBhZnRlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgR2F0ZU9wdGlvbnN9IGNvbnRyb2xsaW5nIHdoaWNoIHN0ZXBzIHJ1bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBzdGVwIGhhcyBwYXNzZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnYXRlKG9wdGlvbnM6IEdhdGVPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIHNob3VsZEJ1aWxkID0gdHJ1ZSxcbiAgICBzaG91bGRSdW5DaGVja3MgPSB0cnVlLFxuICAgIHNob3VsZFJ1bkludGVncmF0aW9uVGVzdHMgPSBmYWxzZVxuICB9ID0gb3B0aW9ucztcblxuICBpZiAoc2hvdWxkUnVuQ2hlY2tzKSB7XG4gICAgYXdhaXQgbnBtUnVuKCdmb3JtYXQ6Y2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ3NwZWxsY2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ2xpbnQ6bWQnKTtcbiAgfVxuXG4gIGlmIChzaG91bGRCdWlsZCkge1xuICAgIGF3YWl0IG5wbVJ1bignYnVpbGQnKTtcbiAgfVxuXG4gIGlmIChzaG91bGRSdW5DaGVja3MpIHtcbiAgICBhd2FpdCBucG1SdW4oJ2xpbnQnKTtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbCgnZmluZC1vdmVyZXhwb3NlZCcpO1xuXG4gICAgaWYgKGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0OmNvdmVyYWdlJykgPT09IE5wbVJ1bk9wdGlvbmFsUmVzdWx0LlNraXBwZWQpIHtcbiAgICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJ1bkludGVncmF0aW9uVGVzdHMpIHtcbiAgICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0OmludGVncmF0aW9uJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciB0aGUgZ2F0ZSBzY3JpcHQuXG4gKlxuICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyB0byBwYXJzZS5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQge0BsaW5rIEdhdGVPcHRpb25zfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlR2F0ZUFyZ3VtZW50cygkYXJndW1lbnRzOiBzdHJpbmdbXSk6IEdhdGVPcHRpb25zIHtcbiAgY29uc3QgeyB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGFyZ3NgIGlzIHRoZSBvcHRpb24gbmFtZSBOb2RlJ3MgYHBhcnNlQXJnc2AgcmVhZHMuXG4gICAgYXJnczogJGFyZ3VtZW50cyxcbiAgICBvcHRpb25zOiB7XG4gICAgICAnbm8tYnVpbGQnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWNoZWNrcyc6IHsgdHlwZTogJ2Jvb2xlYW4nIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgc2hvdWxkQnVpbGQ6ICEodmFsdWVzWyduby1idWlsZCddID8/IGZhbHNlKSxcbiAgICBzaG91bGRSdW5DaGVja3M6ICEodmFsdWVzWyduby1jaGVja3MnXSA/PyBmYWxzZSlcbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEwQkEsdUJBQTBCO0FBRTFCLHFCQUlPO0FBaURQLGVBQXNCLEtBQUssVUFBdUIsQ0FBQyxHQUFrQjtBQUNuRSxRQUFNO0FBQUEsSUFDSixjQUFjO0FBQUEsSUFDZCxrQkFBa0I7QUFBQSxJQUNsQiw0QkFBNEI7QUFBQSxFQUM5QixJQUFJO0FBRUosTUFBSSxpQkFBaUI7QUFDbkIsY0FBTSx1QkFBTyxjQUFjO0FBQzNCLGNBQU0sdUJBQU8sWUFBWTtBQUN6QixjQUFNLHVCQUFPLFNBQVM7QUFBQSxFQUN4QjtBQUVBLE1BQUksYUFBYTtBQUNmLGNBQU0sdUJBQU8sT0FBTztBQUFBLEVBQ3RCO0FBRUEsTUFBSSxpQkFBaUI7QUFDbkIsY0FBTSx1QkFBTyxNQUFNO0FBQ25CLGNBQU0sK0JBQWUsa0JBQWtCO0FBRXZDLFFBQUksVUFBTSwrQkFBZSxlQUFlLE1BQU0sb0NBQXFCLFNBQVM7QUFDMUUsZ0JBQU0sK0JBQWUsTUFBTTtBQUFBLElBQzdCO0FBRUEsUUFBSSwyQkFBMkI7QUFDN0IsZ0JBQU0sK0JBQWUsa0JBQWtCO0FBQUEsSUFDekM7QUFBQSxFQUNGO0FBQ0Y7QUFRTyxTQUFTLG1CQUFtQixZQUFtQztBQUNwRSxRQUFNLEVBQUUsT0FBTyxRQUFJLDRCQUFVO0FBQUE7QUFBQSxJQUUzQixNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsTUFDUCxZQUFZLEVBQUUsTUFBTSxVQUFVO0FBQUEsTUFDOUIsYUFBYSxFQUFFLE1BQU0sVUFBVTtBQUFBLElBQ2pDO0FBQUEsRUFDRixDQUFDO0FBRUQsU0FBTztBQUFBLElBQ0wsYUFBYSxFQUFFLE9BQU8sVUFBVSxLQUFLO0FBQUEsSUFDckMsaUJBQWlCLEVBQUUsT0FBTyxXQUFXLEtBQUs7QUFBQSxFQUM1QztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,78 @@
1
+ /// <reference path="../library.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The branch gate: the verification sequence that `updateVersion` runs as its release preflight, available
6
+ * as a command of its own.
7
+ *
8
+ * Four of the preflight's checks — `format:check`, `spellcheck`, `find-overexposed` and `test:coverage` —
9
+ * are reachable by no other routine command. So the natural branch gate (build, lint, test) can be green
10
+ * while the release is still going to fail, and the failure arrives at release time rather than in seconds
11
+ * on the branch.
12
+ *
13
+ * This module exists so the two are the same code rather than two lists that agree today: `updateVersion`
14
+ * calls {@link gate}, and a check added here is reachable from both. What the gate deliberately leaves to
15
+ * the release path is the clean-repo assertion — a branch gate is run on a dirty tree, which is the whole
16
+ * point of running it before committing — and the integration suite, which has to run in sequence across
17
+ * the whole fleet and so cannot be part of a command run casually.
18
+ *
19
+ * The tests run ONCE, through `test:coverage` where the project defines it and through `test` otherwise.
20
+ * Running both, as this did until 2026-09-05, was a duplicate everywhere it mattered: a project scopes its
21
+ * two test scripts to the same vitest projects — every repo in this workspace passes the same `projects`
22
+ * array to both — so `test:coverage` is `test` plus the threshold flags, over the identical files. It buys
23
+ * no fail-fast either, because the coverage run fails on exactly the failures the plain run would have
24
+ * caught. The one thing lost is the ability to switch off only the coverage half: `TEST_COVERAGE=0` now
25
+ * turns off the gate's whole test step rather than demoting it to `test`.
26
+ */
27
+ /**
28
+ * Options for {@link gate}.
29
+ */
30
+ export interface GateOptions {
31
+ /**
32
+ * Whether to run the build. The build is not a verification check — it is kept in the gate because it is
33
+ * the only step that type-checks the project, and a green lint is not a type-check.
34
+ *
35
+ * @default `true`
36
+ */
37
+ readonly shouldBuild?: boolean;
38
+ /**
39
+ * Whether to run the verification checks. When `false`, only the build runs, which is what
40
+ * `npm run version -- --no-checks` does.
41
+ *
42
+ * @default `true`
43
+ */
44
+ readonly shouldRunChecks?: boolean;
45
+ /**
46
+ * Whether to run the integration test suite. Off by default: integration runs have to be serialized
47
+ * across the whole set of sibling repositories, so a gate that always ran them would collide with
48
+ * another session's run.
49
+ *
50
+ * @default `false`
51
+ */
52
+ readonly shouldRunIntegrationTests?: boolean;
53
+ }
54
+ /**
55
+ * Runs the verification sequence that `npm run version` runs as its preflight.
56
+ *
57
+ * The order is deliberate: the checks that finish in seconds (`format:check`, `spellcheck`, `lint:md`) run
58
+ * first, so a typo fails the gate immediately instead of after the coverage run. Each step is dispatched
59
+ * through the package manager, so a project overriding one of these scripts gets its own version, and each
60
+ * step carries its own environment off switch.
61
+ *
62
+ * The steps that are run with {@link npmRunOptional} are skipped when the project does not define them; the
63
+ * rest are required. The test step is the one place that reads that skip: `test:coverage` is preferred, and
64
+ * `test` runs only as its fallback, so the suite is never run twice. The unit tests stay ahead of
65
+ * `test:integration` for the same fastest-first reason — a broken unit test should fail before an
66
+ * integration suite is started, not after.
67
+ *
68
+ * @param options - The {@link GateOptions} controlling which steps run.
69
+ * @returns A {@link Promise} that resolves when every step has passed.
70
+ */
71
+ export declare function gate(options?: GateOptions): Promise<void>;
72
+ /**
73
+ * Parses the command-line arguments for the gate script.
74
+ *
75
+ * @param $arguments - The command-line arguments to parse.
76
+ * @returns The parsed {@link GateOptions}.
77
+ */
78
+ export declare function parseGateArguments($arguments: string[]): GateOptions;
@@ -166,6 +166,7 @@ __export(script_utils_exports, {
166
166
  exec: () => exec,
167
167
  formatters: () => formatters,
168
168
  fs: () => fs,
169
+ gate: () => gate,
169
170
  git: () => git,
170
171
  json: () => json,
171
172
  linters: () => linters,
@@ -196,6 +197,7 @@ var env_toggle = __toESM(__extractDefault(require('./env-toggle.cjs')), 1);
196
197
  var exec = __toESM(__extractDefault(require('./exec.cjs')), 1);
197
198
  var formatters = __toESM(__extractDefault(require('./formatters/index.cjs')), 1);
198
199
  var fs = __toESM(__extractDefault(require('./fs.cjs')), 1);
200
+ var gate = __toESM(__extractDefault(require('./gate.cjs')), 1);
199
201
  var git = __toESM(__extractDefault(require('./git.cjs')), 1);
200
202
  var json = __toESM(__extractDefault(require('./json.cjs')), 1);
201
203
  var linters = __toESM(__extractDefault(require('./linters/index.cjs')), 1);
@@ -226,6 +228,7 @@ var warnings_as_errors = __toESM(__extractDefault(require('./warnings-as-errors.
226
228
  exec,
227
229
  formatters,
228
230
  fs,
231
+ gate,
229
232
  git,
230
233
  json,
231
234
  linters,
@@ -241,4 +244,4 @@ var warnings_as_errors = __toESM(__extractDefault(require('./warnings-as-errors.
241
244
  version,
242
245
  "warnings-as-errors": null
243
246
  });
244
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdidWlsZCcgZnJvbSAnLi9idWlsZC50cyc7XG5leHBvcnQgKiBhcyAnYnVuZGxlcnMnIGZyb20gJy4vYnVuZGxlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2NoZWNrLXByb2plY3QtdHlwZXMnIGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5leHBvcnQgKiBhcyAnY2xpLXV0aWxzJyBmcm9tICcuL2NsaS11dGlscy50cyc7XG5leHBvcnQgKiBhcyAnY29kZS1nZW5lcmF0b3InIGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtY29uZmlnJyBmcm9tICcuL2NvbW1pdGxpbnQtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICdkZW1vLXZhdWx0LWFwcC1qc29uJyBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuZXhwb3J0ICogYXMgJ2RlbW8tdmF1bHQtYnV0dG9ucycgZnJvbSAnLi9kZW1vLXZhdWx0LWJ1dHRvbnMudHMnO1xuZXhwb3J0ICogYXMgJ2RlbW8tdmF1bHQtY292ZXJhZ2UnIGZyb20gJy4vZGVtby12YXVsdC1jb3ZlcmFnZS50cyc7XG5leHBvcnQgKiBhcyAnZGVtby12YXVsdCcgZnJvbSAnLi9kZW1vLXZhdWx0LnRzJztcbmV4cG9ydCAqIGFzICdlbnYtdG9nZ2xlJyBmcm9tICcuL2Vudi10b2dnbGUudHMnO1xuZXhwb3J0ICogYXMgJ2V4ZWMnIGZyb20gJy4vZXhlYy50cyc7XG5leHBvcnQgKiBhcyAnZm9ybWF0dGVycycgZnJvbSAnLi9mb3JtYXR0ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdmcycgZnJvbSAnLi9mcy50cyc7XG5leHBvcnQgKiBhcyAnZ2l0JyBmcm9tICcuL2dpdC50cyc7XG5leHBvcnQgKiBhcyAnanNvbicgZnJvbSAnLi9qc29uLnRzJztcbmV4cG9ydCAqIGFzICdsaW50ZXJzJyBmcm9tICcuL2xpbnRlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ25hbm8tc3RhZ2VkLWNvbmZpZycgZnJvbSAnLi9uYW5vLXN0YWdlZC1jb25maWcudHMnO1xuZXhwb3J0ICogYXMgJ25wbS1wdWJsaXNoJyBmcm9tICcuL25wbS1wdWJsaXNoLnRzJztcbmV4cG9ydCAqIGFzICducG0tcnVuJyBmcm9tICcuL25wbS1ydW4udHMnO1xuZXhwb3J0ICogYXMgJ25wbScgZnJvbSAnLi9ucG0udHMnO1xuZXhwb3J0ICogYXMgJ29ic2lkaWFuLWRldi11dGlscy1yZXBvLXBhdGhzJyBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1yZXBvLXBhdGhzLnRzJztcbmV4cG9ydCAqIGFzICdwYWNrYWdlLW1hbmFnZXInIGZyb20gJy4vcGFja2FnZS1tYW5hZ2VyLnRzJztcbmV4cG9ydCAqIGFzICdyb290JyBmcm9tICcuL3Jvb3QudHMnO1xuZXhwb3J0ICogYXMgJ3Rlc3QtcnVubmVycycgZnJvbSAnLi90ZXN0LXJ1bm5lcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlY2xhcmF0aW9ucycgZnJvbSAnLi92YWxpZGF0ZS1kZWNsYXJhdGlvbnMudHMnO1xuZXhwb3J0ICogYXMgJ3ZlcnNpb24nIGZyb20gJy4vdmVyc2lvbi50cyc7XG5leHBvcnQgKiBhcyAnd2FybmluZ3MtYXMtZXJyb3JzJyBmcm9tICcuL3dhcm5pbmdzLWFzLWVycm9ycy50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsK0JBQUFBO0FBQUEsRUFBQSxtQkFBQUM7QUFBQSxFQUFBLHdCQUFBQztBQUFBLEVBQUEsMkJBQUFDO0FBQUEsRUFBQSxvQkFBQUM7QUFBQSxFQUFBLDZCQUFBQztBQUFBLEVBQUEsNEJBQUFDO0FBQUEsRUFBQSw2QkFBQUM7QUFBQSxFQUFBLG9CQUFBQztBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsOEJBQUFDO0FBQUEsRUFBQTtBQUFBLHVCQUFBQztBQUFBLEVBQUEsaUJBQUFDO0FBQUEsRUFBQSx1Q0FBQUM7QUFBQSxFQUFBLHlCQUFBQztBQUFBLEVBQUE7QUFBQSx3QkFBQUM7QUFBQSxFQUFBLCtCQUFBQztBQUFBLEVBQUE7QUFBQSw4QkFBQUM7QUFBQTtBQUFBO0FBRUEsWUFBeUI7QUFDekIsZUFBNEI7QUFDNUIsSUFBQWhCLHNCQUF1QztBQUN2QyxJQUFBQyxZQUE2QjtBQUM3QixJQUFBQyxpQkFBa0M7QUFDbEMsSUFBQUMsb0JBQXFDO0FBQ3JDLElBQUFFLHNCQUF1QztBQUN2QyxJQUFBQyxxQkFBc0M7QUFDdEMsSUFBQUMsc0JBQXVDO0FBQ3ZDLElBQUFILGFBQThCO0FBQzlCLElBQUFJLGFBQThCO0FBQzlCLFdBQXdCO0FBQ3hCLGlCQUE4QjtBQUM5QixTQUFzQjtBQUN0QixVQUF1QjtBQUN2QixXQUF3QjtBQUN4QixjQUEyQjtBQUMzQixJQUFBQyxxQkFBc0M7QUFDdEMsSUFBQUMsY0FBK0I7QUFDL0IsSUFBQUMsVUFBMkI7QUFDM0IsVUFBdUI7QUFDdkIsSUFBQUMsZ0NBQWlEO0FBQ2pELElBQUFDLGtCQUFtQztBQUNuQyxXQUF3QjtBQUN4QixJQUFBQyxlQUFnQztBQUNoQyxJQUFBQyx3QkFBeUM7QUFDekMsY0FBMkI7QUFDM0IsSUFBQUMscUJBQXNDOyIsCiAgIm5hbWVzIjogWyJjaGVjay1wcm9qZWN0LXR5cGVzIiwgImNsaS11dGlscyIsICJjb2RlLWdlbmVyYXRvciIsICJjb21taXRsaW50LWNvbmZpZyIsICJkZW1vLXZhdWx0IiwgImRlbW8tdmF1bHQtYXBwLWpzb24iLCAiZGVtby12YXVsdC1idXR0b25zIiwgImRlbW8tdmF1bHQtY292ZXJhZ2UiLCAiZW52LXRvZ2dsZSIsICJuYW5vLXN0YWdlZC1jb25maWciLCAibnBtLXB1Ymxpc2giLCAibnBtLXJ1biIsICJvYnNpZGlhbi1kZXYtdXRpbHMtcmVwby1wYXRocyIsICJwYWNrYWdlLW1hbmFnZXIiLCAidGVzdC1ydW5uZXJzIiwgInZhbGlkYXRlLWRlY2xhcmF0aW9ucyIsICJ3YXJuaW5ncy1hcy1lcnJvcnMiXQp9Cg==
247
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdidWlsZCcgZnJvbSAnLi9idWlsZC50cyc7XG5leHBvcnQgKiBhcyAnYnVuZGxlcnMnIGZyb20gJy4vYnVuZGxlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2NoZWNrLXByb2plY3QtdHlwZXMnIGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5leHBvcnQgKiBhcyAnY2xpLXV0aWxzJyBmcm9tICcuL2NsaS11dGlscy50cyc7XG5leHBvcnQgKiBhcyAnY29kZS1nZW5lcmF0b3InIGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtY29uZmlnJyBmcm9tICcuL2NvbW1pdGxpbnQtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICdkZW1vLXZhdWx0LWFwcC1qc29uJyBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuZXhwb3J0ICogYXMgJ2RlbW8tdmF1bHQtYnV0dG9ucycgZnJvbSAnLi9kZW1vLXZhdWx0LWJ1dHRvbnMudHMnO1xuZXhwb3J0ICogYXMgJ2RlbW8tdmF1bHQtY292ZXJhZ2UnIGZyb20gJy4vZGVtby12YXVsdC1jb3ZlcmFnZS50cyc7XG5leHBvcnQgKiBhcyAnZGVtby12YXVsdCcgZnJvbSAnLi9kZW1vLXZhdWx0LnRzJztcbmV4cG9ydCAqIGFzICdlbnYtdG9nZ2xlJyBmcm9tICcuL2Vudi10b2dnbGUudHMnO1xuZXhwb3J0ICogYXMgJ2V4ZWMnIGZyb20gJy4vZXhlYy50cyc7XG5leHBvcnQgKiBhcyAnZm9ybWF0dGVycycgZnJvbSAnLi9mb3JtYXR0ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdmcycgZnJvbSAnLi9mcy50cyc7XG5leHBvcnQgKiBhcyAnZ2F0ZScgZnJvbSAnLi9nYXRlLnRzJztcbmV4cG9ydCAqIGFzICdnaXQnIGZyb20gJy4vZ2l0LnRzJztcbmV4cG9ydCAqIGFzICdqc29uJyBmcm9tICcuL2pzb24udHMnO1xuZXhwb3J0ICogYXMgJ2xpbnRlcnMnIGZyb20gJy4vbGludGVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAnbmFuby1zdGFnZWQtY29uZmlnJyBmcm9tICcuL25hbm8tc3RhZ2VkLWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnbnBtLXB1Ymxpc2gnIGZyb20gJy4vbnBtLXB1Ymxpc2gudHMnO1xuZXhwb3J0ICogYXMgJ25wbS1ydW4nIGZyb20gJy4vbnBtLXJ1bi50cyc7XG5leHBvcnQgKiBhcyAnbnBtJyBmcm9tICcuL25wbS50cyc7XG5leHBvcnQgKiBhcyAnb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMnIGZyb20gJy4vb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMudHMnO1xuZXhwb3J0ICogYXMgJ3BhY2thZ2UtbWFuYWdlcicgZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuZXhwb3J0ICogYXMgJ3Jvb3QnIGZyb20gJy4vcm9vdC50cyc7XG5leHBvcnQgKiBhcyAndGVzdC1ydW5uZXJzJyBmcm9tICcuL3Rlc3QtcnVubmVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAndmFsaWRhdGUtZGVjbGFyYXRpb25zJyBmcm9tICcuL3ZhbGlkYXRlLWRlY2xhcmF0aW9ucy50cyc7XG5leHBvcnQgKiBhcyAndmVyc2lvbicgZnJvbSAnLi92ZXJzaW9uLnRzJztcbmV4cG9ydCAqIGFzICd3YXJuaW5ncy1hcy1lcnJvcnMnIGZyb20gJy4vd2FybmluZ3MtYXMtZXJyb3JzLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSwrQkFBQUE7QUFBQSxFQUFBLG1CQUFBQztBQUFBLEVBQUEsd0JBQUFDO0FBQUEsRUFBQSwyQkFBQUM7QUFBQSxFQUFBLG9CQUFBQztBQUFBLEVBQUEsNkJBQUFDO0FBQUEsRUFBQSw0QkFBQUM7QUFBQSxFQUFBLDZCQUFBQztBQUFBLEVBQUEsb0JBQUFDO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDhCQUFBQztBQUFBLEVBQUE7QUFBQSx1QkFBQUM7QUFBQSxFQUFBLGlCQUFBQztBQUFBLEVBQUEsdUNBQUFDO0FBQUEsRUFBQSx5QkFBQUM7QUFBQSxFQUFBO0FBQUEsd0JBQUFDO0FBQUEsRUFBQSwrQkFBQUM7QUFBQSxFQUFBO0FBQUEsOEJBQUFDO0FBQUE7QUFBQTtBQUVBLFlBQXlCO0FBQ3pCLGVBQTRCO0FBQzVCLElBQUFoQixzQkFBdUM7QUFDdkMsSUFBQUMsWUFBNkI7QUFDN0IsSUFBQUMsaUJBQWtDO0FBQ2xDLElBQUFDLG9CQUFxQztBQUNyQyxJQUFBRSxzQkFBdUM7QUFDdkMsSUFBQUMscUJBQXNDO0FBQ3RDLElBQUFDLHNCQUF1QztBQUN2QyxJQUFBSCxhQUE4QjtBQUM5QixJQUFBSSxhQUE4QjtBQUM5QixXQUF3QjtBQUN4QixpQkFBOEI7QUFDOUIsU0FBc0I7QUFDdEIsV0FBd0I7QUFDeEIsVUFBdUI7QUFDdkIsV0FBd0I7QUFDeEIsY0FBMkI7QUFDM0IsSUFBQUMscUJBQXNDO0FBQ3RDLElBQUFDLGNBQStCO0FBQy9CLElBQUFDLFVBQTJCO0FBQzNCLFVBQXVCO0FBQ3ZCLElBQUFDLGdDQUFpRDtBQUNqRCxJQUFBQyxrQkFBbUM7QUFDbkMsV0FBd0I7QUFDeEIsSUFBQUMsZUFBZ0M7QUFDaEMsSUFBQUMsd0JBQXlDO0FBQ3pDLGNBQTJCO0FBQzNCLElBQUFDLHFCQUFzQzsiLAogICJuYW1lcyI6IFsiY2hlY2stcHJvamVjdC10eXBlcyIsICJjbGktdXRpbHMiLCAiY29kZS1nZW5lcmF0b3IiLCAiY29tbWl0bGludC1jb25maWciLCAiZGVtby12YXVsdCIsICJkZW1vLXZhdWx0LWFwcC1qc29uIiwgImRlbW8tdmF1bHQtYnV0dG9ucyIsICJkZW1vLXZhdWx0LWNvdmVyYWdlIiwgImVudi10b2dnbGUiLCAibmFuby1zdGFnZWQtY29uZmlnIiwgIm5wbS1wdWJsaXNoIiwgIm5wbS1ydW4iLCAib2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMiLCAicGFja2FnZS1tYW5hZ2VyIiwgInRlc3QtcnVubmVycyIsICJ2YWxpZGF0ZS1kZWNsYXJhdGlvbnMiLCAid2FybmluZ3MtYXMtZXJyb3JzIl0KfQo=
@@ -13,6 +13,7 @@ export * as 'env-toggle' from './env-toggle.cjs';
13
13
  export * as 'exec' from './exec.cjs';
14
14
  export * as 'formatters' from './formatters/index.cjs';
15
15
  export * as 'fs' from './fs.cjs';
16
+ export * as 'gate' from './gate.cjs';
16
17
  export * as 'git' from './git.cjs';
17
18
  export * as 'json' from './json.cjs';
18
19
  export * as 'linters' from './linters/index.cjs';
@@ -288,7 +288,6 @@ class ObsidianPluginVitestConfigContext {
288
288
  },
289
289
  setupFiles: [
290
290
  "obsidian-test-mocks/vitest-setup",
291
- "obsidian-test-mocks/obsidian-typings/vitest-setup",
292
291
  "obsidian-dev-utils/vitest-setup"
293
292
  ]
294
293
  };
@@ -324,7 +323,17 @@ function defineObsidianPluginVitestConfig(options = {}) {
324
323
  },
325
324
  exclude: [...SHARED_EXCLUDE],
326
325
  globals: false,
327
- include: [UNIT_TEST_FILES],
326
+ /*
327
+ * There is deliberately NO root-level `include` here, and restoring one breaks every project.
328
+ * Under vitest 4 a project's own `include` replaced the root one, so a root
329
+ * `include: [UNIT_TEST_FILES]` was merely redundant — the `unit-tests` project already declares
330
+ * that same glob for itself. Under vitest 5 the project glob no longer replaces it, and
331
+ * `src/**\/*.test.ts` is a superset of every project glob, so EVERY project collected EVERY test
332
+ * file: unit suites ran in the CDP integration environment and died on `Failed to resolve entry
333
+ * for package "obsidian"`, the screenshot-capture suites ran and rewrote checked-in PNGs, and the
334
+ * android / demo-vault suites ran under the desktop transport. Measured in a consumer: the desktop
335
+ * project collected 227 files instead of its own 105, and deleting this one line restored 105.
336
+ */
328
337
  passWithNoTests: true,
329
338
  projects: [
330
339
  {
@@ -349,4 +358,4 @@ function defineObsidianPluginVitestConfig(options = {}) {
349
358
  ObsidianPluginVitestConfigContext,
350
359
  defineObsidianPluginVitestConfig
351
360
  });
352
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy90ZXN0LXJ1bm5lcnMvdml0ZXN0LWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNoYXJlZCB2aXRlc3QgY29uZmlndXJhdGlvbiBmb3IgT2JzaWRpYW4gcGx1Z2lucy5cbiAqXG4gKiBFdmVyeSBwbHVnaW4gaW4gdGhlIHdvcmtzcGFjZSBkZWNsYXJlcyB0aGUgc2FtZSBmaXZlIHZpdGVzdCBwcm9qZWN0cyBcdTIwMTQgYHVuaXQtdGVzdHNgIHBsdXMgdGhlXG4gKiBgaW50ZWdyYXRpb24tdGVzdHM6e25vLWFwcCxkZXNrdG9wLGRlc2t0b3AtcGVyZm9ybWFuY2UsYW5kcm9pZH1gIGZhbWlseSBcdTIwMTQgd2l0aCB0aGUgc2FtZSB0aW1lb3V0cyxcbiAqIGBzZXR1cEZpbGVzYCwgYW5kIGBnbG9iYWxTZXR1cGAgd2lyaW5nLiBNYWludGFpbmluZyB0aGF0IHBlciByZXBvIG1lYW5zIGEgY29udmVudGlvbiBjaGFuZ2UgY29zdHMgb25lXG4gKiBuZWFyLWlkZW50aWNhbCBlZGl0IHBlciBwbHVnaW4sIGFuZCBhbnkgcmVwbyB0aGF0IGlzIG1pc3NlZCBkcmlmdHMgc2lsZW50bHkuIFRoaXMgbW9kdWxlIG93bnMgdGhhdFxuICogY29uZmlndXJhdGlvbiBvbmNlLCBzbyBhIHBsdWdpbidzIGBzY3JpcHRzL3ZpdGVzdC1jb25maWcudHNgIGNvbGxhcHNlcyB0byBhIHNpbmdsZSBjYWxsLlxuICpcbiAqIFRoZSBzZWFtIG1pcnJvcnMge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL29ic2lkaWFuLWRldi11dGlscyB8IHRoZSBFU0xpbnQgb25lfVxuICogKGBkZWZpbmVFc2xpbnRDb25maWdzYCk6IHRoZSBmYWN0b3J5IGJ1aWxkcyBhIGNvbnRleHQgaG9sZGluZyB0aGUgc3RhbmRhcmQgcHJvamVjdHMsIHRoZSBjYWxsZXIgZWRpdHNcbiAqIGl0IGluIHBsYWNlIHRocm91Z2gge0BsaW5rIERlZmluZU9ic2lkaWFuUGx1Z2luVml0ZXN0Q29uZmlnT3B0aW9ucy5lZGl0Q29udGV4dH0sIGFuZCBhcHBlbmRzIGFueVxuICogcHJvamVjdCB0aGUgYmFzZSBkb2VzIG5vdCBrbm93IGFib3V0IHRocm91Z2hcbiAqIHtAbGluayBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMuY3VzdG9tUHJvamVjdHN9LlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgVGVzdFByb2plY3RDb25maWd1cmF0aW9uLFxuICBUZXN0UHJvamVjdElubGluZUNvbmZpZ3VyYXRpb24sXG4gIFZpdGVVc2VyQ29uZmlnXG59IGZyb20gJ3ZpdGVzdC9jb25maWcnO1xuXG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZXN0L2NvbmZpZyc7XG5cbi8qKlxuICogVGhlIGB0ZXN0YCBzZWN0aW9uIG9mIGEgc2luZ2xlIHZpdGVzdCBwcm9qZWN0IGVudHJ5LlxuICovXG5leHBvcnQgdHlwZSBPYnNpZGlhblBsdWdpblZpdGVzdFByb2plY3RDb25maWcgPSBOb25OdWxsYWJsZTxUZXN0UHJvamVjdElubGluZUNvbmZpZ3VyYXRpb25bJ3Rlc3QnXT47XG5cbmNvbnN0IEFORFJPSURfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA2MF8wMDA7XG5jb25zdCBCSUdfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG5jb25zdCBIT09LX1RJTUVPVVRfTVVMVElQTElFUiA9IDQ7XG5jb25zdCBQRVJGT1JNQU5DRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMF8wMDA7XG5cbmNvbnN0IEFORFJPSURfVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5hbmRyb2lkLmludGVncmF0aW9uLnRlc3QudHMnO1xuY29uc3QgQ1JPU1NfUExBVEZPUk1fVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5jcm9zcy1wbGF0Zm9ybS5pbnRlZ3JhdGlvbi50ZXN0LnRzJztcbmNvbnN0IERFQ0xBUkFUSU9OX0ZJTEVTID0gJ3NyYy8qKi8qLmQudHMnO1xuY29uc3QgREVTS1RPUF9QRVJGT1JNQU5DRV9URVNUX0ZJTEVTID0gJ3NyYy8qKi8qLmRlc2t0b3AtcGVyZm9ybWFuY2UuaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBERVNLVE9QX1RFU1RfRklMRVMgPSAnc3JjLyoqLyouZGVza3RvcC5pbnRlZ3JhdGlvbi50ZXN0LnRzJztcbmNvbnN0IElOVEVHUkFUSU9OX1RFU1RfRklMRVMgPSAnc3JjLyoqLyouaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBOT19BUFBfVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5uby1hcHAuaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBVTklUX1RFU1RfRklMRVMgPSAnc3JjLyoqLyoudGVzdC50cyc7XG5cbmNvbnN0IE9CU0lESUFOX1ZFUlNJT05fRU5WX1ZBUklBQkxFX05BTUUgPSAnT0JTSURJQU5fVkVSU0lPTic7XG5jb25zdCBTSEFSRURfRVhDTFVERSA9IFsnbm9kZV9tb2R1bGVzJywgJ2Rpc3QnXTtcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyBmb3IgZGVmaW5pbmcgYSBwbHVnaW4ncyB2aXRlc3QgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMge1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGJ1aWxkcyBwcm9qZWN0cyB0aGUgYmFzZSBjb25maWd1cmF0aW9uIGRvZXMgbm90IGtub3cgYWJvdXQsIHN1Y2ggYXMgYSBwbHVnaW4ncyBvd25cbiAgICogYGludGVncmF0aW9uLXRlc3RzOmRlbW8tdmF1bHRgIHByb2plY3QuIFRoZSByZXR1cm5lZCBwcm9qZWN0cyBhcmUgYXBwZW5kZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIGZpdmUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHZpdGVzdCBjb25maWd1cmF0aW9uIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIFRoZSBleHRyYSBwcm9qZWN0cy5cbiAgICovXG4gIGN1c3RvbVByb2plY3RzPyhjb250ZXh0OiBPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ0NvbnRleHQpOiBUZXN0UHJvamVjdENvbmZpZ3VyYXRpb25bXTtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGVkaXRzIHRoZSB2aXRlc3QgY29uZmlndXJhdGlvbiBjb250ZXh0IGJlZm9yZSBpdCBpcyBhc3NlbWJsZWQgaW50byBhIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHZpdGVzdCBjb25maWd1cmF0aW9uIGNvbnRleHQuXG4gICAqL1xuICBlZGl0Q29udGV4dD8oY29udGV4dDogT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0KTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgY29udGV4dCBmb3IgZGVmaW5pbmcgYSBwbHVnaW4ncyB2aXRlc3QgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBFdmVyeSBtZW1iZXIgaXMgbGl2ZTogdGhlIGFycmF5cyBhbmQgb2JqZWN0cyBpdCBleHBvc2VzIGFyZSB0aGUgdmVyeSBvbmVzIHRoZSBhc3NlbWJsZWQgY29uZmlndXJhdGlvblxuICogaXMgYnVpbHQgZnJvbSwgc28gZWRpdGluZyB0aGVtIGluIHBsYWNlIHRocm91Z2hcbiAqIHtAbGluayBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMuZWRpdENvbnRleHR9IGlzIHdoYXQgY3VzdG9taXplcyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgY2xhc3MgT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBgaW50ZWdyYXRpb24tdGVzdHM6YW5kcm9pZGAgcHJvamVjdCwgcnVubmluZyB0aGUgbW9iaWxlLW9ubHkgYW5kIGNyb3NzLXBsYXRmb3JtIHN1aXRlcyBhZ2FpbnN0IGFuXG4gICAqIEFuZHJvaWQgZW11bGF0b3IgdGhyb3VnaCBBcHBpdW0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYW5kcm9pZDogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnbm9kZScsXG4gICAgZW52aXJvbm1lbnRPcHRpb25zOiB7XG4gICAgICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICAgICAgICBhcHBpdW1Vcmw6ICdodHRwOi8vbG9jYWxob3N0OjQ3MjMnLFxuICAgICAgICBhdmROYW1lOiAnb2JzaWRpYW5fdGVzdCcsXG4gICAgICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSdcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbGVQYXJhbGxlbGlzbTogZmFsc2UsXG4gICAgZ2xvYmFsU2V0dXA6IFsnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3QtZ2xvYmFsLXNldHVwLXBsdWdpbiddLFxuICAgIGhvb2tUaW1lb3V0OiBBTkRST0lEX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTICogSE9PS19USU1FT1VUX01VTFRJUExJRVIsXG4gICAgaW5jbHVkZTogW0FORFJPSURfVEVTVF9GSUxFUywgQ1JPU1NfUExBVEZPUk1fVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ2ludGVncmF0aW9uLXRlc3RzOmFuZHJvaWQnLFxuICAgIHNldHVwRmlsZXM6IFsnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3Qtc2V0dXAnXSxcbiAgICB0ZXN0VGltZW91dDogQU5EUk9JRF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyLXRlc3QgYnVkZ2V0IG9mIHRoZSBBbmRyb2lkIGludGVncmF0aW9uIHByb2plY3QsIGluIG1pbGxpc2Vjb25kcy4gQm9vdGluZyBhbiBlbXVsYXRvciBhbmRcbiAgICogZHJpdmluZyBpdCBvdmVyIEFwcGl1bSBpcyBzbG93ZXIgdGhhbiB0aGUgZGVza3RvcCBwYXRoLCBoZW5jZSBpdHMgb3duIGNvbnN0YW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYW5kcm9pZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IEFORFJPSURfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgLyoqXG4gICAqIFRoZSBwZXItdGVzdCBidWRnZXQgb2YgdGhlIHJlZ3VsYXIgaW50ZWdyYXRpb24gcHJvamVjdHMsIGluIG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDMwMDAwYFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJpZ1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IEJJR19USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICAvKipcbiAgICogVGhlIGNvdmVyYWdlIGBleGNsdWRlYCBnbG9icy4gUHVzaCBvbnRvIGl0IHRvIGRyb3AgbW9yZSBmaWxlcyBmcm9tIHRoZSBjb3ZlcmFnZSByZXBvcnQuXG4gICAqXG4gICAqIERlY2xhcmF0aW9uIGZpbGVzIGFyZSBleGNsdWRlZCBieSBkZWZhdWx0IGJlY2F1c2UgdGhlIGNvdmVyYWdlIGBpbmNsdWRlYCBiZWxvdyBpcyBgc3JjLyoqXFwvKi50c2AsXG4gICAqIHdoaWNoIGEgYC5kLnRzYCBtYXRjaGVzLiBBIGRlY2xhcmF0aW9uIGZpbGUgZW1pdHMgbm8gcnVudGltZSBjb2RlLCBzbyBpdCByZXBvcnRzIDAlIGFuZCBubyB0ZXN0IGNhblxuICAgKiBldmVyIHJhaXNlIGl0IFx1MjAxNCBhIHBsdWdpbiB0aGF0IGdyb3dzIG9uZSB1bmRlciBgc3JjL2Agc2lsZW50bHkgbG9zZXMgaXRzIDEwMCUgZ2F0ZSwgYW5kIHRoZSB1c3VhbFxuICAgKiByZW1lZHkgb2YgYW4gaW5saW5lIGB2OCBpZ25vcmVgIGNvbW1lbnQgZG9lcyBub3QgYXBwbHkgdG8gYSB0eXBlLW9ubHkgZmlsZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb3ZlcmFnZUV4Y2x1ZGU6IHN0cmluZ1tdID0gW1VOSVRfVEVTVF9GSUxFUywgREVDTEFSQVRJT05fRklMRVNdO1xuXG4gIC8qKlxuICAgKiBUaGUgYGludGVncmF0aW9uLXRlc3RzOmRlc2t0b3BgIHByb2plY3QsIHJ1bm5pbmcgdGhlIGRlc2t0b3Atb25seSBhbmQgY3Jvc3MtcGxhdGZvcm0gc3VpdGVzIGFnYWluc3QgYVxuICAgKiByZWFsIGRlc2t0b3AgT2JzaWRpYW4gb3ZlciBDRFAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVza3RvcDogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnbm9kZScsXG4gICAgZmlsZVBhcmFsbGVsaXNtOiBmYWxzZSxcbiAgICBnbG9iYWxTZXR1cDogWydvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1nbG9iYWwtc2V0dXAtcGx1Z2luJ10sXG4gICAgaG9va1RpbWVvdXQ6IEJJR19USU1FT1VUX0lOX01JTExJU0VDT05EUyAqIEhPT0tfVElNRU9VVF9NVUxUSVBMSUVSLFxuICAgIGluY2x1ZGU6IFtERVNLVE9QX1RFU1RfRklMRVMsIENST1NTX1BMQVRGT1JNX1RFU1RfRklMRVNdLFxuICAgIG5hbWU6ICdpbnRlZ3JhdGlvbi10ZXN0czpkZXNrdG9wJyxcbiAgICBzZXR1cEZpbGVzOiBbJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3Rpbmcvdml0ZXN0LXNldHVwJ10sXG4gICAgdGVzdFRpbWVvdXQ6IEJJR19USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgYGludGVncmF0aW9uLXRlc3RzOmRlc2t0b3AtcGVyZm9ybWFuY2VgIHByb2plY3QsIHJ1bm5pbmcgdGhlIGF0LXNjYWxlIHN1aXRlcy4gSXQgaXMgZGVjbGFyZWQgZm9yXG4gICAqIGV2ZXJ5IHBsdWdpbiBldmVuIHdoZW4gdGhlcmUgaXMgbm8gc3VjaCBzdWl0ZSB5ZXQgXHUyMDE0IGBwYXNzV2l0aE5vVGVzdHNgIG1ha2VzIGFuIGVtcHR5IHByb2plY3QgZnJlZSxcbiAgICogYW5kIHRoZSBtYXRjaGluZyBgdGVzdDppbnRlZ3JhdGlvbjpkZXNrdG9wOnBlcmZvcm1hbmNlYCBzY3JpcHQgZXhpc3RzIGZsZWV0LXdpZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVza3RvcFBlcmZvcm1hbmNlOiBPYnNpZGlhblBsdWdpblZpdGVzdFByb2plY3RDb25maWcgPSB7XG4gICAgZW52aXJvbm1lbnQ6ICdub2RlJyxcbiAgICBmaWxlUGFyYWxsZWxpc206IGZhbHNlLFxuICAgIGdsb2JhbFNldHVwOiBbJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3Rpbmcvdml0ZXN0LWdsb2JhbC1zZXR1cC1wbHVnaW4nXSxcbiAgICBob29rVGltZW91dDogUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgaW5jbHVkZTogW0RFU0tUT1BfUEVSRk9STUFOQ0VfVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ2ludGVncmF0aW9uLXRlc3RzOmRlc2t0b3AtcGVyZm9ybWFuY2UnLFxuICAgIHNldHVwRmlsZXM6IFsnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3Qtc2V0dXAnXSxcbiAgICB0ZXN0VGltZW91dDogUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgfTtcblxuICAvKipcbiAgICogVGhlIG11bHRpcGxpZXIgYXBwbGllZCB0byBhIHByb2plY3QncyB0ZXN0IGJ1ZGdldCB0byBnZXQgaXRzIGhvb2sgYnVkZ2V0LiBBIGhvb2sgdHlwaWNhbGx5IHBvcHVsYXRlc1xuICAgKiBhbmQgb3BlbnMgYSB2YXVsdCwgc28gaXQgbmVlZHMgc2V2ZXJhbCB0aW1lcyB3aGF0IGEgc2luZ2xlIHRlc3QgZG9lcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDRgXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaG9va1RpbWVvdXRNdWx0aXBsaWVyID0gSE9PS19USU1FT1VUX01VTFRJUExJRVI7XG5cbiAgLyoqXG4gICAqIFRoZSBgaW50ZWdyYXRpb24tdGVzdHM6bm8tYXBwYCBwcm9qZWN0LCBydW5uaW5nIHRoZSBzdWl0ZXMgdGhhdCBuZWVkIG5vIE9ic2lkaWFuIGluc3RhbmNlIGF0IGFsbC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBub0FwcDogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnbm9kZScsXG4gICAgZmlsZVBhcmFsbGVsaXNtOiBmYWxzZSxcbiAgICBob29rVGltZW91dDogQklHX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTICogSE9PS19USU1FT1VUX01VTFRJUExJRVIsXG4gICAgaW5jbHVkZTogW05PX0FQUF9URVNUX0ZJTEVTXSxcbiAgICBuYW1lOiAnaW50ZWdyYXRpb24tdGVzdHM6bm8tYXBwJyxcbiAgICB0ZXN0VGltZW91dDogQklHX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBwZXItdGVzdCBidWRnZXQgb2YgdGhlIHBlcmZvcm1hbmNlIGludGVncmF0aW9uIHByb2plY3QsIGluIG1pbGxpc2Vjb25kcy4gQSBwZXJmb3JtYW5jZSB2YXVsdCBpc1xuICAgKiBwcmUtcG9wdWxhdGVkIHdpdGggdGVucyBvZiB0aG91c2FuZHMgb2Ygbm90ZXMgYmVmb3JlIE9ic2lkaWFuIG9wZW5zLCBzbyBib3RoIGl0cyBzZXR1cCBhbmQgaXRzIHRlc3RzXG4gICAqIG5lZWQgZmFyIG1vcmUgdGltZSB0aGFuIHRoZSByZWd1bGFyIGludGVncmF0aW9uIHByb2plY3RzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDAwYFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcmZvcm1hbmNlVGltZW91dEluTWlsbGlzZWNvbmRzID0gUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgLyoqXG4gICAqIFRoZSBgdW5pdC10ZXN0c2AgcHJvamVjdCwgcnVubmluZyB0aGUgbW9ja2VkLU9ic2lkaWFuIHN1aXRlcyBpbiBganNkb21gLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXRUZXN0czogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnanNkb20nLFxuICAgIGV4Y2x1ZGU6IFsuLi5TSEFSRURfRVhDTFVERSwgSU5URUdSQVRJT05fVEVTVF9GSUxFU10sXG4gICAgZXhlY0FyZ3Y6IFsnLS1uby13ZWJzdG9yYWdlJ10sXG4gICAgaW5jbHVkZTogW1VOSVRfVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ3VuaXQtdGVzdHMnLFxuICAgIHNlcnZlcjoge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGRlcHNgIGlzIGRlY2xhcmVkIGJ5IGB2aXRlc3RgOyByZW5hbWluZyBpdCBoZXJlIHdvdWxkIG5vdCBtYXRjaCB0aGUgQVBJLlxuICAgICAgZGVwczoge1xuICAgICAgICBpbmxpbmU6IFsnQG9ic2lkaWFuLXR5cGluZ3MnLCAnb2JzaWRpYW4tZGV2LXV0aWxzJ11cbiAgICAgIH1cbiAgICB9LFxuICAgIHNldHVwRmlsZXM6IFtcbiAgICAgICdvYnNpZGlhbi10ZXN0LW1vY2tzL3ZpdGVzdC1zZXR1cCcsXG4gICAgICAnb2JzaWRpYW4tdGVzdC1tb2Nrcy9vYnNpZGlhbi10eXBpbmdzL3ZpdGVzdC1zZXR1cCcsXG4gICAgICAnb2JzaWRpYW4tZGV2LXV0aWxzL3ZpdGVzdC1zZXR1cCdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCBzZWVkZWQgd2l0aCB0aGUgc3RhbmRhcmQgcHJvamVjdHMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3Qgb2JzaWRpYW5WZXJzaW9uID0gcHJvY2Vzcy5lbnZbT0JTSURJQU5fVkVSU0lPTl9FTlZfVkFSSUFCTEVfTkFNRV07XG5cbiAgICAvKlxuICAgICAqIFN1cHBvcnQgaXMgdGhlIHJhbmdlIFtsYXRlc3QgcHVibGljLCBsYXRlc3QgY2F0YWx5c3RdIGFuZCBCT1RIIGVuZHMgbXVzdCB3b3JrIChHOTkpLCBzbyB0aGUgdmVyc2lvblxuICAgICAqIGlzIGEga25vYiByYXRoZXIgdGhhbiBhIGNvbnN0YW50LiBUaGUga2V5IGlzIGFkZGVkIE9OTFkgd2hlbiB0aGUgdmFyaWFibGUgaXMgc2V0OiBhbiBleHBsaWNpdFxuICAgICAqIGBvYnNpZGlhblZlcnNpb25gIG1ha2VzIHRoZSBoYXJuZXNzIHJlc29sdmUgYSBjb25jcmV0ZSB2ZXJzaW9uIGFuZCBzd2FwIHRoZSBhc2FyLCB3aGljaCBpcyBub3Qgd2hhdFxuICAgICAqIGFuIHVucGlubmVkIHJ1biBkb2VzLCBzbyBzZWVkaW5nIGEgZGVmYXVsdCBoZXJlIHdvdWxkIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgZXZlcnkgcGx1Z2luLlxuICAgICAqL1xuICAgIGlmIChvYnNpZGlhblZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kZXNrdG9wLmVudmlyb25tZW50T3B0aW9ucyA9IHtcbiAgICAgICAgb2JzaWRpYW5UcmFuc3BvcnQ6IHtcbiAgICAgICAgICBvYnNpZGlhblZlcnNpb24sXG4gICAgICAgICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSB2aXRlc3QgY29uZmlndXJhdGlvbiBmb3IgYW4gT2JzaWRpYW4gcGx1Z2luLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGRlZmluaW5nIHRoZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMgVGhlIHZpdGVzdCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWcob3B0aW9uczogRGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdPcHRpb25zID0ge30pOiBWaXRlVXNlckNvbmZpZyB7XG4gIGNvbnN0IGNvbnRleHQgPSBuZXcgT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0KCk7XG5cbiAgaWYgKG9wdGlvbnMuZWRpdENvbnRleHQpIHtcbiAgICBvcHRpb25zLmVkaXRDb250ZXh0KGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgY3VzdG9tUHJvamVjdHMgPSBvcHRpb25zLmN1c3RvbVByb2plY3RzPy4oY29udGV4dCkgPz8gW107XG5cbiAgcmV0dXJuIGRlZmluZUNvbmZpZyh7XG4gICAgdGVzdDoge1xuICAgICAgY292ZXJhZ2U6IHtcbiAgICAgICAgZXhjbHVkZTogY29udGV4dC5jb3ZlcmFnZUV4Y2x1ZGUsXG4gICAgICAgIGluY2x1ZGU6IFsnc3JjLyoqLyoudHMnXSxcbiAgICAgICAgcHJvdmlkZXI6ICd2OCcsXG4gICAgICAgIHJlcG9ydGVyOiBbJ3RleHQnLCAnbGNvdicsICdodG1sJ10sXG4gICAgICAgIHJlcG9ydHNEaXJlY3Rvcnk6ICcuL2NvdmVyYWdlJ1xuICAgICAgfSxcbiAgICAgIGV4Y2x1ZGU6IFsuLi5TSEFSRURfRVhDTFVERV0sXG4gICAgICBnbG9iYWxzOiBmYWxzZSxcbiAgICAgIGluY2x1ZGU6IFtVTklUX1RFU1RfRklMRVNdLFxuICAgICAgcGFzc1dpdGhOb1Rlc3RzOiB0cnVlLFxuICAgICAgcHJvamVjdHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgICAgIGFsaWFzOiB7XG4gICAgICAgICAgICAgIG9ic2lkaWFuOiAnb2JzaWRpYW4tdGVzdC1tb2Nrcy9vYnNpZGlhbidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHRlc3Q6IGNvbnRleHQudW5pdFRlc3RzXG4gICAgICAgIH0sXG4gICAgICAgIHsgdGVzdDogY29udGV4dC5ub0FwcCB9LFxuICAgICAgICB7IHRlc3Q6IGNvbnRleHQuZGVza3RvcCB9LFxuICAgICAgICB7IHRlc3Q6IGNvbnRleHQuZGVza3RvcFBlcmZvcm1hbmNlIH0sXG4gICAgICAgIHsgdGVzdDogY29udGV4dC5hbmRyb2lkIH0sXG4gICAgICAgIC4uLmN1c3RvbVByb2plY3RzXG4gICAgICBdXG4gICAgfVxuICB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBd0JBLDBCQUFvQjtBQUNwQixvQkFBNkI7QUFPN0IsTUFBTSxrQ0FBa0M7QUFDeEMsTUFBTSw4QkFBOEI7QUFDcEMsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSxzQ0FBc0M7QUFFNUMsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSw0QkFBNEI7QUFDbEMsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxpQ0FBaUM7QUFDdkMsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxrQkFBa0I7QUFFeEIsTUFBTSxxQ0FBcUM7QUFDM0MsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsTUFBTTtBQThCdkMsTUFBTSxrQ0FBa0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSzdCLFVBQTZDO0FBQUEsSUFDM0QsYUFBYTtBQUFBLElBQ2Isb0JBQW9CO0FBQUEsTUFDbEIsbUJBQW1CO0FBQUEsUUFDakIsV0FBVztBQUFBLFFBQ1gsU0FBUztBQUFBLFFBQ1QsTUFBTTtBQUFBLE1BQ1I7QUFBQSxJQUNGO0FBQUEsSUFDQSxpQkFBaUI7QUFB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
361
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy90ZXN0LXJ1bm5lcnMvdml0ZXN0LWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNoYXJlZCB2aXRlc3QgY29uZmlndXJhdGlvbiBmb3IgT2JzaWRpYW4gcGx1Z2lucy5cbiAqXG4gKiBFdmVyeSBwbHVnaW4gaW4gdGhlIHdvcmtzcGFjZSBkZWNsYXJlcyB0aGUgc2FtZSBmaXZlIHZpdGVzdCBwcm9qZWN0cyBcdTIwMTQgYHVuaXQtdGVzdHNgIHBsdXMgdGhlXG4gKiBgaW50ZWdyYXRpb24tdGVzdHM6e25vLWFwcCxkZXNrdG9wLGRlc2t0b3AtcGVyZm9ybWFuY2UsYW5kcm9pZH1gIGZhbWlseSBcdTIwMTQgd2l0aCB0aGUgc2FtZSB0aW1lb3V0cyxcbiAqIGBzZXR1cEZpbGVzYCwgYW5kIGBnbG9iYWxTZXR1cGAgd2lyaW5nLiBNYWludGFpbmluZyB0aGF0IHBlciByZXBvIG1lYW5zIGEgY29udmVudGlvbiBjaGFuZ2UgY29zdHMgb25lXG4gKiBuZWFyLWlkZW50aWNhbCBlZGl0IHBlciBwbHVnaW4sIGFuZCBhbnkgcmVwbyB0aGF0IGlzIG1pc3NlZCBkcmlmdHMgc2lsZW50bHkuIFRoaXMgbW9kdWxlIG93bnMgdGhhdFxuICogY29uZmlndXJhdGlvbiBvbmNlLCBzbyBhIHBsdWdpbidzIGBzY3JpcHRzL3ZpdGVzdC1jb25maWcudHNgIGNvbGxhcHNlcyB0byBhIHNpbmdsZSBjYWxsLlxuICpcbiAqIFRoZSBzZWFtIG1pcnJvcnMge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL29ic2lkaWFuLWRldi11dGlscyB8IHRoZSBFU0xpbnQgb25lfVxuICogKGBkZWZpbmVFc2xpbnRDb25maWdzYCk6IHRoZSBmYWN0b3J5IGJ1aWxkcyBhIGNvbnRleHQgaG9sZGluZyB0aGUgc3RhbmRhcmQgcHJvamVjdHMsIHRoZSBjYWxsZXIgZWRpdHNcbiAqIGl0IGluIHBsYWNlIHRocm91Z2gge0BsaW5rIERlZmluZU9ic2lkaWFuUGx1Z2luVml0ZXN0Q29uZmlnT3B0aW9ucy5lZGl0Q29udGV4dH0sIGFuZCBhcHBlbmRzIGFueVxuICogcHJvamVjdCB0aGUgYmFzZSBkb2VzIG5vdCBrbm93IGFib3V0IHRocm91Z2hcbiAqIHtAbGluayBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMuY3VzdG9tUHJvamVjdHN9LlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgVGVzdFByb2plY3RDb25maWd1cmF0aW9uLFxuICBUZXN0UHJvamVjdElubGluZUNvbmZpZ3VyYXRpb24sXG4gIFZpdGVVc2VyQ29uZmlnXG59IGZyb20gJ3ZpdGVzdC9jb25maWcnO1xuXG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZXN0L2NvbmZpZyc7XG5cbi8qKlxuICogVGhlIGB0ZXN0YCBzZWN0aW9uIG9mIGEgc2luZ2xlIHZpdGVzdCBwcm9qZWN0IGVudHJ5LlxuICovXG5leHBvcnQgdHlwZSBPYnNpZGlhblBsdWdpblZpdGVzdFByb2plY3RDb25maWcgPSBOb25OdWxsYWJsZTxUZXN0UHJvamVjdElubGluZUNvbmZpZ3VyYXRpb25bJ3Rlc3QnXT47XG5cbmNvbnN0IEFORFJPSURfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA2MF8wMDA7XG5jb25zdCBCSUdfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG5jb25zdCBIT09LX1RJTUVPVVRfTVVMVElQTElFUiA9IDQ7XG5jb25zdCBQRVJGT1JNQU5DRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMF8wMDA7XG5cbmNvbnN0IEFORFJPSURfVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5hbmRyb2lkLmludGVncmF0aW9uLnRlc3QudHMnO1xuY29uc3QgQ1JPU1NfUExBVEZPUk1fVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5jcm9zcy1wbGF0Zm9ybS5pbnRlZ3JhdGlvbi50ZXN0LnRzJztcbmNvbnN0IERFQ0xBUkFUSU9OX0ZJTEVTID0gJ3NyYy8qKi8qLmQudHMnO1xuY29uc3QgREVTS1RPUF9QRVJGT1JNQU5DRV9URVNUX0ZJTEVTID0gJ3NyYy8qKi8qLmRlc2t0b3AtcGVyZm9ybWFuY2UuaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBERVNLVE9QX1RFU1RfRklMRVMgPSAnc3JjLyoqLyouZGVza3RvcC5pbnRlZ3JhdGlvbi50ZXN0LnRzJztcbmNvbnN0IElOVEVHUkFUSU9OX1RFU1RfRklMRVMgPSAnc3JjLyoqLyouaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBOT19BUFBfVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5uby1hcHAuaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBVTklUX1RFU1RfRklMRVMgPSAnc3JjLyoqLyoudGVzdC50cyc7XG5cbmNvbnN0IE9CU0lESUFOX1ZFUlNJT05fRU5WX1ZBUklBQkxFX05BTUUgPSAnT0JTSURJQU5fVkVSU0lPTic7XG5jb25zdCBTSEFSRURfRVhDTFVERSA9IFsnbm9kZV9tb2R1bGVzJywgJ2Rpc3QnXTtcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyBmb3IgZGVmaW5pbmcgYSBwbHVnaW4ncyB2aXRlc3QgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMge1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGJ1aWxkcyBwcm9qZWN0cyB0aGUgYmFzZSBjb25maWd1cmF0aW9uIGRvZXMgbm90IGtub3cgYWJvdXQsIHN1Y2ggYXMgYSBwbHVnaW4ncyBvd25cbiAgICogYGludGVncmF0aW9uLXRlc3RzOmRlbW8tdmF1bHRgIHByb2plY3QuIFRoZSByZXR1cm5lZCBwcm9qZWN0cyBhcmUgYXBwZW5kZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIGZpdmUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHZpdGVzdCBjb25maWd1cmF0aW9uIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIFRoZSBleHRyYSBwcm9qZWN0cy5cbiAgICovXG4gIGN1c3RvbVByb2plY3RzPyhjb250ZXh0OiBPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ0NvbnRleHQpOiBUZXN0UHJvamVjdENvbmZpZ3VyYXRpb25bXTtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGVkaXRzIHRoZSB2aXRlc3QgY29uZmlndXJhdGlvbiBjb250ZXh0IGJlZm9yZSBpdCBpcyBhc3NlbWJsZWQgaW50byBhIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHZpdGVzdCBjb25maWd1cmF0aW9uIGNvbnRleHQuXG4gICAqL1xuICBlZGl0Q29udGV4dD8oY29udGV4dDogT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0KTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgY29udGV4dCBmb3IgZGVmaW5pbmcgYSBwbHVnaW4ncyB2aXRlc3QgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBFdmVyeSBtZW1iZXIgaXMgbGl2ZTogdGhlIGFycmF5cyBhbmQgb2JqZWN0cyBpdCBleHBvc2VzIGFyZSB0aGUgdmVyeSBvbmVzIHRoZSBhc3NlbWJsZWQgY29uZmlndXJhdGlvblxuICogaXMgYnVpbHQgZnJvbSwgc28gZWRpdGluZyB0aGVtIGluIHBsYWNlIHRocm91Z2hcbiAqIHtAbGluayBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMuZWRpdENvbnRleHR9IGlzIHdoYXQgY3VzdG9taXplcyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgY2xhc3MgT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBgaW50ZWdyYXRpb24tdGVzdHM6YW5kcm9pZGAgcHJvamVjdCwgcnVubmluZyB0aGUgbW9iaWxlLW9ubHkgYW5kIGNyb3NzLXBsYXRmb3JtIHN1aXRlcyBhZ2FpbnN0IGFuXG4gICAqIEFuZHJvaWQgZW11bGF0b3IgdGhyb3VnaCBBcHBpdW0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYW5kcm9pZDogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnbm9kZScsXG4gICAgZW52aXJvbm1lbnRPcHRpb25zOiB7XG4gICAgICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICAgICAgICBhcHBpdW1Vcmw6ICdodHRwOi8vbG9jYWxob3N0OjQ3MjMnLFxuICAgICAgICBhdmROYW1lOiAnb2JzaWRpYW5fdGVzdCcsXG4gICAgICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSdcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbGVQYXJhbGxlbGlzbTogZmFsc2UsXG4gICAgZ2xvYmFsU2V0dXA6IFsnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3QtZ2xvYmFsLXNldHVwLXBsdWdpbiddLFxuICAgIGhvb2tUaW1lb3V0OiBBTkRST0lEX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTICogSE9PS19USU1FT1VUX01VTFRJUExJRVIsXG4gICAgaW5jbHVkZTogW0FORFJPSURfVEVTVF9GSUxFUywgQ1JPU1NfUExBVEZPUk1fVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ2ludGVncmF0aW9uLXRlc3RzOmFuZHJvaWQnLFxuICAgIHNldHVwRmlsZXM6IFsnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3Qtc2V0dXAnXSxcbiAgICB0ZXN0VGltZW91dDogQU5EUk9JRF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyLXRlc3QgYnVkZ2V0IG9mIHRoZSBBbmRyb2lkIGludGVncmF0aW9uIHByb2plY3QsIGluIG1pbGxpc2Vjb25kcy4gQm9vdGluZyBhbiBlbXVsYXRvciBhbmRcbiAgICogZHJpdmluZyBpdCBvdmVyIEFwcGl1bSBpcyBzbG93ZXIgdGhhbiB0aGUgZGVza3RvcCBwYXRoLCBoZW5jZSBpdHMgb3duIGNvbnN0YW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYW5kcm9pZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IEFORFJPSURfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgLyoqXG4gICAqIFRoZSBwZXItdGVzdCBidWRnZXQgb2YgdGhlIHJlZ3VsYXIgaW50ZWdyYXRpb24gcHJvamVjdHMsIGluIG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDMwMDAwYFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJpZ1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IEJJR19USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICAvKipcbiAgICogVGhlIGNvdmVyYWdlIGBleGNsdWRlYCBnbG9icy4gUHVzaCBvbnRvIGl0IHRvIGRyb3AgbW9yZSBmaWxlcyBmcm9tIHRoZSBjb3ZlcmFnZSByZXBvcnQuXG4gICAqXG4gICAqIERlY2xhcmF0aW9uIGZpbGVzIGFyZSBleGNsdWRlZCBieSBkZWZhdWx0IGJlY2F1c2UgdGhlIGNvdmVyYWdlIGBpbmNsdWRlYCBiZWxvdyBpcyBgc3JjLyoqXFwvKi50c2AsXG4gICAqIHdoaWNoIGEgYC5kLnRzYCBtYXRjaGVzLiBBIGRlY2xhcmF0aW9uIGZpbGUgZW1pdHMgbm8gcnVudGltZSBjb2RlLCBzbyBpdCByZXBvcnRzIDAlIGFuZCBubyB0ZXN0IGNhblxuICAgKiBldmVyIHJhaXNlIGl0IFx1MjAxNCBhIHBsdWdpbiB0aGF0IGdyb3dzIG9uZSB1bmRlciBgc3JjL2Agc2lsZW50bHkgbG9zZXMgaXRzIDEwMCUgZ2F0ZSwgYW5kIHRoZSB1c3VhbFxuICAgKiByZW1lZHkgb2YgYW4gaW5saW5lIGB2OCBpZ25vcmVgIGNvbW1lbnQgZG9lcyBub3QgYXBwbHkgdG8gYSB0eXBlLW9ubHkgZmlsZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb3ZlcmFnZUV4Y2x1ZGU6IHN0cmluZ1tdID0gW1VOSVRfVEVTVF9GSUxFUywgREVDTEFSQVRJT05fRklMRVNdO1xuXG4gIC8qKlxuICAgKiBUaGUgYGludGVncmF0aW9uLXRlc3RzOmRlc2t0b3BgIHByb2plY3QsIHJ1bm5pbmcgdGhlIGRlc2t0b3Atb25seSBhbmQgY3Jvc3MtcGxhdGZvcm0gc3VpdGVzIGFnYWluc3QgYVxuICAgKiByZWFsIGRlc2t0b3AgT2JzaWRpYW4gb3ZlciBDRFAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVza3RvcDogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnbm9kZScsXG4gICAgZmlsZVBhcmFsbGVsaXNtOiBmYWxzZSxcbiAgICBnbG9iYWxTZXR1cDogWydvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1nbG9iYWwtc2V0dXAtcGx1Z2luJ10sXG4gICAgaG9va1RpbWVvdXQ6IEJJR19USU1FT1VUX0lOX01JTExJU0VDT05EUyAqIEhPT0tfVElNRU9VVF9NVUxUSVBMSUVSLFxuICAgIGluY2x1ZGU6IFtERVNLVE9QX1RFU1RfRklMRVMsIENST1NTX1BMQVRGT1JNX1RFU1RfRklMRVNdLFxuICAgIG5hbWU6ICdpbnRlZ3JhdGlvbi10ZXN0czpkZXNrdG9wJyxcbiAgICBzZXR1cEZpbGVzOiBbJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3Rpbmcvdml0ZXN0LXNldHVwJ10sXG4gICAgdGVzdFRpbWVvdXQ6IEJJR19USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgYGludGVncmF0aW9uLXRlc3RzOmRlc2t0b3AtcGVyZm9ybWFuY2VgIHByb2plY3QsIHJ1bm5pbmcgdGhlIGF0LXNjYWxlIHN1aXRlcy4gSXQgaXMgZGVjbGFyZWQgZm9yXG4gICAqIGV2ZXJ5IHBsdWdpbiBldmVuIHdoZW4gdGhlcmUgaXMgbm8gc3VjaCBzdWl0ZSB5ZXQgXHUyMDE0IGBwYXNzV2l0aE5vVGVzdHNgIG1ha2VzIGFuIGVtcHR5IHByb2plY3QgZnJlZSxcbiAgICogYW5kIHRoZSBtYXRjaGluZyBgdGVzdDppbnRlZ3JhdGlvbjpkZXNrdG9wOnBlcmZvcm1hbmNlYCBzY3JpcHQgZXhpc3RzIGZsZWV0LXdpZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVza3RvcFBlcmZvcm1hbmNlOiBPYnNpZGlhblBsdWdpblZpdGVzdFByb2plY3RDb25maWcgPSB7XG4gICAgZW52aXJvbm1lbnQ6ICdub2RlJyxcbiAgICBmaWxlUGFyYWxsZWxpc206IGZhbHNlLFxuICAgIGdsb2JhbFNldHVwOiBbJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3Rpbmcvdml0ZXN0LWdsb2JhbC1zZXR1cC1wbHVnaW4nXSxcbiAgICBob29rVGltZW91dDogUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgaW5jbHVkZTogW0RFU0tUT1BfUEVSRk9STUFOQ0VfVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ2ludGVncmF0aW9uLXRlc3RzOmRlc2t0b3AtcGVyZm9ybWFuY2UnLFxuICAgIHNldHVwRmlsZXM6IFsnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3Qtc2V0dXAnXSxcbiAgICB0ZXN0VGltZW91dDogUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgfTtcblxuICAvKipcbiAgICogVGhlIG11bHRpcGxpZXIgYXBwbGllZCB0byBhIHByb2plY3QncyB0ZXN0IGJ1ZGdldCB0byBnZXQgaXRzIGhvb2sgYnVkZ2V0LiBBIGhvb2sgdHlwaWNhbGx5IHBvcHVsYXRlc1xuICAgKiBhbmQgb3BlbnMgYSB2YXVsdCwgc28gaXQgbmVlZHMgc2V2ZXJhbCB0aW1lcyB3aGF0IGEgc2luZ2xlIHRlc3QgZG9lcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDRgXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaG9va1RpbWVvdXRNdWx0aXBsaWVyID0gSE9PS19USU1FT1VUX01VTFRJUExJRVI7XG5cbiAgLyoqXG4gICAqIFRoZSBgaW50ZWdyYXRpb24tdGVzdHM6bm8tYXBwYCBwcm9qZWN0LCBydW5uaW5nIHRoZSBzdWl0ZXMgdGhhdCBuZWVkIG5vIE9ic2lkaWFuIGluc3RhbmNlIGF0IGFsbC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBub0FwcDogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnbm9kZScsXG4gICAgZmlsZVBhcmFsbGVsaXNtOiBmYWxzZSxcbiAgICBob29rVGltZW91dDogQklHX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTICogSE9PS19USU1FT1VUX01VTFRJUExJRVIsXG4gICAgaW5jbHVkZTogW05PX0FQUF9URVNUX0ZJTEVTXSxcbiAgICBuYW1lOiAnaW50ZWdyYXRpb24tdGVzdHM6bm8tYXBwJyxcbiAgICB0ZXN0VGltZW91dDogQklHX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBwZXItdGVzdCBidWRnZXQgb2YgdGhlIHBlcmZvcm1hbmNlIGludGVncmF0aW9uIHByb2plY3QsIGluIG1pbGxpc2Vjb25kcy4gQSBwZXJmb3JtYW5jZSB2YXVsdCBpc1xuICAgKiBwcmUtcG9wdWxhdGVkIHdpdGggdGVucyBvZiB0aG91c2FuZHMgb2Ygbm90ZXMgYmVmb3JlIE9ic2lkaWFuIG9wZW5zLCBzbyBib3RoIGl0cyBzZXR1cCBhbmQgaXRzIHRlc3RzXG4gICAqIG5lZWQgZmFyIG1vcmUgdGltZSB0aGFuIHRoZSByZWd1bGFyIGludGVncmF0aW9uIHByb2plY3RzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDAwYFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcmZvcm1hbmNlVGltZW91dEluTWlsbGlzZWNvbmRzID0gUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgLyoqXG4gICAqIFRoZSBgdW5pdC10ZXN0c2AgcHJvamVjdCwgcnVubmluZyB0aGUgbW9ja2VkLU9ic2lkaWFuIHN1aXRlcyBpbiBganNkb21gLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXRUZXN0czogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnanNkb20nLFxuICAgIGV4Y2x1ZGU6IFsuLi5TSEFSRURfRVhDTFVERSwgSU5URUdSQVRJT05fVEVTVF9GSUxFU10sXG4gICAgZXhlY0FyZ3Y6IFsnLS1uby13ZWJzdG9yYWdlJ10sXG4gICAgaW5jbHVkZTogW1VOSVRfVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ3VuaXQtdGVzdHMnLFxuICAgIHNlcnZlcjoge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGRlcHNgIGlzIGRlY2xhcmVkIGJ5IGB2aXRlc3RgOyByZW5hbWluZyBpdCBoZXJlIHdvdWxkIG5vdCBtYXRjaCB0aGUgQVBJLlxuICAgICAgZGVwczoge1xuICAgICAgICBpbmxpbmU6IFsnQG9ic2lkaWFuLXR5cGluZ3MnLCAnb2JzaWRpYW4tZGV2LXV0aWxzJ11cbiAgICAgIH1cbiAgICB9LFxuICAgIHNldHVwRmlsZXM6IFtcbiAgICAgICdvYnNpZGlhbi10ZXN0LW1vY2tzL3ZpdGVzdC1zZXR1cCcsXG4gICAgICAnb2JzaWRpYW4tZGV2LXV0aWxzL3ZpdGVzdC1zZXR1cCdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCBzZWVkZWQgd2l0aCB0aGUgc3RhbmRhcmQgcHJvamVjdHMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3Qgb2JzaWRpYW5WZXJzaW9uID0gcHJvY2Vzcy5lbnZbT0JTSURJQU5fVkVSU0lPTl9FTlZfVkFSSUFCTEVfTkFNRV07XG5cbiAgICAvKlxuICAgICAqIFN1cHBvcnQgaXMgdGhlIHJhbmdlIFtsYXRlc3QgcHVibGljLCBsYXRlc3QgY2F0YWx5c3RdIGFuZCBCT1RIIGVuZHMgbXVzdCB3b3JrIChHOTkpLCBzbyB0aGUgdmVyc2lvblxuICAgICAqIGlzIGEga25vYiByYXRoZXIgdGhhbiBhIGNvbnN0YW50LiBUaGUga2V5IGlzIGFkZGVkIE9OTFkgd2hlbiB0aGUgdmFyaWFibGUgaXMgc2V0OiBhbiBleHBsaWNpdFxuICAgICAqIGBvYnNpZGlhblZlcnNpb25gIG1ha2VzIHRoZSBoYXJuZXNzIHJlc29sdmUgYSBjb25jcmV0ZSB2ZXJzaW9uIGFuZCBzd2FwIHRoZSBhc2FyLCB3aGljaCBpcyBub3Qgd2hhdFxuICAgICAqIGFuIHVucGlubmVkIHJ1biBkb2VzLCBzbyBzZWVkaW5nIGEgZGVmYXVsdCBoZXJlIHdvdWxkIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgZXZlcnkgcGx1Z2luLlxuICAgICAqL1xuICAgIGlmIChvYnNpZGlhblZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kZXNrdG9wLmVudmlyb25tZW50T3B0aW9ucyA9IHtcbiAgICAgICAgb2JzaWRpYW5UcmFuc3BvcnQ6IHtcbiAgICAgICAgICBvYnNpZGlhblZlcnNpb24sXG4gICAgICAgICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSB2aXRlc3QgY29uZmlndXJhdGlvbiBmb3IgYW4gT2JzaWRpYW4gcGx1Z2luLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGRlZmluaW5nIHRoZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMgVGhlIHZpdGVzdCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWcob3B0aW9uczogRGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdPcHRpb25zID0ge30pOiBWaXRlVXNlckNvbmZpZyB7XG4gIGNvbnN0IGNvbnRleHQgPSBuZXcgT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0KCk7XG5cbiAgaWYgKG9wdGlvbnMuZWRpdENvbnRleHQpIHtcbiAgICBvcHRpb25zLmVkaXRDb250ZXh0KGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgY3VzdG9tUHJvamVjdHMgPSBvcHRpb25zLmN1c3RvbVByb2plY3RzPy4oY29udGV4dCkgPz8gW107XG5cbiAgcmV0dXJuIGRlZmluZUNvbmZpZyh7XG4gICAgdGVzdDoge1xuICAgICAgY292ZXJhZ2U6IHtcbiAgICAgICAgZXhjbHVkZTogY29udGV4dC5jb3ZlcmFnZUV4Y2x1ZGUsXG4gICAgICAgIGluY2x1ZGU6IFsnc3JjLyoqLyoudHMnXSxcbiAgICAgICAgcHJvdmlkZXI6ICd2OCcsXG4gICAgICAgIHJlcG9ydGVyOiBbJ3RleHQnLCAnbGNvdicsICdodG1sJ10sXG4gICAgICAgIHJlcG9ydHNEaXJlY3Rvcnk6ICcuL2NvdmVyYWdlJ1xuICAgICAgfSxcbiAgICAgIGV4Y2x1ZGU6IFsuLi5TSEFSRURfRVhDTFVERV0sXG4gICAgICBnbG9iYWxzOiBmYWxzZSxcbiAgICAgIC8qXG4gICAgICAgKiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgTk8gcm9vdC1sZXZlbCBgaW5jbHVkZWAgaGVyZSwgYW5kIHJlc3RvcmluZyBvbmUgYnJlYWtzIGV2ZXJ5IHByb2plY3QuXG4gICAgICAgKiBVbmRlciB2aXRlc3QgNCBhIHByb2plY3QncyBvd24gYGluY2x1ZGVgIHJlcGxhY2VkIHRoZSByb290IG9uZSwgc28gYSByb290XG4gICAgICAgKiBgaW5jbHVkZTogW1VOSVRfVEVTVF9GSUxFU11gIHdhcyBtZXJlbHkgcmVkdW5kYW50IFx1MjAxNCB0aGUgYHVuaXQtdGVzdHNgIHByb2plY3QgYWxyZWFkeSBkZWNsYXJlc1xuICAgICAgICogdGhhdCBzYW1lIGdsb2IgZm9yIGl0c2VsZi4gVW5kZXIgdml0ZXN0IDUgdGhlIHByb2plY3QgZ2xvYiBubyBsb25nZXIgcmVwbGFjZXMgaXQsIGFuZFxuICAgICAgICogYHNyYy8qKlxcLyoudGVzdC50c2AgaXMgYSBzdXBlcnNldCBvZiBldmVyeSBwcm9qZWN0IGdsb2IsIHNvIEVWRVJZIHByb2plY3QgY29sbGVjdGVkIEVWRVJZIHRlc3RcbiAgICAgICAqIGZpbGU6IHVuaXQgc3VpdGVzIHJhbiBpbiB0aGUgQ0RQIGludGVncmF0aW9uIGVudmlyb25tZW50IGFuZCBkaWVkIG9uIGBGYWlsZWQgdG8gcmVzb2x2ZSBlbnRyeVxuICAgICAgICogZm9yIHBhY2thZ2UgXCJvYnNpZGlhblwiYCwgdGhlIHNjcmVlbnNob3QtY2FwdHVyZSBzdWl0ZXMgcmFuIGFuZCByZXdyb3RlIGNoZWNrZWQtaW4gUE5HcywgYW5kIHRoZVxuICAgICAgICogYW5kcm9pZCAvIGRlbW8tdmF1bHQgc3VpdGVzIHJhbiB1bmRlciB0aGUgZGVza3RvcCB0cmFuc3BvcnQuIE1lYXN1cmVkIGluIGEgY29uc3VtZXI6IHRoZSBkZXNrdG9wXG4gICAgICAgKiBwcm9qZWN0IGNvbGxlY3RlZCAyMjcgZmlsZXMgaW5zdGVhZCBvZiBpdHMgb3duIDEwNSwgYW5kIGRlbGV0aW5nIHRoaXMgb25lIGxpbmUgcmVzdG9yZWQgMTA1LlxuICAgICAgICovXG4gICAgICBwYXNzV2l0aE5vVGVzdHM6IHRydWUsXG4gICAgICBwcm9qZWN0czogW1xuICAgICAgICB7XG4gICAgICAgICAgcmVzb2x2ZToge1xuICAgICAgICAgICAgYWxpYXM6IHtcbiAgICAgICAgICAgICAgb2JzaWRpYW46ICdvYnNpZGlhbi10ZXN0LW1vY2tzL29ic2lkaWFuJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGVzdDogY29udGV4dC51bml0VGVzdHNcbiAgICAgICAgfSxcbiAgICAgICAgeyB0ZXN0OiBjb250ZXh0Lm5vQXBwIH0sXG4gICAgICAgIHsgdGVzdDogY29udGV4dC5kZXNrdG9wIH0sXG4gICAgICAgIHsgdGVzdDogY29udGV4dC5kZXNrdG9wUGVyZm9ybWFuY2UgfSxcbiAgICAgICAgeyB0ZXN0OiBjb250ZXh0LmFuZHJvaWQgfSxcbiAgICAgICAgLi4uY3VzdG9tUHJvamVjdHNcbiAgICAgIF1cbiAgICB9XG4gIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF3QkEsMEJBQW9CO0FBQ3BCLG9CQUE2QjtBQU83QixNQUFNLGtDQUFrQztBQUN4QyxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLHNDQUFzQztBQUU1QyxNQUFNLHFCQUFxQjtBQUMzQixNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLG9CQUFvQjtBQUMxQixNQUFNLGlDQUFpQztBQUN2QyxNQUFNLHFCQUFxQjtBQUMzQixNQUFNLHlCQUF5QjtBQUMvQixNQUFNLG9CQUFvQjtBQUMxQixNQUFNLGtCQUFrQjtBQUV4QixNQUFNLHFDQUFxQztBQUMzQyxNQUFNLGlCQUFpQixDQUFDLGdCQUFnQixNQUFNO0FBOEJ2QyxNQUFNLGtDQUFrQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLN0IsVUFBNkM7QUFBQSxJQUMzRCxhQUFhO0FBQUEsSUFDYixvQkFBb0I7QUFBQSxNQUNsQixtQkFBbUI7QUFBQSxRQUNqQixXQUFXO0FBQUEsUUFDWCxTQUFTO0FBQUEsUUFDVCxNQUFNO0FBQUEsTUFDUjtBQUFBLElBQ0Y7QUFBQSxJQUNBLGlCQUFpQjtBQUFBLElBQ2pCLGFBQWEsQ0FBQyx5REFBeUQ7QUFBQSxJQUN2RSxhQUFhLGtDQUFrQztBQUFBLElB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