@gnggln/ng-ui-system 1.0.0-alpha.15 → 1.0.0-alpha.16
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/base-layout/lib/components/blackbox/blackbox.service.d.ts +1 -13
- package/blackbox/lib/components/blackbox/blackbox.service.d.ts +1 -13
- package/button/lib/components/blackbox/blackbox.service.d.ts +1 -13
- package/crud-table/lib/components/blackbox/blackbox.service.d.ts +1 -13
- package/crud-table/lib/components/form-builder/types/schema.types.d.ts +2 -0
- package/esm2022/base-layout/lib/components/blackbox/blackbox.service.mjs +8 -57
- package/esm2022/blackbox/lib/components/blackbox/blackbox.service.mjs +8 -57
- package/esm2022/button/lib/components/blackbox/blackbox.service.mjs +8 -57
- package/esm2022/crud-table/lib/components/blackbox/blackbox.service.mjs +8 -57
- package/esm2022/crud-table/lib/components/form-builder/types/schema.types.mjs +1 -1
- package/esm2022/form-builder/lib/components/blackbox/blackbox.service.mjs +8 -57
- package/esm2022/form-builder/lib/components/form-builder/form-wizard.component.mjs +397 -234
- package/esm2022/form-builder/lib/components/form-builder/types/schema.types.mjs +1 -1
- package/esm2022/form-builder-editor/lib/components/blackbox/blackbox.service.mjs +8 -57
- package/esm2022/form-builder-editor/lib/components/form-builder/types/schema.types.mjs +1 -1
- package/esm2022/http/lib/components/blackbox/blackbox.service.mjs +8 -57
- package/esm2022/lib/components/blackbox/blackbox.service.mjs +8 -57
- package/esm2022/lib/components/form-builder/form-wizard.component.mjs +397 -234
- package/esm2022/lib/components/form-builder/types/schema.types.mjs +1 -1
- package/esm2022/lib/version/ng-ui-system-version.mjs +2 -2
- package/fesm2022/gnggln-ng-ui-system-base-layout.mjs +7 -56
- package/fesm2022/gnggln-ng-ui-system-base-layout.mjs.map +1 -1
- package/fesm2022/gnggln-ng-ui-system-blackbox.mjs +7 -56
- package/fesm2022/gnggln-ng-ui-system-blackbox.mjs.map +1 -1
- package/fesm2022/gnggln-ng-ui-system-button.mjs +7 -56
- package/fesm2022/gnggln-ng-ui-system-button.mjs.map +1 -1
- package/fesm2022/gnggln-ng-ui-system-crud-table.mjs +7 -56
- package/fesm2022/gnggln-ng-ui-system-crud-table.mjs.map +1 -1
- package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs +7 -56
- package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs.map +1 -1
- package/fesm2022/gnggln-ng-ui-system-form-builder.mjs +403 -289
- package/fesm2022/gnggln-ng-ui-system-form-builder.mjs.map +1 -1
- package/fesm2022/gnggln-ng-ui-system-http.mjs +7 -56
- package/fesm2022/gnggln-ng-ui-system-http.mjs.map +1 -1
- package/fesm2022/gnggln-ng-ui-system.mjs +404 -290
- package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -1
- package/form-builder/lib/components/blackbox/blackbox.service.d.ts +1 -13
- package/form-builder/lib/components/form-builder/form-wizard.component.d.ts +33 -0
- package/form-builder/lib/components/form-builder/types/schema.types.d.ts +2 -0
- package/form-builder-editor/lib/components/blackbox/blackbox.service.d.ts +1 -13
- package/form-builder-editor/lib/components/form-builder/types/schema.types.d.ts +2 -0
- package/http/lib/components/blackbox/blackbox.service.d.ts +1 -13
- package/lib/components/blackbox/blackbox.service.d.ts +1 -13
- package/lib/components/form-builder/form-wizard.component.d.ts +33 -0
- package/lib/components/form-builder/types/schema.types.d.ts +2 -0
- package/lib/version/ng-ui-system-version.d.ts +1 -1
- package/package.json +29 -29
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - Root singleton (`providedIn: 'root'`)
|
|
8
8
|
* - On first inject: generates fingerprint, creates session, subscribes to Router events
|
|
9
9
|
* - Centralised in-memory buffer with periodic/threshold-based flush to IndexedDB
|
|
10
|
-
* - `window:beforeunload` triggers a final
|
|
10
|
+
* - `window:beforeunload` triggers a final best-effort async flush
|
|
11
11
|
*/
|
|
12
12
|
import { OnDestroy } from '@angular/core';
|
|
13
13
|
import { UiBlackboxConfig, UiBlackboxFormTrackingConfig, UiBlackboxSession, UiBlackboxFormEvent, UiBlackboxHttpCall } from './blackbox.types';
|
|
@@ -136,18 +136,6 @@ export declare class UiBlackboxService implements OnDestroy {
|
|
|
136
136
|
* @internal
|
|
137
137
|
*/
|
|
138
138
|
private flush;
|
|
139
|
-
/**
|
|
140
|
-
* Synchronous flush for `beforeunload`.
|
|
141
|
-
* Falls back to a best-effort approach since IndexedDB is async.
|
|
142
|
-
* @internal
|
|
143
|
-
*/
|
|
144
|
-
private flushSync;
|
|
145
|
-
/**
|
|
146
|
-
* Recover sessions that were saved to localStorage during `beforeunload`
|
|
147
|
-
* and persist them to IndexedDB. Called on next service init.
|
|
148
|
-
* @internal
|
|
149
|
-
*/
|
|
150
|
-
private recoverPendingSessions;
|
|
151
139
|
/** Generate a UUID v4. */
|
|
152
140
|
private generateUuid;
|
|
153
141
|
ngOnDestroy(): void;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - Root singleton (`providedIn: 'root'`)
|
|
8
8
|
* - On first inject: generates fingerprint, creates session, subscribes to Router events
|
|
9
9
|
* - Centralised in-memory buffer with periodic/threshold-based flush to IndexedDB
|
|
10
|
-
* - `window:beforeunload` triggers a final
|
|
10
|
+
* - `window:beforeunload` triggers a final best-effort async flush
|
|
11
11
|
*/
|
|
12
12
|
import { OnDestroy } from '@angular/core';
|
|
13
13
|
import { UiBlackboxConfig, UiBlackboxFormTrackingConfig, UiBlackboxSession, UiBlackboxFormEvent, UiBlackboxHttpCall } from './blackbox.types';
|
|
@@ -136,18 +136,6 @@ export declare class UiBlackboxService implements OnDestroy {
|
|
|
136
136
|
* @internal
|
|
137
137
|
*/
|
|
138
138
|
private flush;
|
|
139
|
-
/**
|
|
140
|
-
* Synchronous flush for `beforeunload`.
|
|
141
|
-
* Falls back to a best-effort approach since IndexedDB is async.
|
|
142
|
-
* @internal
|
|
143
|
-
*/
|
|
144
|
-
private flushSync;
|
|
145
|
-
/**
|
|
146
|
-
* Recover sessions that were saved to localStorage during `beforeunload`
|
|
147
|
-
* and persist them to IndexedDB. Called on next service init.
|
|
148
|
-
* @internal
|
|
149
|
-
*/
|
|
150
|
-
private recoverPendingSessions;
|
|
151
139
|
/** Generate a UUID v4. */
|
|
152
140
|
private generateUuid;
|
|
153
141
|
ngOnDestroy(): void;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - Root singleton (`providedIn: 'root'`)
|
|
8
8
|
* - On first inject: generates fingerprint, creates session, subscribes to Router events
|
|
9
9
|
* - Centralised in-memory buffer with periodic/threshold-based flush to IndexedDB
|
|
10
|
-
* - `window:beforeunload` triggers a final
|
|
10
|
+
* - `window:beforeunload` triggers a final best-effort async flush
|
|
11
11
|
*/
|
|
12
12
|
import { OnDestroy } from '@angular/core';
|
|
13
13
|
import { UiBlackboxConfig, UiBlackboxFormTrackingConfig, UiBlackboxSession, UiBlackboxFormEvent, UiBlackboxHttpCall } from './blackbox.types';
|
|
@@ -136,18 +136,6 @@ export declare class UiBlackboxService implements OnDestroy {
|
|
|
136
136
|
* @internal
|
|
137
137
|
*/
|
|
138
138
|
private flush;
|
|
139
|
-
/**
|
|
140
|
-
* Synchronous flush for `beforeunload`.
|
|
141
|
-
* Falls back to a best-effort approach since IndexedDB is async.
|
|
142
|
-
* @internal
|
|
143
|
-
*/
|
|
144
|
-
private flushSync;
|
|
145
|
-
/**
|
|
146
|
-
* Recover sessions that were saved to localStorage during `beforeunload`
|
|
147
|
-
* and persist them to IndexedDB. Called on next service init.
|
|
148
|
-
* @internal
|
|
149
|
-
*/
|
|
150
|
-
private recoverPendingSessions;
|
|
151
139
|
/** Generate a UUID v4. */
|
|
152
140
|
private generateUuid;
|
|
153
141
|
ngOnDestroy(): void;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - Root singleton (`providedIn: 'root'`)
|
|
8
8
|
* - On first inject: generates fingerprint, creates session, subscribes to Router events
|
|
9
9
|
* - Centralised in-memory buffer with periodic/threshold-based flush to IndexedDB
|
|
10
|
-
* - `window:beforeunload` triggers a final
|
|
10
|
+
* - `window:beforeunload` triggers a final best-effort async flush
|
|
11
11
|
*/
|
|
12
12
|
import { OnDestroy } from '@angular/core';
|
|
13
13
|
import { UiBlackboxConfig, UiBlackboxFormTrackingConfig, UiBlackboxSession, UiBlackboxFormEvent, UiBlackboxHttpCall } from './blackbox.types';
|
|
@@ -136,18 +136,6 @@ export declare class UiBlackboxService implements OnDestroy {
|
|
|
136
136
|
* @internal
|
|
137
137
|
*/
|
|
138
138
|
private flush;
|
|
139
|
-
/**
|
|
140
|
-
* Synchronous flush for `beforeunload`.
|
|
141
|
-
* Falls back to a best-effort approach since IndexedDB is async.
|
|
142
|
-
* @internal
|
|
143
|
-
*/
|
|
144
|
-
private flushSync;
|
|
145
|
-
/**
|
|
146
|
-
* Recover sessions that were saved to localStorage during `beforeunload`
|
|
147
|
-
* and persist them to IndexedDB. Called on next service init.
|
|
148
|
-
* @internal
|
|
149
|
-
*/
|
|
150
|
-
private recoverPendingSessions;
|
|
151
139
|
/** Generate a UUID v4. */
|
|
152
140
|
private generateUuid;
|
|
153
141
|
ngOnDestroy(): void;
|
|
@@ -191,6 +191,8 @@ export interface UiWizardConfig {
|
|
|
191
191
|
onStepSave?: (stepData: Record<string, any>, stepNumber: number) => Promise<void> | void;
|
|
192
192
|
/** Mostra pulsanti di navigazione (precedente/successivo). @default true */
|
|
193
193
|
showNavigationButtons?: boolean;
|
|
194
|
+
/** Posizione dei pulsanti di navigazione. @default 'bottom' */
|
|
195
|
+
navigationPosition?: 'top' | 'bottom' | 'both';
|
|
194
196
|
/** Label personalizzate per i pulsanti del wizard. */
|
|
195
197
|
buttonLabels?: {
|
|
196
198
|
previous?: string;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - Root singleton (`providedIn: 'root'`)
|
|
8
8
|
* - On first inject: generates fingerprint, creates session, subscribes to Router events
|
|
9
9
|
* - Centralised in-memory buffer with periodic/threshold-based flush to IndexedDB
|
|
10
|
-
* - `window:beforeunload` triggers a final
|
|
10
|
+
* - `window:beforeunload` triggers a final best-effort async flush
|
|
11
11
|
*/
|
|
12
12
|
import { Injectable, inject, PLATFORM_ID, NgZone, } from '@angular/core';
|
|
13
13
|
import { isPlatformBrowser } from '@angular/common';
|
|
@@ -97,8 +97,11 @@ export class UiBlackboxService {
|
|
|
97
97
|
// Setup periodic flush (outside Angular zone to avoid triggering CD)
|
|
98
98
|
this.zone.runOutsideAngular(() => {
|
|
99
99
|
this.flushTimerId = setInterval(() => this.flush(), this.config.flushIntervalMs);
|
|
100
|
-
//
|
|
101
|
-
this.beforeUnloadHandler = () =>
|
|
100
|
+
// Best-effort flush on tab close (IndexedDB is async, no sync fallback)
|
|
101
|
+
this.beforeUnloadHandler = () => {
|
|
102
|
+
this.session.endedAt = Date.now();
|
|
103
|
+
void this.flush();
|
|
104
|
+
};
|
|
102
105
|
window.addEventListener('beforeunload', this.beforeUnloadHandler);
|
|
103
106
|
});
|
|
104
107
|
this.initialised = true;
|
|
@@ -284,58 +287,6 @@ export class UiBlackboxService {
|
|
|
284
287
|
console.warn('[UiBlackbox] Storage flush failed:', e);
|
|
285
288
|
}
|
|
286
289
|
}
|
|
287
|
-
/**
|
|
288
|
-
* Synchronous flush for `beforeunload`.
|
|
289
|
-
* Falls back to a best-effort approach since IndexedDB is async.
|
|
290
|
-
* @internal
|
|
291
|
-
*/
|
|
292
|
-
flushSync() {
|
|
293
|
-
if (!this.initialised)
|
|
294
|
-
return;
|
|
295
|
-
this.session.endedAt = Date.now();
|
|
296
|
-
// Use sendBeacon-like approach: serialise session to localStorage
|
|
297
|
-
// as a fallback that can be recovered on next load.
|
|
298
|
-
// The proper IndexedDB flush is async and may not complete on unload.
|
|
299
|
-
try {
|
|
300
|
-
const key = `__ui_bb_pending_${this.session.sessionId}`;
|
|
301
|
-
const data = JSON.stringify(this.session);
|
|
302
|
-
localStorage.setItem(key, data);
|
|
303
|
-
}
|
|
304
|
-
catch {
|
|
305
|
-
// Best effort — quota may be exceeded
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
// ─── Pending session recovery ──────────────────────────────────────
|
|
309
|
-
/**
|
|
310
|
-
* Recover sessions that were saved to localStorage during `beforeunload`
|
|
311
|
-
* and persist them to IndexedDB. Called on next service init.
|
|
312
|
-
* @internal
|
|
313
|
-
*/
|
|
314
|
-
async recoverPendingSessions() {
|
|
315
|
-
if (!isPlatformBrowser(this.platformId))
|
|
316
|
-
return;
|
|
317
|
-
const prefix = '__ui_bb_pending_';
|
|
318
|
-
const keys = [];
|
|
319
|
-
for (let i = 0; i < localStorage.length; i++) {
|
|
320
|
-
const key = localStorage.key(i);
|
|
321
|
-
if (key?.startsWith(prefix)) {
|
|
322
|
-
keys.push(key);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
for (const key of keys) {
|
|
326
|
-
try {
|
|
327
|
-
const data = localStorage.getItem(key);
|
|
328
|
-
if (data) {
|
|
329
|
-
const session = JSON.parse(data);
|
|
330
|
-
await this.storage.saveSession(session);
|
|
331
|
-
}
|
|
332
|
-
localStorage.removeItem(key);
|
|
333
|
-
}
|
|
334
|
-
catch {
|
|
335
|
-
localStorage.removeItem(key);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
290
|
// ─── Utilities ─────────────────────────────────────────────────────
|
|
340
291
|
/** Generate a UUID v4. */
|
|
341
292
|
generateUuid() {
|
|
@@ -360,7 +311,7 @@ export class UiBlackboxService {
|
|
|
360
311
|
window.removeEventListener('beforeunload', this.beforeUnloadHandler);
|
|
361
312
|
}
|
|
362
313
|
// Final flush
|
|
363
|
-
this.
|
|
314
|
+
void this.flush();
|
|
364
315
|
}
|
|
365
316
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiBlackboxService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
366
317
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiBlackboxService, providedIn: 'root' }); }
|
|
@@ -369,4 +320,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
369
320
|
type: Injectable,
|
|
370
321
|
args: [{ providedIn: 'root' }]
|
|
371
322
|
}], ctorParameters: () => [] });
|
|
372
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxhY2tib3guc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXVpLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvYmxhY2tib3gvYmxhY2tib3guc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUNMLFVBQVUsRUFDVixNQUFNLEVBQ04sV0FBVyxFQUVYLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBU0wsb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBRXRFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQW9CNUI7UUFuQmlCLGVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixTQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLGdCQUFXLEdBQUcsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDbkQsWUFBTyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRTNDLGFBQVEsR0FBRyxJQUFJLE9B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QyxtQkFBbUIsRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVELGNBQWM7UUFDZCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQzsrR0EzWFUsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FESixNQUFNOzs0RkFDbkIsaUJBQWlCO2tCQUQ3QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAbW9kdWxlIG5nLXVpLXN5c3RlbS9ibGFja2JveFxyXG4gKiBDb3JlIEJsYWNrQm94IG9ic2VydmFiaWxpdHkgc2VydmljZSDigJQgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHNlc3Npb25cclxuICogcmVjb3JkaW5nLCBldmVudCBidWZmZXJpbmcsIGFuZCBleHBvcnQuXHJcbiAqXHJcbiAqIEFyY2hpdGVjdHVyZTpcclxuICogLSBSb290IHNpbmdsZXRvbiAoYHByb3ZpZGVkSW46ICdyb290J2ApXHJcbiAqIC0gT24gZmlyc3QgaW5qZWN0OiBnZW5lcmF0ZXMgZmluZ2VycHJpbnQsIGNyZWF0ZXMgc2Vzc2lvbiwgc3Vic2NyaWJlcyB0byBSb3V0ZXIgZXZlbnRzXHJcbiAqIC0gQ2VudHJhbGlzZWQgaW4tbWVtb3J5IGJ1ZmZlciB3aXRoIHBlcmlvZGljL3RocmVzaG9sZC1iYXNlZCBmbHVzaCB0byBJbmRleGVkREJcclxuICogLSBgd2luZG93OmJlZm9yZXVubG9hZGAgdHJpZ2dlcnMgYSBmaW5hbCBzeW5jaHJvbm91cyBmbHVzaFxyXG4gKi9cclxuXHJcbmltcG9ydCB7XHJcbiAgSW5qZWN0YWJsZSxcclxuICBpbmplY3QsXHJcbiAgUExBVEZPUk1fSUQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE5nWm9uZSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBVaUJsYWNrYm94Q29uZmlnLFxyXG4gIFVpQmxhY2tib3hGb3JtVHJhY2tpbmdDb25maWcsXHJcbiAgVWlCbGFja2JveFNlc3Npb24sXHJcbiAgVWlCbGFja2JveFN0ZXAsXHJcbiAgVWlCbGFja2JveEFjdGlvbixcclxuICBVaUJsYWNrYm94Rm9ybUV2ZW50LFxyXG4gIFVpQmxhY2tib3hIdHRwQ2FsbCxcclxuICBVaUJsYWNrYm94QnVmZmVyRXZlbnQsXHJcbiAgVUlfQkxBQ0tCT1hfREVGQVVMVFMsXHJcbn0gZnJvbSAnLi9ibGFja2JveC50eXBlcyc7XHJcbmltcG9ydCB7IFVpQmxhY2tib3hGaW5nZXJwcmludFNlcnZpY2UgfSBmcm9tICcuL2JsYWNrYm94LWZpbmdlcnByaW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVaUJsYWNrYm94U3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL2JsYWNrYm94LXN0b3JhZ2Uuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogQ2VudHJhbCBCbGFja0JveCBvYnNlcnZhYmlsaXR5IHNlcnZpY2UuXHJcbiAqXHJcbiAqIFJlY29yZHMgbmF2aWdhdGlvbiwgVUkgaW50ZXJhY3Rpb25zLCBmb3JtIGV2ZW50cywgYW5kIEhUVFAgY2FsbHNcclxuICogaW50byBjb21wcmVzc2VkIHNlc3Npb25zIHN0b3JlZCBpbiBJbmRleGVkREIuXHJcbiAqXHJcbiAqIEB1c2FnZU5vdGVzXHJcbiAqIFRoZSBzZXJ2aWNlIGFjdGl2YXRlcyBhdXRvbWF0aWNhbGx5IHdoZW4gaW5qZWN0ZWQuIFByb3ZpZGUgaXQgYXQgcm9vdCBsZXZlbFxyXG4gKiBhbmQgaXQgd2lsbCBzdGFydCByZWNvcmRpbmcgaW1tZWRpYXRlbHkuXHJcbiAqXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogLy8gYXBwLmNvbmZpZy50cyDigJQganVzdCBpbXBvcnRpbmcgdGhlIHNlcnZpY2UgaXMgZW5vdWdoXHJcbiAqIGltcG9ydCB7IFVpQmxhY2tib3hTZXJ2aWNlIH0gZnJvbSAnQGduZ2dsbi9uZy11aS1zeXN0ZW0nO1xyXG4gKlxyXG4gKiBleHBvcnQgY29uc3QgYXBwQ29uZmlnOiBBcHBsaWNhdGlvbkNvbmZpZyA9IHtcclxuICogICBwcm92aWRlcnM6IFtcclxuICogICAgIC8vIFRoZSBzZXJ2aWNlIGlzIHByb3ZpZGVkSW46ICdyb290Jywgc28gaXQncyBhdXRvLXByb3ZpZGVkLlxyXG4gKiAgICAgLy8gVG8gZm9yY2UgZWFnZXIgaW5pdGlhbGlzYXRpb246XHJcbiAqICAgICB7IHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUiwgdXNlRmFjdG9yeTogKCkgPT4gKCkgPT4gaW5qZWN0KFVpQmxhY2tib3hTZXJ2aWNlKSwgbXVsdGk6IHRydWUgfSxcclxuICogICBdLFxyXG4gKiB9O1xyXG4gKiBgYGBcclxuICovXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBVaUJsYWNrYm94U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybUlkID0gaW5qZWN0KFBMQVRGT1JNX0lEKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgem9uZSA9IGluamVjdChOZ1pvbmUpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZmluZ2VycHJpbnQgPSBpbmplY3QoVWlCbGFja2JveEZpbmdlcnByaW50U2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlID0gaW5qZWN0KFVpQmxhY2tib3hTdG9yYWdlU2VydmljZSk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByaXZhdGUgY29uZmlnOiBVaUJsYWNrYm94Q29uZmlnID0geyAuLi5VSV9CTEFDS0JPWF9ERUZBVUxUUyB9O1xyXG5cclxuICAvLyDilIDilIDilIAgU2Vzc2lvbiBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICBwcml2YXRlIHNlc3Npb24hOiBVaUJsYWNrYm94U2Vzc2lvbjtcclxuICBwcml2YXRlIGN1cnJlbnRTdGVwOiBVaUJsYWNrYm94U3RlcCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgaW5pdGlhbGlzZWQgPSBmYWxzZTtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIENlbnRyYWxpc2VkIGV2ZW50IGJ1ZmZlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICBwcml2YXRlIGJ1ZmZlcjogVWlCbGFja2JveEJ1ZmZlckV2ZW50W10gPSBbXTtcclxuICBwcml2YXRlIGZsdXNoVGltZXJJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBiZWZvcmVVbmxvYWRIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xyXG4gICAgICB0aGlzLmluaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBJbml0aWFsaXNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gR2VuZXJhdGUgc2Vzc2lvbiBJRFxyXG4gICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5nZW5lcmF0ZVV1aWQoKTtcclxuICAgIGNvbnN0IGZwID0gYXdhaXQgdGhpcy5maW5nZXJwcmludC5nZXRGaW5nZXJwcmludCgpO1xyXG5cclxuICAgIHRoaXMuc2Vzc2lvbiA9IHtcclxuICAgICAgc2Vzc2lvbklkLFxyXG4gICAgICBmaW5nZXJwcmludDogZnAsXHJcbiAgICAgIHN0YXJ0ZWRBdDogRGF0ZS5ub3coKSxcclxuICAgICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxyXG4gICAgICBzdGVwczogW10sXHJcbiAgICAgIGZvcm1FdmVudHM6IFtdLFxyXG4gICAgICBjYWxsczogW10sXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIENyZWF0ZSBpbml0aWFsIHN0ZXAgZnJvbSBjdXJyZW50IFVSTFxyXG4gICAgdGhpcy5jdXJyZW50U3RlcCA9IHtcclxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICByb3V0ZTogdGhpcy5yb3V0ZXIudXJsLFxyXG4gICAgICBhY3Rpb25zOiBbXSxcclxuICAgIH07XHJcbiAgICB0aGlzLnNlc3Npb24uc3RlcHMucHVzaCh0aGlzLmN1cnJlbnRTdGVwKTtcclxuXHJcbiAgICAvLyBTdWJzY3JpYmUgdG8gcm91dGVyIG5hdmlnYXRpb25cclxuICAgIHRoaXMucm91dGVyLmV2ZW50c1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoKGUpOiBlIGlzIE5hdmlnYXRpb25FbmQgPT4gZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzUm91dGUgPSB0aGlzLmN1cnJlbnRTdGVwPy5yb3V0ZTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwID0ge1xyXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgcm91dGU6IGV2ZW50LnVybEFmdGVyUmVkaXJlY3RzLFxyXG4gICAgICAgICAgcHJldmlvdXNSb3V0ZSxcclxuICAgICAgICAgIGFjdGlvbnM6IFtdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5wdXNoQnVmZmVyRXZlbnQoeyBraW5kOiAnc3RlcCcsIHBheWxvYWQ6IHRoaXMuY3VycmVudFN0ZXAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIFNldHVwIHBlcmlvZGljIGZsdXNoIChvdXRzaWRlIEFuZ3VsYXIgem9uZSB0byBhdm9pZCB0cmlnZ2VyaW5nIENEKVxyXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgdGhpcy5mbHVzaFRpbWVySWQgPSBzZXRJbnRlcnZhbChcclxuICAgICAgICAoKSA9PiB0aGlzLmZsdXNoKCksXHJcbiAgICAgICAgdGhpcy5jb25maWcuZmx1c2hJbnRlcnZhbE1zLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gRmluYWwgZmx1c2ggb24gdGFiIGNsb3NlXHJcbiAgICAgIHRoaXMuYmVmb3JlVW5sb2FkSGFuZGxlciA9ICgpID0+IHRoaXMuZmx1c2hTeW5jKCk7XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLmJlZm9yZVVubG9hZEhhbmRsZXIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5pbml0aWFsaXNlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgUHVibGljIEFQSTogQ29uZmlndXJhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBCbGFja0JveCBjb25maWd1cmF0aW9uLlxyXG4gICAqIENhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWU7IGNoYW5nZXMgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkuXHJcbiAgICovXHJcbiAgY29uZmlndXJlKGNvbmZpZzogUGFydGlhbDxPbWl0PFVpQmxhY2tib3hDb25maWcsICdmb3JtVHJhY2tpbmcnPj4gJiB7IGZvcm1UcmFja2luZz86IFBhcnRpYWw8VWlCbGFja2JveEZvcm1UcmFja2luZ0NvbmZpZz4gfSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25maWcgPSB7XHJcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxyXG4gICAgICAuLi5jb25maWcsXHJcbiAgICAgIGZvcm1UcmFja2luZzoge1xyXG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmZvcm1UcmFja2luZyxcclxuICAgICAgICAuLi4oY29uZmlnLmZvcm1UcmFja2luZyA/PyB7fSksXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zdG9yYWdlLnNldE1heFN0b3JhZ2VNYih0aGlzLmNvbmZpZy5tYXhTdG9yYWdlTWIpO1xyXG5cclxuICAgIC8vIFJlc3RhcnQgZmx1c2ggdGltZXIgd2l0aCBuZXcgaW50ZXJ2YWxcclxuICAgIGlmICh0aGlzLmZsdXNoVGltZXJJZCAhPT0gbnVsbCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMuZmx1c2hUaW1lcklkKTtcclxuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICB0aGlzLmZsdXNoVGltZXJJZCA9IHNldEludGVydmFsKFxyXG4gICAgICAgICAgKCkgPT4gdGhpcy5mbHVzaCgpLFxyXG4gICAgICAgICAgdGhpcy5jb25maWcuZmx1c2hJbnRlcnZhbE1zLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiAocmVhZG9ubHkgc25hcHNob3QpLiAqL1xyXG4gIGdldENvbmZpZygpOiBSZWFkb25seTxVaUJsYWNrYm94Q29uZmlnPiB7XHJcbiAgICByZXR1cm4geyAuLi50aGlzLmNvbmZpZyB9O1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIFB1YmxpYyBBUEk6IFRyYWNraW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBNYW51YWxseSB0cmFjayBhIFVJIGFjdGlvbiAoY2xpY2spLlxyXG4gICAqXHJcbiAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgYFVpQnV0dG9uQXJlYUNvbXBvbmVudGAgYW5kIHRoZSBgW3VpVHJhY2tdYCBkaXJlY3RpdmUuXHJcbiAgICogQ2FuIGFsc28gYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgZm9yIGN1c3RvbSBpbnRlcmFjdGlvbnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gdHJhY2tJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBhY3Rpb24gKGUuZy4gYnV0dG9uIGlkLCBsaW5rIG5hbWUpLlxyXG4gICAqIEBwYXJhbSBtZXRhIC0gT3B0aW9uYWwgbWV0YWRhdGE6IGB0YWdgLCBgdGV4dGAsIGBpZGAgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICovXHJcbiAgdHJhY2tBY3Rpb24oXHJcbiAgICB0cmFja0lkOiBzdHJpbmcsXHJcbiAgICBtZXRhPzogeyB0YWc/OiBzdHJpbmc7IHRleHQ/OiBzdHJpbmc7IGlkPzogc3RyaW5nIH0sXHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGlzZWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBhY3Rpb246IFVpQmxhY2tib3hBY3Rpb24gPSB7XHJcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcclxuICAgICAgdHlwZTogJ2NsaWNrJyxcclxuICAgICAgdGFyZ2V0OiB7XHJcbiAgICAgICAgdGFnOiBtZXRhPy50YWcgPz8gJ3Vua25vd24nLFxyXG4gICAgICAgIGlkOiBtZXRhPy5pZCxcclxuICAgICAgICB0cmFja0lkLFxyXG4gICAgICAgIHRleHQ6IG1ldGE/LnRleHQ/LnN1YnN0cmluZygwLCA1MCksXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEFkZCB0byBjdXJyZW50IHN0ZXAgaW1tZWRpYXRlbHkgKGZvciBpbi1tZW1vcnkgc2Vzc2lvbiBhY2Nlc3MpXHJcbiAgICB0aGlzLmN1cnJlbnRTdGVwPy5hY3Rpb25zLnB1c2goYWN0aW9uKTtcclxuXHJcbiAgICAvLyBBbHNvIHB1c2ggdG8gYnVmZmVyIGZvciBwZXJzaXN0ZW5jZVxyXG4gICAgdGhpcy5wdXNoQnVmZmVyRXZlbnQoe1xyXG4gICAgICBraW5kOiAnYWN0aW9uJyxcclxuICAgICAgcGF5bG9hZDogeyAuLi5hY3Rpb24sIHJvdXRlOiB0aGlzLmN1cnJlbnRTdGVwPy5yb3V0ZSA/PyB0aGlzLnJvdXRlci51cmwgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2sgYSBmb3JtIGludGVyYWN0aW9uIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgYFVpRm9ybUJ1aWxkZXJDb21wb25lbnRgIHdoZW4gdGhlIEJsYWNrQm94XHJcbiAgICogc2VydmljZSBpcyBhdmFpbGFibGUuXHJcbiAgICovXHJcbiAgdHJhY2tGb3JtRXZlbnQoZXZlbnQ6IFVpQmxhY2tib3hGb3JtRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pbml0aWFsaXNlZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc2Vzc2lvbi5mb3JtRXZlbnRzLnB1c2goZXZlbnQpO1xyXG4gICAgdGhpcy5wdXNoQnVmZmVyRXZlbnQoeyBraW5kOiAnZm9ybUV2ZW50JywgcGF5bG9hZDogZXZlbnQgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFjayBhbiBpbnRlcmNlcHRlZCBIVFRQIGNhbGwuXHJcbiAgICogQ2FsbGVkIGJ5IGBVaUJsYWNrYm94SW50ZXJjZXB0b3JgLlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHRyYWNrSHR0cENhbGwoY2FsbDogVWlCbGFja2JveEh0dHBDYWxsKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGlzZWQpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnNlc3Npb24uY2FsbHMucHVzaChjYWxsKTtcclxuICAgIHRoaXMucHVzaEJ1ZmZlckV2ZW50KHsga2luZDogJ2h0dHBDYWxsJywgcGF5bG9hZDogY2FsbCB9KTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBQdWJsaWMgQVBJOiBTZXNzaW9uIGFjY2VzcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBpbi1tZW1vcnkgc2Vzc2lvbiAobGl2ZSwgbm90IHlldCBmbHVzaGVkKS5cclxuICAgKiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBvciByZWFsLXRpbWUgaW5zcGVjdGlvbi5cclxuICAgKi9cclxuICBnZXRDdXJyZW50U2Vzc2lvbigpOiBVaUJsYWNrYm94U2Vzc2lvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgYWxsIHNlc3Npb25zIHN0b3JlZCBpbiBJbmRleGVkREIgKGRlY29tcHJlc3NlZCkuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0U2Vzc2lvbkhpc3RvcnkoKTogUHJvbWlzZTxVaUJsYWNrYm94U2Vzc2lvbltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldEFsbFNlc3Npb25zKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBzZXNzaW9ucyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlIGZpbmdlcnByaW50LlxyXG4gICAqL1xyXG4gIGFzeW5jIGdldFNlc3Npb25zRm9yRGV2aWNlKCk6IFByb21pc2U8VWlCbGFja2JveFNlc3Npb25bXT4ge1xyXG4gICAgY29uc3QgZnAgPSBhd2FpdCB0aGlzLmZpbmdlcnByaW50LmdldEZpbmdlcnByaW50KCk7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldFNlc3Npb25zQnlGaW5nZXJwcmludChmcCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgUHVibGljIEFQSTogRXhwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBFeHBvcnQgYWxsIHNlc3Npb25zIGFzIGEgZG93bmxvYWRhYmxlIEpTT05MIEJsb2IuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyBBIEJsb2IgY29udGFpbmluZyBKU09OTCBkYXRhIChvbmUgc2Vzc2lvbiBwZXIgbGluZSkuXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBjb25zdCBibG9iID0gYXdhaXQgYmxhY2tib3guZXhwb3J0U2Vzc2lvbnMoKTtcclxuICAgKiBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAqIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICogYS5ocmVmID0gdXJsO1xyXG4gICAqIGEuZG93bmxvYWQgPSAnYmxhY2tib3gtc2Vzc2lvbnMuanNvbmwnO1xyXG4gICAqIGEuY2xpY2soKTtcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBhc3luYyBleHBvcnRTZXNzaW9ucygpOiBQcm9taXNlPEJsb2I+IHtcclxuICAgIC8vIEZsdXNoIGN1cnJlbnQgc2Vzc2lvbiBmaXJzdFxyXG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5leHBvcnREdW1wKCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgUHVibGljIEFQSTogTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBFeHBsaWNpdGx5IGVuZCB0aGUgY3VycmVudCBzZXNzaW9uLlxyXG4gICAqIEZsdXNoZXMgYWxsIGJ1ZmZlcmVkIGV2ZW50cyBhbmQgbWFya3MgdGhlIHNlc3Npb24gYXMgZW5kZWQuXHJcbiAgICovXHJcbiAgYXN5bmMgZW5kU2Vzc2lvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5pbml0aWFsaXNlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZXNzaW9uLmVuZGVkQXQgPSBEYXRlLm5vdygpO1xyXG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgYWxsIHN0b3JlZCBzZXNzaW9ucyBmcm9tIEluZGV4ZWREQi5cclxuICAgKi9cclxuICBhc3luYyBjbGVhckhpc3RvcnkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmNsZWFyQWxsKCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgQnVmZmVyIG1hbmFnZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYW4gZXZlbnQgaW50byB0aGUgY2VudHJhbGlzZWQgYnVmZmVyLlxyXG4gICAqIFRyaWdnZXJzIGFuIGltbWVkaWF0ZSBmbHVzaCBpZiB0aGUgYnVmZmVyIGV4Y2VlZHMgdGhlIHRocmVzaG9sZC5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBwcml2YXRlIHB1c2hCdWZmZXJFdmVudChldmVudDogVWlCbGFja2JveEJ1ZmZlckV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmJ1ZmZlci5wdXNoKGV2ZW50KTtcclxuICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPj0gdGhpcy5jb25maWcuZmx1c2hUaHJlc2hvbGQpIHtcclxuICAgICAgdGhpcy5mbHVzaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmx1c2ggYnVmZmVyZWQgZXZlbnRzIHRvIEluZGV4ZWREQiBhc3luY2hyb25vdXNseS5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLmluaXRpYWxpc2VkIHx8IHRoaXMuYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIERyYWluIGJ1ZmZlclxyXG4gICAgY29uc3QgZXZlbnRzID0gdGhpcy5idWZmZXIuc3BsaWNlKDApO1xyXG5cclxuICAgIC8vIEFwcGx5IHN0ZXAgZXZlbnRzIHRvIHRoZSBzZXNzaW9uXHJcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xyXG4gICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ3N0ZXAnKSB7XHJcbiAgICAgICAgLy8gU3RlcHMgYXJlIGFscmVhZHkgcHVzaGVkIGluIHJlYWwtdGltZTsgZW5zdXJlIHRoZXkncmUgaW4gdGhlIHNlc3Npb25cclxuICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbi5zdGVwcy5pbmNsdWRlcyhldmVudC5wYXlsb2FkKSkge1xyXG4gICAgICAgICAgdGhpcy5zZXNzaW9uLnN0ZXBzLnB1c2goZXZlbnQucGF5bG9hZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIEFjdGlvbnMsIGZvcm1FdmVudHMsIGh0dHBDYWxscyBhcmUgYWxyZWFkeSBwdXNoZWQgaW4gcmVhbC10aW1lXHJcbiAgICAgIC8vIHRvIHRoZSBpbi1tZW1vcnkgc2Vzc2lvbiBieSB0cmFja0FjdGlvbi90cmFja0Zvcm1FdmVudC90cmFja0h0dHBDYWxsXHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2F2ZSB0aGUgZnVsbCBzZXNzaW9uIHNuYXBzaG90XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2Uuc2F2ZVNlc3Npb24odGhpcy5zZXNzaW9uKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gc3RvcmFnZSBlcnJvciDigJQgcmUtZW5xdWV1ZSBldmVudHMgZm9yIG5leHQgZmx1c2hcclxuICAgICAgY29uc29sZS53YXJuKCdbVWlCbGFja2JveF0gU3RvcmFnZSBmbHVzaCBmYWlsZWQ6JywgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTeW5jaHJvbm91cyBmbHVzaCBmb3IgYGJlZm9yZXVubG9hZGAuXHJcbiAgICogRmFsbHMgYmFjayB0byBhIGJlc3QtZWZmb3J0IGFwcHJvYWNoIHNpbmNlIEluZGV4ZWREQiBpcyBhc3luYy5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBwcml2YXRlIGZsdXNoU3luYygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pbml0aWFsaXNlZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc2Vzc2lvbi5lbmRlZEF0ID0gRGF0ZS5ub3coKTtcclxuXHJcbiAgICAvLyBVc2Ugc2VuZEJlYWNvbi1saWtlIGFwcHJvYWNoOiBzZXJpYWxpc2Ugc2Vzc2lvbiB0byBsb2NhbFN0b3JhZ2VcclxuICAgIC8vIGFzIGEgZmFsbGJhY2sgdGhhdCBjYW4gYmUgcmVjb3ZlcmVkIG9uIG5leHQgbG9hZC5cclxuICAgIC8vIFRoZSBwcm9wZXIgSW5kZXhlZERCIGZsdXNoIGlzIGFzeW5jIGFuZCBtYXkgbm90IGNvbXBsZXRlIG9uIHVubG9hZC5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGtleSA9IGBfX3VpX2JiX3BlbmRpbmdfJHt0aGlzLnNlc3Npb24uc2Vzc2lvbklkfWA7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnNlc3Npb24pO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIGRhdGEpO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIC8vIEJlc3QgZWZmb3J0IOKAlCBxdW90YSBtYXkgYmUgZXhjZWVkZWRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBQZW5kaW5nIHNlc3Npb24gcmVjb3Zlcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKlxyXG4gICAqIFJlY292ZXIgc2Vzc2lvbnMgdGhhdCB3ZXJlIHNhdmVkIHRvIGxvY2FsU3RvcmFnZSBkdXJpbmcgYGJlZm9yZXVubG9hZGBcclxuICAgKiBhbmQgcGVyc2lzdCB0aGVtIHRvIEluZGV4ZWREQi4gQ2FsbGVkIG9uIG5leHQgc2VydmljZSBpbml0LlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgcmVjb3ZlclBlbmRpbmdTZXNzaW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHByZWZpeCA9ICdfX3VpX2JiX3BlbmRpbmdfJztcclxuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbFN0b3JhZ2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3Qga2V5ID0gbG9jYWxTdG9yYWdlLmtleShpKTtcclxuICAgICAgaWYgKGtleT8uc3RhcnRzV2l0aChwcmVmaXgpKSB7XHJcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgIGNvbnN0IHNlc3Npb246IFVpQmxhY2tib3hTZXNzaW9uID0gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5zYXZlU2Vzc2lvbihzZXNzaW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIFV0aWxpdGllcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIEdlbmVyYXRlIGEgVVVJRCB2NC4gKi9cclxuICBwcml2YXRlIGdlbmVyYXRlVXVpZCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEKSB7XHJcbiAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO1xyXG4gICAgfVxyXG4gICAgLy8gRmFsbGJhY2sgZm9yIG9sZGVyIGJyb3dzZXJzXHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCAoYykgPT4ge1xyXG4gICAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwO1xyXG4gICAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcclxuICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgQ2xlYW51cCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuXHJcbiAgICBpZiAodGhpcy5mbHVzaFRpbWVySWQgIT09IG51bGwpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmZsdXNoVGltZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYmVmb3JlVW5sb2FkSGFuZGxlcikge1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgdGhpcy5iZWZvcmVVbmxvYWRIYW5kbGVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGaW5hbCBmbHVzaFxyXG4gICAgdGhpcy5mbHVzaFN5bmMoKTtcclxuICB9XHJcbn1cclxuIl19
|
|
323
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxhY2tib3guc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXVpLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvYmxhY2tib3gvYmxhY2tib3guc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUNMLFVBQVUsRUFDVixNQUFNLEVBQ04sV0FBVyxFQUVYLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBU0wsb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBRXRFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQW9CNUI7UUFuQmlCLGVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixTQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLGdCQUFXLEdBQUcsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDbkQsWUFBTyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRTNDLGFBQVEsR0FBRyxJQUFJLE9B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IjpbIi8qKlxyXG4gKiBAbW9kdWxlIG5nLXVpLXN5c3RlbS9ibGFja2JveFxyXG4gKiBDb3JlIEJsYWNrQm94IG9ic2VydmFiaWxpdHkgc2VydmljZSDigJQgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHNlc3Npb25cclxuICogcmVjb3JkaW5nLCBldmVudCBidWZmZXJpbmcsIGFuZCBleHBvcnQuXHJcbiAqXHJcbiAqIEFyY2hpdGVjdHVyZTpcclxuICogLSBSb290IHNpbmdsZXRvbiAoYHByb3ZpZGVkSW46ICdyb290J2ApXHJcbiAqIC0gT24gZmlyc3QgaW5qZWN0OiBnZW5lcmF0ZXMgZmluZ2VycHJpbnQsIGNyZWF0ZXMgc2Vzc2lvbiwgc3Vic2NyaWJlcyB0byBSb3V0ZXIgZXZlbnRzXHJcbiAqIC0gQ2VudHJhbGlzZWQgaW4tbWVtb3J5IGJ1ZmZlciB3aXRoIHBlcmlvZGljL3RocmVzaG9sZC1iYXNlZCBmbHVzaCB0byBJbmRleGVkREJcclxuICogLSBgd2luZG93OmJlZm9yZXVubG9hZGAgdHJpZ2dlcnMgYSBmaW5hbCBiZXN0LWVmZm9ydCBhc3luYyBmbHVzaFxyXG4gKi9cclxuXHJcbmltcG9ydCB7XHJcbiAgSW5qZWN0YWJsZSxcclxuICBpbmplY3QsXHJcbiAgUExBVEZPUk1fSUQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE5nWm9uZSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBVaUJsYWNrYm94Q29uZmlnLFxyXG4gIFVpQmxhY2tib3hGb3JtVHJhY2tpbmdDb25maWcsXHJcbiAgVWlCbGFja2JveFNlc3Npb24sXHJcbiAgVWlCbGFja2JveFN0ZXAsXHJcbiAgVWlCbGFja2JveEFjdGlvbixcclxuICBVaUJsYWNrYm94Rm9ybUV2ZW50LFxyXG4gIFVpQmxhY2tib3hIdHRwQ2FsbCxcclxuICBVaUJsYWNrYm94QnVmZmVyRXZlbnQsXHJcbiAgVUlfQkxBQ0tCT1hfREVGQVVMVFMsXHJcbn0gZnJvbSAnLi9ibGFja2JveC50eXBlcyc7XHJcbmltcG9ydCB7IFVpQmxhY2tib3hGaW5nZXJwcmludFNlcnZpY2UgfSBmcm9tICcuL2JsYWNrYm94LWZpbmdlcnByaW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVaUJsYWNrYm94U3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL2JsYWNrYm94LXN0b3JhZ2Uuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogQ2VudHJhbCBCbGFja0JveCBvYnNlcnZhYmlsaXR5IHNlcnZpY2UuXHJcbiAqXHJcbiAqIFJlY29yZHMgbmF2aWdhdGlvbiwgVUkgaW50ZXJhY3Rpb25zLCBmb3JtIGV2ZW50cywgYW5kIEhUVFAgY2FsbHNcclxuICogaW50byBjb21wcmVzc2VkIHNlc3Npb25zIHN0b3JlZCBpbiBJbmRleGVkREIuXHJcbiAqXHJcbiAqIEB1c2FnZU5vdGVzXHJcbiAqIFRoZSBzZXJ2aWNlIGFjdGl2YXRlcyBhdXRvbWF0aWNhbGx5IHdoZW4gaW5qZWN0ZWQuIFByb3ZpZGUgaXQgYXQgcm9vdCBsZXZlbFxyXG4gKiBhbmQgaXQgd2lsbCBzdGFydCByZWNvcmRpbmcgaW1tZWRpYXRlbHkuXHJcbiAqXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogLy8gYXBwLmNvbmZpZy50cyDigJQganVzdCBpbXBvcnRpbmcgdGhlIHNlcnZpY2UgaXMgZW5vdWdoXHJcbiAqIGltcG9ydCB7IFVpQmxhY2tib3hTZXJ2aWNlIH0gZnJvbSAnQGduZ2dsbi9uZy11aS1zeXN0ZW0nO1xyXG4gKlxyXG4gKiBleHBvcnQgY29uc3QgYXBwQ29uZmlnOiBBcHBsaWNhdGlvbkNvbmZpZyA9IHtcclxuICogICBwcm92aWRlcnM6IFtcclxuICogICAgIC8vIFRoZSBzZXJ2aWNlIGlzIHByb3ZpZGVkSW46ICdyb290Jywgc28gaXQncyBhdXRvLXByb3ZpZGVkLlxyXG4gKiAgICAgLy8gVG8gZm9yY2UgZWFnZXIgaW5pdGlhbGlzYXRpb246XHJcbiAqICAgICB7IHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUiwgdXNlRmFjdG9yeTogKCkgPT4gKCkgPT4gaW5qZWN0KFVpQmxhY2tib3hTZXJ2aWNlKSwgbXVsdGk6IHRydWUgfSxcclxuICogICBdLFxyXG4gKiB9O1xyXG4gKiBgYGBcclxuICovXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBVaUJsYWNrYm94U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybUlkID0gaW5qZWN0KFBMQVRGT1JNX0lEKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgem9uZSA9IGluamVjdChOZ1pvbmUpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZmluZ2VycHJpbnQgPSBpbmplY3QoVWlCbGFja2JveEZpbmdlcnByaW50U2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlID0gaW5qZWN0KFVpQmxhY2tib3hTdG9yYWdlU2VydmljZSk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByaXZhdGUgY29uZmlnOiBVaUJsYWNrYm94Q29uZmlnID0geyAuLi5VSV9CTEFDS0JPWF9ERUZBVUxUUyB9O1xyXG5cclxuICAvLyDilIDilIDilIAgU2Vzc2lvbiBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICBwcml2YXRlIHNlc3Npb24hOiBVaUJsYWNrYm94U2Vzc2lvbjtcclxuICBwcml2YXRlIGN1cnJlbnRTdGVwOiBVaUJsYWNrYm94U3RlcCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgaW5pdGlhbGlzZWQgPSBmYWxzZTtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIENlbnRyYWxpc2VkIGV2ZW50IGJ1ZmZlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICBwcml2YXRlIGJ1ZmZlcjogVWlCbGFja2JveEJ1ZmZlckV2ZW50W10gPSBbXTtcclxuICBwcml2YXRlIGZsdXNoVGltZXJJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBiZWZvcmVVbmxvYWRIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xyXG4gICAgICB0aGlzLmluaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBJbml0aWFsaXNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gR2VuZXJhdGUgc2Vzc2lvbiBJRFxyXG4gICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5nZW5lcmF0ZVV1aWQoKTtcclxuICAgIGNvbnN0IGZwID0gYXdhaXQgdGhpcy5maW5nZXJwcmludC5nZXRGaW5nZXJwcmludCgpO1xyXG5cclxuICAgIHRoaXMuc2Vzc2lvbiA9IHtcclxuICAgICAgc2Vzc2lvbklkLFxyXG4gICAgICBmaW5nZXJwcmludDogZnAsXHJcbiAgICAgIHN0YXJ0ZWRBdDogRGF0ZS5ub3coKSxcclxuICAgICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxyXG4gICAgICBzdGVwczogW10sXHJcbiAgICAgIGZvcm1FdmVudHM6IFtdLFxyXG4gICAgICBjYWxsczogW10sXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIENyZWF0ZSBpbml0aWFsIHN0ZXAgZnJvbSBjdXJyZW50IFVSTFxyXG4gICAgdGhpcy5jdXJyZW50U3RlcCA9IHtcclxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICByb3V0ZTogdGhpcy5yb3V0ZXIudXJsLFxyXG4gICAgICBhY3Rpb25zOiBbXSxcclxuICAgIH07XHJcbiAgICB0aGlzLnNlc3Npb24uc3RlcHMucHVzaCh0aGlzLmN1cnJlbnRTdGVwKTtcclxuXHJcbiAgICAvLyBTdWJzY3JpYmUgdG8gcm91dGVyIG5hdmlnYXRpb25cclxuICAgIHRoaXMucm91dGVyLmV2ZW50c1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoKGUpOiBlIGlzIE5hdmlnYXRpb25FbmQgPT4gZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzUm91dGUgPSB0aGlzLmN1cnJlbnRTdGVwPy5yb3V0ZTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwID0ge1xyXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgcm91dGU6IGV2ZW50LnVybEFmdGVyUmVkaXJlY3RzLFxyXG4gICAgICAgICAgcHJldmlvdXNSb3V0ZSxcclxuICAgICAgICAgIGFjdGlvbnM6IFtdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5wdXNoQnVmZmVyRXZlbnQoeyBraW5kOiAnc3RlcCcsIHBheWxvYWQ6IHRoaXMuY3VycmVudFN0ZXAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIFNldHVwIHBlcmlvZGljIGZsdXNoIChvdXRzaWRlIEFuZ3VsYXIgem9uZSB0byBhdm9pZCB0cmlnZ2VyaW5nIENEKVxyXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgdGhpcy5mbHVzaFRpbWVySWQgPSBzZXRJbnRlcnZhbChcclxuICAgICAgICAoKSA9PiB0aGlzLmZsdXNoKCksXHJcbiAgICAgICAgdGhpcy5jb25maWcuZmx1c2hJbnRlcnZhbE1zLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gQmVzdC1lZmZvcnQgZmx1c2ggb24gdGFiIGNsb3NlIChJbmRleGVkREIgaXMgYXN5bmMsIG5vIHN5bmMgZmFsbGJhY2spXHJcbiAgICAgIHRoaXMuYmVmb3JlVW5sb2FkSGFuZGxlciA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLnNlc3Npb24uZW5kZWRBdCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgdm9pZCB0aGlzLmZsdXNoKCk7XHJcbiAgICAgIH07XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLmJlZm9yZVVubG9hZEhhbmRsZXIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5pbml0aWFsaXNlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgUHVibGljIEFQSTogQ29uZmlndXJhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBCbGFja0JveCBjb25maWd1cmF0aW9uLlxyXG4gICAqIENhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWU7IGNoYW5nZXMgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkuXHJcbiAgICovXHJcbiAgY29uZmlndXJlKGNvbmZpZzogUGFydGlhbDxPbWl0PFVpQmxhY2tib3hDb25maWcsICdmb3JtVHJhY2tpbmcnPj4gJiB7IGZvcm1UcmFja2luZz86IFBhcnRpYWw8VWlCbGFja2JveEZvcm1UcmFja2luZ0NvbmZpZz4gfSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25maWcgPSB7XHJcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxyXG4gICAgICAuLi5jb25maWcsXHJcbiAgICAgIGZvcm1UcmFja2luZzoge1xyXG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmZvcm1UcmFja2luZyxcclxuICAgICAgICAuLi4oY29uZmlnLmZvcm1UcmFja2luZyA/PyB7fSksXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zdG9yYWdlLnNldE1heFN0b3JhZ2VNYih0aGlzLmNvbmZpZy5tYXhTdG9yYWdlTWIpO1xyXG5cclxuICAgIC8vIFJlc3RhcnQgZmx1c2ggdGltZXIgd2l0aCBuZXcgaW50ZXJ2YWxcclxuICAgIGlmICh0aGlzLmZsdXNoVGltZXJJZCAhPT0gbnVsbCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMuZmx1c2hUaW1lcklkKTtcclxuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICB0aGlzLmZsdXNoVGltZXJJZCA9IHNldEludGVydmFsKFxyXG4gICAgICAgICAgKCkgPT4gdGhpcy5mbHVzaCgpLFxyXG4gICAgICAgICAgdGhpcy5jb25maWcuZmx1c2hJbnRlcnZhbE1zLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiAocmVhZG9ubHkgc25hcHNob3QpLiAqL1xyXG4gIGdldENvbmZpZygpOiBSZWFkb25seTxVaUJsYWNrYm94Q29uZmlnPiB7XHJcbiAgICByZXR1cm4geyAuLi50aGlzLmNvbmZpZyB9O1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIFB1YmxpYyBBUEk6IFRyYWNraW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBNYW51YWxseSB0cmFjayBhIFVJIGFjdGlvbiAoY2xpY2spLlxyXG4gICAqXHJcbiAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgYFVpQnV0dG9uQXJlYUNvbXBvbmVudGAgYW5kIHRoZSBgW3VpVHJhY2tdYCBkaXJlY3RpdmUuXHJcbiAgICogQ2FuIGFsc28gYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgZm9yIGN1c3RvbSBpbnRlcmFjdGlvbnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gdHJhY2tJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBhY3Rpb24gKGUuZy4gYnV0dG9uIGlkLCBsaW5rIG5hbWUpLlxyXG4gICAqIEBwYXJhbSBtZXRhIC0gT3B0aW9uYWwgbWV0YWRhdGE6IGB0YWdgLCBgdGV4dGAsIGBpZGAgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICovXHJcbiAgdHJhY2tBY3Rpb24oXHJcbiAgICB0cmFja0lkOiBzdHJpbmcsXHJcbiAgICBtZXRhPzogeyB0YWc/OiBzdHJpbmc7IHRleHQ/OiBzdHJpbmc7IGlkPzogc3RyaW5nIH0sXHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGlzZWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBhY3Rpb246IFVpQmxhY2tib3hBY3Rpb24gPSB7XHJcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcclxuICAgICAgdHlwZTogJ2NsaWNrJyxcclxuICAgICAgdGFyZ2V0OiB7XHJcbiAgICAgICAgdGFnOiBtZXRhPy50YWcgPz8gJ3Vua25vd24nLFxyXG4gICAgICAgIGlkOiBtZXRhPy5pZCxcclxuICAgICAgICB0cmFja0lkLFxyXG4gICAgICAgIHRleHQ6IG1ldGE/LnRleHQ/LnN1YnN0cmluZygwLCA1MCksXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEFkZCB0byBjdXJyZW50IHN0ZXAgaW1tZWRpYXRlbHkgKGZvciBpbi1tZW1vcnkgc2Vzc2lvbiBhY2Nlc3MpXHJcbiAgICB0aGlzLmN1cnJlbnRTdGVwPy5hY3Rpb25zLnB1c2goYWN0aW9uKTtcclxuXHJcbiAgICAvLyBBbHNvIHB1c2ggdG8gYnVmZmVyIGZvciBwZXJzaXN0ZW5jZVxyXG4gICAgdGhpcy5wdXNoQnVmZmVyRXZlbnQoe1xyXG4gICAgICBraW5kOiAnYWN0aW9uJyxcclxuICAgICAgcGF5bG9hZDogeyAuLi5hY3Rpb24sIHJvdXRlOiB0aGlzLmN1cnJlbnRTdGVwPy5yb3V0ZSA/PyB0aGlzLnJvdXRlci51cmwgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2sgYSBmb3JtIGludGVyYWN0aW9uIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgYFVpRm9ybUJ1aWxkZXJDb21wb25lbnRgIHdoZW4gdGhlIEJsYWNrQm94XHJcbiAgICogc2VydmljZSBpcyBhdmFpbGFibGUuXHJcbiAgICovXHJcbiAgdHJhY2tGb3JtRXZlbnQoZXZlbnQ6IFVpQmxhY2tib3hGb3JtRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pbml0aWFsaXNlZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc2Vzc2lvbi5mb3JtRXZlbnRzLnB1c2goZXZlbnQpO1xyXG4gICAgdGhpcy5wdXNoQnVmZmVyRXZlbnQoeyBraW5kOiAnZm9ybUV2ZW50JywgcGF5bG9hZDogZXZlbnQgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFjayBhbiBpbnRlcmNlcHRlZCBIVFRQIGNhbGwuXHJcbiAgICogQ2FsbGVkIGJ5IGBVaUJsYWNrYm94SW50ZXJjZXB0b3JgLlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHRyYWNrSHR0cENhbGwoY2FsbDogVWlCbGFja2JveEh0dHBDYWxsKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGlzZWQpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnNlc3Npb24uY2FsbHMucHVzaChjYWxsKTtcclxuICAgIHRoaXMucHVzaEJ1ZmZlckV2ZW50KHsga2luZDogJ2h0dHBDYWxsJywgcGF5bG9hZDogY2FsbCB9KTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBQdWJsaWMgQVBJOiBTZXNzaW9uIGFjY2VzcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBpbi1tZW1vcnkgc2Vzc2lvbiAobGl2ZSwgbm90IHlldCBmbHVzaGVkKS5cclxuICAgKiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBvciByZWFsLXRpbWUgaW5zcGVjdGlvbi5cclxuICAgKi9cclxuICBnZXRDdXJyZW50U2Vzc2lvbigpOiBVaUJsYWNrYm94U2Vzc2lvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgYWxsIHNlc3Npb25zIHN0b3JlZCBpbiBJbmRleGVkREIgKGRlY29tcHJlc3NlZCkuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0U2Vzc2lvbkhpc3RvcnkoKTogUHJvbWlzZTxVaUJsYWNrYm94U2Vzc2lvbltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldEFsbFNlc3Npb25zKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBzZXNzaW9ucyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlIGZpbmdlcnByaW50LlxyXG4gICAqL1xyXG4gIGFzeW5jIGdldFNlc3Npb25zRm9yRGV2aWNlKCk6IFByb21pc2U8VWlCbGFja2JveFNlc3Npb25bXT4ge1xyXG4gICAgY29uc3QgZnAgPSBhd2FpdCB0aGlzLmZpbmdlcnByaW50LmdldEZpbmdlcnByaW50KCk7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldFNlc3Npb25zQnlGaW5nZXJwcmludChmcCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgUHVibGljIEFQSTogRXhwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBFeHBvcnQgYWxsIHNlc3Npb25zIGFzIGEgZG93bmxvYWRhYmxlIEpTT05MIEJsb2IuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyBBIEJsb2IgY29udGFpbmluZyBKU09OTCBkYXRhIChvbmUgc2Vzc2lvbiBwZXIgbGluZSkuXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBjb25zdCBibG9iID0gYXdhaXQgYmxhY2tib3guZXhwb3J0U2Vzc2lvbnMoKTtcclxuICAgKiBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAqIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICogYS5ocmVmID0gdXJsO1xyXG4gICAqIGEuZG93bmxvYWQgPSAnYmxhY2tib3gtc2Vzc2lvbnMuanNvbmwnO1xyXG4gICAqIGEuY2xpY2soKTtcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBhc3luYyBleHBvcnRTZXNzaW9ucygpOiBQcm9taXNlPEJsb2I+IHtcclxuICAgIC8vIEZsdXNoIGN1cnJlbnQgc2Vzc2lvbiBmaXJzdFxyXG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5leHBvcnREdW1wKCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgUHVibGljIEFQSTogTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBFeHBsaWNpdGx5IGVuZCB0aGUgY3VycmVudCBzZXNzaW9uLlxyXG4gICAqIEZsdXNoZXMgYWxsIGJ1ZmZlcmVkIGV2ZW50cyBhbmQgbWFya3MgdGhlIHNlc3Npb24gYXMgZW5kZWQuXHJcbiAgICovXHJcbiAgYXN5bmMgZW5kU2Vzc2lvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5pbml0aWFsaXNlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZXNzaW9uLmVuZGVkQXQgPSBEYXRlLm5vdygpO1xyXG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgYWxsIHN0b3JlZCBzZXNzaW9ucyBmcm9tIEluZGV4ZWREQi5cclxuICAgKi9cclxuICBhc3luYyBjbGVhckhpc3RvcnkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmNsZWFyQWxsKCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgQnVmZmVyIG1hbmFnZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYW4gZXZlbnQgaW50byB0aGUgY2VudHJhbGlzZWQgYnVmZmVyLlxyXG4gICAqIFRyaWdnZXJzIGFuIGltbWVkaWF0ZSBmbHVzaCBpZiB0aGUgYnVmZmVyIGV4Y2VlZHMgdGhlIHRocmVzaG9sZC5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBwcml2YXRlIHB1c2hCdWZmZXJFdmVudChldmVudDogVWlCbGFja2JveEJ1ZmZlckV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmJ1ZmZlci5wdXNoKGV2ZW50KTtcclxuICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPj0gdGhpcy5jb25maWcuZmx1c2hUaHJlc2hvbGQpIHtcclxuICAgICAgdGhpcy5mbHVzaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmx1c2ggYnVmZmVyZWQgZXZlbnRzIHRvIEluZGV4ZWREQiBhc3luY2hyb25vdXNseS5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLmluaXRpYWxpc2VkIHx8IHRoaXMuYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIERyYWluIGJ1ZmZlclxyXG4gICAgY29uc3QgZXZlbnRzID0gdGhpcy5idWZmZXIuc3BsaWNlKDApO1xyXG5cclxuICAgIC8vIEFwcGx5IHN0ZXAgZXZlbnRzIHRvIHRoZSBzZXNzaW9uXHJcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xyXG4gICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ3N0ZXAnKSB7XHJcbiAgICAgICAgLy8gU3RlcHMgYXJlIGFscmVhZHkgcHVzaGVkIGluIHJlYWwtdGltZTsgZW5zdXJlIHRoZXkncmUgaW4gdGhlIHNlc3Npb25cclxuICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbi5zdGVwcy5pbmNsdWRlcyhldmVudC5wYXlsb2FkKSkge1xyXG4gICAgICAgICAgdGhpcy5zZXNzaW9uLnN0ZXBzLnB1c2goZXZlbnQucGF5bG9hZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIEFjdGlvbnMsIGZvcm1FdmVudHMsIGh0dHBDYWxscyBhcmUgYWxyZWFkeSBwdXNoZWQgaW4gcmVhbC10aW1lXHJcbiAgICAgIC8vIHRvIHRoZSBpbi1tZW1vcnkgc2Vzc2lvbiBieSB0cmFja0FjdGlvbi90cmFja0Zvcm1FdmVudC90cmFja0h0dHBDYWxsXHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2F2ZSB0aGUgZnVsbCBzZXNzaW9uIHNuYXBzaG90XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2Uuc2F2ZVNlc3Npb24odGhpcy5zZXNzaW9uKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gc3RvcmFnZSBlcnJvciDigJQgcmUtZW5xdWV1ZSBldmVudHMgZm9yIG5leHQgZmx1c2hcclxuICAgICAgY29uc29sZS53YXJuKCdbVWlCbGFja2JveF0gU3RvcmFnZSBmbHVzaCBmYWlsZWQ6JywgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgVXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogR2VuZXJhdGUgYSBVVUlEIHY0LiAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVVdWlkKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcclxuICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XHJcbiAgICB9XHJcbiAgICAvLyBGYWxsYmFjayBmb3Igb2xkZXIgYnJvd3NlcnNcclxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XHJcbiAgICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDA7XHJcbiAgICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4O1xyXG4gICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBDbGVhbnVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmZsdXNoVGltZXJJZCAhPT0gbnVsbCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMuZmx1c2hUaW1lcklkKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5iZWZvcmVVbmxvYWRIYW5kbGVyKSB7XHJcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLmJlZm9yZVVubG9hZEhhbmRsZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZpbmFsIGZsdXNoXHJcbiAgICB2b2lkIHRoaXMuZmx1c2goKTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - Root singleton (`providedIn: 'root'`)
|
|
8
8
|
* - On first inject: generates fingerprint, creates session, subscribes to Router events
|
|
9
9
|
* - Centralised in-memory buffer with periodic/threshold-based flush to IndexedDB
|
|
10
|
-
* - `window:beforeunload` triggers a final
|
|
10
|
+
* - `window:beforeunload` triggers a final best-effort async flush
|
|
11
11
|
*/
|
|
12
12
|
import { Injectable, inject, PLATFORM_ID, NgZone, } from '@angular/core';
|
|
13
13
|
import { isPlatformBrowser } from '@angular/common';
|
|
@@ -97,8 +97,11 @@ export class UiBlackboxService {
|
|
|
97
97
|
// Setup periodic flush (outside Angular zone to avoid triggering CD)
|
|
98
98
|
this.zone.runOutsideAngular(() => {
|
|
99
99
|
this.flushTimerId = setInterval(() => this.flush(), this.config.flushIntervalMs);
|
|
100
|
-
//
|
|
101
|
-
this.beforeUnloadHandler = () =>
|
|
100
|
+
// Best-effort flush on tab close (IndexedDB is async, no sync fallback)
|
|
101
|
+
this.beforeUnloadHandler = () => {
|
|
102
|
+
this.session.endedAt = Date.now();
|
|
103
|
+
void this.flush();
|
|
104
|
+
};
|
|
102
105
|
window.addEventListener('beforeunload', this.beforeUnloadHandler);
|
|
103
106
|
});
|
|
104
107
|
this.initialised = true;
|
|
@@ -284,58 +287,6 @@ export class UiBlackboxService {
|
|
|
284
287
|
console.warn('[UiBlackbox] Storage flush failed:', e);
|
|
285
288
|
}
|
|
286
289
|
}
|
|
287
|
-
/**
|
|
288
|
-
* Synchronous flush for `beforeunload`.
|
|
289
|
-
* Falls back to a best-effort approach since IndexedDB is async.
|
|
290
|
-
* @internal
|
|
291
|
-
*/
|
|
292
|
-
flushSync() {
|
|
293
|
-
if (!this.initialised)
|
|
294
|
-
return;
|
|
295
|
-
this.session.endedAt = Date.now();
|
|
296
|
-
// Use sendBeacon-like approach: serialise session to localStorage
|
|
297
|
-
// as a fallback that can be recovered on next load.
|
|
298
|
-
// The proper IndexedDB flush is async and may not complete on unload.
|
|
299
|
-
try {
|
|
300
|
-
const key = `__ui_bb_pending_${this.session.sessionId}`;
|
|
301
|
-
const data = JSON.stringify(this.session);
|
|
302
|
-
localStorage.setItem(key, data);
|
|
303
|
-
}
|
|
304
|
-
catch {
|
|
305
|
-
// Best effort — quota may be exceeded
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
// ─── Pending session recovery ──────────────────────────────────────
|
|
309
|
-
/**
|
|
310
|
-
* Recover sessions that were saved to localStorage during `beforeunload`
|
|
311
|
-
* and persist them to IndexedDB. Called on next service init.
|
|
312
|
-
* @internal
|
|
313
|
-
*/
|
|
314
|
-
async recoverPendingSessions() {
|
|
315
|
-
if (!isPlatformBrowser(this.platformId))
|
|
316
|
-
return;
|
|
317
|
-
const prefix = '__ui_bb_pending_';
|
|
318
|
-
const keys = [];
|
|
319
|
-
for (let i = 0; i < localStorage.length; i++) {
|
|
320
|
-
const key = localStorage.key(i);
|
|
321
|
-
if (key?.startsWith(prefix)) {
|
|
322
|
-
keys.push(key);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
for (const key of keys) {
|
|
326
|
-
try {
|
|
327
|
-
const data = localStorage.getItem(key);
|
|
328
|
-
if (data) {
|
|
329
|
-
const session = JSON.parse(data);
|
|
330
|
-
await this.storage.saveSession(session);
|
|
331
|
-
}
|
|
332
|
-
localStorage.removeItem(key);
|
|
333
|
-
}
|
|
334
|
-
catch {
|
|
335
|
-
localStorage.removeItem(key);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
290
|
// ─── Utilities ─────────────────────────────────────────────────────
|
|
340
291
|
/** Generate a UUID v4. */
|
|
341
292
|
generateUuid() {
|
|
@@ -360,7 +311,7 @@ export class UiBlackboxService {
|
|
|
360
311
|
window.removeEventListener('beforeunload', this.beforeUnloadHandler);
|
|
361
312
|
}
|
|
362
313
|
// Final flush
|
|
363
|
-
this.
|
|
314
|
+
void this.flush();
|
|
364
315
|
}
|
|
365
316
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiBlackboxService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
366
317
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiBlackboxService, providedIn: 'root' }); }
|
|
@@ -369,4 +320,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
369
320
|
type: Injectable,
|
|
370
321
|
args: [{ providedIn: 'root' }]
|
|
371
322
|
}], ctorParameters: () => [] });
|
|
372
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxhY2tib3guc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXVpLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvYmxhY2tib3gvYmxhY2tib3guc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUNMLFVBQVUsRUFDVixNQUFNLEVBQ04sV0FBVyxFQUVYLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBU0wsb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBRXRFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQW9CNUI7UUFuQmlCLGVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixTQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLGdCQUFXLEdBQUcsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDbkQsWUFBTyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRTNDLGFBQVEsR0FBRyxJQUFJLE9B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QyxtQkFBbUIsRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVELGNBQWM7UUFDZCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQzsrR0EzWFUsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FESixNQUFNOzs0RkFDbkIsaUJBQWlCO2tCQUQ3QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAbW9kdWxlIG5nLXVpLXN5c3RlbS9ibGFja2JveFxyXG4gKiBDb3JlIEJsYWNrQm94IG9ic2VydmFiaWxpdHkgc2VydmljZSDigJQgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHNlc3Npb25cclxuICogcmVjb3JkaW5nLCBldmVudCBidWZmZXJpbmcsIGFuZCBleHBvcnQuXHJcbiAqXHJcbiAqIEFyY2hpdGVjdHVyZTpcclxuICogLSBSb290IHNpbmdsZXRvbiAoYHByb3ZpZGVkSW46ICdyb290J2ApXHJcbiAqIC0gT24gZmlyc3QgaW5qZWN0OiBnZW5lcmF0ZXMgZmluZ2VycHJpbnQsIGNyZWF0ZXMgc2Vzc2lvbiwgc3Vic2NyaWJlcyB0byBSb3V0ZXIgZXZlbnRzXHJcbiAqIC0gQ2VudHJhbGlzZWQgaW4tbWVtb3J5IGJ1ZmZlciB3aXRoIHBlcmlvZGljL3RocmVzaG9sZC1iYXNlZCBmbHVzaCB0byBJbmRleGVkREJcclxuICogLSBgd2luZG93OmJlZm9yZXVubG9hZGAgdHJpZ2dlcnMgYSBmaW5hbCBzeW5jaHJvbm91cyBmbHVzaFxyXG4gKi9cclxuXHJcbmltcG9ydCB7XHJcbiAgSW5qZWN0YWJsZSxcclxuICBpbmplY3QsXHJcbiAgUExBVEZPUk1fSUQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE5nWm9uZSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBVaUJsYWNrYm94Q29uZmlnLFxyXG4gIFVpQmxhY2tib3hGb3JtVHJhY2tpbmdDb25maWcsXHJcbiAgVWlCbGFja2JveFNlc3Npb24sXHJcbiAgVWlCbGFja2JveFN0ZXAsXHJcbiAgVWlCbGFja2JveEFjdGlvbixcclxuICBVaUJsYWNrYm94Rm9ybUV2ZW50LFxyXG4gIFVpQmxhY2tib3hIdHRwQ2FsbCxcclxuICBVaUJsYWNrYm94QnVmZmVyRXZlbnQsXHJcbiAgVUlfQkxBQ0tCT1hfREVGQVVMVFMsXHJcbn0gZnJvbSAnLi9ibGFja2JveC50eXBlcyc7XHJcbmltcG9ydCB7IFVpQmxhY2tib3hGaW5nZXJwcmludFNlcnZpY2UgfSBmcm9tICcuL2JsYWNrYm94LWZpbmdlcnByaW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVaUJsYWNrYm94U3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL2JsYWNrYm94LXN0b3JhZ2Uuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogQ2VudHJhbCBCbGFja0JveCBvYnNlcnZhYmlsaXR5IHNlcnZpY2UuXHJcbiAqXHJcbiAqIFJlY29yZHMgbmF2aWdhdGlvbiwgVUkgaW50ZXJhY3Rpb25zLCBmb3JtIGV2ZW50cywgYW5kIEhUVFAgY2FsbHNcclxuICogaW50byBjb21wcmVzc2VkIHNlc3Npb25zIHN0b3JlZCBpbiBJbmRleGVkREIuXHJcbiAqXHJcbiAqIEB1c2FnZU5vdGVzXHJcbiAqIFRoZSBzZXJ2aWNlIGFjdGl2YXRlcyBhdXRvbWF0aWNhbGx5IHdoZW4gaW5qZWN0ZWQuIFByb3ZpZGUgaXQgYXQgcm9vdCBsZXZlbFxyXG4gKiBhbmQgaXQgd2lsbCBzdGFydCByZWNvcmRpbmcgaW1tZWRpYXRlbHkuXHJcbiAqXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogLy8gYXBwLmNvbmZpZy50cyDigJQganVzdCBpbXBvcnRpbmcgdGhlIHNlcnZpY2UgaXMgZW5vdWdoXHJcbiAqIGltcG9ydCB7IFVpQmxhY2tib3hTZXJ2aWNlIH0gZnJvbSAnQGduZ2dsbi9uZy11aS1zeXN0ZW0nO1xyXG4gKlxyXG4gKiBleHBvcnQgY29uc3QgYXBwQ29uZmlnOiBBcHBsaWNhdGlvbkNvbmZpZyA9IHtcclxuICogICBwcm92aWRlcnM6IFtcclxuICogICAgIC8vIFRoZSBzZXJ2aWNlIGlzIHByb3ZpZGVkSW46ICdyb290Jywgc28gaXQncyBhdXRvLXByb3ZpZGVkLlxyXG4gKiAgICAgLy8gVG8gZm9yY2UgZWFnZXIgaW5pdGlhbGlzYXRpb246XHJcbiAqICAgICB7IHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUiwgdXNlRmFjdG9yeTogKCkgPT4gKCkgPT4gaW5qZWN0KFVpQmxhY2tib3hTZXJ2aWNlKSwgbXVsdGk6IHRydWUgfSxcclxuICogICBdLFxyXG4gKiB9O1xyXG4gKiBgYGBcclxuICovXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBVaUJsYWNrYm94U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybUlkID0gaW5qZWN0KFBMQVRGT1JNX0lEKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgem9uZSA9IGluamVjdChOZ1pvbmUpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZmluZ2VycHJpbnQgPSBpbmplY3QoVWlCbGFja2JveEZpbmdlcnByaW50U2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlID0gaW5qZWN0KFVpQmxhY2tib3hTdG9yYWdlU2VydmljZSk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByaXZhdGUgY29uZmlnOiBVaUJsYWNrYm94Q29uZmlnID0geyAuLi5VSV9CTEFDS0JPWF9ERUZBVUxUUyB9O1xyXG5cclxuICAvLyDilIDilIDilIAgU2Vzc2lvbiBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICBwcml2YXRlIHNlc3Npb24hOiBVaUJsYWNrYm94U2Vzc2lvbjtcclxuICBwcml2YXRlIGN1cnJlbnRTdGVwOiBVaUJsYWNrYm94U3RlcCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgaW5pdGlhbGlzZWQgPSBmYWxzZTtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIENlbnRyYWxpc2VkIGV2ZW50IGJ1ZmZlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICBwcml2YXRlIGJ1ZmZlcjogVWlCbGFja2JveEJ1ZmZlckV2ZW50W10gPSBbXTtcclxuICBwcml2YXRlIGZsdXNoVGltZXJJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBiZWZvcmVVbmxvYWRIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xyXG4gICAgICB0aGlzLmluaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBJbml0aWFsaXNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gR2VuZXJhdGUgc2Vzc2lvbiBJRFxyXG4gICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5nZW5lcmF0ZVV1aWQoKTtcclxuICAgIGNvbnN0IGZwID0gYXdhaXQgdGhpcy5maW5nZXJwcmludC5nZXRGaW5nZXJwcmludCgpO1xyXG5cclxuICAgIHRoaXMuc2Vzc2lvbiA9IHtcclxuICAgICAgc2Vzc2lvbklkLFxyXG4gICAgICBmaW5nZXJwcmludDogZnAsXHJcbiAgICAgIHN0YXJ0ZWRBdDogRGF0ZS5ub3coKSxcclxuICAgICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxyXG4gICAgICBzdGVwczogW10sXHJcbiAgICAgIGZvcm1FdmVudHM6IFtdLFxyXG4gICAgICBjYWxsczogW10sXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIENyZWF0ZSBpbml0aWFsIHN0ZXAgZnJvbSBjdXJyZW50IFVSTFxyXG4gICAgdGhpcy5jdXJyZW50U3RlcCA9IHtcclxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICByb3V0ZTogdGhpcy5yb3V0ZXIudXJsLFxyXG4gICAgICBhY3Rpb25zOiBbXSxcclxuICAgIH07XHJcbiAgICB0aGlzLnNlc3Npb24uc3RlcHMucHVzaCh0aGlzLmN1cnJlbnRTdGVwKTtcclxuXHJcbiAgICAvLyBTdWJzY3JpYmUgdG8gcm91dGVyIG5hdmlnYXRpb25cclxuICAgIHRoaXMucm91dGVyLmV2ZW50c1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoKGUpOiBlIGlzIE5hdmlnYXRpb25FbmQgPT4gZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzUm91dGUgPSB0aGlzLmN1cnJlbnRTdGVwPy5yb3V0ZTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwID0ge1xyXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgcm91dGU6IGV2ZW50LnVybEFmdGVyUmVkaXJlY3RzLFxyXG4gICAgICAgICAgcHJldmlvdXNSb3V0ZSxcclxuICAgICAgICAgIGFjdGlvbnM6IFtdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5wdXNoQnVmZmVyRXZlbnQoeyBraW5kOiAnc3RlcCcsIHBheWxvYWQ6IHRoaXMuY3VycmVudFN0ZXAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIFNldHVwIHBlcmlvZGljIGZsdXNoIChvdXRzaWRlIEFuZ3VsYXIgem9uZSB0byBhdm9pZCB0cmlnZ2VyaW5nIENEKVxyXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgdGhpcy5mbHVzaFRpbWVySWQgPSBzZXRJbnRlcnZhbChcclxuICAgICAgICAoKSA9PiB0aGlzLmZsdXNoKCksXHJcbiAgICAgICAgdGhpcy5jb25maWcuZmx1c2hJbnRlcnZhbE1zLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gRmluYWwgZmx1c2ggb24gdGFiIGNsb3NlXHJcbiAgICAgIHRoaXMuYmVmb3JlVW5sb2FkSGFuZGxlciA9ICgpID0+IHRoaXMuZmx1c2hTeW5jKCk7XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLmJlZm9yZVVubG9hZEhhbmRsZXIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5pbml0aWFsaXNlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgUHVibGljIEFQSTogQ29uZmlndXJhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBCbGFja0JveCBjb25maWd1cmF0aW9uLlxyXG4gICAqIENhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWU7IGNoYW5nZXMgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkuXHJcbiAgICovXHJcbiAgY29uZmlndXJlKGNvbmZpZzogUGFydGlhbDxPbWl0PFVpQmxhY2tib3hDb25maWcsICdmb3JtVHJhY2tpbmcnPj4gJiB7IGZvcm1UcmFja2luZz86IFBhcnRpYWw8VWlCbGFja2JveEZvcm1UcmFja2luZ0NvbmZpZz4gfSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25maWcgPSB7XHJcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxyXG4gICAgICAuLi5jb25maWcsXHJcbiAgICAgIGZvcm1UcmFja2luZzoge1xyXG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmZvcm1UcmFja2luZyxcclxuICAgICAgICAuLi4oY29uZmlnLmZvcm1UcmFja2luZyA/PyB7fSksXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zdG9yYWdlLnNldE1heFN0b3JhZ2VNYih0aGlzLmNvbmZpZy5tYXhTdG9yYWdlTWIpO1xyXG5cclxuICAgIC8vIFJlc3RhcnQgZmx1c2ggdGltZXIgd2l0aCBuZXcgaW50ZXJ2YWxcclxuICAgIGlmICh0aGlzLmZsdXNoVGltZXJJZCAhPT0gbnVsbCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMuZmx1c2hUaW1lcklkKTtcclxuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICB0aGlzLmZsdXNoVGltZXJJZCA9IHNldEludGVydmFsKFxyXG4gICAgICAgICAgKCkgPT4gdGhpcy5mbHVzaCgpLFxyXG4gICAgICAgICAgdGhpcy5jb25maWcuZmx1c2hJbnRlcnZhbE1zLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiAocmVhZG9ubHkgc25hcHNob3QpLiAqL1xyXG4gIGdldENvbmZpZygpOiBSZWFkb25seTxVaUJsYWNrYm94Q29uZmlnPiB7XHJcbiAgICByZXR1cm4geyAuLi50aGlzLmNvbmZpZyB9O1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIFB1YmxpYyBBUEk6IFRyYWNraW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBNYW51YWxseSB0cmFjayBhIFVJIGFjdGlvbiAoY2xpY2spLlxyXG4gICAqXHJcbiAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgYFVpQnV0dG9uQXJlYUNvbXBvbmVudGAgYW5kIHRoZSBgW3VpVHJhY2tdYCBkaXJlY3RpdmUuXHJcbiAgICogQ2FuIGFsc28gYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgZm9yIGN1c3RvbSBpbnRlcmFjdGlvbnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gdHJhY2tJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBhY3Rpb24gKGUuZy4gYnV0dG9uIGlkLCBsaW5rIG5hbWUpLlxyXG4gICAqIEBwYXJhbSBtZXRhIC0gT3B0aW9uYWwgbWV0YWRhdGE6IGB0YWdgLCBgdGV4dGAsIGBpZGAgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICovXHJcbiAgdHJhY2tBY3Rpb24oXHJcbiAgICB0cmFja0lkOiBzdHJpbmcsXHJcbiAgICBtZXRhPzogeyB0YWc/OiBzdHJpbmc7IHRleHQ/OiBzdHJpbmc7IGlkPzogc3RyaW5nIH0sXHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGlzZWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBhY3Rpb246IFVpQmxhY2tib3hBY3Rpb24gPSB7XHJcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcclxuICAgICAgdHlwZTogJ2NsaWNrJyxcclxuICAgICAgdGFyZ2V0OiB7XHJcbiAgICAgICAgdGFnOiBtZXRhPy50YWcgPz8gJ3Vua25vd24nLFxyXG4gICAgICAgIGlkOiBtZXRhPy5pZCxcclxuICAgICAgICB0cmFja0lkLFxyXG4gICAgICAgIHRleHQ6IG1ldGE/LnRleHQ/LnN1YnN0cmluZygwLCA1MCksXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEFkZCB0byBjdXJyZW50IHN0ZXAgaW1tZWRpYXRlbHkgKGZvciBpbi1tZW1vcnkgc2Vzc2lvbiBhY2Nlc3MpXHJcbiAgICB0aGlzLmN1cnJlbnRTdGVwPy5hY3Rpb25zLnB1c2goYWN0aW9uKTtcclxuXHJcbiAgICAvLyBBbHNvIHB1c2ggdG8gYnVmZmVyIGZvciBwZXJzaXN0ZW5jZVxyXG4gICAgdGhpcy5wdXNoQnVmZmVyRXZlbnQoe1xyXG4gICAgICBraW5kOiAnYWN0aW9uJyxcclxuICAgICAgcGF5bG9hZDogeyAuLi5hY3Rpb24sIHJvdXRlOiB0aGlzLmN1cnJlbnRTdGVwPy5yb3V0ZSA/PyB0aGlzLnJvdXRlci51cmwgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2sgYSBmb3JtIGludGVyYWN0aW9uIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgYFVpRm9ybUJ1aWxkZXJDb21wb25lbnRgIHdoZW4gdGhlIEJsYWNrQm94XHJcbiAgICogc2VydmljZSBpcyBhdmFpbGFibGUuXHJcbiAgICovXHJcbiAgdHJhY2tGb3JtRXZlbnQoZXZlbnQ6IFVpQmxhY2tib3hGb3JtRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pbml0aWFsaXNlZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc2Vzc2lvbi5mb3JtRXZlbnRzLnB1c2goZXZlbnQpO1xyXG4gICAgdGhpcy5wdXNoQnVmZmVyRXZlbnQoeyBraW5kOiAnZm9ybUV2ZW50JywgcGF5bG9hZDogZXZlbnQgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFjayBhbiBpbnRlcmNlcHRlZCBIVFRQIGNhbGwuXHJcbiAgICogQ2FsbGVkIGJ5IGBVaUJsYWNrYm94SW50ZXJjZXB0b3JgLlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHRyYWNrSHR0cENhbGwoY2FsbDogVWlCbGFja2JveEh0dHBDYWxsKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGlzZWQpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnNlc3Npb24uY2FsbHMucHVzaChjYWxsKTtcclxuICAgIHRoaXMucHVzaEJ1ZmZlckV2ZW50KHsga2luZDogJ2h0dHBDYWxsJywgcGF5bG9hZDogY2FsbCB9KTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBQdWJsaWMgQVBJOiBTZXNzaW9uIGFjY2VzcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBpbi1tZW1vcnkgc2Vzc2lvbiAobGl2ZSwgbm90IHlldCBmbHVzaGVkKS5cclxuICAgKiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBvciByZWFsLXRpbWUgaW5zcGVjdGlvbi5cclxuICAgKi9cclxuICBnZXRDdXJyZW50U2Vzc2lvbigpOiBVaUJsYWNrYm94U2Vzc2lvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgYWxsIHNlc3Npb25zIHN0b3JlZCBpbiBJbmRleGVkREIgKGRlY29tcHJlc3NlZCkuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0U2Vzc2lvbkhpc3RvcnkoKTogUHJvbWlzZTxVaUJsYWNrYm94U2Vzc2lvbltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldEFsbFNlc3Npb25zKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBzZXNzaW9ucyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlIGZpbmdlcnByaW50LlxyXG4gICAqL1xyXG4gIGFzeW5jIGdldFNlc3Npb25zRm9yRGV2aWNlKCk6IFByb21pc2U8VWlCbGFja2JveFNlc3Npb25bXT4ge1xyXG4gICAgY29uc3QgZnAgPSBhd2FpdCB0aGlzLmZpbmdlcnByaW50LmdldEZpbmdlcnByaW50KCk7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldFNlc3Npb25zQnlGaW5nZXJwcmludChmcCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgUHVibGljIEFQSTogRXhwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBFeHBvcnQgYWxsIHNlc3Npb25zIGFzIGEgZG93bmxvYWRhYmxlIEpTT05MIEJsb2IuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyBBIEJsb2IgY29udGFpbmluZyBKU09OTCBkYXRhIChvbmUgc2Vzc2lvbiBwZXIgbGluZSkuXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBjb25zdCBibG9iID0gYXdhaXQgYmxhY2tib3guZXhwb3J0U2Vzc2lvbnMoKTtcclxuICAgKiBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAqIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICogYS5ocmVmID0gdXJsO1xyXG4gICAqIGEuZG93bmxvYWQgPSAnYmxhY2tib3gtc2Vzc2lvbnMuanNvbmwnO1xyXG4gICAqIGEuY2xpY2soKTtcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBhc3luYyBleHBvcnRTZXNzaW9ucygpOiBQcm9taXNlPEJsb2I+IHtcclxuICAgIC8vIEZsdXNoIGN1cnJlbnQgc2Vzc2lvbiBmaXJzdFxyXG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5leHBvcnREdW1wKCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgUHVibGljIEFQSTogTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBFeHBsaWNpdGx5IGVuZCB0aGUgY3VycmVudCBzZXNzaW9uLlxyXG4gICAqIEZsdXNoZXMgYWxsIGJ1ZmZlcmVkIGV2ZW50cyBhbmQgbWFya3MgdGhlIHNlc3Npb24gYXMgZW5kZWQuXHJcbiAgICovXHJcbiAgYXN5bmMgZW5kU2Vzc2lvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5pbml0aWFsaXNlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZXNzaW9uLmVuZGVkQXQgPSBEYXRlLm5vdygpO1xyXG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgYWxsIHN0b3JlZCBzZXNzaW9ucyBmcm9tIEluZGV4ZWREQi5cclxuICAgKi9cclxuICBhc3luYyBjbGVhckhpc3RvcnkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmNsZWFyQWxsKCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgQnVmZmVyIG1hbmFnZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYW4gZXZlbnQgaW50byB0aGUgY2VudHJhbGlzZWQgYnVmZmVyLlxyXG4gICAqIFRyaWdnZXJzIGFuIGltbWVkaWF0ZSBmbHVzaCBpZiB0aGUgYnVmZmVyIGV4Y2VlZHMgdGhlIHRocmVzaG9sZC5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBwcml2YXRlIHB1c2hCdWZmZXJFdmVudChldmVudDogVWlCbGFja2JveEJ1ZmZlckV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmJ1ZmZlci5wdXNoKGV2ZW50KTtcclxuICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPj0gdGhpcy5jb25maWcuZmx1c2hUaHJlc2hvbGQpIHtcclxuICAgICAgdGhpcy5mbHVzaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmx1c2ggYnVmZmVyZWQgZXZlbnRzIHRvIEluZGV4ZWREQiBhc3luY2hyb25vdXNseS5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLmluaXRpYWxpc2VkIHx8IHRoaXMuYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIERyYWluIGJ1ZmZlclxyXG4gICAgY29uc3QgZXZlbnRzID0gdGhpcy5idWZmZXIuc3BsaWNlKDApO1xyXG5cclxuICAgIC8vIEFwcGx5IHN0ZXAgZXZlbnRzIHRvIHRoZSBzZXNzaW9uXHJcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xyXG4gICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ3N0ZXAnKSB7XHJcbiAgICAgICAgLy8gU3RlcHMgYXJlIGFscmVhZHkgcHVzaGVkIGluIHJlYWwtdGltZTsgZW5zdXJlIHRoZXkncmUgaW4gdGhlIHNlc3Npb25cclxuICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbi5zdGVwcy5pbmNsdWRlcyhldmVudC5wYXlsb2FkKSkge1xyXG4gICAgICAgICAgdGhpcy5zZXNzaW9uLnN0ZXBzLnB1c2goZXZlbnQucGF5bG9hZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIEFjdGlvbnMsIGZvcm1FdmVudHMsIGh0dHBDYWxscyBhcmUgYWxyZWFkeSBwdXNoZWQgaW4gcmVhbC10aW1lXHJcbiAgICAgIC8vIHRvIHRoZSBpbi1tZW1vcnkgc2Vzc2lvbiBieSB0cmFja0FjdGlvbi90cmFja0Zvcm1FdmVudC90cmFja0h0dHBDYWxsXHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2F2ZSB0aGUgZnVsbCBzZXNzaW9uIHNuYXBzaG90XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2Uuc2F2ZVNlc3Npb24odGhpcy5zZXNzaW9uKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gc3RvcmFnZSBlcnJvciDigJQgcmUtZW5xdWV1ZSBldmVudHMgZm9yIG5leHQgZmx1c2hcclxuICAgICAgY29uc29sZS53YXJuKCdbVWlCbGFja2JveF0gU3RvcmFnZSBmbHVzaCBmYWlsZWQ6JywgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTeW5jaHJvbm91cyBmbHVzaCBmb3IgYGJlZm9yZXVubG9hZGAuXHJcbiAgICogRmFsbHMgYmFjayB0byBhIGJlc3QtZWZmb3J0IGFwcHJvYWNoIHNpbmNlIEluZGV4ZWREQiBpcyBhc3luYy5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBwcml2YXRlIGZsdXNoU3luYygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pbml0aWFsaXNlZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc2Vzc2lvbi5lbmRlZEF0ID0gRGF0ZS5ub3coKTtcclxuXHJcbiAgICAvLyBVc2Ugc2VuZEJlYWNvbi1saWtlIGFwcHJvYWNoOiBzZXJpYWxpc2Ugc2Vzc2lvbiB0byBsb2NhbFN0b3JhZ2VcclxuICAgIC8vIGFzIGEgZmFsbGJhY2sgdGhhdCBjYW4gYmUgcmVjb3ZlcmVkIG9uIG5leHQgbG9hZC5cclxuICAgIC8vIFRoZSBwcm9wZXIgSW5kZXhlZERCIGZsdXNoIGlzIGFzeW5jIGFuZCBtYXkgbm90IGNvbXBsZXRlIG9uIHVubG9hZC5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGtleSA9IGBfX3VpX2JiX3BlbmRpbmdfJHt0aGlzLnNlc3Npb24uc2Vzc2lvbklkfWA7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnNlc3Npb24pO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIGRhdGEpO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIC8vIEJlc3QgZWZmb3J0IOKAlCBxdW90YSBtYXkgYmUgZXhjZWVkZWRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBQZW5kaW5nIHNlc3Npb24gcmVjb3Zlcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKlxyXG4gICAqIFJlY292ZXIgc2Vzc2lvbnMgdGhhdCB3ZXJlIHNhdmVkIHRvIGxvY2FsU3RvcmFnZSBkdXJpbmcgYGJlZm9yZXVubG9hZGBcclxuICAgKiBhbmQgcGVyc2lzdCB0aGVtIHRvIEluZGV4ZWREQi4gQ2FsbGVkIG9uIG5leHQgc2VydmljZSBpbml0LlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgcmVjb3ZlclBlbmRpbmdTZXNzaW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHByZWZpeCA9ICdfX3VpX2JiX3BlbmRpbmdfJztcclxuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbFN0b3JhZ2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3Qga2V5ID0gbG9jYWxTdG9yYWdlLmtleShpKTtcclxuICAgICAgaWYgKGtleT8uc3RhcnRzV2l0aChwcmVmaXgpKSB7XHJcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgIGNvbnN0IHNlc3Npb246IFVpQmxhY2tib3hTZXNzaW9uID0gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5zYXZlU2Vzc2lvbihzZXNzaW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIFV0aWxpdGllcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIEdlbmVyYXRlIGEgVVVJRCB2NC4gKi9cclxuICBwcml2YXRlIGdlbmVyYXRlVXVpZCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEKSB7XHJcbiAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO1xyXG4gICAgfVxyXG4gICAgLy8gRmFsbGJhY2sgZm9yIG9sZGVyIGJyb3dzZXJzXHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCAoYykgPT4ge1xyXG4gICAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwO1xyXG4gICAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcclxuICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgQ2xlYW51cCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuXHJcbiAgICBpZiAodGhpcy5mbHVzaFRpbWVySWQgIT09IG51bGwpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmZsdXNoVGltZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYmVmb3JlVW5sb2FkSGFuZGxlcikge1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgdGhpcy5iZWZvcmVVbmxvYWRIYW5kbGVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGaW5hbCBmbHVzaFxyXG4gICAgdGhpcy5mbHVzaFN5bmMoKTtcclxuICB9XHJcbn1cclxuIl19
|
|
323
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxhY2tib3guc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXVpLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvYmxhY2tib3gvYmxhY2tib3guc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUNMLFVBQVUsRUFDVixNQUFNLEVBQ04sV0FBVyxFQUVYLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBU0wsb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBRXRFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQW9CNUI7UUFuQmlCLGVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixTQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLGdCQUFXLEdBQUcsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDbkQsWUFBTyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRTNDLGFBQVEsR0FBRyxJQUFJLE9B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IjpbIi8qKlxyXG4gKiBAbW9kdWxlIG5nLXVpLXN5c3RlbS9ibGFja2JveFxyXG4gKiBDb3JlIEJsYWNrQm94IG9ic2VydmFiaWxpdHkgc2VydmljZSDigJQgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHNlc3Npb25cclxuICogcmVjb3JkaW5nLCBldmVudCBidWZmZXJpbmcsIGFuZCBleHBvcnQuXHJcbiAqXHJcbiAqIEFyY2hpdGVjdHVyZTpcclxuICogLSBSb290IHNpbmdsZXRvbiAoYHByb3ZpZGVkSW46ICdyb290J2ApXHJcbiAqIC0gT24gZmlyc3QgaW5qZWN0OiBnZW5lcmF0ZXMgZmluZ2VycHJpbnQsIGNyZWF0ZXMgc2Vzc2lvbiwgc3Vic2NyaWJlcyB0byBSb3V0ZXIgZXZlbnRzXHJcbiAqIC0gQ2VudHJhbGlzZWQgaW4tbWVtb3J5IGJ1ZmZlciB3aXRoIHBlcmlvZGljL3RocmVzaG9sZC1iYXNlZCBmbHVzaCB0byBJbmRleGVkREJcclxuICogLSBgd2luZG93OmJlZm9yZXVubG9hZGAgdHJpZ2dlcnMgYSBmaW5hbCBiZXN0LWVmZm9ydCBhc3luYyBmbHVzaFxyXG4gKi9cclxuXHJcbmltcG9ydCB7XHJcbiAgSW5qZWN0YWJsZSxcclxuICBpbmplY3QsXHJcbiAgUExBVEZPUk1fSUQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE5nWm9uZSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBVaUJsYWNrYm94Q29uZmlnLFxyXG4gIFVpQmxhY2tib3hGb3JtVHJhY2tpbmdDb25maWcsXHJcbiAgVWlCbGFja2JveFNlc3Npb24sXHJcbiAgVWlCbGFja2JveFN0ZXAsXHJcbiAgVWlCbGFja2JveEFjdGlvbixcclxuICBVaUJsYWNrYm94Rm9ybUV2ZW50LFxyXG4gIFVpQmxhY2tib3hIdHRwQ2FsbCxcclxuICBVaUJsYWNrYm94QnVmZmVyRXZlbnQsXHJcbiAgVUlfQkxBQ0tCT1hfREVGQVVMVFMsXHJcbn0gZnJvbSAnLi9ibGFja2JveC50eXBlcyc7XHJcbmltcG9ydCB7IFVpQmxhY2tib3hGaW5nZXJwcmludFNlcnZpY2UgfSBmcm9tICcuL2JsYWNrYm94LWZpbmdlcnByaW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVaUJsYWNrYm94U3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL2JsYWNrYm94LXN0b3JhZ2Uuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogQ2VudHJhbCBCbGFja0JveCBvYnNlcnZhYmlsaXR5IHNlcnZpY2UuXHJcbiAqXHJcbiAqIFJlY29yZHMgbmF2aWdhdGlvbiwgVUkgaW50ZXJhY3Rpb25zLCBmb3JtIGV2ZW50cywgYW5kIEhUVFAgY2FsbHNcclxuICogaW50byBjb21wcmVzc2VkIHNlc3Npb25zIHN0b3JlZCBpbiBJbmRleGVkREIuXHJcbiAqXHJcbiAqIEB1c2FnZU5vdGVzXHJcbiAqIFRoZSBzZXJ2aWNlIGFjdGl2YXRlcyBhdXRvbWF0aWNhbGx5IHdoZW4gaW5qZWN0ZWQuIFByb3ZpZGUgaXQgYXQgcm9vdCBsZXZlbFxyXG4gKiBhbmQgaXQgd2lsbCBzdGFydCByZWNvcmRpbmcgaW1tZWRpYXRlbHkuXHJcbiAqXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogLy8gYXBwLmNvbmZpZy50cyDigJQganVzdCBpbXBvcnRpbmcgdGhlIHNlcnZpY2UgaXMgZW5vdWdoXHJcbiAqIGltcG9ydCB7IFVpQmxhY2tib3hTZXJ2aWNlIH0gZnJvbSAnQGduZ2dsbi9uZy11aS1zeXN0ZW0nO1xyXG4gKlxyXG4gKiBleHBvcnQgY29uc3QgYXBwQ29uZmlnOiBBcHBsaWNhdGlvbkNvbmZpZyA9IHtcclxuICogICBwcm92aWRlcnM6IFtcclxuICogICAgIC8vIFRoZSBzZXJ2aWNlIGlzIHByb3ZpZGVkSW46ICdyb290Jywgc28gaXQncyBhdXRvLXByb3ZpZGVkLlxyXG4gKiAgICAgLy8gVG8gZm9yY2UgZWFnZXIgaW5pdGlhbGlzYXRpb246XHJcbiAqICAgICB7IHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUiwgdXNlRmFjdG9yeTogKCkgPT4gKCkgPT4gaW5qZWN0KFVpQmxhY2tib3hTZXJ2aWNlKSwgbXVsdGk6IHRydWUgfSxcclxuICogICBdLFxyXG4gKiB9O1xyXG4gKiBgYGBcclxuICovXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBVaUJsYWNrYm94U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybUlkID0gaW5qZWN0KFBMQVRGT1JNX0lEKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgem9uZSA9IGluamVjdChOZ1pvbmUpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZmluZ2VycHJpbnQgPSBpbmplY3QoVWlCbGFja2JveEZpbmdlcnByaW50U2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlID0gaW5qZWN0KFVpQmxhY2tib3hTdG9yYWdlU2VydmljZSk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByaXZhdGUgY29uZmlnOiBVaUJsYWNrYm94Q29uZmlnID0geyAuLi5VSV9CTEFDS0JPWF9ERUZBVUxUUyB9O1xyXG5cclxuICAvLyDilIDilIDilIAgU2Vzc2lvbiBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICBwcml2YXRlIHNlc3Npb24hOiBVaUJsYWNrYm94U2Vzc2lvbjtcclxuICBwcml2YXRlIGN1cnJlbnRTdGVwOiBVaUJsYWNrYm94U3RlcCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgaW5pdGlhbGlzZWQgPSBmYWxzZTtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIENlbnRyYWxpc2VkIGV2ZW50IGJ1ZmZlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICBwcml2YXRlIGJ1ZmZlcjogVWlCbGFja2JveEJ1ZmZlckV2ZW50W10gPSBbXTtcclxuICBwcml2YXRlIGZsdXNoVGltZXJJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBiZWZvcmVVbmxvYWRIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xyXG4gICAgICB0aGlzLmluaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBJbml0aWFsaXNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gR2VuZXJhdGUgc2Vzc2lvbiBJRFxyXG4gICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5nZW5lcmF0ZVV1aWQoKTtcclxuICAgIGNvbnN0IGZwID0gYXdhaXQgdGhpcy5maW5nZXJwcmludC5nZXRGaW5nZXJwcmludCgpO1xyXG5cclxuICAgIHRoaXMuc2Vzc2lvbiA9IHtcclxuICAgICAgc2Vzc2lvbklkLFxyXG4gICAgICBmaW5nZXJwcmludDogZnAsXHJcbiAgICAgIHN0YXJ0ZWRBdDogRGF0ZS5ub3coKSxcclxuICAgICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxyXG4gICAgICBzdGVwczogW10sXHJcbiAgICAgIGZvcm1FdmVudHM6IFtdLFxyXG4gICAgICBjYWxsczogW10sXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIENyZWF0ZSBpbml0aWFsIHN0ZXAgZnJvbSBjdXJyZW50IFVSTFxyXG4gICAgdGhpcy5jdXJyZW50U3RlcCA9IHtcclxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICByb3V0ZTogdGhpcy5yb3V0ZXIudXJsLFxyXG4gICAgICBhY3Rpb25zOiBbXSxcclxuICAgIH07XHJcbiAgICB0aGlzLnNlc3Npb24uc3RlcHMucHVzaCh0aGlzLmN1cnJlbnRTdGVwKTtcclxuXHJcbiAgICAvLyBTdWJzY3JpYmUgdG8gcm91dGVyIG5hdmlnYXRpb25cclxuICAgIHRoaXMucm91dGVyLmV2ZW50c1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoKGUpOiBlIGlzIE5hdmlnYXRpb25FbmQgPT4gZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzUm91dGUgPSB0aGlzLmN1cnJlbnRTdGVwPy5yb3V0ZTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwID0ge1xyXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgcm91dGU6IGV2ZW50LnVybEFmdGVyUmVkaXJlY3RzLFxyXG4gICAgICAgICAgcHJldmlvdXNSb3V0ZSxcclxuICAgICAgICAgIGFjdGlvbnM6IFtdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5wdXNoQnVmZmVyRXZlbnQoeyBraW5kOiAnc3RlcCcsIHBheWxvYWQ6IHRoaXMuY3VycmVudFN0ZXAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIFNldHVwIHBlcmlvZGljIGZsdXNoIChvdXRzaWRlIEFuZ3VsYXIgem9uZSB0byBhdm9pZCB0cmlnZ2VyaW5nIENEKVxyXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgdGhpcy5mbHVzaFRpbWVySWQgPSBzZXRJbnRlcnZhbChcclxuICAgICAgICAoKSA9PiB0aGlzLmZsdXNoKCksXHJcbiAgICAgICAgdGhpcy5jb25maWcuZmx1c2hJbnRlcnZhbE1zLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gQmVzdC1lZmZvcnQgZmx1c2ggb24gdGFiIGNsb3NlIChJbmRleGVkREIgaXMgYXN5bmMsIG5vIHN5bmMgZmFsbGJhY2spXHJcbiAgICAgIHRoaXMuYmVmb3JlVW5sb2FkSGFuZGxlciA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLnNlc3Npb24uZW5kZWRBdCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgdm9pZCB0aGlzLmZsdXNoKCk7XHJcbiAgICAgIH07XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLmJlZm9yZVVubG9hZEhhbmRsZXIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5pbml0aWFsaXNlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgUHVibGljIEFQSTogQ29uZmlndXJhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBCbGFja0JveCBjb25maWd1cmF0aW9uLlxyXG4gICAqIENhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWU7IGNoYW5nZXMgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkuXHJcbiAgICovXHJcbiAgY29uZmlndXJlKGNvbmZpZzogUGFydGlhbDxPbWl0PFVpQmxhY2tib3hDb25maWcsICdmb3JtVHJhY2tpbmcnPj4gJiB7IGZvcm1UcmFja2luZz86IFBhcnRpYWw8VWlCbGFja2JveEZvcm1UcmFja2luZ0NvbmZpZz4gfSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25maWcgPSB7XHJcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxyXG4gICAgICAuLi5jb25maWcsXHJcbiAgICAgIGZvcm1UcmFja2luZzoge1xyXG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmZvcm1UcmFja2luZyxcclxuICAgICAgICAuLi4oY29uZmlnLmZvcm1UcmFja2luZyA/PyB7fSksXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zdG9yYWdlLnNldE1heFN0b3JhZ2VNYih0aGlzLmNvbmZpZy5tYXhTdG9yYWdlTWIpO1xyXG5cclxuICAgIC8vIFJlc3RhcnQgZmx1c2ggdGltZXIgd2l0aCBuZXcgaW50ZXJ2YWxcclxuICAgIGlmICh0aGlzLmZsdXNoVGltZXJJZCAhPT0gbnVsbCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMuZmx1c2hUaW1lcklkKTtcclxuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICB0aGlzLmZsdXNoVGltZXJJZCA9IHNldEludGVydmFsKFxyXG4gICAgICAgICAgKCkgPT4gdGhpcy5mbHVzaCgpLFxyXG4gICAgICAgICAgdGhpcy5jb25maWcuZmx1c2hJbnRlcnZhbE1zLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiAocmVhZG9ubHkgc25hcHNob3QpLiAqL1xyXG4gIGdldENvbmZpZygpOiBSZWFkb25seTxVaUJsYWNrYm94Q29uZmlnPiB7XHJcbiAgICByZXR1cm4geyAuLi50aGlzLmNvbmZpZyB9O1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIFB1YmxpYyBBUEk6IFRyYWNraW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBNYW51YWxseSB0cmFjayBhIFVJIGFjdGlvbiAoY2xpY2spLlxyXG4gICAqXHJcbiAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgYFVpQnV0dG9uQXJlYUNvbXBvbmVudGAgYW5kIHRoZSBgW3VpVHJhY2tdYCBkaXJlY3RpdmUuXHJcbiAgICogQ2FuIGFsc28gYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgZm9yIGN1c3RvbSBpbnRlcmFjdGlvbnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gdHJhY2tJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBhY3Rpb24gKGUuZy4gYnV0dG9uIGlkLCBsaW5rIG5hbWUpLlxyXG4gICAqIEBwYXJhbSBtZXRhIC0gT3B0aW9uYWwgbWV0YWRhdGE6IGB0YWdgLCBgdGV4dGAsIGBpZGAgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICovXHJcbiAgdHJhY2tBY3Rpb24oXHJcbiAgICB0cmFja0lkOiBzdHJpbmcsXHJcbiAgICBtZXRhPzogeyB0YWc/OiBzdHJpbmc7IHRleHQ/OiBzdHJpbmc7IGlkPzogc3RyaW5nIH0sXHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGlzZWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBhY3Rpb246IFVpQmxhY2tib3hBY3Rpb24gPSB7XHJcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcclxuICAgICAgdHlwZTogJ2NsaWNrJyxcclxuICAgICAgdGFyZ2V0OiB7XHJcbiAgICAgICAgdGFnOiBtZXRhPy50YWcgPz8gJ3Vua25vd24nLFxyXG4gICAgICAgIGlkOiBtZXRhPy5pZCxcclxuICAgICAgICB0cmFja0lkLFxyXG4gICAgICAgIHRleHQ6IG1ldGE/LnRleHQ/LnN1YnN0cmluZygwLCA1MCksXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEFkZCB0byBjdXJyZW50IHN0ZXAgaW1tZWRpYXRlbHkgKGZvciBpbi1tZW1vcnkgc2Vzc2lvbiBhY2Nlc3MpXHJcbiAgICB0aGlzLmN1cnJlbnRTdGVwPy5hY3Rpb25zLnB1c2goYWN0aW9uKTtcclxuXHJcbiAgICAvLyBBbHNvIHB1c2ggdG8gYnVmZmVyIGZvciBwZXJzaXN0ZW5jZVxyXG4gICAgdGhpcy5wdXNoQnVmZmVyRXZlbnQoe1xyXG4gICAgICBraW5kOiAnYWN0aW9uJyxcclxuICAgICAgcGF5bG9hZDogeyAuLi5hY3Rpb24sIHJvdXRlOiB0aGlzLmN1cnJlbnRTdGVwPy5yb3V0ZSA/PyB0aGlzLnJvdXRlci51cmwgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2sgYSBmb3JtIGludGVyYWN0aW9uIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgYFVpRm9ybUJ1aWxkZXJDb21wb25lbnRgIHdoZW4gdGhlIEJsYWNrQm94XHJcbiAgICogc2VydmljZSBpcyBhdmFpbGFibGUuXHJcbiAgICovXHJcbiAgdHJhY2tGb3JtRXZlbnQoZXZlbnQ6IFVpQmxhY2tib3hGb3JtRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pbml0aWFsaXNlZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc2Vzc2lvbi5mb3JtRXZlbnRzLnB1c2goZXZlbnQpO1xyXG4gICAgdGhpcy5wdXNoQnVmZmVyRXZlbnQoeyBraW5kOiAnZm9ybUV2ZW50JywgcGF5bG9hZDogZXZlbnQgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFjayBhbiBpbnRlcmNlcHRlZCBIVFRQIGNhbGwuXHJcbiAgICogQ2FsbGVkIGJ5IGBVaUJsYWNrYm94SW50ZXJjZXB0b3JgLlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHRyYWNrSHR0cENhbGwoY2FsbDogVWlCbGFja2JveEh0dHBDYWxsKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGlzZWQpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnNlc3Npb24uY2FsbHMucHVzaChjYWxsKTtcclxuICAgIHRoaXMucHVzaEJ1ZmZlckV2ZW50KHsga2luZDogJ2h0dHBDYWxsJywgcGF5bG9hZDogY2FsbCB9KTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBQdWJsaWMgQVBJOiBTZXNzaW9uIGFjY2VzcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBpbi1tZW1vcnkgc2Vzc2lvbiAobGl2ZSwgbm90IHlldCBmbHVzaGVkKS5cclxuICAgKiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBvciByZWFsLXRpbWUgaW5zcGVjdGlvbi5cclxuICAgKi9cclxuICBnZXRDdXJyZW50U2Vzc2lvbigpOiBVaUJsYWNrYm94U2Vzc2lvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgYWxsIHNlc3Npb25zIHN0b3JlZCBpbiBJbmRleGVkREIgKGRlY29tcHJlc3NlZCkuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0U2Vzc2lvbkhpc3RvcnkoKTogUHJvbWlzZTxVaUJsYWNrYm94U2Vzc2lvbltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldEFsbFNlc3Npb25zKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBzZXNzaW9ucyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlIGZpbmdlcnByaW50LlxyXG4gICAqL1xyXG4gIGFzeW5jIGdldFNlc3Npb25zRm9yRGV2aWNlKCk6IFByb21pc2U8VWlCbGFja2JveFNlc3Npb25bXT4ge1xyXG4gICAgY29uc3QgZnAgPSBhd2FpdCB0aGlzLmZpbmdlcnByaW50LmdldEZpbmdlcnByaW50KCk7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldFNlc3Npb25zQnlGaW5nZXJwcmludChmcCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgUHVibGljIEFQSTogRXhwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBFeHBvcnQgYWxsIHNlc3Npb25zIGFzIGEgZG93bmxvYWRhYmxlIEpTT05MIEJsb2IuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyBBIEJsb2IgY29udGFpbmluZyBKU09OTCBkYXRhIChvbmUgc2Vzc2lvbiBwZXIgbGluZSkuXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBjb25zdCBibG9iID0gYXdhaXQgYmxhY2tib3guZXhwb3J0U2Vzc2lvbnMoKTtcclxuICAgKiBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAqIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICogYS5ocmVmID0gdXJsO1xyXG4gICAqIGEuZG93bmxvYWQgPSAnYmxhY2tib3gtc2Vzc2lvbnMuanNvbmwnO1xyXG4gICAqIGEuY2xpY2soKTtcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBhc3luYyBleHBvcnRTZXNzaW9ucygpOiBQcm9taXNlPEJsb2I+IHtcclxuICAgIC8vIEZsdXNoIGN1cnJlbnQgc2Vzc2lvbiBmaXJzdFxyXG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5leHBvcnREdW1wKCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgUHVibGljIEFQSTogTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBFeHBsaWNpdGx5IGVuZCB0aGUgY3VycmVudCBzZXNzaW9uLlxyXG4gICAqIEZsdXNoZXMgYWxsIGJ1ZmZlcmVkIGV2ZW50cyBhbmQgbWFya3MgdGhlIHNlc3Npb24gYXMgZW5kZWQuXHJcbiAgICovXHJcbiAgYXN5bmMgZW5kU2Vzc2lvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5pbml0aWFsaXNlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZXNzaW9uLmVuZGVkQXQgPSBEYXRlLm5vdygpO1xyXG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgYWxsIHN0b3JlZCBzZXNzaW9ucyBmcm9tIEluZGV4ZWREQi5cclxuICAgKi9cclxuICBhc3luYyBjbGVhckhpc3RvcnkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmNsZWFyQWxsKCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgQnVmZmVyIG1hbmFnZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYW4gZXZlbnQgaW50byB0aGUgY2VudHJhbGlzZWQgYnVmZmVyLlxyXG4gICAqIFRyaWdnZXJzIGFuIGltbWVkaWF0ZSBmbHVzaCBpZiB0aGUgYnVmZmVyIGV4Y2VlZHMgdGhlIHRocmVzaG9sZC5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBwcml2YXRlIHB1c2hCdWZmZXJFdmVudChldmVudDogVWlCbGFja2JveEJ1ZmZlckV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmJ1ZmZlci5wdXNoKGV2ZW50KTtcclxuICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPj0gdGhpcy5jb25maWcuZmx1c2hUaHJlc2hvbGQpIHtcclxuICAgICAgdGhpcy5mbHVzaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmx1c2ggYnVmZmVyZWQgZXZlbnRzIHRvIEluZGV4ZWREQiBhc3luY2hyb25vdXNseS5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLmluaXRpYWxpc2VkIHx8IHRoaXMuYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIERyYWluIGJ1ZmZlclxyXG4gICAgY29uc3QgZXZlbnRzID0gdGhpcy5idWZmZXIuc3BsaWNlKDApO1xyXG5cclxuICAgIC8vIEFwcGx5IHN0ZXAgZXZlbnRzIHRvIHRoZSBzZXNzaW9uXHJcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xyXG4gICAgICBpZiAoZXZlbnQua2luZCA9PT0gJ3N0ZXAnKSB7XHJcbiAgICAgICAgLy8gU3RlcHMgYXJlIGFscmVhZHkgcHVzaGVkIGluIHJlYWwtdGltZTsgZW5zdXJlIHRoZXkncmUgaW4gdGhlIHNlc3Npb25cclxuICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbi5zdGVwcy5pbmNsdWRlcyhldmVudC5wYXlsb2FkKSkge1xyXG4gICAgICAgICAgdGhpcy5zZXNzaW9uLnN0ZXBzLnB1c2goZXZlbnQucGF5bG9hZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIEFjdGlvbnMsIGZvcm1FdmVudHMsIGh0dHBDYWxscyBhcmUgYWxyZWFkeSBwdXNoZWQgaW4gcmVhbC10aW1lXHJcbiAgICAgIC8vIHRvIHRoZSBpbi1tZW1vcnkgc2Vzc2lvbiBieSB0cmFja0FjdGlvbi90cmFja0Zvcm1FdmVudC90cmFja0h0dHBDYWxsXHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2F2ZSB0aGUgZnVsbCBzZXNzaW9uIHNuYXBzaG90XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2Uuc2F2ZVNlc3Npb24odGhpcy5zZXNzaW9uKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gc3RvcmFnZSBlcnJvciDigJQgcmUtZW5xdWV1ZSBldmVudHMgZm9yIG5leHQgZmx1c2hcclxuICAgICAgY29uc29sZS53YXJuKCdbVWlCbGFja2JveF0gU3RvcmFnZSBmbHVzaCBmYWlsZWQ6JywgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgVXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogR2VuZXJhdGUgYSBVVUlEIHY0LiAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVVdWlkKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcclxuICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XHJcbiAgICB9XHJcbiAgICAvLyBGYWxsYmFjayBmb3Igb2xkZXIgYnJvd3NlcnNcclxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XHJcbiAgICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDA7XHJcbiAgICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4O1xyXG4gICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBDbGVhbnVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmZsdXNoVGltZXJJZCAhPT0gbnVsbCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMuZmx1c2hUaW1lcklkKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5iZWZvcmVVbmxvYWRIYW5kbGVyKSB7XHJcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLmJlZm9yZVVubG9hZEhhbmRsZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZpbmFsIGZsdXNoXHJcbiAgICB2b2lkIHRoaXMuZmx1c2goKTtcclxuICB9XHJcbn1cclxuIl19
|