inspector-ng 0.0.7 → 0.0.9

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.
@@ -1,267 +1,323 @@
1
- import { Injectable, Inject, PLATFORM_ID, computed, signal } from '@angular/core';
1
+ import { Inject, Injectable, InjectionToken, Optional, PLATFORM_ID, makeEnvironmentProviders, signal, } from '@angular/core';
2
2
  import { isPlatformBrowser } from '@angular/common';
3
3
  import { Router } from '@angular/router';
4
+ import { META_REDUCERS, Store, } from '@ngrx/store';
5
+ import { firstValueFrom, take } from 'rxjs';
4
6
  import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/router";
6
- const STORAGE_KEY = 'inspector-checkpoints-v1';
7
- export class InspectorCheckpointRegistry {
8
- constructor(platformId, router) {
7
+ import * as i1 from "@ngrx/store";
8
+ import * as i2 from "@angular/router";
9
+ const RESTORE_CHECKPOINT = '[Inspector Checkpoints] Restore';
10
+ const DATABASE_NAME = 'inspector-ng';
11
+ const DATABASE_VERSION = 1;
12
+ const STORE_NAME = 'checkpoints';
13
+ export const INSPECTOR_CHECKPOINT_REPOSITORY = new InjectionToken('INSPECTOR_CHECKPOINT_REPOSITORY');
14
+ export function inspectorCheckpointMetaReducer(reducer) {
15
+ return (state, action) => {
16
+ if (action.type === RESTORE_CHECKPOINT) {
17
+ return action.state;
18
+ }
19
+ return reducer(state, action);
20
+ };
21
+ }
22
+ export class InspectorCheckpointRepository {
23
+ }
24
+ export class IndexedDbCheckpointRepository extends InspectorCheckpointRepository {
25
+ constructor(platformId) {
26
+ super();
27
+ this.platformId = platformId;
28
+ this.databasePromise = null;
29
+ }
30
+ async list() {
31
+ const database = await this.database();
32
+ const values = await this.request(database.transaction(STORE_NAME, 'readonly').objectStore(STORE_NAME).getAll());
33
+ return values
34
+ .filter(isCheckpointRecord)
35
+ .sort(newestFirst);
36
+ }
37
+ async put(checkpoint) {
38
+ const database = await this.database();
39
+ await this.transactionComplete(database, 'readwrite', (store) => store.put(checkpoint));
40
+ }
41
+ async delete(id) {
42
+ const database = await this.database();
43
+ await this.transactionComplete(database, 'readwrite', (store) => store.delete(id));
44
+ }
45
+ database() {
46
+ if (!isPlatformBrowser(this.platformId) || typeof indexedDB === 'undefined') {
47
+ return Promise.reject(new Error('Checkpoints are only available in a browser with IndexedDB.'));
48
+ }
49
+ if (this.databasePromise)
50
+ return this.databasePromise;
51
+ this.databasePromise = new Promise((resolve, reject) => {
52
+ const request = indexedDB.open(DATABASE_NAME, DATABASE_VERSION);
53
+ request.onupgradeneeded = () => {
54
+ const database = request.result;
55
+ if (database.objectStoreNames.contains(STORE_NAME))
56
+ return;
57
+ const store = database.createObjectStore(STORE_NAME, { keyPath: 'id' });
58
+ store.createIndex('createdAt', 'createdAt');
59
+ };
60
+ request.onsuccess = () => resolve(request.result);
61
+ request.onerror = () => reject(request.error ?? new Error('IndexedDB could not be opened.'));
62
+ request.onblocked = () => reject(new Error('IndexedDB is blocked by another open tab.'));
63
+ });
64
+ return this.databasePromise;
65
+ }
66
+ request(request) {
67
+ return new Promise((resolve, reject) => {
68
+ request.onsuccess = () => resolve(request.result);
69
+ request.onerror = () => reject(request.error ?? new Error('IndexedDB request failed.'));
70
+ });
71
+ }
72
+ transactionComplete(database, mode, operation) {
73
+ return new Promise((resolve, reject) => {
74
+ const transaction = database.transaction(STORE_NAME, mode);
75
+ transaction.oncomplete = () => resolve();
76
+ transaction.onerror = () => reject(transaction.error ?? new Error('IndexedDB transaction failed.'));
77
+ transaction.onabort = () => reject(transaction.error ?? new Error('IndexedDB transaction was aborted.'));
78
+ operation(transaction.objectStore(STORE_NAME));
79
+ });
80
+ }
81
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IndexedDbCheckpointRepository, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
82
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IndexedDbCheckpointRepository }); }
83
+ }
84
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IndexedDbCheckpointRepository, decorators: [{
85
+ type: Injectable
86
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
87
+ type: Inject,
88
+ args: [PLATFORM_ID]
89
+ }] }] });
90
+ export class InspectorCheckpointService {
91
+ constructor(repository, store, router, platformId) {
92
+ this.repository = repository;
93
+ this.store = store;
9
94
  this.router = router;
95
+ this.platformId = platformId;
10
96
  this.checkpoints = signal([]);
11
- this.isBusy = signal(false);
97
+ this.loading = signal(false);
98
+ this.busy = signal(false);
12
99
  this.error = signal(null);
13
- this.warning = signal(null);
14
- this.totalBytes = computed(() => this.checkpoints().reduce((total, checkpoint) => total + checkpoint.sizeBytes, 0));
15
- this.adapters = new Map();
16
- this.remoteLoaders = new Map();
17
- this.isCheckpoint = (value) => {
18
- if (!value || typeof value !== 'object')
19
- return false;
20
- const checkpoint = value;
21
- return checkpoint.version === 1 && typeof checkpoint.id === 'string' &&
22
- typeof checkpoint.name === 'string' && typeof checkpoint.url === 'string' &&
23
- typeof checkpoint.createdAt === 'string' && Array.isArray(checkpoint.scopes) &&
24
- !!checkpoint.state && typeof checkpoint.state === 'object' && typeof checkpoint.sizeBytes === 'number';
25
- };
26
- this.isBrowser = isPlatformBrowser(platformId);
27
- this.hydrate();
28
100
  }
29
- register(adapter) {
30
- if (!adapter.id.includes(':')) {
31
- throw new Error('Checkpoint adapter IDs must be namespaced (for example, workflow:application).');
101
+ async load() {
102
+ this.error.set(null);
103
+ this.loading.set(true);
104
+ try {
105
+ this.checkpoints.set((await this.repository.list()).sort(newestFirst));
32
106
  }
33
- if (this.adapters.has(adapter.id)) {
34
- // Remote bridge loaders can run more than once across checkpoint restores.
35
- // Treat repeated registration as idempotent so a loaded remote stays usable.
36
- return () => undefined;
107
+ catch (error) {
108
+ this.error.set(this.messageFor(error, 'Saved checkpoints could not be loaded. Try reloading the page.'));
109
+ }
110
+ finally {
111
+ this.loading.set(false);
37
112
  }
38
- this.adapters.set(adapter.id, adapter);
39
- return () => this.adapters.delete(adapter.id);
40
- }
41
- registerRemoteScope(scope, loader) {
42
- this.remoteLoaders.set(scope, loader);
43
- return () => this.remoteLoaders.delete(scope);
44
113
  }
45
- async save(name) {
114
+ async save() {
46
115
  this.error.set(null);
47
- if (!this.isBrowser) {
48
- this.error.set('Checkpoints are only available in a browser.');
116
+ if (!this.store) {
117
+ this.error.set(this.missingStoreMessage());
49
118
  return null;
50
119
  }
51
- this.isBusy.set(true);
120
+ this.busy.set(true);
52
121
  try {
53
- const state = {};
54
- for (const adapter of this.adapters.values()) {
55
- state[adapter.id] = this.cloneValue(await adapter.capture(), adapter.id);
56
- }
57
- const createdAt = new Date().toISOString();
122
+ const currentState = await firstValueFrom(this.store.pipe(take(1)));
123
+ const state = cloneJson(currentState);
124
+ const persisted = await this.repository.list();
125
+ const route = this.currentRoute();
126
+ const pathname = this.currentPathname();
58
127
  const checkpoint = {
59
128
  version: 1,
60
- id: this.createId(),
61
- name: name?.trim() || this.nextAutomaticName(this.routePath(this.router.url)),
62
- url: this.router.url,
63
- createdAt,
64
- scopes: this.getScopes(Object.keys(state)),
129
+ id: createCheckpointId(),
130
+ name: nextAutomaticName(pathname, persisted.map(({ name }) => name)),
131
+ route,
132
+ createdAt: new Date().toISOString(),
65
133
  state,
66
- sizeBytes: 0,
67
134
  };
68
- checkpoint.sizeBytes = this.sizeOf(checkpoint);
69
- this.persistWithEviction([checkpoint, ...this.checkpoints()]);
70
- return this.checkpoints().find((item) => item.id === checkpoint.id) ?? null;
135
+ await this.repository.put(checkpoint);
136
+ this.checkpoints.set([checkpoint, ...persisted].sort(newestFirst));
137
+ return checkpoint;
71
138
  }
72
139
  catch (error) {
73
- this.error.set(this.messageFor(error, 'Unable to save checkpoint.'));
140
+ this.error.set(this.storageMessage(error, 'The checkpoint could not be saved.'));
74
141
  return null;
75
142
  }
76
143
  finally {
77
- this.isBusy.set(false);
144
+ this.busy.set(false);
78
145
  }
79
146
  }
80
147
  async restore(id) {
81
- const checkpoint = this.checkpoints().find((item) => item.id === id);
82
148
  this.error.set(null);
83
- this.warning.set(null);
84
- if (!checkpoint) {
85
- this.error.set('Checkpoint not found.');
149
+ if (!this.store) {
150
+ this.error.set(this.missingStoreMessage());
86
151
  return false;
87
152
  }
88
- this.isBusy.set(true);
153
+ this.busy.set(true);
89
154
  try {
90
- for (const scope of checkpoint.scopes) {
91
- const loader = this.remoteLoaders.get(scope);
92
- if (loader) {
93
- await loader();
94
- }
95
- }
96
- const missing = [];
97
- for (const [adapterId, value] of Object.entries(checkpoint.state)) {
98
- const adapter = this.adapters.get(adapterId);
99
- if (!adapter) {
100
- missing.push(adapterId);
101
- continue;
102
- }
103
- await adapter.restore(this.cloneValue(value, adapterId));
155
+ const checkpoint = (await this.repository.list()).find((item) => item.id === id);
156
+ if (!checkpoint)
157
+ throw new Error('Checkpoint not found. It may have been deleted in another tab.');
158
+ const state = cloneJson(checkpoint.state, `“${checkpoint.name}” could not be decoded. Delete it and save a new checkpoint.`);
159
+ this.store.dispatch({ type: RESTORE_CHECKPOINT, state });
160
+ if (this.router && !await this.router.navigateByUrl(checkpoint.route)) {
161
+ throw new Error(`The state was restored, but navigation to “${checkpoint.route}” was cancelled.`);
104
162
  }
105
- if (missing.length) {
106
- this.warning.set(`Skipped ${missing.length} unavailable adapter${missing.length === 1 ? '' : 's'}: ${missing.join(', ')}.`);
107
- }
108
- await this.router.navigateByUrl(checkpoint.url);
109
163
  return true;
110
164
  }
111
165
  catch (error) {
112
- this.error.set(this.messageFor(error, 'Unable to restore checkpoint.'));
166
+ this.error.set(this.messageFor(error, 'The checkpoint could not be restored. Delete it and save a new one.'));
113
167
  return false;
114
168
  }
115
169
  finally {
116
- this.isBusy.set(false);
170
+ this.busy.set(false);
117
171
  }
118
172
  }
119
- rename(id, name) {
173
+ async rename(id, name) {
174
+ this.error.set(null);
120
175
  const nextName = name.trim();
121
176
  if (!nextName) {
122
- this.error.set('A checkpoint name is required.');
123
- return;
124
- }
125
- this.error.set(null);
126
- const next = this.checkpoints().map((checkpoint) => checkpoint.id === id ? { ...checkpoint, name: nextName } : checkpoint);
127
- this.persistWithEviction(next);
128
- }
129
- delete(id) {
130
- this.error.set(null);
131
- this.persistWithEviction(this.checkpoints().filter((checkpoint) => checkpoint.id !== id));
132
- }
133
- hydrate() {
134
- if (!this.isBrowser) {
135
- return;
177
+ this.error.set('Please enter a checkpoint name.');
178
+ return false;
136
179
  }
180
+ this.busy.set(true);
137
181
  try {
138
- const raw = window.localStorage.getItem(STORAGE_KEY);
139
- if (!raw)
140
- return;
141
- const parsed = JSON.parse(raw);
142
- if (!Array.isArray(parsed))
143
- return;
144
- const checkpoints = parsed.filter(this.isCheckpoint);
145
- const normalized = this.normalizeLegacyNames(checkpoints);
146
- const sorted = normalized.checkpoints.sort((a, b) => b.createdAt.localeCompare(a.createdAt) || b.id.localeCompare(a.id));
147
- this.checkpoints.set(sorted);
148
- if (normalized.changed) {
149
- window.localStorage.setItem(STORAGE_KEY, JSON.stringify(sorted));
182
+ const checkpoints = await this.repository.list();
183
+ if (checkpoints.some((item) => item.id !== id && item.name.toLocaleLowerCase() === nextName.toLocaleLowerCase())) {
184
+ throw new Error(`A checkpoint named “${nextName}” already exists. Choose a different name.`);
150
185
  }
186
+ const checkpoint = checkpoints.find((item) => item.id === id);
187
+ if (!checkpoint)
188
+ throw new Error('Checkpoint not found. It may have been deleted in another tab.');
189
+ await this.repository.put({ ...checkpoint, name: nextName });
190
+ this.checkpoints.set(checkpoints.map((item) => item.id === id ? { ...item, name: nextName } : item).sort(newestFirst));
191
+ return true;
151
192
  }
152
- catch {
153
- this.warning.set('Saved checkpoints could not be read and were ignored.');
193
+ catch (error) {
194
+ this.error.set(this.storageMessage(error, 'The checkpoint could not be renamed.'));
195
+ return false;
154
196
  }
155
- }
156
- persistWithEviction(checkpoints) {
157
- if (!this.isBrowser)
158
- return;
159
- let candidate = checkpoints;
160
- while (true) {
161
- try {
162
- window.localStorage.setItem(STORAGE_KEY, JSON.stringify(candidate));
163
- this.checkpoints.set(candidate);
164
- return;
165
- }
166
- catch (error) {
167
- if (!this.isQuotaError(error) || candidate.length === 0) {
168
- throw error;
169
- }
170
- candidate = candidate.slice(0, -1);
171
- this.warning.set('Storage was full; the oldest checkpoint was removed.');
172
- }
197
+ finally {
198
+ this.busy.set(false);
173
199
  }
174
200
  }
175
- cloneValue(value, adapterId) {
201
+ async delete(id) {
202
+ this.error.set(null);
203
+ this.busy.set(true);
176
204
  try {
177
- const serialized = JSON.stringify(value);
178
- if (serialized === undefined)
179
- throw new Error('undefined values are not supported');
180
- return JSON.parse(serialized);
205
+ await this.repository.delete(id);
206
+ this.checkpoints.set(this.checkpoints().filter((item) => item.id !== id));
207
+ return true;
181
208
  }
182
- catch {
183
- throw new Error(`Adapter "${adapterId}" returned a value that cannot be JSON serialized.`);
209
+ catch (error) {
210
+ this.error.set(this.storageMessage(error, 'The checkpoint could not be deleted.'));
211
+ return false;
184
212
  }
185
- }
186
- getScopes(adapterIds) {
187
- return [...new Set(adapterIds.map((id) => id.split(':', 1)[0]))];
188
- }
189
- routePath(url) {
190
- return url.split(/[?#]/, 1)[0] || '/';
191
- }
192
- nextAutomaticName(route, usedNames = new Set(this.checkpoints().map(({ name }) => name))) {
193
- if (!usedNames.has(route))
194
- return route;
195
- for (let suffix = 2;; suffix += 1) {
196
- const candidate = `${route} ${suffix}`;
197
- if (!usedNames.has(candidate))
198
- return candidate;
213
+ finally {
214
+ this.busy.set(false);
199
215
  }
200
216
  }
201
- normalizeLegacyNames(checkpoints) {
202
- const legacyIds = new Set(checkpoints.filter((checkpoint) => this.isLegacyAutomaticName(checkpoint)).map(({ id }) => id));
203
- if (!legacyIds.size)
204
- return { checkpoints, changed: false };
205
- const usedNames = new Set(checkpoints.filter(({ id }) => !legacyIds.has(id)).map(({ name }) => name));
206
- const names = new Map();
207
- const oldestFirst = checkpoints
208
- .filter(({ id }) => legacyIds.has(id))
209
- .sort((a, b) => a.createdAt.localeCompare(b.createdAt) || a.id.localeCompare(b.id));
210
- for (const checkpoint of oldestFirst) {
211
- const name = this.nextAutomaticName(this.routePath(checkpoint.url), usedNames);
212
- names.set(checkpoint.id, name);
213
- usedNames.add(name);
214
- }
215
- return {
216
- checkpoints: checkpoints.map((checkpoint) => names.has(checkpoint.id) ? { ...checkpoint, name: names.get(checkpoint.id) } : checkpoint),
217
- changed: true,
218
- };
217
+ clearError() {
218
+ this.error.set(null);
219
219
  }
220
- isLegacyAutomaticName(checkpoint) {
221
- const route = this.routePath(checkpoint.url);
222
- const prefix = `${route} · `;
223
- if (!checkpoint.name.startsWith(prefix))
224
- return false;
225
- const timestamp = checkpoint.name.slice(prefix.length);
226
- if (timestamp === new Date(checkpoint.createdAt).toLocaleString())
227
- return true;
228
- const parsedTimestamp = Date.parse(timestamp);
229
- const createdTimestamp = Date.parse(checkpoint.createdAt);
230
- return Number.isFinite(parsedTimestamp) && Number.isFinite(createdTimestamp) &&
231
- Math.abs(parsedTimestamp - createdTimestamp) < 1000;
220
+ currentRoute() {
221
+ if (!isPlatformBrowser(this.platformId))
222
+ return '/';
223
+ return `${this.currentPathname()}${window.location.search}${window.location.hash}`;
232
224
  }
233
- createId() {
234
- return `checkpoint-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
225
+ currentPathname() {
226
+ if (!isPlatformBrowser(this.platformId))
227
+ return '/';
228
+ return window.location.pathname || '/';
235
229
  }
236
- sizeOf(checkpoint) {
237
- return new Blob([JSON.stringify(checkpoint)]).size;
230
+ missingStoreMessage() {
231
+ return 'The NgRx root store is unavailable. Check that provideInspectorCheckpoints() is registered after provideStore().';
238
232
  }
239
- isQuotaError(error) {
240
- return error instanceof DOMException && (error.name === 'QuotaExceededError' || error.name === 'NS_ERROR_DOM_QUOTA_REACHED');
233
+ storageMessage(error, fallback) {
234
+ if (isQuotaError(error)) {
235
+ return 'Browser storage is full. Delete old checkpoints, then try saving again.';
236
+ }
237
+ return this.messageFor(error, fallback);
241
238
  }
242
239
  messageFor(error, fallback) {
243
- return error instanceof Error ? error.message : fallback;
240
+ return error instanceof Error && error.message ? error.message : fallback;
244
241
  }
245
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InspectorCheckpointRegistry, deps: [{ token: PLATFORM_ID }, { token: Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
246
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InspectorCheckpointRegistry }); }
242
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InspectorCheckpointService, deps: [{ token: INSPECTOR_CHECKPOINT_REPOSITORY }, { token: Store, optional: true }, { token: Router, optional: true }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
243
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InspectorCheckpointService }); }
247
244
  }
248
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InspectorCheckpointRegistry, decorators: [{
245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InspectorCheckpointService, decorators: [{
249
246
  type: Injectable
250
- }], ctorParameters: () => [{ type: undefined, decorators: [{
247
+ }], ctorParameters: () => [{ type: InspectorCheckpointRepository, decorators: [{
251
248
  type: Inject,
252
- args: [PLATFORM_ID]
253
- }] }, { type: i1.Router, decorators: [{
249
+ args: [INSPECTOR_CHECKPOINT_REPOSITORY]
250
+ }] }, { type: i1.Store, decorators: [{
251
+ type: Optional
252
+ }, {
253
+ type: Inject,
254
+ args: [Store]
255
+ }] }, { type: i2.Router, decorators: [{
256
+ type: Optional
257
+ }, {
254
258
  type: Inject,
255
259
  args: [Router]
260
+ }] }, { type: undefined, decorators: [{
261
+ type: Inject,
262
+ args: [PLATFORM_ID]
256
263
  }] }] });
257
264
  export function provideInspectorCheckpoints() {
258
- return [InspectorCheckpointRegistry];
265
+ return makeEnvironmentProviders([
266
+ IndexedDbCheckpointRepository,
267
+ {
268
+ provide: INSPECTOR_CHECKPOINT_REPOSITORY,
269
+ useExisting: IndexedDbCheckpointRepository,
270
+ },
271
+ InspectorCheckpointService,
272
+ {
273
+ provide: META_REDUCERS,
274
+ multi: true,
275
+ useValue: inspectorCheckpointMetaReducer,
276
+ },
277
+ ]);
259
278
  }
260
- export function createBehaviorSubjectCheckpointAdapter(id, subject) {
261
- return {
262
- id,
263
- capture: () => subject.value,
264
- restore: (value) => subject.next(value),
265
- };
279
+ export function nextAutomaticName(route, names) {
280
+ const used = new Set(names.map((name) => name.toLocaleLowerCase()));
281
+ if (!used.has(route.toLocaleLowerCase()))
282
+ return route;
283
+ for (let suffix = 2;; suffix += 1) {
284
+ const candidate = `${route} ${suffix}`;
285
+ if (!used.has(candidate.toLocaleLowerCase()))
286
+ return candidate;
287
+ }
288
+ }
289
+ function cloneJson(value, failureMessage = 'The NgRx root state is not JSON-serializable. Remove circular or unsupported values and try again.') {
290
+ try {
291
+ const serialized = JSON.stringify(value);
292
+ if (serialized === undefined)
293
+ throw new Error();
294
+ return JSON.parse(serialized);
295
+ }
296
+ catch {
297
+ throw new Error(failureMessage);
298
+ }
299
+ }
300
+ function createCheckpointId() {
301
+ if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
302
+ return crypto.randomUUID();
303
+ }
304
+ return `checkpoint-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
305
+ }
306
+ function isQuotaError(error) {
307
+ return error instanceof DOMException && (error.name === 'QuotaExceededError' || error.name === 'NS_ERROR_DOM_QUOTA_REACHED');
308
+ }
309
+ function newestFirst(a, b) {
310
+ return b.createdAt.localeCompare(a.createdAt) || b.id.localeCompare(a.id);
311
+ }
312
+ function isCheckpointRecord(value) {
313
+ if (!value || typeof value !== 'object')
314
+ return false;
315
+ const checkpoint = value;
316
+ return checkpoint.version === 1 &&
317
+ typeof checkpoint.id === 'string' &&
318
+ typeof checkpoint.name === 'string' &&
319
+ typeof checkpoint.route === 'string' &&
320
+ typeof checkpoint.createdAt === 'string' &&
321
+ 'state' in checkpoint;
266
322
  }
267
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9jaGVja3BvaW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQVksUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQThCekMsTUFBTSxXQUFXLEdBQUcsMEJBQTBCLENBQUM7QUFHL0MsTUFBTSxPQUFPLDJCQUEyQjtJQWF0QyxZQUN1QixVQUFrQixFQUNOLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBZHhDLGdCQUFXLEdBQUcsTUFBTSxDQUF3QixFQUFFLENBQUMsQ0FBQztRQUNoRCxXQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLFVBQUssR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ3BDLFlBQU8sR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ3RDLGVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ2xDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FDbEYsQ0FBQztRQUVlLGFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBc0MsQ0FBQztRQUN6RCxrQkFBYSxHQUFHLElBQUksR0FBRyxFQUEyQyxDQUFDO1FBMlA1RSxpQkFBWSxHQUFHLENBQUMsS0FBYyxFQUFnQyxFQUFFO1lBQ3RFLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN0RCxNQUFNLFVBQVUsR0FBRyxLQUFxQyxDQUFDO1lBQ3pELE9BQU8sVUFBVSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksT0FBTyxVQUFVLENBQUMsRUFBRSxLQUFLLFFBQVE7Z0JBQ2xFLE9BQU8sVUFBVSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxVQUFVLENBQUMsR0FBRyxLQUFLLFFBQVE7Z0JBQ3pFLE9BQU8sVUFBVSxDQUFDLFNBQVMsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO2dCQUM1RSxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxPQUFPLFVBQVUsQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sVUFBVSxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUM7UUFDM0csQ0FBQyxDQUFDO1FBM1BBLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxRQUFRLENBQUMsT0FBbUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRkFBZ0YsQ0FBQyxDQUFDO1FBQ3BHLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2xDLDJFQUEyRTtZQUMzRSw2RUFBNkU7WUFDN0UsT0FBTyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELG1CQUFtQixDQUFDLEtBQWEsRUFBRSxNQUF1QztRQUN4RSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFhO1FBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUMvRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBNkMsRUFBRSxDQUFDO1lBQzNELEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUM3QyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLENBQUM7WUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzNDLE1BQU0sVUFBVSxHQUF3QjtnQkFDdEMsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ25CLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0UsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRztnQkFDcEIsU0FBUztnQkFDVCxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQyxLQUFLO2dCQUNMLFNBQVMsRUFBRSxDQUFDO2FBQ2IsQ0FBQztZQUNGLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlELE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDO1FBQzlFLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsNEJBQTRCLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQVU7UUFDdEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUN4QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUM7WUFDSCxLQUFLLE1BQU0sS0FBSyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdDLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxNQUFNLEVBQUUsQ0FBQztnQkFDakIsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7WUFDN0IsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2xFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDeEIsU0FBUztnQkFDWCxDQUFDO2dCQUNELE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxPQUFPLENBQUMsTUFBTSx1QkFBdUIsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlILENBQUM7WUFDRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsK0JBQStCLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsRUFBVSxFQUFFLElBQVk7UUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7WUFDakQsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDakQsVUFBVSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQ3RFLENBQUM7UUFDRixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELE1BQU0sQ0FBQyxFQUFVO1FBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRU8sT0FBTztRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsR0FBRztnQkFBRSxPQUFPO1lBQ2pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFZLENBQUM7WUFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUFFLE9BQU87WUFDbkMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDckQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ2xELENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ25FLENBQUM7WUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QixJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNuRSxDQUFDO1FBQ0gsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDNUUsQ0FBQztJQUNILENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxXQUFrQztRQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzVCLElBQUksU0FBUyxHQUFHLFdBQVcsQ0FBQztRQUM1QixPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNoQyxPQUFPO1lBQ1QsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDeEQsTUFBTSxLQUFLLENBQUM7Z0JBQ2QsQ0FBQztnQkFDRCxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUMzRSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVLENBQUMsS0FBYyxFQUFFLFNBQWlCO1FBQ2xELElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsSUFBSSxVQUFVLEtBQUssU0FBUztnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7WUFDcEYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBNkIsQ0FBQztRQUM1RCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLFNBQVMsb0RBQW9ELENBQUMsQ0FBQztRQUM3RixDQUFDO0lBQ0gsQ0FBQztJQUVPLFNBQVMsQ0FBQyxVQUFvQjtRQUNwQyxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU8sU0FBUyxDQUFDLEdBQVc7UUFDM0IsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDeEMsQ0FBQztJQUVPLGlCQUFpQixDQUFDLEtBQWEsRUFBRSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hDLEtBQUssSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFJLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxNQUFNLFNBQVMsR0FBRyxHQUFHLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7Z0JBQUUsT0FBTyxTQUFTLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxXQUFrQztRQUk3RCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FDdkIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQy9GLENBQUM7UUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUU1RCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FDdkIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUMzRSxDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDeEMsTUFBTSxXQUFXLEdBQUcsV0FBVzthQUM1QixNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3JDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV0RixLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0IsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBRUQsT0FBTztZQUNMLFdBQVcsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDMUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxVQUFVLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FDM0Y7WUFDRCxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUM7SUFDSixDQUFDO0lBRU8scUJBQXFCLENBQUMsVUFBK0I7UUFDM0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxLQUFLLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdEQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELElBQUksU0FBUyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxjQUFjLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUUvRSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7WUFDMUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDeEQsQ0FBQztJQUVPLFFBQVE7UUFDZCxPQUFPLGNBQWMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlFLENBQUM7SUFFTyxNQUFNLENBQUMsVUFBK0I7UUFDNUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRCxDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQWM7UUFDakMsT0FBTyxLQUFLLFlBQVksWUFBWSxJQUFJLENBQ3RDLEtBQUssQ0FBQyxJQUFJLEtBQUssb0JBQW9CLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyw0QkFBNEIsQ0FDbkYsQ0FBQztJQUNKLENBQUM7SUFFTyxVQUFVLENBQUMsS0FBYyxFQUFFLFFBQWdCO1FBQ2pELE9BQU8sS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQzNELENBQUM7K0dBblFVLDJCQUEyQixrQkFjNUIsV0FBVyxhQUNYLE1BQU07bUhBZkwsMkJBQTJCOzs0RkFBM0IsMkJBQTJCO2tCQUR2QyxVQUFVOzswQkFlTixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixNQUFNOzJCQUFDLE1BQU07O0FBZ1FsQixNQUFNLFVBQVUsMkJBQTJCO0lBQ3pDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxNQUFNLFVBQVUsc0NBQXNDLENBQ3BELEVBQVUsRUFDVixPQUEyQjtJQUUzQixPQUFPO1FBQ0wsRUFBRTtRQUNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBNEM7UUFDbkUsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQVUsQ0FBQztLQUM3QyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgUExBVEZPUk1fSUQsIFByb3ZpZGVyLCBjb21wdXRlZCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCB0eXBlIEluc3BlY3RvckNoZWNrcG9pbnRWYWx1ZSA9XG4gIHwgc3RyaW5nXG4gIHwgbnVtYmVyXG4gIHwgYm9vbGVhblxuICB8IG51bGxcbiAgfCBJbnNwZWN0b3JDaGVja3BvaW50VmFsdWVbXVxuICB8IHsgW2tleTogc3RyaW5nXTogSW5zcGVjdG9yQ2hlY2twb2ludFZhbHVlIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5zcGVjdG9yQ2hlY2twb2ludEFkYXB0ZXIge1xuICBpZDogc3RyaW5nO1xuICBjYXB0dXJlKCk6IEluc3BlY3RvckNoZWNrcG9pbnRWYWx1ZSB8IFByb21pc2U8SW5zcGVjdG9yQ2hlY2twb2ludFZhbHVlPjtcbiAgcmVzdG9yZSh2YWx1ZTogSW5zcGVjdG9yQ2hlY2twb2ludFZhbHVlKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5zcGVjdG9yQ2hlY2twb2ludCB7XG4gIHZlcnNpb246IDE7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xuICBzY29wZXM6IHN0cmluZ1tdO1xuICBzdGF0ZTogUmVjb3JkPHN0cmluZywgSW5zcGVjdG9yQ2hlY2twb2ludFZhbHVlPjtcbiAgc2l6ZUJ5dGVzOiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIEluc3BlY3RvckNoZWNrcG9pbnRSZW1vdGVMb2FkZXIgPSAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuY29uc3QgU1RPUkFHRV9LRVkgPSAnaW5zcGVjdG9yLWNoZWNrcG9pbnRzLXYxJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEluc3BlY3RvckNoZWNrcG9pbnRSZWdpc3RyeSB7XG4gIHJlYWRvbmx5IGNoZWNrcG9pbnRzID0gc2lnbmFsPEluc3BlY3RvckNoZWNrcG9pbnRbXT4oW10pO1xuICByZWFkb25seSBpc0J1c3kgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBlcnJvciA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgd2FybmluZyA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgdG90YWxCeXRlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5jaGVja3BvaW50cygpLnJlZHVjZSgodG90YWwsIGNoZWNrcG9pbnQpID0+IHRvdGFsICsgY2hlY2twb2ludC5zaXplQnl0ZXMsIDApLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRhcHRlcnMgPSBuZXcgTWFwPHN0cmluZywgSW5zcGVjdG9yQ2hlY2twb2ludEFkYXB0ZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3RlTG9hZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBJbnNwZWN0b3JDaGVja3BvaW50UmVtb3RlTG9hZGVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzQnJvd3NlcjogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwbGF0Zm9ybUlkOiBvYmplY3QsXG4gICAgQEluamVjdChSb3V0ZXIpIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICkge1xuICAgIHRoaXMuaXNCcm93c2VyID0gaXNQbGF0Zm9ybUJyb3dzZXIocGxhdGZvcm1JZCk7XG4gICAgdGhpcy5oeWRyYXRlKCk7XG4gIH1cblxuICByZWdpc3RlcihhZGFwdGVyOiBJbnNwZWN0b3JDaGVja3BvaW50QWRhcHRlcik6ICgpID0+IHZvaWQge1xuICAgIGlmICghYWRhcHRlci5pZC5pbmNsdWRlcygnOicpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrcG9pbnQgYWRhcHRlciBJRHMgbXVzdCBiZSBuYW1lc3BhY2VkIChmb3IgZXhhbXBsZSwgd29ya2Zsb3c6YXBwbGljYXRpb24pLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5hZGFwdGVycy5oYXMoYWRhcHRlci5pZCkpIHtcbiAgICAgIC8vIFJlbW90ZSBicmlkZ2UgbG9hZGVycyBjYW4gcnVuIG1vcmUgdGhhbiBvbmNlIGFjcm9zcyBjaGVja3BvaW50IHJlc3RvcmVzLlxuICAgICAgLy8gVHJlYXQgcmVwZWF0ZWQgcmVnaXN0cmF0aW9uIGFzIGlkZW1wb3RlbnQgc28gYSBsb2FkZWQgcmVtb3RlIHN0YXlzIHVzYWJsZS5cbiAgICAgIHJldHVybiAoKSA9PiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuYWRhcHRlcnMuc2V0KGFkYXB0ZXIuaWQsIGFkYXB0ZXIpO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLmFkYXB0ZXJzLmRlbGV0ZShhZGFwdGVyLmlkKTtcbiAgfVxuXG4gIHJlZ2lzdGVyUmVtb3RlU2NvcGUoc2NvcGU6IHN0cmluZywgbG9hZGVyOiBJbnNwZWN0b3JDaGVja3BvaW50UmVtb3RlTG9hZGVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5yZW1vdGVMb2FkZXJzLnNldChzY29wZSwgbG9hZGVyKTtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdGVMb2FkZXJzLmRlbGV0ZShzY29wZSk7XG4gIH1cblxuICBhc3luYyBzYXZlKG5hbWU/OiBzdHJpbmcpOiBQcm9taXNlPEluc3BlY3RvckNoZWNrcG9pbnQgfCBudWxsPiB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgdGhpcy5lcnJvci5zZXQoJ0NoZWNrcG9pbnRzIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBhIGJyb3dzZXIuJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmlzQnVzeS5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCBJbnNwZWN0b3JDaGVja3BvaW50VmFsdWU+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycy52YWx1ZXMoKSkge1xuICAgICAgICBzdGF0ZVthZGFwdGVyLmlkXSA9IHRoaXMuY2xvbmVWYWx1ZShhd2FpdCBhZGFwdGVyLmNhcHR1cmUoKSwgYWRhcHRlci5pZCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjcmVhdGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCBjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50ID0ge1xuICAgICAgICB2ZXJzaW9uOiAxLFxuICAgICAgICBpZDogdGhpcy5jcmVhdGVJZCgpLFxuICAgICAgICBuYW1lOiBuYW1lPy50cmltKCkgfHwgdGhpcy5uZXh0QXV0b21hdGljTmFtZSh0aGlzLnJvdXRlUGF0aCh0aGlzLnJvdXRlci51cmwpKSxcbiAgICAgICAgdXJsOiB0aGlzLnJvdXRlci51cmwsXG4gICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgc2NvcGVzOiB0aGlzLmdldFNjb3BlcyhPYmplY3Qua2V5cyhzdGF0ZSkpLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgc2l6ZUJ5dGVzOiAwLFxuICAgICAgfTtcbiAgICAgIGNoZWNrcG9pbnQuc2l6ZUJ5dGVzID0gdGhpcy5zaXplT2YoY2hlY2twb2ludCk7XG4gICAgICB0aGlzLnBlcnNpc3RXaXRoRXZpY3Rpb24oW2NoZWNrcG9pbnQsIC4uLnRoaXMuY2hlY2twb2ludHMoKV0pO1xuICAgICAgcmV0dXJuIHRoaXMuY2hlY2twb2ludHMoKS5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSBjaGVja3BvaW50LmlkKSA/PyBudWxsO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCh0aGlzLm1lc3NhZ2VGb3IoZXJyb3IsICdVbmFibGUgdG8gc2F2ZSBjaGVja3BvaW50LicpKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzQnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlc3RvcmUoaWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSB0aGlzLmNoZWNrcG9pbnRzKCkuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuICAgIHRoaXMud2FybmluZy5zZXQobnVsbCk7XG4gICAgaWYgKCFjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLmVycm9yLnNldCgnQ2hlY2twb2ludCBub3QgZm91bmQuJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5pc0J1c3kuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHNjb3BlIG9mIGNoZWNrcG9pbnQuc2NvcGVzKSB7XG4gICAgICAgIGNvbnN0IGxvYWRlciA9IHRoaXMucmVtb3RlTG9hZGVycy5nZXQoc2NvcGUpO1xuICAgICAgICBpZiAobG9hZGVyKSB7XG4gICAgICAgICAgYXdhaXQgbG9hZGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWlzc2luZzogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgW2FkYXB0ZXJJZCwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNoZWNrcG9pbnQuc3RhdGUpKSB7XG4gICAgICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJzLmdldChhZGFwdGVySWQpO1xuICAgICAgICBpZiAoIWFkYXB0ZXIpIHtcbiAgICAgICAgICBtaXNzaW5nLnB1c2goYWRhcHRlcklkKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBhZGFwdGVyLnJlc3RvcmUodGhpcy5jbG9uZVZhbHVlKHZhbHVlLCBhZGFwdGVySWQpKTtcbiAgICAgIH1cbiAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCkge1xuICAgICAgICB0aGlzLndhcm5pbmcuc2V0KGBTa2lwcGVkICR7bWlzc2luZy5sZW5ndGh9IHVuYXZhaWxhYmxlIGFkYXB0ZXIke21pc3NpbmcubGVuZ3RoID09PSAxID8gJycgOiAncyd9OiAke21pc3Npbmcuam9pbignLCAnKX0uYCk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGNoZWNrcG9pbnQudXJsKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCh0aGlzLm1lc3NhZ2VGb3IoZXJyb3IsICdVbmFibGUgdG8gcmVzdG9yZSBjaGVja3BvaW50LicpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc0J1c3kuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICByZW5hbWUoaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dE5hbWUgPSBuYW1lLnRyaW0oKTtcbiAgICBpZiAoIW5leHROYW1lKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCgnQSBjaGVja3BvaW50IG5hbWUgaXMgcmVxdWlyZWQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmNoZWNrcG9pbnRzKCkubWFwKChjaGVja3BvaW50KSA9PlxuICAgICAgY2hlY2twb2ludC5pZCA9PT0gaWQgPyB7IC4uLmNoZWNrcG9pbnQsIG5hbWU6IG5leHROYW1lIH0gOiBjaGVja3BvaW50LFxuICAgICk7XG4gICAgdGhpcy5wZXJzaXN0V2l0aEV2aWN0aW9uKG5leHQpO1xuICB9XG5cbiAgZGVsZXRlKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICB0aGlzLnBlcnNpc3RXaXRoRXZpY3Rpb24odGhpcy5jaGVja3BvaW50cygpLmZpbHRlcigoY2hlY2twb2ludCkgPT4gY2hlY2twb2ludC5pZCAhPT0gaWQpKTtcbiAgfVxuXG4gIHByaXZhdGUgaHlkcmF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVkpO1xuICAgICAgaWYgKCFyYXcpIHJldHVybjtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyB1bmtub3duO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcnNlZCkpIHJldHVybjtcbiAgICAgIGNvbnN0IGNoZWNrcG9pbnRzID0gcGFyc2VkLmZpbHRlcih0aGlzLmlzQ2hlY2twb2ludCk7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5ub3JtYWxpemVMZWdhY3lOYW1lcyhjaGVja3BvaW50cyk7XG4gICAgICBjb25zdCBzb3J0ZWQgPSBub3JtYWxpemVkLmNoZWNrcG9pbnRzLnNvcnQoKGEsIGIpID0+XG4gICAgICAgIGIuY3JlYXRlZEF0LmxvY2FsZUNvbXBhcmUoYS5jcmVhdGVkQXQpIHx8IGIuaWQubG9jYWxlQ29tcGFyZShhLmlkKVxuICAgICAgKTtcbiAgICAgIHRoaXMuY2hlY2twb2ludHMuc2V0KHNvcnRlZCk7XG4gICAgICBpZiAobm9ybWFsaXplZC5jaGFuZ2VkKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoc29ydGVkKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLndhcm5pbmcuc2V0KCdTYXZlZCBjaGVja3BvaW50cyBjb3VsZCBub3QgYmUgcmVhZCBhbmQgd2VyZSBpZ25vcmVkLicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGVyc2lzdFdpdGhFdmljdGlvbihjaGVja3BvaW50czogSW5zcGVjdG9yQ2hlY2twb2ludFtdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3NlcikgcmV0dXJuO1xuICAgIGxldCBjYW5kaWRhdGUgPSBjaGVja3BvaW50cztcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShjYW5kaWRhdGUpKTtcbiAgICAgICAgdGhpcy5jaGVja3BvaW50cy5zZXQoY2FuZGlkYXRlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzUXVvdGFFcnJvcihlcnJvcikgfHwgY2FuZGlkYXRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5zbGljZSgwLCAtMSk7XG4gICAgICAgIHRoaXMud2FybmluZy5zZXQoJ1N0b3JhZ2Ugd2FzIGZ1bGw7IHRoZSBvbGRlc3QgY2hlY2twb2ludCB3YXMgcmVtb3ZlZC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsb25lVmFsdWUodmFsdWU6IHVua25vd24sIGFkYXB0ZXJJZDogc3RyaW5nKTogSW5zcGVjdG9yQ2hlY2twb2ludFZhbHVlIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgIGlmIChzZXJpYWxpemVkID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcigndW5kZWZpbmVkIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc2VyaWFsaXplZCkgYXMgSW5zcGVjdG9yQ2hlY2twb2ludFZhbHVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZGFwdGVyIFwiJHthZGFwdGVySWR9XCIgcmV0dXJuZWQgYSB2YWx1ZSB0aGF0IGNhbm5vdCBiZSBKU09OIHNlcmlhbGl6ZWQuYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRTY29wZXMoYWRhcHRlcklkczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KGFkYXB0ZXJJZHMubWFwKChpZCkgPT4gaWQuc3BsaXQoJzonLCAxKVswXSkpXTtcbiAgfVxuXG4gIHByaXZhdGUgcm91dGVQYXRoKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXJsLnNwbGl0KC9bPyNdLywgMSlbMF0gfHwgJy8nO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXh0QXV0b21hdGljTmFtZShyb3V0ZTogc3RyaW5nLCB1c2VkTmFtZXMgPSBuZXcgU2V0KHRoaXMuY2hlY2twb2ludHMoKS5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKSkpOiBzdHJpbmcge1xuICAgIGlmICghdXNlZE5hbWVzLmhhcyhyb3V0ZSkpIHJldHVybiByb3V0ZTtcbiAgICBmb3IgKGxldCBzdWZmaXggPSAyOyA7IHN1ZmZpeCArPSAxKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGUgPSBgJHtyb3V0ZX0gJHtzdWZmaXh9YDtcbiAgICAgIGlmICghdXNlZE5hbWVzLmhhcyhjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplTGVnYWN5TmFtZXMoY2hlY2twb2ludHM6IEluc3BlY3RvckNoZWNrcG9pbnRbXSk6IHtcbiAgICBjaGVja3BvaW50czogSW5zcGVjdG9yQ2hlY2twb2ludFtdO1xuICAgIGNoYW5nZWQ6IGJvb2xlYW47XG4gIH0ge1xuICAgIGNvbnN0IGxlZ2FjeUlkcyA9IG5ldyBTZXQoXG4gICAgICBjaGVja3BvaW50cy5maWx0ZXIoKGNoZWNrcG9pbnQpID0+IHRoaXMuaXNMZWdhY3lBdXRvbWF0aWNOYW1lKGNoZWNrcG9pbnQpKS5tYXAoKHsgaWQgfSkgPT4gaWQpLFxuICAgICk7XG4gICAgaWYgKCFsZWdhY3lJZHMuc2l6ZSkgcmV0dXJuIHsgY2hlY2twb2ludHMsIGNoYW5nZWQ6IGZhbHNlIH07XG5cbiAgICBjb25zdCB1c2VkTmFtZXMgPSBuZXcgU2V0KFxuICAgICAgY2hlY2twb2ludHMuZmlsdGVyKCh7IGlkIH0pID0+ICFsZWdhY3lJZHMuaGFzKGlkKSkubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBuYW1lcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29uc3Qgb2xkZXN0Rmlyc3QgPSBjaGVja3BvaW50c1xuICAgICAgLmZpbHRlcigoeyBpZCB9KSA9PiBsZWdhY3lJZHMuaGFzKGlkKSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmNyZWF0ZWRBdC5sb2NhbGVDb21wYXJlKGIuY3JlYXRlZEF0KSB8fCBhLmlkLmxvY2FsZUNvbXBhcmUoYi5pZCkpO1xuXG4gICAgZm9yIChjb25zdCBjaGVja3BvaW50IG9mIG9sZGVzdEZpcnN0KSB7XG4gICAgICBjb25zdCBuYW1lID0gdGhpcy5uZXh0QXV0b21hdGljTmFtZSh0aGlzLnJvdXRlUGF0aChjaGVja3BvaW50LnVybCksIHVzZWROYW1lcyk7XG4gICAgICBuYW1lcy5zZXQoY2hlY2twb2ludC5pZCwgbmFtZSk7XG4gICAgICB1c2VkTmFtZXMuYWRkKG5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjaGVja3BvaW50czogY2hlY2twb2ludHMubWFwKChjaGVja3BvaW50KSA9PlxuICAgICAgICBuYW1lcy5oYXMoY2hlY2twb2ludC5pZCkgPyB7IC4uLmNoZWNrcG9pbnQsIG5hbWU6IG5hbWVzLmdldChjaGVja3BvaW50LmlkKSEgfSA6IGNoZWNrcG9pbnRcbiAgICAgICksXG4gICAgICBjaGFuZ2VkOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGlzTGVnYWN5QXV0b21hdGljTmFtZShjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50KTogYm9vbGVhbiB7XG4gICAgY29uc3Qgcm91dGUgPSB0aGlzLnJvdXRlUGF0aChjaGVja3BvaW50LnVybCk7XG4gICAgY29uc3QgcHJlZml4ID0gYCR7cm91dGV9IMK3IGA7XG4gICAgaWYgKCFjaGVja3BvaW50Lm5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdGltZXN0YW1wID0gY2hlY2twb2ludC5uYW1lLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgIGlmICh0aW1lc3RhbXAgPT09IG5ldyBEYXRlKGNoZWNrcG9pbnQuY3JlYXRlZEF0KS50b0xvY2FsZVN0cmluZygpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IHBhcnNlZFRpbWVzdGFtcCA9IERhdGUucGFyc2UodGltZXN0YW1wKTtcbiAgICBjb25zdCBjcmVhdGVkVGltZXN0YW1wID0gRGF0ZS5wYXJzZShjaGVja3BvaW50LmNyZWF0ZWRBdCk7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWRUaW1lc3RhbXApICYmIE51bWJlci5pc0Zpbml0ZShjcmVhdGVkVGltZXN0YW1wKSAmJlxuICAgICAgTWF0aC5hYnMocGFyc2VkVGltZXN0YW1wIC0gY3JlYXRlZFRpbWVzdGFtcCkgPCAxMDAwO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgY2hlY2twb2ludC0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOSl9YDtcbiAgfVxuXG4gIHByaXZhdGUgc2l6ZU9mKGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnQpOiBudW1iZXIge1xuICAgIHJldHVybiBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoY2hlY2twb2ludCldKS5zaXplO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1F1b3RhRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiYgKFxuICAgICAgZXJyb3IubmFtZSA9PT0gJ1F1b3RhRXhjZWVkZWRFcnJvcicgfHwgZXJyb3IubmFtZSA9PT0gJ05TX0VSUk9SX0RPTV9RVU9UQV9SRUFDSEVEJ1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VGb3IoZXJyb3I6IHVua25vd24sIGZhbGxiYWNrOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGZhbGxiYWNrO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0NoZWNrcG9pbnQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBJbnNwZWN0b3JDaGVja3BvaW50ID0+IHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBjaGVja3BvaW50ID0gdmFsdWUgYXMgUGFydGlhbDxJbnNwZWN0b3JDaGVja3BvaW50PjtcbiAgICByZXR1cm4gY2hlY2twb2ludC52ZXJzaW9uID09PSAxICYmIHR5cGVvZiBjaGVja3BvaW50LmlkID09PSAnc3RyaW5nJyAmJlxuICAgICAgdHlwZW9mIGNoZWNrcG9pbnQubmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGNoZWNrcG9pbnQudXJsID09PSAnc3RyaW5nJyAmJlxuICAgICAgdHlwZW9mIGNoZWNrcG9pbnQuY3JlYXRlZEF0ID09PSAnc3RyaW5nJyAmJiBBcnJheS5pc0FycmF5KGNoZWNrcG9pbnQuc2NvcGVzKSAmJlxuICAgICAgISFjaGVja3BvaW50LnN0YXRlICYmIHR5cGVvZiBjaGVja3BvaW50LnN0YXRlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgY2hlY2twb2ludC5zaXplQnl0ZXMgPT09ICdudW1iZXInO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUluc3BlY3RvckNoZWNrcG9pbnRzKCk6IFByb3ZpZGVyW10ge1xuICByZXR1cm4gW0luc3BlY3RvckNoZWNrcG9pbnRSZWdpc3RyeV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCZWhhdmlvclN1YmplY3RDaGVja3BvaW50QWRhcHRlcjxUPihcbiAgaWQ6IHN0cmluZyxcbiAgc3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFQ+LFxuKTogSW5zcGVjdG9yQ2hlY2twb2ludEFkYXB0ZXIge1xuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIGNhcHR1cmU6ICgpID0+IHN1YmplY3QudmFsdWUgYXMgdW5rbm93biBhcyBJbnNwZWN0b3JDaGVja3BvaW50VmFsdWUsXG4gICAgcmVzdG9yZTogKHZhbHVlKSA9PiBzdWJqZWN0Lm5leHQodmFsdWUgYXMgVCksXG4gIH07XG59XG4iXX0=
323
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9jaGVja3BvaW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2QsUUFBUSxFQUNSLFdBQVcsRUFDWCx3QkFBd0IsRUFDeEIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBR0wsYUFBYSxFQUNiLEtBQUssR0FDTixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQWdCNUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUM3RCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFDckMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDO0FBRWpDLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUMxQyxJQUFJLGNBQWMsQ0FBZ0MsaUNBQWlDLENBQUMsQ0FBQztBQUV2RixNQUFNLFVBQVUsOEJBQThCLENBQzVDLE9BQXlCO0lBRXpCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDdkIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGtCQUFrQixFQUFFLENBQUM7WUFDdkMsT0FBUSxNQUFrQyxDQUFDLEtBQVUsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLE9BQWdCLDZCQUE2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dXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudmlyb25tZW50UHJvdmlkZXJzLFxuICBJbmplY3QsXG4gIEluamVjdGFibGUsXG4gIEluamVjdGlvblRva2VuLFxuICBPcHRpb25hbCxcbiAgUExBVEZPUk1fSUQsXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICBBY3Rpb24sXG4gIEFjdGlvblJlZHVjZXIsXG4gIE1FVEFfUkVEVUNFUlMsXG4gIFN0b3JlLFxufSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgdGFrZSB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQge1xuICB2ZXJzaW9uOiAxO1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHJvdXRlOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xuICBzdGF0ZTogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIFJlc3RvcmVDaGVja3BvaW50QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHtcbiAgdHlwZTogdHlwZW9mIFJFU1RPUkVfQ0hFQ0tQT0lOVDtcbiAgc3RhdGU6IHVua25vd247XG59XG5cbmNvbnN0IFJFU1RPUkVfQ0hFQ0tQT0lOVCA9ICdbSW5zcGVjdG9yIENoZWNrcG9pbnRzXSBSZXN0b3JlJztcbmNvbnN0IERBVEFCQVNFX05BTUUgPSAnaW5zcGVjdG9yLW5nJztcbmNvbnN0IERBVEFCQVNFX1ZFUlNJT04gPSAxO1xuY29uc3QgU1RPUkVfTkFNRSA9ICdjaGVja3BvaW50cyc7XG5cbmV4cG9ydCBjb25zdCBJTlNQRUNUT1JfQ0hFQ0tQT0lOVF9SRVBPU0lUT1JZID1cbiAgbmV3IEluamVjdGlvblRva2VuPEluc3BlY3RvckNoZWNrcG9pbnRSZXBvc2l0b3J5PignSU5TUEVDVE9SX0NIRUNLUE9JTlRfUkVQT1NJVE9SWScpO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5zcGVjdG9yQ2hlY2twb2ludE1ldGFSZWR1Y2VyPFQ+KFxuICByZWR1Y2VyOiBBY3Rpb25SZWR1Y2VyPFQ+LFxuKTogQWN0aW9uUmVkdWNlcjxUPiB7XG4gIHJldHVybiAoc3RhdGUsIGFjdGlvbikgPT4ge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gUkVTVE9SRV9DSEVDS1BPSU5UKSB7XG4gICAgICByZXR1cm4gKGFjdGlvbiBhcyBSZXN0b3JlQ2hlY2twb2ludEFjdGlvbikuc3RhdGUgYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG4gIH07XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJbnNwZWN0b3JDaGVja3BvaW50UmVwb3NpdG9yeSB7XG4gIGFic3RyYWN0IGxpc3QoKTogUHJvbWlzZTxJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkW10+O1xuICBhYnN0cmFjdCBwdXQoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCk6IFByb21pc2U8dm9pZD47XG4gIGFic3RyYWN0IGRlbGV0ZShpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEluZGV4ZWREYkNoZWNrcG9pbnRSZXBvc2l0b3J5IGV4dGVuZHMgSW5zcGVjdG9yQ2hlY2twb2ludFJlcG9zaXRvcnkge1xuICBwcml2YXRlIGRhdGFiYXNlUHJvbWlzZTogUHJvbWlzZTxJREJEYXRhYmFzZT4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQ6IG9iamVjdCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBhc3luYyBsaXN0KCk6IFByb21pc2U8SW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZFtdPiB7XG4gICAgY29uc3QgZGF0YWJhc2UgPSBhd2FpdCB0aGlzLmRhdGFiYXNlKCk7XG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgdGhpcy5yZXF1ZXN0PHVua25vd25bXT4oXG4gICAgICBkYXRhYmFzZS50cmFuc2FjdGlvbihTVE9SRV9OQU1FLCAncmVhZG9ubHknKS5vYmplY3RTdG9yZShTVE9SRV9OQU1FKS5nZXRBbGwoKSxcbiAgICApO1xuICAgIHJldHVybiB2YWx1ZXNcbiAgICAgIC5maWx0ZXIoaXNDaGVja3BvaW50UmVjb3JkKVxuICAgICAgLnNvcnQobmV3ZXN0Rmlyc3QpO1xuICB9XG5cbiAgYXN5bmMgcHV0KGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkYXRhYmFzZSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UoKTtcbiAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uQ29tcGxldGUoZGF0YWJhc2UsICdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLnB1dChjaGVja3BvaW50KSk7XG4gIH1cblxuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGFiYXNlID0gYXdhaXQgdGhpcy5kYXRhYmFzZSgpO1xuICAgIGF3YWl0IHRoaXMudHJhbnNhY3Rpb25Db21wbGV0ZShkYXRhYmFzZSwgJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4gc3RvcmUuZGVsZXRlKGlkKSk7XG4gIH1cblxuICBwcml2YXRlIGRhdGFiYXNlKCk6IFByb21pc2U8SURCRGF0YWJhc2U+IHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgfHwgdHlwZW9mIGluZGV4ZWREQiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0NoZWNrcG9pbnRzIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBhIGJyb3dzZXIgd2l0aCBJbmRleGVkREIuJykpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhYmFzZVByb21pc2UpIHJldHVybiB0aGlzLmRhdGFiYXNlUHJvbWlzZTtcblxuICAgIHRoaXMuZGF0YWJhc2VQcm9taXNlID0gbmV3IFByb21pc2U8SURCRGF0YWJhc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihEQVRBQkFTRV9OQU1FLCBEQVRBQkFTRV9WRVJTSU9OKTtcbiAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhYmFzZSA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgICBpZiAoZGF0YWJhc2Uub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTVE9SRV9OQU1FKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzdG9yZSA9IGRhdGFiYXNlLmNyZWF0ZU9iamVjdFN0b3JlKFNUT1JFX05BTUUsIHsga2V5UGF0aDogJ2lkJyB9KTtcbiAgICAgICAgc3RvcmUuY3JlYXRlSW5kZXgoJ2NyZWF0ZWRBdCcsICdjcmVhdGVkQXQnKTtcbiAgICAgIH07XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUocmVxdWVzdC5yZXN1bHQpO1xuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IgPz8gbmV3IEVycm9yKCdJbmRleGVkREIgY291bGQgbm90IGJlIG9wZW5lZC4nKSk7XG4gICAgICByZXF1ZXN0Lm9uYmxvY2tlZCA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0luZGV4ZWREQiBpcyBibG9ja2VkIGJ5IGFub3RoZXIgb3BlbiB0YWIuJykpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlUHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWVzdDxUPihyZXF1ZXN0OiBJREJSZXF1ZXN0PFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7XG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvciA/PyBuZXcgRXJyb3IoJ0luZGV4ZWREQiByZXF1ZXN0IGZhaWxlZC4nKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zYWN0aW9uQ29tcGxldGUoXG4gICAgZGF0YWJhc2U6IElEQkRhdGFiYXNlLFxuICAgIG1vZGU6IElEQlRyYW5zYWN0aW9uTW9kZSxcbiAgICBvcGVyYXRpb246IChzdG9yZTogSURCT2JqZWN0U3RvcmUpID0+IElEQlJlcXVlc3QsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRhdGFiYXNlLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsIG1vZGUpO1xuICAgICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgIHRyYW5zYWN0aW9uLm9uZXJyb3IgPSAoKSA9PiByZWplY3QodHJhbnNhY3Rpb24uZXJyb3IgPz8gbmV3IEVycm9yKCdJbmRleGVkREIgdHJhbnNhY3Rpb24gZmFpbGVkLicpKTtcbiAgICAgIHRyYW5zYWN0aW9uLm9uYWJvcnQgPSAoKSA9PiByZWplY3QodHJhbnNhY3Rpb24uZXJyb3IgPz8gbmV3IEVycm9yKCdJbmRleGVkREIgdHJhbnNhY3Rpb24gd2FzIGFib3J0ZWQuJykpO1xuICAgICAgb3BlcmF0aW9uKHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpKTtcbiAgICB9KTtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSW5zcGVjdG9yQ2hlY2twb2ludFNlcnZpY2Uge1xuICByZWFkb25seSBjaGVja3BvaW50cyA9IHNpZ25hbDxJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkW10+KFtdKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGJ1c3kgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBlcnJvciA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KElOU1BFQ1RPUl9DSEVDS1BPSU5UX1JFUE9TSVRPUlkpXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXBvc2l0b3J5OiBJbnNwZWN0b3JDaGVja3BvaW50UmVwb3NpdG9yeSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFN0b3JlKSBwcml2YXRlIHJlYWRvbmx5IHN0b3JlOiBTdG9yZSB8IG51bGwsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChSb3V0ZXIpIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIgfCBudWxsLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZDogb2JqZWN0LFxuICApIHt9XG5cbiAgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldCgoYXdhaXQgdGhpcy5yZXBvc2l0b3J5Lmxpc3QoKSkuc29ydChuZXdlc3RGaXJzdCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCh0aGlzLm1lc3NhZ2VGb3IoZXJyb3IsICdTYXZlZCBjaGVja3BvaW50cyBjb3VsZCBub3QgYmUgbG9hZGVkLiBUcnkgcmVsb2FkaW5nIHRoZSBwYWdlLicpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2F2ZSgpOiBQcm9taXNlPEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQgfCBudWxsPiB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgaWYgKCF0aGlzLnN0b3JlKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCh0aGlzLm1pc3NpbmdTdG9yZU1lc3NhZ2UoKSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmJ1c3kuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnN0b3JlLnBpcGUodGFrZSgxKSkpO1xuICAgICAgY29uc3Qgc3RhdGUgPSBjbG9uZUpzb24oY3VycmVudFN0YXRlKTtcbiAgICAgIGNvbnN0IHBlcnNpc3RlZCA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5saXN0KCk7XG4gICAgICBjb25zdCByb3V0ZSA9IHRoaXMuY3VycmVudFJvdXRlKCk7XG4gICAgICBjb25zdCBwYXRobmFtZSA9IHRoaXMuY3VycmVudFBhdGhuYW1lKCk7XG4gICAgICBjb25zdCBjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkID0ge1xuICAgICAgICB2ZXJzaW9uOiAxLFxuICAgICAgICBpZDogY3JlYXRlQ2hlY2twb2ludElkKCksXG4gICAgICAgIG5hbWU6IG5leHRBdXRvbWF0aWNOYW1lKHBhdGhuYW1lLCBwZXJzaXN0ZWQubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSkpLFxuICAgICAgICByb3V0ZSxcbiAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXRlLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMucmVwb3NpdG9yeS5wdXQoY2hlY2twb2ludCk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldChbY2hlY2twb2ludCwgLi4ucGVyc2lzdGVkXS5zb3J0KG5ld2VzdEZpcnN0KSk7XG4gICAgICByZXR1cm4gY2hlY2twb2ludDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lcnJvci5zZXQodGhpcy5zdG9yYWdlTWVzc2FnZShlcnJvciwgJ1RoZSBjaGVja3BvaW50IGNvdWxkIG5vdCBiZSBzYXZlZC4nKSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5idXN5LnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVzdG9yZShpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgaWYgKCF0aGlzLnN0b3JlKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCh0aGlzLm1pc3NpbmdTdG9yZU1lc3NhZ2UoKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuYnVzeS5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNoZWNrcG9pbnQgPSAoYXdhaXQgdGhpcy5yZXBvc2l0b3J5Lmxpc3QoKSkuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgaWYgKCFjaGVja3BvaW50KSB0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrcG9pbnQgbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgaW4gYW5vdGhlciB0YWIuJyk7XG4gICAgICBjb25zdCBzdGF0ZSA9IGNsb25lSnNvbihcbiAgICAgICAgY2hlY2twb2ludC5zdGF0ZSxcbiAgICAgICAgYOKAnCR7Y2hlY2twb2ludC5uYW1lfeKAnSBjb3VsZCBub3QgYmUgZGVjb2RlZC4gRGVsZXRlIGl0IGFuZCBzYXZlIGEgbmV3IGNoZWNrcG9pbnQuYCxcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHsgdHlwZTogUkVTVE9SRV9DSEVDS1BPSU5ULCBzdGF0ZSB9IGFzIFJlc3RvcmVDaGVja3BvaW50QWN0aW9uKTtcbiAgICAgIGlmICh0aGlzLnJvdXRlciAmJiAhYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChjaGVja3BvaW50LnJvdXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBzdGF0ZSB3YXMgcmVzdG9yZWQsIGJ1dCBuYXZpZ2F0aW9uIHRvIOKAnCR7Y2hlY2twb2ludC5yb3V0ZX3igJ0gd2FzIGNhbmNlbGxlZC5gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCh0aGlzLm1lc3NhZ2VGb3IoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgcmVzdG9yZWQuIERlbGV0ZSBpdCBhbmQgc2F2ZSBhIG5ldyBvbmUuJykpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmJ1c3kuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZW5hbWUoaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgY29uc3QgbmV4dE5hbWUgPSBuYW1lLnRyaW0oKTtcbiAgICBpZiAoIW5leHROYW1lKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCgnUGxlYXNlIGVudGVyIGEgY2hlY2twb2ludCBuYW1lLicpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuYnVzeS5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNoZWNrcG9pbnRzID0gYXdhaXQgdGhpcy5yZXBvc2l0b3J5Lmxpc3QoKTtcbiAgICAgIGlmIChjaGVja3BvaW50cy5zb21lKChpdGVtKSA9PiBpdGVtLmlkICE9PSBpZCAmJiBpdGVtLm5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gbmV4dE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIGNoZWNrcG9pbnQgbmFtZWQg4oCcJHtuZXh0TmFtZX3igJ0gYWxyZWFkeSBleGlzdHMuIENob29zZSBhIGRpZmZlcmVudCBuYW1lLmApO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hlY2twb2ludCA9IGNoZWNrcG9pbnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGlkKTtcbiAgICAgIGlmICghY2hlY2twb2ludCkgdGhyb3cgbmV3IEVycm9yKCdDaGVja3BvaW50IG5vdCBmb3VuZC4gSXQgbWF5IGhhdmUgYmVlbiBkZWxldGVkIGluIGFub3RoZXIgdGFiLicpO1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LnB1dCh7IC4uLmNoZWNrcG9pbnQsIG5hbWU6IG5leHROYW1lIH0pO1xuICAgICAgdGhpcy5jaGVja3BvaW50cy5zZXQoXG4gICAgICAgIGNoZWNrcG9pbnRzLm1hcCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQgPyB7IC4uLml0ZW0sIG5hbWU6IG5leHROYW1lIH0gOiBpdGVtKS5zb3J0KG5ld2VzdEZpcnN0KSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lcnJvci5zZXQodGhpcy5zdG9yYWdlTWVzc2FnZShlcnJvciwgJ1RoZSBjaGVja3BvaW50IGNvdWxkIG5vdCBiZSByZW5hbWVkLicpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5idXN5LnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICB0aGlzLmJ1c3kuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnkuZGVsZXRlKGlkKTtcbiAgICAgIHRoaXMuY2hlY2twb2ludHMuc2V0KHRoaXMuY2hlY2twb2ludHMoKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaWQgIT09IGlkKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lcnJvci5zZXQodGhpcy5zdG9yYWdlTWVzc2FnZShlcnJvciwgJ1RoZSBjaGVja3BvaW50IGNvdWxkIG5vdCBiZSBkZWxldGVkLicpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5idXN5LnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJFcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgY3VycmVudFJvdXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gJy8nO1xuICAgIHJldHVybiBgJHt0aGlzLmN1cnJlbnRQYXRobmFtZSgpfSR7d2luZG93LmxvY2F0aW9uLnNlYXJjaH0ke3dpbmRvdy5sb2NhdGlvbi5oYXNofWA7XG4gIH1cblxuICBwcml2YXRlIGN1cnJlbnRQYXRobmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuICcvJztcbiAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lIHx8ICcvJztcbiAgfVxuXG4gIHByaXZhdGUgbWlzc2luZ1N0b3JlTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnVGhlIE5nUnggcm9vdCBzdG9yZSBpcyB1bmF2YWlsYWJsZS4gQ2hlY2sgdGhhdCBwcm92aWRlSW5zcGVjdG9yQ2hlY2twb2ludHMoKSBpcyByZWdpc3RlcmVkIGFmdGVyIHByb3ZpZGVTdG9yZSgpLic7XG4gIH1cblxuICBwcml2YXRlIHN0b3JhZ2VNZXNzYWdlKGVycm9yOiB1bmtub3duLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoaXNRdW90YUVycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuICdCcm93c2VyIHN0b3JhZ2UgaXMgZnVsbC4gRGVsZXRlIG9sZCBjaGVja3BvaW50cywgdGhlbiB0cnkgc2F2aW5nIGFnYWluLic7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VGb3IoZXJyb3IsIGZhbGxiYWNrKTtcbiAgfVxuXG4gIHByaXZhdGUgbWVzc2FnZUZvcihlcnJvcjogdW5rbm93biwgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZSA/IGVycm9yLm1lc3NhZ2UgOiBmYWxsYmFjaztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUluc3BlY3RvckNoZWNrcG9pbnRzKCk6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAgSW5kZXhlZERiQ2hlY2twb2ludFJlcG9zaXRvcnksXG4gICAge1xuICAgICAgcHJvdmlkZTogSU5TUEVDVE9SX0NIRUNLUE9JTlRfUkVQT1NJVE9SWSxcbiAgICAgIHVzZUV4aXN0aW5nOiBJbmRleGVkRGJDaGVja3BvaW50UmVwb3NpdG9yeSxcbiAgICB9LFxuICAgIEluc3BlY3RvckNoZWNrcG9pbnRTZXJ2aWNlLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE1FVEFfUkVEVUNFUlMsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHVzZVZhbHVlOiBpbnNwZWN0b3JDaGVja3BvaW50TWV0YVJlZHVjZXIsXG4gICAgfSxcbiAgXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXh0QXV0b21hdGljTmFtZShyb3V0ZTogc3RyaW5nLCBuYW1lczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB1c2VkID0gbmV3IFNldChuYW1lcy5tYXAoKG5hbWUpID0+IG5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSkpO1xuICBpZiAoIXVzZWQuaGFzKHJvdXRlLnRvTG9jYWxlTG93ZXJDYXNlKCkpKSByZXR1cm4gcm91dGU7XG4gIGZvciAobGV0IHN1ZmZpeCA9IDI7IDsgc3VmZml4ICs9IDEpIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBgJHtyb3V0ZX0gJHtzdWZmaXh9YDtcbiAgICBpZiAoIXVzZWQuaGFzKGNhbmRpZGF0ZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9uZUpzb24oXG4gIHZhbHVlOiB1bmtub3duLFxuICBmYWlsdXJlTWVzc2FnZSA9ICdUaGUgTmdSeCByb290IHN0YXRlIGlzIG5vdCBKU09OLXNlcmlhbGl6YWJsZS4gUmVtb3ZlIGNpcmN1bGFyIG9yIHVuc3VwcG9ydGVkIHZhbHVlcyBhbmQgdHJ5IGFnYWluLicsXG4pOiB1bmtub3duIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIGlmIChzZXJpYWxpemVkID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcigpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKHNlcmlhbGl6ZWQpIGFzIHVua25vd247XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihmYWlsdXJlTWVzc2FnZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2hlY2twb2ludElkKCk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY3J5cHRvLnJhbmRvbVVVSUQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfVxuICByZXR1cm4gYGNoZWNrcG9pbnQtJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDkpfWA7XG59XG5cbmZ1bmN0aW9uIGlzUXVvdGFFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiYgKFxuICAgIGVycm9yLm5hbWUgPT09ICdRdW90YUV4Y2VlZGVkRXJyb3InIHx8IGVycm9yLm5hbWUgPT09ICdOU19FUlJPUl9ET01fUVVPVEFfUkVBQ0hFRCdcbiAgKTtcbn1cblxuZnVuY3Rpb24gbmV3ZXN0Rmlyc3QoYTogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCwgYjogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCk6IG51bWJlciB7XG4gIHJldHVybiBiLmNyZWF0ZWRBdC5sb2NhbGVDb21wYXJlKGEuY3JlYXRlZEF0KSB8fCBiLmlkLmxvY2FsZUNvbXBhcmUoYS5pZCk7XG59XG5cbmZ1bmN0aW9uIGlzQ2hlY2twb2ludFJlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgY2hlY2twb2ludCA9IHZhbHVlIGFzIFBhcnRpYWw8SW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZD47XG4gIHJldHVybiBjaGVja3BvaW50LnZlcnNpb24gPT09IDEgJiZcbiAgICB0eXBlb2YgY2hlY2twb2ludC5pZCA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2YgY2hlY2twb2ludC5uYW1lID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBjaGVja3BvaW50LnJvdXRlID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBjaGVja3BvaW50LmNyZWF0ZWRBdCA9PT0gJ3N0cmluZycgJiZcbiAgICAnc3RhdGUnIGluIGNoZWNrcG9pbnQ7XG59XG4iXX0=