@sumaris-net/ngx-components 18.12.10 → 18.12.11

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.
@@ -15,11 +15,11 @@ export class EntitiesTableDataSource extends TableDataSource {
15
15
  _entityName;
16
16
  _debug = false;
17
17
  _creating = false;
18
- _saving = false;
19
18
  _fetchMoreFn = null;
20
19
  _waitingNetworkResult;
21
20
  _stopWatchSubject = new Subject();
22
21
  loadingSubject = new BehaviorSubject(undefined);
22
+ savingSubject = new BehaviorSubject(false);
23
23
  get watchAllOptions() {
24
24
  return this.config.watchAllOptions;
25
25
  }
@@ -33,10 +33,13 @@ export class EntitiesTableDataSource extends TableDataSource {
33
33
  this.config.saveAllOptions = value;
34
34
  }
35
35
  get loaded() {
36
- return this.loadingSubject.value === false; // Should be false when undefined (initial state)
36
+ return this.loadingSubject.getValue() === false; // Should be false when undefined (initial state)
37
37
  }
38
38
  get loading() {
39
- return this.loadingSubject.value !== false; // Should be true when undefined (initial state)
39
+ return this.loadingSubject.getValue() !== false; // Should be true when undefined (initial state)
40
+ }
41
+ get saving() {
42
+ return this.savingSubject.getValue();
40
43
  }
41
44
  /**
42
45
  * Creates a new TableDataSource instance, that can be used as datasource of `@angular/cdk` data-table.
@@ -61,19 +64,13 @@ export class EntitiesTableDataSource extends TableDataSource {
61
64
  ngOnDestroy() {
62
65
  this.disconnect();
63
66
  }
64
- /**
65
- * @deprecated use disconnect
66
- */
67
- close() {
68
- this.disconnect();
69
- }
70
67
  watchAll(offset, size, sortBy, sortDirection, filter) {
71
68
  this._stopWatchSubject.next();
72
69
  this._fetchMoreFn = null;
73
70
  this.markAsLoading();
74
71
  this._waitingNetworkResult = (this.watchAllOptions?.fetchPolicy || this.dataService?.defaultFetchPolicy) === 'cache-and-network';
75
72
  return this.dataService.watchAll(offset, size, sortBy, sortDirection, filter, this.watchAllOptions).pipe(catchError((err) => this.handleError(err, 'ERROR.LOAD_DATA_ERROR')), map((res) => {
76
- if (this._saving) {
73
+ if (this.saving) {
77
74
  console.info(`[entities-table-datasource] Received ${this._entityName} data (from service), but still saving: skip`);
78
75
  }
79
76
  else {
@@ -109,12 +106,11 @@ export class EntitiesTableDataSource extends TableDataSource {
109
106
  return false;
110
107
  }
111
108
  // Saving twice (should never occur)
112
- if (this._saving) {
109
+ if (this.saving) {
113
110
  console.warn(`[entities-table-datasource] Trying to save ${this._entityName} rows twice. Skip`);
114
111
  return false;
115
112
  }
116
- this._saving = true;
117
- this.markAsLoading();
113
+ this.markAsSaving();
118
114
  const onlyDirtyRows = this.config.saveOnlyDirtyRows;
119
115
  try {
120
116
  if (this._debug)
@@ -164,7 +160,7 @@ export class EntitiesTableDataSource extends TableDataSource {
164
160
  if (this._debug)
165
161
  console.debug(`[entities-table-datasource] Saving ${this._entityName} data [OK]`);
166
162
  // LP 23/03/2021: update datasource is necessary but can be changed to a refetch() on QueryRef (must be created and registered in GraphqlService.watchQuery)
167
- this.updateDatasource(data, { emitEvent: false });
163
+ this.updateDatasource(data);
168
164
  return true;
169
165
  }
170
166
  catch (error) {
@@ -173,8 +169,7 @@ export class EntitiesTableDataSource extends TableDataSource {
173
169
  throw error;
174
170
  }
175
171
  finally {
176
- this._saving = false;
177
- this.markAsLoaded();
172
+ this.markAsSaved();
178
173
  }
179
174
  }
180
175
  updateDatasource(data, opts) {
@@ -239,7 +234,7 @@ export class EntitiesTableDataSource extends TableDataSource {
239
234
  const confirmed = super.confirmEdit(row);
240
235
  if (!confirmed)
241
236
  return false;
242
- if (row.editing && row.validator) {
237
+ if (row.validator?.enabled) {
243
238
  console.warn('[entities-table-datasource] Row still has {editing: true} after confirmEdit()! Force editing to false');
244
239
  row.validator.disable({ onlySelf: true, emitEvent: false });
245
240
  }
@@ -249,7 +244,7 @@ export class EntitiesTableDataSource extends TableDataSource {
249
244
  const editing = super.startEdit(row);
250
245
  if (!editing)
251
246
  return false;
252
- if (!row.editing && row.validator) {
247
+ if (row.validator?.disabled) {
253
248
  console.warn('[entities-table-datasource] Row still has {editing: false} after startEdit()! Force editing');
254
249
  row.validator.enable({ onlySelf: true, emitEvent: false });
255
250
  }
@@ -278,8 +273,6 @@ export class EntitiesTableDataSource extends TableDataSource {
278
273
  return;
279
274
  }
280
275
  this.markAsLoading();
281
- const superDelete = super.delete;
282
- const self = this;
283
276
  this.dataService
284
277
  .deleteAll([row.currentData], this.saveAllOptions)
285
278
  .catch((err) => this.handleServiceError(err))
@@ -288,7 +281,7 @@ export class EntitiesTableDataSource extends TableDataSource {
288
281
  // make sure row has been deleted (because GrapQHl cache remove can failed)
289
282
  const present = this.getRow(id) === row;
290
283
  if (present)
291
- superDelete.call(self, id);
284
+ super.delete(id);
292
285
  this.markAsLoaded();
293
286
  }, 300);
294
287
  });
@@ -299,19 +292,18 @@ export class EntitiesTableDataSource extends TableDataSource {
299
292
  try {
300
293
  // Call service deletion
301
294
  await this.dataService.deleteAll(data, this.saveAllOptions);
302
- await sleep(300); // Wait propagation (e.g. update cache, then received update from dataService.watchAll())
295
+ // Wait propagation (e.g. update cache, then received update from dataService.watchAll())
296
+ await sleep(500);
303
297
  // Workaround, to be sure all rows have been deleted
304
298
  // Sometime, the service miss deletion, or GraphQl cache remove failed.
305
- // In this case, apply missing deletion using the super.delete() function
299
+ // In this case, apply missing deletion using the parent delete() function
306
300
  const rowNotDeleted = this.getRows().filter((row) => rows.includes(row));
307
301
  if (isNotEmptyArray(rowNotDeleted)) {
308
- const superDelete = super.delete;
309
- const self = this;
310
302
  console.warn(`[entities-table-datasource] Force deletion of ${rowNotDeleted.length} rows! Please check that data service update the cache, after deletion`);
311
- rowNotDeleted
312
- // Start at the end
313
- .sort((a, b) => (a.id > b.id ? -1 : 1))
314
- .forEach((r) => superDelete.call(self, r.id));
303
+ // Start at the end
304
+ for (const r of rowNotDeleted.sort((a, b) => (a.id > b.id ? -1 : 1))) {
305
+ super.delete(r.id);
306
+ }
315
307
  }
316
308
  }
317
309
  catch (err) {
@@ -326,13 +318,13 @@ export class EntitiesTableDataSource extends TableDataSource {
326
318
  return super.getRow(id);
327
319
  }
328
320
  getRows() {
329
- return this.rowsSubject.getValue();
321
+ return this.rowsSubject.getValue() || [];
330
322
  }
331
323
  hasSomeEditingRow() {
332
- return (this.rowsSubject.value || []).some((row) => row.editing);
324
+ return this.getRows().some((row) => row.editing);
333
325
  }
334
326
  hasSomeDirtyRow() {
335
- return (this.rowsSubject.value || []).some((row) => row.dirty);
327
+ return this.getRows().some((row) => row.dirty);
336
328
  }
337
329
  async createNew(insertAt, opts = { editing: true }) {
338
330
  // Avoid multiple call (only one editing row is allowed)
@@ -396,10 +388,20 @@ export class EntitiesTableDataSource extends TableDataSource {
396
388
  this.loadingSubject.next(false);
397
389
  }
398
390
  }
391
+ markAsSaving() {
392
+ if (this.savingSubject.value !== true) {
393
+ this.savingSubject.next(true);
394
+ }
395
+ }
396
+ markAsSaved() {
397
+ if (this.savingSubject.value !== false) {
398
+ this.savingSubject.next(false);
399
+ }
400
+ }
399
401
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EntitiesTableDataSource, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
400
402
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: EntitiesTableDataSource, usesInheritance: true, ngImport: i0 });
401
403
  }
402
404
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EntitiesTableDataSource, decorators: [{
403
405
  type: Directive
404
406
  }], ctorParameters: () => [{ type: undefined }, { type: undefined }, { type: undefined }, { type: undefined }] });
405
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS9lbnRpdGllcy10YWJsZS1kYXRhc291cmNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQXlELE1BQU0sMEJBQTBCLENBQUM7QUFDbEgsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUlyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOztBQXlCaEUsV0FBVztBQUVYLGtFQUFrRTtBQUNsRSxNQUFNLE9BQU8sdUJBVVgsU0FBUSxlQUEyQjtJQWdEakI7SUE3Q0QsV0FBVyxDQUFTO0lBRTNCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDZixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsWUFBWSxHQUErQixJQUFJLENBQUM7SUFDaEQscUJBQXFCLENBQVU7SUFDL0IsaUJBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVsRCxjQUFjLEdB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RTVCLGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7d0dBemNVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCOzs0RkFBdkIsdUJBQXVCO2tCQUZuQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGFibGVEYXRhU291cmNlLCBUYWJsZURhdGFTb3VyY2VDb25maWcsIFRhYmxlRWxlbWVudCwgVmFsaWRhdG9yU2VydmljZSB9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElFbnRpdHkgfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJy4uL3NlcnZpY2VzL2Vycm9ycyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU29ydERpcmVjdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblZpZXdlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBFbnRpdGllc1NlcnZpY2VXYXRjaE9wdGlvbnMsIEZldGNoTW9yZUZuLCBJRW50aXRpZXNTZXJ2aWNlLCBMb2FkUmVzdWx0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IGZpcnN0RmFsc2VQcm9taXNlLCBGaXJzdE9wdGlvbnMgfSBmcm9tICcuLi8uLi9zaGFyZWQvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHsgaXNFbXB0eUFycmF5LCBpc05vdEVtcHR5QXJyYXksIHJlbW92ZUVuZCwgc2xlZXAgfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IEFwcFRhYmxlVXRpbHMgfSBmcm9tICcuL3RhYmxlLnV0aWxzJztcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50JztcbmltcG9ydCB7IElFbnRpdGllc1RhYmxlRGF0YVNvdXJjZSB9IGZyb20gJy4vdGFibGUubW9kZWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0aWVzVGFibGVEYXRhU291cmNlQ29uZmlnPFxuICBUIGV4dGVuZHMgSUVudGl0eTxULCBJRD4sXG4gIElEID0gbnVtYmVyLFxuICBXTyBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyA9IEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyxcbiAgU08gPSBhbnksXG4+IGV4dGVuZHMgVGFibGVEYXRhU291cmNlQ29uZmlnIHtcbiAgb25Sb3dDcmVhdGVkPzogKHJvdzogVGFibGVFbGVtZW50PFQ+KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgc2F2ZU9ubHlEaXJ0eVJvd3M/OiBib29sZWFuOyAvLyBGYWxzZSBieSBkZWZhdWx0XG4gIHNhdmVCZWZvcmVEZWxldGU/OiBib29sZWFuOyAvLyBGYWxzZSBieSBkZWZhdWx0XG4gIHJlYWRPbmx5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGRhdGFTZXJ2aWNlT3B0aW9ucz86IFdPICYgU087IC8vIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBkYXRhU2VydmljZS53YXRjaEFsbCgpIGFuZCBkYXRhU2VydmljZS5zYXZlQWxsKClcblxuICB3YXRjaEFsbE9wdGlvbnM/OiBXTzsgLy8gT3B0aW9ucyBwYXNzZWQgdG8gdGhlIGRhdGFTZXJ2aWNlLnNhdmVBbGwoKVxuICBzYXZlQWxsT3B0aW9ucz86IFNPOyAvLyBPcHRpb25zIHBhc3NlZCB0byB0aGUgZGF0YVNlcnZpY2Uuc2F2ZUFsbCgpXG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vLyBAZHluYW1pY1xuQERpcmVjdGl2ZSgpXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZTxcbiAgICBUIGV4dGVuZHMgSUVudGl0eTxULCBJRD4sXG4gICAgRiA9IGFueSxcbiAgICBJRCA9IG51bWJlcixcbiAgICBXTyBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyA9IEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyxcbiAgICBTTyA9IGFueSxcbiAgICBWIGV4dGVuZHMgVmFsaWRhdG9yU2VydmljZSA9IFZhbGlkYXRvclNlcnZpY2UsXG4gICAgQyBleHRlbmRzIEVudGl0aWVzVGFibGVEYXRhU291cmNlQ29uZmlnPFQsIElELCBXTywgU08+ID0gRW50aXRpZXNUYWJsZURhdGFTb3VyY2VDb25maWc8VCwgSUQsIFdPLCBTTz4sXG4gICAgUiBleHRlbmRzIFRhYmxlRWxlbWVudDxUPiA9IFRhYmxlRWxlbWVudDxUPixcbiAgPlxuICBleHRlbmRzIFRhYmxlRGF0YVNvdXJjZTxULCBWLCBDLCBSPlxuICBpbXBsZW1lbnRzIElFbnRpdGllc1RhYmxlRGF0YVNvdXJjZTxSPiwgT25EZXN0cm95XG57XG4gIHByaXZhdGUgcmVhZG9ubHkgX2VudGl0eU5hbWU6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgX2RlYnVnID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfY3JlYXRpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zYXZpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9mZXRjaE1vcmVGbjogRmV0Y2hNb3JlRm48TG9hZFJlc3VsdDxUPj4gPSBudWxsO1xuICBwcm90ZWN0ZWQgX3dhaXRpbmdOZXR3b3JrUmVzdWx0OiBib29sZWFuO1xuICBwcm90ZWN0ZWQgX3N0b3BXYXRjaFN1YmplY3QgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGxvYWRpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih1bmRlZmluZWQpO1xuXG4gIGdldCB3YXRjaEFsbE9wdGlvbnMoKTogV08ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy53YXRjaEFsbE9wdGlvbnM7XG4gIH1cblxuICBzZXQgd2F0Y2hBbGxPcHRpb25zKHZhbHVlOiBXTykge1xuICAgIHRoaXMuY29uZmlnLndhdGNoQWxsT3B0aW9ucyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHNhdmVBbGxPcHRpb25zKCk6IFNPIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuc2F2ZUFsbE9wdGlvbnM7XG4gIH1cblxuICBzZXQgc2F2ZUFsbE9wdGlvbnModmFsdWU6IFNPKSB7XG4gICAgdGhpcy5jb25maWcuc2F2ZUFsbE9wdGlvbnMgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBsb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1N1YmplY3QudmFsdWUgPT09IGZhbHNlOyAvLyBTaG91bGQgYmUgZmFsc2Ugd2hlbiB1bmRlZmluZWQgKGluaXRpYWwgc3RhdGUpXG4gIH1cblxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU3ViamVjdC52YWx1ZSAhPT0gZmFsc2U7IC8vIFNob3VsZCBiZSB0cnVlIHdoZW4gdW5kZWZpbmVkIChpbml0aWFsIHN0YXRlKVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgVGFibGVEYXRhU291cmNlIGluc3RhbmNlLCB0aGF0IGNhbiBiZSB1c2VkIGFzIGRhdGFzb3VyY2Ugb2YgYEBhbmd1bGFyL2Nka2AgZGF0YS10YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGFTZXJ2aWNlIEEgc2VydmljZSB0byBsb2FkIGFuZCBzYXZlIGRhdGFcbiAgICogQHBhcmFtIGRhdGFUeXBlIFR5cGUgb2YgZGF0YSBjb250YWluZWQgYnkgdGhlIFRhYmxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuIGBkYXRhYCB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkLlxuICAgKiBAcGFyYW0gdmFsaWRhdG9yU2VydmljZSBTZXJ2aWNlIHRoYXQgY3JlYXRlIGluc3RhbmNlcyBvZiB0aGUgRm9ybUdyb3VwIHVzZWQgdG8gdmFsaWRhdGUgcm93IGZpZWxkcy5cbiAgICogQHBhcmFtIG9wdGlvbnMgQWRkaXRpb25hbCBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBkYXRhVHlwZTogbmV3ICgpID0+IFQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRhdGFTZXJ2aWNlOiBJRW50aXRpZXNTZXJ2aWNlPFQsIEYsIFdPPixcbiAgICB2YWxpZGF0b3JTZXJ2aWNlPzogVixcbiAgICBvcHRpb25zPzogQ1xuICApIHtcbiAgICBzdXBlcihbXSwgZGF0YVR5cGUsIHZhbGlkYXRvclNlcnZpY2UsIHtcbiAgICAgIGtlZXBPcmlnaW5hbERhdGFBZnRlckNvbmZpcm06IGZhbHNlLFxuICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgc2F2ZU9ubHlEaXJ0eVJvd3M6IGZhbHNlLFxuICAgICAgc2F2ZUJlZm9yZURlbGV0ZTogZmFsc2UsIC8vIEZvciB2MSBjb21wYXRpYmlsaXR5XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fZW50aXR5TmFtZSA9IHJlbW92ZUVuZChuZXcgZGF0YVR5cGUoKS5fX3R5cGVuYW1lIHx8ICdVbmtub3duVk8nLCAnVk8nKTtcbiAgICB0aGlzLl9kZWJ1ZyA9IG9wdGlvbnM/LnN1cHByZXNzRXJyb3JzID09PSBmYWxzZSAmJiAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBkaXNjb25uZWN0XG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHdhdGNoQWxsKG9mZnNldDogbnVtYmVyLCBzaXplOiBudW1iZXIsIHNvcnRCeT86IHN0cmluZywgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24sIGZpbHRlcj86IFBhcnRpYWw8Rj4pOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+IHtcbiAgICB0aGlzLl9zdG9wV2F0Y2hTdWJqZWN0Lm5leHQoKTtcbiAgICB0aGlzLl9mZXRjaE1vcmVGbiA9IG51bGw7XG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG4gICAgdGhpcy5fd2FpdGluZ05ldHdvcmtSZXN1bHQgPSAodGhpcy53YXRjaEFsbE9wdGlvbnM/LmZldGNoUG9saWN5IHx8IHRoaXMuZGF0YVNlcnZpY2U/LmRlZmF1bHRGZXRjaFBvbGljeSkgPT09ICdjYWNoZS1hbmQtbmV0d29yayc7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS53YXRjaEFsbChvZmZzZXQsIHNpemUsIHNvcnRCeSwgc29ydERpcmVjdGlvbiwgZmlsdGVyLCB0aGlzLndhdGNoQWxsT3B0aW9ucykucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsICdFUlJPUi5MT0FEX0RBVEFfRVJST1InKSksXG4gICAgICBtYXAoKHJlczogTG9hZFJlc3VsdDxUPikgPT4ge1xuICAgICAgICBpZiAodGhpcy5fc2F2aW5nKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gUmVjZWl2ZWQgJHt0aGlzLl9lbnRpdHlOYW1lfSBkYXRhIChmcm9tIHNlcnZpY2UpLCBidXQgc3RpbGwgc2F2aW5nOiBza2lwYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zdXBwcmVzc0Vycm9ycyAmJiB0aGlzLmhhc1NvbWVEaXJ0eVJvdygpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBSZWNlaXZlZCAke3RoaXMuX2VudGl0eU5hbWV9IGRhdGEsIHdoaWxlIHNvbWUgcm93IHN0aWxsIGRpcnR5LiBTb21lIGRhdGEgY2FuIGJlIGxvc3RgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnVwZGF0ZURhdGFzb3VyY2UoKHJlcy5kYXRhIHx8IFtdKSBhcyBUW10pO1xuICAgICAgICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gcmVzLmZldGNoTW9yZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IF93YWl0aW5nTmV0d29ya1Jlc3VsdCB0byBmYWxzZVxuICAgICAgICB0aGlzLl93YWl0aW5nTmV0d29ya1Jlc3VsdCA9IGZhbHNlO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KSxcbiAgICAgIC8vIFN0b3AgdGhpcyBwaXBlIG5leHQgdGltZSB3ZSBjYWxsIHdhdGNoQWxsKClcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9zdG9wV2F0Y2hTdWJqZWN0KVxuICAgICAgLy8g4pqgIE5vdGljZTogRG9uJ3QgcHV0IGFueSBvcGVyYXRvciBhZnRlciB0YWtlVW50aWwgdG8gYXZvaWQgcG90ZW50aWFsIHN1YnNjcmlwdGlvbiBsZWFrc1xuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlRGF0YXNvdXJjZUZyb21Sb3dzKHJvd3M6IFJbXSkge1xuICAgIC8vIEF2b2lkIHRvIHVwZGF0ZSBkYXRhU291cmNlU3ViamVjdCwgd2hlbiBub3QgbmVlZFxuICAgIGlmICh0aGlzLmRhdGFzb3VyY2VTdWJqZWN0Lm9ic2VydmVkKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlnLnN1cHByZXNzRXJyb3JzKVxuICAgICAgICBjb25zb2xlLndhcm4oXCJbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gVXBkYXRlIGRhdGFzb3VyY2Ugc3ViamVjdC4gUGxlYXNlIHByZWZlciB1c2luZyAncm93c1N1YmplY3QnIGluc3RlYWQgb2YgJ2RhdGFzb3VyY2VTdWJqZWN0J1wiKTtcbiAgICAgIHN1cGVyLnVwZGF0ZURhdGFzb3VyY2VGcm9tUm93cyhyb3dzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIFNraXBwaW5nIGRhdGFzb3VyY2VTdWJqZWN0IHVwZGF0ZSAobm90IHVzZWQgeWV0KS4nKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmNvbmZpZy5yZWFkT25seSkge1xuICAgICAgY29uc29sZS5lcnJvcignW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIEVuYWJsZSB0byBzYXZlLCBiZWNhdXNlIGNvbmZpZy5yZWFkT25seT10cnVlJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFNhdmluZyB0d2ljZSAoc2hvdWxkIG5ldmVyIG9jY3VyKVxuICAgIGlmICh0aGlzLl9zYXZpbmcpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIFRyeWluZyB0byBzYXZlICR7dGhpcy5fZW50aXR5TmFtZX0gcm93cyB0d2ljZS4gU2tpcGApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuX3NhdmluZyA9IHRydWU7XG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICBjb25zdCBvbmx5RGlydHlSb3dzID0gdGhpcy5jb25maWcuc2F2ZU9ubHlEaXJ0eVJvd3M7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gU2F2aW5nICR7dGhpcy5fZW50aXR5TmFtZX0gcm93cy4uLiB7b25seURpcnR5Um93czogJHtvbmx5RGlydHlSb3dzfX1gKTtcblxuICAgICAgLy8gR2V0IGFsbCByb3dzXG4gICAgICBjb25zdCByb3dzID0gdGhpcy5nZXRSb3dzKCk7XG5cbiAgICAgIC8vIEZpbmlzaCBlZGl0aW5nIGFsbCByb3dzXG4gICAgICBjb25zdCBpbnZhbGlkUm93cyA9IHJvd3MuZmlsdGVyKChyb3cpID0+IHJvdy5lZGl0aW5nICYmICFyb3cuY29uZmlybUVkaXRDcmVhdGUoKSk7XG5cbiAgICAgIC8vIENhbm5vdCBmaW5pc2ggc29tZSByb3dzOiBlcnJvclxuICAgICAgaWYgKGludmFsaWRSb3dzLmxlbmd0aCkge1xuICAgICAgICAvLyBsb2cgZXJyb3JzXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1ZylcbiAgICAgICAgICBpbnZhbGlkUm93cy5mb3JFYWNoKChyb3cpID0+IEFwcFRhYmxlVXRpbHMubG9nUm93RXJyb3JzKHJvdywgYFtlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSAke3RoaXMuX2VudGl0eU5hbWV9IHJvdyAjJHtyb3cuaWR9YCkpO1xuICAgICAgICAvLyBTdG9wIHdpdGggYW4gZXJyb3JcbiAgICAgICAgdGhyb3cgeyBjb2RlOiBFcnJvckNvZGVzLlRBQkxFX0lOVkFMSURfUk9XX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuVEFCTEVfSU5WQUxJRF9ST1dfRVJST1InIH07XG4gICAgICB9XG5cbiAgICAgIGxldCBkYXRhOiBUW107XG4gICAgICBsZXQgZGF0YVRvU2F2ZTogVFtdO1xuXG4gICAgICBpZiAodGhpcy52YWxpZGF0b3JTZXJ2aWNlKSB7XG4gICAgICAgIGRhdGFUb1NhdmUgPSBbXTtcbiAgICAgICAgZGF0YSA9IHJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50RGF0YSA9IG5ldyB0aGlzLmRhdGFDb25zdHJ1Y3RvcigpIGFzIFQ7XG4gICAgICAgICAgY3VycmVudERhdGEuZnJvbU9iamVjdChyb3cuY3VycmVudERhdGEpO1xuICAgICAgICAgIC8vIEZpbHRlciB0byBrZWVwIG9ubHkgZGlydHkgcm93XG4gICAgICAgICAgaWYgKG9ubHlEaXJ0eVJvd3MgJiYgcm93LnZhbGlkYXRvci5kaXJ0eSkgZGF0YVRvU2F2ZS5wdXNoKGN1cnJlbnREYXRhKTtcbiAgICAgICAgICByZXR1cm4gY3VycmVudERhdGE7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIW9ubHlEaXJ0eVJvd3MpIGRhdGFUb1NhdmUgPSBkYXRhO1xuICAgICAgfVxuICAgICAgLy8gT3IgdXNlIHRoZSBjdXJyZW50IGRhdGEgd2l0aG91dCBjb252ZXJzaW9uICh3aGVuIG5vIHZhbGlkYXRvciBzZXJ2aWNlIHVzZWQpXG4gICAgICBlbHNlIHtcbiAgICAgICAgZGF0YSA9IHJvd3MubWFwKChyb3cpID0+IHJvdy5jdXJyZW50RGF0YSk7XG4gICAgICAgIC8vIHNhdmUgYWxsIGRhdGEsIGFzIHdlIGRvbid0IGhhdmUgYW55IGRpcnR5IG1hcmtlclxuICAgICAgICBkYXRhVG9TYXZlID0gZGF0YTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gZGF0YSB0byBzYXZlOiBleGl0XG4gICAgICBpZiAob25seURpcnR5Um93cyAmJiAhZGF0YVRvU2F2ZS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gTm8gJHt0aGlzLl9lbnRpdHlOYW1lfSBkYXRhIHRvIHNhdmUuIFNraXBgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFtlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBBc2tpbmcgc2VydmljZSB0byBzYXZlIHRoaXMgJHt0aGlzLl9lbnRpdHlOYW1lfSBkYXRhOmAsIGRhdGFUb1NhdmUpO1xuICAgICAgYXdhaXQgdGhpcy5kYXRhU2VydmljZS5zYXZlQWxsKGRhdGFUb1NhdmUsIHRoaXMuc2F2ZUFsbE9wdGlvbnMpO1xuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFtlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBTYXZpbmcgJHt0aGlzLl9lbnRpdHlOYW1lfSBkYXRhIFtPS11gKTtcblxuICAgICAgLy8gTFAgMjMvMDMvMjAyMTogdXBkYXRlIGRhdGFzb3VyY2UgaXMgbmVjZXNzYXJ5IGJ1dCBjYW4gYmUgY2hhbmdlZCB0byBhIHJlZmV0Y2goKSBvbiBRdWVyeVJlZiAobXVzdCBiZSBjcmVhdGVkIGFuZCByZWdpc3RlcmVkIGluIEdyYXBocWxTZXJ2aWNlLndhdGNoUXVlcnkpXG4gICAgICB0aGlzLnVwZGF0ZURhdGFzb3VyY2UoZGF0YSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmVycm9yKCgnW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIEVycm9yIHdoaWxlIHNhdmluZzogJyArIGVycm9yICYmIGVycm9yLm1lc3NhZ2UpIHx8IGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9zYXZpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRGF0YXNvdXJjZShkYXRhOiBUW10sIG9wdHM/OiB7IGVtaXRFdmVudDogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gVXBkYXRpbmcgZGF0YXNvdXJjZSB3aXRoIGRhdGE6YCwgZGF0YSk7XG5cbiAgICBzdXBlci51cGRhdGVEYXRhc291cmNlKGRhdGEsIG9wdHMpO1xuXG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICB9XG4gIH1cblxuICBjb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXI6IENvbGxlY3Rpb25WaWV3ZXIpOiBPYnNlcnZhYmxlPFJbXSB8IFJlYWRvbmx5QXJyYXk8Uj4+IHtcbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1ZyhcIltlbnRpdGllcy1kYXRhc291cmNlXSBjb25uZWN0XCIpO1xuICAgIHJldHVybiBzdXBlci5jb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBkYXRhIHNvdXJjZSwgY2xlYW5pbmcgdXAgYW55IHJlc291cmNlcyBhbmQgc3Vic2NyaXB0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtDb2xsZWN0aW9uVmlld2VyfSBbY29sbGVjdGlvblZpZXdlcl0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgcmVwcmVzZW50aW5nIHRoZSBjb2xsZWN0aW9uIHZpZXdlciB0byBkaXNjb25uZWN0IGZyb20uXG4gICAqIEByZXR1cm4ge3ZvaWR9IC0gVGhpcyBtZXRob2QgZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuXG4gICAqL1xuICBkaXNjb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXI/OiBDb2xsZWN0aW9uVmlld2VyKSB7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gRGlzY29ubmVjdGluZy4uLicpO1xuICAgIHN1cGVyLmRpc2Nvbm5lY3QoY29sbGVjdGlvblZpZXdlcik7XG4gICAgaWYgKCF0aGlzLl9zdG9wV2F0Y2hTdWJqZWN0LmNsb3NlZCkge1xuICAgICAgdGhpcy5fc3RvcFdhdGNoU3ViamVjdC5uZXh0KCk7XG4gICAgICB0aGlzLl9zdG9wV2F0Y2hTdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICB0aGlzLl9zdG9wV2F0Y2hTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgaWRsZSBzdGF0ZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXIgfCB7IGRlYm91bmNlVGltZU1zPzogbnVtYmVyIH0gJiBGaXJzdE9wdGlvbnN9IFtvcHRzXSBPcHRpb25zIGZvciBjb250cm9sbGluZyB0aGUgd2FpdCBiZWhhdmlvci5cbiAgICogICAtIElmIGEgbnVtYmVyIGlzIHByb3ZpZGVkLCBpdCBpcyB0cmVhdGVkIGFzIHRoZSBkZWJvdW5jZSB0aW1lIGluIG1pbGxpc2Vjb25kcy5cbiAgICogICAtIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCwgaXQgY2FuIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKiAgICAgLSBkZWJvdW5jZVRpbWVNczogVGhlIGRlYm91bmNlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byAxMDAgaWYgbm90IHNwZWNpZmllZC5cbiAgICogICAgIC0gQWRkaXRpb25hbCBvcHRpb25zIGZyb20gYEZpcnN0T3B0aW9uc2AgaW50ZXJmYWNlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGlkbGUgc3RhdGUgaXMgcmVhY2hlZC5cbiAgICovXG4gIHdhaXRJZGxlKG9wdHM/OiBudW1iZXIgfCAoeyBkZWJvdW5jZVRpbWVNcz86IG51bWJlciB9ICYgRmlyc3RPcHRpb25zKSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgZGVib3VuY2VUaW1lTXMgPSB0eXBlb2Ygb3B0cyA9PT0gJ251bWJlcicgPyBvcHRzIDogb3B0cz8uZGVib3VuY2VUaW1lTXMgfHwgMTAwOyAvKiBpbiBjYXNlIHdhcyBub3Qgc3RhcnRlZCAqL1xuICAgIG9wdHMgPSB0eXBlb2Ygb3B0cyA9PT0gJ251bWJlcicgPyB1bmRlZmluZWQgOiBvcHRzO1xuICAgIHJldHVybiBmaXJzdEZhbHNlUHJvbWlzZShcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgICAgLy8gU2tpcCBsb2FkZWQgZXZlbnQsIGlmIHdhaXRpbmcgYSByZXN1bHQgZnJvbSBuZXR3b3JrIChlLmcuIHdoZW4gZmV0Y2ggcG9saWN5IGlzICdjYWNoZS1hbmQtbmV0d29yaycpXG4gICAgICAgIGZpbHRlcigobG9hZGluZykgPT4gbG9hZGluZyB8fCAhdGhpcy5fd2FpdGluZ05ldHdvcmtSZXN1bHQpLFxuICAgICAgICBkZWJvdW5jZVRpbWUoZGVib3VuY2VUaW1lTXMpXG4gICAgICApLFxuICAgICAgb3B0c1xuICAgICk7XG4gIH1cblxuICBjb25maXJtQ3JlYXRlKHJvdzogUik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IHN1cGVyLmNvbmZpcm1DcmVhdGUocm93KTtcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyb3cuZWRpdGluZyAmJiByb3cudmFsaWRhdG9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBSb3cgc3RpbGwgaGFzIHtlZGl0aW5nOiB0cnVlfSBhZnRlciBjb25maXJtQ3JlYXRlKCkhIEZvcmNlIGVkaXRpbmcgdG8gZmFsc2UnKTtcbiAgICAgIHJvdy52YWxpZGF0b3IuZGlzYWJsZSh7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbmZpcm1FZGl0KHJvdzogUik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IHN1cGVyLmNvbmZpcm1FZGl0KHJvdyk7XG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAocm93LmVkaXRpbmcgJiYgcm93LnZhbGlkYXRvcikge1xuICAgICAgY29uc29sZS53YXJuKCdbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gUm93IHN0aWxsIGhhcyB7ZWRpdGluZzogdHJ1ZX0gYWZ0ZXIgY29uZmlybUVkaXQoKSEgRm9yY2UgZWRpdGluZyB0byBmYWxzZScpO1xuICAgICAgcm93LnZhbGlkYXRvci5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhcnRFZGl0KHJvdzogUik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVkaXRpbmcgPSBzdXBlci5zdGFydEVkaXQocm93KTtcbiAgICBpZiAoIWVkaXRpbmcpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXJvdy5lZGl0aW5nICYmIHJvdy52YWxpZGF0b3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIFJvdyBzdGlsbCBoYXMge2VkaXRpbmc6IGZhbHNlfSBhZnRlciBzdGFydEVkaXQoKSEgRm9yY2UgZWRpdGluZycpO1xuICAgICAgcm93LnZhbGlkYXRvci5lbmFibGUoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBoYW5kbGVFcnJvcihlcnJvcjogYW55LCBtZXNzYWdlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBlcnJvck1zZyA9IChlcnJvciAmJiBlcnJvci5tZXNzYWdlKSB8fCBlcnJvcjtcbiAgICBjb25zb2xlLmVycm9yKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gU2VydmljZSAke3RoaXMuX2VudGl0eU5hbWV9IHNlbnQgZXJyb3I6ICR7ZXJyb3JNc2d9YCwgZXJyb3IpO1xuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UgfHwgZXJyb3JNc2cpO1xuICB9XG5cbiAgaGFuZGxlU2VydmljZUVycm9yKGVycm9yOiBhbnkpIHtcbiAgICBjb25zdCBlcnJvck1zZyA9IChlcnJvciAmJiBlcnJvci5tZXNzYWdlKSB8fCBlcnJvcjtcbiAgICBjb25zb2xlLmVycm9yKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gU2VydmljZSAke3RoaXMuX2VudGl0eU5hbWV9IHNlbnQgZXJyb3I6ICR7ZXJyb3JNc2d9YCwgZXJyb3IpO1xuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBkZWxldGUoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIC8vIElmIG5ldyByb3c6IG5vdCBuZWVkIHRvIHByb3BhZ2F0ZSB0byB0aGUgZGF0YVNlcnZpY2VcbiAgICBpZiAoaWQgPT09IC0xKSB7XG4gICAgICByZXR1cm4gc3VwZXIuZGVsZXRlKGlkKTtcbiAgICB9XG5cbiAgICBjb25zdCByb3cgPSB0aGlzLmdldFJvdyhpZCk7XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBSb3cgdG8gZGVsZXRlIHdpdGggaWQ9JHtpZH0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICBjb25zdCBzdXBlckRlbGV0ZSA9IHN1cGVyLmRlbGV0ZTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLmRhdGFTZXJ2aWNlXG4gICAgICAuZGVsZXRlQWxsKFtyb3cuY3VycmVudERhdGFdLCB0aGlzLnNhdmVBbGxPcHRpb25zKVxuICAgICAgLmNhdGNoKChlcnIpID0+IHRoaXMuaGFuZGxlU2VydmljZUVycm9yKGVycikpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIG1ha2Ugc3VyZSByb3cgaGFzIGJlZW4gZGVsZXRlZCAoYmVjYXVzZSBHcmFwUUhsIGNhY2hlIHJlbW92ZSBjYW4gZmFpbGVkKVxuICAgICAgICAgIGNvbnN0IHByZXNlbnQgPSB0aGlzLmdldFJvdyhpZCkgPT09IHJvdztcbiAgICAgICAgICBpZiAocHJlc2VudCkgc3VwZXJEZWxldGUuY2FsbChzZWxmLCBpZCk7XG5cbiAgICAgICAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgICAgICB9LCAzMDApO1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVBbGwocm93czogUltdKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGFGcm9tUm93cyhyb3dzKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDYWxsIHNlcnZpY2UgZGVsZXRpb25cbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNlcnZpY2UuZGVsZXRlQWxsKGRhdGEsIHRoaXMuc2F2ZUFsbE9wdGlvbnMpO1xuXG4gICAgICBhd2FpdCBzbGVlcCgzMDApOyAvLyBXYWl0IHByb3BhZ2F0aW9uIChlLmcuIHVwZGF0ZSBjYWNoZSwgdGhlbiByZWNlaXZlZCB1cGRhdGUgZnJvbSBkYXRhU2VydmljZS53YXRjaEFsbCgpKVxuXG4gICAgICAvLyBXb3JrYXJvdW5kLCB0byBiZSBzdXJlIGFsbCByb3dzIGhhdmUgYmVlbiBkZWxldGVkXG4gICAgICAvLyBTb21ldGltZSwgdGhlIHNlcnZpY2UgbWlzcyBkZWxldGlvbiwgb3IgR3JhcGhRbCBjYWNoZSByZW1vdmUgZmFpbGVkLlxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCBhcHBseSBtaXNzaW5nIGRlbGV0aW9uIHVzaW5nIHRoZSBzdXBlci5kZWxldGUoKSBmdW5jdGlvblxuICAgICAgY29uc3Qgcm93Tm90RGVsZXRlZCA9IHRoaXMuZ2V0Um93cygpLmZpbHRlcigocm93KSA9PiByb3dzLmluY2x1ZGVzKHJvdykpO1xuICAgICAgaWYgKGlzTm90RW1wdHlBcnJheShyb3dOb3REZWxldGVkKSkge1xuICAgICAgICBjb25zdCBzdXBlckRlbGV0ZSA9IHN1cGVyLmRlbGV0ZTtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIEZvcmNlIGRlbGV0aW9uIG9mICR7cm93Tm90RGVsZXRlZC5sZW5ndGh9IHJvd3MhIFBsZWFzZSBjaGVjayB0aGF0IGRhdGEgc2VydmljZSB1cGRhdGUgdGhlIGNhY2hlLCBhZnRlciBkZWxldGlvbmBcbiAgICAgICAgKTtcbiAgICAgICAgcm93Tm90RGVsZXRlZFxuICAgICAgICAgIC8vIFN0YXJ0IGF0IHRoZSBlbmRcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gKGEuaWQgPiBiLmlkID8gLTEgOiAxKSlcbiAgICAgICAgICAuZm9yRWFjaCgocikgPT4gc3VwZXJEZWxldGUuY2FsbChzZWxmLCByLmlkKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBIYW5kbGUgc2VydmljZSBlcnJvclxuICAgICAgdGhpcy5oYW5kbGVTZXJ2aWNlRXJyb3IoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICB9XG4gIH1cblxuICBnZXRSb3coaWQ6IG51bWJlcik6IFIge1xuICAgIHJldHVybiBzdXBlci5nZXRSb3coaWQpO1xuICB9XG5cbiAgZ2V0Um93cygpOiBSW10ge1xuICAgIHJldHVybiB0aGlzLnJvd3NTdWJqZWN0LmdldFZhbHVlKCk7XG4gIH1cblxuICBoYXNTb21lRWRpdGluZ1JvdygpIHtcbiAgICByZXR1cm4gKHRoaXMucm93c1N1YmplY3QudmFsdWUgfHwgW10pLnNvbWUoKHJvdykgPT4gcm93LmVkaXRpbmcpO1xuICB9XG5cbiAgaGFzU29tZURpcnR5Um93KCkge1xuICAgIHJldHVybiAodGhpcy5yb3dzU3ViamVjdC52YWx1ZSB8fCBbXSkuc29tZSgocm93KSA9PiByb3cuZGlydHkpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlTmV3KGluc2VydEF0PzogbnVtYmVyLCBvcHRzID0geyBlZGl0aW5nOiB0cnVlIH0pOiBQcm9taXNlPFIgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBBdm9pZCBtdWx0aXBsZSBjYWxsIChvbmx5IG9uZSBlZGl0aW5nIHJvdyBpcyBhbGxvd2VkKVxuICAgIGlmICh0aGlzLl9jcmVhdGluZyAmJiBvcHRzLmVkaXRpbmcpIHJldHVybjtcblxuICAgIHRoaXMuX2NyZWF0aW5nID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3cgPSBhd2FpdCBzdXBlci5jcmVhdGVOZXcoaW5zZXJ0QXQsIG9wdHMpO1xuXG4gICAgICBpZiAoIXJvdykgcmV0dXJuIHVuZGVmaW5lZDsgLy8gU3RvcCBoZXJlXG5cbiAgICAgIC8vIENhbGwgb2JzZXJ2ZXJzXG4gICAgICBpZiAodGhpcy5jb25maWc/Lm9uUm93Q3JlYXRlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlnLm9uUm93Q3JlYXRlZChyb3cpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBMb2csIHRoZW4gY29udGludWVcbiAgICAgICAgICBjb25zb2xlLmVycm9yKChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8IGVyciwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcm93O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9jcmVhdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGdldERhdGEoKTogVFtdIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5nZXRSb3dzKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGF0YUZyb21Sb3dzKHJvd3MpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hNb3JlKG9wdHM/OiB7IGVtaXRFdmVudDogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLl9mZXRjaE1vcmVGbikgcmV0dXJuIGZhbHNlOyAvLyBBdm9pZCBtdWx0aXBsZSBjYWxsXG4gICAgaWYgKHRoaXMuaGFzU29tZURpcnR5Um93KCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ2Fubm90IGZldGNoIG1vcmUgJHt0aGlzLl9lbnRpdHlOYW1lfSBiZWNhdXNlIHNvbWUgcm93KSBzdGlsbCBkaXJ0eWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmRlYnVnKGBXaWxsIGZldGNoaW5nIG1vcmUgcm93KHMpIHN0aWxsLi4uYCk7XG5cbiAgICAvLyBGb3JnZXQgdGhlIGZldGNoTW9yZSBmdW5jdGlvbiwgdG8gYXZvaWQgbXVsdGlwbGUgY2FsbFxuICAgIGNvbnN0IGZldGNoTW9yZUZuID0gdGhpcy5fZmV0Y2hNb3JlRm47XG4gICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSBudWxsO1xuXG4gICAgLy8gRmV0Y2ggbmV4dCBwYWdlXG4gICAgY29uc3QgcmVzOiBMb2FkUmVzdWx0PFQ+ID0gYXdhaXQgZmV0Y2hNb3JlRm4oKTtcblxuICAgIC8vIFNraXAgaWYgZW1wdHkgKG5vIG1vcmUgZGF0YSlcbiAgICBpZiAoaXNFbXB0eUFycmF5KHJlcz8uZGF0YSkpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgZGF0YSBzb3VyY2VcbiAgICBzdXBlci51cGRhdGVEYXRhc291cmNlKCh0aGlzLmN1cnJlbnREYXRhIHx8IFtdKS5jb25jYXQoLi4ucmVzLmRhdGEpLCBvcHRzKTtcblxuICAgIC8vIFJlbWVtYmVyIGZldGNoTW9yZVxuICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gcmVzLmZldGNoTW9yZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2QgLS0gKi9cblxuICBtYXJrQXNMb2FkaW5nKCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya0FzTG9hZGVkKCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
407
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS9lbnRpdGllcy10YWJsZS1kYXRhc291cmNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQXlELE1BQU0sMEJBQTBCLENBQUM7QUFDbEgsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUlyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOztBQXlCaEUsV0FBVztBQUVYLGtFQUFrRTtBQUNsRSxNQUFNLE9BQU8sdUJBVVgsU0FBUSxlQUEyQjtJQW9EakI7SUFqREQsV0FBVyxDQUFTO0lBRTNCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDZixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLFlBQVksR0FBK0IsSUFBSSxDQUFDO0lBQ2hELHFCQUFxQixDQUFVO0lBQy9CLGlCQUFpQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFbEQsY0FBYyxHQUFHLElBQUksZUFBZSxDQUFVLFNBQVMsQ0FB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SUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQzt3R0E3Y1UsdUJBQXVCOzRGQUF2Qix1QkFBdUI7OzRGQUF2Qix1QkFBdUI7a0JBRm5DLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUYWJsZURhdGFTb3VyY2UsIFRhYmxlRGF0YVNvdXJjZUNvbmZpZywgVGFibGVFbGVtZW50LCBWYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSUVudGl0eSB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnLi4vc2VydmljZXMvZXJyb3JzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBtYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERpcmVjdGl2ZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uVmlld2VyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucywgRmV0Y2hNb3JlRm4sIElFbnRpdGllc1NlcnZpY2UsIExvYWRSZXN1bHQgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgZmlyc3RGYWxzZVByb21pc2UsIEZpcnN0T3B0aW9ucyB9IGZyb20gJy4uLy4uL3NoYXJlZC9vYnNlcnZhYmxlcyc7XG5pbXBvcnQgeyBpc0VtcHR5QXJyYXksIGlzTm90RW1wdHlBcnJheSwgcmVtb3ZlRW5kLCBzbGVlcCB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgQXBwVGFibGVVdGlscyB9IGZyb20gJy4vdGFibGUudXRpbHMnO1xuaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgSUVudGl0aWVzVGFibGVEYXRhU291cmNlIH0gZnJvbSAnLi90YWJsZS5tb2RlbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXRpZXNUYWJsZURhdGFTb3VyY2VDb25maWc8XG4gIFQgZXh0ZW5kcyBJRW50aXR5PFQsIElEPixcbiAgSUQgPSBudW1iZXIsXG4gIFdPIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zLFxuICBTTyA9IGFueSxcbj4gZXh0ZW5kcyBUYWJsZURhdGFTb3VyY2VDb25maWcge1xuICBvblJvd0NyZWF0ZWQ/OiAocm93OiBUYWJsZUVsZW1lbnQ8VD4pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICBzYXZlT25seURpcnR5Um93cz86IGJvb2xlYW47IC8vIEZhbHNlIGJ5IGRlZmF1bHRcbiAgc2F2ZUJlZm9yZURlbGV0ZT86IGJvb2xlYW47IC8vIEZhbHNlIGJ5IGRlZmF1bHRcbiAgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgZGF0YVNlcnZpY2VPcHRpb25zPzogV08gJiBTTzsgLy8gT3B0aW9ucyBwYXNzZWQgdG8gdGhlIGRhdGFTZXJ2aWNlLndhdGNoQWxsKCkgYW5kIGRhdGFTZXJ2aWNlLnNhdmVBbGwoKVxuXG4gIHdhdGNoQWxsT3B0aW9ucz86IFdPOyAvLyBPcHRpb25zIHBhc3NlZCB0byB0aGUgZGF0YVNlcnZpY2Uuc2F2ZUFsbCgpXG4gIHNhdmVBbGxPcHRpb25zPzogU087IC8vIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBkYXRhU2VydmljZS5zYXZlQWxsKClcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8vIEBkeW5hbWljXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGNsYXNzIEVudGl0aWVzVGFibGVEYXRhU291cmNlPFxuICAgIFQgZXh0ZW5kcyBJRW50aXR5PFQsIElEPixcbiAgICBGID0gYW55LFxuICAgIElEID0gbnVtYmVyLFxuICAgIFdPIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zLFxuICAgIFNPID0gYW55LFxuICAgIFYgZXh0ZW5kcyBWYWxpZGF0b3JTZXJ2aWNlID0gVmFsaWRhdG9yU2VydmljZSxcbiAgICBDIGV4dGVuZHMgRW50aXRpZXNUYWJsZURhdGFTb3VyY2VDb25maWc8VCwgSUQsIFdPLCBTTz4gPSBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZUNvbmZpZzxULCBJRCwgV08sIFNPPixcbiAgICBSIGV4dGVuZHMgVGFibGVFbGVtZW50PFQ+ID0gVGFibGVFbGVtZW50PFQ+LFxuICA+XG4gIGV4dGVuZHMgVGFibGVEYXRhU291cmNlPFQsIFYsIEMsIFI+XG4gIGltcGxlbWVudHMgSUVudGl0aWVzVGFibGVEYXRhU291cmNlPFI+LCBPbkRlc3Ryb3lcbntcbiAgcHJpdmF0ZSByZWFkb25seSBfZW50aXR5TmFtZTogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBfZGVidWcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9jcmVhdGluZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX2ZldGNoTW9yZUZuOiBGZXRjaE1vcmVGbjxMb2FkUmVzdWx0PFQ+PiA9IG51bGw7XG4gIHByb3RlY3RlZCBfd2FpdGluZ05ldHdvcmtSZXN1bHQ6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBfc3RvcFdhdGNoU3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgbG9hZGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHVuZGVmaW5lZCk7XG4gIHNhdmluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBnZXQgd2F0Y2hBbGxPcHRpb25zKCk6IFdPIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcud2F0Y2hBbGxPcHRpb25zO1xuICB9XG5cbiAgc2V0IHdhdGNoQWxsT3B0aW9ucyh2YWx1ZTogV08pIHtcbiAgICB0aGlzLmNvbmZpZy53YXRjaEFsbE9wdGlvbnMgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBzYXZlQWxsT3B0aW9ucygpOiBTTyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnNhdmVBbGxPcHRpb25zO1xuICB9XG5cbiAgc2V0IHNhdmVBbGxPcHRpb25zKHZhbHVlOiBTTykge1xuICAgIHRoaXMuY29uZmlnLnNhdmVBbGxPcHRpb25zID0gdmFsdWU7XG4gIH1cblxuICBnZXQgbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTdWJqZWN0LmdldFZhbHVlKCkgPT09IGZhbHNlOyAvLyBTaG91bGQgYmUgZmFsc2Ugd2hlbiB1bmRlZmluZWQgKGluaXRpYWwgc3RhdGUpXG4gIH1cblxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU3ViamVjdC5nZXRWYWx1ZSgpICE9PSBmYWxzZTsgLy8gU2hvdWxkIGJlIHRydWUgd2hlbiB1bmRlZmluZWQgKGluaXRpYWwgc3RhdGUpXG4gIH1cblxuICBnZXQgc2F2aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNhdmluZ1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFRhYmxlRGF0YVNvdXJjZSBpbnN0YW5jZSwgdGhhdCBjYW4gYmUgdXNlZCBhcyBkYXRhc291cmNlIG9mIGBAYW5ndWxhci9jZGtgIGRhdGEtdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhU2VydmljZSBBIHNlcnZpY2UgdG8gbG9hZCBhbmQgc2F2ZSBkYXRhXG4gICAqIEBwYXJhbSBkYXRhVHlwZSBUeXBlIG9mIGRhdGEgY29udGFpbmVkIGJ5IHRoZSBUYWJsZS4gSWYgbm90IHNwZWNpZmllZCwgdGhlbiBgZGF0YWAgd2l0aCBhdCBsZWFzdCBvbmUgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIHZhbGlkYXRvclNlcnZpY2UgU2VydmljZSB0aGF0IGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhlIEZvcm1Hcm91cCB1c2VkIHRvIHZhbGlkYXRlIHJvdyBmaWVsZHMuXG4gICAqIEBwYXJhbSBvcHRpb25zIEFkZGl0aW9uYWwgb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZGF0YVR5cGU6IG5ldyAoKSA9PiBULFxuICAgIHB1YmxpYyByZWFkb25seSBkYXRhU2VydmljZTogSUVudGl0aWVzU2VydmljZTxULCBGLCBXTz4sXG4gICAgdmFsaWRhdG9yU2VydmljZT86IFYsXG4gICAgb3B0aW9ucz86IENcbiAgKSB7XG4gICAgc3VwZXIoW10sIGRhdGFUeXBlLCB2YWxpZGF0b3JTZXJ2aWNlLCB7XG4gICAgICBrZWVwT3JpZ2luYWxEYXRhQWZ0ZXJDb25maXJtOiBmYWxzZSxcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgIHNhdmVPbmx5RGlydHlSb3dzOiBmYWxzZSxcbiAgICAgIHNhdmVCZWZvcmVEZWxldGU6IGZhbHNlLCAvLyBGb3IgdjEgY29tcGF0aWJpbGl0eVxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcblxuICAgIHRoaXMuX2VudGl0eU5hbWUgPSByZW1vdmVFbmQobmV3IGRhdGFUeXBlKCkuX190eXBlbmFtZSB8fCAnVW5rbm93blZPJywgJ1ZPJyk7XG4gICAgdGhpcy5fZGVidWcgPSBvcHRpb25zPy5zdXBwcmVzc0Vycm9ycyA9PT0gZmFsc2UgJiYgIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHdhdGNoQWxsKG9mZnNldDogbnVtYmVyLCBzaXplOiBudW1iZXIsIHNvcnRCeT86IHN0cmluZywgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24sIGZpbHRlcj86IFBhcnRpYWw8Rj4pOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+IHtcbiAgICB0aGlzLl9zdG9wV2F0Y2hTdWJqZWN0Lm5leHQoKTtcbiAgICB0aGlzLl9mZXRjaE1vcmVGbiA9IG51bGw7XG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG4gICAgdGhpcy5fd2FpdGluZ05ldHdvcmtSZXN1bHQgPSAodGhpcy53YXRjaEFsbE9wdGlvbnM/LmZldGNoUG9saWN5IHx8IHRoaXMuZGF0YVNlcnZpY2U/LmRlZmF1bHRGZXRjaFBvbGljeSkgPT09ICdjYWNoZS1hbmQtbmV0d29yayc7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS53YXRjaEFsbChvZmZzZXQsIHNpemUsIHNvcnRCeSwgc29ydERpcmVjdGlvbiwgZmlsdGVyLCB0aGlzLndhdGNoQWxsT3B0aW9ucykucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsICdFUlJPUi5MT0FEX0RBVEFfRVJST1InKSksXG4gICAgICBtYXAoKHJlczogTG9hZFJlc3VsdDxUPikgPT4ge1xuICAgICAgICBpZiAodGhpcy5zYXZpbmcpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYFtlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBSZWNlaXZlZCAke3RoaXMuX2VudGl0eU5hbWV9IGRhdGEgKGZyb20gc2VydmljZSksIGJ1dCBzdGlsbCBzYXZpbmc6IHNraXBgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnN1cHByZXNzRXJyb3JzICYmIHRoaXMuaGFzU29tZURpcnR5Um93KCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIFJlY2VpdmVkICR7dGhpcy5fZW50aXR5TmFtZX0gZGF0YSwgd2hpbGUgc29tZSByb3cgc3RpbGwgZGlydHkuIFNvbWUgZGF0YSBjYW4gYmUgbG9zdGApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMudXBkYXRlRGF0YXNvdXJjZSgocmVzLmRhdGEgfHwgW10pIGFzIFRbXSk7XG4gICAgICAgICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSByZXMuZmV0Y2hNb3JlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgX3dhaXRpbmdOZXR3b3JrUmVzdWx0IHRvIGZhbHNlXG4gICAgICAgIHRoaXMuX3dhaXRpbmdOZXR3b3JrUmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pLFxuICAgICAgLy8gU3RvcCB0aGlzIHBpcGUgbmV4dCB0aW1lIHdlIGNhbGwgd2F0Y2hBbGwoKVxuICAgICAgdGFrZVVudGlsKHRoaXMuX3N0b3BXYXRjaFN1YmplY3QpXG4gICAgICAvLyDimqAgTm90aWNlOiBEb24ndCBwdXQgYW55IG9wZXJhdG9yIGFmdGVyIHRha2VVbnRpbCB0byBhdm9pZCBwb3RlbnRpYWwgc3Vic2NyaXB0aW9uIGxlYWtzXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVEYXRhc291cmNlRnJvbVJvd3Mocm93czogUltdKSB7XG4gICAgLy8gQXZvaWQgdG8gdXBkYXRlIGRhdGFTb3VyY2VTdWJqZWN0LCB3aGVuIG5vdCBuZWVkXG4gICAgaWYgKHRoaXMuZGF0YXNvdXJjZVN1YmplY3Qub2JzZXJ2ZWQpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcuc3VwcHJlc3NFcnJvcnMpXG4gICAgICAgIGNvbnNvbGUud2FybihcIltlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBVcGRhdGUgZGF0YXNvdXJjZSBzdWJqZWN0LiBQbGVhc2UgcHJlZmVyIHVzaW5nICdyb3dzU3ViamVjdCcgaW5zdGVhZCBvZiAnZGF0YXNvdXJjZVN1YmplY3QnXCIpO1xuICAgICAgc3VwZXIudXBkYXRlRGF0YXNvdXJjZUZyb21Sb3dzKHJvd3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gU2tpcHBpbmcgZGF0YXNvdXJjZVN1YmplY3QgdXBkYXRlIChub3QgdXNlZCB5ZXQpLicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuY29uZmlnLnJlYWRPbmx5KSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gRW5hYmxlIHRvIHNhdmUsIGJlY2F1c2UgY29uZmlnLnJlYWRPbmx5PXRydWUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gU2F2aW5nIHR3aWNlIChzaG91bGQgbmV2ZXIgb2NjdXIpXG4gICAgaWYgKHRoaXMuc2F2aW5nKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBUcnlpbmcgdG8gc2F2ZSAke3RoaXMuX2VudGl0eU5hbWV9IHJvd3MgdHdpY2UuIFNraXBgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLm1hcmtBc1NhdmluZygpO1xuXG4gICAgY29uc3Qgb25seURpcnR5Um93cyA9IHRoaXMuY29uZmlnLnNhdmVPbmx5RGlydHlSb3dzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIFNhdmluZyAke3RoaXMuX2VudGl0eU5hbWV9IHJvd3MuLi4ge29ubHlEaXJ0eVJvd3M6ICR7b25seURpcnR5Um93c319YCk7XG5cbiAgICAgIC8vIEdldCBhbGwgcm93c1xuICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0Um93cygpO1xuXG4gICAgICAvLyBGaW5pc2ggZWRpdGluZyBhbGwgcm93c1xuICAgICAgY29uc3QgaW52YWxpZFJvd3MgPSByb3dzLmZpbHRlcigocm93KSA9PiByb3cuZWRpdGluZyAmJiAhcm93LmNvbmZpcm1FZGl0Q3JlYXRlKCkpO1xuXG4gICAgICAvLyBDYW5ub3QgZmluaXNoIHNvbWUgcm93czogZXJyb3JcbiAgICAgIGlmIChpbnZhbGlkUm93cy5sZW5ndGgpIHtcbiAgICAgICAgLy8gbG9nIGVycm9yc1xuICAgICAgICBpZiAodGhpcy5fZGVidWcpXG4gICAgICAgICAgaW52YWxpZFJvd3MuZm9yRWFjaCgocm93KSA9PiBBcHBUYWJsZVV0aWxzLmxvZ1Jvd0Vycm9ycyhyb3csIGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gJHt0aGlzLl9lbnRpdHlOYW1lfSByb3cgIyR7cm93LmlkfWApKTtcbiAgICAgICAgLy8gU3RvcCB3aXRoIGFuIGVycm9yXG4gICAgICAgIHRocm93IHsgY29kZTogRXJyb3JDb2Rlcy5UQUJMRV9JTlZBTElEX1JPV19FUlJPUiwgbWVzc2FnZTogJ0VSUk9SLlRBQkxFX0lOVkFMSURfUk9XX0VSUk9SJyB9O1xuICAgICAgfVxuXG4gICAgICBsZXQgZGF0YTogVFtdO1xuICAgICAgbGV0IGRhdGFUb1NhdmU6IFRbXTtcblxuICAgICAgaWYgKHRoaXMudmFsaWRhdG9yU2VydmljZSkge1xuICAgICAgICBkYXRhVG9TYXZlID0gW107XG4gICAgICAgIGRhdGEgPSByb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudERhdGEgPSBuZXcgdGhpcy5kYXRhQ29uc3RydWN0b3IoKSBhcyBUO1xuICAgICAgICAgIGN1cnJlbnREYXRhLmZyb21PYmplY3Qocm93LmN1cnJlbnREYXRhKTtcbiAgICAgICAgICAvLyBGaWx0ZXIgdG8ga2VlcCBvbmx5IGRpcnR5IHJvd1xuICAgICAgICAgIGlmIChvbmx5RGlydHlSb3dzICYmIHJvdy52YWxpZGF0b3IuZGlydHkpIGRhdGFUb1NhdmUucHVzaChjdXJyZW50RGF0YSk7XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRhO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFvbmx5RGlydHlSb3dzKSBkYXRhVG9TYXZlID0gZGF0YTtcbiAgICAgIH1cbiAgICAgIC8vIE9yIHVzZSB0aGUgY3VycmVudCBkYXRhIHdpdGhvdXQgY29udmVyc2lvbiAod2hlbiBubyB2YWxpZGF0b3Igc2VydmljZSB1c2VkKVxuICAgICAgZWxzZSB7XG4gICAgICAgIGRhdGEgPSByb3dzLm1hcCgocm93KSA9PiByb3cuY3VycmVudERhdGEpO1xuICAgICAgICAvLyBzYXZlIGFsbCBkYXRhLCBhcyB3ZSBkb24ndCBoYXZlIGFueSBkaXJ0eSBtYXJrZXJcbiAgICAgICAgZGF0YVRvU2F2ZSA9IGRhdGE7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGRhdGEgdG8gc2F2ZTogZXhpdFxuICAgICAgaWYgKG9ubHlEaXJ0eVJvd3MgJiYgIWRhdGFUb1NhdmUubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIE5vICR7dGhpcy5fZW50aXR5TmFtZX0gZGF0YSB0byBzYXZlLiBTa2lwYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gQXNraW5nIHNlcnZpY2UgdG8gc2F2ZSB0aGlzICR7dGhpcy5fZW50aXR5TmFtZX0gZGF0YTpgLCBkYXRhVG9TYXZlKTtcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNlcnZpY2Uuc2F2ZUFsbChkYXRhVG9TYXZlLCB0aGlzLnNhdmVBbGxPcHRpb25zKTtcblxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gU2F2aW5nICR7dGhpcy5fZW50aXR5TmFtZX0gZGF0YSBbT0tdYCk7XG5cbiAgICAgIC8vIExQIDIzLzAzLzIwMjE6IHVwZGF0ZSBkYXRhc291cmNlIGlzIG5lY2Vzc2FyeSBidXQgY2FuIGJlIGNoYW5nZWQgdG8gYSByZWZldGNoKCkgb24gUXVlcnlSZWYgKG11c3QgYmUgY3JlYXRlZCBhbmQgcmVnaXN0ZXJlZCBpbiBHcmFwaHFsU2VydmljZS53YXRjaFF1ZXJ5KVxuICAgICAgdGhpcy51cGRhdGVEYXRhc291cmNlKGRhdGEpO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmVycm9yKCgnW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIEVycm9yIHdoaWxlIHNhdmluZzogJyArIGVycm9yICYmIGVycm9yLm1lc3NhZ2UpIHx8IGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLm1hcmtBc1NhdmVkKCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRGF0YXNvdXJjZShkYXRhOiBUW10sIG9wdHM/OiB7IGVtaXRFdmVudDogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gVXBkYXRpbmcgZGF0YXNvdXJjZSB3aXRoIGRhdGE6YCwgZGF0YSk7XG5cbiAgICBzdXBlci51cGRhdGVEYXRhc291cmNlKGRhdGEsIG9wdHMpO1xuXG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICB9XG4gIH1cblxuICBjb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXI6IENvbGxlY3Rpb25WaWV3ZXIpOiBPYnNlcnZhYmxlPFJbXSB8IFJlYWRvbmx5QXJyYXk8Uj4+IHtcbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1ZyhcIltlbnRpdGllcy1kYXRhc291cmNlXSBjb25uZWN0XCIpO1xuICAgIHJldHVybiBzdXBlci5jb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBkYXRhIHNvdXJjZSwgY2xlYW5pbmcgdXAgYW55IHJlc291cmNlcyBhbmQgc3Vic2NyaXB0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtDb2xsZWN0aW9uVmlld2VyfSBbY29sbGVjdGlvblZpZXdlcl0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgcmVwcmVzZW50aW5nIHRoZSBjb2xsZWN0aW9uIHZpZXdlciB0byBkaXNjb25uZWN0IGZyb20uXG4gICAqIEByZXR1cm4ge3ZvaWR9IC0gVGhpcyBtZXRob2QgZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuXG4gICAqL1xuICBkaXNjb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXI/OiBDb2xsZWN0aW9uVmlld2VyKSB7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gRGlzY29ubmVjdGluZy4uLicpO1xuICAgIHN1cGVyLmRpc2Nvbm5lY3QoY29sbGVjdGlvblZpZXdlcik7XG4gICAgaWYgKCF0aGlzLl9zdG9wV2F0Y2hTdWJqZWN0LmNsb3NlZCkge1xuICAgICAgdGhpcy5fc3RvcFdhdGNoU3ViamVjdC5uZXh0KCk7XG4gICAgICB0aGlzLl9zdG9wV2F0Y2hTdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICB0aGlzLl9zdG9wV2F0Y2hTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgaWRsZSBzdGF0ZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXIgfCB7IGRlYm91bmNlVGltZU1zPzogbnVtYmVyIH0gJiBGaXJzdE9wdGlvbnN9IFtvcHRzXSBPcHRpb25zIGZvciBjb250cm9sbGluZyB0aGUgd2FpdCBiZWhhdmlvci5cbiAgICogICAtIElmIGEgbnVtYmVyIGlzIHByb3ZpZGVkLCBpdCBpcyB0cmVhdGVkIGFzIHRoZSBkZWJvdW5jZSB0aW1lIGluIG1pbGxpc2Vjb25kcy5cbiAgICogICAtIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCwgaXQgY2FuIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKiAgICAgLSBkZWJvdW5jZVRpbWVNczogVGhlIGRlYm91bmNlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byAxMDAgaWYgbm90IHNwZWNpZmllZC5cbiAgICogICAgIC0gQWRkaXRpb25hbCBvcHRpb25zIGZyb20gYEZpcnN0T3B0aW9uc2AgaW50ZXJmYWNlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGlkbGUgc3RhdGUgaXMgcmVhY2hlZC5cbiAgICovXG4gIHdhaXRJZGxlKG9wdHM/OiBudW1iZXIgfCAoeyBkZWJvdW5jZVRpbWVNcz86IG51bWJlciB9ICYgRmlyc3RPcHRpb25zKSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgZGVib3VuY2VUaW1lTXMgPSB0eXBlb2Ygb3B0cyA9PT0gJ251bWJlcicgPyBvcHRzIDogb3B0cz8uZGVib3VuY2VUaW1lTXMgfHwgMTAwOyAvKiBpbiBjYXNlIHdhcyBub3Qgc3RhcnRlZCAqL1xuICAgIG9wdHMgPSB0eXBlb2Ygb3B0cyA9PT0gJ251bWJlcicgPyB1bmRlZmluZWQgOiBvcHRzO1xuICAgIHJldHVybiBmaXJzdEZhbHNlUHJvbWlzZShcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgICAgLy8gU2tpcCBsb2FkZWQgZXZlbnQsIGlmIHdhaXRpbmcgYSByZXN1bHQgZnJvbSBuZXR3b3JrIChlLmcuIHdoZW4gZmV0Y2ggcG9saWN5IGlzICdjYWNoZS1hbmQtbmV0d29yaycpXG4gICAgICAgIGZpbHRlcigobG9hZGluZykgPT4gbG9hZGluZyB8fCAhdGhpcy5fd2FpdGluZ05ldHdvcmtSZXN1bHQpLFxuICAgICAgICBkZWJvdW5jZVRpbWUoZGVib3VuY2VUaW1lTXMpXG4gICAgICApLFxuICAgICAgb3B0c1xuICAgICk7XG4gIH1cblxuICBjb25maXJtQ3JlYXRlKHJvdzogUik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IHN1cGVyLmNvbmZpcm1DcmVhdGUocm93KTtcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyb3cuZWRpdGluZyAmJiByb3cudmFsaWRhdG9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBSb3cgc3RpbGwgaGFzIHtlZGl0aW5nOiB0cnVlfSBhZnRlciBjb25maXJtQ3JlYXRlKCkhIEZvcmNlIGVkaXRpbmcgdG8gZmFsc2UnKTtcbiAgICAgIHJvdy52YWxpZGF0b3IuZGlzYWJsZSh7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbmZpcm1FZGl0KHJvdzogUik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IHN1cGVyLmNvbmZpcm1FZGl0KHJvdyk7XG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAocm93LnZhbGlkYXRvcj8uZW5hYmxlZCkge1xuICAgICAgY29uc29sZS53YXJuKCdbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gUm93IHN0aWxsIGhhcyB7ZWRpdGluZzogdHJ1ZX0gYWZ0ZXIgY29uZmlybUVkaXQoKSEgRm9yY2UgZWRpdGluZyB0byBmYWxzZScpO1xuICAgICAgcm93LnZhbGlkYXRvci5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhcnRFZGl0KHJvdzogUik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVkaXRpbmcgPSBzdXBlci5zdGFydEVkaXQocm93KTtcbiAgICBpZiAoIWVkaXRpbmcpIHJldHVybiBmYWxzZTtcbiAgICBpZiAocm93LnZhbGlkYXRvcj8uZGlzYWJsZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIFJvdyBzdGlsbCBoYXMge2VkaXRpbmc6IGZhbHNlfSBhZnRlciBzdGFydEVkaXQoKSEgRm9yY2UgZWRpdGluZycpO1xuICAgICAgcm93LnZhbGlkYXRvci5lbmFibGUoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBoYW5kbGVFcnJvcihlcnJvcjogYW55LCBtZXNzYWdlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBlcnJvck1zZyA9IChlcnJvciAmJiBlcnJvci5tZXNzYWdlKSB8fCBlcnJvcjtcbiAgICBjb25zb2xlLmVycm9yKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gU2VydmljZSAke3RoaXMuX2VudGl0eU5hbWV9IHNlbnQgZXJyb3I6ICR7ZXJyb3JNc2d9YCwgZXJyb3IpO1xuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UgfHwgZXJyb3JNc2cpO1xuICB9XG5cbiAgaGFuZGxlU2VydmljZUVycm9yKGVycm9yOiBhbnkpIHtcbiAgICBjb25zdCBlcnJvck1zZyA9IChlcnJvciAmJiBlcnJvci5tZXNzYWdlKSB8fCBlcnJvcjtcbiAgICBjb25zb2xlLmVycm9yKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gU2VydmljZSAke3RoaXMuX2VudGl0eU5hbWV9IHNlbnQgZXJyb3I6ICR7ZXJyb3JNc2d9YCwgZXJyb3IpO1xuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBkZWxldGUoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIC8vIElmIG5ldyByb3c6IG5vdCBuZWVkIHRvIHByb3BhZ2F0ZSB0byB0aGUgZGF0YVNlcnZpY2VcbiAgICBpZiAoaWQgPT09IC0xKSB7XG4gICAgICByZXR1cm4gc3VwZXIuZGVsZXRlKGlkKTtcbiAgICB9XG5cbiAgICBjb25zdCByb3cgPSB0aGlzLmdldFJvdyhpZCk7XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBSb3cgdG8gZGVsZXRlIHdpdGggaWQ9JHtpZH0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICB0aGlzLmRhdGFTZXJ2aWNlXG4gICAgICAuZGVsZXRlQWxsKFtyb3cuY3VycmVudERhdGFdLCB0aGlzLnNhdmVBbGxPcHRpb25zKVxuICAgICAgLmNhdGNoKChlcnIpID0+IHRoaXMuaGFuZGxlU2VydmljZUVycm9yKGVycikpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIG1ha2Ugc3VyZSByb3cgaGFzIGJlZW4gZGVsZXRlZCAoYmVjYXVzZSBHcmFwUUhsIGNhY2hlIHJlbW92ZSBjYW4gZmFpbGVkKVxuICAgICAgICAgIGNvbnN0IHByZXNlbnQgPSB0aGlzLmdldFJvdyhpZCkgPT09IHJvdztcbiAgICAgICAgICBpZiAocHJlc2VudCkgc3VwZXIuZGVsZXRlKGlkKTtcblxuICAgICAgICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgICAgIH0sIDMwMCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbChyb3dzOiBSW10pOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Sb3dzKHJvd3MpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENhbGwgc2VydmljZSBkZWxldGlvblxuICAgICAgYXdhaXQgdGhpcy5kYXRhU2VydmljZS5kZWxldGVBbGwoZGF0YSwgdGhpcy5zYXZlQWxsT3B0aW9ucyk7XG5cbiAgICAgIC8vIFdhaXQgcHJvcGFnYXRpb24gKGUuZy4gdXBkYXRlIGNhY2hlLCB0aGVuIHJlY2VpdmVkIHVwZGF0ZSBmcm9tIGRhdGFTZXJ2aWNlLndhdGNoQWxsKCkpXG4gICAgICBhd2FpdCBzbGVlcCg1MDApO1xuXG4gICAgICAvLyBXb3JrYXJvdW5kLCB0byBiZSBzdXJlIGFsbCByb3dzIGhhdmUgYmVlbiBkZWxldGVkXG4gICAgICAvLyBTb21ldGltZSwgdGhlIHNlcnZpY2UgbWlzcyBkZWxldGlvbiwgb3IgR3JhcGhRbCBjYWNoZSByZW1vdmUgZmFpbGVkLlxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCBhcHBseSBtaXNzaW5nIGRlbGV0aW9uIHVzaW5nIHRoZSBwYXJlbnQgZGVsZXRlKCkgZnVuY3Rpb25cbiAgICAgIGNvbnN0IHJvd05vdERlbGV0ZWQgPSB0aGlzLmdldFJvd3MoKS5maWx0ZXIoKHJvdykgPT4gcm93cy5pbmNsdWRlcyhyb3cpKTtcbiAgICAgIGlmIChpc05vdEVtcHR5QXJyYXkocm93Tm90RGVsZXRlZCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gRm9yY2UgZGVsZXRpb24gb2YgJHtyb3dOb3REZWxldGVkLmxlbmd0aH0gcm93cyEgUGxlYXNlIGNoZWNrIHRoYXQgZGF0YSBzZXJ2aWNlIHVwZGF0ZSB0aGUgY2FjaGUsIGFmdGVyIGRlbGV0aW9uYFxuICAgICAgICApO1xuICAgICAgICAvLyBTdGFydCBhdCB0aGUgZW5kXG4gICAgICAgIGZvciAoY29uc3QgciBvZiByb3dOb3REZWxldGVkLnNvcnQoKGEsIGIpID0+IChhLmlkID4gYi5pZCA/IC0xIDogMSkpKSB7XG4gICAgICAgICAgc3VwZXIuZGVsZXRlKHIuaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBIYW5kbGUgc2VydmljZSBlcnJvclxuICAgICAgdGhpcy5oYW5kbGVTZXJ2aWNlRXJyb3IoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICB9XG4gIH1cblxuICBnZXRSb3coaWQ6IG51bWJlcik6IFIge1xuICAgIHJldHVybiBzdXBlci5nZXRSb3coaWQpO1xuICB9XG5cbiAgZ2V0Um93cygpOiBSW10ge1xuICAgIHJldHVybiB0aGlzLnJvd3NTdWJqZWN0LmdldFZhbHVlKCkgfHwgW107XG4gIH1cblxuICBoYXNTb21lRWRpdGluZ1JvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSb3dzKCkuc29tZSgocm93KSA9PiByb3cuZWRpdGluZyk7XG4gIH1cblxuICBoYXNTb21lRGlydHlSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um93cygpLnNvbWUoKHJvdykgPT4gcm93LmRpcnR5KTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU5ldyhpbnNlcnRBdD86IG51bWJlciwgb3B0cyA9IHsgZWRpdGluZzogdHJ1ZSB9KTogUHJvbWlzZTxSIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gQXZvaWQgbXVsdGlwbGUgY2FsbCAob25seSBvbmUgZWRpdGluZyByb3cgaXMgYWxsb3dlZClcbiAgICBpZiAodGhpcy5fY3JlYXRpbmcgJiYgb3B0cy5lZGl0aW5nKSByZXR1cm47XG5cbiAgICB0aGlzLl9jcmVhdGluZyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm93ID0gYXdhaXQgc3VwZXIuY3JlYXRlTmV3KGluc2VydEF0LCBvcHRzKTtcblxuICAgICAgaWYgKCFyb3cpIHJldHVybiB1bmRlZmluZWQ7IC8vIFN0b3AgaGVyZVxuXG4gICAgICAvLyBDYWxsIG9ic2VydmVyc1xuICAgICAgaWYgKHRoaXMuY29uZmlnPy5vblJvd0NyZWF0ZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZy5vblJvd0NyZWF0ZWQocm93KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gTG9nLCB0aGVuIGNvbnRpbnVlXG4gICAgICAgICAgY29uc29sZS5lcnJvcigoZXJyICYmIGVyci5tZXNzYWdlKSB8fCBlcnIsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJvdztcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fY3JlYXRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBnZXREYXRhKCk6IFRbXSB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0Um93cygpO1xuICAgIHJldHVybiB0aGlzLmdldERhdGFGcm9tUm93cyhyb3dzKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoTW9yZShvcHRzPzogeyBlbWl0RXZlbnQ6IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5fZmV0Y2hNb3JlRm4pIHJldHVybiBmYWxzZTsgLy8gQXZvaWQgbXVsdGlwbGUgY2FsbFxuICAgIGlmICh0aGlzLmhhc1NvbWVEaXJ0eVJvdygpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbm5vdCBmZXRjaCBtb3JlICR7dGhpcy5fZW50aXR5TmFtZX0gYmVjYXVzZSBzb21lIHJvdykgc3RpbGwgZGlydHlgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5kZWJ1ZyhgV2lsbCBmZXRjaGluZyBtb3JlIHJvdyhzKSBzdGlsbC4uLmApO1xuXG4gICAgLy8gRm9yZ2V0IHRoZSBmZXRjaE1vcmUgZnVuY3Rpb24sIHRvIGF2b2lkIG11bHRpcGxlIGNhbGxcbiAgICBjb25zdCBmZXRjaE1vcmVGbiA9IHRoaXMuX2ZldGNoTW9yZUZuO1xuICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gbnVsbDtcblxuICAgIC8vIEZldGNoIG5leHQgcGFnZVxuICAgIGNvbnN0IHJlczogTG9hZFJlc3VsdDxUPiA9IGF3YWl0IGZldGNoTW9yZUZuKCk7XG5cbiAgICAvLyBTa2lwIGlmIGVtcHR5IChubyBtb3JlIGRhdGEpXG4gICAgaWYgKGlzRW1wdHlBcnJheShyZXM/LmRhdGEpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGRhdGEgc291cmNlXG4gICAgc3VwZXIudXBkYXRlRGF0YXNvdXJjZSgodGhpcy5jdXJyZW50RGF0YSB8fCBbXSkuY29uY2F0KC4uLnJlcy5kYXRhKSwgb3B0cyk7XG5cbiAgICAvLyBSZW1lbWJlciBmZXRjaE1vcmVcbiAgICB0aGlzLl9mZXRjaE1vcmVGbiA9IHJlcy5mZXRjaE1vcmU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kIC0tICovXG5cbiAgbWFya0FzTG9hZGluZygpIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nU3ViamVjdC52YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc0xvYWRlZCgpIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nU3ViamVjdC52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya0FzU2F2aW5nKCkge1xuICAgIGlmICh0aGlzLnNhdmluZ1N1YmplY3QudmFsdWUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2F2aW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc1NhdmVkKCkge1xuICAgIGlmICh0aGlzLnNhdmluZ1N1YmplY3QudmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnNhdmluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgfVxuICB9XG59XG4iXX0=