@mnaoumov/obsidian-lib 10.3.0 → 10.4.1

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 (51) hide show
  1. package/command-handlers/undo-bulk-operation-command-handler/package.json +6 -0
  2. package/components/bulk-operation-commit-component/package.json +6 -0
  3. package/dist/lib/cjs/__merged.cjs +42 -1
  4. package/dist/lib/cjs/__merged.d.cts +5 -0
  5. package/dist/lib/cjs/bulk-operation-progress.cjs +120 -0
  6. package/dist/lib/cjs/bulk-operation-progress.d.cts +33 -0
  7. package/dist/lib/cjs/bulk-operation.cjs +220 -0
  8. package/dist/lib/cjs/bulk-operation.d.cts +237 -0
  9. package/dist/lib/cjs/command-handlers/index.cjs +4 -1
  10. package/dist/lib/cjs/command-handlers/index.d.cts +1 -0
  11. package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +164 -0
  12. package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.d.cts +51 -0
  13. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +337 -0
  14. package/dist/lib/cjs/components/bulk-operation-commit-component.d.cts +152 -0
  15. package/dist/lib/cjs/components/index.cjs +4 -1
  16. package/dist/lib/cjs/components/index.d.cts +1 -0
  17. package/dist/lib/cjs/data-stores/local-data-store.cjs +2 -3
  18. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +534 -0
  19. package/dist/lib/cjs/desktop-bulk-operation-git.d.cts +196 -0
  20. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  21. package/dist/lib/cjs/i18n/locales/en.cjs +10 -1
  22. package/dist/lib/cjs/i18n/locales/en.d.cts +9 -0
  23. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +9 -0
  24. package/dist/lib/cjs/index.cjs +10 -1
  25. package/dist/lib/cjs/index.d.cts +3 -0
  26. package/dist/lib/cjs/loop.cjs +3 -1
  27. package/dist/lib/esm/__merged.d.mts +5 -0
  28. package/dist/lib/esm/__merged.mjs +43 -1
  29. package/dist/lib/esm/bulk-operation-progress.d.mts +33 -0
  30. package/dist/lib/esm/bulk-operation-progress.mjs +31 -0
  31. package/dist/lib/esm/bulk-operation.d.mts +237 -0
  32. package/dist/lib/esm/bulk-operation.mjs +125 -0
  33. package/dist/lib/esm/command-handlers/index.d.mts +1 -0
  34. package/dist/lib/esm/command-handlers/index.mjs +3 -1
  35. package/dist/lib/esm/command-handlers/undo-bulk-operation-command-handler.d.mts +51 -0
  36. package/dist/lib/esm/command-handlers/undo-bulk-operation-command-handler.mjs +76 -0
  37. package/dist/lib/esm/components/bulk-operation-commit-component.d.mts +152 -0
  38. package/dist/lib/esm/components/bulk-operation-commit-component.mjs +245 -0
  39. package/dist/lib/esm/components/index.d.mts +1 -0
  40. package/dist/lib/esm/components/index.mjs +3 -1
  41. package/dist/lib/esm/data-stores/local-data-store.mjs +2 -3
  42. package/dist/lib/esm/desktop-bulk-operation-git.d.mts +196 -0
  43. package/dist/lib/esm/desktop-bulk-operation-git.mjs +463 -0
  44. package/dist/lib/esm/generated-during-build.mjs +1 -1
  45. package/dist/lib/esm/i18n/locales/en.d.mts +9 -0
  46. package/dist/lib/esm/i18n/locales/en.mjs +10 -1
  47. package/dist/lib/esm/i18n/locales/translations-map.d.mts +9 -0
  48. package/dist/lib/esm/index.d.mts +3 -0
  49. package/dist/lib/esm/index.mjs +7 -1
  50. package/dist/lib/esm/loop.mjs +3 -1
  51. package/package.json +2 -1
