footprintjs 10.6.0 → 10.7.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/CLAUDE.md +2 -1
- package/dist/esm/index.d.ts +12 -2
- package/dist/esm/index.js +5 -3
- package/dist/esm/lib/attempt/backoff.d.ts +96 -0
- package/dist/esm/lib/attempt/backoff.js +173 -0
- package/dist/esm/lib/attempt/deadline.d.ts +0 -5
- package/dist/esm/lib/attempt/deadline.js +2 -27
- package/dist/esm/lib/attempt/index.d.ts +6 -4
- package/dist/esm/lib/attempt/index.js +6 -5
- package/dist/esm/lib/attempt/runner.js +3 -2
- package/dist/esm/lib/detach/drivers/setTimeout.d.ts +4 -2
- package/dist/esm/lib/detach/drivers/setTimeout.js +12 -2
- package/dist/esm/lib/detach/flush.d.ts +6 -1
- package/dist/esm/lib/detach/flush.js +8 -6
- package/dist/esm/lib/observer-queue/deferredDispatcher.d.ts +8 -1
- package/dist/esm/lib/observer-queue/deferredDispatcher.js +13 -6
- package/dist/esm/lib/recorder/AttemptRecorder.js +8 -9
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +7 -2
- package/dist/esm/lib/runner/FlowChartExecutor.js +8 -3
- package/dist/esm/lib/runner/captureHistory.js +6 -4
- package/dist/esm/lib/runner/deadline.js +3 -2
- package/dist/esm/lib/runner/recordSink.d.ts +2 -1
- package/dist/esm/lib/runner/recordSink.js +12 -7
- package/dist/esm/lib/sinks/fileSink.js +7 -6
- package/dist/esm/lib/sinks/indexedIO.js +5 -3
- package/dist/esm/lib/timers/longTimeout.d.ts +37 -0
- package/dist/esm/lib/timers/longTimeout.js +56 -0
- package/dist/index.js +8 -3
- package/dist/lib/attempt/backoff.js +178 -0
- package/dist/lib/attempt/deadline.js +4 -30
- package/dist/lib/attempt/index.js +9 -6
- package/dist/lib/attempt/runner.js +4 -3
- package/dist/lib/detach/drivers/setTimeout.js +12 -2
- package/dist/lib/detach/flush.js +8 -6
- package/dist/lib/observer-queue/deferredDispatcher.js +13 -6
- package/dist/lib/recorder/AttemptRecorder.js +8 -9
- package/dist/lib/runner/FlowChartExecutor.js +8 -3
- package/dist/lib/runner/captureHistory.js +6 -4
- package/dist/lib/runner/deadline.js +3 -2
- package/dist/lib/runner/recordSink.js +12 -7
- package/dist/lib/sinks/fileSink.js +7 -6
- package/dist/lib/sinks/indexedIO.js +5 -3
- package/dist/lib/timers/longTimeout.js +60 -0
- package/dist/types/index.d.ts +12 -2
- package/dist/types/lib/attempt/backoff.d.ts +96 -0
- package/dist/types/lib/attempt/deadline.d.ts +0 -5
- package/dist/types/lib/attempt/index.d.ts +6 -4
- package/dist/types/lib/detach/drivers/setTimeout.d.ts +4 -2
- package/dist/types/lib/detach/flush.d.ts +6 -1
- package/dist/types/lib/observer-queue/deferredDispatcher.d.ts +8 -1
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +7 -2
- package/dist/types/lib/runner/recordSink.d.ts +2 -1
- package/dist/types/lib/timers/longTimeout.d.ts +37 -0
- package/package.json +2 -2
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
2
|
import { close, constants, fstatSync, openSync, read } from 'node:fs';
|
|
3
3
|
import { getuid } from 'node:process';
|
|
4
|
+
import { setLongTimeout } from '../timers/longTimeout.js';
|
|
4
5
|
import { checkSignal, IndexedRefusal } from './indexedAdmission.js';
|
|
5
6
|
/** The path is a host capability, never a path constructed from a stored run or requested node. */
|
|
6
7
|
export function openIndexedDescriptor(path) {
|
|
@@ -67,7 +68,8 @@ export async function boundedIndexedWork(work, timeoutMs, signal, settled) {
|
|
|
67
68
|
interrupt({ status: 'unknown', reason: 'cancelled' });
|
|
68
69
|
};
|
|
69
70
|
signal?.addEventListener('abort', cancel, { once: true });
|
|
70
|
-
|
|
71
|
+
// The one long-timer law (`timers/longTimeout.ts`); the door admits at most 30 000 ms today.
|
|
72
|
+
const cancelTimer = setLongTimeout(() => {
|
|
71
73
|
controller.abort();
|
|
72
74
|
interrupt({ status: 'unknown', reason: 'timeout' });
|
|
73
75
|
}, timeoutMs);
|
|
@@ -89,8 +91,8 @@ export async function boundedIndexedWork(work, timeoutMs, signal, settled) {
|
|
|
89
91
|
return await Promise.race([running, interrupted]);
|
|
90
92
|
}
|
|
91
93
|
finally {
|
|
92
|
-
|
|
94
|
+
cancelTimer();
|
|
93
95
|
signal?.removeEventListener('abort', cancel);
|
|
94
96
|
}
|
|
95
97
|
}
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZElPLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zaW5rcy9pbmRleGVkSU8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXRDLE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHcEUsbUdBQW1HO0FBQ25HLE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUFZO0lBQ2hELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDekcsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hHLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEVBQVU7SUFDckMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLE1BQU0sR0FBRyxHQUFHLE9BQU8sTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoRSxJQUNFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNkLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQztRQUNoQixDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksQ0FB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QyxLQUFLLEVBQUUsQ0FBQztRQUNuQixPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFXLENBQUM7SUFDM0QsQ0FBQyxFQUNELENBQUMsS0FBYyxFQUFFLEVBQUU7UUFDakIsSUFBSSxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUTtZQUFFLE1BQU0sS0FBSyxDQUFDO1FBQzlDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFXLENBQUM7SUFDM0QsQ0FBQyxDQUNGLENBQUM7SUFDSixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvQixJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7WUFBUyxDQUFDO1FBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0MsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY2xvc2UsIGNvbnN0YW50cywgZnN0YXRTeW5jLCBvcGVuU3luYywgcmVhZCB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgZ2V0dWlkIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHsgY2hlY2tTaWduYWwsIEluZGV4ZWRSZWZ1c2FsIH0gZnJvbSAnLi9pbmRleGVkQWRtaXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSW5kZXhlZFJlY29yZFVua25vd24gfSBmcm9tICcuL2luZGV4ZWRUeXBlcy5qcyc7XG5cbi8qKiBUaGUgcGF0aCBpcyBhIGhvc3QgY2FwYWJpbGl0eSwgbmV2ZXIgYSBwYXRoIGNvbnN0cnVjdGVkIGZyb20gYSBzdG9yZWQgcnVuIG9yIHJlcXVlc3RlZCBub2RlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wZW5JbmRleGVkRGVzY3JpcHRvcihwYXRoOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnIHx8ICFwYXRoLmxlbmd0aCkgdGhyb3cgbmV3IFR5cGVFcnJvcignb3BlbkluZGV4ZWRSZWNvcmRGaWxlOiBpbnZhbGlkIHBhdGgnKTtcbiAgcmV0dXJuIG9wZW5TeW5jKHBhdGgsIGNvbnN0YW50cy5PX1JET05MWSB8IChjb25zdGFudHMuT19OT0ZPTExPVyA/PyAwKSB8IChjb25zdGFudHMuT19OT05CTE9DSyA/PyAwKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWxlSWRlbnRpdHkoZmQ6IG51bWJlcik6IHsgcmVhZG9ubHkga2V5OiBzdHJpbmc7IHJlYWRvbmx5IHNpemU6IG51bWJlciB9IHtcbiAgY29uc3Qgc3RhdCA9IGZzdGF0U3luYyhmZCk7XG4gIGNvbnN0IHVpZCA9IHR5cGVvZiBnZXR1aWQgPT09ICdmdW5jdGlvbicgPyBnZXR1aWQoKSA6IHVuZGVmaW5lZDtcbiAgaWYgKFxuICAgICFzdGF0LmlzRmlsZSgpIHx8XG4gICAgc3RhdC5ubGluayAhPT0gMSB8fFxuICAgICh1aWQgIT09IHVuZGVmaW5lZCAmJiAoc3RhdC51aWQgIT09IHVpZCB8fCAoc3RhdC5tb2RlICYgMG8wMjIpICE9PSAwKSkgfHxcbiAgICAhTnVtYmVyLmlzU2FmZUludGVnZXIoc3RhdC5zaXplKSB8fFxuICAgIHN0YXQuc2l6ZSA8IDBcbiAgKVxuICAgIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgndW5hdmFpbGFibGUnKTtcbiAgcmV0dXJuIHsga2V5OiBKU09OLnN0cmluZ2lmeShbc3RhdC5kZXYsIHN0YXQuaW5vLCBzdGF0LnNpemUsIHN0YXQubXRpbWVNcywgc3RhdC5jdGltZU1zXSksIHNpemU6IHN0YXQuc2l6ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SWRlbnRpdHkoZmQ6IG51bWJlciwga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGZpbGVJZGVudGl0eShmZCkua2V5ICE9PSBrZXkpIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgnc3RhbGUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZ2VzdChieXRlczogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoYnl0ZXMpLmRpZ2VzdCgnaGV4Jyk7XG59XG5cbi8qKiBQb3NpdGlvbmFsIGJ5dGVzIG9ubHk7IGV4YWN0IHNob3J0LXJlYWQgYWNjb3VudGluZyBpcyByZXRhaW5lZCBldmVuIHdoZW4gYSBsYXRlciBjaGVjayByZWZ1c2VzIHRoZW0uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEJ5dGVzKFxuICBmZDogbnVtYmVyLFxuICBvZmZzZXQ6IG51bWJlcixcbiAgYnl0ZXM6IG51bWJlcixcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgY291bnQ6IChieXRlczogbnVtYmVyKSA9PiB2b2lkLFxuICBzdWJtaXR0ZWQ/OiAoKSA9PiB2b2lkLFxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbiAgbGV0IGZpbGxlZCA9IDA7XG4gIHdoaWxlIChmaWxsZWQgPCBieXRlcykge1xuICAgIGNoZWNrU2lnbmFsKHNpZ25hbCk7XG4gICAgY29uc3QgbGVuZ3RoID0gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzdWJtaXR0ZWQ/LigpO1xuICAgICAgcmVhZChmZCwgYnVmZmVyLCBmaWxsZWQsIGJ5dGVzIC0gZmlsbGVkLCBvZmZzZXQgKyBmaWxsZWQsIChlcnJvciwgYW1vdW50KSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgZWxzZSByZXNvbHZlKGFtb3VudCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb3VudChsZW5ndGgpO1xuICAgIGlmICghbGVuZ3RoKSB0aHJvdyBuZXcgSW5kZXhlZFJlZnVzYWwoJ3N0YWxlJyk7XG4gICAgZmlsbGVkICs9IGxlbmd0aDtcbiAgfVxuICBjaGVja1NpZ25hbChzaWduYWwpO1xuICByZXR1cm4gYnVmZmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VEZXNjcmlwdG9yKGZkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBjbG9zZShmZCwgKCkgPT4gcmVzb2x2ZSgpKSk7XG59XG5cbi8qKiBBIHRpbWVvdXQgYm91bmRzIHRoZSB3YWl0LCBuZXZlciBmcmVlcyBhbiB1bmZpbmlzaGVkIG9wZXJhdGlvbidzIGZpbGUvc2xvdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBib3VuZGVkSW5kZXhlZFdvcms8VD4oXG4gIHdvcms6IChzaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPFQ+LFxuICB0aW1lb3V0TXM6IG51bWJlcixcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCxcbiAgc2V0dGxlZDogKCkgPT4gdm9pZCxcbik6IFByb21pc2U8VCB8IEluZGV4ZWRSZWNvcmRVbmtub3duPiB7XG4gIGlmIChzaWduYWw/LmFib3J0ZWQpIHtcbiAgICBzZXR0bGVkKCk7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiAndW5rbm93bicsIHJlYXNvbjogJ2NhbmNlbGxlZCcgfTtcbiAgfVxuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBkZWFkbGluZSA9IHBlcmZvcm1hbmNlLm5vdygpICsgdGltZW91dE1zO1xuICBsZXQgaW50ZXJydXB0OiAocmVhc29uOiBJbmRleGVkUmVjb3JkVW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHVuZGVmaW5lZDtcbiAgY29uc3QgaW50ZXJydXB0ZWQgPSBuZXcgUHJvbWlzZTxJbmRleGVkUmVjb3JkVW5rbm93bj4oKHJlc29sdmUpID0+IChpbnRlcnJ1cHQgPSByZXNvbHZlKSk7XG4gIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgaW50ZXJydXB0KHsgc3RhdHVzOiAndW5rbm93bicsIHJlYXNvbjogJ2NhbmNlbGxlZCcgfSk7XG4gIH07XG4gIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBjYW5jZWwsIHsgb25jZTogdHJ1ZSB9KTtcbiAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgaW50ZXJydXB0KHsgc3RhdHVzOiAndW5rbm93bicsIHJlYXNvbjogJ3RpbWVvdXQnIH0pO1xuICB9LCB0aW1lb3V0TXMpO1xuICBjb25zdCBydW5uaW5nID0gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAudGhlbigoKSA9PiB3b3JrKGNvbnRyb2xsZXIuc2lnbmFsKSlcbiAgICAudGhlbihcbiAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAocGVyZm9ybWFuY2Uubm93KCkgPCBkZWFkbGluZSkgcmV0dXJuIHZhbHVlO1xuICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogJ3Vua25vd24nLCByZWFzb246ICd0aW1lb3V0JyB9IGFzIGNvbnN0O1xuICAgICAgfSxcbiAgICAgIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAocGVyZm9ybWFuY2Uubm93KCkgPCBkZWFkbGluZSkgdGhyb3cgZXJyb3I7XG4gICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiAndW5rbm93bicsIHJlYXNvbjogJ3RpbWVvdXQnIH0gYXMgY29uc3Q7XG4gICAgICB9LFxuICAgICk7XG4gIHJ1bm5pbmcudGhlbihzZXR0bGVkLCBzZXR0bGVkKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtydW5uaW5nLCBpbnRlcnJ1cHRlZF0pO1xuICB9IGZpbmFsbHkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGNhbmNlbCk7XG4gIH1cbn1cbiJdfQ==
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZElPLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zaW5rcy9pbmRleGVkSU8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBR3BFLG1HQUFtRztBQUNuRyxNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFBWTtJQUNoRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1FBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ3pHLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RyxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxFQUFVO0lBQ3JDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzQixNQUFNLEdBQUcsR0FBRyxPQUFPLE1BQU0sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEUsSUFDRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDZCxJQUFJLENBQUMsS0FBSyxL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QyxHQUFHLEVBQUUsR0FBRyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDL0MsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQVcsQ0FBQztJQUMzRCxDQUFDLEVBQ0QsQ0FBQyxLQUFjLEVBQUUsRUFBRTtRQUNqQixJQUFJLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRO1lBQUUsTUFBTSxLQUFLLENBQUM7UUFDOUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQVcsQ0FBQztJQUMzRCxDQUFDLENBQ0YsQ0FBQztJQUNKLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9CLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztZQUFTLENBQUM7UUFDVCxXQUFXLEVBQUUsQ0FBQztRQUNkLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0MsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY2xvc2UsIGNvbnN0YW50cywgZnN0YXRTeW5jLCBvcGVuU3luYywgcmVhZCB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgZ2V0dWlkIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHsgc2V0TG9uZ1RpbWVvdXQgfSBmcm9tICcuLi90aW1lcnMvbG9uZ1RpbWVvdXQuanMnO1xuaW1wb3J0IHsgY2hlY2tTaWduYWwsIEluZGV4ZWRSZWZ1c2FsIH0gZnJvbSAnLi9pbmRleGVkQWRtaXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSW5kZXhlZFJlY29yZFVua25vd24gfSBmcm9tICcuL2luZGV4ZWRUeXBlcy5qcyc7XG5cbi8qKiBUaGUgcGF0aCBpcyBhIGhvc3QgY2FwYWJpbGl0eSwgbmV2ZXIgYSBwYXRoIGNvbnN0cnVjdGVkIGZyb20gYSBzdG9yZWQgcnVuIG9yIHJlcXVlc3RlZCBub2RlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wZW5JbmRleGVkRGVzY3JpcHRvcihwYXRoOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnIHx8ICFwYXRoLmxlbmd0aCkgdGhyb3cgbmV3IFR5cGVFcnJvcignb3BlbkluZGV4ZWRSZWNvcmRGaWxlOiBpbnZhbGlkIHBhdGgnKTtcbiAgcmV0dXJuIG9wZW5TeW5jKHBhdGgsIGNvbnN0YW50cy5PX1JET05MWSB8IChjb25zdGFudHMuT19OT0ZPTExPVyA/PyAwKSB8IChjb25zdGFudHMuT19OT05CTE9DSyA/PyAwKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWxlSWRlbnRpdHkoZmQ6IG51bWJlcik6IHsgcmVhZG9ubHkga2V5OiBzdHJpbmc7IHJlYWRvbmx5IHNpemU6IG51bWJlciB9IHtcbiAgY29uc3Qgc3RhdCA9IGZzdGF0U3luYyhmZCk7XG4gIGNvbnN0IHVpZCA9IHR5cGVvZiBnZXR1aWQgPT09ICdmdW5jdGlvbicgPyBnZXR1aWQoKSA6IHVuZGVmaW5lZDtcbiAgaWYgKFxuICAgICFzdGF0LmlzRmlsZSgpIHx8XG4gICAgc3RhdC5ubGluayAhPT0gMSB8fFxuICAgICh1aWQgIT09IHVuZGVmaW5lZCAmJiAoc3RhdC51aWQgIT09IHVpZCB8fCAoc3RhdC5tb2RlICYgMG8wMjIpICE9PSAwKSkgfHxcbiAgICAhTnVtYmVyLmlzU2FmZUludGVnZXIoc3RhdC5zaXplKSB8fFxuICAgIHN0YXQuc2l6ZSA8IDBcbiAgKVxuICAgIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgndW5hdmFpbGFibGUnKTtcbiAgcmV0dXJuIHsga2V5OiBKU09OLnN0cmluZ2lmeShbc3RhdC5kZXYsIHN0YXQuaW5vLCBzdGF0LnNpemUsIHN0YXQubXRpbWVNcywgc3RhdC5jdGltZU1zXSksIHNpemU6IHN0YXQuc2l6ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SWRlbnRpdHkoZmQ6IG51bWJlciwga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGZpbGVJZGVudGl0eShmZCkua2V5ICE9PSBrZXkpIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgnc3RhbGUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZ2VzdChieXRlczogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoYnl0ZXMpLmRpZ2VzdCgnaGV4Jyk7XG59XG5cbi8qKiBQb3NpdGlvbmFsIGJ5dGVzIG9ubHk7IGV4YWN0IHNob3J0LXJlYWQgYWNjb3VudGluZyBpcyByZXRhaW5lZCBldmVuIHdoZW4gYSBsYXRlciBjaGVjayByZWZ1c2VzIHRoZW0uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEJ5dGVzKFxuICBmZDogbnVtYmVyLFxuICBvZmZzZXQ6IG51bWJlcixcbiAgYnl0ZXM6IG51bWJlcixcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgY291bnQ6IChieXRlczogbnVtYmVyKSA9PiB2b2lkLFxuICBzdWJtaXR0ZWQ/OiAoKSA9PiB2b2lkLFxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbiAgbGV0IGZpbGxlZCA9IDA7XG4gIHdoaWxlIChmaWxsZWQgPCBieXRlcykge1xuICAgIGNoZWNrU2lnbmFsKHNpZ25hbCk7XG4gICAgY29uc3QgbGVuZ3RoID0gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzdWJtaXR0ZWQ/LigpO1xuICAgICAgcmVhZChmZCwgYnVmZmVyLCBmaWxsZWQsIGJ5dGVzIC0gZmlsbGVkLCBvZmZzZXQgKyBmaWxsZWQsIChlcnJvciwgYW1vdW50KSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgZWxzZSByZXNvbHZlKGFtb3VudCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb3VudChsZW5ndGgpO1xuICAgIGlmICghbGVuZ3RoKSB0aHJvdyBuZXcgSW5kZXhlZFJlZnVzYWwoJ3N0YWxlJyk7XG4gICAgZmlsbGVkICs9IGxlbmd0aDtcbiAgfVxuICBjaGVja1NpZ25hbChzaWduYWwpO1xuICByZXR1cm4gYnVmZmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VEZXNjcmlwdG9yKGZkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBjbG9zZShmZCwgKCkgPT4gcmVzb2x2ZSgpKSk7XG59XG5cbi8qKiBBIHRpbWVvdXQgYm91bmRzIHRoZSB3YWl0LCBuZXZlciBmcmVlcyBhbiB1bmZpbmlzaGVkIG9wZXJhdGlvbidzIGZpbGUvc2xvdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBib3VuZGVkSW5kZXhlZFdvcms8VD4oXG4gIHdvcms6IChzaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPFQ+LFxuICB0aW1lb3V0TXM6IG51bWJlcixcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCxcbiAgc2V0dGxlZDogKCkgPT4gdm9pZCxcbik6IFByb21pc2U8VCB8IEluZGV4ZWRSZWNvcmRVbmtub3duPiB7XG4gIGlmIChzaWduYWw/LmFib3J0ZWQpIHtcbiAgICBzZXR0bGVkKCk7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiAndW5rbm93bicsIHJlYXNvbjogJ2NhbmNlbGxlZCcgfTtcbiAgfVxuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBkZWFkbGluZSA9IHBlcmZvcm1hbmNlLm5vdygpICsgdGltZW91dE1zO1xuICBsZXQgaW50ZXJydXB0OiAocmVhc29uOiBJbmRleGVkUmVjb3JkVW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHVuZGVmaW5lZDtcbiAgY29uc3QgaW50ZXJydXB0ZWQgPSBuZXcgUHJvbWlzZTxJbmRleGVkUmVjb3JkVW5rbm93bj4oKHJlc29sdmUpID0+IChpbnRlcnJ1cHQgPSByZXNvbHZlKSk7XG4gIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgaW50ZXJydXB0KHsgc3RhdHVzOiAndW5rbm93bicsIHJlYXNvbjogJ2NhbmNlbGxlZCcgfSk7XG4gIH07XG4gIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBjYW5jZWwsIHsgb25jZTogdHJ1ZSB9KTtcbiAgLy8gVGhlIG9uZSBsb25nLXRpbWVyIGxhdyAoYHRpbWVycy9sb25nVGltZW91dC50c2ApOyB0aGUgZG9vciBhZG1pdHMgYXQgbW9zdCAzMCAwMDAgbXMgdG9kYXkuXG4gIGNvbnN0IGNhbmNlbFRpbWVyID0gc2V0TG9uZ1RpbWVvdXQoKCkgPT4ge1xuICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICBpbnRlcnJ1cHQoeyBzdGF0dXM6ICd1bmtub3duJywgcmVhc29uOiAndGltZW91dCcgfSk7XG4gIH0sIHRpbWVvdXRNcyk7XG4gIGNvbnN0IHJ1bm5pbmcgPSBQcm9taXNlLnJlc29sdmUoKVxuICAgIC50aGVuKCgpID0+IHdvcmsoY29udHJvbGxlci5zaWduYWwpKVxuICAgIC50aGVuKFxuICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChwZXJmb3JtYW5jZS5ub3coKSA8IGRlYWRsaW5lKSByZXR1cm4gdmFsdWU7XG4gICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiAndW5rbm93bicsIHJlYXNvbjogJ3RpbWVvdXQnIH0gYXMgY29uc3Q7XG4gICAgICB9LFxuICAgICAgKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmIChwZXJmb3JtYW5jZS5ub3coKSA8IGRlYWRsaW5lKSB0aHJvdyBlcnJvcjtcbiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICByZXR1cm4geyBzdGF0dXM6ICd1bmtub3duJywgcmVhc29uOiAndGltZW91dCcgfSBhcyBjb25zdDtcbiAgICAgIH0sXG4gICAgKTtcbiAgcnVubmluZy50aGVuKHNldHRsZWQsIHNldHRsZWQpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW3J1bm5pbmcsIGludGVycnVwdGVkXSk7XG4gIH0gZmluYWxseSB7XG4gICAgY2FuY2VsVGltZXIoKTtcbiAgICBzaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgY2FuY2VsKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* timers/longTimeout.ts — the ONE long-timer law: how the library arms a host timer for a limit of any length.
|
|
3
|
+
*
|
|
4
|
+
* A host timer holds at most 2^31 − 1 ms (about 24.8 days). Node turns a longer delay — `Infinity` included — into
|
|
5
|
+
* 1 ms, with a `TimeoutOverflowWarning`, so a raw `setTimeout(fn, limit)` gives up at once exactly when the caller
|
|
6
|
+
* asked to wait longest. Every wait of a caller-supplied length is armed here: an attempt's cap and the wait between
|
|
7
|
+
* attempts (`attempt/runner.ts`), the run's deadline (`attempt/deadline.ts · armDeadline`,
|
|
8
|
+
* `runner/deadline.ts · armRun`), the drains and flushes that wait at most a caller's `timeoutMs`
|
|
9
|
+
* (`observer-queue/deferredDispatcher.ts · drain`, `detach/flush.ts · flushAllDetached`, `runner/recordSink.ts ·
|
|
10
|
+
* flush`, `sinks/fileSink.ts`), the bounded reads (`sinks/indexedIO.ts`, `recorder/AttemptRecorder.ts`,
|
|
11
|
+
* `runner/captureHistory.ts`) and the `setTimeout` detach driver. `test/architecture/timer-law.test.ts` refuses a raw
|
|
12
|
+
* host timer — or any other way of reaching one — anywhere else in `src/`.
|
|
13
|
+
*
|
|
14
|
+
* THE LAW, by the limit:
|
|
15
|
+
* - `Infinity` — no limit: NO timer is armed and `fn` never runs, so nothing keeps the process alive on its account.
|
|
16
|
+
* The work the limit bounds decides when the wait ends.
|
|
17
|
+
* - a finite delay past 2^31 − 1 ms — waited in chunks of at most 2^31 − 1 ms, so it never fires early and never in
|
|
18
|
+
* 1 ms: a 30-day deadline fires after 30 days.
|
|
19
|
+
* - anything else that is not a number > 0 (`0`, a negative, `-Infinity`, `NaN`) — already due: `fn` runs on the
|
|
20
|
+
* next timer turn, as the host runs `setTimeout(fn, 0)`.
|
|
21
|
+
*
|
|
22
|
+
* A LEAF in its own neutral folder (`timers/`, L0 in scripts/layering.config.cjs): it imports nothing, so any layer —
|
|
23
|
+
* the observer queue (L1) as much as the engine — arms its limits with the one law.
|
|
24
|
+
*/
|
|
25
|
+
/** How a long timer is armed. */
|
|
26
|
+
export interface LongTimeoutOptions {
|
|
27
|
+
/**
|
|
28
|
+
* Unref every host timer it arms (where the host has `unref`), so a timer that only BOUNDS a wait never keeps the
|
|
29
|
+
* process alive on its own. Off by default: the engine's own limits keep a run alive while it waits.
|
|
30
|
+
*/
|
|
31
|
+
readonly unref?: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* `setTimeout` for a limit of any length, by the law above. Returns the one call that cancels it — a no-op when no
|
|
35
|
+
* timer was armed (`Infinity`).
|
|
36
|
+
*/
|
|
37
|
+
export declare function setLongTimeout(fn: () => void, ms: number, options?: LongTimeoutOptions): () => void;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* timers/longTimeout.ts — the ONE long-timer law: how the library arms a host timer for a limit of any length.
|
|
3
|
+
*
|
|
4
|
+
* A host timer holds at most 2^31 − 1 ms (about 24.8 days). Node turns a longer delay — `Infinity` included — into
|
|
5
|
+
* 1 ms, with a `TimeoutOverflowWarning`, so a raw `setTimeout(fn, limit)` gives up at once exactly when the caller
|
|
6
|
+
* asked to wait longest. Every wait of a caller-supplied length is armed here: an attempt's cap and the wait between
|
|
7
|
+
* attempts (`attempt/runner.ts`), the run's deadline (`attempt/deadline.ts · armDeadline`,
|
|
8
|
+
* `runner/deadline.ts · armRun`), the drains and flushes that wait at most a caller's `timeoutMs`
|
|
9
|
+
* (`observer-queue/deferredDispatcher.ts · drain`, `detach/flush.ts · flushAllDetached`, `runner/recordSink.ts ·
|
|
10
|
+
* flush`, `sinks/fileSink.ts`), the bounded reads (`sinks/indexedIO.ts`, `recorder/AttemptRecorder.ts`,
|
|
11
|
+
* `runner/captureHistory.ts`) and the `setTimeout` detach driver. `test/architecture/timer-law.test.ts` refuses a raw
|
|
12
|
+
* host timer — or any other way of reaching one — anywhere else in `src/`.
|
|
13
|
+
*
|
|
14
|
+
* THE LAW, by the limit:
|
|
15
|
+
* - `Infinity` — no limit: NO timer is armed and `fn` never runs, so nothing keeps the process alive on its account.
|
|
16
|
+
* The work the limit bounds decides when the wait ends.
|
|
17
|
+
* - a finite delay past 2^31 − 1 ms — waited in chunks of at most 2^31 − 1 ms, so it never fires early and never in
|
|
18
|
+
* 1 ms: a 30-day deadline fires after 30 days.
|
|
19
|
+
* - anything else that is not a number > 0 (`0`, a negative, `-Infinity`, `NaN`) — already due: `fn` runs on the
|
|
20
|
+
* next timer turn, as the host runs `setTimeout(fn, 0)`.
|
|
21
|
+
*
|
|
22
|
+
* A LEAF in its own neutral folder (`timers/`, L0 in scripts/layering.config.cjs): it imports nothing, so any layer —
|
|
23
|
+
* the observer queue (L1) as much as the engine — arms its limits with the one law.
|
|
24
|
+
*/
|
|
25
|
+
/** The longest delay a host timer honours (2^31 − 1 ms, ~24.8 days); Node fires a longer one after 1 ms. */
|
|
26
|
+
const MAX_TIMER_MS = 2_147_483_647;
|
|
27
|
+
/**
|
|
28
|
+
* `setTimeout` for a limit of any length, by the law above. Returns the one call that cancels it — a no-op when no
|
|
29
|
+
* timer was armed (`Infinity`).
|
|
30
|
+
*/
|
|
31
|
+
export function setLongTimeout(fn, ms, options) {
|
|
32
|
+
if (ms === Infinity)
|
|
33
|
+
return () => undefined;
|
|
34
|
+
const unref = options?.unref === true;
|
|
35
|
+
let timer;
|
|
36
|
+
let cancelled = false;
|
|
37
|
+
const arm = (left) => {
|
|
38
|
+
timer = setTimeout(() => {
|
|
39
|
+
if (cancelled)
|
|
40
|
+
return;
|
|
41
|
+
if (left > MAX_TIMER_MS)
|
|
42
|
+
arm(left - MAX_TIMER_MS);
|
|
43
|
+
else
|
|
44
|
+
fn();
|
|
45
|
+
}, Math.min(left, MAX_TIMER_MS));
|
|
46
|
+
if (unref)
|
|
47
|
+
timer.unref?.();
|
|
48
|
+
};
|
|
49
|
+
arm(ms > 0 ? ms : 0);
|
|
50
|
+
return () => {
|
|
51
|
+
cancelled = true;
|
|
52
|
+
if (timer !== undefined)
|
|
53
|
+
clearTimeout(timer);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9uZ1RpbWVvdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RpbWVycy9sb25nVGltZW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCw0R0FBNEc7QUFDNUcsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDO0FBV25DOzs7R0FHRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsRUFBYyxFQUFFLEVBQVUsRUFBRSxPQUE0QjtJQUNyRixJQUFJLEVBQUUsS0FBSyxRQUFRO1FBQUUsT0FBTyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7SUFDNUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxFQUFFLEtBQUssS0FBSyxJQUFJLENBQUM7SUFDdEMsSUFBSSxLQUFnRCxDQUFDO0lBQ3JELElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN0QixNQUFNLEdBQUcsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFO1FBQzNCLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3RCLElBQUksU0FBUztnQkFBRSxPQUFPO1lBQ3RCLElBQUksSUFBSSxHQUFHLFlBQVk7Z0JBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQzs7Z0JBQzdDLEVBQUUsRUFBRSxDQUFDO1FBQ1osQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDakMsSUFBSSxLQUFLO1lBQUcsS0FBZ0MsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQ3pELENBQUMsQ0FBQztJQUNGLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sR0FBRyxFQUFFO1FBQ1YsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHRpbWVycy9sb25nVGltZW91dC50cyDigJQgdGhlIE9ORSBsb25nLXRpbWVyIGxhdzogaG93IHRoZSBsaWJyYXJ5IGFybXMgYSBob3N0IHRpbWVyIGZvciBhIGxpbWl0IG9mIGFueSBsZW5ndGguXG4gKlxuICogQSBob3N0IHRpbWVyIGhvbGRzIGF0IG1vc3QgMl4zMSDiiJIgMSBtcyAoYWJvdXQgMjQuOCBkYXlzKS4gTm9kZSB0dXJucyBhIGxvbmdlciBkZWxheSDigJQgYEluZmluaXR5YCBpbmNsdWRlZCDigJQgaW50b1xuICogMSBtcywgd2l0aCBhIGBUaW1lb3V0T3ZlcmZsb3dXYXJuaW5nYCwgc28gYSByYXcgYHNldFRpbWVvdXQoZm4sIGxpbWl0KWAgZ2l2ZXMgdXAgYXQgb25jZSBleGFjdGx5IHdoZW4gdGhlIGNhbGxlclxuICogYXNrZWQgdG8gd2FpdCBsb25nZXN0LiBFdmVyeSB3YWl0IG9mIGEgY2FsbGVyLXN1cHBsaWVkIGxlbmd0aCBpcyBhcm1lZCBoZXJlOiBhbiBhdHRlbXB0J3MgY2FwIGFuZCB0aGUgd2FpdCBiZXR3ZWVuXG4gKiBhdHRlbXB0cyAoYGF0dGVtcHQvcnVubmVyLnRzYCksIHRoZSBydW4ncyBkZWFkbGluZSAoYGF0dGVtcHQvZGVhZGxpbmUudHMgwrcgYXJtRGVhZGxpbmVgLFxuICogYHJ1bm5lci9kZWFkbGluZS50cyDCtyBhcm1SdW5gKSwgdGhlIGRyYWlucyBhbmQgZmx1c2hlcyB0aGF0IHdhaXQgYXQgbW9zdCBhIGNhbGxlcidzIGB0aW1lb3V0TXNgXG4gKiAoYG9ic2VydmVyLXF1ZXVlL2RlZmVycmVkRGlzcGF0Y2hlci50cyDCtyBkcmFpbmAsIGBkZXRhY2gvZmx1c2gudHMgwrcgZmx1c2hBbGxEZXRhY2hlZGAsIGBydW5uZXIvcmVjb3JkU2luay50cyDCt1xuICogZmx1c2hgLCBgc2lua3MvZmlsZVNpbmsudHNgKSwgdGhlIGJvdW5kZWQgcmVhZHMgKGBzaW5rcy9pbmRleGVkSU8udHNgLCBgcmVjb3JkZXIvQXR0ZW1wdFJlY29yZGVyLnRzYCxcbiAqIGBydW5uZXIvY2FwdHVyZUhpc3RvcnkudHNgKSBhbmQgdGhlIGBzZXRUaW1lb3V0YCBkZXRhY2ggZHJpdmVyLiBgdGVzdC9hcmNoaXRlY3R1cmUvdGltZXItbGF3LnRlc3QudHNgIHJlZnVzZXMgYSByYXdcbiAqIGhvc3QgdGltZXIg4oCUIG9yIGFueSBvdGhlciB3YXkgb2YgcmVhY2hpbmcgb25lIOKAlCBhbnl3aGVyZSBlbHNlIGluIGBzcmMvYC5cbiAqXG4gKiBUSEUgTEFXLCBieSB0aGUgbGltaXQ6XG4gKiAgIC0gYEluZmluaXR5YCDigJQgbm8gbGltaXQ6IE5PIHRpbWVyIGlzIGFybWVkIGFuZCBgZm5gIG5ldmVyIHJ1bnMsIHNvIG5vdGhpbmcga2VlcHMgdGhlIHByb2Nlc3MgYWxpdmUgb24gaXRzIGFjY291bnQuXG4gKiAgICAgVGhlIHdvcmsgdGhlIGxpbWl0IGJvdW5kcyBkZWNpZGVzIHdoZW4gdGhlIHdhaXQgZW5kcy5cbiAqICAgLSBhIGZpbml0ZSBkZWxheSBwYXN0IDJeMzEg4oiSIDEgbXMg4oCUIHdhaXRlZCBpbiBjaHVua3Mgb2YgYXQgbW9zdCAyXjMxIOKIkiAxIG1zLCBzbyBpdCBuZXZlciBmaXJlcyBlYXJseSBhbmQgbmV2ZXIgaW5cbiAqICAgICAxIG1zOiBhIDMwLWRheSBkZWFkbGluZSBmaXJlcyBhZnRlciAzMCBkYXlzLlxuICogICAtIGFueXRoaW5nIGVsc2UgdGhhdCBpcyBub3QgYSBudW1iZXIgPiAwIChgMGAsIGEgbmVnYXRpdmUsIGAtSW5maW5pdHlgLCBgTmFOYCkg4oCUIGFscmVhZHkgZHVlOiBgZm5gIHJ1bnMgb24gdGhlXG4gKiAgICAgbmV4dCB0aW1lciB0dXJuLCBhcyB0aGUgaG9zdCBydW5zIGBzZXRUaW1lb3V0KGZuLCAwKWAuXG4gKlxuICogQSBMRUFGIGluIGl0cyBvd24gbmV1dHJhbCBmb2xkZXIgKGB0aW1lcnMvYCwgTDAgaW4gc2NyaXB0cy9sYXllcmluZy5jb25maWcuY2pzKTogaXQgaW1wb3J0cyBub3RoaW5nLCBzbyBhbnkgbGF5ZXIg4oCUXG4gKiB0aGUgb2JzZXJ2ZXIgcXVldWUgKEwxKSBhcyBtdWNoIGFzIHRoZSBlbmdpbmUg4oCUIGFybXMgaXRzIGxpbWl0cyB3aXRoIHRoZSBvbmUgbGF3LlxuICovXG5cbi8qKiBUaGUgbG9uZ2VzdCBkZWxheSBhIGhvc3QgdGltZXIgaG9ub3VycyAoMl4zMSDiiJIgMSBtcywgfjI0LjggZGF5cyk7IE5vZGUgZmlyZXMgYSBsb25nZXIgb25lIGFmdGVyIDEgbXMuICovXG5jb25zdCBNQVhfVElNRVJfTVMgPSAyXzE0N180ODNfNjQ3O1xuXG4vKiogSG93IGEgbG9uZyB0aW1lciBpcyBhcm1lZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9uZ1RpbWVvdXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFVucmVmIGV2ZXJ5IGhvc3QgdGltZXIgaXQgYXJtcyAod2hlcmUgdGhlIGhvc3QgaGFzIGB1bnJlZmApLCBzbyBhIHRpbWVyIHRoYXQgb25seSBCT1VORFMgYSB3YWl0IG5ldmVyIGtlZXBzIHRoZVxuICAgKiBwcm9jZXNzIGFsaXZlIG9uIGl0cyBvd24uIE9mZiBieSBkZWZhdWx0OiB0aGUgZW5naW5lJ3Mgb3duIGxpbWl0cyBrZWVwIGEgcnVuIGFsaXZlIHdoaWxlIGl0IHdhaXRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5yZWY/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIGBzZXRUaW1lb3V0YCBmb3IgYSBsaW1pdCBvZiBhbnkgbGVuZ3RoLCBieSB0aGUgbGF3IGFib3ZlLiBSZXR1cm5zIHRoZSBvbmUgY2FsbCB0aGF0IGNhbmNlbHMgaXQg4oCUIGEgbm8tb3Agd2hlbiBub1xuICogdGltZXIgd2FzIGFybWVkIChgSW5maW5pdHlgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExvbmdUaW1lb3V0KGZuOiAoKSA9PiB2b2lkLCBtczogbnVtYmVyLCBvcHRpb25zPzogTG9uZ1RpbWVvdXRPcHRpb25zKTogKCkgPT4gdm9pZCB7XG4gIGlmIChtcyA9PT0gSW5maW5pdHkpIHJldHVybiAoKSA9PiB1bmRlZmluZWQ7XG4gIGNvbnN0IHVucmVmID0gb3B0aW9ucz8udW5yZWYgPT09IHRydWU7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgY29uc3QgYXJtID0gKGxlZnQ6IG51bWJlcikgPT4ge1xuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICBpZiAobGVmdCA+IE1BWF9USU1FUl9NUykgYXJtKGxlZnQgLSBNQVhfVElNRVJfTVMpO1xuICAgICAgZWxzZSBmbigpO1xuICAgIH0sIE1hdGgubWluKGxlZnQsIE1BWF9USU1FUl9NUykpO1xuICAgIGlmICh1bnJlZikgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgfTtcbiAgYXJtKG1zID4gMCA/IG1zIDogMCk7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgfTtcbn1cbiJdfQ==
|
package/dist/index.js
CHANGED
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
* @module
|
|
18
18
|
*/
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.
|
|
20
|
+
exports.enableDevMode = exports.disableDevMode = exports.formatErrorInfo = exports.extractErrorInfo = exports.validateOrThrow = exports.validateAgainstSchema = exports.InputValidationError = exports.isZod = exports.isValidatable = exports.detectSchema = exports.interrupt = exports.CompositeRecorder = exports.listSubflowPaths = exports.getSubtreeSnapshot = exports.WindowedNarrativeFlowRecorder = exports.SilentNarrativeFlowRecorder = exports.SeparateNarrativeFlowRecorder = exports.RLENarrativeFlowRecorder = exports.ProgressiveNarrativeFlowRecorder = exports.MilestoneNarrativeFlowRecorder = exports.AdaptiveNarrativeFlowRecorder = exports.ManifestFlowRecorder = exports.NarrativeFlowRecorder = exports.isFlowEvent = exports.hasRecorderMethods = exports.hasFlowRecorderMethods = exports.hasEmitRecorderMethods = exports.RecorderOperation = exports.DebugRecorder = exports.MetricRecorder = exports.RunContext = exports.FlowChartExecutor = exports.RecordSinkError = exports.TraceparentError = exports.parseTraceparent = exports.formatTraceparent = exports.UnknownEffectError = exports.statedWaitFirst = exports.retryRules = exports.exponentialBackoff = exports.errorCategory = exports.AttemptTimeoutError = exports.attempt = exports.select = exports.decide = exports.narrative = exports.timeBudget = exports.flowChartSelector = exports.FlowChartBuilder = exports.flowChart = void 0;
|
|
21
|
+
exports.stringifySnapshot = exports.isDevMode = void 0;
|
|
21
22
|
/** @category Quick Start */
|
|
22
23
|
var index_js_1 = require("./lib/builder/index.js");
|
|
23
24
|
Object.defineProperty(exports, "flowChart", { enumerable: true, get: function () { return index_js_1.flowChart; } });
|
|
@@ -37,13 +38,17 @@ Object.defineProperty(exports, "select", { enumerable: true, get: function () {
|
|
|
37
38
|
*
|
|
38
39
|
* `attempt()` — the attempt runner for code that is not a stage (records go to its `onAttempt`); `errorCategory`
|
|
39
40
|
* — the one failure classifier (seven fixed categories); `retryRules` — the one retry rule table, as `decide()`
|
|
40
|
-
* rules; the attempt contract's two errors
|
|
41
|
+
* rules; the attempt contract's two errors; `exponentialBackoff` / `statedWaitFirst` — deterministic builders of
|
|
42
|
+
* the function a `RetryPolicy.backoffMs` takes (`BackoffSpec.maxDelayMs` caps the schedule before the jitter draw; the
|
|
43
|
+
* policy's `maxBackoffMs` still caps every wait after it).
|
|
41
44
|
*/
|
|
42
45
|
var index_js_4 = require("./lib/attempt/index.js");
|
|
43
46
|
Object.defineProperty(exports, "attempt", { enumerable: true, get: function () { return index_js_4.attempt; } });
|
|
44
47
|
Object.defineProperty(exports, "AttemptTimeoutError", { enumerable: true, get: function () { return index_js_4.AttemptTimeoutError; } });
|
|
45
48
|
Object.defineProperty(exports, "errorCategory", { enumerable: true, get: function () { return index_js_4.errorCategory; } });
|
|
49
|
+
Object.defineProperty(exports, "exponentialBackoff", { enumerable: true, get: function () { return index_js_4.exponentialBackoff; } });
|
|
46
50
|
Object.defineProperty(exports, "retryRules", { enumerable: true, get: function () { return index_js_4.retryRules; } });
|
|
51
|
+
Object.defineProperty(exports, "statedWaitFirst", { enumerable: true, get: function () { return index_js_4.statedWaitFirst; } });
|
|
47
52
|
Object.defineProperty(exports, "UnknownEffectError", { enumerable: true, get: function () { return index_js_4.UnknownEffectError; } });
|
|
48
53
|
var index_js_5 = require("./lib/attempt/index.js");
|
|
49
54
|
Object.defineProperty(exports, "formatTraceparent", { enumerable: true, get: function () { return index_js_5.formatTraceparent; } });
|
|
@@ -148,4 +153,4 @@ Object.defineProperty(exports, "enableDevMode", { enumerable: true, get: functio
|
|
|
148
153
|
Object.defineProperty(exports, "isDevMode", { enumerable: true, get: function () { return devMode_js_1.isDevMode; } });
|
|
149
154
|
var stringifySnapshot_js_1 = require("./lib/runner/stringifySnapshot.js");
|
|
150
155
|
Object.defineProperty(exports, "stringifySnapshot", { enumerable: true, get: function () { return stringifySnapshot_js_1.stringifySnapshot; } });
|
|
151
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHOzs7QUFTSCw0QkFBNEI7QUFDNUIsbURBQXdGO0FBQS9FLHFHQUFBLFNBQVMsT0FBQTtBQUFFLDRHQUFBLGdCQUFnQixPQUFBO0FBQUUsNkdBQUEsaUJBQWlCLE9BQUE7QUFzQ3ZELGtEQUFtRDtBQUExQyxzR0FBQSxVQUFVLE9BQUE7QUFRbkIsNEJBQTRCO0FBQzVCLCtDQUEyQztBQUFsQyx5R0FBQSxTQUFTLE9BQUE7QUFvQmxCLG1DQUFtQztBQUNuQyxrREFBdUQ7QUFBOUMsa0dBQUEsTUFBTSxPQUFBO0FBQUUsa0dBQUEsTUFBTSxPQUFBO0FBaUR2Qjs7Ozs7O0dBTUc7QUFDSCxtREFBcUg7QUFBNUcsbUdBQUEsT0FBTyxPQUFBO0FBQUUsK0dBQUEsbUJBQW1CLE9BQUE7QUFBRSx5R0FBQSxhQUFhLE9BQUE7QUFBRSxzR0FBQSxVQUFVLE9BQUE7QUFBRSw4R0FBQSxrQkFBa0IsT0FBQTtBQVdwRixtREFBK0Y7QUFBdEYsNkdBQUEsaUJBQWlCLE9BQUE7QUFBRSw0R0FBQSxnQkFBZ0IsT0FBQTtBQUFFLDRHQUFBLGdCQUFnQixPQUFBO0FBZ0M5RCxvQkFBb0I7QUFDcEIsa0RBQXdEO0FBQS9DLDJHQUFBLGVBQWUsT0FBQTtBQVF4QixvQkFBb0I7QUFDcEIsa0RBQTBEO0FBQWpELDZHQUFBLGlCQUFpQixPQUFBO0FBRTFCLG9CQUFvQjtBQUNwQixrREFBbUQ7QUFBMUMsc0dBQUEsVUFBVSxPQUFBO0FBcUJuQiwrQkFBK0I7QUFDL0IsaURBQXNEO0FBQTdDLDBHQUFBLGNBQWMsT0FBQTtBQUV2QiwrQkFBK0I7QUFDL0Isa0RBQXFEO0FBQTVDLDBHQUFBLGFBQWEsT0FBQTtBQUV0QixvQ0FBb0M7QUFDcEMscURBQTREO0FBQW5ELDhHQUFBLGlCQUFpQixPQUFBO0FBbUMxQixxRUFBcUU7QUFDckUscURBS2lDO0FBSi9CLG1IQUFBLHNCQUFzQixPQUFBO0FBQ3RCLG1IQUFBLHNCQUFzQixPQUFBO0FBQ3RCLCtHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHdHQUFBLFdBQVcsT0FBQTtBQW1EYiwrQkFBK0I7QUFDL0IsbURBQThEO0FBQXJELGtIQUFBLHFCQUFxQixPQUFBO0FBSzlCLCtCQUErQjtBQUMvQixtREFBNkQ7QUFBcEQsaUhBQUEsb0JBQW9CLE9BQUE7QUFFN0IsK0JBQStCO0FBQy9CLG1EQUFzRTtBQUE3RCwwSEFBQSw2QkFBNkIsT0FBQTtBQUV0QywrQkFBK0I7QUFDL0IsbURBQXVFO0FBQTlELDJIQUFBLDhCQUE4QixPQUFBO0FBRXZDLCtCQUErQjtBQUMvQixtREFBeUU7QUFBaEUsNkhBQUEsZ0NBQWdDLE9BQUE7QUFFekMsK0JBQStCO0FBQy9CLG1EQUFpRTtBQUF4RCxxSEFBQSx3QkFBd0IsT0FBQTtBQUVqQywrQkFBK0I7QUFDL0IsbURBQXNFO0FBQTdELDBIQUFBLDZCQUE2QixPQUFBO0FBRXRDLCtCQUErQjtBQUMvQixtREFBb0U7QUFBM0Qsd0hBQUEsMkJBQTJCLE9BQUE7QUFFcEMsK0JBQStCO0FBQy9CLG1EQUFzRTtBQUE3RCwwSEFBQSw2QkFBNkIsT0FBQTtBQW1CdEMsdUNBQXVDO0FBQ3ZDLG1EQUE2RTtBQUFwRSwrR0FBQSxrQkFBa0IsT0FBQTtBQUFFLDZHQUFBLGdCQUFnQixPQUFBO0FBRTdDLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBRS9FLDhCQUE4QjtBQUM5QixxREFBNEQ7QUFBbkQsOEdBQUEsaUJBQWlCLE9BQUE7QUEwQjFCLDZCQUE2QjtBQUM3QixrREFBaUQ7QUFBeEMsc0dBQUEsU0FBUyxPQUFBO0FBZ0VsQixzQ0FBc0M7QUFDdEMsbURBQTJFO0FBQWxFLHlHQUFBLFlBQVksT0FBQTtBQUFFLDBHQUFBLGFBQWEsT0FBQTtBQUFFLGtHQUFBLEtBQUssT0FBQTtBQUUzQyxzQ0FBc0M7QUFDdEMsbURBQXFHO0FBQTVGLGlIQUFBLG9CQUFvQixPQUFBO0FBQUUsa0hBQUEscUJBQXFCLE9BQUE7QUFBRSw0R0FBQSxlQUFlLE9BQUE7QUFTckUsZ0NBQWdDO0FBQ2hDLG1EQUEwRTtBQUFqRSw2R0FBQSxnQkFBZ0IsT0FBQTtBQUFFLDRHQUFBLGVBQWUsT0FBQTtBQUUxQywrRUFBK0U7QUFDL0UsaURBQWlEO0FBQ2pELCtFQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7R0FXRztBQUNILCtDQUE0RTtBQUFuRSw0R0FBQSxjQUFjLE9BQUE7QUFBRSwyR0FBQSxhQUFhLE9BQUE7QUFBRSx1R0FBQSxTQUFTLE9BQUE7QUEwQmpELDBFQUFzRTtBQUE3RCx5SEFBQSxpQkFBaUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRm9vdFByaW50IOKAlCBQdWJsaWMgQVBJICh2MylcbiAqXG4gKiBUaGUgZmxvd2NoYXJ0IHBhdHRlcm4gZm9yIGJhY2tlbmQgY29kZS5cbiAqIEJ1aWxkIOKGkiBSdW4g4oaSIE9ic2VydmUuXG4gKlxuICogKipUaGUgY29tbW9uIGltcG9ydCBwYXRoczoqKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGZsb3dDaGFydCwgZGVjaWRlLCBuYXJyYXRpdmUgfSBmcm9tICdmb290cHJpbnRqcyc7ICAgICAgICAgICAvLyBtYWluIOKAlCBzdGFydCBoZXJlXG4gKiBpbXBvcnQgeyBtZXRyaWNzLCBkZWJ1ZywgbWFuaWZlc3QgfSAgICAgZnJvbSAnZm9vdHByaW50anMvcmVjb3JkZXJzJzsgLy8gcmVjb3JkZXIgZmFjdG9yaWVzXG4gKiBpbXBvcnQgeyBzdGF0ZUF0LCBjYXVzYWxDaGFpbiB9IGZyb20gJ2Zvb3R0cmFjZSc7ICAgICAvLyByZWFkIGEgZmluaXNoZWQgcnVuXG4gKiBpbXBvcnQgeyBSZWNvcmRGcmFtZSwgRXZlbnRMb2cgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnOyAgICAgLy8gd3JpdGUgYSByZWNvcmQgeW91cnNlbGZcbiAqIGltcG9ydCB7IFN0YWdlQ29udGV4dCB9ICAgICAgICAgICAgICAgICBmcm9tICdmb290cHJpbnRqcy9hZHZhbmNlZCc7ICAvLyBlbmdpbmUgaW50ZXJuYWxzXG4gKiBgYGBcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUXVpY2sgU3RhcnQg4oCUIEV2ZXJ5dGhpbmcgeW91IG5lZWQgZm9yIDkwJSBvZiB1c2UgY2FzZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHR5cGUgeyBGbG93Q2hhcnQsIFN0YWdlRnVuY3Rpb24gYXMgU3RhZ2VIYW5kbGVyLCBTdHJlYW1IYW5kbGVycyB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgeyBmbG93Q2hhcnQsIEZsb3dDaGFydEJ1aWxkZXIsIGZsb3dDaGFydFNlbGVjdG9yIH0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0XG4gKlxuICogQ29uZmlnIGZvciBgLmFkZFBhcmFsbGVsRm9yRWFjaCgpYCDigJQgb25lIGJyYW5jaCBwZXIgaXRlbSwgYnJhbmNoIGNvdW50XG4gKiBkZWNpZGVkIGF0IHJ1biB0aW1lIGZyb20gdGhlIHBheWxvYWQuIGBtYXhCcmFuY2hlc2AgYW5kIGBpbnRvYCBhcmUgcmVxdWlyZWRcbiAqIG9uIHB1cnBvc2UgKHNlZSBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZCkuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQnJhbmNoQ2hhcnQsIFBhcmFsbGVsRm9yRWFjaENvbmZpZywgUmV0cnlQb2xpY3kgfSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCDigJQgYnVpbGQtdGltZSBvYnNlcnZlciAodHdpbiBvZiBGbG93UmVjb3JkZXIpICovXG5leHBvcnQgdHlwZSB7XG4gIFN0cnVjdHVyZURlY2lkZXJDb21wbGV0ZUV2ZW50LFxuICBTdHJ1Y3R1cmVFZGdlQWRkZWRFdmVudCxcbiAgU3RydWN0dXJlRWRnZUtpbmQsXG4gIFN0cnVjdHVyZUxvb3BFZGdlQWRkZWRFdmVudCxcbiAgU3RydWN0dXJlUmVjb3JkZXIsXG4gIFN0cnVjdHVyZVN0YWdlQWRkZWRFdmVudCxcbiAgU3RydWN0dXJlU3RhZ2VUYWdnZWRFdmVudCxcbiAgU3RydWN0dXJlU3ViZmxvd01vdW50ZWRFdmVudCxcbn0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IFRpbWUgQnVkZ2V0XG4gKlxuICogYHRpbWVCdWRnZXQoY2hhcnQpYCDigJQgdGhlIHNsb3dlc3QgYSBjaGFydCBjYW4gdGFrZSwgZnJvbSBpdHMgZGVjbGFyZWQgcmV0cnkgcG9saWNpZXMgKGBhdHRlbXB0cyDDlyB0aW1lb3V0TXNgIHBsdXNcbiAqIHRoZSB3YWl0cywgc3VtbWVkIGFsb25nIHRoZSBzbG93ZXN0IHBhdGgpLCBhbmQgZXZlcnkgc3RhZ2UgdGhhdCBtYWtlcyBhIHBhdGggdW5ib3VuZGVkLCBieSBuYW1lLiBgLmJ1ZGdldChtcylgXG4gKiBkZWNsYXJlcyB0aGUgY2FsbGVyJ3MgY29udHJhY3Q7IGBidWlsZCgpYCByZWZ1c2VzIGEgY2hhcnQgdGhhdCBjYW5ub3Qga2VlcCBpdC4gQWxzbyBgY2hhcnQudGltZUJ1ZGdldCgpYC5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBCdWRnZXRBc3N1bXB0aW9ucyxcbiAgQnVkZ2V0U3RlcCxcbiAgVGltZUJ1ZGdldE9wdGlvbnMsXG4gIFRpbWVCdWRnZXRSZXBvcnQsXG4gIFVuYm91bmRlZFJlYXNvbixcbiAgVW5ib3VuZGVkU3RhZ2UsXG59IGZyb20gJy4vbGliL2J1ZGdldC9pbmRleC5qcyc7XG5leHBvcnQgeyB0aW1lQnVkZ2V0IH0gZnJvbSAnLi9saWIvYnVkZ2V0L2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHR5cGUgeyBUeXBlZFN0YWdlRnVuY3Rpb24gfSBmcm9tICcuL2xpYi9idWlsZGVyL3R5cGVkRmxvd0NoYXJ0LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHR5cGUgeyBTY29wZU1ldGhvZHMsIFR5cGVkU2NvcGUgfSBmcm9tICcuL2xpYi9yZWFjdGl2ZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB7IG5hcnJhdGl2ZSB9IGZyb20gJy4vcmVjb3JkZXJzLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGVjaXNpb24gQnJhbmNoaW5nIOKAlCBkZWNpZGUoKSAvIHNlbGVjdCgpIHdpdGggZXZpZGVuY2UgY2FwdHVyZVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IERlY2lzaW9uIEJyYW5jaGluZyAqL1xuZXhwb3J0IHR5cGUge1xuICBEZWNpZGVSdWxlLFxuICBEZWNpc2lvbkV2aWRlbmNlLFxuICBEZWNpc2lvblJlc3VsdCxcbiAgRGVmYXVsdEJyYW5jaCxcbiAgRmlsdGVyT3BzLFxuICBSdWxlRXZpZGVuY2UsXG4gIFNlbGVjdGlvbkV2aWRlbmNlLFxuICBTZWxlY3Rpb25SZXN1bHQsXG4gIFdoZW5DbGF1c2UsXG4gIFdoZXJlRmlsdGVyLFxufSBmcm9tICcuL2xpYi9kZWNpZGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IERlY2lzaW9uIEJyYW5jaGluZyAqL1xuZXhwb3J0IHsgZGVjaWRlLCBzZWxlY3QgfSBmcm9tICcuL2xpYi9kZWNpZGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IEVycm9ycyAqL1xuZXhwb3J0IHR5cGUgeyBUZXJtaW5hbEZhaWx1cmVDb250ZXh0IH0gZnJvbSAnLi9saWIvZXJyb3JzL3Rlcm1pbmFsRmFpbHVyZS5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEF0dGVtcHRzIOKAlCBldmVyeSB0cnkgb2YgYSByZXRyaWVkIHN0YWdlLCBhbmQgdGhlIGRlY2lzaW9uIHRoYXQgZm9sbG93ZWQgaXRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBAY2F0ZWdvcnkgQXR0ZW1wdHNcbiAqXG4gKiBPbmUgYEF0dGVtcHRSZWNvcmRgIHBlciBhdHRlbXB0IG9mIGEgc3RhZ2Ugd2l0aCBhIGRlY2xhcmVkIGByZXRyeWAgcG9saWN5LCBhIGB0aW1lb3V0TXNgLCBvciBhIHJ1biBkZWFkbGluZSDigJRcbiAqIHRpbWluZywgb3V0Y29tZSwgZmFpbHVyZSBjYXRlZ29yeSwgYW5kIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uIGFzIGBEZWNpc2lvbkV2aWRlbmNlYCDigJQgb24gdGhlIHN0YWdlJ3NcbiAqIGV4ZWN1dGlvbi10cmVlIG5vZGUgKGBTdGFnZVNuYXBzaG90LmF0dGVtcHRzYCAvIGBhdHRlbXB0U3VtbWFyeWApIGFuZCBvbiBgRmxvd1JlY29yZGVyLm9uQXR0ZW1wdGAuXG4gKiBBIGNhbGwgYSBzdGFnZSBtYWtlcyB0aHJvdWdoIGBzY29wZS4kY2FsbGAgaXMgcmVjb3JkZWQgdGhlIHNhbWUgd2F5IChraW5kIGAnY2FsbCdgKSwgYW5kIHNvIGlzIGFuIFNESydzIG93biByZXRyeVxuICogYW4gYWRhcHRlciByZXBvcnRzIHRocm91Z2ggYG9ic2VydmVkKClgIChgT2JzZXJ2ZWRBdHRlbXB0YCwga2luZCBgJ29ic2VydmVkJ2ApLiBgQXR0ZW1wdENvbnRleHRgIGlzIHdoYXRcbiAqIGBzY29wZS4kYXR0ZW1wdCgpYCByZXR1cm5zLCBhbmQgd2hhdCBhIGNhbGwncyBmdW5jdGlvbiBnZXRzICh0aGUgYXR0ZW1wdCdzIHNpZ25hbCwgdGhlIHRpbWUgbGVmdCwgYG9ic2VydmVkYCk7XG4gKiBgTGF0ZVdyaXRlYCBpcyBhIHdyaXRlIChvciBjYWxsKSBhbiBlbmRlZCBhdHRlbXB0IHRyaWVkIChgU3RhZ2VTbmFwc2hvdC5sYXRlV3JpdGVzYCkuIEEgc3RhZ2UgdGhhdCBjaGFuZ2VzIGFuXG4gKiBvdXRzaWRlIHN5c3RlbSBkZWNsYXJlcyBpdCAoYFN0YWdlVG91Y2hlc2AsIGAudG91Y2hlcygpYCksIGFuZCBhIGNhbGwgZG9lcyAoYENhbGxPcHRpb25zYCk6IGV2ZXJ5IGF0dGVtcHQgdGhlblxuICogY2FycmllcyBpdHMgYEF0dGVtcHRFZmZlY3RgLCBhbmQgdGhlIGtleSBydWxlIGlzIGhhbmRlZCBhbiBgSWRlbXBvdGVuY3lLZXlDb250ZXh0YCBvbmNlIHBlciBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQXR0ZW1wdENhdGVnb3J5LFxuICBBdHRlbXB0Q29udGV4dCxcbiAgQXR0ZW1wdEVmZmVjdCxcbiAgQXR0ZW1wdEVycm9yLFxuICBBdHRlbXB0SW5wdXRzLFxuICBBdHRlbXB0S2luZCxcbiAgQXR0ZW1wdE5leHQsXG4gIEF0dGVtcHRPcHRpb25zLFxuICBBdHRlbXB0T3V0Y29tZSxcbiAgQXR0ZW1wdFJlYXNvbixcbiAgQXR0ZW1wdFJlY29yZCxcbiAgQXR0ZW1wdFN1bW1hcnksXG4gIENhbGxPcHRpb25zLFxuICBJZGVtcG90ZW5jeUtleUNvbnRleHQsXG4gIExhdGVXcml0ZSxcbiAgT2JzZXJ2ZWRBdHRlbXB0LFxuICBTdGFnZVRvdWNoZXMsXG4gIFVua25vd25FZmZlY3RJbml0LFxufSBmcm9tICcuL2xpYi9hdHRlbXB0L2luZGV4LmpzJztcbi8qKlxuICogQGNhdGVnb3J5IEF0dGVtcHRzXG4gKlxuICogQW4gYXR0ZW1wdCBieSBuYW1lIChgc2VyaWVzYCArIGBhdHRlbXB0YCkgYW5kIHBlci1vdXRjb21lIGNvdW50cyDigJQgd2hhdCByZWNvcmRlciByb3dzIGhvbGQgb2YgYXR0ZW1wdHMuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQXR0ZW1wdE91dGNvbWVDb3VudHMsIEF0dGVtcHRSZWYgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9hdHRlbXB0U2VyaWVzLmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQXR0ZW1wdHNcbiAqXG4gKiBgYXR0ZW1wdCgpYCDigJQgdGhlIGF0dGVtcHQgcnVubmVyIGZvciBjb2RlIHRoYXQgaXMgbm90IGEgc3RhZ2UgKHJlY29yZHMgZ28gdG8gaXRzIGBvbkF0dGVtcHRgKTsgYGVycm9yQ2F0ZWdvcnlgXG4gKiDigJQgdGhlIG9uZSBmYWlsdXJlIGNsYXNzaWZpZXIgKHNldmVuIGZpeGVkIGNhdGVnb3JpZXMpOyBgcmV0cnlSdWxlc2Ag4oCUIHRoZSBvbmUgcmV0cnkgcnVsZSB0YWJsZSwgYXMgYGRlY2lkZSgpYFxuICogcnVsZXM7IHRoZSBhdHRlbXB0IGNvbnRyYWN0J3MgdHdvIGVycm9ycy5cbiAqL1xuZXhwb3J0IHsgYXR0ZW1wdCwgQXR0ZW1wdFRpbWVvdXRFcnJvciwgZXJyb3JDYXRlZ29yeSwgcmV0cnlSdWxlcywgVW5rbm93bkVmZmVjdEVycm9yIH0gZnJvbSAnLi9saWIvYXR0ZW1wdC9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvcnJlbGF0aW9uXG4gKlxuICogVGhlIHJ1bidzIGNvcnJlbGF0aW9uICgxMC4xKTogYGVudi50cmFjZXBhcmVudGAgKFczQywgcGFyc2VkIHN0cmljdGx5KSBvciBgZW52LnRyYWNlSWRgICsgYGVudi5vcGVyYXRpb25JZGBcbiAqIGJlY29tZSBPTkUgZnJvemVuIGBSdW5Db3JyZWxhdGlvbmAgcGVyIHJ1biDigJQgb24gYGdldFNuYXBzaG90KCkuY29ycmVsYXRpb25gLCBldmVyeSBmbG93IGV2ZW50J3NcbiAqIGB0cmF2ZXJzYWxDb250ZXh0LmNvcnJlbGF0aW9uYCBhbmQgZXZlcnkgc2NvcGUgYW5kIGVtaXQgZXZlbnQncyBgY29ycmVsYXRpb25gLiBgcGFyc2VUcmFjZXBhcmVudGAgL1xuICogYGZvcm1hdFRyYWNlcGFyZW50YCBhcmUgdGhlIFczQyBjb2RlYzsgYSByZWZ1c2VkIGhlYWRlciB0aHJvd3MgYFRyYWNlcGFyZW50RXJyb3JgIHdpdGggYSBuYW1lZCBgcmVhc29uYC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBQYXJzZWRUcmFjZXBhcmVudCwgUnVuQ29ycmVsYXRpb24sIFRyYWNlcGFyZW50RmllbGRzLCBUcmFjZXBhcmVudFJlZnVzYWwgfSBmcm9tICcuL2xpYi9hdHRlbXB0L2luZGV4LmpzJztcbmV4cG9ydCB7IGZvcm1hdFRyYWNlcGFyZW50LCBwYXJzZVRyYWNlcGFyZW50LCBUcmFjZXBhcmVudEVycm9yIH0gZnJvbSAnLi9saWIvYXR0ZW1wdC9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJ1biDigJQgRXhlY3V0ZSBjaGFydHMgYW5kIGNvbGxlY3QgcmVzdWx0c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUge1xuICBDYXB0dXJlSGlzdG9yeU9wdGlvbnMsXG4gIENhcHR1cmVIaXN0b3J5UmVjZWlwdCxcbiAgQ2FwdHVyZUhpc3RvcnlTdGF0dXMsXG4gIENhcHR1cmVIaXN0b3J5VGFyZ2V0LFxufSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuZXhwb3J0IHR5cGUgeyBSdW5SZXN1bHQgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUgeyBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIFRoZSBjcmFzaC1zYWZlIHJlY29yZCAoMTAuMSk6IHRoZSBleGVjdXRvcidzIGBzaW5rYCBvcHRpb24sIGl0cyBhY2NvdW50aW5nIG9uIGBnZXRTbmFwc2hvdCgpLnNpbmtgLFxuICogYGV4ZWN1dG9yLmZsdXNoUmVjb3JkKClgJ3MgcmVzdWx0LCBhbmQgdGhlIGVycm9yIGEgcnVuIHdpdGggYG9uRmFpbHVyZTogJ2ZhaWwnYCByZWplY3RzIHdpdGguIFRoZSBwb3J0XG4gKiAoYFJlY29yZFNpbmtgLCBgbWVtb3J5U2lua2ApIGlzIGBmb290dHJhY2Uvd3JpdGVgJ3M7IHRoZSBmaWxlIGFkYXB0ZXIgaXMgYGZvb3RwcmludGpzL3NpbmtzYC5cbiAqIEBjYXRlZ29yeSBSdW5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBSZWNvcmRGbHVzaFJlc3VsdCxcbiAgUmVjb3JkU2lua0ZhaWx1cmVNb2RlLFxuICBSZWNvcmRTaW5rRmx1c2hNb2RlLFxuICBSZWNvcmRTaW5rT3B0aW9uLFxuICBSZWNvcmRTaW5rT3B0aW9ucyxcbiAgUmVjb3JkU2lua1N0YXRzLFxufSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB7IFJlY29yZFNpbmtFcnJvciB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKlxuICogVGhlIGZvdXIgb2JzZXJ2YWJpbGl0eSBkaWFscyBgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zYCBpbmhlcml0cy5cbiAqIEBjYXRlZ29yeSBSdW5cbiAqL1xuZXhwb3J0IHR5cGUgeyBSdW5EaWFscyB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgeyBGbG93Q2hhcnRFeGVjdXRvciB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgeyBSdW5Db250ZXh0IH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB0eXBlIHsgQ2hhcnRPcGVuQVBJT3B0aW9ucywgTUNQVG9vbERlc2NyaXB0aW9uLCBSdW5uYWJsZUZsb3dDaGFydCB9IGZyb20gJy4vbGliL3J1bm5lci9SdW5uYWJsZUNoYXJ0LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT2JzZXJ2ZSDigJQgRGF0YSAoc2NvcGUgcmVjb3JkZXJzLCBmaXJlIGR1cmluZyBzdGFnZSBleGVjdXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGF0YSAqL1xuZXhwb3J0IHR5cGUge1xuICBDb21taXRFdmVudCxcbiAgRXJyb3JFdmVudCxcbiAgUmVhZEV2ZW50LFxuICBSZWRhY3Rpb25Qb2xpY3ksXG4gIFJlZGFjdGlvblJlcG9ydCxcbiAgU2NvcGVSZWNvcmRlcixcbiAgU3RhZ2VFdmVudCxcbiAgV3JpdGVFdmVudCxcbn0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERhdGEgKi9cbmV4cG9ydCB7IE1ldHJpY1JlY29yZGVyIH0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERhdGEgKi9cbmV4cG9ydCB7IERlYnVnUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgT3BlcmF0aW9uICovXG5leHBvcnQgeyBSZWNvcmRlck9wZXJhdGlvbiB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGVsaXZlcnkgdGllciAoUkZDLTAwMSBkZWZlcnJlZCBvYnNlcnZlcnMpXG4gKlxuICogRXZlcnkgYGF0dGFjaCpSZWNvcmRlcmAgY2FsbCBhY2NlcHRzIGFuIG9wdGlvbnMgYmFnOlxuICogYGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIocmVjLCB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH0pYCB0YWtlcyB0aGVcbiAqIHJlY29yZGVyIE9VVCBvZiB0aGUgZW5naW5lJ3MgaG90IHBhdGgg4oCUIGV2ZW50cyBhcmUgY2FwdHVyZWQgaW50byBvbmVcbiAqIGJvdW5kZWQsIHRvdGFsbHktb3JkZXJlZCBxdWV1ZSBhbmQgZGVsaXZlcmVkIGF0IHRoZSBuZXh0IG1pY3JvdGFza1xuICogY2hlY2twb2ludCAoXCJvbmUgYmVhdCBiZWhpbmRcIikuIE9taXQgYGRlbGl2ZXJ5YCBmb3IgdGhlIGhpc3RvcmljYWxcbiAqIHN5bmNocm9ub3VzIGNhbGwgKGJ5dGUtaWRlbnRpY2FsIHRvIHByZXZpb3VzIHJlbGVhc2VzKS4gQWNjb3VudGluZ1xuICogc3VyZmFjZXMgb24gYHNuYXBzaG90Lm9ic2VydmVyU3RhdHNgOyBgZXhlY3V0b3IuZHJhaW5PYnNlcnZlcnMoKWAgc2V0dGxlc1xuICogYXN5bmMgbGlzdGVuZXJzIGJlZm9yZSBzaHV0ZG93bi4gU2VlIGBkb2NzL2d1aWRlcy9vYnNlcnZlcnMtZGVmZXJyZWQubWRgLlxuICovXG5leHBvcnQgdHlwZSB7XG4gIEF0dGFjaFJlY29yZGVyT3B0aW9ucyxcbiAgT2JzZXJ2ZXJEZWxpdmVyeSxcbiAgT2JzZXJ2ZXJEcmFpblJlc3VsdCxcbiAgT2JzZXJ2ZXJTdGF0cyxcbn0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGVsaXZlcnkgdGllciAoUkZDLTAwMSBkZWZlcnJlZCBvYnNlcnZlcnMpXG4gKlxuICogYENhcHR1cmVQb2xpY3lgIOKAlCBob3cgYSBkZWZlcnJlZCBldmVudCdzIHBheWxvYWQgaXMgbWF0ZXJpYWxpemVkIGF0XG4gKiBjYXB0dXJlIHRpbWUgKGAnY2xvbmUnYCBieSBkZWZhdWx0IGZvciBhdHRhY2ggb3B0aW9ucyAvIGAnc3VtbWFyeSdgIC8gYCdyZWYnYCkuIGBPdmVyZmxvd1BvbGljeWBcbiAqIOKAlCB3aGF0IGEgc2F0dXJhdGVkIHF1ZXVlIGRvZXMgKGAnZHJvcC1vbGRlc3QnYCBkZWZhdWx0IC8gYCdzYW1wbGUnYCAvXG4gKiBgJ2Jsb2NrJ2ApLiBgRGlzcGF0Y2hlclN0YXRzYCAvIGBMaXN0ZW5lclN0YXRzYCDigJQgdGhlIGFjY291bnRpbmcgc2hhcGVzXG4gKiBlbWJlZGRlZCBpbiBgT2JzZXJ2ZXJTdGF0c2AuIFR5cGVzIG9ubHkg4oCUIHRoZSBvYnNlcnZlci1xdWV1ZSBtb2R1bGVcbiAqIGl0c2VsZiBpcyBpbnRlcm5hbDsgY29uc3VtZXJzIHVzZSB0aGUgYXR0YWNoIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQ2FwdHVyZVBvbGljeSwgRGlzcGF0Y2hlclN0YXRzLCBMaXN0ZW5lclN0YXRzLCBPdmVyZmxvd1BvbGljeSB9IGZyb20gJy4vbGliL29ic2VydmVyLXF1ZXVlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBDb21iaW5lZCAoYm90aCBkYXRhLWZsb3cgYW5kIGNvbnRyb2wtZmxvdykgKi9cbmV4cG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgQ29tYmluZWQgKGJvdGggZGF0YS1mbG93IGFuZCBjb250cm9sLWZsb3cpICovXG5leHBvcnQge1xuICBoYXNFbWl0UmVjb3JkZXJNZXRob2RzLFxuICBoYXNGbG93UmVjb3JkZXJNZXRob2RzLFxuICBoYXNSZWNvcmRlck1ldGhvZHMsXG4gIGlzRmxvd0V2ZW50LFxufSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEVtaXQgKHVzZXItYXV0aG9yZWQgc3RydWN0dXJlZCBldmVudHMpXG4gKlxuICogVGhpcmQgb2JzZXJ2ZXIgY2hhbm5lbCAoYWxvbmdzaWRlIGBTY29wZVJlY29yZGVyYCBhbmQgYEZsb3dSZWNvcmRlcmApLiBDb25zdW1lclxuICogY29kZSBjYWxscyBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgIGZyb20gaW5zaWRlIGEgc3RhZ2U7IGV2ZXJ5IGF0dGFjaGVkXG4gKiBgRW1pdFJlY29yZGVyLm9uRW1pdChldmVudClgIGZpcmVzIHN5bmNocm9ub3VzbHkgd2l0aCBzdGFnZS1jb250ZXh0XG4gKiBlbnJpY2htZW50LiBQYXNzLXRocm91Z2gg4oCUIG5vIGJ1ZmZlcmluZywgemVybyBhbGxvY2F0aW9uIHdoZW4gbm8gcmVjb3JkZXJcbiAqIGlzIGF0dGFjaGVkLlxuICovXG5leHBvcnQgdHlwZSB7IEVtaXRFdmVudCwgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPYnNlcnZlIOKAlCBGbG93IChGbG93UmVjb3JkZXIsIGZpcmVzIGFmdGVyIHN0YWdlIGV4ZWN1dGlvbilcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgdHlwZSB7XG4gIEZsb3dBdHRlbXB0RXZlbnQsXG4gIEZsb3dCcmVha0V2ZW50LFxuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0Vycm9yRXZlbnQsXG4gIEZsb3dGb3JrRXZlbnQsXG4gIEZsb3dMb29wRXZlbnQsXG4gIEZsb3dOZXh0RXZlbnQsXG4gIEZsb3dSZWNvcmRlcixcbiAgRmxvd1J1bkV2ZW50LFxuICBGbG93UnVuRmFpbGVkRXZlbnQsXG4gIEZsb3dTZWxlY3RlZEV2ZW50LFxuICBGbG93U3RhZ2VFdmVudCxcbiAgRmxvd1N0YWdlUmV0cnlFdmVudCxcbiAgRmxvd1N1YmZsb3dFdmVudCxcbiAgRmxvd1N1YmZsb3dSZWdpc3RlcmVkRXZlbnQsXG4gIEZsb3dUaHJvdHRsZWRFdmVudCxcbiAgUmVzdW1lTGluayxcbiAgVHJhdmVyc2FsQ29udGV4dCxcbn0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlRW50cnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93XG4gKlxuICogYE5hcnJhdGl2ZUZvcm1hdHRlcmAg4oCUIHBsdWdnYWJsZSBmb3JtYXR0ZXIgdGhhdCBjb252ZXJ0cyBldmVudCBjb250ZXh0XG4gKiBvYmplY3RzIGludG8gdGhlIHRleHQgbGluZXMgb2YgdGhlIG5hcnJhdGl2ZS5cbiAqL1xuZXhwb3J0IHR5cGUgeyBOYXJyYXRpdmVGb3JtYXR0ZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHR5cGUgeyBNYW5pZmVzdEF0dGVtcHRSb3csIE1hbmlmZXN0RW50cnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IE1hbmlmZXN0Rmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBBZGFwdGl2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgTWlsZXN0b25lTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBQcm9ncmVzc2l2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgUkxFTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBTZXBhcmF0ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgU2lsZW50TmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBXaW5kb3dlZE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNlbGYtRGVzY3JpYmluZyDigJQgLmNvbnRyYWN0KCksIHRvT3BlbkFQSSgpLCB0b01DUFRvb2woKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFNlbGYtRGVzY3JpYmluZyAqL1xuZXhwb3J0IHR5cGUgeyBKc29uU2NoZW1hIH0gZnJvbSAnLi9saWIvY29udHJhY3QvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTbmFwc2hvdCAmIENvbXBvc2l0aW9uIOKAlCBTdWJmbG93IG5hdmlnYXRpb24gYW5kIENvbXBvc2FibGVSdW5uZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBTbmFwc2hvdCAmIENvbXBvc2l0aW9uICovXG5leHBvcnQgdHlwZSB7IENvbXBvc2FibGVSdW5uZXIgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNuYXBzaG90ICYgQ29tcG9zaXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgUmVjb3JkZXJTbmFwc2hvdCwgUnVudGltZVNuYXBzaG90LCBTdWJ0cmVlU25hcHNob3QgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNuYXBzaG90ICYgQ29tcG9zaXRpb24gKi9cbmV4cG9ydCB7IGdldFN1YnRyZWVTbmFwc2hvdCwgbGlzdFN1YmZsb3dQYXRocyB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNjb3BlUmVjb3JkZXIgQ29tcG9zaXRpb24g4oCUIEJ1bmRsZSBtdWx0aXBsZSByZWNvcmRlcnMgaW50byBkb21haW4gcHJlc2V0c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFNjb3BlUmVjb3JkZXIgKi9cbmV4cG9ydCB7IENvbXBvc2l0ZVJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYXVzZS9SZXN1bWUg4oCUIFNlcmlhbGl6YWJsZSBjaGVja3BvaW50cyBmb3IgbG9uZy1ydW5uaW5nIG9yIGh1bWFuLWluLXRoZS1sb29wIGZsb3dzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lICovXG4vKiogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZSAqL1xuZXhwb3J0IHR5cGUge1xuICBGbG93Y2hhcnRDaGVja3BvaW50LFxuICBQYXVzYWJsZUhhbmRsZXIsXG4gIFBhdXNlZEV4ZWN1dGlvbixcbiAgUGVuZGluZ1BhdXNlLFxuICBSZWRhY3Rpb25NYXJrcyxcbn0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWVcbiAqXG4gKiBgaW50ZXJydXB0KHNjb3BlLCB7IHJlYXNvbiwgZXhwZWN0cz8gfSlgIOKAlCBzdG9wIG1pZC1zdGFnZSB0byBhc2sgYSBxdWVzdGlvbixcbiAqIGFuZCBnZXQgdGhlIGFuc3dlciBiYWNrIGF0IHRoZSBzYW1lIGNhbGwgc2l0ZSB3aGVuIHRoZSBydW4gcmVzdW1lcy4gUmVzdW1lXG4gKiByZS1lbnRlcnMgdGhlIHN0YWdlIGZyb20gaXRzIFRPUCAoc3RhZ2VzIGFyZSBhdG9taWMpLCBzbyBrZWVwIHRoZSBoYWxmXG4gKiBiZWZvcmUgdGhlIGNhbGwgaWRlbXBvdGVudC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBJbnRlcnJ1cHRQYXlsb2FkIH0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZSAqL1xuZXhwb3J0IHsgaW50ZXJydXB0IH0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNjb3BlUmVjb3JkZXIgKi9cbmV4cG9ydCB0eXBlIHsgQ29tcG9zaXRlU25hcHNob3QgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbmZpZ3VyYXRpb24g4oCUIFR5cGVzIHBhc3NlZCB0byBGbG93Q2hhcnRFeGVjdXRvciBhbmQgcnVuKClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uICovXG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvbkVudiwgRXhlY3V0b3JSZXN1bHQsIFBhdXNlZFJlc3VsdCwgUnVuT3B0aW9ucyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBTY29wZUZhY3RvcnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uXG4gKlxuICogUmVhZC10cmFja2luZyBwb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgICgjMTQpOlxuICogYCdmdWxsJ2AgKGRlZmF1bHQg4oCUIHBlci1yZWFkIHZhbHVlIGNsb25lLCBoaXN0b3JpY2FsIGJlaGF2aW9yKSAvXG4gKiBgJ3N1bW1hcnknYCAoY2hlYXAgYFJlYWRTdW1tYXJ5TWFya2VyYCBwZXIgcmVhZCkgLyBgJ29mZidgIChubyB0cmFja2luZyxcbiAqIHplcm8gcGVyLXJlYWQgY2xvbmUpLiBQYXNzIGFzIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgcmVhZFRyYWNraW5nIH0pYFxuICogb3IgY2FsbCBgZXhlY3V0b3Iuc2V0UmVhZFRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBSZWFkU3VtbWFyeU1hcmtlciwgUmVhZFRyYWNraW5nTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBXcml0ZS10cmFja2luZyBwb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYCAoIzEzYy1BKSDigJQgdGhlXG4gKiBzaWJsaW5nIG9mIGBSZWFkVHJhY2tpbmdNb2RlYDsgYm90aCBhbGlhcyB0aGUgc2hhcmVkIGBSZXRlbnRpb25Qb2xpY3lgXG4gKiBmYW1pbHkgZnJvbSBgbGliL2NhcHR1cmVgLiBgJ2Z1bGwnYCAoZGVmYXVsdCDigJQgcGVyLXdyaXRlIHZhbHVlIGNsb25lLFxuICogaGlzdG9yaWNhbCBiZWhhdmlvcikgLyBgJ3N1bW1hcnknYCAoY2hlYXAgYFdyaXRlU3VtbWFyeU1hcmtlcmAgcGVyIHdyaXRlKVxuICogLyBgJ29mZidgIChubyB0cmFja2luZzsgYHN0YWdlV3JpdGVzYCBhYnNlbnQgYW5kIHRoZSBgb25Db21taXRgIG11dGF0aW9uc1xuICogcGF5bG9hZCBpcyBlbXB0eSDigJQgd3JpdGVzIHRoZW1zZWx2ZXMgc3RpbGwgY29tbWl0LCBhbmQgdGhlIGNvbW1pdCBsb2cgaXNcbiAqIHVuYWZmZWN0ZWQpLiBQYXNzIGFzIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgd3JpdGVUcmFja2luZyB9KWAgb3JcbiAqIGNhbGwgYGV4ZWN1dG9yLnNldFdyaXRlVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICovXG5leHBvcnQgdHlwZSB7IFJldGVudGlvblBvbGljeSwgV3JpdGVTdW1tYXJ5TWFya2VyLCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBDb21taXQtdmFsdWVzIGVuY29kaW5nIGZvciB0aGUgQ09NTUlUIExPRyAoIzEzYy1CKSDigJQgdGhlIHRoaXJkIGRpYWwgb2ZcbiAqIHRoZSBmYW1pbHksIGFuZCB0aGUgb25seSBMT1NTTEVTUyBvbmUgKGl0IGNoYW5nZXMgdGhlIGxvZydzIGVuY29kaW5nLFxuICogbmV2ZXIgaXRzIGluZm9ybWF0aW9uKS4gYCdmdWxsJ2AgKGRlZmF1bHQg4oCUIGV2ZXJ5IHN1cnZpdmluZyBgc2V0YCBzdG9yZXNcbiAqIHRoZSBmdWxsIGZpbmFsIHZhbHVlLCBieXRlLWlkZW50aWNhbCB0byBoaXN0b3J5KSAvIGAnZGVsdGEnYCAoYXJyYXlcbiAqIG5ldC1jaGFuZ2VzIHRoYXQgYXJlIFwiYmFzZSBwbHVzIGEgdGFpbFwiIGNvbW1pdCBhcyBhbiBgYXBwZW5kYCB2ZXJiXG4gKiBzdG9yaW5nIG9ubHkgdGhlIHRhaWw7IGBkZWxldGVWYWx1ZSgpYCBjb21taXRzIGFzIGEgcmVhbCBgZGVsZXRlYCB2ZXJiO1xuICogb25lIHRyYWNlIGVudHJ5IHBlciBzdXJ2aXZpbmcgcGF0aCkuIFJlcGxheSByZWNvbnN0cnVjdHMgZXZlcnkgc3RlcCdzXG4gKiBmdWxsIHN0YXRlIGV4YWN0bHkuIENvbnN1bWVycyByZWFkaW5nIGBidW5kbGUub3ZlcndyaXRlW2tleV1gIGFzIHRoZSBmdWxsXG4gKiB2YWx1ZSBtdXN0IHVzZSBgY29tbWl0VmFsdWVBdGAgZnJvbSBgZm9vdHRyYWNlYC4gUGFzcyBhc1xuICogYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBjb21taXRWYWx1ZXMgfSlgIG9yIGNhbGxcbiAqIGBleGVjdXRvci5zZXRDb21taXRWYWx1ZXMobW9kZSlgIGJlZm9yZSBgcnVuKClgOyB0aGUgYWN0aXZlIG1vZGUgaXMgdGhlXG4gKiBzbmFwc2hvdCBkaXNjcmltaW5hbnQgYGdldFNuYXBzaG90KCkuY29tbWl0VmFsdWVzYC5cbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb250cmFjdCAmIFZhbGlkYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBDb250cmFjdCAmIFZhbGlkYXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgU2NoZW1hS2luZCwgVmFsaWRhdGlvbklzc3VlLCBWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi9saWIvc2NoZW1hL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBDb250cmFjdCAmIFZhbGlkYXRpb24gKi9cbmV4cG9ydCB7IGRldGVjdFNjaGVtYSwgaXNWYWxpZGF0YWJsZSwgaXNab2QgfSBmcm9tICcuL2xpYi9zY2hlbWEvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IENvbnRyYWN0ICYgVmFsaWRhdGlvbiAqL1xuZXhwb3J0IHsgSW5wdXRWYWxpZGF0aW9uRXJyb3IsIHZhbGlkYXRlQWdhaW5zdFNjaGVtYSwgdmFsaWRhdGVPclRocm93IH0gZnJvbSAnLi9saWIvc2NoZW1hL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXJyb3IgVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgRXJyb3IgVXRpbGl0aWVzICovXG5leHBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IEVycm9yIFV0aWxpdGllcyAqL1xuZXhwb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgZm9ybWF0RXJyb3JJbmZvIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGV2IFRvb2xzIOKAlCBNb2RlIGZsYWdzIGFuZCBab2Qgc2NvcGUgdXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQGNhdGVnb3J5IERldiBUb29sc1xuICpcbiAqIEdsb2JhbCBkZXYtbW9kZSBmbGFnLiBDYWxsIGBlbmFibGVEZXZNb2RlKClgIGF0IGFwcGxpY2F0aW9uIHN0YXJ0dXAgdG9cbiAqIHR1cm4gb24gZGV2ZWxvcGVyLW9ubHkgZGlhZ25vc3RpY3MgYWNyb3NzIHRoZSBsaWJyYXJ5IOKAlCBjaXJjdWxhci1yZWZlcmVuY2VcbiAqIGRldGVjdGlvbiBpbiBzY29wZSB3cml0ZXMsIHdhcm5pbmdzIHdoZW4gYSByZWNvcmRlciBoYXMgbm8gb2JzZXJ2ZXJcbiAqIG1ldGhvZHMsIHN1c3BpY2lvdXMtcHJlZGljYXRlIHdhcm5pbmdzIGluIGRlY2lkZS9zZWxlY3QsIHN0cnVjdHVyYWxcbiAqIGNoZWNrcyBpbiBgZ2V0U3VidHJlZVNuYXBzaG90YCwgYW5kIGFueSBmdXR1cmUgZGV2LW9ubHkgZGlhZ25vc3RpYy5cbiAqXG4gKiBQcm9kdWN0aW9uIGxlYXZlcyBpdCBPRkYgYnkgZGVmYXVsdCAoemVybyBvdmVyaGVhZCkuIFNlZSB0aGUgSlNEb2Mgb25cbiAqIGBlbmFibGVEZXZNb2RlYCBmb3IgdGhlIGZ1bGwgbGlzdCBhbmQgdXNhZ2UgZXhhbXBsZS5cbiAqL1xuZXhwb3J0IHsgZGlzYWJsZURldk1vZGUsIGVuYWJsZURldk1vZGUsIGlzRGV2TW9kZSB9IGZyb20gJy4vbGliL2Rldk1vZGUuanMnO1xuXG4vLyBgZGVmaW5lU2NvcGVGcm9tWm9kYCBhbmQgdGhlIG90aGVyIHpvZC1iYXNlZCBzY29wZSBoZWxwZXJzIG1vdmVkIHRvIHRoZSBvcHQtaW5cbi8vIGBmb290cHJpbnRqcy96b2RgIGVudHJ5IOKAlCBrZWVwaW5nIHpvZCBvdXQgb2YgdGhlIGNvcmUgbG9hZCBwYXRoIChpdCBpcyBhblxuLy8gb3B0aW9uYWwgcGVlcikuIEltcG9ydCB0aGVtIGZyb20gJ2Zvb3RwcmludGpzL3pvZCcuXG4vLyBBIHJ1bidzIHJlY29yZCBhcyBKU09OIHdpdGhvdXQgdGhlIGVuZ2luZSdzIHJlY3Vyc2lvbiBsaW1pdCAoOS4yNi4wKTogdGhlXG4vLyBzYW1lIGJ5dGVzIEpTT04uc3RyaW5naWZ5IGVtaXRzLCBmb3IgYSBkZWVwIGBuZXh0YCBjaGFpbiBpdCBjYW5ub3QgZW5jb2RlLlxuZXhwb3J0IHR5cGUgeyBSZXRyeUxvb3BDYWxsLCBSZXRyeUxvb3BEZWNpc2lvbiwgUmV0cnlMb29wSWRlbnRpdHkgfSBmcm9tICcuL2xpYi9hdHRlbXB0L3JldHJ5TG9vcFR5cGVzLmpzJztcbmV4cG9ydCB0eXBlIHsgUmV0cnlMb29wQ29udGV4dCwgUmV0cnlMb29wT3B0aW9ucywgUmV0cnlMb29wU3RhdGUgfSBmcm9tICcuL2xpYi9idWlsZGVyL3JldHJ5TG9vcC5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENhcHR1cmVDaGFubmVsU3RhdHVzLFxuICBDYXB0dXJlTGltaXRhdGlvbixcbiAgTmF0aXZlQ2FwdHVyZU5vdGUsXG4gIFJlY29yZGVyQ2FwdHVyZUFja25vd2xlZGdlbWVudCxcbn0gZnJvbSAnLi9saWIvY2FwdHVyZS9uYXRpdmVDb3ZlcmFnZS5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEVuZ2luZVJlYWRTb3VyY2VzLFxuICBOYXRpdmVDYXB0dXJlT2JzZXJ2YXRpb24sXG4gIE5hdGl2ZVJlYWRDYXB0dXJlTm90ZSxcbiAgU291cmNlTGltaXRhdGlvbixcbn0gZnJvbSAnLi9saWIvY2FwdHVyZS9yZWFkU291cmNlcy5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFNvdXJjZUV4ZWN1dGlvbk93bmVyc2hpcCxcbiAgU291cmNlT3duZXJzaGlwR2FwLFxuICBTb3VyY2VPd25lcnNoaXBXaXRuZXNzLFxufSBmcm9tICcuL2xpYi9jYXB0dXJlL3NvdXJjZU93bmVyc2hpcEZvcm1hdC5qcyc7XG5leHBvcnQgeyBzdHJpbmdpZnlTbmFwc2hvdCB9IGZyb20gJy4vbGliL3J1bm5lci9zdHJpbmdpZnlTbmFwc2hvdC5qcyc7XG4iXX0=
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHOzs7O0FBU0gsNEJBQTRCO0FBQzVCLG1EQUF3RjtBQUEvRSxxR0FBQSxTQUFTLE9BQUE7QUFBRSw0R0FBQSxnQkFBZ0IsT0FBQTtBQUFFLDZHQUFBLGlCQUFpQixPQUFBO0FBc0N2RCxrREFBbUQ7QUFBMUMsc0dBQUEsVUFBVSxPQUFBO0FBUW5CLDRCQUE0QjtBQUM1QiwrQ0FBMkM7QUFBbEMseUdBQUEsU0FBUyxPQUFBO0FBb0JsQixtQ0FBbUM7QUFDbkMsa0RBQXVEO0FBQTlDLGtHQUFBLE1BQU0sT0FBQTtBQUFFLGtHQUFBLE1BQU0sT0FBQTtBQWlEdkI7Ozs7Ozs7O0dBUUc7QUFDSCxtREFRZ0M7QUFQOUIsbUdBQUEsT0FBTyxPQUFBO0FBQ1AsK0dBQUEsbUJBQW1CLE9BQUE7QUFDbkIseUdBQUEsYUFBYSxPQUFBO0FBQ2IsOEdBQUEsa0JBQWtCLE9BQUE7QUFDbEIsc0dBQUEsVUFBVSxPQUFBO0FBQ1YsMkdBQUEsZUFBZSxPQUFBO0FBQ2YsOEdBQUEsa0JBQWtCLE9BQUE7QUFvQnBCLG1EQUErRjtBQUF0Riw2R0FBQSxpQkFBaUIsT0FBQTtBQUFFLDRHQUFBLGdCQUFnQixPQUFBO0FBQUUsNEdBQUEsZ0JBQWdCLE9BQUE7QUFnQzlELG9CQUFvQjtBQUNwQixrREFBd0Q7QUFBL0MsMkdBQUEsZUFBZSxPQUFBO0FBUXhCLG9CQUFvQjtBQUNwQixrREFBMEQ7QUFBakQsNkdBQUEsaUJBQWlCLE9BQUE7QUFFMUIsb0JBQW9CO0FBQ3BCLGtEQUFtRDtBQUExQyxzR0FBQSxVQUFVLE9BQUE7QUFxQm5CLCtCQUErQjtBQUMvQixpREFBc0Q7QUFBN0MsMEdBQUEsY0FBYyxPQUFBO0FBRXZCLCtCQUErQjtBQUMvQixrREFBcUQ7QUFBNUMsMEdBQUEsYUFBYSxPQUFBO0FBRXRCLG9DQUFvQztBQUNwQyxxREFBNEQ7QUFBbkQsOEdBQUEsaUJBQWlCLE9BQUE7QUFtQzFCLHFFQUFxRTtBQUNyRSxxREFLaUM7QUFKL0IsbUhBQUEsc0JBQXNCLE9BQUE7QUFDdEIsbUhBQUEsc0JBQXNCLE9BQUE7QUFDdEIsK0dBQUEsa0JBQWtCLE9BQUE7QUFDbEIsd0dBQUEsV0FBVyxPQUFBO0FBbURiLCtCQUErQjtBQUMvQixtREFBOEQ7QUFBckQsa0hBQUEscUJBQXFCLE9BQUE7QUFLOUIsK0JBQStCO0FBQy9CLG1EQUE2RDtBQUFwRCxpSEFBQSxvQkFBb0IsT0FBQTtBQUU3QiwrQkFBK0I7QUFDL0IsbURBQXNFO0FBQTdELDBIQUFBLDZCQUE2QixPQUFBO0FBRXRDLCtCQUErQjtBQUMvQixtREFBdUU7QUFBOUQsMkhBQUEsOEJBQThCLE9BQUE7QUFFdkMsK0JBQStCO0FBQy9CLG1EQUF5RTtBQUFoRSw2SEFBQSxnQ0FBZ0MsT0FBQTtBQUV6QywrQkFBK0I7QUFDL0IsbURBQWlFO0FBQXhELHFIQUFBLHdCQUF3QixPQUFBO0FBRWpDLCtCQUErQjtBQUMvQixtREFBc0U7QUFBN0QsMEhBQUEsNkJBQTZCLE9BQUE7QUFFdEMsK0JBQStCO0FBQy9CLG1EQUFvRTtBQUEzRCx3SEFBQSwyQkFBMkIsT0FBQTtBQUVwQywrQkFBK0I7QUFDL0IsbURBQXNFO0FBQTdELDBIQUFBLDZCQUE2QixPQUFBO0FBbUJ0Qyx1Q0FBdUM7QUFDdkMsbURBQTZFO0FBQXBFLCtHQUFBLGtCQUFrQixPQUFBO0FBQUUsNkdBQUEsZ0JBQWdCLE9BQUE7QUFFN0MsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFFL0UsOEJBQThCO0FBQzlCLHFEQUE0RDtBQUFuRCw4R0FBQSxpQkFBaUIsT0FBQTtBQTBCMUIsNkJBQTZCO0FBQzdCLGtEQUFpRDtBQUF4QyxzR0FBQSxTQUFTLE9BQUE7QUFnRWxCLHNDQUFzQztBQUN0QyxtREFBMkU7QUFBbEUseUdBQUEsWUFBWSxPQUFBO0FBQUUsMEdBQUEsYUFBYSxPQUFBO0FBQUUsa0dBQUEsS0FBSyxPQUFBO0FBRTNDLHNDQUFzQztBQUN0QyxtREFBcUc7QUFBNUYsaUhBQUEsb0JBQW9CLE9BQUE7QUFBRSxrSEFBQSxxQkFBcUIsT0FBQTtBQUFFLDRHQUFBLGVBQWUsT0FBQTtBQVNyRSxnQ0FBZ0M7QUFDaEMsbURBQTBFO0FBQWpFLDZHQUFBLGdCQUFnQixPQUFBO0FBQUUsNEdBQUEsZUFBZSxPQUFBO0FBRTFDLCtFQUErRTtBQUMvRSxpREFBaUQ7QUFDakQsK0VBQStFO0FBRS9FOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsK0NBQTRFO0FBQW5FLDRHQUFBLGNBQWMsT0FBQTtBQUFFLDJHQUFBLGFBQWEsT0FBQTtBQUFFLHVHQUFBLFNBQVMsT0FBQTtBQTBCakQsMEVBQXNFO0FBQTdELHlIQUFBLGlCQUFpQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGb290UHJpbnQg4oCUIFB1YmxpYyBBUEkgKHYzKVxuICpcbiAqIFRoZSBmbG93Y2hhcnQgcGF0dGVybiBmb3IgYmFja2VuZCBjb2RlLlxuICogQnVpbGQg4oaSIFJ1biDihpIgT2JzZXJ2ZS5cbiAqXG4gKiAqKlRoZSBjb21tb24gaW1wb3J0IHBhdGhzOioqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgZmxvd0NoYXJ0LCBkZWNpZGUsIG5hcnJhdGl2ZSB9IGZyb20gJ2Zvb3RwcmludGpzJzsgICAgICAgICAgIC8vIG1haW4g4oCUIHN0YXJ0IGhlcmVcbiAqIGltcG9ydCB7IG1ldHJpY3MsIGRlYnVnLCBtYW5pZmVzdCB9ICAgICBmcm9tICdmb290cHJpbnRqcy9yZWNvcmRlcnMnOyAvLyByZWNvcmRlciBmYWN0b3JpZXNcbiAqIGltcG9ydCB7IHN0YXRlQXQsIGNhdXNhbENoYWluIH0gZnJvbSAnZm9vdHRyYWNlJzsgICAgIC8vIHJlYWQgYSBmaW5pc2hlZCBydW5cbiAqIGltcG9ydCB7IFJlY29yZEZyYW1lLCBFdmVudExvZyB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7ICAgICAvLyB3cml0ZSBhIHJlY29yZCB5b3Vyc2VsZlxuICogaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gICAgICAgICAgICAgICAgIGZyb20gJ2Zvb3RwcmludGpzL2FkdmFuY2VkJzsgIC8vIGVuZ2luZSBpbnRlcm5hbHNcbiAqIGBgYFxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRdWljayBTdGFydCDigJQgRXZlcnl0aGluZyB5b3UgbmVlZCBmb3IgOTAlIG9mIHVzZSBjYXNlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgdHlwZSB7IEZsb3dDaGFydCwgU3RhZ2VGdW5jdGlvbiBhcyBTdGFnZUhhbmRsZXIsIFN0cmVhbUhhbmRsZXJzIH0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB7IGZsb3dDaGFydCwgRmxvd0NoYXJ0QnVpbGRlciwgZmxvd0NoYXJ0U2VsZWN0b3IgfSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnRcbiAqXG4gKiBDb25maWcgZm9yIGAuYWRkUGFyYWxsZWxGb3JFYWNoKClgIOKAlCBvbmUgYnJhbmNoIHBlciBpdGVtLCBicmFuY2ggY291bnRcbiAqIGRlY2lkZWQgYXQgcnVuIHRpbWUgZnJvbSB0aGUgcGF5bG9hZC4gYG1heEJyYW5jaGVzYCBhbmQgYGludG9gIGFyZSByZXF1aXJlZFxuICogb24gcHVycG9zZSAoc2VlIGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kKS5cbiAqL1xuZXhwb3J0IHR5cGUgeyBCcmFuY2hDaGFydCwgUGFyYWxsZWxGb3JFYWNoQ29uZmlnLCBSZXRyeVBvbGljeSB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0IOKAlCBidWlsZC10aW1lIG9ic2VydmVyICh0d2luIG9mIEZsb3dSZWNvcmRlcikgKi9cbmV4cG9ydCB0eXBlIHtcbiAgU3RydWN0dXJlRGVjaWRlckNvbXBsZXRlRXZlbnQsXG4gIFN0cnVjdHVyZUVkZ2VBZGRlZEV2ZW50LFxuICBTdHJ1Y3R1cmVFZGdlS2luZCxcbiAgU3RydWN0dXJlTG9vcEVkZ2VBZGRlZEV2ZW50LFxuICBTdHJ1Y3R1cmVSZWNvcmRlcixcbiAgU3RydWN0dXJlU3RhZ2VBZGRlZEV2ZW50LFxuICBTdHJ1Y3R1cmVTdGFnZVRhZ2dlZEV2ZW50LFxuICBTdHJ1Y3R1cmVTdWJmbG93TW91bnRlZEV2ZW50LFxufSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgVGltZSBCdWRnZXRcbiAqXG4gKiBgdGltZUJ1ZGdldChjaGFydClgIOKAlCB0aGUgc2xvd2VzdCBhIGNoYXJ0IGNhbiB0YWtlLCBmcm9tIGl0cyBkZWNsYXJlZCByZXRyeSBwb2xpY2llcyAoYGF0dGVtcHRzIMOXIHRpbWVvdXRNc2AgcGx1c1xuICogdGhlIHdhaXRzLCBzdW1tZWQgYWxvbmcgdGhlIHNsb3dlc3QgcGF0aCksIGFuZCBldmVyeSBzdGFnZSB0aGF0IG1ha2VzIGEgcGF0aCB1bmJvdW5kZWQsIGJ5IG5hbWUuIGAuYnVkZ2V0KG1zKWBcbiAqIGRlY2xhcmVzIHRoZSBjYWxsZXIncyBjb250cmFjdDsgYGJ1aWxkKClgIHJlZnVzZXMgYSBjaGFydCB0aGF0IGNhbm5vdCBrZWVwIGl0LiBBbHNvIGBjaGFydC50aW1lQnVkZ2V0KClgLlxuICovXG5leHBvcnQgdHlwZSB7XG4gIEJ1ZGdldEFzc3VtcHRpb25zLFxuICBCdWRnZXRTdGVwLFxuICBUaW1lQnVkZ2V0T3B0aW9ucyxcbiAgVGltZUJ1ZGdldFJlcG9ydCxcbiAgVW5ib3VuZGVkUmVhc29uLFxuICBVbmJvdW5kZWRTdGFnZSxcbn0gZnJvbSAnLi9saWIvYnVkZ2V0L2luZGV4LmpzJztcbmV4cG9ydCB7IHRpbWVCdWRnZXQgfSBmcm9tICcuL2xpYi9idWRnZXQvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgdHlwZSB7IFR5cGVkU3RhZ2VGdW5jdGlvbiB9IGZyb20gJy4vbGliL2J1aWxkZXIvdHlwZWRGbG93Q2hhcnQuanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgdHlwZSB7IFNjb3BlTWV0aG9kcywgVHlwZWRTY29wZSB9IGZyb20gJy4vbGliL3JlYWN0aXZlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHsgbmFycmF0aXZlIH0gZnJvbSAnLi9yZWNvcmRlcnMuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZWNpc2lvbiBCcmFuY2hpbmcg4oCUIGRlY2lkZSgpIC8gc2VsZWN0KCkgd2l0aCBldmlkZW5jZSBjYXB0dXJlXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgRGVjaXNpb24gQnJhbmNoaW5nICovXG5leHBvcnQgdHlwZSB7XG4gIERlY2lkZVJ1bGUsXG4gIERlY2lzaW9uRXZpZGVuY2UsXG4gIERlY2lzaW9uUmVzdWx0LFxuICBEZWZhdWx0QnJhbmNoLFxuICBGaWx0ZXJPcHMsXG4gIFJ1bGVFdmlkZW5jZSxcbiAgU2VsZWN0aW9uRXZpZGVuY2UsXG4gIFNlbGVjdGlvblJlc3VsdCxcbiAgV2hlbkNsYXVzZSxcbiAgV2hlcmVGaWx0ZXIsXG59IGZyb20gJy4vbGliL2RlY2lkZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgRGVjaXNpb24gQnJhbmNoaW5nICovXG5leHBvcnQgeyBkZWNpZGUsIHNlbGVjdCB9IGZyb20gJy4vbGliL2RlY2lkZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgRXJyb3JzICovXG5leHBvcnQgdHlwZSB7IFRlcm1pbmFsRmFpbHVyZUNvbnRleHQgfSBmcm9tICcuL2xpYi9lcnJvcnMvdGVybWluYWxGYWlsdXJlLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQXR0ZW1wdHMg4oCUIGV2ZXJ5IHRyeSBvZiBhIHJldHJpZWQgc3RhZ2UsIGFuZCB0aGUgZGVjaXNpb24gdGhhdCBmb2xsb3dlZCBpdFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEBjYXRlZ29yeSBBdHRlbXB0c1xuICpcbiAqIE9uZSBgQXR0ZW1wdFJlY29yZGAgcGVyIGF0dGVtcHQgb2YgYSBzdGFnZSB3aXRoIGEgZGVjbGFyZWQgYHJldHJ5YCBwb2xpY3ksIGEgYHRpbWVvdXRNc2AsIG9yIGEgcnVuIGRlYWRsaW5lIOKAlFxuICogdGltaW5nLCBvdXRjb21lLCBmYWlsdXJlIGNhdGVnb3J5LCBhbmQgdGhlIHJldHJ5LW9yLXN0b3AgZGVjaXNpb24gYXMgYERlY2lzaW9uRXZpZGVuY2VgIOKAlCBvbiB0aGUgc3RhZ2Unc1xuICogZXhlY3V0aW9uLXRyZWUgbm9kZSAoYFN0YWdlU25hcHNob3QuYXR0ZW1wdHNgIC8gYGF0dGVtcHRTdW1tYXJ5YCkgYW5kIG9uIGBGbG93UmVjb3JkZXIub25BdHRlbXB0YC5cbiAqIEEgY2FsbCBhIHN0YWdlIG1ha2VzIHRocm91Z2ggYHNjb3BlLiRjYWxsYCBpcyByZWNvcmRlZCB0aGUgc2FtZSB3YXkgKGtpbmQgYCdjYWxsJ2ApLCBhbmQgc28gaXMgYW4gU0RLJ3Mgb3duIHJldHJ5XG4gKiBhbiBhZGFwdGVyIHJlcG9ydHMgdGhyb3VnaCBgb2JzZXJ2ZWQoKWAgKGBPYnNlcnZlZEF0dGVtcHRgLCBraW5kIGAnb2JzZXJ2ZWQnYCkuIGBBdHRlbXB0Q29udGV4dGAgaXMgd2hhdFxuICogYHNjb3BlLiRhdHRlbXB0KClgIHJldHVybnMsIGFuZCB3aGF0IGEgY2FsbCdzIGZ1bmN0aW9uIGdldHMgKHRoZSBhdHRlbXB0J3Mgc2lnbmFsLCB0aGUgdGltZSBsZWZ0LCBgb2JzZXJ2ZWRgKTtcbiAqIGBMYXRlV3JpdGVgIGlzIGEgd3JpdGUgKG9yIGNhbGwpIGFuIGVuZGVkIGF0dGVtcHQgdHJpZWQgKGBTdGFnZVNuYXBzaG90LmxhdGVXcml0ZXNgKS4gQSBzdGFnZSB0aGF0IGNoYW5nZXMgYW5cbiAqIG91dHNpZGUgc3lzdGVtIGRlY2xhcmVzIGl0IChgU3RhZ2VUb3VjaGVzYCwgYC50b3VjaGVzKClgKSwgYW5kIGEgY2FsbCBkb2VzIChgQ2FsbE9wdGlvbnNgKTogZXZlcnkgYXR0ZW1wdCB0aGVuXG4gKiBjYXJyaWVzIGl0cyBgQXR0ZW1wdEVmZmVjdGAsIGFuZCB0aGUga2V5IHJ1bGUgaXMgaGFuZGVkIGFuIGBJZGVtcG90ZW5jeUtleUNvbnRleHRgIG9uY2UgcGVyIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBBdHRlbXB0Q2F0ZWdvcnksXG4gIEF0dGVtcHRDb250ZXh0LFxuICBBdHRlbXB0RWZmZWN0LFxuICBBdHRlbXB0RXJyb3IsXG4gIEF0dGVtcHRJbnB1dHMsXG4gIEF0dGVtcHRLaW5kLFxuICBBdHRlbXB0TmV4dCxcbiAgQXR0ZW1wdE9wdGlvbnMsXG4gIEF0dGVtcHRPdXRjb21lLFxuICBBdHRlbXB0UmVhc29uLFxuICBBdHRlbXB0UmVjb3JkLFxuICBBdHRlbXB0U3VtbWFyeSxcbiAgQ2FsbE9wdGlvbnMsXG4gIElkZW1wb3RlbmN5S2V5Q29udGV4dCxcbiAgTGF0ZVdyaXRlLFxuICBPYnNlcnZlZEF0dGVtcHQsXG4gIFN0YWdlVG91Y2hlcyxcbiAgVW5rbm93bkVmZmVjdEluaXQsXG59IGZyb20gJy4vbGliL2F0dGVtcHQvaW5kZXguanMnO1xuLyoqXG4gKiBAY2F0ZWdvcnkgQXR0ZW1wdHNcbiAqXG4gKiBBbiBhdHRlbXB0IGJ5IG5hbWUgKGBzZXJpZXNgICsgYGF0dGVtcHRgKSBhbmQgcGVyLW91dGNvbWUgY291bnRzIOKAlCB3aGF0IHJlY29yZGVyIHJvd3MgaG9sZCBvZiBhdHRlbXB0cy5cbiAqL1xuZXhwb3J0IHR5cGUgeyBBdHRlbXB0T3V0Y29tZUNvdW50cywgQXR0ZW1wdFJlZiB9IGZyb20gJy4vbGliL3JlY29yZGVyL2F0dGVtcHRTZXJpZXMuanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBBdHRlbXB0c1xuICpcbiAqIGBhdHRlbXB0KClgIOKAlCB0aGUgYXR0ZW1wdCBydW5uZXIgZm9yIGNvZGUgdGhhdCBpcyBub3QgYSBzdGFnZSAocmVjb3JkcyBnbyB0byBpdHMgYG9uQXR0ZW1wdGApOyBgZXJyb3JDYXRlZ29yeWBcbiAqIOKAlCB0aGUgb25lIGZhaWx1cmUgY2xhc3NpZmllciAoc2V2ZW4gZml4ZWQgY2F0ZWdvcmllcyk7IGByZXRyeVJ1bGVzYCDigJQgdGhlIG9uZSByZXRyeSBydWxlIHRhYmxlLCBhcyBgZGVjaWRlKClgXG4gKiBydWxlczsgdGhlIGF0dGVtcHQgY29udHJhY3QncyB0d28gZXJyb3JzOyBgZXhwb25lbnRpYWxCYWNrb2ZmYCAvIGBzdGF0ZWRXYWl0Rmlyc3RgIOKAlCBkZXRlcm1pbmlzdGljIGJ1aWxkZXJzIG9mXG4gKiB0aGUgZnVuY3Rpb24gYSBgUmV0cnlQb2xpY3kuYmFja29mZk1zYCB0YWtlcyAoYEJhY2tvZmZTcGVjLm1heERlbGF5TXNgIGNhcHMgdGhlIHNjaGVkdWxlIGJlZm9yZSB0aGUgaml0dGVyIGRyYXc7IHRoZVxuICogcG9saWN5J3MgYG1heEJhY2tvZmZNc2Agc3RpbGwgY2FwcyBldmVyeSB3YWl0IGFmdGVyIGl0KS5cbiAqL1xuZXhwb3J0IHtcbiAgYXR0ZW1wdCxcbiAgQXR0ZW1wdFRpbWVvdXRFcnJvcixcbiAgZXJyb3JDYXRlZ29yeSxcbiAgZXhwb25lbnRpYWxCYWNrb2ZmLFxuICByZXRyeVJ1bGVzLFxuICBzdGF0ZWRXYWl0Rmlyc3QsXG4gIFVua25vd25FZmZlY3RFcnJvcixcbn0gZnJvbSAnLi9saWIvYXR0ZW1wdC9pbmRleC5qcyc7XG4vKipcbiAqIEBjYXRlZ29yeSBBdHRlbXB0c1xuICpcbiAqIFdoYXQgdGhlIGJhY2tvZmYgYnVpbGRlcnMgdGFrZSBhbmQgYnVpbGQ6IGFuIGV4cG9uZW50aWFsIHNjaGVkdWxlIChgQmFja29mZlNwZWNgLCBpdHMgYEJhY2tvZmZKaXR0ZXJgKSwgdGhlXG4gKiBgUmV0cnlQb2xpY3kuYmFja29mZk1zYCBmdW5jdGlvbiB0aGV5IHJldHVybiAoYEJhY2tvZmZGdW5jdGlvbmApLCBhbmQgdGhlIHJlYWRlciBvZiBhIHN0YXRlZCB3YWl0XG4gKiAoYFN0YXRlZFdhaXRSZWFkZXJgIOKAlCBhIHBhcnNlZCBgUmV0cnktQWZ0ZXJgLCBpbiBtaWxsaXNlY29uZHMpLlxuICovXG5leHBvcnQgdHlwZSB7IEJhY2tvZmZGdW5jdGlvbiwgQmFja29mZkppdHRlciwgQmFja29mZlNwZWMsIFN0YXRlZFdhaXRSZWFkZXIgfSBmcm9tICcuL2xpYi9hdHRlbXB0L2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQ29ycmVsYXRpb25cbiAqXG4gKiBUaGUgcnVuJ3MgY29ycmVsYXRpb24gKDEwLjEpOiBgZW52LnRyYWNlcGFyZW50YCAoVzNDLCBwYXJzZWQgc3RyaWN0bHkpIG9yIGBlbnYudHJhY2VJZGAgKyBgZW52Lm9wZXJhdGlvbklkYFxuICogYmVjb21lIE9ORSBmcm96ZW4gYFJ1bkNvcnJlbGF0aW9uYCBwZXIgcnVuIOKAlCBvbiBgZ2V0U25hcHNob3QoKS5jb3JyZWxhdGlvbmAsIGV2ZXJ5IGZsb3cgZXZlbnQnc1xuICogYHRyYXZlcnNhbENvbnRleHQuY29ycmVsYXRpb25gIGFuZCBldmVyeSBzY29wZSBhbmQgZW1pdCBldmVudCdzIGBjb3JyZWxhdGlvbmAuIGBwYXJzZVRyYWNlcGFyZW50YCAvXG4gKiBgZm9ybWF0VHJhY2VwYXJlbnRgIGFyZSB0aGUgVzNDIGNvZGVjOyBhIHJlZnVzZWQgaGVhZGVyIHRocm93cyBgVHJhY2VwYXJlbnRFcnJvcmAgd2l0aCBhIG5hbWVkIGByZWFzb25gLlxuICovXG5leHBvcnQgdHlwZSB7IFBhcnNlZFRyYWNlcGFyZW50LCBSdW5Db3JyZWxhdGlvbiwgVHJhY2VwYXJlbnRGaWVsZHMsIFRyYWNlcGFyZW50UmVmdXNhbCB9IGZyb20gJy4vbGliL2F0dGVtcHQvaW5kZXguanMnO1xuZXhwb3J0IHsgZm9ybWF0VHJhY2VwYXJlbnQsIHBhcnNlVHJhY2VwYXJlbnQsIFRyYWNlcGFyZW50RXJyb3IgfSBmcm9tICcuL2xpYi9hdHRlbXB0L2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUnVuIOKAlCBFeGVjdXRlIGNoYXJ0cyBhbmQgY29sbGVjdCByZXN1bHRzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgdHlwZSB7XG4gIENhcHR1cmVIaXN0b3J5T3B0aW9ucyxcbiAgQ2FwdHVyZUhpc3RvcnlSZWNlaXB0LFxuICBDYXB0dXJlSGlzdG9yeVN0YXR1cyxcbiAgQ2FwdHVyZUhpc3RvcnlUYXJnZXQsXG59IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5leHBvcnQgdHlwZSB7IFJ1blJlc3VsdCB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgdHlwZSB7IEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucyB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKlxuICogVGhlIGNyYXNoLXNhZmUgcmVjb3JkICgxMC4xKTogdGhlIGV4ZWN1dG9yJ3MgYHNpbmtgIG9wdGlvbiwgaXRzIGFjY291bnRpbmcgb24gYGdldFNuYXBzaG90KCkuc2lua2AsXG4gKiBgZXhlY3V0b3IuZmx1c2hSZWNvcmQoKWAncyByZXN1bHQsIGFuZCB0aGUgZXJyb3IgYSBydW4gd2l0aCBgb25GYWlsdXJlOiAnZmFpbCdgIHJlamVjdHMgd2l0aC4gVGhlIHBvcnRcbiAqIChgUmVjb3JkU2lua2AsIGBtZW1vcnlTaW5rYCkgaXMgYGZvb3R0cmFjZS93cml0ZWAnczsgdGhlIGZpbGUgYWRhcHRlciBpcyBgZm9vdHByaW50anMvc2lua3NgLlxuICogQGNhdGVnb3J5IFJ1blxuICovXG5leHBvcnQgdHlwZSB7XG4gIFJlY29yZEZsdXNoUmVzdWx0LFxuICBSZWNvcmRTaW5rRmFpbHVyZU1vZGUsXG4gIFJlY29yZFNpbmtGbHVzaE1vZGUsXG4gIFJlY29yZFNpbmtPcHRpb24sXG4gIFJlY29yZFNpbmtPcHRpb25zLFxuICBSZWNvcmRTaW5rU3RhdHMsXG59IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHsgUmVjb3JkU2lua0Vycm9yIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBUaGUgZm91ciBvYnNlcnZhYmlsaXR5IGRpYWxzIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnNgIGluaGVyaXRzLlxuICogQGNhdGVnb3J5IFJ1blxuICovXG5leHBvcnQgdHlwZSB7IFJ1bkRpYWxzIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB7IEZsb3dDaGFydEV4ZWN1dG9yIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB7IFJ1bkNvbnRleHQgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUgeyBDaGFydE9wZW5BUElPcHRpb25zLCBNQ1BUb29sRGVzY3JpcHRpb24sIFJ1bm5hYmxlRmxvd0NoYXJ0IH0gZnJvbSAnLi9saWIvcnVubmVyL1J1bm5hYmxlQ2hhcnQuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPYnNlcnZlIOKAlCBEYXRhIChzY29wZSByZWNvcmRlcnMsIGZpcmUgZHVyaW5nIHN0YWdlIGV4ZWN1dGlvbilcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEYXRhICovXG5leHBvcnQgdHlwZSB7XG4gIENvbW1pdEV2ZW50LFxuICBFcnJvckV2ZW50LFxuICBSZWFkRXZlbnQsXG4gIFJlZGFjdGlvblBvbGljeSxcbiAgUmVkYWN0aW9uUmVwb3J0LFxuICBTY29wZVJlY29yZGVyLFxuICBTdGFnZUV2ZW50LFxuICBXcml0ZUV2ZW50LFxufSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGF0YSAqL1xuZXhwb3J0IHsgTWV0cmljUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGF0YSAqL1xuZXhwb3J0IHsgRGVidWdSZWNvcmRlciB9IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBPcGVyYXRpb24gKi9cbmV4cG9ydCB7IFJlY29yZGVyT3BlcmF0aW9uIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEZWxpdmVyeSB0aWVyIChSRkMtMDAxIGRlZmVycmVkIG9ic2VydmVycylcbiAqXG4gKiBFdmVyeSBgYXR0YWNoKlJlY29yZGVyYCBjYWxsIGFjY2VwdHMgYW4gb3B0aW9ucyBiYWc6XG4gKiBgZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWMsIHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfSlgIHRha2VzIHRoZVxuICogcmVjb3JkZXIgT1VUIG9mIHRoZSBlbmdpbmUncyBob3QgcGF0aCDigJQgZXZlbnRzIGFyZSBjYXB0dXJlZCBpbnRvIG9uZVxuICogYm91bmRlZCwgdG90YWxseS1vcmRlcmVkIHF1ZXVlIGFuZCBkZWxpdmVyZWQgYXQgdGhlIG5leHQgbWljcm90YXNrXG4gKiBjaGVja3BvaW50IChcIm9uZSBiZWF0IGJlaGluZFwiKS4gT21pdCBgZGVsaXZlcnlgIGZvciB0aGUgaGlzdG9yaWNhbFxuICogc3luY2hyb25vdXMgY2FsbCAoYnl0ZS1pZGVudGljYWwgdG8gcHJldmlvdXMgcmVsZWFzZXMpLiBBY2NvdW50aW5nXG4gKiBzdXJmYWNlcyBvbiBgc25hcHNob3Qub2JzZXJ2ZXJTdGF0c2A7IGBleGVjdXRvci5kcmFpbk9ic2VydmVycygpYCBzZXR0bGVzXG4gKiBhc3luYyBsaXN0ZW5lcnMgYmVmb3JlIHNodXRkb3duLiBTZWUgYGRvY3MvZ3VpZGVzL29ic2VydmVycy1kZWZlcnJlZC5tZGAuXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQXR0YWNoUmVjb3JkZXJPcHRpb25zLFxuICBPYnNlcnZlckRlbGl2ZXJ5LFxuICBPYnNlcnZlckRyYWluUmVzdWx0LFxuICBPYnNlcnZlclN0YXRzLFxufSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEZWxpdmVyeSB0aWVyIChSRkMtMDAxIGRlZmVycmVkIG9ic2VydmVycylcbiAqXG4gKiBgQ2FwdHVyZVBvbGljeWAg4oCUIGhvdyBhIGRlZmVycmVkIGV2ZW50J3MgcGF5bG9hZCBpcyBtYXRlcmlhbGl6ZWQgYXRcbiAqIGNhcHR1cmUgdGltZSAoYCdjbG9uZSdgIGJ5IGRlZmF1bHQgZm9yIGF0dGFjaCBvcHRpb25zIC8gYCdzdW1tYXJ5J2AgLyBgJ3JlZidgKS4gYE92ZXJmbG93UG9saWN5YFxuICog4oCUIHdoYXQgYSBzYXR1cmF0ZWQgcXVldWUgZG9lcyAoYCdkcm9wLW9sZGVzdCdgIGRlZmF1bHQgLyBgJ3NhbXBsZSdgIC9cbiAqIGAnYmxvY2snYCkuIGBEaXNwYXRjaGVyU3RhdHNgIC8gYExpc3RlbmVyU3RhdHNgIOKAlCB0aGUgYWNjb3VudGluZyBzaGFwZXNcbiAqIGVtYmVkZGVkIGluIGBPYnNlcnZlclN0YXRzYC4gVHlwZXMgb25seSDigJQgdGhlIG9ic2VydmVyLXF1ZXVlIG1vZHVsZVxuICogaXRzZWxmIGlzIGludGVybmFsOyBjb25zdW1lcnMgdXNlIHRoZSBhdHRhY2ggb3B0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgeyBDYXB0dXJlUG9saWN5LCBEaXNwYXRjaGVyU3RhdHMsIExpc3RlbmVyU3RhdHMsIE92ZXJmbG93UG9saWN5IH0gZnJvbSAnLi9saWIvb2JzZXJ2ZXItcXVldWUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIENvbWJpbmVkIChib3RoIGRhdGEtZmxvdyBhbmQgY29udHJvbC1mbG93KSAqL1xuZXhwb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBDb21iaW5lZCAoYm90aCBkYXRhLWZsb3cgYW5kIGNvbnRyb2wtZmxvdykgKi9cbmV4cG9ydCB7XG4gIGhhc0VtaXRSZWNvcmRlck1ldGhvZHMsXG4gIGhhc0Zsb3dSZWNvcmRlck1ldGhvZHMsXG4gIGhhc1JlY29yZGVyTWV0aG9kcyxcbiAgaXNGbG93RXZlbnQsXG59IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRW1pdCAodXNlci1hdXRob3JlZCBzdHJ1Y3R1cmVkIGV2ZW50cylcbiAqXG4gKiBUaGlyZCBvYnNlcnZlciBjaGFubmVsIChhbG9uZ3NpZGUgYFNjb3BlUmVjb3JkZXJgIGFuZCBgRmxvd1JlY29yZGVyYCkuIENvbnN1bWVyXG4gKiBjb2RlIGNhbGxzIGBzY29wZS4kZW1pdChuYW1lLCBwYXlsb2FkKWAgZnJvbSBpbnNpZGUgYSBzdGFnZTsgZXZlcnkgYXR0YWNoZWRcbiAqIGBFbWl0UmVjb3JkZXIub25FbWl0KGV2ZW50KWAgZmlyZXMgc3luY2hyb25vdXNseSB3aXRoIHN0YWdlLWNvbnRleHRcbiAqIGVucmljaG1lbnQuIFBhc3MtdGhyb3VnaCDigJQgbm8gYnVmZmVyaW5nLCB6ZXJvIGFsbG9jYXRpb24gd2hlbiBubyByZWNvcmRlclxuICogaXMgYXR0YWNoZWQuXG4gKi9cbmV4cG9ydCB0eXBlIHsgRW1pdEV2ZW50LCBFbWl0UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9ic2VydmUg4oCUIEZsb3cgKEZsb3dSZWNvcmRlciwgZmlyZXMgYWZ0ZXIgc3RhZ2UgZXhlY3V0aW9uKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB0eXBlIHtcbiAgRmxvd0F0dGVtcHRFdmVudCxcbiAgRmxvd0JyZWFrRXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93RXJyb3JFdmVudCxcbiAgRmxvd0ZvcmtFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd05leHRFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93UnVuRXZlbnQsXG4gIEZsb3dSdW5GYWlsZWRFdmVudCxcbiAgRmxvd1NlbGVjdGVkRXZlbnQsXG4gIEZsb3dTdGFnZUV2ZW50LFxuICBGbG93U3RhZ2VSZXRyeUV2ZW50LFxuICBGbG93U3ViZmxvd0V2ZW50LFxuICBGbG93U3ViZmxvd1JlZ2lzdGVyZWRFdmVudCxcbiAgRmxvd1Rocm90dGxlZEV2ZW50LFxuICBSZXN1bWVMaW5rLFxuICBUcmF2ZXJzYWxDb250ZXh0LFxufSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3dcbiAqXG4gKiBgTmFycmF0aXZlRm9ybWF0dGVyYCDigJQgcGx1Z2dhYmxlIGZvcm1hdHRlciB0aGF0IGNvbnZlcnRzIGV2ZW50IGNvbnRleHRcbiAqIG9iamVjdHMgaW50byB0aGUgdGV4dCBsaW5lcyBvZiB0aGUgbmFycmF0aXZlLlxuICovXG5leHBvcnQgdHlwZSB7IE5hcnJhdGl2ZUZvcm1hdHRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgdHlwZSB7IE1hbmlmZXN0QXR0ZW1wdFJvdywgTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IEFkYXB0aXZlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBNaWxlc3RvbmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFByb2dyZXNzaXZlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBSTEVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFNlcGFyYXRlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBTaWxlbnROYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFdpbmRvd2VkTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2VsZi1EZXNjcmliaW5nIOKAlCAuY29udHJhY3QoKSwgdG9PcGVuQVBJKCksIHRvTUNQVG9vbCgpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgU2VsZi1EZXNjcmliaW5nICovXG5leHBvcnQgdHlwZSB7IEpzb25TY2hlbWEgfSBmcm9tICcuL2xpYi9jb250cmFjdC9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNuYXBzaG90ICYgQ29tcG9zaXRpb24g4oCUIFN1YmZsb3cgbmF2aWdhdGlvbiBhbmQgQ29tcG9zYWJsZVJ1bm5lclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFNuYXBzaG90ICYgQ29tcG9zaXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgQ29tcG9zYWJsZVJ1bm5lciB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgU25hcHNob3QgJiBDb21wb3NpdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBSZWNvcmRlclNuYXBzaG90LCBSdW50aW1lU25hcHNob3QsIFN1YnRyZWVTbmFwc2hvdCB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgU25hcHNob3QgJiBDb21wb3NpdGlvbiAqL1xuZXhwb3J0IHsgZ2V0U3VidHJlZVNuYXBzaG90LCBsaXN0U3ViZmxvd1BhdGhzIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2NvcGVSZWNvcmRlciBDb21wb3NpdGlvbiDigJQgQnVuZGxlIG11bHRpcGxlIHJlY29yZGVycyBpbnRvIGRvbWFpbiBwcmVzZXRzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgU2NvcGVSZWNvcmRlciAqL1xuZXhwb3J0IHsgQ29tcG9zaXRlUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBhdXNlL1Jlc3VtZSDigJQgU2VyaWFsaXphYmxlIGNoZWNrcG9pbnRzIGZvciBsb25nLXJ1bm5pbmcgb3IgaHVtYW4taW4tdGhlLWxvb3AgZmxvd3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWUgKi9cbi8qKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lICovXG5leHBvcnQgdHlwZSB7XG4gIEZsb3djaGFydENoZWNrcG9pbnQsXG4gIFBhdXNhYmxlSGFuZGxlcixcbiAgUGF1c2VkRXhlY3V0aW9uLFxuICBQZW5kaW5nUGF1c2UsXG4gIFJlZGFjdGlvbk1hcmtzLFxufSBmcm9tICcuL2xpYi9wYXVzZS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZVxuICpcbiAqIGBpbnRlcnJ1cHQoc2NvcGUsIHsgcmVhc29uLCBleHBlY3RzPyB9KWAg4oCUIHN0b3AgbWlkLXN0YWdlIHRvIGFzayBhIHF1ZXN0aW9uLFxuICogYW5kIGdldCB0aGUgYW5zd2VyIGJhY2sgYXQgdGhlIHNhbWUgY2FsbCBzaXRlIHdoZW4gdGhlIHJ1biByZXN1bWVzLiBSZXN1bWVcbiAqIHJlLWVudGVycyB0aGUgc3RhZ2UgZnJvbSBpdHMgVE9QIChzdGFnZXMgYXJlIGF0b21pYyksIHNvIGtlZXAgdGhlIGhhbGZcbiAqIGJlZm9yZSB0aGUgY2FsbCBpZGVtcG90ZW50LlxuICovXG5leHBvcnQgdHlwZSB7IEludGVycnVwdFBheWxvYWQgfSBmcm9tICcuL2xpYi9wYXVzZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lICovXG5leHBvcnQgeyBpbnRlcnJ1cHQgfSBmcm9tICcuL2xpYi9wYXVzZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgU2NvcGVSZWNvcmRlciAqL1xuZXhwb3J0IHR5cGUgeyBDb21wb3NpdGVTbmFwc2hvdCB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29uZmlndXJhdGlvbiDigJQgVHlwZXMgcGFzc2VkIHRvIEZsb3dDaGFydEV4ZWN1dG9yIGFuZCBydW4oKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgRXhlY3V0aW9uRW52LCBFeGVjdXRvclJlc3VsdCwgUGF1c2VkUmVzdWx0LCBSdW5PcHRpb25zIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uICovXG5leHBvcnQgdHlwZSB7IFNjb3BlRmFjdG9yeSB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBSZWFkLXRyYWNraW5nIHBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VSZWFkc2AgKCMxNCk6XG4gKiBgJ2Z1bGwnYCAoZGVmYXVsdCDigJQgcGVyLXJlYWQgdmFsdWUgY2xvbmUsIGhpc3RvcmljYWwgYmVoYXZpb3IpIC9cbiAqIGAnc3VtbWFyeSdgIChjaGVhcCBgUmVhZFN1bW1hcnlNYXJrZXJgIHBlciByZWFkKSAvIGAnb2ZmJ2AgKG5vIHRyYWNraW5nLFxuICogemVybyBwZXItcmVhZCBjbG9uZSkuIFBhc3MgYXMgYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyByZWFkVHJhY2tpbmcgfSlgXG4gKiBvciBjYWxsIGBleGVjdXRvci5zZXRSZWFkVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICovXG5leHBvcnQgdHlwZSB7IFJlYWRTdW1tYXJ5TWFya2VyLCBSZWFkVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvblxuICpcbiAqIFdyaXRlLXRyYWNraW5nIHBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgICgjMTNjLUEpIOKAlCB0aGVcbiAqIHNpYmxpbmcgb2YgYFJlYWRUcmFja2luZ01vZGVgOyBib3RoIGFsaWFzIHRoZSBzaGFyZWQgYFJldGVudGlvblBvbGljeWBcbiAqIGZhbWlseSBmcm9tIGBsaWIvY2FwdHVyZWAuIGAnZnVsbCdgIChkZWZhdWx0IOKAlCBwZXItd3JpdGUgdmFsdWUgY2xvbmUsXG4gKiBoaXN0b3JpY2FsIGJlaGF2aW9yKSAvIGAnc3VtbWFyeSdgIChjaGVhcCBgV3JpdGVTdW1tYXJ5TWFya2VyYCBwZXIgd3JpdGUpXG4gKiAvIGAnb2ZmJ2AgKG5vIHRyYWNraW5nOyBgc3RhZ2VXcml0ZXNgIGFic2VudCBhbmQgdGhlIGBvbkNvbW1pdGAgbXV0YXRpb25zXG4gKiBwYXlsb2FkIGlzIGVtcHR5IOKAlCB3cml0ZXMgdGhlbXNlbHZlcyBzdGlsbCBjb21taXQsIGFuZCB0aGUgY29tbWl0IGxvZyBpc1xuICogdW5hZmZlY3RlZCkuIFBhc3MgYXMgYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyB3cml0ZVRyYWNraW5nIH0pYCBvclxuICogY2FsbCBgZXhlY3V0b3Iuc2V0V3JpdGVUcmFja2luZyhtb2RlKWAgYmVmb3JlIGBydW4oKWAuXG4gKi9cbmV4cG9ydCB0eXBlIHsgUmV0ZW50aW9uUG9saWN5LCBXcml0ZVN1bW1hcnlNYXJrZXIsIFdyaXRlVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvblxuICpcbiAqIENvbW1pdC12YWx1ZXMgZW5jb2RpbmcgZm9yIHRoZSBDT01NSVQgTE9HICgjMTNjLUIpIOKAlCB0aGUgdGhpcmQgZGlhbCBvZlxuICogdGhlIGZhbWlseSwgYW5kIHRoZSBvbmx5IExPU1NMRVNTIG9uZSAoaXQgY2hhbmdlcyB0aGUgbG9nJ3MgZW5jb2RpbmcsXG4gKiBuZXZlciBpdHMgaW5mb3JtYXRpb24pLiBgJ2Z1bGwnYCAoZGVmYXVsdCDigJQgZXZlcnkgc3Vydml2aW5nIGBzZXRgIHN0b3Jlc1xuICogdGhlIGZ1bGwgZmluYWwgdmFsdWUsIGJ5dGUtaWRlbnRpY2FsIHRvIGhpc3RvcnkpIC8gYCdkZWx0YSdgIChhcnJheVxuICogbmV0LWNoYW5nZXMgdGhhdCBhcmUgXCJiYXNlIHBsdXMgYSB0YWlsXCIgY29tbWl0IGFzIGFuIGBhcHBlbmRgIHZlcmJcbiAqIHN0b3Jpbmcgb25seSB0aGUgdGFpbDsgYGRlbGV0ZVZhbHVlKClgIGNvbW1pdHMgYXMgYSByZWFsIGBkZWxldGVgIHZlcmI7XG4gKiBvbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoKS4gUmVwbGF5IHJlY29uc3RydWN0cyBldmVyeSBzdGVwJ3NcbiAqIGZ1bGwgc3RhdGUgZXhhY3RseS4gQ29uc3VtZXJzIHJlYWRpbmcgYGJ1bmRsZS5vdmVyd3JpdGVba2V5XWAgYXMgdGhlIGZ1bGxcbiAqIHZhbHVlIG11c3QgdXNlIGBjb21taXRWYWx1ZUF0YCBmcm9tIGBmb290dHJhY2VgLiBQYXNzIGFzXG4gKiBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IGNvbW1pdFZhbHVlcyB9KWAgb3IgY2FsbFxuICogYGV4ZWN1dG9yLnNldENvbW1pdFZhbHVlcyhtb2RlKWAgYmVmb3JlIGBydW4oKWA7IHRoZSBhY3RpdmUgbW9kZSBpcyB0aGVcbiAqIHNuYXBzaG90IGRpc2NyaW1pbmFudCBgZ2V0U25hcHNob3QoKS5jb21taXRWYWx1ZXNgLlxuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbnRyYWN0ICYgVmFsaWRhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IENvbnRyYWN0ICYgVmFsaWRhdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBTY2hlbWFLaW5kLCBWYWxpZGF0aW9uSXNzdWUsIFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuL2xpYi9zY2hlbWEvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IENvbnRyYWN0ICYgVmFsaWRhdGlvbiAqL1xuZXhwb3J0IHsgZGV0ZWN0U2NoZW1hLCBpc1ZhbGlkYXRhYmxlLCBpc1pvZCB9IGZyb20gJy4vbGliL3NjaGVtYS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgQ29udHJhY3QgJiBWYWxpZGF0aW9uICovXG5leHBvcnQgeyBJbnB1dFZhbGlkYXRpb25FcnJvciwgdmFsaWRhdGVBZ2FpbnN0U2NoZW1hLCB2YWxpZGF0ZU9yVGhyb3cgfSBmcm9tICcuL2xpYi9zY2hlbWEvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFcnJvciBVdGlsaXRpZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBFcnJvciBVdGlsaXRpZXMgKi9cbmV4cG9ydCB0eXBlIHsgU3RydWN0dXJlZEVycm9ySW5mbyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgRXJyb3IgVXRpbGl0aWVzICovXG5leHBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCBmb3JtYXRFcnJvckluZm8gfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZXYgVG9vbHMg4oCUIE1vZGUgZmxhZ3MgYW5kIFpvZCBzY29wZSB1dGlsaXRpZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBAY2F0ZWdvcnkgRGV2IFRvb2xzXG4gKlxuICogR2xvYmFsIGRldi1tb2RlIGZsYWcuIENhbGwgYGVuYWJsZURldk1vZGUoKWAgYXQgYXBwbGljYXRpb24gc3RhcnR1cCB0b1xuICogdHVybiBvbiBkZXZlbG9wZXItb25seSBkaWFnbm9zdGljcyBhY3Jvc3MgdGhlIGxpYnJhcnkg4oCUIGNpcmN1bGFyLXJlZmVyZW5jZVxuICogZGV0ZWN0aW9uIGluIHNjb3BlIHdyaXRlcywgd2FybmluZ3Mgd2hlbiBhIHJlY29yZGVyIGhhcyBubyBvYnNlcnZlclxuICogbWV0aG9kcywgc3VzcGljaW91cy1wcmVkaWNhdGUgd2FybmluZ3MgaW4gZGVjaWRlL3NlbGVjdCwgc3RydWN0dXJhbFxuICogY2hlY2tzIGluIGBnZXRTdWJ0cmVlU25hcHNob3RgLCBhbmQgYW55IGZ1dHVyZSBkZXYtb25seSBkaWFnbm9zdGljLlxuICpcbiAqIFByb2R1Y3Rpb24gbGVhdmVzIGl0IE9GRiBieSBkZWZhdWx0ICh6ZXJvIG92ZXJoZWFkKS4gU2VlIHRoZSBKU0RvYyBvblxuICogYGVuYWJsZURldk1vZGVgIGZvciB0aGUgZnVsbCBsaXN0IGFuZCB1c2FnZSBleGFtcGxlLlxuICovXG5leHBvcnQgeyBkaXNhYmxlRGV2TW9kZSwgZW5hYmxlRGV2TW9kZSwgaXNEZXZNb2RlIH0gZnJvbSAnLi9saWIvZGV2TW9kZS5qcyc7XG5cbi8vIGBkZWZpbmVTY29wZUZyb21ab2RgIGFuZCB0aGUgb3RoZXIgem9kLWJhc2VkIHNjb3BlIGhlbHBlcnMgbW92ZWQgdG8gdGhlIG9wdC1pblxuLy8gYGZvb3RwcmludGpzL3pvZGAgZW50cnkg4oCUIGtlZXBpbmcgem9kIG91dCBvZiB0aGUgY29yZSBsb2FkIHBhdGggKGl0IGlzIGFuXG4vLyBvcHRpb25hbCBwZWVyKS4gSW1wb3J0IHRoZW0gZnJvbSAnZm9vdHByaW50anMvem9kJy5cbi8vIEEgcnVuJ3MgcmVjb3JkIGFzIEpTT04gd2l0aG91dCB0aGUgZW5naW5lJ3MgcmVjdXJzaW9uIGxpbWl0ICg5LjI2LjApOiB0aGVcbi8vIHNhbWUgYnl0ZXMgSlNPTi5zdHJpbmdpZnkgZW1pdHMsIGZvciBhIGRlZXAgYG5leHRgIGNoYWluIGl0IGNhbm5vdCBlbmNvZGUuXG5leHBvcnQgdHlwZSB7IFJldHJ5TG9vcENhbGwsIFJldHJ5TG9vcERlY2lzaW9uLCBSZXRyeUxvb3BJZGVudGl0eSB9IGZyb20gJy4vbGliL2F0dGVtcHQvcmV0cnlMb29wVHlwZXMuanMnO1xuZXhwb3J0IHR5cGUgeyBSZXRyeUxvb3BDb250ZXh0LCBSZXRyeUxvb3BPcHRpb25zLCBSZXRyeUxvb3BTdGF0ZSB9IGZyb20gJy4vbGliL2J1aWxkZXIvcmV0cnlMb29wLmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ2FwdHVyZUNoYW5uZWxTdGF0dXMsXG4gIENhcHR1cmVMaW1pdGF0aW9uLFxuICBOYXRpdmVDYXB0dXJlTm90ZSxcbiAgUmVjb3JkZXJDYXB0dXJlQWNrbm93bGVkZ2VtZW50LFxufSBmcm9tICcuL2xpYi9jYXB0dXJlL25hdGl2ZUNvdmVyYWdlLmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgRW5naW5lUmVhZFNvdXJjZXMsXG4gIE5hdGl2ZUNhcHR1cmVPYnNlcnZhdGlvbixcbiAgTmF0aXZlUmVhZENhcHR1cmVOb3RlLFxuICBTb3VyY2VMaW1pdGF0aW9uLFxufSBmcm9tICcuL2xpYi9jYXB0dXJlL3JlYWRTb3VyY2VzLmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgU291cmNlRXhlY3V0aW9uT3duZXJzaGlwLFxuICBTb3VyY2VPd25lcnNoaXBHYXAsXG4gIFNvdXJjZU93bmVyc2hpcFdpdG5lc3MsXG59IGZyb20gJy4vbGliL2NhcHR1cmUvc291cmNlT3duZXJzaGlwRm9ybWF0LmpzJztcbmV4cG9ydCB7IHN0cmluZ2lmeVNuYXBzaG90IH0gZnJvbSAnLi9saWIvcnVubmVyL3N0cmluZ2lmeVNuYXBzaG90LmpzJztcbiJdfQ==
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* attempt/backoff.ts — deterministic builders of a `RetryPolicy.backoffMs` function.
|
|
4
|
+
*
|
|
5
|
+
* WHY: every retry loop needs the same few lines — an exponential ceiling and some jitter — and every hand copy of them
|
|
6
|
+
* drifts: a different base, a different jitter, a stated `Retry-After` honoured in one loop and not the next. These
|
|
7
|
+
* helpers build the FUNCTION `RetryPolicy.backoffMs` already takes, so the policy keeps its one shape and the runner
|
|
8
|
+
* keeps its one law: it asks the function once per retry, caps the answer at `maxBackoffMs`, stops a series whose wait
|
|
9
|
+
* would outlast the run's deadline (`no-time-left`), and records the wait it chose (`AttemptRecord.delayMs`,
|
|
10
|
+
* `onStageRetry`'s `delayMs`). The trace explains every wait as it was waited; nothing is redrawn to explain it.
|
|
11
|
+
*
|
|
12
|
+
* exponentialBackoff({ baseDelayMs, multiplier = 2, maxDelayMs?, jitter = 'none', random = Math.random })
|
|
13
|
+
* the wait after failed attempt n, under its ceiling c = min(maxDelayMs, baseDelayMs × multiplier^(n − 1)):
|
|
14
|
+
* 'none' → c deterministic: `random` is never called
|
|
15
|
+
* 'equal' → c/2 + r × c/2 half fixed, half random (r = random(), in [0, 1])
|
|
16
|
+
* 'full' → r × c
|
|
17
|
+
* statedWaitFirst(readStatedWaitMs, inner)
|
|
18
|
+
* a wait the outside system STATED (a `Retry-After`, read off the error) wins; otherwise `inner` decides.
|
|
19
|
+
*
|
|
20
|
+
* TWO CAPS, two jobs:
|
|
21
|
+
* - `BackoffSpec.maxDelayMs` caps the SCHEDULE: it bounds the ceiling BEFORE the draw, so a capped schedule keeps its
|
|
22
|
+
* jitter. Capping after the draw instead would flatten every jittered wait to one constant once the schedule
|
|
23
|
+
* passes twice the cap — a fleet would retry in lockstep, which is what jitter is for preventing.
|
|
24
|
+
* - `RetryPolicy.maxBackoffMs` caps EVERY wait, a stated one included, after the draw; the runner enforces it and the
|
|
25
|
+
* static time budget counts a function backoff at it without calling it.
|
|
26
|
+
* A stated wait is never capped by the inner schedule's `maxDelayMs` — only `maxBackoffMs` and the deadline bound it.
|
|
27
|
+
* Without `maxDelayMs` a ceiling saturates at `Number.MAX_SAFE_INTEGER` ms, so no attempt makes a wait `Infinity`.
|
|
28
|
+
*
|
|
29
|
+
* THE SERVER CHOOSES A STATED WAIT. `statedWaitFirst` hands the wait to the outside system — a broken or hostile one
|
|
30
|
+
* can ask for an hour. Whenever the wait comes from the server, declare the policy's `maxBackoffMs` (the runner caps
|
|
31
|
+
* every wait at it) or run under a deadline (the runner stops a series whose wait would outlast it).
|
|
32
|
+
*
|
|
33
|
+
* Refused when built — by the field's name and the shape it needs, NEVER the value it was given (a field can hold a
|
|
34
|
+
* secret): a `TypeError` for a wrong type (`'100'` included), a `RangeError` for a number out of range. The rules: a
|
|
35
|
+
* `baseDelayMs` that is a finite number >= 0, a `multiplier` >= 1, a `maxDelayMs` >= `baseDelayMs`, a `jitter` of the
|
|
36
|
+
* three names, a `random` or a reader that is a function, an `inner` that is a function or a finite number >= 0.
|
|
37
|
+
*
|
|
38
|
+
* A DRAW IS NOT TRUSTED BLINDLY: a `random()` that answers anything but a number in [0, 1] — or throws — makes that
|
|
39
|
+
* wait the ceiling `c`, the longest the schedule allows. Never 0: a broken source cannot make every jittered retry
|
|
40
|
+
* fire at once. The default source is `Math.random`, looked up at each draw (so a spy installed later takes effect).
|
|
41
|
+
*/
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.statedWaitFirst = exports.exponentialBackoff = void 0;
|
|
44
|
+
const JITTERS = ['none', 'equal', 'full'];
|
|
45
|
+
/** Where a ceiling saturates: a wait is never `Infinity` and never `NaN`. */
|
|
46
|
+
const MAX_WAIT_MS = Number.MAX_SAFE_INTEGER;
|
|
47
|
+
/** The default random source: `Math.random`, looked up at each draw — so a spy installed after building takes effect. */
|
|
48
|
+
const drawMathRandom = () => Math.random();
|
|
49
|
+
/**
|
|
50
|
+
* A `RetryPolicy.backoffMs` function for an exponential schedule: the wait after failed attempt `n` is drawn under the
|
|
51
|
+
* ceiling `min(maxDelayMs, baseDelayMs × multiplier^(n − 1))` by the declared jitter — the schedule is capped BEFORE
|
|
52
|
+
* the draw, so it keeps its spread. The policy's `maxBackoffMs` still caps every wait after it.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* .retry({ attempts: 6, backoffMs: exponentialBackoff({ baseDelayMs: 200, maxDelayMs: 2_000, jitter: 'equal' }), maxBackoffMs: 5_000 })
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
function exponentialBackoff(spec) {
|
|
60
|
+
const { baseDelayMs, multiplier, maxDelayMs, jitter, random } = readSpec(spec);
|
|
61
|
+
return (attempt) => {
|
|
62
|
+
const ceiling = ceilingOf(baseDelayMs, multiplier, maxDelayMs, stepOf(attempt));
|
|
63
|
+
if (jitter === 'none')
|
|
64
|
+
return ceiling;
|
|
65
|
+
const r = draw(random);
|
|
66
|
+
// An untrusted draw waits the ceiling — never 0, so a broken source cannot fire every jittered retry at once.
|
|
67
|
+
if (r === undefined)
|
|
68
|
+
return ceiling;
|
|
69
|
+
// Never above the ceiling, rounding included: halving a subnormal ceiling is inexact and can round up.
|
|
70
|
+
return jitter === 'equal' ? Math.min(ceiling, ceiling / 2 + (r * ceiling) / 2) : r * ceiling;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
exports.exponentialBackoff = exponentialBackoff;
|
|
74
|
+
/**
|
|
75
|
+
* A `RetryPolicy.backoffMs` function that honours a wait the outside system stated: when `readStatedWaitMs(error)`
|
|
76
|
+
* answers a finite number >= 0, that is the wait; otherwise `inner` (a backoff function, or a fixed number of
|
|
77
|
+
* milliseconds) decides. A reader that throws or answers anything else states nothing — a malformed `Retry-After`
|
|
78
|
+
* falls back to the schedule rather than to a wrong wait. The runner still caps the stated wait at `maxBackoffMs` and
|
|
79
|
+
* stops the series when it would outlast the run's deadline.
|
|
80
|
+
*
|
|
81
|
+
* The outside system chooses this wait, and a broken or hostile one can ask for an hour: whenever the wait comes from
|
|
82
|
+
* the server, declare the policy's `maxBackoffMs` (or run under a deadline).
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```ts
|
|
86
|
+
* const retryAfterMs = (error: unknown) => (error as { retryAfterMs?: number }).retryAfterMs;
|
|
87
|
+
* .retry({ attempts: 3, backoffMs: statedWaitFirst(retryAfterMs, exponentialBackoff({ baseDelayMs: 100 })), maxBackoffMs: 10_000 })
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
function statedWaitFirst(readStatedWaitMs, inner) {
|
|
91
|
+
if (typeof readStatedWaitMs !== 'function') {
|
|
92
|
+
throw new TypeError('statedWaitFirst: readStatedWaitMs must be a function');
|
|
93
|
+
}
|
|
94
|
+
if (typeof inner !== 'function') {
|
|
95
|
+
checkNumber('statedWaitFirst: inner', inner, 0, 'a backoff function or a finite number >= 0');
|
|
96
|
+
}
|
|
97
|
+
return (attempt, error) => {
|
|
98
|
+
const stated = statedWaitOf(readStatedWaitMs, error);
|
|
99
|
+
if (stated !== undefined)
|
|
100
|
+
return stated;
|
|
101
|
+
return typeof inner === 'function' ? inner(attempt, error) : inner;
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
exports.statedWaitFirst = statedWaitFirst;
|
|
105
|
+
/** Each field read ONCE, then checked: what is checked is exactly what the function keeps (a getter cannot differ). */
|
|
106
|
+
function readSpec(spec) {
|
|
107
|
+
if (spec === null || typeof spec !== 'object') {
|
|
108
|
+
throw new TypeError('exponentialBackoff: the spec must be an object ({ baseDelayMs, multiplier?, maxDelayMs?, jitter?, random? })');
|
|
109
|
+
}
|
|
110
|
+
const { baseDelayMs, multiplier = 2, maxDelayMs, jitter = 'none', random = drawMathRandom } = spec;
|
|
111
|
+
checkNumber('exponentialBackoff: baseDelayMs', baseDelayMs, 0, 'a finite number >= 0');
|
|
112
|
+
checkNumber('exponentialBackoff: multiplier', multiplier, 1, 'a finite number >= 1');
|
|
113
|
+
// At least the base: a cap below it would make every wait the cap — a fixed schedule written as an exponential one.
|
|
114
|
+
if (maxDelayMs !== undefined) {
|
|
115
|
+
checkNumber('exponentialBackoff: maxDelayMs', maxDelayMs, baseDelayMs, 'a finite number >= baseDelayMs');
|
|
116
|
+
}
|
|
117
|
+
const jitterRule = "exponentialBackoff: jitter must be 'none', 'equal' or 'full'";
|
|
118
|
+
if (typeof jitter !== 'string')
|
|
119
|
+
throw new TypeError(jitterRule);
|
|
120
|
+
if (!JITTERS.includes(jitter))
|
|
121
|
+
throw new RangeError(jitterRule);
|
|
122
|
+
if (typeof random !== 'function') {
|
|
123
|
+
throw new TypeError('exponentialBackoff: random must be a function answering a number in [0, 1]');
|
|
124
|
+
}
|
|
125
|
+
return { baseDelayMs, multiplier, maxDelayMs: maxDelayMs ?? MAX_WAIT_MS, jitter, random };
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* A finite number >= `min`, or the error that names `field` and the shape it needs — never the value it was given (a
|
|
129
|
+
* field can hold a secret): a `TypeError` for a non-number, a `RangeError` for a number out of range.
|
|
130
|
+
*/
|
|
131
|
+
function checkNumber(field, value, min, rule) {
|
|
132
|
+
if (typeof value !== 'number')
|
|
133
|
+
throw new TypeError(`${field} must be ${rule}`);
|
|
134
|
+
if (!Number.isFinite(value) || value < min)
|
|
135
|
+
throw new RangeError(`${field} must be ${rule}`);
|
|
136
|
+
}
|
|
137
|
+
/** The attempt as a schedule step: its whole part, at least 1 (anything that is not a finite number reads as 1). */
|
|
138
|
+
function stepOf(attempt) {
|
|
139
|
+
return typeof attempt === 'number' && Number.isFinite(attempt) && attempt >= 1 ? Math.floor(attempt) : 1;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* `min(maxDelayMs, baseDelayMs × multiplier^(step − 1))` — the schedule's cap, applied BEFORE any jitter is drawn
|
|
143
|
+
* (`maxDelayMs` is {@link MAX_WAIT_MS} when none was declared, so the ceiling saturates rather than overflows).
|
|
144
|
+
*/
|
|
145
|
+
function ceilingOf(baseDelayMs, multiplier, maxDelayMs, step) {
|
|
146
|
+
if (baseDelayMs === 0)
|
|
147
|
+
return 0;
|
|
148
|
+
const ceiling = baseDelayMs * multiplier ** (step - 1);
|
|
149
|
+
return ceiling < maxDelayMs ? ceiling : maxDelayMs;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* One draw from the random source: a number in [0, 1] (`-0` reads as `0`), or `undefined` when the source answers
|
|
153
|
+
* anything else or throws — an untrusted draw, which the caller turns into the ceiling.
|
|
154
|
+
*/
|
|
155
|
+
function draw(random) {
|
|
156
|
+
let r;
|
|
157
|
+
try {
|
|
158
|
+
r = random();
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
if (typeof r !== 'number' || !(r >= 0 && r <= 1))
|
|
164
|
+
return undefined;
|
|
165
|
+
return r === 0 ? 0 : r;
|
|
166
|
+
}
|
|
167
|
+
/** The wait `error` states, read once — none when the reader throws or answers anything but a finite number >= 0. */
|
|
168
|
+
function statedWaitOf(read, error) {
|
|
169
|
+
let value;
|
|
170
|
+
try {
|
|
171
|
+
value = read(error);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja29mZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXR0ZW1wdC9iYWNrb2ZmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNHOzs7QUFtQ0gsTUFBTSxPQUFPLEdBQTZCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUVwRSw2RUFBNkU7QUFDN0UsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0FBRTVDLHlIQUF5SDtBQUN6SCxNQUFNLGNBQWMsR0FBRyxHQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7QUFFbkQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsSUFBaUI7SUFDbEQsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0UsT0FBTyxDQUFDLE9BQWUsRUFBVSxFQUFFO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNoRixJQUFJLE1BQU0sS0FBSyxNQUFNO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDdEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLDhHQUE4RztRQUM5RyxJQUFJLENBQUMsS0FBSyxTQUFTO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDcEMsdUdBQXVHO1FBQ3ZHLE9BQU8sTUFBTSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUMvRixDQUFDLENBQUM7QUFDSixDQUFDO0FBWEQsZ0RBV0M7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxTQUFnQixlQUFlLENBQzdCLGdCQUFrQyxFQUNsQyxLQUE0QztJQUU1QyxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDM0MsTUFBTSxJQUFJLFNBQVMsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLDRDQUE0QyxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUNELE9BQU8sQ0FBQyxPQUFlLEVBQUUsS0FBZSxFQUFVLEVBQUU7UUFDbEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JELElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUN4QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JFLENBQUMsQ0FBQztBQUNKLENBQUM7QUFmRCwwQ0FlQztBQUVELHVIQUF1SDtBQUN2SCxTQUFTLFFBQVEsQ0FBQyxJQUFpQjtJQUNqQyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUMsTUFBTSxJQUFJLFNBQVMsQ0FDakIsOEdBQThHLENBQy9HLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUFFLE1BQU0sR0FBRyxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDbkcsV0FBVyxDQUFDLGlDQUFpQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUN2RixXQUFXLENBQUMsZ0NBQWdDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3JGLG9IQUFvSDtJQUNwSCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM3QixXQUFXLENBQUMsZ0NBQWdDLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQzNHLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyw4REFBOEQsQ0FBQztJQUNsRixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEUsSUFBSSxPQUFPLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksU0FBUyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUNELE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLElBQUksV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUM1RixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxXQUFXLENBQUMsS0FBYSxFQUFFLEtBQWMsRUFBRSxHQUFXLEVBQUUsSUFBWTtJQUMzRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLEdBQUcsS0FBSyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLEdBQUc7UUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsS0FBSyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7QUFDL0YsQ0FBQztBQUVELG9IQUFvSDtBQUNwSCxTQUFTLE1BQU0sQ0FBQyxPQUFnQjtJQUM5QixPQUFPLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxTQUFTLENBQUMsV0FBbUIsRUFBRSxVQUFrQixFQUFFLFVBQWtCLEVBQUUsSUFBWTtJQUMxRixJQUFJLFdBQVcsS0FBSyxDQUFDO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEMsTUFBTSxPQUFPLEdBQUcsV0FBVyxHQUFHLFVBQVUsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2RCxPQUFPLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQ3JELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLElBQUksQ0FBQyxNQUFvQjtJQUNoQyxJQUFJLENBQVUsQ0FBQztJQUNmLElBQUksQ0FBQztRQUNILENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ25FLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVELHFIQUFxSDtBQUNySCxTQUFTLFlBQVksQ0FBQyxJQUFzQixFQUFFLEtBQWM7SUFDMUQsSUFBSSxLQUFjLENBQUM7SUFDbkIsSUFBSSxDQUFDO1FBQ0gsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC9iYWNrb2ZmLnRzIOKAlCBkZXRlcm1pbmlzdGljIGJ1aWxkZXJzIG9mIGEgYFJldHJ5UG9saWN5LmJhY2tvZmZNc2AgZnVuY3Rpb24uXG4gKlxuICogV0hZOiBldmVyeSByZXRyeSBsb29wIG5lZWRzIHRoZSBzYW1lIGZldyBsaW5lcyDigJQgYW4gZXhwb25lbnRpYWwgY2VpbGluZyBhbmQgc29tZSBqaXR0ZXIg4oCUIGFuZCBldmVyeSBoYW5kIGNvcHkgb2YgdGhlbVxuICogZHJpZnRzOiBhIGRpZmZlcmVudCBiYXNlLCBhIGRpZmZlcmVudCBqaXR0ZXIsIGEgc3RhdGVkIGBSZXRyeS1BZnRlcmAgaG9ub3VyZWQgaW4gb25lIGxvb3AgYW5kIG5vdCB0aGUgbmV4dC4gVGhlc2VcbiAqIGhlbHBlcnMgYnVpbGQgdGhlIEZVTkNUSU9OIGBSZXRyeVBvbGljeS5iYWNrb2ZmTXNgIGFscmVhZHkgdGFrZXMsIHNvIHRoZSBwb2xpY3kga2VlcHMgaXRzIG9uZSBzaGFwZSBhbmQgdGhlIHJ1bm5lclxuICoga2VlcHMgaXRzIG9uZSBsYXc6IGl0IGFza3MgdGhlIGZ1bmN0aW9uIG9uY2UgcGVyIHJldHJ5LCBjYXBzIHRoZSBhbnN3ZXIgYXQgYG1heEJhY2tvZmZNc2AsIHN0b3BzIGEgc2VyaWVzIHdob3NlIHdhaXRcbiAqIHdvdWxkIG91dGxhc3QgdGhlIHJ1bidzIGRlYWRsaW5lIChgbm8tdGltZS1sZWZ0YCksIGFuZCByZWNvcmRzIHRoZSB3YWl0IGl0IGNob3NlIChgQXR0ZW1wdFJlY29yZC5kZWxheU1zYCxcbiAqIGBvblN0YWdlUmV0cnlgJ3MgYGRlbGF5TXNgKS4gVGhlIHRyYWNlIGV4cGxhaW5zIGV2ZXJ5IHdhaXQgYXMgaXQgd2FzIHdhaXRlZDsgbm90aGluZyBpcyByZWRyYXduIHRvIGV4cGxhaW4gaXQuXG4gKlxuICogICBleHBvbmVudGlhbEJhY2tvZmYoeyBiYXNlRGVsYXlNcywgbXVsdGlwbGllciA9IDIsIG1heERlbGF5TXM/LCBqaXR0ZXIgPSAnbm9uZScsIHJhbmRvbSA9IE1hdGgucmFuZG9tIH0pXG4gKiAgICAgdGhlIHdhaXQgYWZ0ZXIgZmFpbGVkIGF0dGVtcHQgbiwgdW5kZXIgaXRzIGNlaWxpbmcgYyA9IG1pbihtYXhEZWxheU1zLCBiYXNlRGVsYXlNcyDDlyBtdWx0aXBsaWVyXihuIOKIkiAxKSk6XG4gKiAgICAgICAnbm9uZScgIOKGkiBjICAgICAgICAgICAgICAgICAgIGRldGVybWluaXN0aWM6IGByYW5kb21gIGlzIG5ldmVyIGNhbGxlZFxuICogICAgICAgJ2VxdWFsJyDihpIgYy8yICsgciDDlyBjLzIgICAgICAgaGFsZiBmaXhlZCwgaGFsZiByYW5kb20gKHIgPSByYW5kb20oKSwgaW4gWzAsIDFdKVxuICogICAgICAgJ2Z1bGwnICDihpIgciDDlyBjXG4gKiAgIHN0YXRlZFdhaXRGaXJzdChyZWFkU3RhdGVkV2FpdE1zLCBpbm5lcilcbiAqICAgICBhIHdhaXQgdGhlIG91dHNpZGUgc3lzdGVtIFNUQVRFRCAoYSBgUmV0cnktQWZ0ZXJgLCByZWFkIG9mZiB0aGUgZXJyb3IpIHdpbnM7IG90aGVyd2lzZSBgaW5uZXJgIGRlY2lkZXMuXG4gKlxuICogVFdPIENBUFMsIHR3byBqb2JzOlxuICogICAtIGBCYWNrb2ZmU3BlYy5tYXhEZWxheU1zYCBjYXBzIHRoZSBTQ0hFRFVMRTogaXQgYm91bmRzIHRoZSBjZWlsaW5nIEJFRk9SRSB0aGUgZHJhdywgc28gYSBjYXBwZWQgc2NoZWR1bGUga2VlcHMgaXRzXG4gKiAgICAgaml0dGVyLiBDYXBwaW5nIGFmdGVyIHRoZSBkcmF3IGluc3RlYWQgd291bGQgZmxhdHRlbiBldmVyeSBqaXR0ZXJlZCB3YWl0IHRvIG9uZSBjb25zdGFudCBvbmNlIHRoZSBzY2hlZHVsZVxuICogICAgIHBhc3NlcyB0d2ljZSB0aGUgY2FwIOKAlCBhIGZsZWV0IHdvdWxkIHJldHJ5IGluIGxvY2tzdGVwLCB3aGljaCBpcyB3aGF0IGppdHRlciBpcyBmb3IgcHJldmVudGluZy5cbiAqICAgLSBgUmV0cnlQb2xpY3kubWF4QmFja29mZk1zYCBjYXBzIEVWRVJZIHdhaXQsIGEgc3RhdGVkIG9uZSBpbmNsdWRlZCwgYWZ0ZXIgdGhlIGRyYXc7IHRoZSBydW5uZXIgZW5mb3JjZXMgaXQgYW5kIHRoZVxuICogICAgIHN0YXRpYyB0aW1lIGJ1ZGdldCBjb3VudHMgYSBmdW5jdGlvbiBiYWNrb2ZmIGF0IGl0IHdpdGhvdXQgY2FsbGluZyBpdC5cbiAqIEEgc3RhdGVkIHdhaXQgaXMgbmV2ZXIgY2FwcGVkIGJ5IHRoZSBpbm5lciBzY2hlZHVsZSdzIGBtYXhEZWxheU1zYCDigJQgb25seSBgbWF4QmFja29mZk1zYCBhbmQgdGhlIGRlYWRsaW5lIGJvdW5kIGl0LlxuICogV2l0aG91dCBgbWF4RGVsYXlNc2AgYSBjZWlsaW5nIHNhdHVyYXRlcyBhdCBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgIG1zLCBzbyBubyBhdHRlbXB0IG1ha2VzIGEgd2FpdCBgSW5maW5pdHlgLlxuICpcbiAqIFRIRSBTRVJWRVIgQ0hPT1NFUyBBIFNUQVRFRCBXQUlULiBgc3RhdGVkV2FpdEZpcnN0YCBoYW5kcyB0aGUgd2FpdCB0byB0aGUgb3V0c2lkZSBzeXN0ZW0g4oCUIGEgYnJva2VuIG9yIGhvc3RpbGUgb25lXG4gKiBjYW4gYXNrIGZvciBhbiBob3VyLiBXaGVuZXZlciB0aGUgd2FpdCBjb21lcyBmcm9tIHRoZSBzZXJ2ZXIsIGRlY2xhcmUgdGhlIHBvbGljeSdzIGBtYXhCYWNrb2ZmTXNgICh0aGUgcnVubmVyIGNhcHNcbiAqIGV2ZXJ5IHdhaXQgYXQgaXQpIG9yIHJ1biB1bmRlciBhIGRlYWRsaW5lICh0aGUgcnVubmVyIHN0b3BzIGEgc2VyaWVzIHdob3NlIHdhaXQgd291bGQgb3V0bGFzdCBpdCkuXG4gKlxuICogUmVmdXNlZCB3aGVuIGJ1aWx0IOKAlCBieSB0aGUgZmllbGQncyBuYW1lIGFuZCB0aGUgc2hhcGUgaXQgbmVlZHMsIE5FVkVSIHRoZSB2YWx1ZSBpdCB3YXMgZ2l2ZW4gKGEgZmllbGQgY2FuIGhvbGQgYVxuICogc2VjcmV0KTogYSBgVHlwZUVycm9yYCBmb3IgYSB3cm9uZyB0eXBlIChgJzEwMCdgIGluY2x1ZGVkKSwgYSBgUmFuZ2VFcnJvcmAgZm9yIGEgbnVtYmVyIG91dCBvZiByYW5nZS4gVGhlIHJ1bGVzOiBhXG4gKiBgYmFzZURlbGF5TXNgIHRoYXQgaXMgYSBmaW5pdGUgbnVtYmVyID49IDAsIGEgYG11bHRpcGxpZXJgID49IDEsIGEgYG1heERlbGF5TXNgID49IGBiYXNlRGVsYXlNc2AsIGEgYGppdHRlcmAgb2YgdGhlXG4gKiB0aHJlZSBuYW1lcywgYSBgcmFuZG9tYCBvciBhIHJlYWRlciB0aGF0IGlzIGEgZnVuY3Rpb24sIGFuIGBpbm5lcmAgdGhhdCBpcyBhIGZ1bmN0aW9uIG9yIGEgZmluaXRlIG51bWJlciA+PSAwLlxuICpcbiAqIEEgRFJBVyBJUyBOT1QgVFJVU1RFRCBCTElORExZOiBhIGByYW5kb20oKWAgdGhhdCBhbnN3ZXJzIGFueXRoaW5nIGJ1dCBhIG51bWJlciBpbiBbMCwgMV0g4oCUIG9yIHRocm93cyDigJQgbWFrZXMgdGhhdFxuICogd2FpdCB0aGUgY2VpbGluZyBgY2AsIHRoZSBsb25nZXN0IHRoZSBzY2hlZHVsZSBhbGxvd3MuIE5ldmVyIDA6IGEgYnJva2VuIHNvdXJjZSBjYW5ub3QgbWFrZSBldmVyeSBqaXR0ZXJlZCByZXRyeVxuICogZmlyZSBhdCBvbmNlLiBUaGUgZGVmYXVsdCBzb3VyY2UgaXMgYE1hdGgucmFuZG9tYCwgbG9va2VkIHVwIGF0IGVhY2ggZHJhdyAoc28gYSBzcHkgaW5zdGFsbGVkIGxhdGVyIHRha2VzIGVmZmVjdCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSZXRyeVBvbGljeSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogSG93IG11Y2ggb2YgYW4gZXhwb25lbnRpYWwgd2FpdCBpcyByYW5kb206IG5vbmUgb2YgaXQsIGhhbGYgb2YgaXQsIG9yIGFsbCBvZiBpdC4gKi9cbmV4cG9ydCB0eXBlIEJhY2tvZmZKaXR0ZXIgPSAnbm9uZScgfCAnZXF1YWwnIHwgJ2Z1bGwnO1xuXG4vKiogVGhlIHNjaGVkdWxlIHtAbGluayBleHBvbmVudGlhbEJhY2tvZmZ9IGJ1aWxkcyBhIGBSZXRyeVBvbGljeS5iYWNrb2ZmTXNgIGZ1bmN0aW9uIGZyb20uICovXG5leHBvcnQgaW50ZXJmYWNlIEJhY2tvZmZTcGVjIHtcbiAgLyoqIFRoZSBjZWlsaW5nIG9mIHRoZSBmaXJzdCB3YWl0IChhZnRlciBhdHRlbXB0IDEpLCBpbiBtaWxsaXNlY29uZHMg4oCUIGEgZmluaXRlIG51bWJlciA+PSAwLiAqL1xuICByZWFkb25seSBiYXNlRGVsYXlNczogbnVtYmVyO1xuICAvKiogSG93IG11Y2ggZWFjaCBjZWlsaW5nIGdyb3dzIG92ZXIgdGhlIG9uZSBiZWZvcmUg4oCUIGEgZmluaXRlIG51bWJlciA+PSAxLiBEZWZhdWx0IGAyYC4gKi9cbiAgcmVhZG9ubHkgbXVsdGlwbGllcj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBtb3N0IGEgY2VpbGluZyBtYXkgZ3JvdyB0bywgaW4gbWlsbGlzZWNvbmRzIOKAlCBhIGZpbml0ZSBudW1iZXIgPj0gYGJhc2VEZWxheU1zYC4gSXQgY2FwcyB0aGUgU0NIRURVTEUgYmVmb3JlXG4gICAqIHRoZSBqaXR0ZXIgaXMgZHJhd24sIHNvIHdhaXRzIGF0IHRoZSBjYXAgc3RpbGwgc3ByZWFkIChgJ2VxdWFsJ2AgYmV0d2VlbiBgbWF4RGVsYXlNcyAvIDJgIGFuZCBgbWF4RGVsYXlNc2ApLiBJdFxuICAgKiBpcyBub3QgYFJldHJ5UG9saWN5Lm1heEJhY2tvZmZNc2AsIHdoaWNoIGNhcHMgZXZlcnkgd2FpdCBhZnRlciB0aGUgZHJhdywgYSBzdGF0ZWQgb25lIGluY2x1ZGVkLiBBYnNlbnQ6IHRoZVxuICAgKiBjZWlsaW5nIGdyb3dzIHVudGlsIGl0IHNhdHVyYXRlcyBhdCBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4RGVsYXlNcz86IG51bWJlcjtcbiAgLyoqIEhvdyBtdWNoIG9mIGVhY2ggd2FpdCBpcyByYW5kb20uIERlZmF1bHQgYCdub25lJ2A6IHRoZSB3YWl0IElTIHRoZSBjZWlsaW5nLiAqL1xuICByZWFkb25seSBqaXR0ZXI/OiBCYWNrb2ZmSml0dGVyO1xuICAvKipcbiAgICogVGhlIGppdHRlcidzIHJhbmRvbSBzb3VyY2UsIGFuc3dlcmluZyBpbiBbMCwgMV0uIERlZmF1bHQgYE1hdGgucmFuZG9tYCwgbG9va2VkIHVwIGF0IGVhY2ggZHJhdzsgYSBmaXhlZCBvbmUgbWFrZXMgYVxuICAgKiB0ZXN0IGV4YWN0LiBBIGRyYXcgb3V0c2lkZSBbMCwgMV0gKG9yIGEgdGhyb3cpIG1ha2VzIHRoYXQgd2FpdCB0aGUgY2VpbGluZyDigJQgbmV2ZXIgMC5cbiAgICovXG4gIHJlYWRvbmx5IHJhbmRvbT86ICgpID0+IG51bWJlcjtcbn1cblxuLyoqIEEgYFJldHJ5UG9saWN5LmJhY2tvZmZNc2AgZnVuY3Rpb246IHRoZSB3YWl0IGluIG1pbGxpc2Vjb25kcyBhZnRlciBmYWlsZWQgYXR0ZW1wdCBgYXR0ZW1wdGAgKDEtYmFzZWQpLiAqL1xuZXhwb3J0IHR5cGUgQmFja29mZkZ1bmN0aW9uID0gKGF0dGVtcHQ6IG51bWJlciwgZXJyb3I/OiB1bmtub3duKSA9PiBudW1iZXI7XG5cbi8qKiBSZWFkcyB0aGUgd2FpdCBhbiBlcnJvciBzdGF0ZXMgKGEgcGFyc2VkIGBSZXRyeS1BZnRlcmApLCBpbiBtaWxsaXNlY29uZHMsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgc3RhdGVzIG5vbmUuICovXG5leHBvcnQgdHlwZSBTdGF0ZWRXYWl0UmVhZGVyID0gKGVycm9yOiB1bmtub3duKSA9PiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbmNvbnN0IEpJVFRFUlM6IHJlYWRvbmx5IEJhY2tvZmZKaXR0ZXJbXSA9IFsnbm9uZScsICdlcXVhbCcsICdmdWxsJ107XG5cbi8qKiBXaGVyZSBhIGNlaWxpbmcgc2F0dXJhdGVzOiBhIHdhaXQgaXMgbmV2ZXIgYEluZmluaXR5YCBhbmQgbmV2ZXIgYE5hTmAuICovXG5jb25zdCBNQVhfV0FJVF9NUyA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuXG4vKiogVGhlIGRlZmF1bHQgcmFuZG9tIHNvdXJjZTogYE1hdGgucmFuZG9tYCwgbG9va2VkIHVwIGF0IGVhY2ggZHJhdyDigJQgc28gYSBzcHkgaW5zdGFsbGVkIGFmdGVyIGJ1aWxkaW5nIHRha2VzIGVmZmVjdC4gKi9cbmNvbnN0IGRyYXdNYXRoUmFuZG9tID0gKCk6IG51bWJlciA9PiBNYXRoLnJhbmRvbSgpO1xuXG4vKipcbiAqIEEgYFJldHJ5UG9saWN5LmJhY2tvZmZNc2AgZnVuY3Rpb24gZm9yIGFuIGV4cG9uZW50aWFsIHNjaGVkdWxlOiB0aGUgd2FpdCBhZnRlciBmYWlsZWQgYXR0ZW1wdCBgbmAgaXMgZHJhd24gdW5kZXIgdGhlXG4gKiBjZWlsaW5nIGBtaW4obWF4RGVsYXlNcywgYmFzZURlbGF5TXMgw5cgbXVsdGlwbGllcl4obiDiiJIgMSkpYCBieSB0aGUgZGVjbGFyZWQgaml0dGVyIOKAlCB0aGUgc2NoZWR1bGUgaXMgY2FwcGVkIEJFRk9SRVxuICogdGhlIGRyYXcsIHNvIGl0IGtlZXBzIGl0cyBzcHJlYWQuIFRoZSBwb2xpY3kncyBgbWF4QmFja29mZk1zYCBzdGlsbCBjYXBzIGV2ZXJ5IHdhaXQgYWZ0ZXIgaXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAucmV0cnkoeyBhdHRlbXB0czogNiwgYmFja29mZk1zOiBleHBvbmVudGlhbEJhY2tvZmYoeyBiYXNlRGVsYXlNczogMjAwLCBtYXhEZWxheU1zOiAyXzAwMCwgaml0dGVyOiAnZXF1YWwnIH0pLCBtYXhCYWNrb2ZmTXM6IDVfMDAwIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9uZW50aWFsQmFja29mZihzcGVjOiBCYWNrb2ZmU3BlYyk6IEJhY2tvZmZGdW5jdGlvbiB7XG4gIGNvbnN0IHsgYmFzZURlbGF5TXMsIG11bHRpcGxpZXIsIG1heERlbGF5TXMsIGppdHRlciwgcmFuZG9tIH0gPSByZWFkU3BlYyhzcGVjKTtcbiAgcmV0dXJuIChhdHRlbXB0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgIGNvbnN0IGNlaWxpbmcgPSBjZWlsaW5nT2YoYmFzZURlbGF5TXMsIG11bHRpcGxpZXIsIG1heERlbGF5TXMsIHN0ZXBPZihhdHRlbXB0KSk7XG4gICAgaWYgKGppdHRlciA9PT0gJ25vbmUnKSByZXR1cm4gY2VpbGluZztcbiAgICBjb25zdCByID0gZHJhdyhyYW5kb20pO1xuICAgIC8vIEFuIHVudHJ1c3RlZCBkcmF3IHdhaXRzIHRoZSBjZWlsaW5nIOKAlCBuZXZlciAwLCBzbyBhIGJyb2tlbiBzb3VyY2UgY2Fubm90IGZpcmUgZXZlcnkgaml0dGVyZWQgcmV0cnkgYXQgb25jZS5cbiAgICBpZiAociA9PT0gdW5kZWZpbmVkKSByZXR1cm4gY2VpbGluZztcbiAgICAvLyBOZXZlciBhYm92ZSB0aGUgY2VpbGluZywgcm91bmRpbmcgaW5jbHVkZWQ6IGhhbHZpbmcgYSBzdWJub3JtYWwgY2VpbGluZyBpcyBpbmV4YWN0IGFuZCBjYW4gcm91bmQgdXAuXG4gICAgcmV0dXJuIGppdHRlciA9PT0gJ2VxdWFsJyA/IE1hdGgubWluKGNlaWxpbmcsIGNlaWxpbmcgLyAyICsgKHIgKiBjZWlsaW5nKSAvIDIpIDogciAqIGNlaWxpbmc7XG4gIH07XG59XG5cbi8qKlxuICogQSBgUmV0cnlQb2xpY3kuYmFja29mZk1zYCBmdW5jdGlvbiB0aGF0IGhvbm91cnMgYSB3YWl0IHRoZSBvdXRzaWRlIHN5c3RlbSBzdGF0ZWQ6IHdoZW4gYHJlYWRTdGF0ZWRXYWl0TXMoZXJyb3IpYFxuICogYW5zd2VycyBhIGZpbml0ZSBudW1iZXIgPj0gMCwgdGhhdCBpcyB0aGUgd2FpdDsgb3RoZXJ3aXNlIGBpbm5lcmAgKGEgYmFja29mZiBmdW5jdGlvbiwgb3IgYSBmaXhlZCBudW1iZXIgb2ZcbiAqIG1pbGxpc2Vjb25kcykgZGVjaWRlcy4gQSByZWFkZXIgdGhhdCB0aHJvd3Mgb3IgYW5zd2VycyBhbnl0aGluZyBlbHNlIHN0YXRlcyBub3RoaW5nIOKAlCBhIG1hbGZvcm1lZCBgUmV0cnktQWZ0ZXJgXG4gKiBmYWxscyBiYWNrIHRvIHRoZSBzY2hlZHVsZSByYXRoZXIgdGhhbiB0byBhIHdyb25nIHdhaXQuIFRoZSBydW5uZXIgc3RpbGwgY2FwcyB0aGUgc3RhdGVkIHdhaXQgYXQgYG1heEJhY2tvZmZNc2AgYW5kXG4gKiBzdG9wcyB0aGUgc2VyaWVzIHdoZW4gaXQgd291bGQgb3V0bGFzdCB0aGUgcnVuJ3MgZGVhZGxpbmUuXG4gKlxuICogVGhlIG91dHNpZGUgc3lzdGVtIGNob29zZXMgdGhpcyB3YWl0LCBhbmQgYSBicm9rZW4gb3IgaG9zdGlsZSBvbmUgY2FuIGFzayBmb3IgYW4gaG91cjogd2hlbmV2ZXIgdGhlIHdhaXQgY29tZXMgZnJvbVxuICogdGhlIHNlcnZlciwgZGVjbGFyZSB0aGUgcG9saWN5J3MgYG1heEJhY2tvZmZNc2AgKG9yIHJ1biB1bmRlciBhIGRlYWRsaW5lKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHJldHJ5QWZ0ZXJNcyA9IChlcnJvcjogdW5rbm93bikgPT4gKGVycm9yIGFzIHsgcmV0cnlBZnRlck1zPzogbnVtYmVyIH0pLnJldHJ5QWZ0ZXJNcztcbiAqIC5yZXRyeSh7IGF0dGVtcHRzOiAzLCBiYWNrb2ZmTXM6IHN0YXRlZFdhaXRGaXJzdChyZXRyeUFmdGVyTXMsIGV4cG9uZW50aWFsQmFja29mZih7IGJhc2VEZWxheU1zOiAxMDAgfSkpLCBtYXhCYWNrb2ZmTXM6IDEwXzAwMCB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGF0ZWRXYWl0Rmlyc3QoXG4gIHJlYWRTdGF0ZWRXYWl0TXM6IFN0YXRlZFdhaXRSZWFkZXIsXG4gIGlubmVyOiBOb25OdWxsYWJsZTxSZXRyeVBvbGljeVsnYmFja29mZk1zJ10+LFxuKTogQmFja29mZkZ1bmN0aW9uIHtcbiAgaWYgKHR5cGVvZiByZWFkU3RhdGVkV2FpdE1zICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RhdGVkV2FpdEZpcnN0OiByZWFkU3RhdGVkV2FpdE1zIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIGlmICh0eXBlb2YgaW5uZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICBjaGVja051bWJlcignc3RhdGVkV2FpdEZpcnN0OiBpbm5lcicsIGlubmVyLCAwLCAnYSBiYWNrb2ZmIGZ1bmN0aW9uIG9yIGEgZmluaXRlIG51bWJlciA+PSAwJyk7XG4gIH1cbiAgcmV0dXJuIChhdHRlbXB0OiBudW1iZXIsIGVycm9yPzogdW5rbm93bik6IG51bWJlciA9PiB7XG4gICAgY29uc3Qgc3RhdGVkID0gc3RhdGVkV2FpdE9mKHJlYWRTdGF0ZWRXYWl0TXMsIGVycm9yKTtcbiAgICBpZiAoc3RhdGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBzdGF0ZWQ7XG4gICAgcmV0dXJuIHR5cGVvZiBpbm5lciA9PT0gJ2Z1bmN0aW9uJyA/IGlubmVyKGF0dGVtcHQsIGVycm9yKSA6IGlubmVyO1xuICB9O1xufVxuXG4vKiogRWFjaCBmaWVsZCByZWFkIE9OQ0UsIHRoZW4gY2hlY2tlZDogd2hhdCBpcyBjaGVja2VkIGlzIGV4YWN0bHkgd2hhdCB0aGUgZnVuY3Rpb24ga2VlcHMgKGEgZ2V0dGVyIGNhbm5vdCBkaWZmZXIpLiAqL1xuZnVuY3Rpb24gcmVhZFNwZWMoc3BlYzogQmFja29mZlNwZWMpOiBSZXF1aXJlZDxCYWNrb2ZmU3BlYz4ge1xuICBpZiAoc3BlYyA9PT0gbnVsbCB8fCB0eXBlb2Ygc3BlYyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ2V4cG9uZW50aWFsQmFja29mZjogdGhlIHNwZWMgbXVzdCBiZSBhbiBvYmplY3QgKHsgYmFzZURlbGF5TXMsIG11bHRpcGxpZXI/LCBtYXhEZWxheU1zPywgaml0dGVyPywgcmFuZG9tPyB9KScsXG4gICAgKTtcbiAgfVxuICBjb25zdCB7IGJhc2VEZWxheU1zLCBtdWx0aXBsaWVyID0gMiwgbWF4RGVsYXlNcywgaml0dGVyID0gJ25vbmUnLCByYW5kb20gPSBkcmF3TWF0aFJhbmRvbSB9ID0gc3BlYztcbiAgY2hlY2tOdW1iZXIoJ2V4cG9uZW50aWFsQmFja29mZjogYmFzZURlbGF5TXMnLCBiYXNlRGVsYXlNcywgMCwgJ2EgZmluaXRlIG51bWJlciA+PSAwJyk7XG4gIGNoZWNrTnVtYmVyKCdleHBvbmVudGlhbEJhY2tvZmY6IG11bHRpcGxpZXInLCBtdWx0aXBsaWVyLCAxLCAnYSBmaW5pdGUgbnVtYmVyID49IDEnKTtcbiAgLy8gQXQgbGVhc3QgdGhlIGJhc2U6IGEgY2FwIGJlbG93IGl0IHdvdWxkIG1ha2UgZXZlcnkgd2FpdCB0aGUgY2FwIOKAlCBhIGZpeGVkIHNjaGVkdWxlIHdyaXR0ZW4gYXMgYW4gZXhwb25lbnRpYWwgb25lLlxuICBpZiAobWF4RGVsYXlNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY2hlY2tOdW1iZXIoJ2V4cG9uZW50aWFsQmFja29mZjogbWF4RGVsYXlNcycsIG1heERlbGF5TXMsIGJhc2VEZWxheU1zLCAnYSBmaW5pdGUgbnVtYmVyID49IGJhc2VEZWxheU1zJyk7XG4gIH1cbiAgY29uc3Qgaml0dGVyUnVsZSA9IFwiZXhwb25lbnRpYWxCYWNrb2ZmOiBqaXR0ZXIgbXVzdCBiZSAnbm9uZScsICdlcXVhbCcgb3IgJ2Z1bGwnXCI7XG4gIGlmICh0eXBlb2Ygaml0dGVyICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcihqaXR0ZXJSdWxlKTtcbiAgaWYgKCFKSVRURVJTLmluY2x1ZGVzKGppdHRlcikpIHRocm93IG5ldyBSYW5nZUVycm9yKGppdHRlclJ1bGUpO1xuICBpZiAodHlwZW9mIHJhbmRvbSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4cG9uZW50aWFsQmFja29mZjogcmFuZG9tIG11c3QgYmUgYSBmdW5jdGlvbiBhbnN3ZXJpbmcgYSBudW1iZXIgaW4gWzAsIDFdJyk7XG4gIH1cbiAgcmV0dXJuIHsgYmFzZURlbGF5TXMsIG11bHRpcGxpZXIsIG1heERlbGF5TXM6IG1heERlbGF5TXMgPz8gTUFYX1dBSVRfTVMsIGppdHRlciwgcmFuZG9tIH07XG59XG5cbi8qKlxuICogQSBmaW5pdGUgbnVtYmVyID49IGBtaW5gLCBvciB0aGUgZXJyb3IgdGhhdCBuYW1lcyBgZmllbGRgIGFuZCB0aGUgc2hhcGUgaXQgbmVlZHMg4oCUIG5ldmVyIHRoZSB2YWx1ZSBpdCB3YXMgZ2l2ZW4gKGFcbiAqIGZpZWxkIGNhbiBob2xkIGEgc2VjcmV0KTogYSBgVHlwZUVycm9yYCBmb3IgYSBub24tbnVtYmVyLCBhIGBSYW5nZUVycm9yYCBmb3IgYSBudW1iZXIgb3V0IG9mIHJhbmdlLlxuICovXG5mdW5jdGlvbiBjaGVja051bWJlcihmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgbWluOiBudW1iZXIsIHJ1bGU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSAke3J1bGV9YCk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCR7ZmllbGR9IG11c3QgYmUgJHtydWxlfWApO1xufVxuXG4vKiogVGhlIGF0dGVtcHQgYXMgYSBzY2hlZHVsZSBzdGVwOiBpdHMgd2hvbGUgcGFydCwgYXQgbGVhc3QgMSAoYW55dGhpbmcgdGhhdCBpcyBub3QgYSBmaW5pdGUgbnVtYmVyIHJlYWRzIGFzIDEpLiAqL1xuZnVuY3Rpb24gc3RlcE9mKGF0dGVtcHQ6IHVua25vd24pOiBudW1iZXIge1xuICByZXR1cm4gdHlwZW9mIGF0dGVtcHQgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShhdHRlbXB0KSAmJiBhdHRlbXB0ID49IDEgPyBNYXRoLmZsb29yKGF0dGVtcHQpIDogMTtcbn1cblxuLyoqXG4gKiBgbWluKG1heERlbGF5TXMsIGJhc2VEZWxheU1zIMOXIG11bHRpcGxpZXJeKHN0ZXAg4oiSIDEpKWAg4oCUIHRoZSBzY2hlZHVsZSdzIGNhcCwgYXBwbGllZCBCRUZPUkUgYW55IGppdHRlciBpcyBkcmF3blxuICogKGBtYXhEZWxheU1zYCBpcyB7QGxpbmsgTUFYX1dBSVRfTVN9IHdoZW4gbm9uZSB3YXMgZGVjbGFyZWQsIHNvIHRoZSBjZWlsaW5nIHNhdHVyYXRlcyByYXRoZXIgdGhhbiBvdmVyZmxvd3MpLlxuICovXG5mdW5jdGlvbiBjZWlsaW5nT2YoYmFzZURlbGF5TXM6IG51bWJlciwgbXVsdGlwbGllcjogbnVtYmVyLCBtYXhEZWxheU1zOiBudW1iZXIsIHN0ZXA6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChiYXNlRGVsYXlNcyA9PT0gMCkgcmV0dXJuIDA7XG4gIGNvbnN0IGNlaWxpbmcgPSBiYXNlRGVsYXlNcyAqIG11bHRpcGxpZXIgKiogKHN0ZXAgLSAxKTtcbiAgcmV0dXJuIGNlaWxpbmcgPCBtYXhEZWxheU1zID8gY2VpbGluZyA6IG1heERlbGF5TXM7XG59XG5cbi8qKlxuICogT25lIGRyYXcgZnJvbSB0aGUgcmFuZG9tIHNvdXJjZTogYSBudW1iZXIgaW4gWzAsIDFdIChgLTBgIHJlYWRzIGFzIGAwYCksIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHNvdXJjZSBhbnN3ZXJzXG4gKiBhbnl0aGluZyBlbHNlIG9yIHRocm93cyDigJQgYW4gdW50cnVzdGVkIGRyYXcsIHdoaWNoIHRoZSBjYWxsZXIgdHVybnMgaW50byB0aGUgY2VpbGluZy5cbiAqL1xuZnVuY3Rpb24gZHJhdyhyYW5kb206ICgpID0+IG51bWJlcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGxldCByOiB1bmtub3duO1xuICB0cnkge1xuICAgIHIgPSByYW5kb20oKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodHlwZW9mIHIgIT09ICdudW1iZXInIHx8ICEociA+PSAwICYmIHIgPD0gMSkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiByID09PSAwID8gMCA6IHI7XG59XG5cbi8qKiBUaGUgd2FpdCBgZXJyb3JgIHN0YXRlcywgcmVhZCBvbmNlIOKAlCBub25lIHdoZW4gdGhlIHJlYWRlciB0aHJvd3Mgb3IgYW5zd2VycyBhbnl0aGluZyBidXQgYSBmaW5pdGUgbnVtYmVyID49IDAuICovXG5mdW5jdGlvbiBzdGF0ZWRXYWl0T2YocmVhZDogU3RhdGVkV2FpdFJlYWRlciwgZXJyb3I6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBsZXQgdmFsdWU6IHVua25vd247XG4gIHRyeSB7XG4gICAgdmFsdWUgPSByZWFkKGVycm9yKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID49IDAgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|