@sumaris-net/ngx-components 1.19.3 → 1.20.0-rc3

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,14 +1,13 @@
1
1
  import { __awaiter } from "tslib";
2
- import { TableDataSource, ValidatorService } from '@e-is/ngx-material-table';
2
+ import { TableDataSource } from '@e-is/ngx-material-table';
3
3
  import { BehaviorSubject, Subject } from 'rxjs';
4
+ import { EntityUtils } from '../services/model/entity.model';
4
5
  import { ErrorCodes } from '../services/errors';
5
6
  import { catchError, debounceTime, map, takeUntil } from 'rxjs/operators';
6
7
  import { Directive } from '@angular/core';
7
- import { firstFalsePromise, firstNotNilPromise } from '../../shared/observables';
8
- import { isNotEmptyArray, isNotNil, removeEnd, toBoolean } from '../../shared/functions';
8
+ import { firstFalsePromise } from '../../shared/observables';
9
+ import { isNotEmptyArray, removeEnd, sleep, toBoolean } from '../../shared/functions';
9
10
  import { AppTableUtils } from './table.utils';
10
- export class AppTableDataSourceOptions {
11
- }
12
11
  // @dynamic
13
12
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
14
13
  export class EntitiesTableDataSource extends TableDataSource {
@@ -17,34 +16,27 @@ export class EntitiesTableDataSource extends TableDataSource {
17
16
  *
18
17
  * @param dataService A service to load and save data
19
18
  * @param dataType Type of data contained by the Table. If not specified, then `data` with at least one element must be specified.
20
- * @param environment
21
19
  * @param validatorService Service that create instances of the FormGroup used to validate row fields.
22
20
  * @param config Additional configuration for table.
23
21
  */
24
22
  constructor(dataType, dataService, validatorService, config) {
25
- super([], dataType, validatorService, config);
23
+ super([], dataType, validatorService, Object.assign({ dataServiceOptions: {}, debug: config && config.suppressErrors === false, keepOriginalDataAfterConfirm: false }, config));
26
24
  this.dataService = dataService;
27
25
  this._creating = false;
28
26
  this._saving = false;
29
- this._useValidator = false;
30
27
  this._stopWatching$ = new Subject();
31
28
  this._editingRowCount = 0;
32
29
  this._fetchMoreFn = null;
33
30
  this.loadingSubject = new BehaviorSubject(undefined);
34
- this._options = Object.assign({ dataServiceOptions: {}, debug: config && config.suppressErrors === false, keepOriginalDataAfterConfirm: false }, config);
35
- this._useValidator = isNotNil(validatorService);
36
31
  this._logTypeName = removeEnd((new dataType()).__typename || 'UnknownVO', 'VO');
37
32
  // For DEV ONLY
38
- this._debug = this._options.debug === true;
33
+ this._debug = this.config.debug === true;
39
34
  }
40
35
  get serviceOptions() {
41
- return this._options.dataServiceOptions;
36
+ return this.config.dataServiceOptions;
42
37
  }
43
38
  set serviceOptions(value) {
44
- this._options.dataServiceOptions = value;
45
- }
46
- get options() {
47
- return this._options;
39
+ this.config.dataServiceOptions = value;
48
40
  }
49
41
  get loaded() {
50
42
  return this.loadingSubject.value === false; // Should be false when undefined (initial state)
@@ -52,12 +44,11 @@ export class EntitiesTableDataSource extends TableDataSource {
52
44
  get loading() {
53
45
  return this.loadingSubject.value !== false; // Should be true when undefined (initial state)
54
46
  }
55
- ngOnDestroy() {
47
+ disconnect(collectionViewer) {
48
+ super.disconnect(collectionViewer);
56
49
  this._stopWatching$.next();
57
50
  this._stopWatching$.complete();
58
- this._stopWatching$.unsubscribe();
59
51
  this.loadingSubject.complete();
60
- this.loadingSubject.unsubscribe();
61
52
  }
62
53
  watchAll(offset, size, sortBy, sortDirection, filter) {
63
54
  this._stopWatching$.next();
@@ -101,27 +92,26 @@ export class EntitiesTableDataSource extends TableDataSource {
101
92
  // Get all rows
102
93
  const rows = yield this.getRows();
103
94
  // Finish editing all rows
104
- const invalidRows = rows.filter(row => row.editing && !row.confirmEditCreate());
95
+ const confirmed = yield this.confirmRows(rows);
105
96
  // Cannot finish some rows: error
106
- if (invalidRows.length) {
97
+ if (!confirmed) {
107
98
  // log errors
108
99
  if (this._debug)
109
- invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[table-datasource] ${this._logTypeName} row #${row.id}`));
100
+ this.getEditingRows(rows).forEach(row => AppTableUtils.logRowErrors(row, `[table-datasource] ${this._logTypeName} row #${row.id}`));
110
101
  // Stop with an error
111
102
  throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
112
103
  }
113
104
  this._editingRowCount = 0;
114
105
  let data;
115
106
  let dataToSave;
116
- if (this._useValidator) {
107
+ if (!!this.validatorService) {
117
108
  dataToSave = [];
118
109
  data = rows.map(row => {
119
- const currentData = new this.dataConstructor();
120
- currentData.fromObject(row.currentData);
110
+ const entity = this.toEntity(row.currentData);
121
111
  // Filter to keep only dirty row
122
112
  if (onlyDirtyRows && row.validator.dirty)
123
- dataToSave.push(currentData);
124
- return currentData;
113
+ dataToSave.push(entity);
114
+ return entity;
125
115
  });
126
116
  if (!onlyDirtyRows)
127
117
  dataToSave = data;
@@ -158,25 +148,33 @@ export class EntitiesTableDataSource extends TableDataSource {
158
148
  }
159
149
  });
160
150
  }
161
- updateDatasource(data, opts) {
162
- if (this._debug)
163
- console.debug(`[table-datasource] Updating datasource with data:`, data);
164
- super.updateDatasource(data, opts);
165
- if (!opts || opts.emitEvent !== false) {
166
- this.markAsLoaded();
151
+ getDataFromRows(rows, options = { originalData: false, toEntity: false }) {
152
+ if (options.toEntity) {
153
+ return super.getDataFromRows(rows, options)
154
+ .map(data => this.toEntity(data));
167
155
  }
156
+ return super.getDataFromRows(rows, options);
168
157
  }
169
- // Overwrite default signature
170
- createNew(insertAt) {
171
- this.asyncCreateNew(insertAt);
172
- }
173
- connect(collectionViewer) {
174
- // DEBUG console.debug("[entities-datasource] connect");
175
- return super.connect(collectionViewer);
158
+ toEntity(data) {
159
+ if (EntityUtils.isNotEntity(data)) {
160
+ const entity = new this.dataConstructor();
161
+ entity.fromObject(data);
162
+ return entity;
163
+ }
164
+ return data;
176
165
  }
177
- disconnect(collectionViewer) {
178
- super.disconnect(collectionViewer);
179
- this._stopWatching$.next();
166
+ updateDatasource(data, opts = { emitEvent: true }) {
167
+ const _super = Object.create(null, {
168
+ updateDatasource: { get: () => super.updateDatasource }
169
+ });
170
+ return __awaiter(this, void 0, void 0, function* () {
171
+ if (this._debug)
172
+ console.debug(`[table-datasource] Updating datasource with data:`, data);
173
+ yield _super.updateDatasource.call(this, data, opts);
174
+ if (opts.emitEvent) {
175
+ this.markAsLoaded();
176
+ }
177
+ });
180
178
  }
181
179
  waitIdle(debounceTimeMs) {
182
180
  return firstFalsePromise(this.loadingSubject
@@ -185,34 +183,60 @@ export class EntitiesTableDataSource extends TableDataSource {
185
183
  ));
186
184
  }
187
185
  confirmCreate(row) {
188
- if (!super.confirmCreate(row))
189
- return false;
190
- if (row.editing && row.validator) {
191
- console.warn('[table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');
192
- row.validator.disable({ onlySelf: true, emitEvent: false });
193
- }
194
- return true;
186
+ const _super = Object.create(null, {
187
+ confirmCreate: { get: () => super.confirmCreate }
188
+ });
189
+ return __awaiter(this, void 0, void 0, function* () {
190
+ if (!(yield _super.confirmCreate.call(this, row)))
191
+ return false;
192
+ if (row.editing && row.validator) {
193
+ console.warn('[table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');
194
+ row.validator.disable({ onlySelf: true, emitEvent: false });
195
+ }
196
+ return true;
197
+ });
195
198
  }
196
199
  confirmEdit(row) {
197
- if (!super.confirmEdit(row))
198
- return false;
199
- if (row.editing && row.validator) {
200
- console.warn('[table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');
201
- row.validator.disable({ onlySelf: true, emitEvent: false });
202
- }
203
- return true;
200
+ const _super = Object.create(null, {
201
+ confirmEdit: { get: () => super.confirmEdit }
202
+ });
203
+ return __awaiter(this, void 0, void 0, function* () {
204
+ if (!(yield _super.confirmEdit.call(this, row)))
205
+ return false;
206
+ if (row.editing && row.validator) {
207
+ console.warn('[table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');
208
+ row.validator.disable({ onlySelf: true, emitEvent: false });
209
+ }
210
+ return true;
211
+ });
204
212
  }
205
213
  startEdit(row) {
206
- if (this._debug)
207
- console.debug('[table-datasource] Start to edit row', row);
208
- row.startEdit();
209
- this._editingRowCount++;
214
+ const _super = Object.create(null, {
215
+ startEdit: { get: () => super.startEdit }
216
+ });
217
+ return __awaiter(this, void 0, void 0, function* () {
218
+ if (row.editing)
219
+ return; // Already editing
220
+ if (this._debug)
221
+ console.debug('[table-datasource] Start to edit row', row);
222
+ const done = yield _super.startEdit.call(this, row);
223
+ if (done)
224
+ this._editingRowCount++;
225
+ return done;
226
+ });
210
227
  }
211
- cancelOrDelete(row) {
212
- if (this._debug)
213
- console.debug('[table-datasource] Cancelling or deleting row', row);
214
- row.cancelOrDelete();
215
- this._editingRowCount--;
228
+ cancel(row) {
229
+ const _super = Object.create(null, {
230
+ cancel: { get: () => super.cancel }
231
+ });
232
+ return __awaiter(this, void 0, void 0, function* () {
233
+ if (this._debug)
234
+ console.debug('[table-datasource] Cancelling row', row);
235
+ const done = yield _super.cancel.call(this, row);
236
+ if (done)
237
+ this._editingRowCount--;
238
+ return done;
239
+ });
216
240
  }
217
241
  handleError(error, message) {
218
242
  const errorMsg = error && error.message || error;
@@ -227,59 +251,77 @@ export class EntitiesTableDataSource extends TableDataSource {
227
251
  throw error;
228
252
  }
229
253
  delete(id) {
230
- // If new row: not need to propagate to the dataService
231
- if (id === -1) {
232
- return super.delete(id);
233
- }
234
- const row = this.getRow(id);
235
- if (!row) {
236
- console.error(`[table-datasource] Row to delete with id=${id} not found`);
237
- return;
238
- }
239
- this.loadingSubject.next(true);
240
- this.dataService.deleteAll([row.currentData], this.serviceOptions)
241
- .catch(err => this.handleErrorPromise(err))
242
- .then(() => {
243
- setTimeout(() => {
244
- // make sure row has been deleted (because GrapQHl cache remove can failed)
254
+ const _super = Object.create(null, {
255
+ delete: { get: () => super.delete }
256
+ });
257
+ return __awaiter(this, void 0, void 0, function* () {
258
+ // If new row: not need to propagate to the dataService
259
+ if (id === -1) {
260
+ return _super.delete.call(this, id);
261
+ }
262
+ const row = this.getRow(id);
263
+ if (!row) {
264
+ console.error(`[table-datasource] Row to delete with id=${id} not found`);
265
+ return;
266
+ }
267
+ this.markAsLoading();
268
+ try {
269
+ yield this.dataService.deleteAll([row.currentData], this.serviceOptions);
270
+ // Make sure row has been deleted (because GrapQHl cache remove can failed)
271
+ yield sleep(300);
245
272
  const present = this.getRow(id) === row;
246
- if (present)
247
- super.delete(id);
248
- this.loadingSubject.next(false);
249
- }, 300);
273
+ if (present) {
274
+ console.warn('[table-datasource] Force deletion of 1 row (Is service applying deletion to observable ?)');
275
+ yield _super.delete.call(this, id);
276
+ }
277
+ }
278
+ catch (err) {
279
+ this.handleErrorPromise(err);
280
+ }
281
+ finally {
282
+ this.markAsLoaded();
283
+ }
250
284
  });
251
285
  }
252
286
  deleteAll(rows) {
253
- this.markAsLoading();
254
- const data = rows.map(r => r.currentData);
255
- const rowsById = rows.reduce((res, row) => {
256
- res[row.id] = row;
257
- return res;
258
- }, {});
259
- const self = this;
260
- const selfDelete = super.delete;
261
- return this.dataService.deleteAll(data, this.serviceOptions)
262
- .catch(err => this.handleErrorPromise(err))
263
- .then(() => {
264
- // Workaround, to be sure all rows has been deleted
265
- // Sometimes, the service miss deletion, or GrapQHl cache remove failed
266
- const rowNotDeleted = Object.getOwnPropertyNames(rowsById).reduce((res, id) => {
267
- const row = rowsById[id];
268
- const present = self.getRow(+id) === row;
269
- return present ? res.concat(row) : res;
270
- }, []).sort((a, b) => a.id > b.id ? -1 : 1);
271
- // Apply missing deletion
272
- if (isNotEmptyArray(rowNotDeleted)) {
273
- console.warn(`[table-datasource] Force deletion of ${rowNotDeleted.length} rows (Is service applying deletion to observable ?)`);
274
- rowNotDeleted.forEach(r => selfDelete.call(self, r.id));
287
+ const _super = Object.create(null, {
288
+ delete: { get: () => super.delete }
289
+ });
290
+ return __awaiter(this, void 0, void 0, function* () {
291
+ this.markAsLoading();
292
+ const data = this.getDataFromRows(rows);
293
+ const rowsById = rows.reduce((res, row) => {
294
+ res[row.id] = row;
295
+ return res;
296
+ }, {});
297
+ const self = this;
298
+ try {
299
+ yield this.dataService.deleteAll(data, this.serviceOptions);
300
+ // Workaround, to be sure all rows has been deleted
301
+ // Sometimes, the service miss deletion, or GrapQHl cache remove failed
302
+ const rowNotDeleted = Object.getOwnPropertyNames(rowsById).reduce((res, id) => {
303
+ const row = rowsById[id];
304
+ const present = self.getRow(+id) === row;
305
+ return present ? res.concat(row) : res;
306
+ }, []).sort((a, b) => a.id > b.id ? -1 : 1);
307
+ // Apply missing deletion
308
+ if (isNotEmptyArray(rowNotDeleted)) {
309
+ console.warn(`[table-datasource] Force deletion of ${rowNotDeleted.length} rows (Is service applying deletion to observable ?)`);
310
+ yield Promise.all(rowNotDeleted.map(r => _super.delete.call(this, r.id)));
311
+ }
312
+ }
313
+ catch (err) {
314
+ this.handleErrorPromise(err);
315
+ }
316
+ finally {
317
+ this.markAsLoaded();
275
318
  }
276
- this.loadingSubject.next(false);
277
319
  });
278
320
  }
279
321
  getRows() {
280
- return firstNotNilPromise(this.connect(null));
322
+ return this.rowsSubject.toPromise();
281
323
  }
282
- asyncCreateNew(insertAt) {
324
+ createNew(insertAt) {
283
325
  const _super = Object.create(null, {
284
326
  createNew: { get: () => super.createNew }
285
327
  });
@@ -287,22 +329,39 @@ export class EntitiesTableDataSource extends TableDataSource {
287
329
  if (this._creating)
288
330
  return; // Avoid multiple call (should never occur)
289
331
  this._creating = true;
290
- _super.createNew.call(this, insertAt);
291
- const row = this.getRow(-1);
292
- if (row && this._options && this._options.onRowCreated) {
293
- const res = this._options.onRowCreated(row);
294
- // If async function, wait the end before ending
295
- if (res instanceof Promise) {
296
- try {
297
- yield res;
298
- }
299
- catch (err) {
300
- console.error(err && err.message || err, err);
301
- }
332
+ const done = yield _super.createNew.call(this, insertAt);
333
+ if (done && this.config.onRowCreated) {
334
+ const row = this.getRow(-1);
335
+ try {
336
+ yield this.config.onRowCreated(row);
337
+ }
338
+ catch (err) {
339
+ console.error(err && err.message || err, err);
340
+ // Continue
302
341
  }
303
342
  }
304
- this._editingRowCount++;
343
+ if (done)
344
+ this._editingRowCount++;
305
345
  this._creating = false;
346
+ return done;
347
+ });
348
+ }
349
+ createRowValidator() {
350
+ const _super = Object.create(null, {
351
+ createRowValidator: { get: () => super.createRowValidator }
352
+ });
353
+ return __awaiter(this, void 0, void 0, function* () {
354
+ const validator = yield _super.createRowValidator.call(this);
355
+ if (validator && this.config.onRowValidator) {
356
+ try {
357
+ yield this.config.onRowValidator(validator);
358
+ }
359
+ catch (err) {
360
+ console.error(err && err.message || err, err);
361
+ // Continue
362
+ }
363
+ }
364
+ return validator;
306
365
  });
307
366
  }
308
367
  getData() {
@@ -317,21 +376,24 @@ export class EntitiesTableDataSource extends TableDataSource {
317
376
  });
318
377
  return __awaiter(this, void 0, void 0, function* () {
319
378
  if (!this._fetchMoreFn)
320
- return false; // Avoid multiple call
379
+ return false;
321
380
  if (this._editingRowCount > 0) {
322
381
  console.warn('Cannot fetch more because still editing row');
323
382
  return;
324
383
  }
384
+ // Forget the fetchMore function, to avoid multiple call
385
+ const fetchMoreFn = this._fetchMoreFn;
386
+ this._fetchMoreFn = null;
325
387
  // Fetch next page
326
- this._fetchMoreFn = null; // Avoid multiple call
327
- const res = yield this._fetchMoreFn();
388
+ const res = yield fetchMoreFn();
328
389
  // Skip if empty (no more data)
329
390
  if (isNotEmptyArray(res === null || res === void 0 ? void 0 : res.data))
330
391
  return false;
331
392
  // Update the data source
393
+ // TODO review this, to keep existing rows, instead of creating new TableElement + validator !
332
394
  const existingData = yield this.getData();
333
- _super.updateDatasource.call(this, existingData.concat(...res.data), opts);
334
- // Remember fetchMore
395
+ yield _super.updateDatasource.call(this, existingData.concat(...res.data), opts);
396
+ // Store next fetchMore function
335
397
  this._fetchMoreFn = res.fetchMore;
336
398
  return true;
337
399
  });
@@ -354,7 +416,7 @@ EntitiesTableDataSource.decorators = [
354
416
  EntitiesTableDataSource.ctorParameters = () => [
355
417
  { type: Function },
356
418
  { type: undefined },
357
- { type: ValidatorService },
358
- { type: AppTableDataSourceOptions }
419
+ { type: undefined },
420
+ { type: undefined }
359
421
  ];
360
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS9lbnRpdGllcy10YWJsZS1kYXRhc291cmNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFnQixnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxlQUFlLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRTFELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxFQUFDLFNBQVMsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUtuRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRSxPQUFPLEVBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdkYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQVE1QyxNQUFNLE9BQU8seUJBQXlCO0NBV3JDO0FBRUQsV0FBVztBQUVYLGtFQUFrRTtBQUNsRSxNQUFNLE9BQU8sdUJBS1QsU0FBUSxlQUFrQjtJQW9DNUI7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLFFBQW9CLEVBQ0osV0FBc0MsRUFDdEQsZ0JBQW1DLEVBQ25DLE1BQTRDO1FBQ3RELEtBQUssQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBSHBCLGdCQUFXLEdBQVgsV0FBVyxDQUEyQjtRQXZDeEQsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUNwQyxxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDckIsaUJBQVksR0FBK0IsSUFBSSxDQUFDO1FBRTFELG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQVUsU0FBUyxDQUFDLENBQUM7UUFvQ3ZELElBQUksQ0FBQyxRQUFRLG1CQUNYLGtCQUFrQixFQUFFLEVBQUUsRUFDdEIsS0FBSyxFQUFFLE1BQU0sSUFBSSxNQUFNLENBQUMsY0FBYyxLQUFLLEtBQUssRUFDaEQsNEJBQTRCLEVBQUUsS0FBSyxJQUNoQyxNQUFNLENBQ1YsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFaEQsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUMsVUFBVSxJQUFJLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVoRixlQUFlO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUM7SUFDN0MsQ0FBQztJQTlDRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLGNBQWMsQ0FBQyxLQUFvQztRQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUMzQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDLGlEQUFpRDtJQUMvRixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQyxnREFBZ0Q7SUFDOUYsQ0FBQztJQThCRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxRQUFRLENBQUMsTUFBYyxFQUNkLElBQVksRUFDWixNQUFlLEVBQ2YsYUFBNkIsRUFDN0IsTUFBbUI7UUFFMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQW1CLENBQUM7YUFDcEcsSUFBSTtRQUNILDhDQUE4QztRQUM5QyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUM5QixVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLEVBQ2pFLEdBQUcsQ0FBQyxDQUFDLEdBQWtCLEVBQUUsRUFBRTtZQUN6QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0JBQStCLElBQUksQ0FBQyxZQUFZLDhDQUE4QyxDQUFDLENBQUM7YUFDOUc7aUJBQU0sSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFO2dCQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixJQUFJLENBQUMsWUFBWSxnQkFBZ0IsSUFBSSxDQUFDLGdCQUFnQiw2RUFBNkUsQ0FBQyxDQUFDO2FBQ2xMO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFRLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDO2FBQ25DO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQUVLLElBQUk7O1lBQ1IsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ2xELE9BQU8sQ0FBQyxLQUFLLENBQUMseUVBQXlFLENBQUMsQ0FBQztnQkFDekYsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELG9DQUFvQztZQUNwQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMscUNBQXFDLElBQUksQ0FBQyxZQUFZLG1CQUFtQixDQUFDLENBQUM7Z0JBQ3hGLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFckIsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFOUUsSUFBSTtnQkFDRixJQUFJLElBQUksQ0FBQyxNQUFNO29CQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLElBQUksQ0FBQyxZQUFZLHdCQUF3QixhQUFhLEdBQUcsQ0FBQyxDQUFDO2dCQUV2SCxlQUFlO2dCQUNmLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUVsQywwQkFBMEI7Z0JBQzFCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztnQkFFaEYsaUNBQWlDO2dCQUNqQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUU7b0JBQ3RCLGFBQWE7b0JBQ2IsSUFBSSxJQUFJLENBQUMsTUFBTTt3QkFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLElBQUksQ0FBQyxZQUFZLFNBQVMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDdkkscUJBQXFCO29CQUNyQixNQUFNLEVBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyx1QkFBdUIsRUFBRSxPQUFPLEVBQUUsK0JBQStCLEVBQUMsQ0FBQztpQkFDNUY7Z0JBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztnQkFFMUIsSUFBSSxJQUFTLENBQUM7Z0JBQ2QsSUFBSSxVQUFlLENBQUM7Z0JBRXBCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtvQkFDdEIsVUFBVSxHQUFHLEVBQUUsQ0FBQztvQkFDaEIsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ3BCLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBTyxDQUFDO3dCQUNwRCxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQzt3QkFDeEMsZ0NBQWdDO3dCQUNoQyxJQUFJLGFBQWEsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUs7NEJBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzt3QkFDdkUsT0FBTyxXQUFXLENBQUM7b0JBQ3JCLENBQUMsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxhQUFhO3dCQUFFLFVBQVUsR0FBRyxJQUFJLENBQUM7aUJBQ3ZDO2dCQUNELDhFQUE4RTtxQkFDekU7b0JBQ0gsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3hDLG1EQUFtRDtvQkFDbkQsVUFBVSxHQUFHLElBQUksQ0FBQztpQkFDbkI7Z0JBRUQsMkJBQTJCO2dCQUMzQixJQUFJLGFBQWEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7b0JBQ3ZDLElBQUksSUFBSSxDQUFDLE1BQU07d0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsSUFBSSxDQUFDLFlBQVkscUJBQXFCLENBQUMsQ0FBQztvQkFDaEcsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBRUQsSUFBSSxJQUFJLENBQUMsTUFBTTtvQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLGtEQUFrRCxJQUFJLENBQUMsWUFBWSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ3hILE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFFaEUsSUFBSSxJQUFJLENBQUMsTUFBTTtvQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixJQUFJLENBQUMsWUFBWSxZQUFZLENBQUMsQ0FBQztnQkFFM0YsNEpBQTRKO2dCQUM1SixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7Z0JBRWhELE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFBQyxPQUFPLEtBQUssRUFBRTtnQkFDZCxJQUFJLElBQUksQ0FBQyxNQUFNO29CQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMseUNBQXlDLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLENBQUM7Z0JBQzVHLE1BQU0sS0FBSyxDQUFDO2FBQ2I7b0JBQVM7Z0JBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUNyQjtRQUNILENBQUM7S0FBQTtJQUVELGdCQUFnQixDQUFDLElBQVMsRUFBRSxJQUE2QjtRQUN2RCxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxtREFBbUQsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUUxRixLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRW5DLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUU7WUFDckMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixTQUFTLENBQUMsUUFBaUI7UUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsT0FBTyxDQUFDLGdCQUFrQztRQUN4Qyx3REFBd0Q7UUFDeEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFVBQVUsQ0FBQyxnQkFBbUM7UUFDNUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELFFBQVEsQ0FBQyxjQUF1QjtRQUM5QixPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxjQUFjO2FBQ3pDLFlBQVksRUFBRTthQUNkLElBQUksQ0FDSCxZQUFZLENBQUMsY0FBYyxJQUFJLEdBQUcsQ0FBQyxDQUFDLDJCQUEyQjtTQUNoRSxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQW9CO1FBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzVDLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsU0FBUyxFQUFFO1lBQ2hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0dBQWdHLENBQUMsQ0FBQztZQUMvRyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7U0FDM0Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBb0I7UUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUMsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUU7WUFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyxnR0FBZ0csQ0FBQyxDQUFDO1lBQy9HLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztTQUMzRDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFvQjtRQUM1QixJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1RSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUFvQjtRQUNqQyxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQywrQ0FBK0MsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyRixHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFVLEVBQUUsT0FBZTtRQUNyQyxNQUFNLFFBQVEsR0FBRyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUM7UUFDakQsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLFlBQVksZ0JBQWdCLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBVTtRQUMzQixNQUFNLFFBQVEsR0FBRyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUM7UUFDakQsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLFlBQVksZ0JBQWdCLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBVTtRQUNmLHVEQUF1RDtRQUN2RCxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNiLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QjtRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsNENBQTRDLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDMUUsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQzthQUMvRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDMUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNULFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsMkVBQTJFO2dCQUMzRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQztnQkFDeEMsSUFBSSxPQUFPO29CQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLFNBQVMsQ0FBQyxJQUF1QjtRQUV0QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3hDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2xCLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1AsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFFaEMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQzthQUN6RCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDMUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNULG1EQUFtRDtZQUNuRCx1RUFBdUU7WUFDdkUsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTtnQkFDNUUsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN6QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDO2dCQUN6QyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3pDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1Qyx5QkFBeUI7WUFDekIsSUFBSSxlQUFlLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLGFBQWEsQ0FBQyxNQUFNLHNEQUFzRCxDQUFDLENBQUM7Z0JBQ2pJLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUN6RDtZQUNELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLE9BQU87UUFDWixPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQStCLENBQUM7SUFDOUUsQ0FBQztJQUVZLGNBQWMsQ0FBQyxRQUFpQjs7Ozs7WUFDM0MsSUFBSSxJQUFJLENBQUMsU0FBUztnQkFBRSxPQUFPLENBQUMsMkNBQTJDO1lBRXZFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBRXRCLE9BQU0sU0FBUyxZQUFDLFFBQVEsRUFBRTtZQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFNUIsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRTtnQkFDdEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVDLGdEQUFnRDtnQkFDaEQsSUFBSSxHQUFHLFlBQVksT0FBTyxFQUFFO29CQUMxQixJQUFJO3dCQUNGLE1BQU0sR0FBRyxDQUFDO3FCQUNYO29CQUNELE9BQU8sR0FBRyxFQUFHO3dCQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3FCQUMvQztpQkFDRjthQUNGO1lBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQztLQUFBO0lBRUssT0FBTzs7WUFDWCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQztLQUFBO0lBRUssU0FBUyxDQUFDLElBQTZCOzs7OztZQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7Z0JBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxzQkFBc0I7WUFDNUQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxDQUFDLENBQUM7Z0JBQzVELE9BQU87YUFDUjtZQUVELGtCQUFrQjtZQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDLHNCQUFzQjtZQUNoRCxNQUFNLEdBQUcsR0FBa0IsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFckQsK0JBQStCO1lBQy9CLElBQUksZUFBZSxDQUFDLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFFN0MseUJBQXlCO1lBQ3pCLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzFDLE9BQU0sZ0JBQWdCLFlBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUU7WUFFL0QscUJBQXFCO1lBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQztZQUNsQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FBQTtJQUVELDRCQUE0QjtJQUU1QixhQUFhO1FBQ1gsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQzs7O1lBeFlGLFNBQVM7Ozs7O1lBbEM2QixnQkFBZ0I7WUF5RmhDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VGFibGVEYXRhU291cmNlLCBUYWJsZUVsZW1lbnQsIFZhbGlkYXRvclNlcnZpY2V9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0VudGl0eSwgSUVudGl0eX0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7RXJyb3JDb2Rlc30gZnJvbSAnLi4vc2VydmljZXMvZXJyb3JzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBtYXAsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtEaXJlY3RpdmUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NvcnREaXJlY3Rpb259IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHtDb2xsZWN0aW9uVmlld2VyfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtUYWJsZURhdGFTb3VyY2VPcHRpb25zfSBmcm9tICdAZS1pcy9uZ3gtbWF0ZXJpYWwtdGFibGUvc3JjL2FwcC9uZ3gtbWF0ZXJpYWwtdGFibGUvdGFibGUtZGF0YS1zb3VyY2UnO1xuaW1wb3J0IHtFbnRpdGllc1NlcnZpY2VXYXRjaE9wdGlvbnMsIEZldGNoTW9yZUZuLCBJRW50aXRpZXNTZXJ2aWNlLCBMb2FkUmVzdWx0fSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtmaXJzdEZhbHNlUHJvbWlzZSwgZmlyc3ROb3ROaWxQcm9taXNlfSBmcm9tICcuLi8uLi9zaGFyZWQvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHtpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsLCByZW1vdmVFbmQsIHRvQm9vbGVhbn0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0FwcFRhYmxlVXRpbHN9IGZyb20gJy4vdGFibGUudXRpbHMnO1xuXG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBBcHBUYWJsZURhdGFTZXJ2aWNlT3B0aW9uczxPIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zPiBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgc2F2ZU9ubHlEaXJ0eVJvd3M/OiBib29sZWFuO1xuICByZWFkT25seT86IGJvb2xlYW47XG59XG5leHBvcnQgY2xhc3MgQXBwVGFibGVEYXRhU291cmNlT3B0aW9uczxcbiAgVCBleHRlbmRzIEVudGl0eTxULCBJRD4sXG4gIElEID0gbnVtYmVyLFxuICBPIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zPiBpbXBsZW1lbnRzIFRhYmxlRGF0YVNvdXJjZU9wdGlvbnMge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIHByZXBlbmROZXdFbGVtZW50cz86IGJvb2xlYW47XG4gIHN1cHByZXNzRXJyb3JzPzogYm9vbGVhbjtcbiAga2VlcE9yaWdpbmFsRGF0YUFmdGVyQ29uZmlybT86IGJvb2xlYW47XG4gIG9uUm93Q3JlYXRlZD86IChyb3c6IFRhYmxlRWxlbWVudDxUPikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gIGRhdGFTZXJ2aWNlT3B0aW9ucz86IEFwcFRhYmxlRGF0YVNlcnZpY2VPcHRpb25zPE8+O1xuICBkZWJ1Zz86IGJvb2xlYW47XG59XG5cbi8vIEBkeW5hbWljXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGNsYXNzIEVudGl0aWVzVGFibGVEYXRhU291cmNlPFxuICBUIGV4dGVuZHMgSUVudGl0eTxULCBJRD4sXG4gIEYgPSBhbnksXG4gIElEID0gbnVtYmVyLFxuICBPIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zPlxuICAgIGV4dGVuZHMgVGFibGVEYXRhU291cmNlPFQ+XG4gICAgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvZ1R5cGVOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IEFwcFRhYmxlRGF0YVNvdXJjZU9wdGlvbnM8VCwgSUQsIE8+O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBfZGVidWc6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBfY3JlYXRpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zYXZpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF91c2VWYWxpZGF0b3IgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zdG9wV2F0Y2hpbmckID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICBwcm90ZWN0ZWQgX2VkaXRpbmdSb3dDb3VudCA9IDA7XG4gIHByb3RlY3RlZCBfZmV0Y2hNb3JlRm46IEZldGNoTW9yZUZuPExvYWRSZXN1bHQ8VD4+ID0gbnVsbDtcblxuICBsb2FkaW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odW5kZWZpbmVkKTtcblxuICBnZXQgc2VydmljZU9wdGlvbnMoKTogQXBwVGFibGVEYXRhU2VydmljZU9wdGlvbnM8Tz4ge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zLmRhdGFTZXJ2aWNlT3B0aW9ucztcbiAgfVxuXG4gIHNldCBzZXJ2aWNlT3B0aW9ucyh2YWx1ZTogQXBwVGFibGVEYXRhU2VydmljZU9wdGlvbnM8Tz4pICB7XG4gICAgdGhpcy5fb3B0aW9ucy5kYXRhU2VydmljZU9wdGlvbnMgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBvcHRpb25zKCk6IEFwcFRhYmxlRGF0YVNvdXJjZU9wdGlvbnM8VCwgSUQsIE8+IHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgfVxuXG4gIGdldCBsb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1N1YmplY3QudmFsdWUgPT09IGZhbHNlOyAvLyBTaG91bGQgYmUgZmFsc2Ugd2hlbiB1bmRlZmluZWQgKGluaXRpYWwgc3RhdGUpXG4gIH1cblxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU3ViamVjdC52YWx1ZSAhPT0gZmFsc2U7IC8vIFNob3VsZCBiZSB0cnVlIHdoZW4gdW5kZWZpbmVkIChpbml0aWFsIHN0YXRlKVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgVGFibGVEYXRhU291cmNlIGluc3RhbmNlLCB0aGF0IGNhbiBiZSB1c2VkIGFzIGRhdGFzb3VyY2Ugb2YgYEBhbmd1bGFyL2Nka2AgZGF0YS10YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGFTZXJ2aWNlIEEgc2VydmljZSB0byBsb2FkIGFuZCBzYXZlIGRhdGFcbiAgICogQHBhcmFtIGRhdGFUeXBlIFR5cGUgb2YgZGF0YSBjb250YWluZWQgYnkgdGhlIFRhYmxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuIGBkYXRhYCB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkLlxuICAgKiBAcGFyYW0gZW52aXJvbm1lbnRcbiAgICogQHBhcmFtIHZhbGlkYXRvclNlcnZpY2UgU2VydmljZSB0aGF0IGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhlIEZvcm1Hcm91cCB1c2VkIHRvIHZhbGlkYXRlIHJvdyBmaWVsZHMuXG4gICAqIEBwYXJhbSBjb25maWcgQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0YWJsZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGRhdGFUeXBlOiBuZXcoKSA9PiBULFxuICAgICAgICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZGF0YVNlcnZpY2U6IElFbnRpdGllc1NlcnZpY2U8VCwgRiwgTz4sXG4gICAgICAgICAgICAgIHZhbGlkYXRvclNlcnZpY2U/OiBWYWxpZGF0b3JTZXJ2aWNlLFxuICAgICAgICAgICAgICBjb25maWc/OiBBcHBUYWJsZURhdGFTb3VyY2VPcHRpb25zPFQsIElELCBPPikge1xuICAgIHN1cGVyKFtdLCBkYXRhVHlwZSwgdmFsaWRhdG9yU2VydmljZSwgY29uZmlnKTtcbiAgICB0aGlzLl9vcHRpb25zID0ge1xuICAgICAgZGF0YVNlcnZpY2VPcHRpb25zOiB7fSxcbiAgICAgIGRlYnVnOiBjb25maWcgJiYgY29uZmlnLnN1cHByZXNzRXJyb3JzID09PSBmYWxzZSxcbiAgICAgIGtlZXBPcmlnaW5hbERhdGFBZnRlckNvbmZpcm06IGZhbHNlLFxuICAgICAgLi4uY29uZmlnXG4gICAgfTtcbiAgICB0aGlzLl91c2VWYWxpZGF0b3IgPSBpc05vdE5pbCh2YWxpZGF0b3JTZXJ2aWNlKTtcblxuICAgIHRoaXMuX2xvZ1R5cGVOYW1lID0gcmVtb3ZlRW5kKChuZXcgZGF0YVR5cGUoKSkuX190eXBlbmFtZSB8fCAnVW5rbm93blZPJywgJ1ZPJyk7XG5cbiAgICAvLyBGb3IgREVWIE9OTFlcbiAgICB0aGlzLl9kZWJ1ZyA9IHRoaXMuX29wdGlvbnMuZGVidWcgPT09IHRydWU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdG9wV2F0Y2hpbmckLm5leHQoKTtcbiAgICB0aGlzLl9zdG9wV2F0Y2hpbmckLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fc3RvcFdhdGNoaW5nJC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubG9hZGluZ1N1YmplY3QuY29tcGxldGUoKTtcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB3YXRjaEFsbChvZmZzZXQ6IG51bWJlcixcbiAgICAgICAgICAgc2l6ZTogbnVtYmVyLFxuICAgICAgICAgICBzb3J0Qnk/OiBzdHJpbmcsXG4gICAgICAgICAgIHNvcnREaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9uLFxuICAgICAgICAgICBmaWx0ZXI/OiBQYXJ0aWFsPEY+KTogT2JzZXJ2YWJsZTxMb2FkUmVzdWx0PFQ+PiB7XG5cbiAgICB0aGlzLl9zdG9wV2F0Y2hpbmckLm5leHQoKTtcbiAgICB0aGlzLl9lZGl0aW5nUm93Q291bnQgPSAwO1xuICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gbnVsbDtcbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLndhdGNoQWxsKG9mZnNldCwgc2l6ZSwgc29ydEJ5LCBzb3J0RGlyZWN0aW9uLCBmaWx0ZXIsIHRoaXMuc2VydmljZU9wdGlvbnMgYXMgTylcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBTdG9wIHRoaXMgcGlwZSBuZXh0IHRpbWUgd2UgY2FsbCB3YXRjaEFsbCgpXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9zdG9wV2F0Y2hpbmckKSxcbiAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsICdFUlJPUi5MT0FEX0RBVEFfRVJST1InKSksXG4gICAgICAgIG1hcCgocmVzOiBMb2FkUmVzdWx0PFQ+KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX3NhdmluZykge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKGBbdGFibGUtZGF0YXNvdXJjZV0gUmVjZWl2ZWQgJHt0aGlzLl9sb2dUeXBlTmFtZX0gZGF0YSAoZnJvbSBzZXJ2aWNlKSwgYnV0IHN0aWxsIHNhdmluZzogc2tpcGApO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZWRpdGluZ1Jvd0NvdW50ID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbdGFibGUtZGF0YXNvdXJjZV0gUmVjZWl2ZWQgJHt0aGlzLl9sb2dUeXBlTmFtZX0gZGF0YSwgd2hpbGUgJHt0aGlzLl9lZGl0aW5nUm93Q291bnR9IHJvd3Mgc3RpbGwgZWRpdGluZzogc2tpcDsgUGxlYXNlIGNoZWNrIHNhdmUoKSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgdGFibGUhYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGF0YXNvdXJjZSgocmVzLmRhdGEgfHwgW10pIGFzIFRbXSk7XG4gICAgICAgICAgICB0aGlzLl9mZXRjaE1vcmVGbiA9IHJlcy5mZXRjaE1vcmU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodG9Cb29sZWFuKHRoaXMuc2VydmljZU9wdGlvbnMucmVhZE9ubHksIGZhbHNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignW3RhYmxlLWRhdGFzb3VyY2VdIEVuYWJsZSB0byBzYXZlLCBiZWNhdXNlIHNlcnZpY2VPcHRpb25zLnJlYWRPbmx5PXRydWUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gU2F2aW5nIHR3aWNlIChzaG91bGQgbmV2ZXIgb2NjdXIpXG4gICAgaWYgKHRoaXMuX3NhdmluZykge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFibGUtZGF0YXNvdXJjZV0gVHJ5aW5nIHRvIHNhdmUgJHt0aGlzLl9sb2dUeXBlTmFtZX0gcm93cyB0d2ljZS4gU2tpcGApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuX3NhdmluZyA9IHRydWU7XG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICBjb25zdCBvbmx5RGlydHlSb3dzID0gdG9Cb29sZWFuKHRoaXMuc2VydmljZU9wdGlvbnMuc2F2ZU9ubHlEaXJ0eVJvd3MsIGZhbHNlKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZS1kYXRhc291cmNlXSBTYXZpbmcgJHt0aGlzLl9sb2dUeXBlTmFtZX0gcm93cy4uLiB7b25seURpcnR5OiAke29ubHlEaXJ0eVJvd3N9fWApO1xuXG4gICAgICAvLyBHZXQgYWxsIHJvd3NcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmdldFJvd3MoKTtcblxuICAgICAgLy8gRmluaXNoIGVkaXRpbmcgYWxsIHJvd3NcbiAgICAgIGNvbnN0IGludmFsaWRSb3dzID0gcm93cy5maWx0ZXIocm93ID0+IHJvdy5lZGl0aW5nICYmICFyb3cuY29uZmlybUVkaXRDcmVhdGUoKSk7XG5cbiAgICAgIC8vIENhbm5vdCBmaW5pc2ggc29tZSByb3dzOiBlcnJvclxuICAgICAgaWYgKGludmFsaWRSb3dzLmxlbmd0aCkge1xuICAgICAgICAvLyBsb2cgZXJyb3JzXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgaW52YWxpZFJvd3MuZm9yRWFjaChyb3cgPT4gQXBwVGFibGVVdGlscy5sb2dSb3dFcnJvcnMocm93LCBgW3RhYmxlLWRhdGFzb3VyY2VdICR7dGhpcy5fbG9nVHlwZU5hbWV9IHJvdyAjJHtyb3cuaWR9YCkpO1xuICAgICAgICAvLyBTdG9wIHdpdGggYW4gZXJyb3JcbiAgICAgICAgdGhyb3cge2NvZGU6IEVycm9yQ29kZXMuVEFCTEVfSU5WQUxJRF9ST1dfRVJST1IsIG1lc3NhZ2U6ICdFUlJPUi5UQUJMRV9JTlZBTElEX1JPV19FUlJPUid9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9lZGl0aW5nUm93Q291bnQgPSAwO1xuXG4gICAgICBsZXQgZGF0YTogVFtdO1xuICAgICAgbGV0IGRhdGFUb1NhdmU6IFRbXTtcblxuICAgICAgaWYgKHRoaXMuX3VzZVZhbGlkYXRvcikge1xuICAgICAgICBkYXRhVG9TYXZlID0gW107XG4gICAgICAgIGRhdGEgPSByb3dzLm1hcChyb3cgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRhID0gbmV3IHRoaXMuZGF0YUNvbnN0cnVjdG9yKCkgYXMgVDtcbiAgICAgICAgICBjdXJyZW50RGF0YS5mcm9tT2JqZWN0KHJvdy5jdXJyZW50RGF0YSk7XG4gICAgICAgICAgLy8gRmlsdGVyIHRvIGtlZXAgb25seSBkaXJ0eSByb3dcbiAgICAgICAgICBpZiAob25seURpcnR5Um93cyAmJiByb3cudmFsaWRhdG9yLmRpcnR5KSBkYXRhVG9TYXZlLnB1c2goY3VycmVudERhdGEpO1xuICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0YTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghb25seURpcnR5Um93cykgZGF0YVRvU2F2ZSA9IGRhdGE7XG4gICAgICB9XG4gICAgICAvLyBPciB1c2UgdGhlIGN1cnJlbnQgZGF0YSB3aXRob3V0IGNvbnZlcnNpb24gKHdoZW4gbm8gdmFsaWRhdG9yIHNlcnZpY2UgdXNlZClcbiAgICAgIGVsc2Uge1xuICAgICAgICBkYXRhID0gcm93cy5tYXAocm93ID0+IHJvdy5jdXJyZW50RGF0YSk7XG4gICAgICAgIC8vIHNhdmUgYWxsIGRhdGEsIGFzIHdlIGRvbid0IGhhdmUgYW55IGRpcnR5IG1hcmtlclxuICAgICAgICBkYXRhVG9TYXZlID0gZGF0YTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gZGF0YSB0byBzYXZlOiBleGl0XG4gICAgICBpZiAob25seURpcnR5Um93cyAmJiAhZGF0YVRvU2F2ZS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbdGFibGUtZGF0YXNvdXJjZV0gTm8gJHt0aGlzLl9sb2dUeXBlTmFtZX0gZGF0YSB0byBzYXZlLiBTa2lwYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbdGFibGUtZGF0YXNvdXJjZV0gQXNraW5nIHNlcnZpY2UgdG8gc2F2ZSB0aGlzICR7dGhpcy5fbG9nVHlwZU5hbWV9IGRhdGE6YCwgZGF0YVRvU2F2ZSk7XG4gICAgICBhd2FpdCB0aGlzLmRhdGFTZXJ2aWNlLnNhdmVBbGwoZGF0YVRvU2F2ZSwgdGhpcy5zZXJ2aWNlT3B0aW9ucyk7XG5cbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3RhYmxlLWRhdGFzb3VyY2VdIFNhdmluZyAke3RoaXMuX2xvZ1R5cGVOYW1lfSBkYXRhIFtPS11gKTtcblxuICAgICAgLy8gTFAgMjMvMDMvMjAyMTogdXBkYXRlIGRhdGFzb3VyY2UgaXMgbmVjZXNzYXJ5IGJ1dCBjYW4gYmUgY2hhbmdlZCB0byBhIHJlZmV0Y2goKSBvbiBRdWVyeVJlZiAobXVzdCBiZSBjcmVhdGVkIGFuZCByZWdpc3RlcmVkIGluIEdyYXBocWxTZXJ2aWNlLndhdGNoUXVlcnkpXG4gICAgICB0aGlzLnVwZGF0ZURhdGFzb3VyY2UoZGF0YSwge2VtaXRFdmVudDogZmFsc2V9KTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5lcnJvcignW3RhYmxlLWRhdGFzb3VyY2VdIEVycm9yIHdoaWxlIHNhdmluZzogJyArIGVycm9yICYmIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3NhdmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVEYXRhc291cmNlKGRhdGE6IFRbXSwgb3B0cz86IHsgZW1pdEV2ZW50OiBib29sZWFuIH0pIHtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZS1kYXRhc291cmNlXSBVcGRhdGluZyBkYXRhc291cmNlIHdpdGggZGF0YTpgLCBkYXRhKTtcblxuICAgIHN1cGVyLnVwZGF0ZURhdGFzb3VyY2UoZGF0YSwgb3B0cyk7XG5cbiAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE92ZXJ3cml0ZSBkZWZhdWx0IHNpZ25hdHVyZVxuICBjcmVhdGVOZXcoaW5zZXJ0QXQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmFzeW5jQ3JlYXRlTmV3KGluc2VydEF0KTtcbiAgfVxuXG4gIGNvbm5lY3QoY29sbGVjdGlvblZpZXdlcjogQ29sbGVjdGlvblZpZXdlcik6IE9ic2VydmFibGU8VGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4+IHtcbiAgICAvLyBERUJVRyBjb25zb2xlLmRlYnVnKFwiW2VudGl0aWVzLWRhdGFzb3VyY2VdIGNvbm5lY3RcIik7XG4gICAgcmV0dXJuIHN1cGVyLmNvbm5lY3QoY29sbGVjdGlvblZpZXdlcik7XG4gIH1cblxuICBkaXNjb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXI/OiBDb2xsZWN0aW9uVmlld2VyKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdChjb2xsZWN0aW9uVmlld2VyKTtcbiAgICB0aGlzLl9zdG9wV2F0Y2hpbmckLm5leHQoKTtcbiAgfVxuXG4gIHdhaXRJZGxlKGRlYm91bmNlVGltZU1zPzogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gZmlyc3RGYWxzZVByb21pc2UodGhpcy5sb2FkaW5nU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKGRlYm91bmNlVGltZU1zIHx8IDEwMCkgLy8gaWYgbm90IHN0YXJ0ZWQgeWV0LCB3YWl0XG4gICAgICApKTtcbiAgfVxuXG4gIGNvbmZpcm1DcmVhdGUocm93OiBUYWJsZUVsZW1lbnQ8VD4pIHtcbiAgICBpZiAoIXN1cGVyLmNvbmZpcm1DcmVhdGUocm93KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyb3cuZWRpdGluZyAmJiByb3cudmFsaWRhdG9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t0YWJsZS1kYXRhc291cmNlXSBSb3cgc3RpbGwgaGFzIHtlZGl0aW5nOiB0cnVlfSBhZnRlciBjb25maXJtQ3JlYXRlKCkhIEZvcmNlIGVkaXRpbmcgdG8gZmFsc2UnKTtcbiAgICAgIHJvdy52YWxpZGF0b3IuZGlzYWJsZSh7b25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25maXJtRWRpdChyb3c6IFRhYmxlRWxlbWVudDxUPik6IGJvb2xlYW4ge1xuICAgIGlmICghc3VwZXIuY29uZmlybUVkaXQocm93KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyb3cuZWRpdGluZyAmJiByb3cudmFsaWRhdG9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t0YWJsZS1kYXRhc291cmNlXSBSb3cgc3RpbGwgaGFzIHtlZGl0aW5nOiB0cnVlfSBhZnRlciBjb25maXJtQ3JlYXRlKCkhIEZvcmNlIGVkaXRpbmcgdG8gZmFsc2UnKTtcbiAgICAgIHJvdy52YWxpZGF0b3IuZGlzYWJsZSh7b25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdGFydEVkaXQocm93OiBUYWJsZUVsZW1lbnQ8VD4pIHtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1t0YWJsZS1kYXRhc291cmNlXSBTdGFydCB0byBlZGl0IHJvdycsIHJvdyk7XG4gICAgcm93LnN0YXJ0RWRpdCgpO1xuICAgIHRoaXMuX2VkaXRpbmdSb3dDb3VudCsrO1xuICB9XG5cbiAgY2FuY2VsT3JEZWxldGUocm93OiBUYWJsZUVsZW1lbnQ8VD4pIHtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1t0YWJsZS1kYXRhc291cmNlXSBDYW5jZWxsaW5nIG9yIGRlbGV0aW5nIHJvdycsIHJvdyk7XG4gICAgcm93LmNhbmNlbE9yRGVsZXRlKCk7XG4gICAgdGhpcy5fZWRpdGluZ1Jvd0NvdW50LS07XG4gIH1cblxuICBoYW5kbGVFcnJvcihlcnJvcjogYW55LCBtZXNzYWdlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBlcnJvck1zZyA9IGVycm9yICYmIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3I7XG4gICAgY29uc29sZS5lcnJvcihgW3RhYmxlLWRhdGFzb3VyY2VdIFNlcnZpY2UgJHt0aGlzLl9sb2dUeXBlTmFtZX0gc2VudCBlcnJvcjogJHtlcnJvck1zZ31gLCBlcnJvcik7XG4gICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSB8fCBlcnJvck1zZyk7XG4gIH1cblxuICBoYW5kbGVFcnJvclByb21pc2UoZXJyb3I6IGFueSkge1xuICAgIGNvbnN0IGVycm9yTXNnID0gZXJyb3IgJiYgZXJyb3IubWVzc2FnZSB8fCBlcnJvcjtcbiAgICBjb25zb2xlLmVycm9yKGBbdGFibGUtZGF0YXNvdXJjZV0gU2VydmljZSAke3RoaXMuX2xvZ1R5cGVOYW1lfSBzZW50IGVycm9yOiAke2Vycm9yTXNnfWAsIGVycm9yKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgZGVsZXRlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBJZiBuZXcgcm93OiBub3QgbmVlZCB0byBwcm9wYWdhdGUgdG8gdGhlIGRhdGFTZXJ2aWNlXG4gICAgaWYgKGlkID09PSAtMSkge1xuICAgICAgcmV0dXJuIHN1cGVyLmRlbGV0ZShpZCk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93ID0gdGhpcy5nZXRSb3coaWQpO1xuICAgIGlmICghcm93KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbdGFibGUtZGF0YXNvdXJjZV0gUm93IHRvIGRlbGV0ZSB3aXRoIGlkPSR7aWR9IG5vdCBmb3VuZGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcblxuICAgIHRoaXMuZGF0YVNlcnZpY2UuZGVsZXRlQWxsKFtyb3cuY3VycmVudERhdGFdLCB0aGlzLnNlcnZpY2VPcHRpb25zKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yUHJvbWlzZShlcnIpKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgcm93IGhhcyBiZWVuIGRlbGV0ZWQgKGJlY2F1c2UgR3JhcFFIbCBjYWNoZSByZW1vdmUgY2FuIGZhaWxlZClcbiAgICAgICAgICBjb25zdCBwcmVzZW50ID0gdGhpcy5nZXRSb3coaWQpID09PSByb3c7XG4gICAgICAgICAgaWYgKHByZXNlbnQpIHN1cGVyLmRlbGV0ZShpZCk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgfSwgMzAwKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZUFsbChyb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSk6IFByb21pc2U8YW55PiB7XG5cbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIGNvbnN0IGRhdGEgPSByb3dzLm1hcChyID0+IHIuY3VycmVudERhdGEpO1xuICAgIGNvbnN0IHJvd3NCeUlkID0gcm93cy5yZWR1Y2UoKHJlcywgcm93KSA9PiB7XG4gICAgICByZXNbcm93LmlkXSA9IHJvdztcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSwge30pO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHNlbGZEZWxldGUgPSBzdXBlci5kZWxldGU7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5kZWxldGVBbGwoZGF0YSwgdGhpcy5zZXJ2aWNlT3B0aW9ucylcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvclByb21pc2UoZXJyKSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gV29ya2Fyb3VuZCwgdG8gYmUgc3VyZSBhbGwgcm93cyBoYXMgYmVlbiBkZWxldGVkXG4gICAgICAgIC8vIFNvbWV0aW1lcywgdGhlIHNlcnZpY2UgbWlzcyBkZWxldGlvbiwgb3IgR3JhcFFIbCBjYWNoZSByZW1vdmUgZmFpbGVkXG4gICAgICAgIGNvbnN0IHJvd05vdERlbGV0ZWQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyb3dzQnlJZCkucmVkdWNlKChyZXMsIGlkKSA9PiB7XG4gICAgICAgICAgY29uc3Qgcm93ID0gcm93c0J5SWRbaWRdO1xuICAgICAgICAgIGNvbnN0IHByZXNlbnQgPSBzZWxmLmdldFJvdygraWQpID09PSByb3c7XG4gICAgICAgICAgcmV0dXJuIHByZXNlbnQgPyByZXMuY29uY2F0KHJvdykgOiByZXM7XG4gICAgICAgIH0sIFtdKS5zb3J0KChhLCBiKSA9PiBhLmlkID4gYi5pZCA/IC0xIDogMSk7XG4gICAgICAgIC8vIEFwcGx5IG1pc3NpbmcgZGVsZXRpb25cbiAgICAgICAgaWYgKGlzTm90RW1wdHlBcnJheShyb3dOb3REZWxldGVkKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3RhYmxlLWRhdGFzb3VyY2VdIEZvcmNlIGRlbGV0aW9uIG9mICR7cm93Tm90RGVsZXRlZC5sZW5ndGh9IHJvd3MgKElzIHNlcnZpY2UgYXBwbHlpbmcgZGVsZXRpb24gdG8gb2JzZXJ2YWJsZSA/KWApO1xuICAgICAgICAgIHJvd05vdERlbGV0ZWQuZm9yRWFjaChyID0+IHNlbGZEZWxldGUuY2FsbChzZWxmLCByLmlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFJvd3MoKTogUHJvbWlzZTxUYWJsZUVsZW1lbnQ8VD5bXT4ge1xuICAgIHJldHVybiBmaXJzdE5vdE5pbFByb21pc2UodGhpcy5jb25uZWN0KG51bGwpKSBhcyBQcm9taXNlPFRhYmxlRWxlbWVudDxUPltdPjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhc3luY0NyZWF0ZU5ldyhpbnNlcnRBdD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9jcmVhdGluZykgcmV0dXJuOyAvLyBBdm9pZCBtdWx0aXBsZSBjYWxsIChzaG91bGQgbmV2ZXIgb2NjdXIpXG5cbiAgICB0aGlzLl9jcmVhdGluZyA9IHRydWU7XG5cbiAgICBzdXBlci5jcmVhdGVOZXcoaW5zZXJ0QXQpO1xuICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0Um93KC0xKTtcblxuICAgIGlmIChyb3cgJiYgdGhpcy5fb3B0aW9ucyAmJiB0aGlzLl9vcHRpb25zLm9uUm93Q3JlYXRlZCkge1xuICAgICAgY29uc3QgcmVzID0gdGhpcy5fb3B0aW9ucy5vblJvd0NyZWF0ZWQocm93KTtcbiAgICAgIC8vIElmIGFzeW5jIGZ1bmN0aW9uLCB3YWl0IHRoZSBlbmQgYmVmb3JlIGVuZGluZ1xuICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikgIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9lZGl0aW5nUm93Q291bnQrKztcbiAgICB0aGlzLl9jcmVhdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgZ2V0RGF0YSgpOiBQcm9taXNlPFRbXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmdldFJvd3MoKTtcbiAgICByZXR1cm4gdGhpcy5nZXREYXRhRnJvbVJvd3Mocm93cyk7XG4gIH1cblxuICBhc3luYyBmZXRjaE1vcmUob3B0cz86IHsgZW1pdEV2ZW50OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuX2ZldGNoTW9yZUZuKSByZXR1cm4gZmFsc2U7IC8vIEF2b2lkIG11bHRpcGxlIGNhbGxcbiAgICBpZiAodGhpcy5fZWRpdGluZ1Jvd0NvdW50ID4gMCkge1xuICAgICAgY29uc29sZS53YXJuKCdDYW5ub3QgZmV0Y2ggbW9yZSBiZWNhdXNlIHN0aWxsIGVkaXRpbmcgcm93Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmV0Y2ggbmV4dCBwYWdlXG4gICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSBudWxsOyAvLyBBdm9pZCBtdWx0aXBsZSBjYWxsXG4gICAgY29uc3QgcmVzOiBMb2FkUmVzdWx0PFQ+ID0gYXdhaXQgdGhpcy5fZmV0Y2hNb3JlRm4oKTtcblxuICAgIC8vIFNraXAgaWYgZW1wdHkgKG5vIG1vcmUgZGF0YSlcbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHJlcz8uZGF0YSkpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgZGF0YSBzb3VyY2VcbiAgICBjb25zdCBleGlzdGluZ0RhdGEgPSBhd2FpdCB0aGlzLmdldERhdGEoKTtcbiAgICBzdXBlci51cGRhdGVEYXRhc291cmNlKGV4aXN0aW5nRGF0YS5jb25jYXQoLi4ucmVzLmRhdGEpLCBvcHRzKTtcblxuICAgIC8vIFJlbWVtYmVyIGZldGNoTW9yZVxuICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gcmVzLmZldGNoTW9yZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2QgLS0gKi9cblxuICBtYXJrQXNMb2FkaW5nKCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya0FzTG9hZGVkKCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
422
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS9lbnRpdGllcy10YWJsZS1kYXRhc291cmNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFpQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxlQUFlLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzFELE9BQU8sRUFBUyxXQUFXLEVBQVUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFLeEMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3BGLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxlQUFlLENBQUM7QUF3QjVDLFdBQVc7QUFFWCxrRUFBa0U7QUFDbEUsTUFBTSxPQUFPLHVCQVFYLFNBQVEsZUFBd0I7SUE2QmhDOzs7Ozs7O09BT0c7SUFDSCxZQUFZLFFBQW9CLEVBQ0osV0FBdUMsRUFDdkQsZ0JBQW9CLEVBQ3BCLE1BQVU7UUFDcEIsS0FBSyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLGtCQUNsQyxrQkFBa0IsRUFBRSxFQUFFLEVBQ3RCLEtBQUssRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDLGNBQWMsS0FBSyxLQUFLLEVBQ2hELDRCQUE0QixFQUFFLEtB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Q2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQztZQUNsQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FBQTtJQUVELDRCQUE0QjtJQUU1QixhQUFhO1FBQ1gsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQzs7O1lBamFGLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1RhYmxlRGF0YVNvdXJjZSwgVGFibGVFbGVtZW50LCBWYWxpZGF0b3JTZXJ2aWNlfSBmcm9tICdAZS1pcy9uZ3gtbWF0ZXJpYWwtdGFibGUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtFbnRpdHksIEVudGl0eVV0aWxzLCBJRW50aXR5fSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHtFcnJvckNvZGVzfSBmcm9tICcuLi9zZXJ2aWNlcy9lcnJvcnMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIG1hcCwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0RpcmVjdGl2ZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NvcnREaXJlY3Rpb259IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHtDb2xsZWN0aW9uVmlld2VyfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtUYWJsZURhdGFTb3VyY2VPcHRpb25zfSBmcm9tICdAZS1pcy9uZ3gtbWF0ZXJpYWwtdGFibGUvc3JjL2FwcC9uZ3gtbWF0ZXJpYWwtdGFibGUvdGFibGUtZGF0YS1zb3VyY2UnO1xuaW1wb3J0IHtFbnRpdGllc1NlcnZpY2VXYXRjaE9wdGlvbnMsIEZldGNoTW9yZUZuLCBJRW50aXRpZXNTZXJ2aWNlLCBMb2FkUmVzdWx0fSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtmaXJzdEZhbHNlUHJvbWlzZX0gZnJvbSAnLi4vLi4vc2hhcmVkL29ic2VydmFibGVzJztcbmltcG9ydCB7aXNOb3RFbXB0eUFycmF5LCByZW1vdmVFbmQsIHNsZWVwLCB0b0Jvb2xlYW59IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtBcHBUYWJsZVV0aWxzfSBmcm9tICcuL3RhYmxlLnV0aWxzJztcbmltcG9ydCB7Rm9ybUdyb3VwfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEFwcFRhYmxlRGF0YVNlcnZpY2VPcHRpb25zPE8gZXh0ZW5kcyBFbnRpdGllc1NlcnZpY2VXYXRjaE9wdGlvbnMgPSBFbnRpdGllc1NlcnZpY2VXYXRjaE9wdGlvbnM+IGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBzYXZlT25seURpcnR5Um93cz86IGJvb2xlYW47XG4gIHJlYWRPbmx5PzogYm9vbGVhbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQXBwVGFibGVEYXRhU291cmNlT3B0aW9uczxcbiAgVCBleHRlbmRzIEVudGl0eTxULCBJRD4sXG4gIElEID0gbnVtYmVyLFxuICBXTyBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyA9IEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucz4gZXh0ZW5kcyBUYWJsZURhdGFTb3VyY2VPcHRpb25zIHtcblxuICBkYXRhU2VydmljZU9wdGlvbnM/OiBBcHBUYWJsZURhdGFTZXJ2aWNlT3B0aW9uczxXTz47XG4gIGRlYnVnPzogYm9vbGVhbjtcblxuICAvLyBSb3cgcHJvY2Vzc1xuICBvblJvd0NyZWF0ZWQ/OiAocm93OiBUYWJsZUVsZW1lbnQ8VD4pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICBvblJvd1ZhbGlkYXRvcj86ICh2YWxpZGF0b3I6IEZvcm1Hcm91cCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vLyBAZHluYW1pY1xuQERpcmVjdGl2ZSgpXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZTxcbiAgVCBleHRlbmRzIElFbnRpdHk8VCwgSUQ+LFxuICBGID0gYW55LFxuICBJRCA9IG51bWJlcixcbiAgViBleHRlbmRzIFZhbGlkYXRvclNlcnZpY2UgPSBWYWxpZGF0b3JTZXJ2aWNlLFxuICBXTyBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyA9IEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyxcbiAgTyBleHRlbmRzIEFwcFRhYmxlRGF0YVNvdXJjZU9wdGlvbnM8VCwgSUQsIFdPPiA9IEFwcFRhYmxlRGF0YVNvdXJjZU9wdGlvbnM8VCwgSUQsIFdPPlxuICA+XG4gIGV4dGVuZHMgVGFibGVEYXRhU291cmNlPFQsIFYsIE8+IHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9sb2dUeXBlTmFtZTogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBfZGVidWc6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBfY3JlYXRpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zYXZpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zdG9wV2F0Y2hpbmckID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICBwcm90ZWN0ZWQgX2VkaXRpbmdSb3dDb3VudCA9IDA7XG4gIHByb3RlY3RlZCBfZmV0Y2hNb3JlRm46IEZldGNoTW9yZUZuPExvYWRSZXN1bHQ8VD4+ID0gbnVsbDtcblxuICBsb2FkaW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odW5kZWZpbmVkKTtcblxuICBnZXQgc2VydmljZU9wdGlvbnMoKTogQXBwVGFibGVEYXRhU2VydmljZU9wdGlvbnM8V08+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YVNlcnZpY2VPcHRpb25zO1xuICB9XG5cbiAgc2V0IHNlcnZpY2VPcHRpb25zKHZhbHVlOiBBcHBUYWJsZURhdGFTZXJ2aWNlT3B0aW9uczxXTz4pICB7XG4gICAgdGhpcy5jb25maWcuZGF0YVNlcnZpY2VPcHRpb25zID0gdmFsdWU7XG4gIH1cblxuICBnZXQgbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlID09PSBmYWxzZTsgLy8gU2hvdWxkIGJlIGZhbHNlIHdoZW4gdW5kZWZpbmVkIChpbml0aWFsIHN0YXRlKVxuICB9XG5cbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1N1YmplY3QudmFsdWUgIT09IGZhbHNlOyAvLyBTaG91bGQgYmUgdHJ1ZSB3aGVuIHVuZGVmaW5lZCAoaW5pdGlhbCBzdGF0ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFRhYmxlRGF0YVNvdXJjZSBpbnN0YW5jZSwgdGhhdCBjYW4gYmUgdXNlZCBhcyBkYXRhc291cmNlIG9mIGBAYW5ndWxhci9jZGtgIGRhdGEtdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhU2VydmljZSBBIHNlcnZpY2UgdG8gbG9hZCBhbmQgc2F2ZSBkYXRhXG4gICAqIEBwYXJhbSBkYXRhVHlwZSBUeXBlIG9mIGRhdGEgY29udGFpbmVkIGJ5IHRoZSBUYWJsZS4gSWYgbm90IHNwZWNpZmllZCwgdGhlbiBgZGF0YWAgd2l0aCBhdCBsZWFzdCBvbmUgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIHZhbGlkYXRvclNlcnZpY2UgU2VydmljZSB0aGF0IGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhlIEZvcm1Hcm91cCB1c2VkIHRvIHZhbGlkYXRlIHJvdyBmaWVsZHMuXG4gICAqIEBwYXJhbSBjb25maWcgQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0YWJsZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGRhdGFUeXBlOiBuZXcoKSA9PiBULFxuICAgICAgICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZGF0YVNlcnZpY2U6IElFbnRpdGllc1NlcnZpY2U8VCwgRiwgV08+LFxuICAgICAgICAgICAgICB2YWxpZGF0b3JTZXJ2aWNlPzogVixcbiAgICAgICAgICAgICAgY29uZmlnPzogTykge1xuICAgIHN1cGVyKFtdLCBkYXRhVHlwZSwgdmFsaWRhdG9yU2VydmljZSwge1xuICAgICAgZGF0YVNlcnZpY2VPcHRpb25zOiB7fSxcbiAgICAgIGRlYnVnOiBjb25maWcgJiYgY29uZmlnLnN1cHByZXNzRXJyb3JzID09PSBmYWxzZSxcbiAgICAgIGtlZXBPcmlnaW5hbERhdGFBZnRlckNvbmZpcm06IGZhbHNlLFxuICAgICAgLi4uY29uZmlnXG4gICAgfSk7XG5cbiAgICB0aGlzLl9sb2dUeXBlTmFtZSA9IHJlbW92ZUVuZCgobmV3IGRhdGFUeXBlKCkpLl9fdHlwZW5hbWUgfHwgJ1Vua25vd25WTycsICdWTycpO1xuXG4gICAgLy8gRm9yIERFViBPTkxZXG4gICAgdGhpcy5fZGVidWcgPSB0aGlzLmNvbmZpZy5kZWJ1ZyA9PT0gdHJ1ZTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoY29sbGVjdGlvblZpZXdlcj86IENvbGxlY3Rpb25WaWV3ZXIpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXIpO1xuICAgIHRoaXMuX3N0b3BXYXRjaGluZyQubmV4dCgpO1xuICAgIHRoaXMuX3N0b3BXYXRjaGluZyQuY29tcGxldGUoKTtcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0LmNvbXBsZXRlKCk7XG4gIH1cblxuICB3YXRjaEFsbChvZmZzZXQ6IG51bWJlcixcbiAgICAgICAgICAgc2l6ZTogbnVtYmVyLFxuICAgICAgICAgICBzb3J0Qnk/OiBzdHJpbmcsXG4gICAgICAgICAgIHNvcnREaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9uLFxuICAgICAgICAgICBmaWx0ZXI/OiBQYXJ0aWFsPEY+KTogT2JzZXJ2YWJsZTxMb2FkUmVzdWx0PFQ+PiB7XG5cbiAgICB0aGlzLl9zdG9wV2F0Y2hpbmckLm5leHQoKTtcbiAgICB0aGlzLl9lZGl0aW5nUm93Q291bnQgPSAwO1xuICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gbnVsbDtcbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLndhdGNoQWxsKG9mZnNldCwgc2l6ZSwgc29ydEJ5LCBzb3J0RGlyZWN0aW9uLCBmaWx0ZXIsIHRoaXMuc2VydmljZU9wdGlvbnMgYXMgV08pXG4gICAgICAucGlwZShcbiAgICAgICAgLy8gU3RvcCB0aGlzIHBpcGUgbmV4dCB0aW1lIHdlIGNhbGwgd2F0Y2hBbGwoKVxuICAgICAgICB0YWtlVW50aWwodGhpcy5fc3RvcFdhdGNoaW5nJCksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCAnRVJST1IuTE9BRF9EQVRBX0VSUk9SJykpLFxuICAgICAgICBtYXAoKHJlczogTG9hZFJlc3VsdDxUPikgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9zYXZpbmcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgW3RhYmxlLWRhdGFzb3VyY2VdIFJlY2VpdmVkICR7dGhpcy5fbG9nVHlwZU5hbWV9IGRhdGEgKGZyb20gc2VydmljZSksIGJ1dCBzdGlsbCBzYXZpbmc6IHNraXBgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2VkaXRpbmdSb3dDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW3RhYmxlLWRhdGFzb3VyY2VdIFJlY2VpdmVkICR7dGhpcy5fbG9nVHlwZU5hbWV9IGRhdGEsIHdoaWxlICR7dGhpcy5fZWRpdGluZ1Jvd0NvdW50fSByb3dzIHN0aWxsIGVkaXRpbmc6IHNraXA7IFBsZWFzZSBjaGVjayBzYXZlKCkgaW1wbGVtZW50YXRpb24gaW4gdGhlIHRhYmxlIWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURhdGFzb3VyY2UoKHJlcy5kYXRhIHx8IFtdKSBhcyBUW10pO1xuICAgICAgICAgICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSByZXMuZmV0Y2hNb3JlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRvQm9vbGVhbih0aGlzLnNlcnZpY2VPcHRpb25zLnJlYWRPbmx5LCBmYWxzZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1t0YWJsZS1kYXRhc291cmNlXSBFbmFibGUgdG8gc2F2ZSwgYmVjYXVzZSBzZXJ2aWNlT3B0aW9ucy5yZWFkT25seT10cnVlJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFNhdmluZyB0d2ljZSAoc2hvdWxkIG5ldmVyIG9jY3VyKVxuICAgIGlmICh0aGlzLl9zYXZpbmcpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW3RhYmxlLWRhdGFzb3VyY2VdIFRyeWluZyB0byBzYXZlICR7dGhpcy5fbG9nVHlwZU5hbWV9IHJvd3MgdHdpY2UuIFNraXBgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9zYXZpbmcgPSB0cnVlO1xuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuXG4gICAgY29uc3Qgb25seURpcnR5Um93cyA9IHRvQm9vbGVhbih0aGlzLnNlcnZpY2VPcHRpb25zLnNhdmVPbmx5RGlydHlSb3dzLCBmYWxzZSk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbdGFibGUtZGF0YXNvdXJjZV0gU2F2aW5nICR7dGhpcy5fbG9nVHlwZU5hbWV9IHJvd3MuLi4ge29ubHlEaXJ0eTogJHtvbmx5RGlydHlSb3dzfX1gKTtcblxuICAgICAgLy8gR2V0IGFsbCByb3dzXG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRSb3dzKCk7XG5cbiAgICAgIC8vIEZpbmlzaCBlZGl0aW5nIGFsbCByb3dzXG4gICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1Sb3dzKHJvd3MpO1xuXG4gICAgICAvLyBDYW5ub3QgZmluaXNoIHNvbWUgcm93czogZXJyb3JcbiAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgIC8vIGxvZyBlcnJvcnNcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnKSB0aGlzLmdldEVkaXRpbmdSb3dzKHJvd3MpLmZvckVhY2gocm93ID0+IEFwcFRhYmxlVXRpbHMubG9nUm93RXJyb3JzKHJvdywgYFt0YWJsZS1kYXRhc291cmNlXSAke3RoaXMuX2xvZ1R5cGVOYW1lfSByb3cgIyR7cm93LmlkfWApKTtcbiAgICAgICAgLy8gU3RvcCB3aXRoIGFuIGVycm9yXG4gICAgICAgIHRocm93IHtjb2RlOiBFcnJvckNvZGVzLlRBQkxFX0lOVkFMSURfUk9XX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuVEFCTEVfSU5WQUxJRF9ST1dfRVJST1InfTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZWRpdGluZ1Jvd0NvdW50ID0gMDtcblxuICAgICAgbGV0IGRhdGE6IFRbXTtcbiAgICAgIGxldCBkYXRhVG9TYXZlOiBUW107XG5cbiAgICAgIGlmICghIXRoaXMudmFsaWRhdG9yU2VydmljZSkge1xuICAgICAgICBkYXRhVG9TYXZlID0gW107XG4gICAgICAgIGRhdGEgPSByb3dzLm1hcChyb3cgPT4ge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMudG9FbnRpdHkocm93LmN1cnJlbnREYXRhKTtcbiAgICAgICAgICAvLyBGaWx0ZXIgdG8ga2VlcCBvbmx5IGRpcnR5IHJvd1xuICAgICAgICAgIGlmIChvbmx5RGlydHlSb3dzICYmIHJvdy52YWxpZGF0b3IuZGlydHkpIGRhdGFUb1NhdmUucHVzaChlbnRpdHkpO1xuICAgICAgICAgIHJldHVybiBlbnRpdHk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIW9ubHlEaXJ0eVJvd3MpIGRhdGFUb1NhdmUgPSBkYXRhO1xuICAgICAgfVxuICAgICAgLy8gT3IgdXNlIHRoZSBjdXJyZW50IGRhdGEgd2l0aG91dCBjb252ZXJzaW9uICh3aGVuIG5vIHZhbGlkYXRvciBzZXJ2aWNlIHVzZWQpXG4gICAgICBlbHNlIHtcbiAgICAgICAgZGF0YSA9IHJvd3MubWFwKHJvdyA9PiByb3cuY3VycmVudERhdGEpO1xuICAgICAgICAvLyBzYXZlIGFsbCBkYXRhLCBhcyB3ZSBkb24ndCBoYXZlIGFueSBkaXJ0eSBtYXJrZXJcbiAgICAgICAgZGF0YVRvU2F2ZSA9IGRhdGE7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGRhdGEgdG8gc2F2ZTogZXhpdFxuICAgICAgaWYgKG9ubHlEaXJ0eVJvd3MgJiYgIWRhdGFUb1NhdmUubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3RhYmxlLWRhdGFzb3VyY2VdIE5vICR7dGhpcy5fbG9nVHlwZU5hbWV9IGRhdGEgdG8gc2F2ZS4gU2tpcGApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3RhYmxlLWRhdGFzb3VyY2VdIEFza2luZyBzZXJ2aWNlIHRvIHNhdmUgdGhpcyAke3RoaXMuX2xvZ1R5cGVOYW1lfSBkYXRhOmAsIGRhdGFUb1NhdmUpO1xuICAgICAgYXdhaXQgdGhpcy5kYXRhU2VydmljZS5zYXZlQWxsKGRhdGFUb1NhdmUsIHRoaXMuc2VydmljZU9wdGlvbnMpO1xuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZS1kYXRhc291cmNlXSBTYXZpbmcgJHt0aGlzLl9sb2dUeXBlTmFtZX0gZGF0YSBbT0tdYCk7XG5cbiAgICAgIC8vIExQIDIzLzAzLzIwMjE6IHVwZGF0ZSBkYXRhc291cmNlIGlzIG5lY2Vzc2FyeSBidXQgY2FuIGJlIGNoYW5nZWQgdG8gYSByZWZldGNoKCkgb24gUXVlcnlSZWYgKG11c3QgYmUgY3JlYXRlZCBhbmQgcmVnaXN0ZXJlZCBpbiBHcmFwaHFsU2VydmljZS53YXRjaFF1ZXJ5KVxuICAgICAgdGhpcy51cGRhdGVEYXRhc291cmNlKGRhdGEsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZXJyb3IoJ1t0YWJsZS1kYXRhc291cmNlXSBFcnJvciB3aGlsZSBzYXZpbmc6ICcgKyBlcnJvciAmJiBlcnJvci5tZXNzYWdlIHx8IGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9zYXZpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldERhdGFGcm9tUm93cyhyb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSwgb3B0aW9ucyA9IHsgb3JpZ2luYWxEYXRhOiBmYWxzZSwgdG9FbnRpdHk6IGZhbHNlIH0pOiBUW10ge1xuICAgIGlmIChvcHRpb25zLnRvRW50aXR5KSB7XG4gICAgICByZXR1cm4gc3VwZXIuZ2V0RGF0YUZyb21Sb3dzKHJvd3MsIG9wdGlvbnMpXG4gICAgICAgIC5tYXAoZGF0YSA9PiB0aGlzLnRvRW50aXR5KGRhdGEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLmdldERhdGFGcm9tUm93cyhyb3dzLCBvcHRpb25zKTtcbiAgfVxuXG4gIHRvRW50aXR5KGRhdGE6IFR8YW55KTogVCB7XG4gICAgaWYgKEVudGl0eVV0aWxzLmlzTm90RW50aXR5KGRhdGEpKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBuZXcgdGhpcy5kYXRhQ29uc3RydWN0b3IoKSBhcyBUO1xuICAgICAgZW50aXR5LmZyb21PYmplY3QoZGF0YSk7XG4gICAgICByZXR1cm4gZW50aXR5O1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZURhdGFzb3VyY2UoZGF0YTogVFtdLCBvcHRzID0ge2VtaXRFdmVudDogdHJ1ZX0pIHtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZS1kYXRhc291cmNlXSBVcGRhdGluZyBkYXRhc291cmNlIHdpdGggZGF0YTpgLCBkYXRhKTtcblxuICAgIGF3YWl0IHN1cGVyLnVwZGF0ZURhdGFzb3VyY2UoZGF0YSwgb3B0cyk7XG5cbiAgICBpZiAob3B0cy5lbWl0RXZlbnQpIHtcbiAgICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgfVxuICB9XG5cbiAgd2FpdElkbGUoZGVib3VuY2VUaW1lTXM/OiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBmaXJzdEZhbHNlUHJvbWlzZSh0aGlzLmxvYWRpbmdTdWJqZWN0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoZGVib3VuY2VUaW1lTXMgfHwgMTAwKSAvLyBpZiBub3Qgc3RhcnRlZCB5ZXQsIHdhaXRcbiAgICAgICkpO1xuICB9XG5cbiAgYXN5bmMgY29uZmlybUNyZWF0ZShyb3c6IFRhYmxlRWxlbWVudDxUPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IHN1cGVyLmNvbmZpcm1DcmVhdGUocm93KSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAocm93LmVkaXRpbmcgJiYgcm93LnZhbGlkYXRvcikge1xuICAgICAgY29uc29sZS53YXJuKCdbdGFibGUtZGF0YXNvdXJjZV0gUm93IHN0aWxsIGhhcyB7ZWRpdGluZzogdHJ1ZX0gYWZ0ZXIgY29uZmlybUNyZWF0ZSgpISBGb3JjZSBlZGl0aW5nIHRvIGZhbHNlJyk7XG4gICAgICByb3cudmFsaWRhdG9yLmRpc2FibGUoe29ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgY29uZmlybUVkaXQocm93OiBUYWJsZUVsZW1lbnQ8VD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCBzdXBlci5jb25maXJtRWRpdChyb3cpKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyb3cuZWRpdGluZyAmJiByb3cudmFsaWRhdG9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t0YWJsZS1kYXRhc291cmNlXSBSb3cgc3RpbGwgaGFzIHtlZGl0aW5nOiB0cnVlfSBhZnRlciBjb25maXJtQ3JlYXRlKCkhIEZvcmNlIGVkaXRpbmcgdG8gZmFsc2UnKTtcbiAgICAgIHJvdy52YWxpZGF0b3IuZGlzYWJsZSh7b25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBzdGFydEVkaXQocm93OiBUYWJsZUVsZW1lbnQ8VD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAocm93LmVkaXRpbmcpIHJldHVybjsgLy8gQWxyZWFkeSBlZGl0aW5nXG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbdGFibGUtZGF0YXNvdXJjZV0gU3RhcnQgdG8gZWRpdCByb3cnLCByb3cpO1xuICAgIGNvbnN0IGRvbmUgPSBhd2FpdCBzdXBlci5zdGFydEVkaXQocm93KTtcbiAgICBpZiAoZG9uZSkgdGhpcy5fZWRpdGluZ1Jvd0NvdW50Kys7XG4gICAgcmV0dXJuIGRvbmU7XG4gIH1cblxuICBhc3luYyBjYW5jZWwocm93OiBUYWJsZUVsZW1lbnQ8VD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1t0YWJsZS1kYXRhc291cmNlXSBDYW5jZWxsaW5nIHJvdycsIHJvdyk7XG4gICAgY29uc3QgZG9uZSA9IGF3YWl0IHN1cGVyLmNhbmNlbChyb3cpO1xuICAgIGlmIChkb25lKSB0aGlzLl9lZGl0aW5nUm93Q291bnQtLTtcbiAgICByZXR1cm4gZG9uZTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKGVycm9yOiBhbnksIG1lc3NhZ2U6IHN0cmluZyk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IGVycm9yTXNnID0gZXJyb3IgJiYgZXJyb3IubWVzc2FnZSB8fCBlcnJvcjtcbiAgICBjb25zb2xlLmVycm9yKGBbdGFibGUtZGF0YXNvdXJjZV0gU2VydmljZSAke3RoaXMuX2xvZ1R5cGVOYW1lfSBzZW50IGVycm9yOiAke2Vycm9yTXNnfWAsIGVycm9yKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlIHx8IGVycm9yTXNnKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yUHJvbWlzZShlcnJvcjogYW55KSB7XG4gICAgY29uc3QgZXJyb3JNc2cgPSBlcnJvciAmJiBlcnJvci5tZXNzYWdlIHx8IGVycm9yO1xuICAgIGNvbnNvbGUuZXJyb3IoYFt0YWJsZS1kYXRhc291cmNlXSBTZXJ2aWNlICR7dGhpcy5fbG9nVHlwZU5hbWV9IHNlbnQgZXJyb3I6ICR7ZXJyb3JNc2d9YCwgZXJyb3IpO1xuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBhc3luYyBkZWxldGUoaWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIElmIG5ldyByb3c6IG5vdCBuZWVkIHRvIHByb3BhZ2F0ZSB0byB0aGUgZGF0YVNlcnZpY2VcbiAgICBpZiAoaWQgPT09IC0xKSB7XG4gICAgICByZXR1cm4gc3VwZXIuZGVsZXRlKGlkKTtcbiAgICB9XG5cbiAgICBjb25zdCByb3cgPSB0aGlzLmdldFJvdyhpZCk7XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFt0YWJsZS1kYXRhc291cmNlXSBSb3cgdG8gZGVsZXRlIHdpdGggaWQ9JHtpZH0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5kYXRhU2VydmljZS5kZWxldGVBbGwoW3Jvdy5jdXJyZW50RGF0YV0sIHRoaXMuc2VydmljZU9wdGlvbnMpO1xuXG4gICAgICAvLyBNYWtlIHN1cmUgcm93IGhhcyBiZWVuIGRlbGV0ZWQgKGJlY2F1c2UgR3JhcFFIbCBjYWNoZSByZW1vdmUgY2FuIGZhaWxlZClcbiAgICAgIGF3YWl0IHNsZWVwKDMwMCk7XG4gICAgICBjb25zdCBwcmVzZW50ID0gdGhpcy5nZXRSb3coaWQpID09PSByb3c7XG4gICAgICBpZiAocHJlc2VudCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1t0YWJsZS1kYXRhc291cmNlXSBGb3JjZSBkZWxldGlvbiBvZiAxIHJvdyAoSXMgc2VydmljZSBhcHBseWluZyBkZWxldGlvbiB0byBvYnNlcnZhYmxlID8pJyk7XG4gICAgICAgIGF3YWl0IHN1cGVyLmRlbGV0ZShpZCk7XG4gICAgICB9XG5cbiAgICB9IGNhdGNoKGVycikge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvclByb21pc2UoZXJyKTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbChyb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSk6IFByb21pc2U8YW55PiB7XG5cbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGFGcm9tUm93cyhyb3dzKTtcblxuICAgIGNvbnN0IHJvd3NCeUlkID0gcm93cy5yZWR1Y2UoKHJlcywgcm93KSA9PiB7XG4gICAgICByZXNbcm93LmlkXSA9IHJvdztcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSwge30pO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNlcnZpY2UuZGVsZXRlQWxsKGRhdGEsIHRoaXMuc2VydmljZU9wdGlvbnMpO1xuXG4gICAgICAvLyBXb3JrYXJvdW5kLCB0byBiZSBzdXJlIGFsbCByb3dzIGhhcyBiZWVuIGRlbGV0ZWRcbiAgICAgIC8vIFNvbWV0aW1lcywgdGhlIHNlcnZpY2UgbWlzcyBkZWxldGlvbiwgb3IgR3JhcFFIbCBjYWNoZSByZW1vdmUgZmFpbGVkXG4gICAgICBjb25zdCByb3dOb3REZWxldGVkID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocm93c0J5SWQpLnJlZHVjZSgocmVzLCBpZCkgPT4ge1xuICAgICAgICBjb25zdCByb3cgPSByb3dzQnlJZFtpZF07XG4gICAgICAgIGNvbnN0IHByZXNlbnQgPSBzZWxmLmdldFJvdygraWQpID09PSByb3c7XG4gICAgICAgIHJldHVybiBwcmVzZW50ID8gcmVzLmNvbmNhdChyb3cpIDogcmVzO1xuICAgICAgfSwgW10pLnNvcnQoKGEsIGIpID0+IGEuaWQgPiBiLmlkID8gLTEgOiAxKTtcblxuICAgICAgLy8gQXBwbHkgbWlzc2luZyBkZWxldGlvblxuICAgICAgaWYgKGlzTm90RW1wdHlBcnJheShyb3dOb3REZWxldGVkKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFt0YWJsZS1kYXRhc291cmNlXSBGb3JjZSBkZWxldGlvbiBvZiAke3Jvd05vdERlbGV0ZWQubGVuZ3RofSByb3dzIChJcyBzZXJ2aWNlIGFwcGx5aW5nIGRlbGV0aW9uIHRvIG9ic2VydmFibGUgPylgKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocm93Tm90RGVsZXRlZC5tYXAociA9PiBzdXBlci5kZWxldGUoci5pZCkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZXJyKSB7XG4gICAgIHRoaXMuaGFuZGxlRXJyb3JQcm9taXNlKGVycik7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICB9XG4gIH1cblxuICBnZXRSb3dzKCk6IFByb21pc2U8VGFibGVFbGVtZW50PFQ+W10+IHtcbiAgICByZXR1cm4gdGhpcy5yb3dzU3ViamVjdC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU5ldyhpbnNlcnRBdD86IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLl9jcmVhdGluZykgcmV0dXJuOyAvLyBBdm9pZCBtdWx0aXBsZSBjYWxsIChzaG91bGQgbmV2ZXIgb2NjdXIpXG5cbiAgICB0aGlzLl9jcmVhdGluZyA9IHRydWU7XG5cbiAgICBjb25zdCBkb25lID0gYXdhaXQgc3VwZXIuY3JlYXRlTmV3KGluc2VydEF0KTtcblxuICAgIGlmIChkb25lICYmIHRoaXMuY29uZmlnLm9uUm93Q3JlYXRlZCkge1xuICAgICAgY29uc3Qgcm93ID0gdGhpcy5nZXRSb3coLTEpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25maWcub25Sb3dDcmVhdGVkKHJvdyk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyKSAge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIsIGVycik7XG4gICAgICAgIC8vIENvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRvbmUpIHRoaXMuX2VkaXRpbmdSb3dDb3VudCsrO1xuICAgIHRoaXMuX2NyZWF0aW5nID0gZmFsc2U7XG4gICAgcmV0dXJuIGRvbmU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlUm93VmFsaWRhdG9yKCk6IFByb21pc2U8Rm9ybUdyb3VwPiB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gYXdhaXQgc3VwZXIuY3JlYXRlUm93VmFsaWRhdG9yKCk7XG4gICAgaWYgKHZhbGlkYXRvciAmJiB0aGlzLmNvbmZpZy5vblJvd1ZhbGlkYXRvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25maWcub25Sb3dWYWxpZGF0b3IodmFsaWRhdG9yKTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnIpICB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVyciwgZXJyKTtcbiAgICAgICAgLy8gQ29udGludWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcbiAgfVxuXG4gIGFzeW5jIGdldERhdGEoKTogUHJvbWlzZTxUW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRSb3dzKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGF0YUZyb21Sb3dzKHJvd3MpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hNb3JlKG9wdHM/OiB7IGVtaXRFdmVudDogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLl9mZXRjaE1vcmVGbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9lZGl0aW5nUm93Q291bnQgPiAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0Nhbm5vdCBmZXRjaCBtb3JlIGJlY2F1c2Ugc3RpbGwgZWRpdGluZyByb3cnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb3JnZXQgdGhlIGZldGNoTW9yZSBmdW5jdGlvbiwgdG8gYXZvaWQgbXVsdGlwbGUgY2FsbFxuICAgIGNvbnN0IGZldGNoTW9yZUZuID0gdGhpcy5fZmV0Y2hNb3JlRm47XG4gICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSBudWxsO1xuXG4gICAgLy8gRmV0Y2ggbmV4dCBwYWdlXG4gICAgY29uc3QgcmVzOiBMb2FkUmVzdWx0PFQ+ID0gYXdhaXQgZmV0Y2hNb3JlRm4oKTtcblxuICAgIC8vIFNraXAgaWYgZW1wdHkgKG5vIG1vcmUgZGF0YSlcbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHJlcz8uZGF0YSkpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgZGF0YSBzb3VyY2VcbiAgICAvLyBUT0RPIHJldmlldyB0aGlzLCB0byBrZWVwIGV4aXN0aW5nIHJvd3MsIGluc3RlYWQgb2YgY3JlYXRpbmcgbmV3IFRhYmxlRWxlbWVudCArIHZhbGlkYXRvciAhXG4gICAgY29uc3QgZXhpc3RpbmdEYXRhID0gYXdhaXQgdGhpcy5nZXREYXRhKCk7XG4gICAgYXdhaXQgc3VwZXIudXBkYXRlRGF0YXNvdXJjZShleGlzdGluZ0RhdGEuY29uY2F0KC4uLnJlcy5kYXRhKSwgb3B0cyk7XG5cbiAgICAvLyBTdG9yZSBuZXh0IGZldGNoTW9yZSBmdW5jdGlvblxuICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gcmVzLmZldGNoTW9yZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2QgLS0gKi9cblxuICBtYXJrQXNMb2FkaW5nKCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya0FzTG9hZGVkKCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==