@@ -0,0 +1,152 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Contains class {@link BulkOperationCommitComponent} that wraps a plugin's bulk operations in git commits, so
6
+ * `git revert` undoes one.
7
+ */
8
+ import type { App } from 'obsidian';
9
+ import type { Promisable } from 'type-fest';
10
+ import type { PluginNoticeComponent } from './plugin-notice-component.mjs';
11
+ import { ComponentEx } from './component-ex.mjs';
12
+ /**
13
+ * Constructor parameters for {@link BulkOperationCommitComponent}.
14
+ */
15
+ export interface BulkOperationCommitComponentConstructorParams {
16
+ /**
17
+ * The Obsidian app instance.
18
+ */
19
+ readonly app: App;
20
+ /**
21
+ * Whether the plugin's opt-in setting for bulk-operation commits is on. Read on every operation, so a settings
22
+ * change applies to the next one.
23
+ */
24
+ readonly isEnabled: () => boolean;
25
+ /**
26
+ * The longest the settle step waits for the vault to go quiet after an operation.
27
+ *
28
+ * @default `60_000`
29
+ */
30
+ readonly maxSettleTimeInMilliseconds?: number;
31
+ /**
32
+ * The id of the plugin whose operations are committed.
33
+ */
34
+ readonly pluginId: string;
35
+ /**
36
+ * The notice component used to report problems.
37
+ */
38
+ readonly pluginNoticeComponent: PluginNoticeComponent;
39
+ /**
40
+ * How long the vault must go without a change after an operation before its commit is made.
41
+ *
42
+ * @default `2000`
43
+ */
44
+ readonly quietPeriodInMilliseconds?: number;
45
+ }
46
+ /**
47
+ * Parameters for {@link BulkOperationCommitComponent.runBulkOperation}.
48
+ *
49
+ * @typeParam T - The type of the operation's result.
50
+ */
51
+ export interface BulkOperationCommitComponentRunBulkOperationParams<T> {
52
+ /**
53
+ * Runs the bulk operation.
54
+ *
55
+ * @returns The operation's result.
56
+ */
57
+ readonly operation: () => Promisable<T>;
58
+ /**
59
+ * A one-line description of the operation, used in the commit subject, such as `Collect attachments in Notes`.
60
+ */
61
+ readonly summary: string;
62
+ }
63
+ /**
64
+ * Wraps a plugin's bulk operations in git commits, so `git revert` of one commit undoes one operation.
65
+ *
66
+ * @remarks
67
+ * Opt-in through the plugin's own setting, and active only on desktop, for a vault inside a git work tree. When it
68
+ * is not active, {@link runBulkOperation} simply runs the operation. When it is, the operation runs between a
69
+ * `chore: before OP<n>` commit of whatever was pending and an `OP<n>: <summary>` commit of what it changed, under
70
+ * a lease lock in the repo's git directory that the scheduled vault autocommit honors. The lock's heartbeat
71
+ * is refreshed by the operation's progress: every `loop()` item, or an explicit `reportBulkOperationProgress()`.
72
+ *
73
+ * On load it recovers a lock left stale by a crash, committing the leftovers as `OP<n> interrupted`.
74
+ *
75
+ * Pair it with `UndoBulkOperationCommandHandler`, which lists the plugin's operations and reverts one.
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * this.bulkOperationCommitComponent = this.addChild(new BulkOperationCommitComponent({
80
+ * app: this.app,
81
+ * isEnabled: () => this.settings.shouldCommitBulkOperations,
82
+ * pluginId: this.manifest.id,
83
+ * pluginNoticeComponent: this.pluginNoticeComponent
84
+ * }));
85
+ *
86
+ * await this.bulkOperationCommitComponent.runBulkOperation({
87
+ * operation: () => collectAttachmentsInFolder(folder),
88
+ * summary: `Collect attachments in ${folder.path}`
89
+ * });
90
+ * ```
91
+ */
92
+ export declare class BulkOperationCommitComponent extends ComponentEx {
93
+ /**
94
+ * The Obsidian app instance.
95
+ */
96
+ protected readonly app: App;
97
+ /**
98
+ * Whether the plugin's opt-in setting is on.
99
+ */
100
+ protected readonly isEnabled: () => boolean;
101
+ /**
102
+ * The id of the plugin whose operations are committed.
103
+ */
104
+ protected readonly pluginId: string;
105
+ /**
106
+ * The notice component used to report problems.
107
+ */
108
+ protected readonly pluginNoticeComponent: PluginNoticeComponent;
109
+ private readonly maxSettleTimeInMilliseconds;
110
+ private readonly quietPeriodInMilliseconds;
111
+ private repoPromise;
112
+ /**
113
+ * Creates a new instance.
114
+ *
115
+ * @param params - The constructor parameters.
116
+ */
117
+ constructor(params: BulkOperationCommitComponentConstructorParams);
118
+ /**
119
+ * Checks whether bulk operations are currently committed: the setting is on, the app is desktop and the vault is
120
+ * inside a git work tree.
121
+ *
122
+ * @returns Whether bulk operations are committed.
123
+ */
124
+ checkActive(): Promise<boolean>;
125
+ /**
126
+ * Recovers a stale lock left by a crashed operation once the component loads.
127
+ */
128
+ onload(): void;
129
+ /**
130
+ * Runs a bulk operation, wrapped in git commits when bulk-operation commits are active.
131
+ *
132
+ * @typeParam T - The type of the operation's result.
133
+ * @param params - The parameters.
134
+ * @returns The operation's result.
135
+ */
136
+ runBulkOperation<T>(params: BulkOperationCommitComponentRunBulkOperationParams<T>): Promise<T>;
137
+ /**
138
+ * Lets the user pick one of the plugin's bulk operations and reverts its commit.
139
+ *
140
+ * A conflict is reported and left for the user to resolve; the revert is never aborted.
141
+ *
142
+ * @param operationId - The operation to undo, such as `OP12`. When omitted, the user picks from every operation
143
+ * of the plugin. When two commits share the id (two machines minted it before syncing), the user picks between
144
+ * them.
145
+ */
146
+ undoBulkOperation(operationId?: string): Promise<void>;
147
+ private findRepo;
148
+ private getRepo;
149
+ private recoverStaleLock;
150
+ private settle;
151
+ private waitForQuietVault;
152
+ }
@@ -0,0 +1,245 @@
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
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import {
34
+ invokeAsyncSafely,
35
+ setTimeoutAsync
36
+ } from "@mnaoumov/typescript-lib/async";
37
+ import { errorToString } from "@mnaoumov/typescript-lib/error";
38
+ import { ensureNonNullable } from "@mnaoumov/typescript-lib/type-guards";
39
+ import {
40
+ FileSystemAdapter,
41
+ Platform
42
+ } from "obsidian";
43
+ import { reportBulkOperationProgress } from "../bulk-operation-progress.mjs";
44
+ import { getObsidianLibDebugger } from "../debug.mjs";
45
+ import { waitForPendingLinkUpdates } from "../file-manager.mjs";
46
+ import { t } from "../i18n/i18n.mjs";
47
+ import { ensureMetadataCacheReady } from "../metadata-cache.mjs";
48
+ import { selectItem } from "../modals/select-item.mjs";
49
+ import { flushQueue } from "../queue.mjs";
50
+ import { ComponentEx } from "./component-ex.mjs";
51
+ const DEFAULT_MAX_SETTLE_TIME_IN_MILLISECONDS = 6e4;
52
+ const DEFAULT_QUIET_PERIOD_IN_MILLISECONDS = 2e3;
53
+ const SHORT_SHA_LENGTH = 8;
54
+ class BulkOperationCommitComponent extends ComponentEx {
55
+ /**
56
+ * The Obsidian app instance.
57
+ */
58
+ app;
59
+ /**
60
+ * Whether the plugin's opt-in setting is on.
61
+ */
62
+ isEnabled;
63
+ /**
64
+ * The id of the plugin whose operations are committed.
65
+ */
66
+ pluginId;
67
+ /**
68
+ * The notice component used to report problems.
69
+ */
70
+ pluginNoticeComponent;
71
+ maxSettleTimeInMilliseconds;
72
+ quietPeriodInMilliseconds;
73
+ repoPromise = null;
74
+ /**
75
+ * Creates a new instance.
76
+ *
77
+ * @param params - The constructor parameters.
78
+ */
79
+ constructor(params) {
80
+ super();
81
+ this.app = params.app;
82
+ this.isEnabled = params.isEnabled;
83
+ this.pluginId = params.pluginId;
84
+ this.pluginNoticeComponent = params.pluginNoticeComponent;
85
+ this.maxSettleTimeInMilliseconds = params.maxSettleTimeInMilliseconds ?? DEFAULT_MAX_SETTLE_TIME_IN_MILLISECONDS;
86
+ this.quietPeriodInMilliseconds = params.quietPeriodInMilliseconds ?? DEFAULT_QUIET_PERIOD_IN_MILLISECONDS;
87
+ }
88
+ /**
89
+ * Checks whether bulk operations are currently committed: the setting is on, the app is desktop and the vault is
90
+ * inside a git work tree.
91
+ *
92
+ * @returns Whether bulk operations are committed.
93
+ */
94
+ async checkActive() {
95
+ return await this.getRepo() !== null;
96
+ }
97
+ /**
98
+ * Recovers a stale lock left by a crashed operation once the component loads.
99
+ */
100
+ onload() {
101
+ super.onload();
102
+ invokeAsyncSafely(() => this.recoverStaleLock());
103
+ }
104
+ /**
105
+ * Runs a bulk operation, wrapped in git commits when bulk-operation commits are active.
106
+ *
107
+ * @typeParam T - The type of the operation's result.
108
+ * @param params - The parameters.
109
+ * @returns The operation's result.
110
+ */
111
+ async runBulkOperation(params) {
112
+ const repo = await this.getRepo();
113
+ if (!repo) {
114
+ return await params.operation();
115
+ }
116
+ const { commitSha, operationId, result } = await repo.runBulkOperation({
117
+ operation: async () => await params.operation(),
118
+ pluginId: this.pluginId,
119
+ settle: () => this.settle(),
120
+ summary: params.summary
121
+ });
122
+ getObsidianLibDebugger("BulkOperationCommitComponent")(
123
+ commitSha === null ? `${operationId} changed nothing` : `${operationId} committed as ${commitSha}`
124
+ );
125
+ return result;
126
+ }
127
+ /**
128
+ * Lets the user pick one of the plugin's bulk operations and reverts its commit.
129
+ *
130
+ * A conflict is reported and left for the user to resolve; the revert is never aborted.
131
+ *
132
+ * @param operationId - The operation to undo, such as `OP12`. When omitted, the user picks from every operation
133
+ * of the plugin. When two commits share the id (two machines minted it before syncing), the user picks between
134
+ * them.
135
+ */
136
+ async undoBulkOperation(operationId) {
137
+ const repo = await this.getRepo();
138
+ if (!repo) {
139
+ this.pluginNoticeComponent.showNotice(t(($) => $.obsidianLib.bulkOperation.notActive));
140
+ return;
141
+ }
142
+ let commits = await repo.listBulkOperationCommits(this.pluginId);
143
+ if (operationId !== void 0) {
144
+ commits = commits.filter((commit2) => commit2.operationId === operationId);
145
+ }
146
+ if (commits.length === 0) {
147
+ this.pluginNoticeComponent.showNotice(t(($) => $.obsidianLib.bulkOperation.noOperations));
148
+ return;
149
+ }
150
+ const commit = commits.length === 1 && operationId !== void 0 ? ensureNonNullable(commits[0]) : await selectItem({
151
+ app: this.app,
152
+ items: commits,
153
+ itemTextFunction: formatCommit,
154
+ placeholder: t(($) => $.obsidianLib.bulkOperation.selectOperation)
155
+ });
156
+ if (!commit) {
157
+ return;
158
+ }
159
+ let revertResult;
160
+ try {
161
+ revertResult = await repo.revertBulkOperationCommit(commit);
162
+ } catch (error) {
163
+ this.pluginNoticeComponent.showNotice(
164
+ t(($) => $.obsidianLib.bulkOperation.revertFailed, { error: errorToString(error), operationId: commit.operationId })
165
+ );
166
+ return;
167
+ }
168
+ if (revertResult.isConflict) {
169
+ this.pluginNoticeComponent.showNotice(t(($) => $.obsidianLib.bulkOperation.revertConflict, { operationId: commit.operationId }), {
170
+ isPermanent: true
171
+ });
172
+ return;
173
+ }
174
+ this.pluginNoticeComponent.showNotice(t(($) => $.obsidianLib.bulkOperation.reverted, { operationId: commit.operationId }));
175
+ }
176
+ async findRepo() {
177
+ if (!Platform.isDesktopApp) {
178
+ return null;
179
+ }
180
+ const adapter = this.app.vault.adapter;
181
+ if (!(adapter instanceof FileSystemAdapter)) {
182
+ return null;
183
+ }
184
+ const { BulkOperationGitRepo: GitRepo } = await import("../desktop-bulk-operation-git.mjs");
185
+ return await GitRepo.open(adapter.getBasePath());
186
+ }
187
+ async getRepo() {
188
+ if (!this.isEnabled()) {
189
+ return null;
190
+ }
191
+ this.repoPromise ??= this.findRepo();
192
+ return await this.repoPromise;
193
+ }
194
+ async recoverStaleLock() {
195
+ const repo = await this.getRepo();
196
+ if (!repo) {
197
+ return;
198
+ }
199
+ const operationId = await repo.recoverStaleLock();
200
+ if (operationId !== null) {
201
+ this.pluginNoticeComponent.showNotice(t(($) => $.obsidianLib.bulkOperation.recoveredInterrupted, { operationId }));
202
+ }
203
+ }
204
+ async settle() {
205
+ await flushQueue();
206
+ await waitForPendingLinkUpdates(this.app);
207
+ await ensureMetadataCacheReady(this.app);
208
+ await this.waitForQuietVault();
209
+ }
210
+ async waitForQuietVault() {
211
+ let lastChangeAt = performance.now();
212
+ const deadline = lastChangeAt + this.maxSettleTimeInMilliseconds;
213
+ function onChange() {
214
+ lastChangeAt = performance.now();
215
+ }
216
+ const eventRefs = [
217
+ this.app.vault.on("create", onChange),
218
+ this.app.vault.on("delete", onChange),
219
+ this.app.vault.on("modify", onChange),
220
+ this.app.vault.on("rename", onChange)
221
+ ];
222
+ try {
223
+ for (; ; ) {
224
+ const now = performance.now();
225
+ const quietRemaining = lastChangeAt + this.quietPeriodInMilliseconds - now;
226
+ if (quietRemaining <= 0 || now >= deadline) {
227
+ return;
228
+ }
229
+ reportBulkOperationProgress();
230
+ await setTimeoutAsync(Math.min(quietRemaining, deadline - now));
231
+ }
232
+ } finally {
233
+ for (const eventRef of eventRefs) {
234
+ this.app.vault.offref(eventRef);
235
+ }
236
+ }
237
+ }
238
+ }
239
+ function formatCommit(commit) {
240
+ return `${commit.subject} (${commit.date}, ${commit.sha.slice(0, SHORT_SHA_LENGTH)})`;
241
+ }
242
+ export {
243
+ BulkOperationCommitComponent
244
+ };
245
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2J1bGstb3BlcmF0aW9uLWNvbW1pdC1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIGNsYXNzIHtAbGluayBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50fSB0aGF0IHdyYXBzIGEgcGx1Z2luJ3MgYnVsayBvcGVyYXRpb25zIGluIGdpdCBjb21taXRzLCBzb1xuICogYGdpdCByZXZlcnRgIHVuZG9lcyBvbmUuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEV2ZW50UmVmXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7XG4gIGludm9rZUFzeW5jU2FmZWx5LFxuICBzZXRUaW1lb3V0QXN5bmNcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgRmlsZVN5c3RlbUFkYXB0ZXIsXG4gIFBsYXRmb3JtXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBCdWxrT3BlcmF0aW9uQ29tbWl0IH0gZnJvbSAnLi4vYnVsay1vcGVyYXRpb24udHMnO1xuaW1wb3J0IHR5cGUgeyBCdWxrT3BlcmF0aW9uR2l0UmVwbyB9IGZyb20gJy4uL2Rlc2t0b3AtYnVsay1vcGVyYXRpb24tZ2l0LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IHJlcG9ydEJ1bGtPcGVyYXRpb25Qcm9ncmVzcyB9IGZyb20gJy4uL2J1bGstb3BlcmF0aW9uLXByb2dyZXNzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuTGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzIH0gZnJvbSAnLi4vZmlsZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5IH0gZnJvbSAnLi4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgc2VsZWN0SXRlbSB9IGZyb20gJy4uL21vZGFscy9zZWxlY3QtaXRlbS50cyc7XG5pbXBvcnQgeyBmbHVzaFF1ZXVlIH0gZnJvbSAnLi4vcXVldWUudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIEJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsdWdpbidzIG9wdC1pbiBzZXR0aW5nIGZvciBidWxrLW9wZXJhdGlvbiBjb21taXRzIGlzIG9uLiBSZWFkIG9uIGV2ZXJ5IG9wZXJhdGlvbiwgc28gYSBzZXR0aW5nc1xuICAgKiBjaGFuZ2UgYXBwbGllcyB0byB0aGUgbmV4dCBvbmUuXG4gICAqL1xuICByZWFkb25seSBpc0VuYWJsZWQ6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBsb25nZXN0IHRoZSBzZXR0bGUgc3RlcCB3YWl0cyBmb3IgdGhlIHZhdWx0IHRvIGdvIHF1aWV0IGFmdGVyIGFuIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwXzAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heFNldHRsZVRpbWVJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBwbHVnaW4gd2hvc2Ugb3BlcmF0aW9ucyBhcmUgY29tbWl0dGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgcHJvYmxlbXMuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogSG93IGxvbmcgdGhlIHZhdWx0IG11c3QgZ28gd2l0aG91dCBhIGNoYW5nZSBhZnRlciBhbiBvcGVyYXRpb24gYmVmb3JlIGl0cyBjb21taXQgaXMgbWFkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDIwMDBgXG4gICAqL1xuICByZWFkb25seSBxdWlldFBlcmlvZEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50LnJ1bkJ1bGtPcGVyYXRpb259LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudFJ1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4ge1xuICAvKipcbiAgICogUnVucyB0aGUgYnVsayBvcGVyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246ICgpID0+IFByb21pc2FibGU8VD47XG5cbiAgLyoqXG4gICAqIEEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhdGlvbiwgdXNlZCBpbiB0aGUgY29tbWl0IHN1YmplY3QsIHN1Y2ggYXMgYENvbGxlY3QgYXR0YWNobWVudHMgaW4gTm90ZXNgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VtbWFyeTogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX01BWF9TRVRUTEVfVElNRV9JTl9NSUxMSVNFQ09ORFMgPSA2MF8wMDA7XG5jb25zdCBERUZBVUxUX1FVSUVUX1BFUklPRF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgU0hPUlRfU0hBX0xFTkdUSCA9IDg7XG5cbi8qKlxuICogV3JhcHMgYSBwbHVnaW4ncyBidWxrIG9wZXJhdGlvbnMgaW4gZ2l0IGNvbW1pdHMsIHNvIGBnaXQgcmV2ZXJ0YCBvZiBvbmUgY29tbWl0IHVuZG9lcyBvbmUgb3BlcmF0aW9uLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPcHQtaW4gdGhyb3VnaCB0aGUgcGx1Z2luJ3Mgb3duIHNldHRpbmcsIGFuZCBhY3RpdmUgb25seSBvbiBkZXNrdG9wLCBmb3IgYSB2YXVsdCBpbnNpZGUgYSBnaXQgd29yayB0cmVlLiBXaGVuIGl0XG4gKiBpcyBub3QgYWN0aXZlLCB7QGxpbmsgcnVuQnVsa09wZXJhdGlvbn0gc2ltcGx5IHJ1bnMgdGhlIG9wZXJhdGlvbi4gV2hlbiBpdCBpcywgdGhlIG9wZXJhdGlvbiBydW5zIGJldHdlZW4gYVxuICogYGNob3JlOiBiZWZvcmUgT1A8bj5gIGNvbW1pdCBvZiB3aGF0ZXZlciB3YXMgcGVuZGluZyBhbmQgYW4gYE9QPG4+OiA8c3VtbWFyeT5gIGNvbW1pdCBvZiB3aGF0IGl0IGNoYW5nZWQsIHVuZGVyXG4gKiBhIGxlYXNlIGxvY2sgaW4gdGhlIHJlcG8ncyBnaXQgZGlyZWN0b3J5IHRoYXQgdGhlIHNjaGVkdWxlZCB2YXVsdCBhdXRvY29tbWl0IGhvbm9ycy4gVGhlIGxvY2sncyBoZWFydGJlYXRcbiAqIGlzIHJlZnJlc2hlZCBieSB0aGUgb3BlcmF0aW9uJ3MgcHJvZ3Jlc3M6IGV2ZXJ5IGBsb29wKClgIGl0ZW0sIG9yIGFuIGV4cGxpY2l0IGByZXBvcnRCdWxrT3BlcmF0aW9uUHJvZ3Jlc3MoKWAuXG4gKlxuICogT24gbG9hZCBpdCByZWNvdmVycyBhIGxvY2sgbGVmdCBzdGFsZSBieSBhIGNyYXNoLCBjb21taXR0aW5nIHRoZSBsZWZ0b3ZlcnMgYXMgYE9QPG4+IGludGVycnVwdGVkYC5cbiAqXG4gKiBQYWlyIGl0IHdpdGggYFVuZG9CdWxrT3BlcmF0aW9uQ29tbWFuZEhhbmRsZXJgLCB3aGljaCBsaXN0cyB0aGUgcGx1Z2luJ3Mgb3BlcmF0aW9ucyBhbmQgcmV2ZXJ0cyBvbmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiB0aGlzLmJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnQgPSB0aGlzLmFkZENoaWxkKG5ldyBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50KHtcbiAqICAgYXBwOiB0aGlzLmFwcCxcbiAqICAgaXNFbmFibGVkOiAoKSA9PiB0aGlzLnNldHRpbmdzLnNob3VsZENvbW1pdEJ1bGtPcGVyYXRpb25zLFxuICogICBwbHVnaW5JZDogdGhpcy5tYW5pZmVzdC5pZCxcbiAqICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudFxuICogfSkpO1xuICpcbiAqIGF3YWl0IHRoaXMuYnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudC5ydW5CdWxrT3BlcmF0aW9uKHtcbiAqICAgb3BlcmF0aW9uOiAoKSA9PiBjb2xsZWN0QXR0YWNobWVudHNJbkZvbGRlcihmb2xkZXIpLFxuICogICBzdW1tYXJ5OiBgQ29sbGVjdCBhdHRhY2htZW50cyBpbiAke2ZvbGRlci5wYXRofWBcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGx1Z2luJ3Mgb3B0LWluIHNldHRpbmcgaXMgb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNFbmFibGVkOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHBsdWdpbiB3aG9zZSBvcGVyYXRpb25zIGFyZSBjb21taXR0ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgcHJvYmxlbXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTZXR0bGVUaW1lSW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWlldFBlcmlvZEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVwb1Byb21pc2U6IG51bGwgfCBQcm9taXNlPEJ1bGtPcGVyYXRpb25HaXRSZXBvIHwgbnVsbD4gPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmlzRW5hYmxlZCA9IHBhcmFtcy5pc0VuYWJsZWQ7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5tYXhTZXR0bGVUaW1lSW5NaWxsaXNlY29uZHMgPSBwYXJhbXMubWF4U2V0dGxlVGltZUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfTUFYX1NFVFRMRV9USU1FX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLnF1aWV0UGVyaW9kSW5NaWxsaXNlY29uZHMgPSBwYXJhbXMucXVpZXRQZXJpb2RJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1FVSUVUX1BFUklPRF9JTl9NSUxMSVNFQ09ORFM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYnVsayBvcGVyYXRpb25zIGFyZSBjdXJyZW50bHkgY29tbWl0dGVkOiB0aGUgc2V0dGluZyBpcyBvbiwgdGhlIGFwcCBpcyBkZXNrdG9wIGFuZCB0aGUgdmF1bHQgaXNcbiAgICogaW5zaWRlIGEgZ2l0IHdvcmsgdHJlZS5cbiAgICpcbiAgICogQHJldHVybnMgV2hldGhlciBidWxrIG9wZXJhdGlvbnMgYXJlIGNvbW1pdHRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGVja0FjdGl2ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRSZXBvKCkgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlcnMgYSBzdGFsZSBsb2NrIGxlZnQgYnkgYSBjcmFzaGVkIG9wZXJhdGlvbiBvbmNlIHRoZSBjb21wb25lbnQgbG9hZHMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IHRoaXMucmVjb3ZlclN0YWxlTG9jaygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgYnVsayBvcGVyYXRpb24sIHdyYXBwZWQgaW4gZ2l0IGNvbW1pdHMgd2hlbiBidWxrLW9wZXJhdGlvbiBjb21taXRzIGFyZSBhY3RpdmUuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW5CdWxrT3BlcmF0aW9uPFQ+KHBhcmFtczogQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudFJ1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCByZXBvID0gYXdhaXQgdGhpcy5nZXRSZXBvKCk7XG4gICAgaWYgKCFyZXBvKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcGFyYW1zLm9wZXJhdGlvbigpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29tbWl0U2hhLCBvcGVyYXRpb25JZCwgcmVzdWx0IH0gPSBhd2FpdCByZXBvLnJ1bkJ1bGtPcGVyYXRpb24oe1xuICAgICAgb3BlcmF0aW9uOiBhc3luYyAoKSA9PiBhd2FpdCBwYXJhbXMub3BlcmF0aW9uKCksXG4gICAgICBwbHVnaW5JZDogdGhpcy5wbHVnaW5JZCxcbiAgICAgIHNldHRsZTogKCkgPT4gdGhpcy5zZXR0bGUoKSxcbiAgICAgIHN1bW1hcnk6IHBhcmFtcy5zdW1tYXJ5XG4gICAgfSk7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudCcpKFxuICAgICAgY29tbWl0U2hhID09PSBudWxsID8gYCR7b3BlcmF0aW9uSWR9IGNoYW5nZWQgbm90aGluZ2AgOiBgJHtvcGVyYXRpb25JZH0gY29tbWl0dGVkIGFzICR7Y29tbWl0U2hhfWBcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogTGV0cyB0aGUgdXNlciBwaWNrIG9uZSBvZiB0aGUgcGx1Z2luJ3MgYnVsayBvcGVyYXRpb25zIGFuZCByZXZlcnRzIGl0cyBjb21taXQuXG4gICAqXG4gICAqIEEgY29uZmxpY3QgaXMgcmVwb3J0ZWQgYW5kIGxlZnQgZm9yIHRoZSB1c2VyIHRvIHJlc29sdmU7IHRoZSByZXZlcnQgaXMgbmV2ZXIgYWJvcnRlZC5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbklkIC0gVGhlIG9wZXJhdGlvbiB0byB1bmRvLCBzdWNoIGFzIGBPUDEyYC4gV2hlbiBvbWl0dGVkLCB0aGUgdXNlciBwaWNrcyBmcm9tIGV2ZXJ5IG9wZXJhdGlvblxuICAgKiBvZiB0aGUgcGx1Z2luLiBXaGVuIHR3byBjb21taXRzIHNoYXJlIHRoZSBpZCAodHdvIG1hY2hpbmVzIG1pbnRlZCBpdCBiZWZvcmUgc3luY2luZyksIHRoZSB1c2VyIHBpY2tzIGJldHdlZW5cbiAgICogdGhlbS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bmRvQnVsa09wZXJhdGlvbihvcGVyYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlcG8gPSBhd2FpdCB0aGlzLmdldFJlcG8oKTtcbiAgICBpZiAoIXJlcG8pIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idWxrT3BlcmF0aW9uLm5vdEFjdGl2ZSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjb21taXRzID0gYXdhaXQgcmVwby5saXN0QnVsa09wZXJhdGlvbkNvbW1pdHModGhpcy5wbHVnaW5JZCk7XG4gICAgaWYgKG9wZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbW1pdHMgPSBjb21taXRzLmZpbHRlcigoY29tbWl0KSA9PiBjb21taXQub3BlcmF0aW9uSWQgPT09IG9wZXJhdGlvbklkKTtcbiAgICB9XG5cbiAgICBpZiAoY29tbWl0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idWxrT3BlcmF0aW9uLm5vT3BlcmF0aW9ucykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1pdCA9IGNvbW1pdHMubGVuZ3RoID09PSAxICYmIG9wZXJhdGlvbklkICE9PSB1bmRlZmluZWRcbiAgICAgID8gZW5zdXJlTm9uTnVsbGFibGUoY29tbWl0c1swXSlcbiAgICAgIDogYXdhaXQgc2VsZWN0SXRlbSh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGl0ZW1zOiBjb21taXRzLFxuICAgICAgICBpdGVtVGV4dEZ1bmN0aW9uOiBmb3JtYXRDb21taXQsXG4gICAgICAgIHBsYWNlaG9sZGVyOiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmJ1bGtPcGVyYXRpb24uc2VsZWN0T3BlcmF0aW9uKVxuICAgICAgfSk7XG4gICAgaWYgKCFjb21taXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmV2ZXJ0UmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXZlcnRSZXN1bHQgPSBhd2FpdCByZXBvLnJldmVydEJ1bGtPcGVyYXRpb25Db21taXQoY29tbWl0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShcbiAgICAgICAgdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idWxrT3BlcmF0aW9uLnJldmVydEZhaWxlZCwgeyBlcnJvcjogZXJyb3JUb1N0cmluZyhlcnJvciksIG9wZXJhdGlvbklkOiBjb21taXQub3BlcmF0aW9uSWQgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHJldmVydFJlc3VsdC5pc0NvbmZsaWN0KSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIuYnVsa09wZXJhdGlvbi5yZXZlcnRDb25mbGljdCwgeyBvcGVyYXRpb25JZDogY29tbWl0Lm9wZXJhdGlvbklkIH0pLCB7XG4gICAgICAgIGlzUGVybWFuZW50OiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIuYnVsa09wZXJhdGlvbi5yZXZlcnRlZCwgeyBvcGVyYXRpb25JZDogY29tbWl0Lm9wZXJhdGlvbklkIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZFJlcG8oKTogUHJvbWlzZTxCdWxrT3BlcmF0aW9uR2l0UmVwbyB8IG51bGw+IHtcbiAgICBpZiAoIVBsYXRmb3JtLmlzRGVza3RvcEFwcCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFwcC52YXVsdC5hZGFwdGVyO1xuICAgIGlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBGaWxlU3lzdGVtQWRhcHRlcikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBDb25kaXRpb25hbCBpbXBvcnQgb2YgdGhlIGRlc2t0b3Atb25seSBnaXQgbGF5ZXI7IHRoaXMgcnVucyBvbmx5IG9uIGRlc2t0b3AsIGtlZXBpbmcgaXRzIE5vZGUgYnVpbHRpbnMgb2ZmXG4gICAgLy8gdGhlIG1vYmlsZSBsb2FkIHBhdGguXG4gICAgY29uc3QgeyBCdWxrT3BlcmF0aW9uR2l0UmVwbzogR2l0UmVwbyB9ID0gYXdhaXQgaW1wb3J0KCcuLi9kZXNrdG9wLWJ1bGstb3BlcmF0aW9uLWdpdC50cycpO1xuICAgIHJldHVybiBhd2FpdCBHaXRSZXBvLm9wZW4oYWRhcHRlci5nZXRCYXNlUGF0aCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmVwbygpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25HaXRSZXBvIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVwb1Byb21pc2UgPz89IHRoaXMuZmluZFJlcG8oKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXBvUHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVjb3ZlclN0YWxlTG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXBvID0gYXdhaXQgdGhpcy5nZXRSZXBvKCk7XG4gICAgaWYgKCFyZXBvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYXdhaXQgcmVwby5yZWNvdmVyU3RhbGVMb2NrKCk7XG4gICAgaWYgKG9wZXJhdGlvbklkICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIuYnVsa09wZXJhdGlvbi5yZWNvdmVyZWRJbnRlcnJ1cHRlZCwgeyBvcGVyYXRpb25JZCB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR0bGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZmx1c2hRdWV1ZSgpO1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nTGlua1VwZGF0ZXModGhpcy5hcHApO1xuICAgIGF3YWl0IGVuc3VyZU1ldGFkYXRhQ2FjaGVSZWFkeSh0aGlzLmFwcCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yUXVpZXRWYXVsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yUXVpZXRWYXVsdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbGFzdENoYW5nZUF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBsYXN0Q2hhbmdlQXQgKyB0aGlzLm1heFNldHRsZVRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICBmdW5jdGlvbiBvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICAgIGxhc3RDaGFuZ2VBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIH1cbiAgICBjb25zdCBldmVudFJlZnM6IEV2ZW50UmVmW10gPSBbXG4gICAgICB0aGlzLmFwcC52YXVsdC5vbignY3JlYXRlJywgb25DaGFuZ2UpLFxuICAgICAgdGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIG9uQ2hhbmdlKSxcbiAgICAgIHRoaXMuYXBwLnZhdWx0Lm9uKCdtb2RpZnknLCBvbkNoYW5nZSksXG4gICAgICB0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgb25DaGFuZ2UpXG4gICAgXTtcbiAgICB0cnkge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBub3cgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgY29uc3QgcXVpZXRSZW1haW5pbmcgPSBsYXN0Q2hhbmdlQXQgKyB0aGlzLnF1aWV0UGVyaW9kSW5NaWxsaXNlY29uZHMgLSBub3c7XG4gICAgICAgIGlmIChxdWlldFJlbWFpbmluZyA8PSAwIHx8IG5vdyA+PSBkZWFkbGluZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXBvcnRCdWxrT3BlcmF0aW9uUHJvZ3Jlc3MoKTtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dEFzeW5jKE1hdGgubWluKHF1aWV0UmVtYWluaW5nLCBkZWFkbGluZSAtIG5vdykpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50UmVmIG9mIGV2ZW50UmVmcykge1xuICAgICAgICB0aGlzLmFwcC52YXVsdC5vZmZyZWYoZXZlbnRSZWYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRDb21taXQoY29tbWl0OiBCdWxrT3BlcmF0aW9uQ29tbWl0KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2NvbW1pdC5zdWJqZWN0fSAoJHtjb21taXQuZGF0ZX0sICR7Y29tbWl0LnNoYS5zbGljZSgwLCBTSE9SVF9TSEFfTEVOR1RIKX0pYDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMseUJBQXlCO0FBQ2xDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBTVAsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyxpQ0FBaUM7QUFDMUMsU0FBUyxTQUFTO0FBQ2xCLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsbUJBQW1CO0FBNkQ1QixNQUFNLDBDQUEwQztBQUNoRCxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLG1CQUFtQjtBQStCbEIsTUFBTSxxQ0FBcUMsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXpDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUEsRUFFRjtBQUFBLEVBQ0E7QUFBQSxFQUNULGNBQTJEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTzVELFlBQVksUUFBdUQ7QUFDeEUsVUFBTTtBQUNOLFNBQUssTUFBTSxPQUFPO0FBQ2xCLFNBQUssWUFBWSxPQUFPO0FBQ3hCLFNBQUssV0FBVyxPQUFPO0FBQ3ZCLFNBQUssd0JBQXdCLE9BQU87QUFDcEMsU0FBSyw4QkFBOEIsT0FBTywrQkFBK0I7QUFDekUsU0FBSyw0QkFBNEIsT0FBTyw2QkFBNkI7QUFBQSxFQUN2RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxjQUFnQztBQUMzQyxXQUFPLE1BQU0sS0FBSyxRQUFRLE1BQU07QUFBQSxFQUNsQztBQUFBO0FBQUE7QUFBQTtB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
@@ -3,6 +3,7 @@ export * as 'abort-signal-component' from './abort-signal-component.mjs';
3
3
  export * as 'all-windows-event-component' from './all-windows-event-component.mjs';
