@mnaoumov/typescript-lib 0.0.0 → 1.0.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/@types/debug/package.json +4 -0
- package/LICENSE +21 -0
- package/README.md +7 -1
- package/dist/lib/cjs/@types/debug.d.cts +21 -0
- package/dist/lib/cjs/abort-controller.cjs +202 -0
- package/dist/lib/cjs/abort-controller.d.cts +135 -0
- package/dist/lib/cjs/aggregate-error.cjs +98 -0
- package/dist/lib/cjs/aggregate-error.d.cts +24 -0
- package/dist/lib/cjs/array-buffer.cjs +96 -0
- package/dist/lib/cjs/array-buffer.d.cts +16 -0
- package/dist/lib/cjs/array.cjs +134 -0
- package/dist/lib/cjs/array.d.cts +46 -0
- package/dist/lib/cjs/async-events.cjs +466 -0
- package/dist/lib/cjs/async-events.d.cts +456 -0
- package/dist/lib/cjs/async-operation-hook.cjs +113 -0
- package/dist/lib/cjs/async-operation-hook.d.cts +59 -0
- package/dist/lib/cjs/async.cjs +521 -0
- package/dist/lib/cjs/async.d.cts +414 -0
- package/dist/lib/cjs/beeper.cjs +126 -0
- package/dist/lib/cjs/beeper.d.cts +21 -0
- package/dist/lib/cjs/blob.cjs +160 -0
- package/dist/lib/cjs/blob.d.cts +59 -0
- package/dist/lib/cjs/bytes.cjs +114 -0
- package/dist/lib/cjs/bytes.d.cts +17 -0
- package/dist/lib/cjs/debug-controller.cjs +80 -0
- package/dist/lib/cjs/debug-controller.d.cts +87 -0
- package/dist/lib/cjs/debug.cjs +235 -0
- package/dist/lib/cjs/debug.d.cts +66 -0
- package/dist/lib/cjs/desktop-zip-extractor.cjs +215 -0
- package/dist/lib/cjs/desktop-zip-extractor.d.cts +95 -0
- package/dist/lib/cjs/disposable.cjs +414 -0
- package/dist/lib/cjs/disposable.d.cts +387 -0
- package/dist/lib/cjs/enum.cjs +100 -0
- package/dist/lib/cjs/enum.d.cts +24 -0
- package/dist/lib/cjs/error.cjs +297 -0
- package/dist/lib/cjs/error.d.cts +181 -0
- package/dist/lib/cjs/function.cjs +141 -0
- package/dist/lib/cjs/function.d.cts +128 -0
- package/dist/lib/cjs/html-element.cjs +341 -0
- package/dist/lib/cjs/html-element.d.cts +199 -0
- package/dist/lib/cjs/index.cjs +195 -0
- package/dist/lib/cjs/index.d.cts +33 -0
- package/dist/lib/cjs/jpeg-metadata.cjs +228 -0
- package/dist/lib/cjs/jpeg-metadata.d.cts +42 -0
- package/dist/lib/cjs/library.cjs +158 -0
- package/dist/lib/cjs/library.d.cts +96 -0
- package/dist/lib/cjs/object-utils.cjs +617 -0
- package/dist/lib/cjs/object-utils.d.cts +298 -0
- package/dist/lib/cjs/path.cjs +202 -0
- package/dist/lib/cjs/path.d.cts +154 -0
- package/dist/lib/cjs/reg-exp.cjs +254 -0
- package/dist/lib/cjs/reg-exp.d.cts +87 -0
- package/dist/lib/cjs/string.cjs +326 -0
- package/dist/lib/cjs/string.d.cts +361 -0
- package/dist/lib/cjs/transformers/date-transformer.cjs +129 -0
- package/dist/lib/cjs/transformers/date-transformer.d.cts +39 -0
- package/dist/lib/cjs/transformers/group-transformer.cjs +173 -0
- package/dist/lib/cjs/transformers/group-transformer.d.cts +70 -0
- package/dist/lib/cjs/transformers/index.cjs +123 -0
- package/dist/lib/cjs/transformers/index.d.cts +9 -0
- package/dist/lib/cjs/transformers/map-transformer.cjs +129 -0
- package/dist/lib/cjs/transformers/map-transformer.d.cts +41 -0
- package/dist/lib/cjs/transformers/set-transformer.cjs +129 -0
- package/dist/lib/cjs/transformers/set-transformer.d.cts +39 -0
- package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +127 -0
- package/dist/lib/cjs/transformers/skip-private-property-transformer.d.cts +36 -0
- package/dist/lib/cjs/transformers/transformer.cjs +170 -0
- package/dist/lib/cjs/transformers/transformer.d.cts +70 -0
- package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +130 -0
- package/dist/lib/cjs/transformers/two-way-map-transformer.d.cts +42 -0
- package/dist/lib/cjs/transformers/typed-transformer.cjs +94 -0
- package/dist/lib/cjs/transformers/typed-transformer.d.cts +39 -0
- package/dist/lib/cjs/two-way-map.cjs +208 -0
- package/dist/lib/cjs/two-way-map.d.cts +101 -0
- package/dist/lib/cjs/type-guards.cjs +128 -0
- package/dist/lib/cjs/type-guards.d.cts +84 -0
- package/dist/lib/cjs/type.cjs +121 -0
- package/dist/lib/cjs/type.d.cts +122 -0
- package/dist/lib/cjs/typescript-lib-state.cjs +126 -0
- package/dist/lib/cjs/typescript-lib-state.d.cts +56 -0
- package/dist/lib/cjs/url.cjs +136 -0
- package/dist/lib/cjs/url.d.cts +74 -0
- package/dist/lib/cjs/value-provider.cjs +100 -0
- package/dist/lib/cjs/value-provider.d.cts +28 -0
- package/dist/lib/cjs/value-wrapper.cjs +144 -0
- package/dist/lib/cjs/value-wrapper.d.cts +47 -0
- package/dist/lib/esm/@types/debug.d.mts +21 -0
- package/dist/lib/esm/abort-controller.d.mts +135 -0
- package/dist/lib/esm/abort-controller.mjs +159 -0
- package/dist/lib/esm/aggregate-error.d.mts +24 -0
- package/dist/lib/esm/aggregate-error.mjs +60 -0
- package/dist/lib/esm/array-buffer.d.mts +16 -0
- package/dist/lib/esm/array-buffer.mjs +58 -0
- package/dist/lib/esm/array.d.mts +46 -0
- package/dist/lib/esm/array.mjs +93 -0
- package/dist/lib/esm/async-events.d.mts +456 -0
- package/dist/lib/esm/async-events.mjs +427 -0
- package/dist/lib/esm/async-operation-hook.d.mts +59 -0
- package/dist/lib/esm/async-operation-hook.mjs +71 -0
- package/dist/lib/esm/async.d.mts +414 -0
- package/dist/lib/esm/async.mjs +479 -0
- package/dist/lib/esm/beeper.d.mts +21 -0
- package/dist/lib/esm/beeper.mjs +88 -0
- package/dist/lib/esm/blob.d.mts +59 -0
- package/dist/lib/esm/blob.mjs +121 -0
- package/dist/lib/esm/bytes.d.mts +17 -0
- package/dist/lib/esm/bytes.mjs +76 -0
- package/dist/lib/esm/debug-controller.d.mts +87 -0
- package/dist/lib/esm/debug-controller.mjs +50 -0
- package/dist/lib/esm/debug.d.mts +66 -0
- package/dist/lib/esm/debug.mjs +185 -0
- package/dist/lib/esm/desktop-zip-extractor.d.mts +95 -0
- package/dist/lib/esm/desktop-zip-extractor.mjs +180 -0
- package/dist/lib/esm/disposable.d.mts +387 -0
- package/dist/lib/esm/disposable.mjs +360 -0
- package/dist/lib/esm/enum.d.mts +24 -0
- package/dist/lib/esm/enum.mjs +61 -0
- package/dist/lib/esm/error.d.mts +181 -0
- package/dist/lib/esm/error.mjs +248 -0
- package/dist/lib/esm/function.d.mts +128 -0
- package/dist/lib/esm/function.mjs +96 -0
- package/dist/lib/esm/html-element.d.mts +199 -0
- package/dist/lib/esm/html-element.mjs +291 -0
- package/dist/lib/esm/index.d.mts +33 -0
- package/dist/lib/esm/index.mjs +116 -0
- package/dist/lib/esm/jpeg-metadata.d.mts +42 -0
- package/dist/lib/esm/jpeg-metadata.mjs +189 -0
- package/dist/lib/esm/library.d.mts +96 -0
- package/dist/lib/esm/library.mjs +118 -0
- package/dist/lib/esm/object-utils.d.mts +298 -0
- package/dist/lib/esm/object-utils.mjs +567 -0
- package/dist/lib/esm/path.d.mts +154 -0
- package/dist/lib/esm/path.mjs +139 -0
- package/dist/lib/esm/reg-exp.d.mts +87 -0
- package/dist/lib/esm/reg-exp.mjs +213 -0
- package/dist/lib/esm/string.d.mts +361 -0
- package/dist/lib/esm/string.mjs +274 -0
- package/dist/lib/esm/transformers/date-transformer.d.mts +39 -0
- package/dist/lib/esm/transformers/date-transformer.mjs +91 -0
- package/dist/lib/esm/transformers/group-transformer.d.mts +70 -0
- package/dist/lib/esm/transformers/group-transformer.mjs +138 -0
- package/dist/lib/esm/transformers/index.d.mts +9 -0
- package/dist/lib/esm/transformers/index.mjs +68 -0
- package/dist/lib/esm/transformers/map-transformer.d.mts +41 -0
- package/dist/lib/esm/transformers/map-transformer.mjs +91 -0
- package/dist/lib/esm/transformers/set-transformer.d.mts +39 -0
- package/dist/lib/esm/transformers/set-transformer.mjs +91 -0
- package/dist/lib/esm/transformers/skip-private-property-transformer.d.mts +36 -0
- package/dist/lib/esm/transformers/skip-private-property-transformer.mjs +89 -0
- package/dist/lib/esm/transformers/transformer.d.mts +70 -0
- package/dist/lib/esm/transformers/transformer.mjs +132 -0
- package/dist/lib/esm/transformers/two-way-map-transformer.d.mts +42 -0
- package/dist/lib/esm/transformers/two-way-map-transformer.mjs +92 -0
- package/dist/lib/esm/transformers/typed-transformer.d.mts +39 -0
- package/dist/lib/esm/transformers/typed-transformer.mjs +56 -0
- package/dist/lib/esm/two-way-map.d.mts +101 -0
- package/dist/lib/esm/two-way-map.mjs +170 -0
- package/dist/lib/esm/type-guards.d.mts +84 -0
- package/dist/lib/esm/type-guards.mjs +85 -0
- package/dist/lib/esm/type.d.mts +122 -0
- package/dist/lib/esm/type.mjs +83 -0
- package/dist/lib/esm/typescript-lib-state.d.mts +56 -0
- package/dist/lib/esm/typescript-lib-state.mjs +84 -0
- package/dist/lib/esm/url.d.mts +74 -0
- package/dist/lib/esm/url.mjs +94 -0
- package/dist/lib/esm/value-provider.d.mts +28 -0
- package/dist/lib/esm/value-provider.mjs +62 -0
- package/dist/lib/esm/value-wrapper.d.mts +47 -0
- package/dist/lib/esm/value-wrapper.mjs +106 -0
- package/package.json +111 -13
- package/transformers/date-transformer/package.json +6 -0
- package/transformers/group-transformer/package.json +6 -0
- package/transformers/index/package.json +6 -0
- package/transformers/map-transformer/package.json +6 -0
- package/transformers/package.json +6 -0
- package/transformers/set-transformer/package.json +6 -0
- package/transformers/skip-private-property-transformer/package.json +6 -0
- package/transformers/transformer/package.json +6 -0
- package/transformers/two-way-map-transformer/package.json +6 -0
- package/transformers/typed-transformer/package.json +6 -0
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function () {
|
|
7
|
+
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
+
symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
|
|
9
|
+
symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function ensureBrowserProcess() {
|
|
13
|
+
const browserProcess = {
|
|
14
|
+
browser: true,
|
|
15
|
+
cwd() {
|
|
16
|
+
return '/';
|
|
17
|
+
},
|
|
18
|
+
env: {},
|
|
19
|
+
platform: 'android'
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
|
|
23
|
+
const existingProcess = globalThis.process;
|
|
24
|
+
|
|
25
|
+
if (!existingProcess) {
|
|
26
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
27
|
+
globalThis.process = browserProcess;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (existingProcess.versions?.node) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const existingProcessRecord = existingProcess;
|
|
36
|
+
|
|
37
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
38
|
+
existingProcessRecord[key] ??= value;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
existingProcessRecord['browser'] = true;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
(function initEsm() {
|
|
45
|
+
ensureDisposeSymbols();
|
|
46
|
+
ensureBrowserProcess();
|
|
47
|
+
})();
|
|
48
|
+
})();
|
|
49
|
+
|
|
50
|
+
import {
|
|
51
|
+
abortSignalAny,
|
|
52
|
+
abortSignalNever,
|
|
53
|
+
abortSignalTimeout,
|
|
54
|
+
waitForAbort
|
|
55
|
+
} from "./abort-controller.mjs";
|
|
56
|
+
import { notifyAsyncOperationStarted } from "./async-operation-hook.mjs";
|
|
57
|
+
import {
|
|
58
|
+
getLibDebugger,
|
|
59
|
+
printWithStackTrace
|
|
60
|
+
} from "./debug.mjs";
|
|
61
|
+
import {
|
|
62
|
+
ASYNC_WRAPPER_ERROR_MESSAGE,
|
|
63
|
+
CustomStackTraceError,
|
|
64
|
+
emitAsyncErrorEvent,
|
|
65
|
+
getStackTrace,
|
|
66
|
+
isAsyncErrorIgnoreContextActive,
|
|
67
|
+
printError,
|
|
68
|
+
SilentError
|
|
69
|
+
} from "./error.mjs";
|
|
70
|
+
import {
|
|
71
|
+
noop,
|
|
72
|
+
noopAsync
|
|
73
|
+
} from "./function.mjs";
|
|
74
|
+
import { normalizeOptionalProperties } from "./object-utils.mjs";
|
|
75
|
+
import {
|
|
76
|
+
assert,
|
|
77
|
+
assertNonNullable
|
|
78
|
+
} from "./type-guards.mjs";
|
|
79
|
+
async function addErrorHandler(asyncFunction, stackTrace) {
|
|
80
|
+
stackTrace ??= getStackTrace(1);
|
|
81
|
+
const wasScheduledWithinIgnoreContext = isAsyncErrorIgnoreContextActive();
|
|
82
|
+
try {
|
|
83
|
+
await asyncFunction();
|
|
84
|
+
} catch (asyncError) {
|
|
85
|
+
const wrappedError = new CustomStackTraceError({
|
|
86
|
+
cause: asyncError,
|
|
87
|
+
message: ASYNC_WRAPPER_ERROR_MESSAGE,
|
|
88
|
+
stackTrace
|
|
89
|
+
});
|
|
90
|
+
if (handleSilentError(wrappedError)) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
emitAsyncErrorEvent(wrappedError, wasScheduledWithinIgnoreContext);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function asyncFilter(array, predicate) {
|
|
97
|
+
const ans = [];
|
|
98
|
+
const length = array.length;
|
|
99
|
+
for (let index = 0; index < length; index++) {
|
|
100
|
+
if (!Object.hasOwn(array, index)) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const item = array[index];
|
|
104
|
+
if (await predicate(item, index, array)) {
|
|
105
|
+
ans.push(item);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return ans;
|
|
109
|
+
}
|
|
110
|
+
async function asyncFilterInPlace(array, predicate) {
|
|
111
|
+
const length = array.length;
|
|
112
|
+
let writeIndex = 0;
|
|
113
|
+
for (let readIndex = 0; readIndex < length; readIndex++) {
|
|
114
|
+
if (!Object.hasOwn(array, readIndex)) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const current = array[readIndex];
|
|
118
|
+
if (await predicate(current, readIndex, array)) {
|
|
119
|
+
array[writeIndex++] = current;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
array.length = writeIndex;
|
|
123
|
+
}
|
|
124
|
+
async function asyncFlatMap(array, callback) {
|
|
125
|
+
const nestedResults = await asyncMap(array, callback);
|
|
126
|
+
return nestedResults.flat();
|
|
127
|
+
}
|
|
128
|
+
async function asyncMap(array, callback) {
|
|
129
|
+
return await promiseAllSequentially(array.map(callback));
|
|
130
|
+
}
|
|
131
|
+
function convertAsyncToSync(asyncFunction, stackTrace) {
|
|
132
|
+
stackTrace ??= getStackTrace(1);
|
|
133
|
+
return (...$arguments) => {
|
|
134
|
+
assertNonNullable(stackTrace);
|
|
135
|
+
const innerStackTrace = getStackTrace(1);
|
|
136
|
+
stackTrace += `
|
|
137
|
+
at --- convertAsyncToSync --- (0)
|
|
138
|
+
${innerStackTrace}`;
|
|
139
|
+
invokeAsyncSafely(() => asyncFunction(...$arguments), stackTrace);
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function convertSyncToAsync(syncFunction) {
|
|
143
|
+
return async (...$arguments) => {
|
|
144
|
+
await noopAsync();
|
|
145
|
+
return syncFunction(...$arguments);
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function handleSilentError(error) {
|
|
149
|
+
let cause = error;
|
|
150
|
+
while (!(cause instanceof SilentError)) {
|
|
151
|
+
if (!(cause instanceof Error)) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
cause = cause.cause;
|
|
155
|
+
}
|
|
156
|
+
getLibDebugger("Async:handleSilentError")(error);
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
async function ignoreError(promise, fallbackValue) {
|
|
160
|
+
const ignoreErrorDebugger = getLibDebugger("Async:ignoreError");
|
|
161
|
+
const stackTrace = getStackTrace(1);
|
|
162
|
+
try {
|
|
163
|
+
return await promise;
|
|
164
|
+
} catch (error) {
|
|
165
|
+
ignoreErrorDebugger(
|
|
166
|
+
"Ignored error",
|
|
167
|
+
new CustomStackTraceError({
|
|
168
|
+
cause: error,
|
|
169
|
+
message: "Ignored error",
|
|
170
|
+
stackTrace
|
|
171
|
+
})
|
|
172
|
+
);
|
|
173
|
+
return fallbackValue;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function invokeAsyncSafely(asyncFunction, stackTrace) {
|
|
177
|
+
stackTrace ??= getStackTrace(1);
|
|
178
|
+
let result;
|
|
179
|
+
try {
|
|
180
|
+
result = asyncFunction();
|
|
181
|
+
} catch (error) {
|
|
182
|
+
notifyAsyncOperationStarted(addErrorHandler(() => Promise.reject(error), stackTrace));
|
|
183
|
+
}
|
|
184
|
+
if (result instanceof Promise) {
|
|
185
|
+
notifyAsyncOperationStarted(addErrorHandler(() => result, stackTrace));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function invokeAsyncSafelyAfterDelay(params) {
|
|
189
|
+
const {
|
|
190
|
+
asyncFunction,
|
|
191
|
+
delayInMilliseconds = 0
|
|
192
|
+
} = params;
|
|
193
|
+
const abortSignal = params.abortSignal ?? abortSignalNever();
|
|
194
|
+
abortSignal.throwIfAborted();
|
|
195
|
+
const stackTrace = params.stackTrace ?? getStackTrace(1);
|
|
196
|
+
invokeAsyncSafely(async () => {
|
|
197
|
+
await sleep({ abortSignal, milliseconds: delayInMilliseconds, shouldThrowOnAbort: true });
|
|
198
|
+
await asyncFunction(abortSignal);
|
|
199
|
+
}, stackTrace);
|
|
200
|
+
}
|
|
201
|
+
async function promiseAllAsyncFnsSequentially(asyncFns) {
|
|
202
|
+
const results = [];
|
|
203
|
+
for (const asyncFunction of asyncFns) {
|
|
204
|
+
results.push(await asyncFunction());
|
|
205
|
+
}
|
|
206
|
+
return results;
|
|
207
|
+
}
|
|
208
|
+
async function promiseAllSequentially(promises) {
|
|
209
|
+
return await promiseAllAsyncFnsSequentially(promises.map((promise) => () => promise));
|
|
210
|
+
}
|
|
211
|
+
const terminateRetryErrors = /* @__PURE__ */ new WeakSet();
|
|
212
|
+
function chain(chainPromise, promisableFunction) {
|
|
213
|
+
let nextChainPromise = chainPromise;
|
|
214
|
+
if (chainPromise) {
|
|
215
|
+
nextChainPromise = chainPromise.then(() => promisableFunction() ?? void 0);
|
|
216
|
+
} else {
|
|
217
|
+
const promisable = promisableFunction();
|
|
218
|
+
if (promisable) {
|
|
219
|
+
nextChainPromise = promisable instanceof Promise ? promisable : Promise.resolve(promisable);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
nextChainPromise?.catch(noop);
|
|
223
|
+
return nextChainPromise;
|
|
224
|
+
}
|
|
225
|
+
function marksAsTerminateRetry(error) {
|
|
226
|
+
terminateRetryErrors.add(error);
|
|
227
|
+
}
|
|
228
|
+
async function neverEnds() {
|
|
229
|
+
await new Promise(() => {
|
|
230
|
+
noop();
|
|
231
|
+
});
|
|
232
|
+
assert(false, "Should never happen");
|
|
233
|
+
}
|
|
234
|
+
async function nextTickAsync() {
|
|
235
|
+
return new Promise((resolve) => {
|
|
236
|
+
queueMicrotask(() => {
|
|
237
|
+
resolve();
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
function normalizePromisable(promisable) {
|
|
242
|
+
if (!promisable) {
|
|
243
|
+
return promisable;
|
|
244
|
+
}
|
|
245
|
+
if (promisable instanceof Promise) {
|
|
246
|
+
return promisable;
|
|
247
|
+
}
|
|
248
|
+
return promisable.then ? Promise.resolve(promisable) : promisable;
|
|
249
|
+
}
|
|
250
|
+
async function queueMicrotaskAsync() {
|
|
251
|
+
return new Promise((resolve) => {
|
|
252
|
+
queueMicrotask(() => {
|
|
253
|
+
resolve();
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
async function requestAnimationFrameAsync(fallbackTimeoutInMilliseconds) {
|
|
258
|
+
const requestAnimationFrameAsyncPromise = new Promise((resolve) => {
|
|
259
|
+
window.requestAnimationFrame(() => {
|
|
260
|
+
resolve();
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
const DEFAULT_FALLBACK_TIMEOUT_IN_MILLISECONDS = 100;
|
|
264
|
+
fallbackTimeoutInMilliseconds ??= DEFAULT_FALLBACK_TIMEOUT_IN_MILLISECONDS;
|
|
265
|
+
return Promise.race([requestAnimationFrameAsyncPromise, fallbackTimeoutInMilliseconds > 0 ? sleep({ milliseconds: fallbackTimeoutInMilliseconds }) : neverEnds()]);
|
|
266
|
+
}
|
|
267
|
+
async function retryWithTimeout(params) {
|
|
268
|
+
const retryWithTimeoutDebugger = getLibDebugger("Async:retryWithTimeout");
|
|
269
|
+
const stackTrace = params.stackTrace ?? getStackTrace(1);
|
|
270
|
+
const DEFAULT_RETRY_OPTIONS = {
|
|
271
|
+
// eslint-disable-next-line no-magic-numbers -- Extracting magic number as a constant would be repetitive, as the value is used only once and its name would be the same as the property.
|
|
272
|
+
retryDelayInMilliseconds: 100,
|
|
273
|
+
shouldRetryOnError: false,
|
|
274
|
+
// eslint-disable-next-line no-magic-numbers -- Extracting magic number as a constant would be repetitive, as the value is used only once and its name would be the same as the property.
|
|
275
|
+
timeoutInMilliseconds: 5e3
|
|
276
|
+
};
|
|
277
|
+
const fullOptions = { ...DEFAULT_RETRY_OPTIONS, ...params.retryOptions };
|
|
278
|
+
fullOptions.abortSignal?.throwIfAborted();
|
|
279
|
+
await runWithTimeout(normalizeOptionalProperties({
|
|
280
|
+
context: { operationName: params.operationName ?? "", retryFunction: params.operationFunction },
|
|
281
|
+
onTimeout: params.onTimeout,
|
|
282
|
+
async operationFunction(abortSignal) {
|
|
283
|
+
const combinedAbortSignal = abortSignalAny(fullOptions.abortSignal, abortSignal);
|
|
284
|
+
combinedAbortSignal.throwIfAborted();
|
|
285
|
+
let attempt = 0;
|
|
286
|
+
while (!combinedAbortSignal.aborted) {
|
|
287
|
+
attempt++;
|
|
288
|
+
let isSuccess;
|
|
289
|
+
try {
|
|
290
|
+
isSuccess = await params.operationFunction(combinedAbortSignal);
|
|
291
|
+
} catch (error) {
|
|
292
|
+
if (combinedAbortSignal.aborted || !fullOptions.shouldRetryOnError || terminateRetryErrors.has(error)) {
|
|
293
|
+
throw new CustomStackTraceError({
|
|
294
|
+
cause: error,
|
|
295
|
+
message: "retryWithTimeout failed",
|
|
296
|
+
stackTrace
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
printError(error);
|
|
300
|
+
isSuccess = false;
|
|
301
|
+
}
|
|
302
|
+
if (isSuccess) {
|
|
303
|
+
printWithStackTrace({
|
|
304
|
+
$arguments: [{
|
|
305
|
+
operationFunction: params.operationFunction,
|
|
306
|
+
operationName: params.operationName ?? ""
|
|
307
|
+
}],
|
|
308
|
+
debuggerInstance: retryWithTimeoutDebugger,
|
|
309
|
+
message: `Retry completed successfully after ${String(attempt)} attempts`,
|
|
310
|
+
stackTrace
|
|
311
|
+
});
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
printWithStackTrace({
|
|
315
|
+
$arguments: [{
|
|
316
|
+
operationFunction: params.operationFunction,
|
|
317
|
+
operationName: params.operationName ?? ""
|
|
318
|
+
}],
|
|
319
|
+
debuggerInstance: retryWithTimeoutDebugger,
|
|
320
|
+
message: `Retry attempt ${String(attempt)} completed unsuccessfully. Trying again in ${String(fullOptions.retryDelayInMilliseconds)} milliseconds`,
|
|
321
|
+
stackTrace
|
|
322
|
+
});
|
|
323
|
+
await sleep({ abortSignal, milliseconds: fullOptions.retryDelayInMilliseconds });
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
operationName: params.operationName ?? "",
|
|
327
|
+
stackTrace,
|
|
328
|
+
timeoutInMilliseconds: fullOptions.timeoutInMilliseconds
|
|
329
|
+
}));
|
|
330
|
+
}
|
|
331
|
+
async function runWithTimeout(params) {
|
|
332
|
+
const stackTrace = params.stackTrace ?? getStackTrace(1);
|
|
333
|
+
const startTime = performance.now();
|
|
334
|
+
const runAbortController = new AbortController();
|
|
335
|
+
const timeoutAbortController = new AbortController();
|
|
336
|
+
let result = null;
|
|
337
|
+
let hasResult = false;
|
|
338
|
+
let isCompleted = false;
|
|
339
|
+
const runWithTimeoutDebugger = getLibDebugger("Async:runWithTimeout");
|
|
340
|
+
const onTimeout = params.onTimeout ?? defaultOnTimeout;
|
|
341
|
+
await Promise.race([run(), innerTimeout()]);
|
|
342
|
+
if (hasResult && !runAbortController.signal.aborted) {
|
|
343
|
+
return result;
|
|
344
|
+
}
|
|
345
|
+
throw new CustomStackTraceError({
|
|
346
|
+
cause: runAbortController.signal.reason,
|
|
347
|
+
message: "Run with timeout failed",
|
|
348
|
+
stackTrace
|
|
349
|
+
});
|
|
350
|
+
async function run() {
|
|
351
|
+
try {
|
|
352
|
+
result = await params.operationFunction(runAbortController.signal);
|
|
353
|
+
const duration = Math.trunc(performance.now() - startTime);
|
|
354
|
+
printWithStackTrace({
|
|
355
|
+
$arguments: [{
|
|
356
|
+
context: params.context,
|
|
357
|
+
operationFunction: params.operationFunction,
|
|
358
|
+
operationName: params.operationName ?? ""
|
|
359
|
+
}],
|
|
360
|
+
debuggerInstance: runWithTimeoutDebugger,
|
|
361
|
+
message: `Execution time: ${String(duration)} milliseconds`,
|
|
362
|
+
stackTrace
|
|
363
|
+
});
|
|
364
|
+
hasResult = true;
|
|
365
|
+
} catch (error) {
|
|
366
|
+
runAbortController.abort(error);
|
|
367
|
+
} finally {
|
|
368
|
+
isCompleted = true;
|
|
369
|
+
timeoutAbortController.abort(new Error("Completed"));
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
async function innerTimeout() {
|
|
373
|
+
await sleep({ abortSignal: timeoutAbortController.signal, milliseconds: params.timeoutInMilliseconds });
|
|
374
|
+
if (isCompleted) {
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
const duration = Math.trunc(performance.now() - startTime);
|
|
378
|
+
printWithStackTrace({
|
|
379
|
+
$arguments: [{
|
|
380
|
+
context: params.context,
|
|
381
|
+
operationFunction: params.operationFunction,
|
|
382
|
+
operationName: params.operationName ?? ""
|
|
383
|
+
}],
|
|
384
|
+
debuggerInstance: runWithTimeoutDebugger,
|
|
385
|
+
message: `Timed out after ${String(duration)} milliseconds`,
|
|
386
|
+
stackTrace
|
|
387
|
+
});
|
|
388
|
+
const timeoutContext = normalizeOptionalProperties({
|
|
389
|
+
duration,
|
|
390
|
+
onOperationCompleted(callback) {
|
|
391
|
+
timeoutAbortController.signal.addEventListener("abort", callback);
|
|
392
|
+
},
|
|
393
|
+
operationName: params.operationName ?? "",
|
|
394
|
+
terminateOperation() {
|
|
395
|
+
const error = new Error(`Timed out after ${String(duration)} milliseconds`);
|
|
396
|
+
runAbortController.abort(error);
|
|
397
|
+
timeoutAbortController.abort(error);
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
onTimeout(timeoutContext);
|
|
401
|
+
await waitForAbort(timeoutAbortController.signal);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
async function setImmediateAsync() {
|
|
405
|
+
return new Promise((resolve) => {
|
|
406
|
+
setImmediate(() => {
|
|
407
|
+
resolve();
|
|
408
|
+
});
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
async function setTimeoutAsync(delay) {
|
|
412
|
+
await new Promise((resolve) => {
|
|
413
|
+
window.setTimeout(resolve, delay);
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
async function sleep(params) {
|
|
417
|
+
const {
|
|
418
|
+
abortSignal,
|
|
419
|
+
milliseconds,
|
|
420
|
+
shouldThrowOnAbort
|
|
421
|
+
} = params;
|
|
422
|
+
await waitForAbort(abortSignalAny(abortSignal, abortSignalTimeout(milliseconds)));
|
|
423
|
+
if (shouldThrowOnAbort) {
|
|
424
|
+
abortSignal?.throwIfAborted();
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
async function timeout(params) {
|
|
428
|
+
const {
|
|
429
|
+
abortSignal,
|
|
430
|
+
shouldThrowOnAbort,
|
|
431
|
+
timeoutInMilliseconds
|
|
432
|
+
} = params;
|
|
433
|
+
await sleep(normalizeOptionalProperties({
|
|
434
|
+
abortSignal,
|
|
435
|
+
milliseconds: timeoutInMilliseconds,
|
|
436
|
+
shouldThrowOnAbort
|
|
437
|
+
}));
|
|
438
|
+
throw new Error(`Timed out in ${String(timeoutInMilliseconds)} milliseconds`);
|
|
439
|
+
}
|
|
440
|
+
async function toArray(iter) {
|
|
441
|
+
const array = [];
|
|
442
|
+
for await (const item of iter) {
|
|
443
|
+
array.push(item);
|
|
444
|
+
}
|
|
445
|
+
return array;
|
|
446
|
+
}
|
|
447
|
+
function defaultOnTimeout(context) {
|
|
448
|
+
context.terminateOperation();
|
|
449
|
+
}
|
|
450
|
+
export {
|
|
451
|
+
addErrorHandler,
|
|
452
|
+
asyncFilter,
|
|
453
|
+
asyncFilterInPlace,
|
|
454
|
+
asyncFlatMap,
|
|
455
|
+
asyncMap,
|
|
456
|
+
chain,
|
|
457
|
+
convertAsyncToSync,
|
|
458
|
+
convertSyncToAsync,
|
|
459
|
+
handleSilentError,
|
|
460
|
+
ignoreError,
|
|
461
|
+
invokeAsyncSafely,
|
|
462
|
+
invokeAsyncSafelyAfterDelay,
|
|
463
|
+
marksAsTerminateRetry,
|
|
464
|
+
neverEnds,
|
|
465
|
+
nextTickAsync,
|
|
466
|
+
normalizePromisable,
|
|
467
|
+
promiseAllAsyncFnsSequentially,
|
|
468
|
+
promiseAllSequentially,
|
|
469
|
+
queueMicrotaskAsync,
|
|
470
|
+
requestAnimationFrameAsync,
|
|
471
|
+
retryWithTimeout,
|
|
472
|
+
runWithTimeout,
|
|
473
|
+
setImmediateAsync,
|
|
474
|
+
setTimeoutAsync,
|
|
475
|
+
sleep,
|
|
476
|
+
timeout,
|
|
477
|
+
toArray
|
|
478
|
+
};
|
|
479
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzeW5jLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgR2VuZXJpY0FzeW5jRnVuY3Rpb24sXG4gIEdlbmVyaWNGdW5jdGlvbixcbiAgR2VuZXJpY1ZvaWRGdW5jdGlvblxufSBmcm9tICcuL2Z1bmN0aW9uLnRzJztcblxuaW1wb3J0IHtcbiAgYWJvcnRTaWduYWxBbnksXG4gIGFib3J0U2lnbmFsTmV2ZXIsXG4gIGFib3J0U2lnbmFsVGltZW91dCxcbiAgd2FpdEZvckFib3J0XG59IGZyb20gJy4vYWJvcnQtY29udHJvbGxlci50cyc7XG5pbXBvcnQgeyBub3RpZnlBc3luY09wZXJhdGlvblN0YXJ0ZWQgfSBmcm9tICcuL2FzeW5jLW9wZXJhdGlvbi1ob29rLnRzJztcbmltcG9ydCB7XG4gIGdldExpYkRlYnVnZ2VyLFxuICBwcmludFdpdGhTdGFja1RyYWNlXG59IGZyb20gJy4vZGVidWcudHMnO1xuaW1wb3J0IHtcbiAgQVNZTkNfV1JBUFBFUl9FUlJPUl9NRVNTQUdFLFxuICBDdXN0b21TdGFja1RyYWNlRXJyb3IsXG4gIGVtaXRBc3luY0Vycm9yRXZlbnQsXG4gIGdldFN0YWNrVHJhY2UsXG4gIGlzQXN5bmNFcnJvcklnbm9yZUNvbnRleHRBY3RpdmUsXG4gIHByaW50RXJyb3IsXG4gIFNpbGVudEVycm9yXG59IGZyb20gJy4vZXJyb3IudHMnO1xuaW1wb3J0IHtcbiAgbm9vcCxcbiAgbm9vcEFzeW5jXG59IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBhc3NlcnROb25OdWxsYWJsZVxufSBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW52b2tlQXN5bmNTYWZlbHlBZnRlckRlbGF5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZva2VBc3luY1NhZmVseUFmdGVyRGVsYXlQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICpcbiAgICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gICAqL1xuICByZWFkb25seSBhc3luY0Z1bmN0aW9uOiAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMGBcbiAgICovXG4gIHJlYWRvbmx5IGRlbGF5SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tUcmFjZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHR5cGUgcmVwcmVzZW50aW5nIGEgZnVuY3Rpb24gdGhhdCByZXNvbHZlcyBhIHtAbGluayBQcm9taXNlfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKi9cbmV4cG9ydCB0eXBlIFByb21pc2VSZXNvbHZlPFQ+ID0gdW5kZWZpbmVkIGV4dGVuZHMgVCA/ICh2YWx1ZT86IFByb21pc2VMaWtlPFQ+IHwgVCkgPT4gdm9pZFxuICA6ICh2YWx1ZTogUHJvbWlzZUxpa2U8VD4gfCBUKSA9PiB2b2lkO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayByZXRyeVdpdGhUaW1lb3V0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogQSBhYm9ydCBzaWduYWwgdG8gY2FuY2VsIHRoZSByZXRyeSBvcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwYFxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnlEZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJldHJ5IHRoZSBmdW5jdGlvbiBvbiBlcnJvci5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmV0cnlPbkVycm9yPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBtYXhpbXVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGdpdmluZyB1cCBvbiByZXRyeWluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDUwMDBgXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQWRkcyBhbiBlcnJvciBoYW5kbGVyIHRvIGEge0BsaW5rIFByb21pc2V9IHRoYXQgY2F0Y2hlcyBhbnkgZXJyb3JzIGFuZCBlbWl0cyBhbiBhc3luYyBlcnJvciBldmVudC5cbiAqXG4gKiBAcGFyYW0gYXN5bmNGdW5jdGlvbiAtIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gYWRkIGFuIGVycm9yIGhhbmRsZXIgdG8uXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gY29tcGxldGVzIG9yIGVtaXRzIGFzeW5jIGVycm9yIGV2ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkRXJyb3JIYW5kbGVyKGFzeW5jRnVuY3Rpb246ICgpID0+IFByb21pc2U8dW5rbm93bj4sIHN0YWNrVHJhY2U/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgc3RhY2tUcmFjZSA/Pz0gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgLy8gQ2FwdHVyZSB0aGUgaWdub3JlIGNvbnRleHQgc3luY2hyb25vdXNseSBhdCBzY2hlZHVsZSB0aW1lLCBzbyBhIGRlZmVycmVkIHJlamVjdGlvbiBzZXR0bGluZyBhZnRlciB0aGUgc2NvcGUgZXhpdHMgaXMgc3RpbGwgaWdub3JlZC5cbiAgY29uc3Qgd2FzU2NoZWR1bGVkV2l0aGluSWdub3JlQ29udGV4dCA9IGlzQXN5bmNFcnJvcklnbm9yZUNvbnRleHRBY3RpdmUoKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBhc3luY0Z1bmN0aW9uKCk7XG4gIH0gY2F0Y2ggKGFzeW5jRXJyb3IpIHtcbiAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKHtcbiAgICAgIGNhdXNlOiBhc3luY0Vycm9yLFxuICAgICAgbWVzc2FnZTogQVNZTkNfV1JBUFBFUl9FUlJPUl9NRVNTQUdFLFxuICAgICAgc3RhY2tUcmFjZVxuICAgIH0pO1xuICAgIGlmIChoYW5kbGVTaWxlbnRFcnJvcih3cmFwcGVkRXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVtaXRBc3luY0Vycm9yRXZlbnQod3JhcHBlZEVycm9yLCB3YXNTY2hlZHVsZWRXaXRoaW5JZ25vcmVDb250ZXh0KTtcbiAgfVxufVxuXG4vKipcbiAqIEZpbHRlcnMgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHksIGtlZXBpbmcgb25seSB0aGUgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHBhcmFtIGFycmF5IC0gVGhlIGFycmF5IHRvIGZpbHRlci5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgLSBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXN5bmNGaWx0ZXI8VD4oYXJyYXk6IFRbXSwgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IFByb21pc2FibGU8Ym9vbGVhbj4pOiBQcm9taXNlPFRbXT4ge1xuICBjb25zdCBhbnM6IFRbXSA9IFtdO1xuXG4gIGNvbnN0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihhcnJheSwgaW5kZXgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVtID0gYXJyYXlbaW5kZXhdIGFzIFQ7XG4gICAgaWYgKGF3YWl0IHByZWRpY2F0ZShpdGVtLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICBhbnMucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYW5zO1xufVxuXG4vKipcbiAqIEZpbHRlcnMgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHkgaW4gcGxhY2UsIGtlZXBpbmcgb25seSB0aGUgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHBhcmFtIGFycmF5IC0gVGhlIGFycmF5IHRvIGZpbHRlci5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgLSBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhcnJheSBpcyBmaWx0ZXJlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmlsdGVySW5QbGFjZTxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxib29sZWFuPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIGxldCB3cml0ZUluZGV4ID0gMDtcbiAgZm9yIChsZXQgcmVhZEluZGV4ID0gMDsgcmVhZEluZGV4IDwgbGVuZ3RoOyByZWFkSW5kZXgrKykge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihhcnJheSwgcmVhZEluZGV4KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IGFycmF5W3JlYWRJbmRleF0gYXMgVDtcbiAgICBpZiAoYXdhaXQgcHJlZGljYXRlKGN1cnJlbnQsIHJlYWRJbmRleCwgYXJyYXkpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlcyAtLSBZZXMsIGl0IGlzIGEgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uLCBidXQgSSBkb24ndCBhbiBlbGVnYW50IHdheSB0byBmaXggaXQuXG4gICAgICBhcnJheVt3cml0ZUluZGV4KytdID0gY3VycmVudDtcbiAgICB9XG4gIH1cbiAgYXJyYXkubGVuZ3RoID0gd3JpdGVJbmRleDtcbn1cblxuLyoqXG4gKiBNYXBzIG92ZXIgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHksIGFwcGx5aW5nIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiB0byBlYWNoIGVsZW1lbnQsIGFuZCB0aGVuIGZsYXR0ZW5zIHRoZSByZXN1bHRzIGludG8gYSBzaW5nbGUgYXJyYXkuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHR5cGVQYXJhbSBVIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIG91dHB1dCBhcnJheS5cbiAqIEBwYXJhbSBhcnJheSAtIFRoZSBhcnJheSB0byBtYXAgb3ZlciBhbmQgZmxhdHRlbi5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYSBmbGF0dGVuZWQgYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXN5bmNGbGF0TWFwPFQsIFU+KGFycmF5OiBUW10sIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IFByb21pc2FibGU8VVtdPik6IFByb21pc2U8VVtdPiB7XG4gIGNvbnN0IG5lc3RlZFJlc3VsdHMgPSBhd2FpdCBhc3luY01hcChhcnJheSwgY2FsbGJhY2spO1xuICByZXR1cm4gbmVzdGVkUmVzdWx0cy5mbGF0KCk7XG59XG5cbi8qKlxuICogTWFwcyBvdmVyIGFuIGFycmF5IGFzeW5jaHJvbm91c2x5LCBhcHBseWluZyB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZWFjaCBlbGVtZW50LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheS5cbiAqIEB0eXBlUGFyYW0gVSAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBvdXRwdXQgYXJyYXkuXG4gKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gbWFwIG92ZXIuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jTWFwPFQsIFU+KGFycmF5OiBUW10sIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IFByb21pc2FibGU8VT4pOiBQcm9taXNlPFVbXT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1hcnJheS1jYWxsYmFjay1yZWZlcmVuY2UgLS0gUGFzc2luZyBgY2FsbGJhY2tgIHN0cmFpZ2h0IHRocm91Z2ggaXMgdGhlIGNvbnRyYWN0OiBpdCBpcyBkZWNsYXJlZCBhcyBgKHZhbHVlLCBpbmRleCwgYXJyYXkpYCBzbyB0aGF0IGl0IHJlY2VpdmVzIGV4YWN0bHkgd2hhdCBgQXJyYXkjbWFwYCBzdXBwbGllcy4gV3JhcHBpbmcgaXQgdG8gdGFrZSBvbmx5IHRoZSB2YWx1ZSB3b3VsZCBxdWlldGx5IHN0b3AgZm9yd2FyZGluZyB0aGUgb3RoZXIgdHdvLlxuICByZXR1cm4gYXdhaXQgcHJvbWlzZUFsbFNlcXVlbnRpYWxseShhcnJheS5tYXAoY2FsbGJhY2spKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gYSBzeW5jaHJvbm91cyBvbmUgYnkgYXV0b21hdGljYWxseSBoYW5kbGluZyB0aGUgUHJvbWlzZSByZWplY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAqIEBwYXJhbSBhc3luY0Z1bmN0aW9uIC0gVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICogQHBhcmFtIHN0YWNrVHJhY2UgLSBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB3cmFwcyB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGluIGEgc3luY2hyb25vdXMgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEFzeW5jVG9TeW5jPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oYXN5bmNGdW5jdGlvbjogR2VuZXJpY0FzeW5jRnVuY3Rpb248QXJndW1lbnRzPiwgc3RhY2tUcmFjZT86IHN0cmluZyk6IEdlbmVyaWNWb2lkRnVuY3Rpb248QXJndW1lbnRzPiB7XG4gIHN0YWNrVHJhY2UgPz89IGdldFN0YWNrVHJhY2UoMSk7XG4gIHJldHVybiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKTogdm9pZCA9PiB7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoc3RhY2tUcmFjZSk7XG4gICAgY29uc3QgaW5uZXJTdGFja1RyYWNlID0gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgICBzdGFja1RyYWNlICs9IGBcXG4gICAgYXQgLS0tIGNvbnZlcnRBc3luY1RvU3luYyAtLS0gKDApXFxuJHtpbm5lclN0YWNrVHJhY2V9YDtcbiAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiBhc3luY0Z1bmN0aW9uKC4uLiRhcmd1bWVudHMpLCBzdGFja1RyYWNlKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGFuIGFzeW5jaHJvbm91cyBvbmUgYnkgd3JhcHBpbmcgaXQgaW4gYSB7QGxpbmsgUHJvbWlzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0IC0gVGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlLlxuICogQHBhcmFtIHN5bmNGdW5jdGlvbiAtIFRoZSBzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHdyYXBzIHRoZSBzeW5jaHJvbm91cyBmdW5jdGlvbiBpbiBhbiBhc3luY2hyb25vdXMgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFN5bmNUb0FzeW5jPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXSwgUmVzdWx0PihzeW5jRnVuY3Rpb246IEdlbmVyaWNGdW5jdGlvbjxBcmd1bWVudHMsIFJlc3VsdD4pOiBHZW5lcmljQXN5bmNGdW5jdGlvbjxBcmd1bWVudHMsIFJlc3VsdD4ge1xuICByZXR1cm4gYXN5bmMgKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gICAgcmV0dXJuIHN5bmNGdW5jdGlvbiguLi4kYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGEgc2lsZW50IGVycm9yLlxuICpcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBoYW5kbGUuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBlcnJvciBpcyBhIHNpbGVudCBlcnJvci5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1ib29sZWFuLW5hbWUgLS0gVGhlIG5hbWUgc3RhdGVzIHRoZSBhY3Rpb247IHRoZSBib29sZWFuIG9ubHkgcmVwb3J0cyB3aGV0aGVyIHRoZSBlcnJvciB3YXMgaGFuZGxlZC5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVTaWxlbnRFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBsZXQgY2F1c2UgPSBlcnJvcjtcbiAgd2hpbGUgKCEoY2F1c2UgaW5zdGFuY2VvZiBTaWxlbnRFcnJvcikpIHtcbiAgICBpZiAoIShjYXVzZSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNhdXNlID0gY2F1c2UuY2F1c2U7XG4gIH1cblxuICBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6aGFuZGxlU2lsZW50RXJyb3InKShlcnJvcik7XG4gIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiBJZ25vcmVzIGFuIGVycm9yIHRoYXQgaXMgdGhyb3duIGJ5IGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRvIGlnbm9yZSB0aGUgZXJyb3Igb2YuXG4gKiBAcGFyYW0gZmFsbGJhY2tWYWx1ZSAtIEFsd2F5cyBgdW5kZWZpbmVkYC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGNvbXBsZXRlcyBvciBmYWlscy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4sIGZhbGxiYWNrVmFsdWU/OiB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+O1xuLyoqXG4gKiBJbnZva2VzIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBhbmQgcmV0dXJucyBhIGZhbGxiYWNrIHZhbHVlIGlmIGFuIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbi5cbiAqIEBwYXJhbSBwcm9taXNlIC0gVGhlIHByb21pc2UgdG8gaWdub3JlIHRoZSBlcnJvciBvZi5cbiAqIEBwYXJhbSBmYWxsYmFja1ZhbHVlIC0gVGhlIHZhbHVlIHRvIHJldHVybiBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gb3IgdGhlIGZhbGxiYWNrIHZhbHVlIGlmIGFuIGVycm9yIGlzIHRocm93bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KHByb21pc2U6IFByb21pc2U8VD4sIGZhbGxiYWNrVmFsdWU6IFQpOiBQcm9taXNlPFQ+O1xuLyoqXG4gKiBJZ25vcmVzIGFuIGVycm9yIHRoYXQgaXMgdGhyb3duIGJ5IGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbi5cbiAqIEBwYXJhbSBwcm9taXNlIC0gVGhlIHByb21pc2UgdG8gaWdub3JlIHRoZSBlcnJvciBvZi5cbiAqIEBwYXJhbSBmYWxsYmFja1ZhbHVlIC0gVGhlIHZhbHVlIHRvIHJldHVybiBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gb3IgdGhlIGZhbGxiYWNrIHZhbHVlIGlmIGFuIGVycm9yIGlzIHRocm93bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KHByb21pc2U6IFByb21pc2U8VD4sIGZhbGxiYWNrVmFsdWU/OiBUKTogUHJvbWlzZTxUIHwgdm9pZD4ge1xuICBjb25zdCBpZ25vcmVFcnJvckRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ0FzeW5jOmlnbm9yZUVycm9yJyk7XG4gIGNvbnN0IHN0YWNrVHJhY2UgPSBnZXRTdGFja1RyYWNlKDEpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBwcm9taXNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlnbm9yZUVycm9yRGVidWdnZXIoXG4gICAgICAnSWdub3JlZCBlcnJvcicsXG4gICAgICBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKHtcbiAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICBtZXNzYWdlOiAnSWdub3JlZCBlcnJvcicsXG4gICAgICAgIHN0YWNrVHJhY2VcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gZmFsbGJhY2tWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEludm9rZXMgYSB7QGxpbmsgUHJvbWlzZX0gYW5kIHNhZmVseSBoYW5kbGVzIGFueSBlcnJvcnMgYnkgY2F0Y2hpbmcgdGhlbSBhbmQgZW1pdHRpbmcgYW4gYXN5bmMgZXJyb3IgZXZlbnQuXG4gKlxuICogQHBhcmFtIGFzeW5jRnVuY3Rpb24gLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGludm9rZSBzYWZlbHkuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlQXN5bmNTYWZlbHkoYXN5bmNGdW5jdGlvbjogKCkgPT4gUHJvbWlzYWJsZTx1bmtub3duPiwgc3RhY2tUcmFjZT86IHN0cmluZyk6IHZvaWQge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuXG4gIGxldCByZXN1bHQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcmVzdWx0ID0gYXN5bmNGdW5jdGlvbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9ycyAtLSBSZS1yZWplY3RpbmcgdGhlIG9yaWdpbmFsIGNhdWdodCBlcnJvciBhcy1pcy5cbiAgICBub3RpZnlBc3luY09wZXJhdGlvblN0YXJ0ZWQoYWRkRXJyb3JIYW5kbGVyKCgpID0+IFByb21pc2UucmVqZWN0KGVycm9yKSwgc3RhY2tUcmFjZSkpO1xuICB9XG4gIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgbm90aWZ5QXN5bmNPcGVyYXRpb25TdGFydGVkKGFkZEVycm9ySGFuZGxlcigoKSA9PiByZXN1bHQsIHN0YWNrVHJhY2UpKTtcbiAgfVxufVxuXG4vKipcbiAqIEludm9rZXMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGFmdGVyIGEgZGVsYXkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2VBc3luY1NhZmVseUFmdGVyRGVsYXkocGFyYW1zOiBJbnZva2VBc3luY1NhZmVseUFmdGVyRGVsYXlQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIGFzeW5jRnVuY3Rpb24sXG4gICAgZGVsYXlJbk1pbGxpc2Vjb25kcyA9IDBcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWwgPz8gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICBjb25zdCBzdGFja1RyYWNlID0gcGFyYW1zLnN0YWNrVHJhY2UgPz8gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHNsZWVwKHsgYWJvcnRTaWduYWwsIG1pbGxpc2Vjb25kczogZGVsYXlJbk1pbGxpc2Vjb25kcywgc2hvdWxkVGhyb3dPbkFib3J0OiB0cnVlIH0pO1xuICAgIGF3YWl0IGFzeW5jRnVuY3Rpb24oYWJvcnRTaWduYWwpO1xuICB9LCBzdGFja1RyYWNlKTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBhc3luYyBmdW5jdGlvbnMgc2VxdWVudGlhbGx5LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSBhc3luY0ZucyAtIFRoZSBhc3luYyBmdW5jdGlvbnMgdG8gZXhlY3V0ZSBzZXF1ZW50aWFsbHkuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgdGhlIGFzeW5jIGZ1bmN0aW9ucy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb21pc2VBbGxBc3luY0Zuc1NlcXVlbnRpYWxseTxUPihhc3luY0ZuczogKCgpID0+IFByb21pc2FibGU8VD4pW10pOiBQcm9taXNlPFRbXT4ge1xuICBjb25zdCByZXN1bHRzOiBUW10gPSBbXTtcbiAgZm9yIChjb25zdCBhc3luY0Z1bmN0aW9uIG9mIGFzeW5jRm5zKSB7XG4gICAgcmVzdWx0cy5wdXNoKGF3YWl0IGFzeW5jRnVuY3Rpb24oKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgcHJvbWlzZXMgc2VxdWVudGlhbGx5LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSBwcm9taXNlcyAtIFRoZSBwcm9taXNlcyB0byBleGVjdXRlIHNlcXVlbnRpYWxseS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiB0aGUgcHJvbWlzZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9taXNlQWxsU2VxdWVudGlhbGx5PFQ+KHByb21pc2VzOiBQcm9taXNhYmxlPFQ+W10pOiBQcm9taXNlPFRbXT4ge1xuICByZXR1cm4gYXdhaXQgcHJvbWlzZUFsbEFzeW5jRm5zU2VxdWVudGlhbGx5KHByb21pc2VzLm1hcCgocHJvbWlzZSkgPT4gKCkgPT4gcHJvbWlzZSkpO1xufVxuXG5jb25zdCB0ZXJtaW5hdGVSZXRyeUVycm9ycyA9IG5ldyBXZWFrU2V0PEVycm9yPigpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayByZXRyeVdpdGhUaW1lb3V0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRyeVdpdGhUaW1lb3V0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHRpbWVvdXQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHRpbWVvdXQgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IG9uVGltZW91dD86IChjb250ZXh0OiBUaW1lb3V0Q29udGV4dCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gICAqXG4gICAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIFRoZSBhYm9ydCBzaWduYWwgdG8gbGlzdGVuIHRvLlxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbkZ1bmN0aW9uOiAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNhYmxlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmV0cnkgb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHJldHJ5T3B0aW9ucz86IFJldHJ5T3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBzdGFja1RyYWNlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBydW5XaXRoVGltZW91dH0uXG4gKlxuICogQHR5cGVQYXJhbSBSZXN1bHQgLSBUaGUgdHlwZSBvZiB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBvcGVyYXRpb24gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuV2l0aFRpbWVvdXRQYXJhbXM8UmVzdWx0PiB7XG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0PzogdW5rbm93bjtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgdGltZW91dC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgLSBUaGUgdGltZW91dCBjb250ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgb25UaW1lb3V0PzogKGNvbnRleHQ6IFRpbWVvdXRDb250ZXh0KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gICAqXG4gICAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIFRoZSBhYm9ydCBzaWduYWwgdG8gbGlzdGVuIHRvLlxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbkZ1bmN0aW9uOiAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNhYmxlPFJlc3VsdD47XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnJ2BcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tUcmFjZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzbGVlcH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2xlZXBQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IG1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSBhYm9ydCBzaWduYWwgaXMgYWJvcnRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkFib3J0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb250ZXh0IHByb3ZpZGVkIHRvIHRoZSB0aW1lb3V0IGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZW91dENvbnRleHQge1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgb3BlcmF0aW9uIHN0YXJ0ZWQuXG4gICAqL1xuICByZWFkb25seSBkdXJhdGlvbjogbnVtYmVyO1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLlxuICAgKi9cbiAgb25PcGVyYXRpb25Db21wbGV0ZWQ6IChjYWxsYmFjazogKCkgPT4gdm9pZCkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUZXJtaW5hdGVzIHRoZSBvcGVyYXRpb24gdGhhdCB0aW1lZCBvdXQuXG4gICAqL1xuICB0ZXJtaW5hdGVPcGVyYXRpb246ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHRpbWVvdXR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVvdXRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSBhYm9ydCBzaWduYWwgaXMgYWJvcnRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkFib3J0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRpbWVvdXQgcGVyaW9kIGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIENoYWlucyBhIHByb21pc2Ugd2l0aCBhbm90aGVyIHByb21pc2UuXG4gKlxuICogQHBhcmFtIGNoYWluUHJvbWlzZSAtIFJlcHJlc2VudHMgdGhlIGNoYWluZWQgcHJvbWlzZS5cbiAqIEBwYXJhbSBwcm9taXNhYmxlRnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gY2hhaW4uXG4gKiBAcmV0dXJucyBDaGFpbmVkIHByb21pc2Ugb3IgYG51bGxgIGlmIG5vIGFzeW5jIGxvZ2ljIGlzIGNoYWluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbihjaGFpblByb21pc2U6IG51bGwgfCBQcm9taXNlPHZvaWQ+LCBwcm9taXNhYmxlRnVuY3Rpb246ICgpID0+IG51bGwgfCBQcm9taXNhYmxlPHZvaWQ+KTogbnVsbCB8IFByb21pc2U8dm9pZD4ge1xuICBsZXQgbmV4dENoYWluUHJvbWlzZSA9IGNoYWluUHJvbWlzZTtcbiAgaWYgKGNoYWluUHJvbWlzZSkge1xuICAgIG5leHRDaGFpblByb21pc2UgPSBjaGFpblByb21pc2UudGhlbigoKSA9PiBwcm9taXNhYmxlRnVuY3Rpb24oKSA/PyB1bmRlZmluZWQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByb21pc2FibGUgPSBwcm9taXNhYmxlRnVuY3Rpb24oKTtcbiAgICBpZiAocHJvbWlzYWJsZSkge1xuICAgICAgbmV4dENoYWluUHJvbWlzZSA9IHByb21pc2FibGUgaW5zdGFuY2VvZiBQcm9taXNlID8gcHJvbWlzYWJsZSBhcyBQcm9taXNlPHZvaWQ+IDogUHJvbWlzZS5yZXNvbHZlKHByb21pc2FibGUpO1xuICAgIH1cbiAgfVxuXG4gIG5leHRDaGFpblByb21pc2U/LmNhdGNoKG5vb3ApO1xuICByZXR1cm4gbmV4dENoYWluUHJvbWlzZTtcbn1cblxuLyoqXG4gKiBNYXJrcyBhbiBlcnJvciB0byB0ZXJtaW5hdGUgcmV0cnkgbG9naWMuXG4gKlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIG1hcmsgdG8gdGVybWluYXRlIHJldHJ5IGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya3NBc1Rlcm1pbmF0ZVJldHJ5KGVycm9yOiBFcnJvcik6IHZvaWQge1xuICB0ZXJtaW5hdGVSZXRyeUVycm9ycy5hZGQoZXJyb3IpO1xufVxuXG4vKipcbiAqIEFuIGFzeW5jIGZ1bmN0aW9uIHRoYXQgbmV2ZXIgZW5kcy5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IG5ldmVyIHJlc29sdmVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmV2ZXJFbmRzKCk6IFByb21pc2U8bmV2ZXI+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKCkgPT4ge1xuICAgIG5vb3AoKTtcbiAgfSk7XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFeGhhdXN0aXZlIHN3aXRjaCBndWFyZDsgdGhlIGF3YWl0IGFib3ZlIG5ldmVyIHJlc29sdmVzLiAqL1xuICBhc3NlcnQoZmFsc2UsICdTaG91bGQgbmV2ZXIgaGFwcGVuJyk7XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCB0aWNrLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgdGljayBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBuZXh0VGlja0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRvIG5hdGl2ZSBwcm9taXNhYmxlLCBjb252ZXJ0aW5nIHtAbGluayBQcm9taXNlTGlrZX0gKGFrYSBUaGVuYWJsZSkgdG8gYSBuYXRpdmUge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSBwcm9taXNhYmxlIC0gVGhlIHByb21pc2FibGUgdG8gbm9ybWFsaXplLlxuICogQHJldHVybnMgVGhlIHZhbHVlIGl0c2VsZiBvciBhIG5hdGl2ZSB7QGxpbmsgUHJvbWlzZX0gaWYgdGhlIHZhbHVlIGlzIGEge0BsaW5rIFByb21pc2VMaWtlfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVByb21pc2FibGU8VD4ocHJvbWlzYWJsZTogUHJvbWlzYWJsZTxUPik6IFByb21pc2U8VD4gfCBUIHtcbiAgaWYgKCFwcm9taXNhYmxlKSB7XG4gICAgcmV0dXJuIHByb21pc2FibGU7XG4gIH1cblxuICBpZiAocHJvbWlzYWJsZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICByZXR1cm4gcHJvbWlzYWJsZSBhcyBQcm9taXNlPFQ+O1xuICB9XG5cbiAgcmV0dXJuIChwcm9taXNhYmxlIGFzIFBhcnRpYWw8UHJvbWlzZUxpa2U8VD4+KS50aGVuID8gUHJvbWlzZS5yZXNvbHZlKHByb21pc2FibGUpIDogKHByb21pc2FibGUgYXMgVCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCBxdWV1ZSBtaWNyb3Rhc2suXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbmV4dCBxdWV1ZSBtaWNyb3Rhc2sgaXMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcXVldWVNaWNyb3Rhc2tBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHJlcXVlc3QgYW5pbWF0aW9uIGZyYW1lLlxuICpcbiAqIEBwYXJhbSBmYWxsYmFja1RpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIFRoZSBmYWxsYmFjayB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byByZXNvbHZlIHRoZSBwcm9taXNlIGlmIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIGRvZXMgbm90IGZpcmUgKGUuZy4gdGhlIHdpbmRvdyBpcyBub3QgYWN0aXZlKS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGAxMDBgIG1pbGxpc2Vjb25kcy4gVXNlIGAwYCB0byBkaXNhYmxlIHRoZSBmYWxsYmFjay5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgcmVxdWVzdCBhbmltYXRpb24gZnJhbWUgaXMgYXZhaWxhYmxlIChvciB3aGVuIHRoZSBmYWxsYmFjayB0aW1lIGlzIHJlYWNoZWQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lQXN5bmMoZmFsbGJhY2tUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVxdWVzdEFuaW1hdGlvbkZyYW1lQXN5bmNQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgREVGQVVMVF9GQUxMQkFDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwMDtcbiAgZmFsbGJhY2tUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz89IERFRkFVTFRfRkFMTEJBQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgcmV0dXJuIFByb21pc2UucmFjZShbcmVxdWVzdEFuaW1hdGlvbkZyYW1lQXN5bmNQcm9taXNlLCBmYWxsYmFja1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA+IDAgPyBzbGVlcCh7IG1pbGxpc2Vjb25kczogZmFsbGJhY2tUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSkgOiBuZXZlckVuZHMoKV0pO1xufVxuXG4vKipcbiAqIFJldHJpZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVudGlsIGl0IHJldHVybnMgYHRydWVgIG9yIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgIG9yIHJlamVjdHMgd2hlbiB0aGUgdGltZW91dCBpcyByZWFjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmV0cnlXaXRoVGltZW91dChwYXJhbXM6IFJldHJ5V2l0aFRpbWVvdXRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmV0cnlXaXRoVGltZW91dERlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ0FzeW5jOnJldHJ5V2l0aFRpbWVvdXQnKTtcbiAgY29uc3Qgc3RhY2tUcmFjZSA9IHBhcmFtcy5zdGFja1RyYWNlID8/IGdldFN0YWNrVHJhY2UoMSk7XG4gIGNvbnN0IERFRkFVTFRfUkVUUllfT1BUSU9OUyA9IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVycyAtLSBFeHRyYWN0aW5nIG1hZ2ljIG51bWJlciBhcyBhIGNvbnN0YW50IHdvdWxkIGJlIHJlcGV0aXRpdmUsIGFzIHRoZSB2YWx1ZSBpcyB1c2VkIG9ubHkgb25jZSBhbmQgaXRzIG5hbWUgd291bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHByb3BlcnR5LlxuICAgIHJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kczogMTAwLFxuICAgIHNob3VsZFJldHJ5T25FcnJvcjogZmFsc2UsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnMgLS0gRXh0cmFjdGluZyBtYWdpYyBudW1iZXIgYXMgYSBjb25zdGFudCB3b3VsZCBiZSByZXBldGl0aXZlLCBhcyB0aGUgdmFsdWUgaXMgdXNlZCBvbmx5IG9uY2UgYW5kIGl0cyBuYW1lIHdvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBwcm9wZXJ0eS5cbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IDUwMDBcbiAgfTtcbiAgY29uc3QgZnVsbE9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfUkVUUllfT1BUSU9OUywgLi4ucGFyYW1zLnJldHJ5T3B0aW9ucyB9O1xuICBmdWxsT3B0aW9ucy5hYm9ydFNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcblxuICBhd2FpdCBydW5XaXRoVGltZW91dChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UnVuV2l0aFRpbWVvdXRQYXJhbXM8dm9pZD4+KHtcbiAgICBjb250ZXh0OiB7IG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnLCByZXRyeUZ1bmN0aW9uOiBwYXJhbXMub3BlcmF0aW9uRnVuY3Rpb24gfSxcbiAgICBvblRpbWVvdXQ6IHBhcmFtcy5vblRpbWVvdXQsXG4gICAgYXN5bmMgb3BlcmF0aW9uRnVuY3Rpb24oYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBjb21iaW5lZEFib3J0U2lnbmFsID0gYWJvcnRTaWduYWxBbnkoZnVsbE9wdGlvbnMuYWJvcnRTaWduYWwsIGFib3J0U2lnbmFsKTtcbiAgICAgIGNvbWJpbmVkQWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICAgIHdoaWxlICghY29tYmluZWRBYm9ydFNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgbGV0IGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpc1N1Y2Nlc3MgPSBhd2FpdCBwYXJhbXMub3BlcmF0aW9uRnVuY3Rpb24oY29tYmluZWRBYm9ydFNpZ25hbCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gSXQgbWlnaHQgY2hhbmdlZCBpbnNpZGUgYGZuKClgLiBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gICAgICAgICAgaWYgKGNvbWJpbmVkQWJvcnRTaWduYWwuYWJvcnRlZCB8fCAhZnVsbE9wdGlvbnMuc2hvdWxkUmV0cnlPbkVycm9yIHx8IHRlcm1pbmF0ZVJldHJ5RXJyb3JzLmhhcyhlcnJvciBhcyBFcnJvcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDdXN0b21TdGFja1RyYWNlRXJyb3Ioe1xuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdyZXRyeVdpdGhUaW1lb3V0IGZhaWxlZCcsXG4gICAgICAgICAgICAgIHN0YWNrVHJhY2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmludEVycm9yKGVycm9yKTtcbiAgICAgICAgICBpc1N1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTdWNjZXNzKSB7XG4gICAgICAgICAgcHJpbnRXaXRoU3RhY2tUcmFjZSh7XG4gICAgICAgICAgICAkYXJndW1lbnRzOiBbe1xuICAgICAgICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uLFxuICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJ1xuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZWJ1Z2dlckluc3RhbmNlOiByZXRyeVdpdGhUaW1lb3V0RGVidWdnZXIsXG4gICAgICAgICAgICBtZXNzYWdlOiBgUmV0cnkgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhZnRlciAke1N0cmluZyhhdHRlbXB0KX0gYXR0ZW1wdHNgLFxuICAgICAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50V2l0aFN0YWNrVHJhY2Uoe1xuICAgICAgICAgICRhcmd1bWVudHM6IFt7XG4gICAgICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uLFxuICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJydcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBkZWJ1Z2dlckluc3RhbmNlOiByZXRyeVdpdGhUaW1lb3V0RGVidWdnZXIsXG4gICAgICAgICAgbWVzc2FnZTogYFJldHJ5IGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCl9IGNvbXBsZXRlZCB1bnN1Y2Nlc3NmdWxseS4gVHJ5aW5nIGFnYWluIGluICR7U3RyaW5nKGZ1bGxPcHRpb25zLnJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kc2AsXG4gICAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBzbGVlcCh7IGFib3J0U2lnbmFsLCBtaWxsaXNlY29uZHM6IGZ1bGxPcHRpb25zLnJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcyB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnLFxuICAgIHN0YWNrVHJhY2UsXG4gICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBmdWxsT3B0aW9ucy50aW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgfSkpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgZnVuY3Rpb24gd2l0aCBhIHRpbWVvdXQuIElmIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjb21wbGV0ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lLCBpdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgdGltZWQgb3V0LlxuICpcbiAqIElmIGBERUJVRz1vYnNpZGlhbi1kZXYtdXRpbHM6QXN5bmM6cnVuV2l0aFRpbWVvdXRgIGlzIHNldCwgdGhlIGV4ZWN1dGlvbiBpcyBub3QgdGVybWluYXRlZCBhZnRlciB0aGUgdGltZW91dCBhbmQgdGhlIGZ1bmN0aW9uIGlzIGFsbG93ZWQgdG8gcnVuIGluZGVmaW5pdGVseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFJlc3VsdCAtIFRoZSB0eXBlIG9mIHRoZSByZXN1bHQgZnJvbSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHJlamVjdHMgaWYgaXQgdGltZXMgb3V0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFRpbWVvdXQ8UmVzdWx0PihwYXJhbXM6IFJ1bldpdGhUaW1lb3V0UGFyYW1zPFJlc3VsdD4pOiBQcm9taXNlPFJlc3VsdD4ge1xuICBjb25zdCBzdGFja1RyYWNlID0gcGFyYW1zLnN0YWNrVHJhY2UgPz8gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgY29uc3QgcnVuQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCB0aW1lb3V0QWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGxldCByZXN1bHQ6IG51bGwgfCBSZXN1bHQgPSBudWxsO1xuICBsZXQgaGFzUmVzdWx0ID0gZmFsc2U7XG4gIGxldCBpc0NvbXBsZXRlZCA9IGZhbHNlO1xuICBjb25zdCBydW5XaXRoVGltZW91dERlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ0FzeW5jOnJ1bldpdGhUaW1lb3V0Jyk7XG4gIGNvbnN0IG9uVGltZW91dCA9IHBhcmFtcy5vblRpbWVvdXQgPz8gZGVmYXVsdE9uVGltZW91dDtcblxuICBhd2FpdCBQcm9taXNlLnJhY2UoW3J1bigpLCBpbm5lclRpbWVvdXQoKV0pO1xuICAvLyBUaGUgcmVzdWx0IGlzIG9ubHkgdmFsaWQgaWYgdGhlIHJ1biBmaW5pc2hlZCBvbiBpdHMgb3duLiBXaGVuIHRoZSB0aW1lb3V0IHRlcm1pbmF0ZWQgaXQsIHRoZVxuICAvLyBvcGVyYXRpb24gbWlnaHQgc3RpbGwgcmVzb2x2ZSBhZnRlcndhcmRzIChlLmcuIGEgcmV0cnkgbG9vcCB0aGF0IGV4aXRzIG9uIGFib3J0KSwgYnV0IHRoYXQgdmFsdWVcbiAgLy8gaXMgcGFzdCB0aGUgZGVhZGxpbmUgYW5kIG11c3QgYmUgdHJlYXRlZCBhcyBhIGZhaWx1cmUsIG5vdCBhIHN1Y2Nlc3MuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEJvdGggbWlnaHQgY2hhbmdlIGluc2lkZSBgcnVuKClgL2Bpbm5lclRpbWVvdXQoKWAuIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgaWYgKGhhc1Jlc3VsdCAmJiAhcnVuQWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgcmV0dXJuIHJlc3VsdCBhcyBSZXN1bHQ7XG4gIH1cblxuICB0aHJvdyBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKHtcbiAgICBjYXVzZTogcnVuQWJvcnRDb250cm9sbGVyLnNpZ25hbC5yZWFzb24sXG4gICAgbWVzc2FnZTogJ1J1biB3aXRoIHRpbWVvdXQgZmFpbGVkJyxcbiAgICBzdGFja1RyYWNlXG4gIH0pO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uKHJ1bkFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBNYXRoLnRydW5jKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lKTtcbiAgICAgIHByaW50V2l0aFN0YWNrVHJhY2Uoe1xuICAgICAgICAkYXJndW1lbnRzOiBbe1xuICAgICAgICAgIGNvbnRleHQ6IHBhcmFtcy5jb250ZXh0LFxuICAgICAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiBwYXJhbXMub3BlcmF0aW9uRnVuY3Rpb24sXG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJydcbiAgICAgICAgfV0sXG4gICAgICAgIGRlYnVnZ2VySW5zdGFuY2U6IHJ1bldpdGhUaW1lb3V0RGVidWdnZXIsXG4gICAgICAgIG1lc3NhZ2U6IGBFeGVjdXRpb24gdGltZTogJHtTdHJpbmcoZHVyYXRpb24pfSBtaWxsaXNlY29uZHNgLFxuICAgICAgICBzdGFja1RyYWNlXG4gICAgICB9KTtcbiAgICAgIGhhc1Jlc3VsdCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJ1bkFib3J0Q29udHJvbGxlci5hYm9ydChlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgIHRpbWVvdXRBYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdDb21wbGV0ZWQnKSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaW5uZXJUaW1lb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHNsZWVwKHsgYWJvcnRTaWduYWw6IHRpbWVvdXRBYm9ydENvbnRyb2xsZXIuc2lnbmFsLCBtaWxsaXNlY29uZHM6IHBhcmFtcy50aW1lb3V0SW5NaWxsaXNlY29uZHMgfSk7XG5cbiAgICBpZiAoaXNDb21wbGV0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb24gPSBNYXRoLnRydW5jKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lKTtcbiAgICBwcmludFdpdGhTdGFja1RyYWNlKHtcbiAgICAgICRhcmd1bWVudHM6IFt7XG4gICAgICAgIGNvbnRleHQ6IHBhcmFtcy5jb250ZXh0LFxuICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uLFxuICAgICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJ1xuICAgICAgfV0sXG4gICAgICBkZWJ1Z2dlckluc3RhbmNlOiBydW5XaXRoVGltZW91dERlYnVnZ2VyLFxuICAgICAgbWVzc2FnZTogYFRpbWVkIG91dCBhZnRlciAke1N0cmluZyhkdXJhdGlvbil9IG1pbGxpc2Vjb25kc2AsXG4gICAgICBzdGFja1RyYWNlXG4gICAgfSk7XG5cbiAgICBjb25zdCB0aW1lb3V0Q29udGV4dDogVGltZW91dENvbnRleHQgPSBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VGltZW91dENvbnRleHQ+KHtcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgb25PcGVyYXRpb25Db21wbGV0ZWQoY2FsbGJhY2spIHtcbiAgICAgICAgdGltZW91dEFib3J0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBjYWxsYmFjayk7XG4gICAgICB9LFxuICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJycsXG4gICAgICB0ZXJtaW5hdGVPcGVyYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBUaW1lZCBvdXQgYWZ0ZXIgJHtTdHJpbmcoZHVyYXRpb24pfSBtaWxsaXNlY29uZHNgKTtcbiAgICAgICAgcnVuQWJvcnRDb250cm9sbGVyLmFib3J0KGVycm9yKTtcbiAgICAgICAgdGltZW91dEFib3J0Q29udHJvbGxlci5hYm9ydChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBvblRpbWVvdXQodGltZW91dENvbnRleHQpO1xuICAgIGF3YWl0IHdhaXRGb3JBYm9ydCh0aW1lb3V0QWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHNldCBpbW1lZGlhdGUuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbmV4dCBzZXQgaW1tZWRpYXRlIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldEltbWVkaWF0ZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxheXMgZXhlY3V0aW9uIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSBkZWxheSAtIFRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0VGltZW91dEFzeW5jKGRlbGF5PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgd2luZG93LnNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxheXMgZXhlY3V0aW9uIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2xlZXAocGFyYW1zOiBTbGVlcFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYWJvcnRTaWduYWwsXG4gICAgbWlsbGlzZWNvbmRzLFxuICAgIHNob3VsZFRocm93T25BYm9ydFxuICB9ID0gcGFyYW1zO1xuICBhd2FpdCB3YWl0Rm9yQWJvcnQoYWJvcnRTaWduYWxBbnkoYWJvcnRTaWduYWwsIGFib3J0U2lnbmFsVGltZW91dChtaWxsaXNlY29uZHMpKSk7XG4gIGlmIChzaG91bGRUaHJvd09uQWJvcnQpIHtcbiAgICBhYm9ydFNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZWplY3RzIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZW91dCBwZXJpb2QuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IGFsd2F5cyByZWplY3RzIHdpdGggYSB0aW1lb3V0IGVycm9yLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGltZW91dChwYXJhbXM6IFRpbWVvdXRQYXJhbXMpOiBQcm9taXNlPG5ldmVyPiB7XG4gIGNvbnN0IHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBzaG91bGRUaHJvd09uQWJvcnQsXG4gICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gIH0gPSBwYXJhbXM7XG4gIGF3YWl0IHNsZWVwKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTbGVlcFBhcmFtcz4oe1xuICAgIGFib3J0U2lnbmFsLFxuICAgIG1pbGxpc2Vjb25kczogdGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIHNob3VsZFRocm93T25BYm9ydFxuICB9KSk7XG4gIHRocm93IG5ldyBFcnJvcihgVGltZWQgb3V0IGluICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kc2ApO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBhbiBhcnJheSBieSBjb25zdW1pbmcgYWxsIGl0cyBlbGVtZW50cy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBwcm9kdWNlZCBieSB0aGUgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yLlxuICogQHBhcmFtIGl0ZXIgLSBUaGUgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdG9BcnJheTxUPihpdGVyOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VD4pOiBQcm9taXNlPFRbXT4ge1xuICBjb25zdCBhcnJheTogVFtdID0gW107XG4gIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBpdGVyKSB7XG4gICAgYXJyYXkucHVzaChpdGVtKTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRPblRpbWVvdXQoY29udGV4dDogVGltZW91dENvbnRleHQpOiB2b2lkIHtcbiAgY29udGV4dC50ZXJtaW5hdGVPcGVyYXRpb24oKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxtQ0FBbUM7QUFDNUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNF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QSxNQUNqRjtBQUFBLE1BQ0EscUJBQXFCLFVBQVU7QUFDN0IsK0JBQXVCLE9BQU8saUJBQWlCLFNBQVMsUUFBUTtBQUFBLE1BQ2xFO0FBQUEsTUFDQSxlQUFlLE9BQU8saUJBQWlCO0FBQUEsTUFDdkMscUJBQXFCO0FBQ25CLGNBQU0sUUFBUSxJQUFJLE1BQU0sbUJBQW1CLE9BQU8sUUFBUSxDQUFDLGVBQWU7QUFDMUUsMkJBQW1CLE1BQU0sS0FBSztBQUM5QiwrQkFBdUIsTUFBTSxLQUFLO0FBQUEsTUFDcEM7QUFBQSxJQUNGLENBQUM7QUFFRCxjQUFVLGNBQWM7QUFDeEIsVUFBTSxhQUFhLHVCQUF1QixNQUFNO0FBQUEsRUFDbEQ7QUFDRjtBQU9BLGVBQXNCLG9CQUFtQztBQUN2RCxTQUFPLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDOUIsaUJBQWEsTUFBTTtBQUNqQixjQUFRO0FBQUEsSUFDVixDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0g7QUFRQSxlQUFzQixnQkFBZ0IsT0FBK0I7QUFDbkUsUUFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZO0FBQzdCLFdBQU8sV0FBVyxTQUFTLEtBQUs7QUFBQSxFQUNsQyxDQUFDO0FBQ0g7QUFRQSxlQUFzQixNQUFNLFFBQW9DO0FBQzlELFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixRQUFNLGFBQWEsZUFBZSxhQUFhLG1CQUFtQixZQUFZLENBQUMsQ0FBQztBQUNoRixNQUFJLG9CQUFvQjtBQUN0QixpQkFBYSxlQUFlO0FBQUEsRUFDOUI7QUFDRjtBQVFBLGVBQXNCLFFBQVEsUUFBdUM7QUFDbkUsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLFFBQU0sTUFBTSw0QkFBeUM7QUFBQSxJQUNuRDtBQUFBLElBQ0EsY0FBYztBQUFBLElBQ2Q7QUFBQSxFQUNGLENBQUMsQ0FBQztBQUNGLFFBQU0sSUFBSSxNQUFNLGdCQUFnQixPQUFPLHFCQUFxQixDQUFDLGVBQWU7QUFDOUU7QUFTQSxlQUFzQixRQUFXLE1BQThDO0FBQzdFLFFBQU0sUUFBYSxDQUFDO0FBQ3BCLG1CQUFpQixRQUFRLE1BQU07QUFDN0IsVUFBTSxLQUFLLElBQUk7QUFBQSxFQUNqQjtBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMsaUJBQWlCLFNBQStCO0FBQ3ZELFVBQVEsbUJBQW1CO0FBQzdCOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/// <reference path="./library.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* A small audible-feedback helper that plays a short, throttled beep via the Web Audio API. Use it to
|
|
6
|
+
* signal a rejected or blocked user action — e.g. typing into a locked note, or attempting an action
|
|
7
|
+
* while a modal is minimized.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Plays a short, throttled beep to signal a rejected or blocked user action.
|
|
11
|
+
*/
|
|
12
|
+
export declare class Beeper {
|
|
13
|
+
private audioContext;
|
|
14
|
+
private lastBeepMilliseconds;
|
|
15
|
+
/**
|
|
16
|
+
* Plays a short beep. A no-op if called again within {@link BEEP_THROTTLE_MILLISECONDS} of the
|
|
17
|
+
* previous beep (so a burst of rejected actions does not stack into a buzz), or if the Web Audio API
|
|
18
|
+
* is unavailable (e.g. the jsdom test environment).
|
|
19
|
+
*/
|
|
20
|
+
beep(): void;
|
|
21
|
+
}
|