@mnaoumov/obsidian-lib 10.2.0 → 10.4.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.
- package/command-handlers/undo-bulk-operation-command-handler/package.json +6 -0
- package/components/bulk-operation-commit-component/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +42 -1
- package/dist/lib/cjs/__merged.d.cts +5 -0
- package/dist/lib/cjs/bulk-operation-progress.cjs +120 -0
- package/dist/lib/cjs/bulk-operation-progress.d.cts +33 -0
- package/dist/lib/cjs/bulk-operation.cjs +220 -0
- package/dist/lib/cjs/bulk-operation.d.cts +237 -0
- package/dist/lib/cjs/command-handlers/index.cjs +4 -1
- package/dist/lib/cjs/command-handlers/index.d.cts +1 -0
- package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +164 -0
- package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.d.cts +51 -0
- package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +337 -0
- package/dist/lib/cjs/components/bulk-operation-commit-component.d.cts +152 -0
- package/dist/lib/cjs/components/index.cjs +4 -1
- package/dist/lib/cjs/components/index.d.cts +1 -0
- package/dist/lib/cjs/desktop-bulk-operation-git.cjs +534 -0
- package/dist/lib/cjs/desktop-bulk-operation-git.d.cts +196 -0
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/i18n/locales/en.cjs +10 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +9 -0
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +9 -0
- package/dist/lib/cjs/index.cjs +10 -1
- package/dist/lib/cjs/index.d.cts +3 -0
- package/dist/lib/cjs/link.cjs +1 -1
- package/dist/lib/cjs/link.d.cts +24 -6
- package/dist/lib/cjs/loop.cjs +3 -1
- package/dist/lib/esm/__merged.d.mts +5 -0
- package/dist/lib/esm/__merged.mjs +43 -1
- package/dist/lib/esm/bulk-operation-progress.d.mts +33 -0
- package/dist/lib/esm/bulk-operation-progress.mjs +31 -0
- package/dist/lib/esm/bulk-operation.d.mts +237 -0
- package/dist/lib/esm/bulk-operation.mjs +125 -0
- package/dist/lib/esm/command-handlers/index.d.mts +1 -0
- package/dist/lib/esm/command-handlers/index.mjs +3 -1
- package/dist/lib/esm/command-handlers/undo-bulk-operation-command-handler.d.mts +51 -0
- package/dist/lib/esm/command-handlers/undo-bulk-operation-command-handler.mjs +76 -0
- package/dist/lib/esm/components/bulk-operation-commit-component.d.mts +152 -0
- package/dist/lib/esm/components/bulk-operation-commit-component.mjs +245 -0
- package/dist/lib/esm/components/index.d.mts +1 -0
- package/dist/lib/esm/components/index.mjs +3 -1
- package/dist/lib/esm/desktop-bulk-operation-git.d.mts +196 -0
- package/dist/lib/esm/desktop-bulk-operation-git.mjs +463 -0
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/i18n/locales/en.d.mts +9 -0
- package/dist/lib/esm/i18n/locales/en.mjs +10 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +9 -0
- package/dist/lib/esm/index.d.mts +3 -0
- package/dist/lib/esm/index.mjs +7 -1
- package/dist/lib/esm/link.d.mts +24 -6
- package/dist/lib/esm/link.mjs +1 -1
- package/dist/lib/esm/loop.mjs +3 -1
- package/package.json +1 -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,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnYWJvcnQtc2lnbmFsLWNvbXBvbmVudCcgZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQnIGZyb20gJy4vYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnYXN5bmMtZXZlbnRzLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdidWxrLW9wZXJhdGlvbi1jb21taXQtY29tcG9uZW50JyBmcm9tICcuL2J1bGstb3BlcmF0aW9uLWNvbW1pdC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2Nhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC1jb21wb25lbnQnIGZyb20gJy4vY2FzZS1pbnNlbnNpdGl2ZS1maWxlLWluZGV4LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnY29tcG9uZW50LWV4JyBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5leHBvcnQgKiBhcyAnY29uc29sZS1kZWJ1Zy1jb21wb25lbnQnIGZyb20gJy4vY29uc29sZS1kZWJ1Zy1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2NvcmUtcGx1Z2luLXRvZ2dsZS1jb21wb25lbnQnIGZyb20gJy4vY29yZS1wbHVnaW4tdG9nZ2xlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnZGlzcG9zYWJsZS1jb21wb25lbnQnIGZyb20gJy4vZGlzcG9zYWJsZS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2VtYmVkLWV4dGVuc2lvbnMtY29tcG9uZW50JyBmcm9tICcuL2VtYmVkLWV4dGVuc2lvbnMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdmaWxlLWV4cGxvcmVyLXJvb3QtbWVudS1jb21wb25lbnQnIGZyb20gJy4vZmlsZS1leHBsb3Jlci1yb290LW1lbnUtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdnZW5lcmF0ZS1tYXJrZG93bi1saW5rLWRlZmF1bHQtcGFyYW1zLWNvbXBvbmVudCcgZnJvbSAnLi9nZW5lcmF0ZS1tYXJrZG93bi1saW5rLWRlZmF1bHQtcGFyYW1zLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnaW5jcmVtZW50YWwtZmlsZS1pbmRleC1jb21wb25lbnQnIGZyb20gJy4vaW5jcmVtZW50YWwtZmlsZS1pbmRleC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2xheW91dC1yZWFkeS1jb21wb25lbnQnIGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50JyBmcm9tICcuL21lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnbW9ua2V5LWFyb3VuZC1jb21wb25lbnQnIGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ25vdGVib29rLW5hdmlnYXRvci1tZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQnIGZyb20gJy4vbm90ZWJvb2stbmF2aWdhdG9yLW1lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWNvbnRleHQtY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1jb250ZXh0LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWdhdGUtY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLW5vdGljZS1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zdWdnZXN0aW9uLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tc3VnZ2VzdGlvbi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BvaW50ZXItcG9zaXRpb24tY29tcG9uZW50JyBmcm9tICcuL3BvaW50ZXItcG9zaXRpb24tY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdyZWdpc3RyeS1jb21wb25lbnQnIGZyb20gJy4vcmVnaXN0cnktY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdyZWxlYXNlLW5vdGVzLWNvbXBvbmVudCcgZnJvbSAnLi9yZWxlYXNlLW5vdGVzLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9yZW5hbWUtZGVsZXRlLWhhbmRsZXItY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdybWRpci1ndWFyZC1jb21wb25lbnQnIGZyb20gJy4vcm1kaXItZ3VhcmQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdzZXR0aW5ncy1taWdyYXRpb24tY29tcG9uZW50JyBmcm9tICcuL3NldHRpbmdzLW1pZ3JhdGlvbi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3N5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50JyBmcm9tICcuL3N5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICd0ZW1wbGF0ZXMtbGFuZ3VhZ2UtY29tcG9uZW50JyBmcm9tICcuL3RlbXBsYXRlcy1sYW5ndWFnZS1jb21wb25lbnQudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFFQSxZQUFZQSw0QkFBOEI7QUFDMUMsWUFBWUMsaUNBQW1DO0FBQy9DLFlBQVlDLG1DQUFxQztBQUNqRCxZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMscUNBQXVDO0FBQ25ELFlBQVlDLDJDQUE2QztBQUN6RCxZQUFZQyxrQkFBb0I7QUFDaEMsWUFBWUMsNkJBQStCO0FBQzNDLFlBQVlDLGtDQUFvQztBQUNoRCxZQUFZQywwQkFBNEI7QUFDeEMsWUFBWUMsZ0NBQWtDO0FBQzlDLFlBQVlDLHVDQUF5QztBQUNyRCxZQUFZQyxxREFBdUQ7QUFDbkUsWUFBWUMsc0NBQXdDO0FBQ3BELFlBQVlDLDRCQUE4QjtBQUMxQyxZQUFZQyxvQ0FBc0M7QUFDbEQsWUFBWUMsNkJBQStCO0FBQzNDLFlBQVlDLHVEQUF5RDtBQUNyRSxZQUFZQyw4QkFBZ0M7QUFDNUMsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVlDLDZCQUErQjtBQUMzQyxZQUFZQywrQkFBaUM7QUFDN0MsWUFBWUMsbUNBQXFDO0FBQ2pELFlBQVlDLGlDQUFtQztBQUMvQyxZQUFZQyxnQ0FBa0M7QUFDOUMsWUFBWUMsd0JBQTBCO0FBQ3RDLFlBQVlDLDZCQUErQjtBQUMzQyxZQUFZQyxxQ0FBdUM7QUFDbkQsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVlDLGtDQUFvQztBQUNoRCxZQUFZQyxtQ0FBcUM7QUFDakQsWUFBWUMsa0NBQW9DOyIsCiAgIm5hbWVzIjogWyJhYm9ydC1zaWduYWwtY29tcG9uZW50IiwgImFsbC13aW5kb3dzLWV2ZW50LWNvbXBvbmVudCIsICJhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCIsICJhc3luYy1ldmVudHMtY29tcG9uZW50IiwgImJ1bGstb3BlcmF0aW9uLWNvbW1pdC1jb21wb25lbnQiLCAiY2FzZS1pbnNlbnNpdGl2ZS1maWxlLWluZGV4LWNvbXBvbmVudCIsICJjb21wb25lbnQtZXgiLCAiY29uc29sZS1kZWJ1Zy1jb21wb25lbnQiLCAiY29yZS1wbHVnaW4tdG9nZ2xlLWNvbXBvbmVudCIsICJkaXNwb3NhYmxlLWNvbXBvbmVudCIsICJlbWJlZC1leHRlbnNpb25zLWNvbXBvbmVudCIsICJmaWxlLWV4cGxvcmVyLXJvb3QtbWVudS1jb21wb25lbnQiLCAiZ2VuZXJhdGUtbWFya2Rvd24tbGluay1kZWZhdWx0LXBhcmFtcy1jb21wb25lbnQiLCAiaW5jcmVtZW50YWwtZmlsZS1pbmRleC1jb21wb25lbnQiLCAibGF5b3V0LXJlYWR5LWNvbXBvbmVudCIsICJtZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQiLCAibW9ua2V5LWFyb3VuZC1jb21wb25lbnQiLCAibm90ZWJvb2stbmF2aWdhdG9yLW1lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudCIsICJwbHVnaW4tY29udGV4dC1jb21wb25lbnQiLCAicGx1Z2luLWdhdGUtY29tcG9uZW50IiwgInBsdWdpbi1ub3RpY2UtY29tcG9uZW50IiwgInBsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQiLCAicGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQiLCAicGx1Z2luLXN1Z2dlc3Rpb24tY29tcG9uZW50IiwgInBvaW50ZXItcG9zaXRpb24tY29tcG9uZW50IiwgInJlZ2lzdHJ5LWNvbXBvbmVudCIsICJyZWxlYXNlLW5vdGVzLWNvbXBvbmVudCIsICJyZW5hbWUtZGVsZXRlLWhhbmRsZXItY29tcG9uZW50IiwgInJtZGlyLWd1YXJkLWNvbXBvbmVudCIsICJzZXR0aW5ncy1taWdyYXRpb24tY29tcG9uZW50IiwgInN5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50IiwgInRlbXBsYXRlcy1sYW5ndWFnZS1jb21wb25lbnQiXQp9Cg==
|