4
4
  export * as 'async-error-handler-component' from './async-error-handler-component.mjs';
5
5
  export * as 'async-events-component' from './async-events-component.mjs';
6
+ export * as 'bulk-operation-commit-component' from './bulk-operation-commit-component.mjs';
6
7
  export * as 'case-insensitive-file-index-component' from './case-insensitive-file-index-component.mjs';
7
8
  export * as 'component-ex' from './component-ex.mjs';
8
9
  export * as 'console-debug-component' from './console-debug-component.mjs';
@@ -7,6 +7,7 @@ import * as abort_signal_component from "./abort-signal-component.mjs";
7
7
  import * as all_windows_event_component from "./all-windows-event-component.mjs";
8
8
  import * as async_error_handler_component from "./async-error-handler-component.mjs";
9
9
  import * as async_events_component from "./async-events-component.mjs";
10
+ import * as bulk_operation_commit_component from "./bulk-operation-commit-component.mjs";
10
11
  import * as case_insensitive_file_index_component from "./case-insensitive-file-index-component.mjs";
11
12
  import * as component_ex from "./component-ex.mjs";
12
13
  import * as console_debug_component from "./console-debug-component.mjs";
@@ -39,6 +40,7 @@ export {
39
40
  all_windows_event_component as "all-windows-event-component",
40
41
  async_error_handler_component as "async-error-handler-component",
41
42
  async_events_component as "async-events-component",
43
+ bulk_operation_commit_component as "bulk-operation-commit-component",
42
44
  case_insensitive_file_index_component as "case-insensitive-file-index-component",
43
45
  component_ex as "component-ex",
44
46
  console_debug_component as "console-debug-component",
@@ -67,4 +69,4 @@ export {
67
69
  syntax_highlighting_component as "syntax-highlighting-component",
68
70
  templates_language_component as "templates-language-component"
69
71
  };
70
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnYWJvcnQtc2lnbmFsLWNvbXBvbmVudCcgZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQnIGZyb20gJy4vYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnYXN5bmMtZXZlbnRzLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdjYXNlLWluc2Vuc2l0aXZlLWZpbGUtaW5kZXgtY29tcG9uZW50JyBmcm9tICcuL2Nhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2NvbXBvbmVudC1leCcgZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuZXhwb3J0ICogYXMgJ2NvbnNvbGUtZGVidWctY29tcG9uZW50JyBmcm9tICcuL2NvbnNvbGUtZGVidWctY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdjb3JlLXBsdWdpbi10b2dnbGUtY29tcG9uZW50JyBmcm9tICcuL2NvcmUtcGx1Z2luLXRvZ2dsZS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2Rpc3Bvc2FibGUtY29tcG9uZW50JyBmcm9tICcuL2Rpc3Bvc2FibGUtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdlbWJlZC1leHRlbnNpb25zLWNvbXBvbmVudCcgZnJvbSAnLi9lbWJlZC1leHRlbnNpb25zLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnZmlsZS1leHBsb3Jlci1yb290LW1lbnUtY29tcG9uZW50JyBmcm9tICcuL2ZpbGUtZXhwbG9yZXItcm9vdC1tZW51LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnZ2VuZXJhdGUtbWFya2Rvd24tbGluay1kZWZhdWx0LXBhcmFtcy1jb21wb25lbnQnIGZyb20gJy4vZ2VuZXJhdGUtbWFya2Rvd24tbGluay1kZWZhdWx0LXBhcmFtcy1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2luY3JlbWVudGFsLWZpbGUtaW5kZXgtY29tcG9uZW50JyBmcm9tICcuL2luY3JlbWVudGFsLWZpbGUtaW5kZXgtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdsYXlvdXQtcmVhZHktY29tcG9uZW50JyBmcm9tICcuL2xheW91dC1yZWFkeS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ21lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudCcgZnJvbSAnLi9tZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ21vbmtleS1hcm91bmQtY29tcG9uZW50JyBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdub3RlYm9vay1uYXZpZ2F0b3ItbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50JyBmcm9tICcuL25vdGVib29rLW5hdmlnYXRvci1tZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1jb250ZXh0LWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tY29udGV4dC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1nYXRlLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tZ2F0ZS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1ub3RpY2UtY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tc2V0dGluZ3MtY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zZXR0aW5ncy10YWItY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1zZXR0aW5ncy10YWItY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tc3VnZ2VzdGlvbi1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLXN1Z2dlc3Rpb24tY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdwb2ludGVyLXBvc2l0aW9uLWNvbXBvbmVudCcgZnJvbSAnLi9wb2ludGVyLXBvc2l0aW9uLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncmVnaXN0cnktY29tcG9uZW50JyBmcm9tICcuL3JlZ2lzdHJ5LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncmVsZWFzZS1ub3Rlcy1jb21wb25lbnQnIGZyb20gJy4vcmVsZWFzZS1ub3Rlcy1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3JlbmFtZS1kZWxldGUtaGFuZGxlci1jb21wb25lbnQnIGZyb20gJy4vcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncm1kaXItZ3VhcmQtY29tcG9uZW50JyBmcm9tICcuL3JtZGlyLWd1YXJkLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnc2V0dGluZ3MtbWlncmF0aW9uLWNvbXBvbmVudCcgZnJvbSAnLi9zZXR0aW5ncy1taWdyYXRpb24tY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdzeW50YXgtaGlnaGxpZ2h0aW5nLWNvbXBvbmVudCcgZnJvbSAnLi9zeW50YXgtaGlnaGxpZ2h0aW5nLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAndGVtcGxhdGVzLWxhbmd1YWdlLWNvbXBvbmVudCcgZnJvbSAnLi90ZW1wbGF0ZXMtbGFuZ3VhZ2UtY29tcG9uZW50LnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBRUEsWUFBWUEsNEJBQThCO0FBQzFDLFlBQVlDLGlDQUFtQztBQUMvQyxZQUFZQyxtQ0FBcUM7QUFDakQsWUFBWUMsNEJBQThCO0FBQzFDLFlBQVlDLDJDQUE2QztBQUN6RCxZQUFZQyxrQkFBb0I7QUFDaEMsWUFBWUMsNkJBQStCO0FBQzNDLFlBQVlDLGtDQUFvQztBQUNoRCxZQUFZQywwQkFBNEI7QUFDeEMsWUFBWUMsZ0NBQWtDO0FBQzlDLFlBQVlDLHVDQUF5QztBQUNyRCxZQUFZQyxxREFBdUQ7QUFDbkUsWUFBWUMsc0NBQXdDO0FBQ3BELFlBQVlDLDRCQUE4QjtBQUMxQyxZQUFZQyxvQ0FBc0M7QUFDbEQsWUFBWUMsNkJBQStCO0FBQzNDLFlBQVlDLHVEQUF5RDtBQUNyRSxZQUFZQyw4QkFBZ0M7QUFDNUMsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVlDLDZCQUErQjtBQUMzQyxZQUFZQywrQkFBaUM7QUFDN0MsWUFBWUMsbUNBQXFDO0FBQ2pELFlBQVlDLGlDQUFtQztBQUMvQyxZQUFZQyxnQ0FBa0M7QUFDOUMsWUFBWUMsd0JBQTBCO0FBQ3RDLFlBQVlDLDZCQUErQjtBQUMzQyxZQUFZQyxxQ0FBdUM7QUFDbkQsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVlDLGtDQUFvQztBQUNoRCxZQUFZQyxtQ0FBcUM7QUFDakQsWUFBWUMsa0NBQW9DOyIsCiAgIm5hbWVzIjogWyJhYm9ydC1zaWduYWwtY29tcG9uZW50IiwgImFsbC13aW5kb3dzLWV2ZW50LWNvbXBvbmVudCIsICJhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCIsICJhc3luYy1ldmVudHMtY29tcG9uZW50IiwgImNhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC1jb21wb25lbnQiLCAiY29tcG9uZW50LWV4IiwgImNvbnNvbGUtZGVidWctY29tcG9uZW50IiwgImNvcmUtcGx1Z2luLXRvZ2dsZS1jb21wb25lbnQiLCAiZGlzcG9zYWJsZS1jb21wb25lbnQiLCAiZW1iZWQtZXh0ZW5zaW9ucy1jb21wb25lbnQiLCAiZmlsZS1leHBsb3Jlci1yb290LW1lbnUtY29tcG9uZW50IiwgImdlbmVyYXRlLW1hcmtkb3duLWxpbmstZGVmYXVsdC1wYXJhbXMtY29tcG9uZW50IiwgImluY3JlbWVudGFsLWZpbGUtaW5kZXgtY29tcG9uZW50IiwgImxheW91dC1yZWFkeS1jb21wb25lbnQiLCAibWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50IiwgIm1vbmtleS1hcm91bmQtY29tcG9uZW50IiwgIm5vdGVib29rLW5hdmlnYXRvci1tZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQiLCAicGx1Z2luLWNvbnRleHQtY29tcG9uZW50IiwgInBsdWdpbi1nYXRlLWNvbXBvbmVudCIsICJwbHVnaW4tbm90aWNlLWNvbXBvbmVudCIsICJwbHVnaW4tc2V0dGluZ3MtY29tcG9uZW50IiwgInBsdWdpbi1zZXR0aW5ncy10YWItY29tcG9uZW50IiwgInBsdWdpbi1zdWdnZXN0aW9uLWNvbXBvbmVudCIsICJwb2ludGVyLXBvc2l0aW9uLWNvbXBvbmVudCIsICJyZWdpc3RyeS1jb21wb25lbnQiLCAicmVsZWFzZS1ub3Rlcy1jb21wb25lbnQiLCAicmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudCIsICJybWRpci1ndWFyZC1jb21wb25lbnQiLCAic2V0dGluZ3MtbWlncmF0aW9uLWNvbXBvbmVudCIsICJzeW50YXgtaGlnaGxpZ2h0aW5nLWNvbXBvbmVudCIsICJ0ZW1wbGF0ZXMtbGFuZ3VhZ2UtY29tcG9uZW50Il0KfQo=
72
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnYWJvcnQtc2lnbmFsLWNvbXBvbmVudCcgZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQnIGZyb20gJy4vYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnYXN5bmMtZXZlbnRzLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdidWxrLW9wZXJhdGlvbi1jb21taXQtY29tcG9uZW50JyBmcm9tICcuL2J1bGstb3BlcmF0aW9uLWNvbW1pdC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2Nhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC1jb21wb25lbnQnIGZyb20gJy4vY2FzZS1pbnNlbnNpdGl2ZS1maWxlLWluZGV4LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnY29tcG9uZW50LWV4JyBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5leHBvcnQgKiBhcyAnY29uc29sZS1kZWJ1Zy1jb21wb25lbnQnIGZyb20gJy4vY29uc29sZS1kZWJ1Zy1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2NvcmUtcGx1Z2luLXRvZ2dsZS1jb21wb25lbnQnIGZyb20gJy4vY29yZS1wbHVnaW4tdG9nZ2xlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnZGlzcG9zYWJsZS1jb21wb25lbnQnIGZyb20gJy4vZGlzcG9zYWJsZS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2VtYmVkLWV4dGVuc2lvbnMtY29tcG9uZW50JyBmcm9tICcuL2VtYmVkLWV4dGVuc2lvbnMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdmaWxlLWV4cGxvcmVyLXJvb3QtbWVudS1jb21wb25lbnQnIGZyb20gJy4vZmlsZS1leHBsb3Jlci1yb290LW1lbnUtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdnZW5lcmF0ZS1tYXJrZG93bi1saW5rLWRlZmF1bHQtcGFyYW1zLWNvbXBvbmVudCcgZnJvbSAnLi9nZW5lcmF0ZS1tYXJrZG93bi1saW5rLWRlZmF1bHQtcGFyYW1zLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnaW5jcmVtZW50YWwtZmlsZS1pbmRleC1jb21wb25lbnQnIGZyb20gJy4vaW5jcmVtZW50YWwtZmlsZS1pbmRleC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2xheW91dC1yZWFkeS1jb21wb25lbnQnIGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50JyBmcm9tICcuL21lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnbW9ua2V5LWFyb3VuZC1jb21wb25lbnQnIGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ25vdGVib29rLW5hdmlnYXRvci1tZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQnIGZyb20gJy4vbm90ZWJvb2stbmF2aWdhdG9yLW1lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWNvbnRleHQtY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1jb250ZXh0LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWdhdGUtY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLW5vdGljZS1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zdWdnZXN0aW9uLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tc3VnZ2VzdGlvbi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BvaW50ZXItcG9zaXRpb24tY29tcG9uZW50JyBmcm9tICcuL3BvaW50ZXItcG9zaXRpb24tY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdyZWdpc3RyeS1jb21wb25lbnQnIGZyb20gJy4vcmVnaXN0cnktY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdyZWxlYXNlLW5vdGVzLWNvbXBvbmVudCcgZnJvbSAnLi9yZWxlYXNlLW5vdGVzLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9yZW5hbWUtZGVsZXRlLWhhbmRsZXItY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdybWRpci1ndWFyZC1jb21wb25lbnQnIGZyb20gJy4vcm1kaXItZ3VhcmQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdzZXR0aW5ncy1taWdyYXRpb24tY29tcG9uZW50JyBmcm9tICcuL3NldHRpbmdzLW1pZ3JhdGlvbi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3N5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50JyBmcm9tICcuL3N5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICd0ZW1wbGF0ZXMtbGFuZ3VhZ2UtY29tcG9uZW50JyBmcm9tICcuL3RlbXBsYXRlcy1sYW5ndWFnZS1jb21wb25lbnQudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFFQSxZQUFZQSw0QkFBOEI7QUFDMUMsWUFBWUMsaUNBQW1DO0FBQy9DLFlBQVlDLG1DQUFxQztBQUNqRCxZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMscUNBQXVDO0FBQ25ELFlBQVlDLDJDQUE2QztBQUN6RCxZQUFZQyxrQkFBb0I7QUFDaEMsWUFBWUMsNkJBQStCO0FBQzNDLFlBQVlDLGtDQUFvQztBQUNoRCxZQUFZQywwQkFBNEI7QUFDeEMsWUFBWUMsZ0NBQWtDO0FBQzlDLFlBQVlDLHVDQUF5QztBQUNyRCxZQUFZQyxxREFBdUQ7QUFDbkUsWUFBWUMsc0NBQXdDO0FBQ3BELFlBQVlDLDRCQUE4QjtBQUMxQyxZQUFZQyxvQ0FBc0M7QUFDbEQsWUFBWUMsNkJBQStCO0FBQzNDLFlBQVlDLHVEQUF5RDtBQUNyRSxZQUFZQyw4QkFBZ0M7QUFDNUMsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVlDLDZCQUErQjtBQUMzQyxZQUFZQywrQkFBaUM7QUFDN0MsWUFBWUMsbUNBQXFDO0FBQ2pELFlBQVlDLGlDQUFtQztBQUMvQyxZQUFZQyxnQ0FBa0M7QUFDOUMsWUFBWUMsd0JBQTBCO0FBQ3RDLFlBQVlDLDZCQUErQjtBQUMzQyxZQUFZQyxxQ0FBdUM7QUFDbkQsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVlDLGtDQUFvQztBQUNoRCxZQUFZQyxtQ0FBcUM7QUFDakQsWUFBWUMsa0NBQW9DOyIsCiAgIm5hbWVzIjogWyJhYm9ydC1zaWduYWwtY29tcG9uZW50IiwgImFsbC13aW5kb3dzLWV2ZW50LWNvbXBvbmVudCIsICJhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCIsICJhc3luYy1ldmVudHMtY29tcG9uZW50IiwgImJ1bGstb3BlcmF0aW9uLWNvbW1pdC1jb21wb25lbnQiLCAiY2FzZS1pbnNlbnNpdGl2ZS1maWxlLWluZGV4LWNvbXBvbmVudCIsICJjb21wb25lbnQtZXgiLCAiY29uc29sZS1kZWJ1Zy1jb21wb25lbnQiLCAiY29yZS1wbHVnaW4tdG9nZ2xlLWNvbXBvbmVudCIsICJkaXNwb3NhYmxlLWNvbXBvbmVudCIsICJlbWJlZC1leHRlbnNpb25zLWNvbXBvbmVudCIsICJmaWxlLWV4cGxvcmVyLXJvb3QtbWVudS1jb21wb25lbnQiLCAiZ2VuZXJhdGUtbWFya2Rvd24tbGluay1kZWZhdWx0LXBhcmFtcy1jb21wb25lbnQiLCAiaW5jcmVtZW50YWwtZmlsZS1pbmRleC1jb21wb25lbnQiLCAibGF5b3V0LXJlYWR5LWNvbXBvbmVudCIsICJtZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQiLCAibW9ua2V5LWFyb3VuZC1jb21wb25lbnQiLCAibm90ZWJvb2stbmF2aWdhdG9yLW1lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudCIsICJwbHVnaW4tY29udGV4dC1jb21wb25lbnQiLCAicGx1Z2luLWdhdGUtY29tcG9uZW50IiwgInBsdWdpbi1ub3RpY2UtY29tcG9uZW50IiwgInBsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQiLCAicGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQiLCAicGx1Z2luLXN1Z2dlc3Rpb24tY29tcG9uZW50IiwgInBvaW50ZXItcG9zaXRpb24tY29tcG9uZW50IiwgInJlZ2lzdHJ5LWNvbXBvbmVudCIsICJyZWxlYXNlLW5vdGVzLWNvbXBvbmVudCIsICJyZW5hbWUtZGVsZXRlLWhhbmRsZXItY29tcG9uZW50IiwgInJtZGlyLWd1YXJkLWNvbXBvbmVudCIsICJzZXR0aW5ncy1taWdyYXRpb24tY29tcG9uZW50IiwgInN5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50IiwgInRlbXBsYXRlcy1sYW5ndWFnZS1jb21wb25lbnQiXQp9Cg==
@@ -64,7 +64,6 @@ class LocalDataStore {
64
64
  for (const [key, value] of params.entries) {
65
65
  store.put(value, key);
66
66
  }
67
- return store.count();
68
67
  });
69
68
  }
70
69
  /**
@@ -159,7 +158,7 @@ class LocalDataStore {
159
158
  return;
160
159
  }
161
160
  transaction.oncomplete = () => {
162
- resolve(request.result);
161
+ resolve(request?.result);
163
162
  };
164
163
  transaction.addEventListener("abort", () => {
165
164
  reject(new Error("Local data-store transaction aborted", { cause: transaction.error }));
@@ -170,4 +169,4 @@ class LocalDataStore {
170
169
  export {
171
170
  LocalDataStore
172
171
  };
173
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RhdGEtc3RvcmVzL2xvY2FsLWRhdGEtc3RvcmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGVzbGludC1kaXNhYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGVzZSBhcmUgT2JzaWRpYW4gcmVuZGVyZXIgV2ViIEFQSXMsIG5vdCBOb2RlIGJ1aWx0aW5zLiAqL1xuLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlY29yZC1iYXNlZCBkZXZpY2UtbG9jYWwgcGVyc2lzdGVuY2UsIGlzb2xhdGVkIGJ5IHZhdWx0LCBwbHVnaW4gYW5kIHN0b3JlLlxuICovXG5cbi8qKlxuICogQXRvbWljIG11dGF0aW9ucyBvZiBhIGxvY2FsIHJlY29yZCBzdG9yZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbERhdGFTdG9yZUNvbW1pdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBLZXkvdmFsdWUgcGFpcnMgdG8gd3JpdGUuXG4gICAqL1xuICByZWFkb25seSBlbnRyaWVzOiByZWFkb25seSAocmVhZG9ubHkgW3N0cmluZywgdW5rbm93bl0pW107XG4gIC8qKlxuICAgKiBLZXlzIHJlbW92ZWQgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMgdGhlIHdyaXRlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYFtdYFxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZlZEtleXM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIERlbGV0ZXMgZXZlcnkgcmVjb3JkIG9mIHRoaXMgc3RvcmUgZmlyc3QsIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uIGFzIHRoZSB3cml0ZXMuXG4gICAqXG4gICAqIEVpdGhlciB0aGUgc3RvcmUgaXMgcmVwbGFjZWQgYnkgYGVudHJpZXNgIGFzIGEgd2hvbGUsIG9yLCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBmYWlscywgZXZlcnkgcHJldmlvdXMgcmVjb3JkIHN1cnZpdmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRDbGVhcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Igb3BlbmluZyBhIGxvY2FsIHN0b3JlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsRGF0YVN0b3JlT3BlblBhcmFtcyB7XG4gIC8qKlxuICAgKiBJbmRleGVkREIgaW1wbGVtZW50YXRpb24sIGluamVjdGFibGUgZm9yIHRlc3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmFjdG9yeT86IElEQkZhY3Rvcnk7XG4gIC8qKlxuICAgKiBQbHVnaW4gbWFuaWZlc3QgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RvcmUgbmFtZSBhbmQgc2NoZW1hIHZlcnNpb24gY2hvc2VuIGJ5IHRoZSBjb25zdW1lci5cbiAgICovXG4gIHJlYWRvbmx5IHN0b3JlSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFN0YWJsZSwgZGV2aWNlLWxvY2FsIHZhdWx0IGlkZW50aXR5OyBuZXZlciB0aGUgdmF1bHQgZGlzcGxheSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgbG9jYWwgc3RvcmUgaG9sZHMgc3RydWN0dXJlZC1jbG9uZWFibGUgdmFsdWVzOyBpdCBuZXZlciB3cml0ZXMgdG8gdGhlIHZhdWx0LlxuICovXG5leHBvcnQgY2xhc3MgTG9jYWxEYXRhU3RvcmUge1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGF0YWJhc2U6IElEQkRhdGFiYXNlKSB7fVxuXG4gIC8qKlxuICAgKiBPcGVucyBhbiBpc29sYXRlZCBkYXRhYmFzZS4gV3JpdGVzIHJlc29sdmUgb25seSBvbmNlIHRoZWlyIHRyYW5zYWN0aW9uIGNvbW1pdHMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBTdG9yZSBpZGVudGl0eSBhbmQgb3B0aW9uYWwgSW5kZXhlZERCIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgY29ubmVjdGVkIHN0b3JlOyBjbG9zZSBpdCB3aGVuIGl0cyBvd25lciB1bmxvYWRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBvcGVuKHBhcmFtczogTG9jYWxEYXRhU3RvcmVPcGVuUGFyYW1zKTogUHJvbWlzZTxMb2NhbERhdGFTdG9yZT4ge1xuICAgIGNvbnN0IG5hbWUgPSBgb2JzaWRpYW4tbGliOiR7SlNPTi5zdHJpbmdpZnkoW3BhcmFtcy52YXVsdElkLCBwYXJhbXMucGx1Z2luSWQsIHBhcmFtcy5zdG9yZUlkXSl9YDtcbiAgICBjb25zdCByZXF1ZXN0ID0gKHBhcmFtcy5mYWN0b3J5ID8/IGluZGV4ZWREQikub3BlbihuYW1lLCAxKTtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlcXVlc3QucmVzdWx0LmNyZWF0ZU9iamVjdFN0b3JlKCdyZWNvcmRzJyk7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IG9wZW4gbG9jYWwgZGF0YSBzdG9yZScsIHsgY2F1c2U6IHJlcXVlc3QuZXJyb3IgfSkpO1xuICAgICAgfSk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgZGF0YWJhc2UgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgZGF0YWJhc2Uub252ZXJzaW9uY2hhbmdlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIGRhdGFiYXNlLmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHJlc29sdmUobmV3IExvY2FsRGF0YVN0b3JlKGRhdGFiYXNlKSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgZXZlcnkgcmVjb3JkIGluIHRoaXMgc3RvcmUgb25seS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmNsZWFyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGlzIGNvbm5lY3Rpb24gd2l0aG91dCBkZWxldGluZyBpdHMgcmVjb3Jkcy5cbiAgICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFiYXNlLmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0cyBzZXZlcmFsIHJlY29yZCBjaGFuZ2VzIGF0b21pY2FsbHkgd2l0aG91dCBzZXJpYWxpemluZyB0aGUgcmVzdCBvZiB0aGUgZGF0YWJhc2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBXcml0ZXMgYW5kIGRlbGV0aW9ucyBpbiBvbmUgdHJhbnNhY3Rpb24sIG9wdGlvbmFsbHkgYWZ0ZXIgY2xlYXJpbmcgdGhlIHN0b3JlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmx5IGFmdGVyIGFsbCBjaGFuZ2VzIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb21taXQocGFyYW1zOiBMb2NhbERhdGFTdG9yZUNvbW1pdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgIGlmIChwYXJhbXMuc2hvdWxkQ2xlYXIpIHtcbiAgICAgICAgc3RvcmUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHBhcmFtcy5yZW1vdmVkS2V5cyA/PyBbXSkge1xuICAgICAgICBzdG9yZS5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHBhcmFtcy5lbnRyaWVzKSB7XG4gICAgICAgIHN0b3JlLnB1dCh2YWx1ZSwga2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdG9yZS5jb3VudCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSByZWNvcmQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBSZWNvcmQga2V5LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5ydW4oJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4gc3RvcmUuZGVsZXRlKGtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFsbCByZWNvcmRzIGluIGtleSBvcmRlci5cbiAgICpcbiAgICogQHJldHVybnMgRGV0YWNoZWQga2V5L3ZhbHVlIHBhaXJzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVudHJpZXMoKTogUHJvbWlzZTxbc3RyaW5nLCB1bmtub3duXVtdPiB7XG4gICAgY29uc3QgcmVjb3JkczogW3N0cmluZywgdW5rbm93bl1bXSA9IFtdO1xuICAgIC8vIFR3byBidWxrIHJlYWRzIGluIG9uZSB0cmFuc2FjdGlvbiBzZWUgdGhlIHNhbWUgc25hcHNob3QgaW4gdGhlIHNhbWUga2V5IG9yZGVyLCBzbyB0aGV5IHBhaXIgdXAgYnkgaW5kZXguXG4gICAgLy8gQSBjdXJzb3IgZGlzcGF0Y2hlcyBvbmUgZXZlbnQgcGVyIHJlY29yZCBpbnN0ZWFkOyBhdCA5MCwwMDAgcmVjb3JkcyBpbiBPYnNpZGlhbiBpdCB0b29rIDEuNSB0byAyIHRpbWVzIGFzIGxvbmcuXG4gICAgYXdhaXQgdGhpcy5ydW4oJ3JlYWRvbmx5JywgKHN0b3JlKSA9PiB7XG4gICAgICBjb25zdCBrZXlzUmVxdWVzdCA9IHN0b3JlLmdldEFsbEtleXMoKTtcbiAgICAgIGNvbnN0IHZhbHVlc1JlcXVlc3QgPSBzdG9yZS5nZXRBbGwoKTtcbiAgICAgIHZhbHVlc1JlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBrZXlzID0ga2V5c1JlcXVlc3QucmVzdWx0O1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZXNSZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGtleV0gb2Yga2V5cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0xvY2FsIGRhdGEtc3RvcmUga2V5IGlzIG5vdCBhIHN0cmluZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWNvcmRzLnB1c2goW2tleSwgdmFsdWVzW2luZGV4XV0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHZhbHVlc1JlcXVlc3Q7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlY29yZHM7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIHNoYXJlZC1zdG9yZSBvcGVyYXRpb24gYWNyb3NzIGNvbm5lY3Rpb25zLCB3aW5kb3dzIGFuZCBidW5kbGVkIGxpYnJhcnkgY29waWVzLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBDYWxsYmFjayByZXN1bHQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFdvcmsgcGVyZm9ybWVkIHdoaWxlIGhvbGRpbmcgdGhpcyBkYXRhYmFzZSdzIFdlYiBMb2NrLlxuICAgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgcmVzdWx0IGFmdGVyIHJlbGVhc2luZyB0aGUgbG9jay5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBleGNsdXNpdmU8VD4oY2FsbGJhY2s6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gYXdhaXQgd2luZG93Lm5hdmlnYXRvci5sb2Nrcy5yZXF1ZXN0KHRoaXMuZGF0YWJhc2UubmFtZSwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgcmVjb3JkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleS5cbiAgICogQHJldHVybnMgSXRzIHZhbHVlLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW48dW5rbm93bj4oJ3JlYWRvbmx5JywgKHN0b3JlKSA9PiBzdG9yZS5nZXQoa2V5KSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgYSByZWNvcmQgb25jZSwgYXRvbWljYWxseSBhY3Jvc3MgY29ubmVjdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBSZWNvcmQga2V5LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB1c2VkIG9ubHkgd2hlbiB0aGUga2V5IGlzIGFic2VudC5cbiAgICogQHJldHVybnMgVGhlIGV4aXN0aW5nIG9yIG5ld2x5IGNvbW1pdHRlZCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRPckNyZWF0ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW48dW5rbm93bj4oJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLmdldChrZXkpO1xuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChyZXF1ZXN0LnJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc3RvcmUucHV0KHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfSkudGhlbigoZXhpc3RpbmcpID0+IGV4aXN0aW5nID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGV4aXN0aW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgYSBzdHJ1Y3R1cmVkLWNsb25lYWJsZSB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHBlcnNpc3QuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5ydW4oJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4gc3RvcmUucHV0KHZhbHVlLCBrZXkpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuPFQ+KG1vZGU6IElEQlRyYW5zYWN0aW9uTW9kZSwgYWN0aW9uOiAoc3RvcmU6IElEQk9iamVjdFN0b3JlKSA9PiBJREJSZXF1ZXN0PFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZS50cmFuc2FjdGlvbigncmVjb3JkcycsIG1vZGUpO1xuICAgICAgbGV0IHJlcXVlc3Q6IElEQlJlcXVlc3Q8VD47XG4gICAgICB0cnkge1xuICAgICAgICByZXF1ZXN0ID0gYWN0aW9uKHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKCdyZWNvcmRzJykpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uYWJvcnQoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcignTG9jYWwgZGF0YS1zdG9yZSB0cmFuc2FjdGlvbiBmYWlsZWQnLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlc29sdmUocmVxdWVzdC5yZXN1bHQpO1xuICAgICAgfTtcbiAgICAgIHRyYW5zYWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCk6IHZvaWQgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdMb2NhbCBkYXRhLXN0b3JlIHRyYW5zYWN0aW9uIGFib3J0ZWQnLCB7IGNhdXNlOiB0cmFuc2FjdGlvbi5lcnJvciB9KSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKiBlc2xpbnQtZW5hYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGVzZSBhcmUgT2JzaWRpYW4gcmVuZGVyZXIgV2ViIEFQSXMsIG5vdCBOb2RlIGJ1aWx0aW5zLiAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUF3RE8sTUFBTSxlQUFlO0FBQUEsRUFDbEIsWUFBNkIsVUFBdUI7QUFBdkI7QUFBQSxFQUF3QjtBQUFBLEVBQXhCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRckMsYUFBb0IsS0FBSyxRQUEyRDtBQUNsRixVQUFNLE9BQU8sZ0JBQWdCLEtBQUssVUFBVSxDQUFDLE9BQU8sU0FBUyxPQUFPLFVBQVUsT0FBTyxPQUFPLENBQUMsQ0FBQztBQUM5RixVQUFNLFdBQVcsT0FBTyxXQUFXLFdBQVcsS0FBSyxNQUFNLENBQUM7QUFDMUQsV0FBTyxNQUFNLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUM1QyxjQUFRLGtCQUFrQixNQUFZO0FBQ3BDLGdCQUFRLE9BQU8sa0JBQWtCLFNBQVM7QUFBQSxN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
172
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RhdGEtc3RvcmVzL2xvY2FsLWRhdGEtc3RvcmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGVzbGludC1kaXNhYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGVzZSBhcmUgT2JzaWRpYW4gcmVuZGVyZXIgV2ViIEFQSXMsIG5vdCBOb2RlIGJ1aWx0aW5zLiAqL1xuLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlY29yZC1iYXNlZCBkZXZpY2UtbG9jYWwgcGVyc2lzdGVuY2UsIGlzb2xhdGVkIGJ5IHZhdWx0LCBwbHVnaW4gYW5kIHN0b3JlLlxuICovXG5cbi8qKlxuICogQXRvbWljIG11dGF0aW9ucyBvZiBhIGxvY2FsIHJlY29yZCBzdG9yZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbERhdGFTdG9yZUNvbW1pdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBLZXkvdmFsdWUgcGFpcnMgdG8gd3JpdGUuXG4gICAqL1xuICByZWFkb25seSBlbnRyaWVzOiByZWFkb25seSAocmVhZG9ubHkgW3N0cmluZywgdW5rbm93bl0pW107XG4gIC8qKlxuICAgKiBLZXlzIHJlbW92ZWQgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMgdGhlIHdyaXRlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYFtdYFxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZlZEtleXM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIERlbGV0ZXMgZXZlcnkgcmVjb3JkIG9mIHRoaXMgc3RvcmUgZmlyc3QsIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uIGFzIHRoZSB3cml0ZXMuXG4gICAqXG4gICAqIEVpdGhlciB0aGUgc3RvcmUgaXMgcmVwbGFjZWQgYnkgYGVudHJpZXNgIGFzIGEgd2hvbGUsIG9yLCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBmYWlscywgZXZlcnkgcHJldmlvdXMgcmVjb3JkIHN1cnZpdmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRDbGVhcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Igb3BlbmluZyBhIGxvY2FsIHN0b3JlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsRGF0YVN0b3JlT3BlblBhcmFtcyB7XG4gIC8qKlxuICAgKiBJbmRleGVkREIgaW1wbGVtZW50YXRpb24sIGluamVjdGFibGUgZm9yIHRlc3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmFjdG9yeT86IElEQkZhY3Rvcnk7XG4gIC8qKlxuICAgKiBQbHVnaW4gbWFuaWZlc3QgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RvcmUgbmFtZSBhbmQgc2NoZW1hIHZlcnNpb24gY2hvc2VuIGJ5IHRoZSBjb25zdW1lci5cbiAgICovXG4gIHJlYWRvbmx5IHN0b3JlSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFN0YWJsZSwgZGV2aWNlLWxvY2FsIHZhdWx0IGlkZW50aXR5OyBuZXZlciB0aGUgdmF1bHQgZGlzcGxheSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgbG9jYWwgc3RvcmUgaG9sZHMgc3RydWN0dXJlZC1jbG9uZWFibGUgdmFsdWVzOyBpdCBuZXZlciB3cml0ZXMgdG8gdGhlIHZhdWx0LlxuICovXG5leHBvcnQgY2xhc3MgTG9jYWxEYXRhU3RvcmUge1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGF0YWJhc2U6IElEQkRhdGFiYXNlKSB7fVxuXG4gIC8qKlxuICAgKiBPcGVucyBhbiBpc29sYXRlZCBkYXRhYmFzZS4gV3JpdGVzIHJlc29sdmUgb25seSBvbmNlIHRoZWlyIHRyYW5zYWN0aW9uIGNvbW1pdHMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBTdG9yZSBpZGVudGl0eSBhbmQgb3B0aW9uYWwgSW5kZXhlZERCIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgY29ubmVjdGVkIHN0b3JlOyBjbG9zZSBpdCB3aGVuIGl0cyBvd25lciB1bmxvYWRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBvcGVuKHBhcmFtczogTG9jYWxEYXRhU3RvcmVPcGVuUGFyYW1zKTogUHJvbWlzZTxMb2NhbERhdGFTdG9yZT4ge1xuICAgIGNvbnN0IG5hbWUgPSBgb2JzaWRpYW4tbGliOiR7SlNPTi5zdHJpbmdpZnkoW3BhcmFtcy52YXVsdElkLCBwYXJhbXMucGx1Z2luSWQsIHBhcmFtcy5zdG9yZUlkXSl9YDtcbiAgICBjb25zdCByZXF1ZXN0ID0gKHBhcmFtcy5mYWN0b3J5ID8/IGluZGV4ZWREQikub3BlbihuYW1lLCAxKTtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlcXVlc3QucmVzdWx0LmNyZWF0ZU9iamVjdFN0b3JlKCdyZWNvcmRzJyk7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IG9wZW4gbG9jYWwgZGF0YSBzdG9yZScsIHsgY2F1c2U6IHJlcXVlc3QuZXJyb3IgfSkpO1xuICAgICAgfSk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgZGF0YWJhc2UgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgZGF0YWJhc2Uub252ZXJzaW9uY2hhbmdlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIGRhdGFiYXNlLmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHJlc29sdmUobmV3IExvY2FsRGF0YVN0b3JlKGRhdGFiYXNlKSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgZXZlcnkgcmVjb3JkIGluIHRoaXMgc3RvcmUgb25seS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmNsZWFyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGlzIGNvbm5lY3Rpb24gd2l0aG91dCBkZWxldGluZyBpdHMgcmVjb3Jkcy5cbiAgICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFiYXNlLmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0cyBzZXZlcmFsIHJlY29yZCBjaGFuZ2VzIGF0b21pY2FsbHkgd2l0aG91dCBzZXJpYWxpemluZyB0aGUgcmVzdCBvZiB0aGUgZGF0YWJhc2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBXcml0ZXMgYW5kIGRlbGV0aW9ucyBpbiBvbmUgdHJhbnNhY3Rpb24sIG9wdGlvbmFsbHkgYWZ0ZXIgY2xlYXJpbmcgdGhlIHN0b3JlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmx5IGFmdGVyIGFsbCBjaGFuZ2VzIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb21taXQocGFyYW1zOiBMb2NhbERhdGFTdG9yZUNvbW1pdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgIGlmIChwYXJhbXMuc2hvdWxkQ2xlYXIpIHtcbiAgICAgICAgc3RvcmUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHBhcmFtcy5yZW1vdmVkS2V5cyA/PyBbXSkge1xuICAgICAgICBzdG9yZS5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHBhcmFtcy5lbnRyaWVzKSB7XG4gICAgICAgIHN0b3JlLnB1dCh2YWx1ZSwga2V5KTtcbiAgICAgIH1cbiAgICAgIC8vIE5vIHJlcXVlc3QgdG8gcmVzb2x2ZSB3aXRoOiBhIGNsb3NpbmcgYHN0b3JlLmNvdW50KClgIHdvdWxkIHdhbGsgZXZlcnkgcmVjb3JkIG9mIHRoZSBzdG9yZSBvbiBlYWNoIGNvbW1pdC5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGEgcmVjb3JkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmRlbGV0ZShrZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbGwgcmVjb3JkcyBpbiBrZXkgb3JkZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIERldGFjaGVkIGtleS92YWx1ZSBwYWlycy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnRyaWVzKCk6IFByb21pc2U8W3N0cmluZywgdW5rbm93bl1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXTtcbiAgICAvLyBUd28gYnVsayByZWFkcyBpbiBvbmUgdHJhbnNhY3Rpb24gc2VlIHRoZSBzYW1lIHNuYXBzaG90IGluIHRoZSBzYW1lIGtleSBvcmRlciwgc28gdGhleSBwYWlyIHVwIGJ5IGluZGV4LlxuICAgIC8vIEEgY3Vyc29yIGRpc3BhdGNoZXMgb25lIGV2ZW50IHBlciByZWNvcmQgaW5zdGVhZDsgYXQgOTAsMDAwIHJlY29yZHMgaW4gT2JzaWRpYW4gaXQgdG9vayAxLjUgdG8gMiB0aW1lcyBhcyBsb25nLlxuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkb25seScsIChzdG9yZSkgPT4ge1xuICAgICAgY29uc3Qga2V5c1JlcXVlc3QgPSBzdG9yZS5nZXRBbGxLZXlzKCk7XG4gICAgICBjb25zdCB2YWx1ZXNSZXF1ZXN0ID0gc3RvcmUuZ2V0QWxsKCk7XG4gICAgICB2YWx1ZXNSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3Qga2V5cyA9IGtleXNSZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdmFsdWVzUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBrZXldIG9mIGtleXMuZW50cmllcygpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMb2NhbCBkYXRhLXN0b3JlIGtleSBpcyBub3QgYSBzdHJpbmcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVjb3Jkcy5wdXNoKFtrZXksIHZhbHVlc1tpbmRleF1dKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiB2YWx1ZXNSZXF1ZXN0O1xuICAgIH0pO1xuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBzaGFyZWQtc3RvcmUgb3BlcmF0aW9uIGFjcm9zcyBjb25uZWN0aW9ucywgd2luZG93cyBhbmQgYnVuZGxlZCBsaWJyYXJ5IGNvcGllcy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBXb3JrIHBlcmZvcm1lZCB3aGlsZSBob2xkaW5nIHRoaXMgZGF0YWJhc2UncyBXZWIgTG9jay5cbiAgICogQHJldHVybnMgVGhlIGNhbGxiYWNrIHJlc3VsdCBhZnRlciByZWxlYXNpbmcgdGhlIGxvY2suXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhjbHVzaXZlPFQ+KGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIGF3YWl0IHdpbmRvdy5uYXZpZ2F0b3IubG9ja3MucmVxdWVzdCh0aGlzLmRhdGFiYXNlLm5hbWUsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHJlY29yZC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkuXG4gICAqIEByZXR1cm5zIEl0cyB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuPHVua25vd24+KCdyZWFkb25seScsIChzdG9yZSkgPT4gc3RvcmUuZ2V0KGtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGEgcmVjb3JkIG9uY2UsIGF0b21pY2FsbHkgYWNyb3NzIGNvbm5lY3Rpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleS5cbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdXNlZCBvbmx5IHdoZW4gdGhlIGtleSBpcyBhYnNlbnQuXG4gICAqIEByZXR1cm5zIFRoZSBleGlzdGluZyBvciBuZXdseSBjb21taXR0ZWQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0T3JDcmVhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuPHVua25vd24+KCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAocmVxdWVzdC5yZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHN0b3JlLnB1dCh2YWx1ZSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH0pLnRoZW4oKGV4aXN0aW5nKSA9PiBleGlzdGluZyA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBleGlzdGluZyk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgc3RydWN0dXJlZC1jbG9uZWFibGUgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBSZWNvcmQga2V5LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBwZXJzaXN0LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLnB1dCh2YWx1ZSwga2V5KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bjxUPihtb2RlOiBJREJUcmFuc2FjdGlvbk1vZGUsIGFjdGlvbjogKHN0b3JlOiBJREJPYmplY3RTdG9yZSkgPT4gSURCUmVxdWVzdDxUPiB8IHVuZGVmaW5lZCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24oJ3JlY29yZHMnLCBtb2RlKTtcbiAgICAgIGxldCByZXF1ZXN0OiBJREJSZXF1ZXN0PFQ+IHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVxdWVzdCA9IGFjdGlvbih0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgncmVjb3JkcycpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmFib3J0KCk7XG4gICAgICAgIHJlamVjdChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoJ0xvY2FsIGRhdGEtc3RvcmUgdHJhbnNhY3Rpb24gZmFpbGVkJywgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAvLyBBbiBhY3Rpb24gdGhhdCBpc3N1ZWQgbm8gcmVxdWVzdCBvZiBpdHMgb3duIHJlc29sdmVzIHdpdGggYHVuZGVmaW5lZGAgb25jZSBpdHMgd3JpdGVzIGNvbW1pdC5cbiAgICAgICAgcmVzb2x2ZShyZXF1ZXN0Py5yZXN1bHQpO1xuICAgICAgfTtcbiAgICAgIHRyYW5zYWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCk6IHZvaWQgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdMb2NhbCBkYXRhLXN0b3JlIHRyYW5zYWN0aW9uIGFib3J0ZWQnLCB7IGNhdXNlOiB0cmFuc2FjdGlvbi5lcnJvciB9KSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKiBlc2xpbnQtZW5hYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGVzZSBhcmUgT2JzaWRpYW4gcmVuZGVyZXIgV2ViIEFQSXMsIG5vdCBOb2RlIGJ1aWx0aW5zLiAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUF3RE8sTUFBTSxlQUFlO0FBQUEsRUFDbEIsWUFBNkIsVUFBdUI7QUFBdkI7QUFBQSxFQUF3QjtBQUFBLEVBQXhCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRckMsYUFBb0IsS0FB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