angular-odata 0.124.0 → 0.126.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +2 -2
  2. package/esm2022/lib/api.mjs +3 -2
  3. package/esm2022/lib/cache/storage.mjs +3 -3
  4. package/esm2022/lib/client.mjs +3 -3
  5. package/esm2022/lib/constants.mjs +2 -1
  6. package/esm2022/lib/helper.mjs +2 -2
  7. package/esm2022/lib/models/collection.mjs +147 -193
  8. package/esm2022/lib/models/model.mjs +141 -119
  9. package/esm2022/lib/models/options.mjs +115 -88
  10. package/esm2022/lib/resources/path/segments.mjs +13 -7
  11. package/esm2022/lib/resources/query/expressions/base.mjs +8 -3
  12. package/esm2022/lib/resources/query/expressions/compute.mjs +19 -4
  13. package/esm2022/lib/resources/query/expressions/count.mjs +24 -7
  14. package/esm2022/lib/resources/query/expressions/expand.mjs +30 -8
  15. package/esm2022/lib/resources/query/expressions/filter.mjs +29 -12
  16. package/esm2022/lib/resources/query/expressions/orderby.mjs +31 -8
  17. package/esm2022/lib/resources/query/expressions/search.mjs +30 -11
  18. package/esm2022/lib/resources/query/expressions/select.mjs +16 -4
  19. package/esm2022/lib/resources/query/expressions/syntax.mjs +185 -31
  20. package/esm2022/lib/resources/query/handlers.mjs +2 -2
  21. package/esm2022/lib/resources/query/index.mjs +2 -1
  22. package/esm2022/lib/resources/query/options.mjs +22 -12
  23. package/esm2022/lib/resources/request.mjs +4 -3
  24. package/esm2022/lib/resources/resource.mjs +39 -15
  25. package/esm2022/lib/resources/responses/annotations.mjs +1 -1
  26. package/esm2022/lib/resources/responses/response.mjs +3 -3
  27. package/esm2022/lib/resources/types/batch.mjs +2 -2
  28. package/esm2022/lib/resources/types/count.mjs +7 -4
  29. package/esm2022/lib/resources/types/entity-set.mjs +2 -1
  30. package/esm2022/lib/resources/types/entity.mjs +5 -5
  31. package/esm2022/lib/resources/types/function.mjs +1 -9
  32. package/esm2022/lib/resources/types/navigation-property.mjs +3 -2
  33. package/esm2022/lib/resources/types/options.mjs +1 -1
  34. package/esm2022/lib/resources/types/property.mjs +11 -3
  35. package/esm2022/lib/schema/parsers/structured-type.mjs +5 -4
  36. package/esm2022/lib/schema/structured-type.mjs +13 -2
  37. package/esm2022/lib/utils/enums.mjs +1 -1
  38. package/fesm2022/angular-odata.mjs +3873 -3536
  39. package/fesm2022/angular-odata.mjs.map +1 -1
  40. package/lib/api.d.ts +2 -2
  41. package/lib/client.d.ts +1 -1
  42. package/lib/constants.d.ts +1 -0
  43. package/lib/helper.d.ts +10 -10
  44. package/lib/models/collection.d.ts +18 -20
  45. package/lib/models/model.d.ts +14 -13
  46. package/lib/models/options.d.ts +38 -13
  47. package/lib/resources/path/segments.d.ts +8 -11
  48. package/lib/resources/query/expressions/base.d.ts +6 -3
  49. package/lib/resources/query/expressions/compute.d.ts +13 -2
  50. package/lib/resources/query/expressions/count.d.ts +15 -4
  51. package/lib/resources/query/expressions/expand.d.ts +15 -4
  52. package/lib/resources/query/expressions/filter.d.ts +15 -4
  53. package/lib/resources/query/expressions/orderby.d.ts +16 -4
  54. package/lib/resources/query/expressions/search.d.ts +14 -5
  55. package/lib/resources/query/expressions/select.d.ts +11 -2
  56. package/lib/resources/query/expressions/syntax.d.ts +65 -16
  57. package/lib/resources/query/handlers.d.ts +1 -1
  58. package/lib/resources/query/index.d.ts +1 -0
  59. package/lib/resources/query/options.d.ts +4 -3
  60. package/lib/resources/request.d.ts +3 -2
  61. package/lib/resources/resource.d.ts +10 -5
  62. package/lib/resources/responses/annotations.d.ts +9 -9
  63. package/lib/resources/responses/response.d.ts +2 -2
  64. package/lib/resources/types/count.d.ts +5 -1
  65. package/lib/resources/types/function.d.ts +0 -3
  66. package/lib/resources/types/options.d.ts +2 -1
  67. package/lib/resources/types/property.d.ts +2 -0
  68. package/lib/schema/parsers/structured-type.d.ts +1 -0
  69. package/lib/schema/structured-type.d.ts +2 -1
  70. package/lib/utils/enums.d.ts +7 -7
  71. package/package.json +1 -1
@@ -1,11 +1,10 @@
1
- import { EventEmitter } from '@angular/core';
2
1
  import { forkJoin, Observable, of, throwError } from 'rxjs';
3
2
  import { finalize, map, switchMap } from 'rxjs/operators';
4
3
  import { DEFAULT_VERSION } from '../constants';
5
4
  import { ODataHelper } from '../helper';
6
- import { ODataEntitiesAnnotations, ODataEntityAnnotations, ODataEntitySetResource, ODataNavigationPropertyResource, ODataPropertyResource, } from '../resources';
5
+ import { ODataEntitiesAnnotations, ODataEntityAnnotations, ODataEntityResource, ODataEntitySetResource, ODataNavigationPropertyResource, ODataPropertyResource, } from '../resources';
7
6
  import { Types } from '../utils/types';
8
- import { BUBBLING, INCLUDE_DEEP, INCLUDE_SHALLOW, ODataModelEvent, ODataModelEventType, ODataModelOptions, ODataModelState, } from './options';
7
+ import { INCLUDE_DEEP, INCLUDE_SHALLOW, ODataModelEventEmitter, ODataModelEventType, ODataModelOptions, ODataModelState, } from './options';
9
8
  export class ODataCollection {
10
9
  static { this.model = null; }
11
10
  models() {
@@ -21,23 +20,24 @@ export class ODataCollection {
21
20
  this._resource = null;
22
21
  this._resources = [];
23
22
  this._entries = [];
24
- //Events
25
- this.events$ = new EventEmitter();
26
23
  this._sortBy = null;
27
24
  const Klass = this.constructor;
28
- if (model === undefined && Klass.model !== null)
25
+ if (!model && Klass.model !== null)
29
26
  model = Klass.model;
30
- if (model === undefined)
27
+ if (!model)
31
28
  throw new Error('Collection: Collection need model');
32
29
  this._model = model;
30
+ // Events
31
+ this.events$ = new ODataModelEventEmitter({ collection: this });
32
+ this.events$.subscribe((e) => model.meta.events$.emit(e));
33
33
  // Parent
34
34
  if (parent !== undefined) {
35
35
  this._parent = parent;
36
36
  }
37
37
  // Resource
38
- if (this._parent === null && resource === undefined)
38
+ if (this._parent === null && !resource)
39
39
  resource = this._model.meta.collectionResourceFactory();
40
- if (resource !== undefined) {
40
+ if (resource) {
41
41
  this.attach(resource);
42
42
  }
43
43
  // Annotations
@@ -85,11 +85,10 @@ export class ODataCollection {
85
85
  const current = this._resource;
86
86
  if (current === null || !current.isEqualTo(resource)) {
87
87
  this._resource = resource;
88
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Attach, {
89
- collection: this,
88
+ this.events$.trigger(ODataModelEventType.Attach, {
90
89
  previous: current,
91
90
  value: resource,
92
- }));
91
+ });
93
92
  }
94
93
  }
95
94
  withResource(resource, ctx) {
@@ -108,10 +107,7 @@ export class ODataCollection {
108
107
  }
109
108
  asEntitySet(ctx) {
110
109
  // Build new resource
111
- const query = this._resource?.cloneQuery();
112
- let resource = this._model.meta.collectionResourceFactory(query);
113
- if (resource === undefined)
114
- throw new Error('asEntitySet: Collection does not have associated EntitySet endpoint');
110
+ const resource = this._model.meta.collectionResourceFactory(this._resource?.cloneQuery());
115
111
  return this.withResource(resource, ctx);
116
112
  }
117
113
  annots() {
@@ -122,7 +118,7 @@ export class ODataCollection {
122
118
  const annots = new ODataEntityAnnotations(this._annotations.helper);
123
119
  annots.update(data);
124
120
  if (annots?.type !== undefined && Model.meta !== null) {
125
- let schema = Model.meta.findChildOptions((o) => o.isTypeOf(annots.type))?.schema;
121
+ const schema = Model.meta.findChildOptions((o) => o.isTypeOf(annots.type))?.schema;
126
122
  if (schema !== undefined && schema.model !== undefined)
127
123
  // Change to child model
128
124
  Model = schema.model;
@@ -133,7 +129,7 @@ export class ODataCollection {
133
129
  parent: [this, null],
134
130
  });
135
131
  }
136
- toEntities({ client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
132
+ toEntities({ client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_id = false, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
137
133
  return this._entries
138
134
  .filter(({ model, state }) => state !== ODataModelState.Removed && chain.every((c) => c !== model))
139
135
  .map(({ model, state }) => {
@@ -144,6 +140,7 @@ export class ODataCollection {
144
140
  include_concurrency,
145
141
  include_computed,
146
142
  include_key,
143
+ include_id,
147
144
  include_non_field,
148
145
  field_mapping,
149
146
  changes_only: changesOnly,
@@ -151,7 +148,7 @@ export class ODataCollection {
151
148
  });
152
149
  });
153
150
  }
154
- toJSON() {
151
+ toJson() {
155
152
  return this.toEntities();
156
153
  }
157
154
  hasChanged({ include_navigation } = {}) {
@@ -159,30 +156,22 @@ export class ODataCollection {
159
156
  this.models().some((m) => m.hasChanged({ include_navigation })));
160
157
  }
161
158
  clone() {
162
- let Ctor = this.constructor;
159
+ const Ctor = this.constructor;
163
160
  return new Ctor(this.toEntities(INCLUDE_SHALLOW), {
164
161
  resource: this.resource(),
165
162
  annots: this.annots(),
166
163
  });
167
164
  }
168
- _request(obs$, { remove } = {}) {
169
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Request, {
170
- collection: this,
165
+ _request(obs$, mapCallback) {
166
+ this.events$.trigger(ODataModelEventType.Request, {
171
167
  options: { observable: obs$ },
172
- }));
173
- return obs$.pipe(map(({ entities, annots }) => {
174
- this._annotations = annots;
175
- const models = (entities || []).map((entity) => this.modelFactory(entity, { reset: true }));
176
- this.assign(models, { reset: true, remove });
177
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Sync, {
178
- collection: this,
179
- options: { models, entities, annots },
180
- }));
181
- return models;
182
- }));
168
+ });
169
+ return obs$.pipe(map((response) => mapCallback(response)), finalize(() => this.events$.trigger(ODataModelEventType.Sync)));
183
170
  }
184
171
  fetch({ withCount, remove, ...options } = {}) {
185
172
  const resource = this.resource();
173
+ if (!resource)
174
+ return throwError(() => new Error('fetchMany: Resource is null'));
186
175
  const obs$ = resource instanceof ODataEntitySetResource
187
176
  ? resource.fetch({ withCount, ...options })
188
177
  : resource.fetch({
@@ -190,18 +179,37 @@ export class ODataCollection {
190
179
  withCount,
191
180
  ...options,
192
181
  });
193
- return this._request(obs$, { remove });
182
+ return this._request(obs$, ({ entities, annots }) => {
183
+ this._annotations = annots;
184
+ const models = (entities || []).map((entity) => this.modelFactory(entity, { reset: true }));
185
+ this.assign(models, { reset: true, remove: remove ?? true });
186
+ return models;
187
+ });
194
188
  }
195
189
  fetchAll({ withCount, remove, ...options } = {}) {
196
190
  const resource = this.resource();
191
+ if (!resource)
192
+ return throwError(() => new Error('fetchMany: Resource is null'));
197
193
  const obs$ = resource.fetchAll({ withCount, ...options });
198
- return this._request(obs$, { remove });
194
+ return this._request(obs$, ({ entities, annots }) => {
195
+ this._annotations = annots;
196
+ const models = (entities || []).map((entity) => this.modelFactory(entity, { reset: true }));
197
+ this.assign(models, { reset: true, remove: remove ?? true });
198
+ return models;
199
+ });
199
200
  }
200
201
  fetchMany(top, { withCount, remove, ...options } = {}) {
201
202
  const resource = this.resource();
203
+ if (!resource)
204
+ return throwError(() => new Error('fetchMany: Resource is null'));
202
205
  resource.query((q) => remove || this.length == 0 ? q.skip().clear() : q.skip(this.length));
203
206
  const obs$ = resource.fetchMany(top, { withCount, ...options });
204
- return this._request(obs$, { remove: remove ?? false });
207
+ return this._request(obs$, ({ entities, annots }) => {
208
+ this._annotations = annots;
209
+ const models = (entities || []).map((entity) => this.modelFactory(entity, { reset: true }));
210
+ this.assign(models, { reset: true, remove: remove ?? false });
211
+ return models;
212
+ });
205
213
  }
206
214
  fetchOne({ withCount, remove, ...options } = {}) {
207
215
  return this.fetchMany(1, { withCount, remove, ...options }).pipe(map((models) => models[0]));
@@ -216,14 +224,14 @@ export class ODataCollection {
216
224
  const resource = this.resource();
217
225
  if (resource instanceof ODataPropertyResource)
218
226
  return throwError(() => new Error('save: Resource is ODataPropertyResource'));
219
- let toDestroyEntity = [];
220
- let toRemoveReference = [];
221
- let toDestroyContained = [];
222
- let toCreateEntity = [];
223
- let toAddReference = [];
224
- let toCreateContained = [];
225
- let toUpdateEntity = [];
226
- let toUpdateContained = [];
227
+ const toDestroyEntity = [];
228
+ const toRemoveReference = [];
229
+ const toDestroyContained = [];
230
+ const toCreateEntity = [];
231
+ const toAddReference = [];
232
+ const toCreateContained = [];
233
+ const toUpdateEntity = [];
234
+ const toUpdateContained = [];
227
235
  this._entries.forEach(({ model, state }) => {
228
236
  if (state === ODataModelState.Removed) {
229
237
  if (relModel) {
@@ -269,17 +277,12 @@ export class ODataCollection {
269
277
  ...toUpdateEntity.map((m) => m.asEntity((e) => e.save({ method, ...options }))),
270
278
  ...toUpdateContained.map((m) => m.save({ method, ...options })),
271
279
  ]);
272
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Request, {
273
- collection: this,
274
- options: { observable: obs$ },
275
- }));
276
- return obs$.pipe(map(() => {
280
+ return this._request(obs$, () => {
277
281
  this._entries = this._entries
278
282
  .filter((entry) => entry.state !== ODataModelState.Removed)
279
283
  .map((entry) => ({ ...entry, state: ODataModelState.Unchanged }));
280
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Sync, { collection: this }));
281
284
  return this;
282
- }));
285
+ });
283
286
  }
284
287
  return of(this);
285
288
  }
@@ -288,12 +291,12 @@ export class ODataCollection {
288
291
  if (!model.isNew() && resource instanceof ODataNavigationPropertyResource) {
289
292
  return resource
290
293
  .reference()
291
- .add(model._meta.entityResource(model), options)
294
+ .add(model.asEntity((e) => e.resource()), options)
292
295
  .pipe(map(() => model));
293
296
  }
294
297
  return of(model);
295
298
  }
296
- _addModel(model, { silent = false, reset = false, reparent = false, merge = false, position = -1, } = {}) {
299
+ _addModel(model, { silent = false, reset = false, reparent = false, merge = false, position, } = {}) {
297
300
  const key = model.key();
298
301
  let entry = this._findEntry({
299
302
  model,
@@ -321,58 +324,36 @@ export class ODataCollection {
321
324
  model._parent = [this, null];
322
325
  // Subscribe
323
326
  this._link(entry);
327
+ // If position is undefined and the collection is sorted, find the right position
328
+ if (position === undefined && this._sortBy !== null) {
329
+ for (let index = 0; index < this._entries.length; index++) {
330
+ if (this._compare(model, this._entries[index], this._sortBy, 0) < 0) {
331
+ position = index;
332
+ break;
333
+ }
334
+ }
335
+ }
324
336
  // Now add
325
- if (position >= 0)
337
+ if (position !== undefined)
326
338
  this._entries.splice(position, 0, entry);
327
339
  else
328
340
  this._entries.push(entry);
329
341
  if (!silent) {
330
- model.events$.emit(new ODataModelEvent(ODataModelEventType.Add, {
331
- model,
332
- collection: this,
333
- }));
342
+ model.events$.trigger(ODataModelEventType.Add, { collection: this });
334
343
  }
335
344
  return entry.model;
336
345
  }
337
- addModel(model, { silent = false, reset = false, reparent = false, merge = false, position = -1, } = {}) {
338
- if (position < 0)
339
- position = this._bisect(model);
340
- const added = this._addModel(model, {
341
- silent,
342
- reset,
343
- merge,
344
- position,
345
- reparent,
346
- });
347
- if (!silent && added !== undefined) {
348
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
349
- collection: this,
350
- options: { added: [added], removed: [], merged: [] },
351
- }));
352
- }
353
- return added;
354
- }
355
- add(model, { silent = false, reparent = false, server = true, merge = false, position = -1, } = {}) {
356
- if (server) {
357
- return this.addReference(model).pipe(map((model) => {
358
- return this.addModel(model, {
359
- silent,
360
- position,
361
- reparent,
362
- merge,
363
- reset: true,
364
- });
365
- }));
366
- }
367
- else {
368
- return of(this.addModel(model, { silent, position, merge, reparent }));
369
- }
346
+ add(model, { silent = false, reparent = false, server = true, merge = false, position, reset, } = {}) {
347
+ const _addModel = (m, reset) => this._addModel(m, { silent, position, merge, reparent, reset });
348
+ return server
349
+ ? this._request(this.addReference(model), (model) => _addModel(model, reset ?? true))
350
+ : of(_addModel(model, reset ?? false));
370
351
  }
371
352
  removeReference(model, options) {
372
353
  let resource = this.resource();
373
354
  if (!model.isNew() && resource instanceof ODataNavigationPropertyResource) {
374
- let target = this._model.meta.api.options.deleteRefBy === 'id'
375
- ? model._meta.entityResource(model)
355
+ const target = this._model.meta.api.options.deleteRefBy === 'id'
356
+ ? model.asEntity((e) => e.resource())
376
357
  : undefined;
377
358
  if (this._model.meta.api.options.deleteRefBy === 'path') {
378
359
  resource = resource.key(model.key());
@@ -386,7 +367,7 @@ export class ODataCollection {
386
367
  }
387
368
  _removeModel(model, { silent = false, reset = false, } = {}) {
388
369
  const key = model.key();
389
- let entry = this._findEntry({
370
+ const entry = this._findEntry({
390
371
  model,
391
372
  key,
392
373
  cid: model[this._model.meta.cid],
@@ -394,12 +375,6 @@ export class ODataCollection {
394
375
  if (entry === undefined || entry.state === ODataModelState.Removed) {
395
376
  return model;
396
377
  }
397
- // Emit Event
398
- if (!silent)
399
- model.events$.emit(new ODataModelEvent(ODataModelEventType.Remove, {
400
- model,
401
- collection: this,
402
- }));
403
378
  // Now remove
404
379
  const index = this._entries.indexOf(entry);
405
380
  this._entries.splice(index, 1);
@@ -408,30 +383,30 @@ export class ODataCollection {
408
383
  entry.state = ODataModelState.Removed;
409
384
  this._entries.push(entry);
410
385
  }
386
+ // Trigger Event
387
+ if (!silent)
388
+ model.events$.trigger(ODataModelEventType.Remove, { collection: this });
411
389
  this._unlink(entry);
412
390
  return entry.model;
413
391
  }
414
392
  removeModel(model, { silent = false, reset = false, } = {}) {
415
393
  const removed = this._removeModel(model, { silent, reset });
416
394
  if (!silent && removed !== undefined) {
417
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
418
- collection: this,
395
+ this.events$.trigger(ODataModelEventType.Update, {
419
396
  options: { added: [], removed: [removed], merged: [] },
420
- }));
397
+ });
421
398
  }
422
399
  return removed;
423
400
  }
424
- remove(model, { silent = false, server = true, } = {}) {
425
- if (server) {
426
- return this.removeReference(model).pipe(map((model) => this.removeModel(model, { silent, reset: true })));
427
- }
428
- else {
429
- return of(this.removeModel(model, { silent }));
430
- }
401
+ remove(model, { silent = false, server = true, reset, } = {}) {
402
+ const _removeModel = (m, reset) => this._removeModel(m, { silent, reset });
403
+ return server
404
+ ? this._request(this.removeReference(model), (model) => _removeModel(model, reset ?? true))
405
+ : of(_removeModel(model, reset ?? false));
431
406
  }
432
407
  _moveModel(model, position) {
433
408
  const key = model.key();
434
- let entry = this._findEntry({
409
+ const entry = this._findEntry({
435
410
  model,
436
411
  key,
437
412
  cid: model[this._model.meta.cid],
@@ -458,10 +433,10 @@ export class ODataCollection {
458
433
  return model.set(pathArray.slice(1), value, {});
459
434
  }
460
435
  if (pathArray.length === 1 && ODataModelOptions.isModel(value)) {
461
- let toAdd = [];
462
- let toChange = [];
463
- let toRemove = [];
464
- let index = Number(pathArray[0]);
436
+ const toAdd = [];
437
+ const toChange = [];
438
+ const toRemove = [];
439
+ const index = Number(pathArray[0]);
465
440
  const model = this.models()[index];
466
441
  const entry = this._findEntry({ model });
467
442
  if (entry !== undefined) {
@@ -476,10 +451,9 @@ export class ODataCollection {
476
451
  this._addModel(value, { reparent: true });
477
452
  toAdd.push(model);
478
453
  }
479
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
480
- collection: this,
454
+ this.events$.trigger(ODataModelEventType.Update, {
481
455
  options: { added: toAdd, removed: toRemove, changed: toChange },
482
- }));
456
+ });
483
457
  return value;
484
458
  }
485
459
  }
@@ -541,37 +515,35 @@ export class ODataCollection {
541
515
  });
542
516
  if (!silent &&
543
517
  (toAdd.length > 0 || toRemove.length > 0 || toChange.length > 0)) {
544
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Reset, {
545
- collection: this,
518
+ this.events$.trigger(ODataModelEventType.Reset, {
546
519
  options: {
547
520
  added: toAdd.map((e) => e.model),
548
521
  removed: toRemove.map((e) => e.model),
549
522
  changed: toChange.map((e) => e.model),
550
523
  },
551
- }));
524
+ });
552
525
  }
553
526
  }
554
527
  clear({ silent = false } = {}) {
555
- let toRemove = this.models();
528
+ const toRemove = this.models();
556
529
  toRemove.forEach((m) => {
557
530
  this._removeModel(m, { silent });
558
531
  });
559
532
  this._entries = [];
560
533
  if (!silent) {
561
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
562
- collection: this,
534
+ this.events$.trigger(ODataModelEventType.Update, {
563
535
  options: { removed: toRemove },
564
- }));
536
+ });
565
537
  }
566
538
  }
567
539
  assign(objects, { remove = true, reset = false, reparent = false, silent = false, } = {}) {
568
540
  const Model = this._model;
569
541
  const offset = remove ? 0 : this.length;
570
- let toAdd = [];
571
- let toChange = [];
572
- let toRemove = [];
573
- let toSort = [];
574
- let modelMap = [];
542
+ const toAdd = [];
543
+ const toChange = [];
544
+ const toRemove = [];
545
+ const toSort = [];
546
+ const modelMap = [];
575
547
  objects.forEach((obj, index) => {
576
548
  const isModel = ODataModelOptions.isModel(obj);
577
549
  const position = index + offset;
@@ -623,7 +595,7 @@ export class ODataCollection {
623
595
  }
624
596
  modelMap.push(model[Model.meta.cid]);
625
597
  });
626
- if (remove || reset) {
598
+ if (remove) {
627
599
  this._entries.forEach((entry, position) => {
628
600
  if (modelMap.indexOf(entry.model[Model.meta.cid]) === -1)
629
601
  toRemove.push([entry.model, position]);
@@ -646,57 +618,55 @@ export class ODataCollection {
646
618
  toSort.length > 0)) ||
647
619
  reset) {
648
620
  this._sortBy = null;
649
- this.events$.emit(new ODataModelEvent(reset ? ODataModelEventType.Reset : ODataModelEventType.Update, {
650
- collection: this,
621
+ this.events$.trigger(reset ? ODataModelEventType.Reset : ODataModelEventType.Update, {
651
622
  options: {
652
623
  added: toAdd,
653
624
  removed: toRemove,
654
625
  changed: toChange,
655
626
  sorted: toSort,
656
627
  },
657
- }));
628
+ });
658
629
  }
659
630
  }
660
631
  query(ctx) {
661
632
  const resource = this.resource();
662
- resource.query(ctx);
663
- this.attach(resource);
633
+ if (resource) {
634
+ resource.query(ctx);
635
+ this.attach(resource);
636
+ }
664
637
  return this;
665
638
  }
666
- callFunction(name, params, responseType, { ...options } = {}) {
639
+ callFunction(name, params, responseType, options = {}) {
667
640
  const resource = this.resource();
668
- if (resource instanceof ODataEntitySetResource) {
669
- const func = resource.function(name);
670
- func.query((q) => q.apply(options));
671
- switch (responseType) {
672
- case 'property':
673
- return func.callProperty(params, options);
674
- case 'model':
675
- return func.callModel(params, options);
676
- case 'collection':
677
- return func.callCollection(params, options);
678
- default:
679
- return func.call(params, { responseType, ...options });
680
- }
641
+ if (!(resource instanceof ODataEntityResource))
642
+ return throwError(() => new Error("callFunction: Can't call function without ODataEntitySetResource"));
643
+ const func = resource.function(name).query((q) => q.apply(options));
644
+ switch (responseType) {
645
+ case 'property':
646
+ return this._request(func.callProperty(params, options), (resp) => resp);
647
+ case 'model':
648
+ return this._request(func.callModel(params, options), (resp) => resp);
649
+ case 'collection':
650
+ return this._request(func.callCollection(params, options), (resp) => resp);
651
+ default:
652
+ return this._request(func.call(params, { responseType, ...options }), (resp) => resp);
681
653
  }
682
- return throwError(() => new Error(`callFunction: Can't function without ODataEntitySetResource`));
683
654
  }
684
- callAction(name, params, responseType, { ...options } = {}) {
655
+ callAction(name, params, responseType, options = {}) {
685
656
  const resource = this.resource();
686
657
  if (!(resource instanceof ODataEntitySetResource)) {
687
- return throwError(() => new Error(`callAction: Can't action without ODataEntitySetResource`));
658
+ return throwError(() => new Error(`callAction: Can't call action without ODataEntitySetResource`));
688
659
  }
689
- const action = resource.action(name);
690
- action.query((q) => q.apply(options));
660
+ const action = resource.action(name).query((q) => q.apply(options));
691
661
  switch (responseType) {
692
662
  case 'property':
693
- return action.callProperty(params, options);
663
+ return this._request(action.callProperty(params, options), (resp) => resp);
694
664
  case 'model':
695
- return action.callModel(params, options);
665
+ return this._request(action.callModel(params, options), (resp) => resp);
696
666
  case 'collection':
697
- return action.callCollection(params, options);
667
+ return this._request(action.callCollection(params, options), (resp) => resp);
698
668
  default:
699
- return action.call(params, { responseType, ...options });
669
+ return this._request(action.call(params, { responseType, ...options }), (resp) => resp);
700
670
  }
701
671
  }
702
672
  _unlink(entry) {
@@ -710,14 +680,13 @@ export class ODataCollection {
710
680
  throw new Error('Collection: Subscription already exists');
711
681
  }
712
682
  entry.subscription = entry.model.events$.subscribe((event) => {
713
- if (BUBBLING.indexOf(event.name) !== -1 &&
714
- event.bubbling &&
715
- !event.visited(this)) {
683
+ if (event.canContinueWith(this)) {
716
684
  if (event.model === entry.model) {
717
- if (event.name === 'destroy') {
685
+ if (event.type === ODataModelEventType.Destroy) {
718
686
  this.removeModel(entry.model, { reset: true });
719
687
  }
720
- else if (event.name === 'change' && event.options?.key) {
688
+ else if (event.type === ODataModelEventType.Change &&
689
+ event.options?.key) {
721
690
  entry.key = entry.model.key();
722
691
  }
723
692
  }
@@ -745,7 +714,7 @@ export class ODataCollection {
745
714
  }
746
715
  [Symbol.iterator]() {
747
716
  let pointer = 0;
748
- let models = this.models();
717
+ const models = this.models();
749
718
  return {
750
719
  next() {
751
720
  return {
@@ -761,7 +730,7 @@ export class ODataCollection {
761
730
  map(callbackfn, thisArg) {
762
731
  return this.models().map(callbackfn, thisArg);
763
732
  }
764
- find(predicate, thisArg) {
733
+ find(predicate) {
765
734
  return this.models().find(predicate);
766
735
  }
767
736
  reduce(callbackfn, initialValue) {
@@ -794,41 +763,28 @@ export class ODataCollection {
794
763
  some(predicate) {
795
764
  return this.models().some(predicate);
796
765
  }
797
- contains(model) {
798
- return this.some((m) => m.equals(model));
766
+ includes(model, start = 0) {
767
+ return this.some((m, i) => i >= start && m.equals(model));
799
768
  }
800
769
  indexOf(model) {
801
770
  const models = this.models();
802
771
  const m = models.find((m) => m.equals(model));
803
- return m === undefined ? -1 : models.indexOf(m);
772
+ return !m ? -1 : models.indexOf(m);
804
773
  }
805
774
  isEmpty() {
806
- // Local length and if exists remote length
807
- return (this.length === 0 &&
808
- this.annots().count !== undefined &&
809
- this.annots().count === 0);
775
+ // Local length == 0 and if exist remote count is 0 or undefined
776
+ return this.length === 0 && !this.annots().count;
810
777
  }
811
778
  //#region Sort
812
- _bisect(model) {
813
- let index = -1;
814
- if (this._sortBy !== null) {
815
- for (index = 0; index < this._entries.length; index++) {
816
- if (this._compare(model, this._entries[index], this._sortBy, 0) < 0) {
817
- return index;
818
- }
819
- }
820
- }
821
- return index;
822
- }
823
779
  _compare(e1, e2, by, index) {
824
- let m1 = ODataModelOptions.isModel(e1)
780
+ const m1 = ODataModelOptions.isModel(e1)
825
781
  ? e1
826
782
  : e1.model;
827
- let m2 = ODataModelOptions.isModel(e2)
783
+ const m2 = ODataModelOptions.isModel(e2)
828
784
  ? e2
829
785
  : e2.model;
830
- let value1 = m1.get(by[index].field);
831
- let value2 = m2.get(by[index].field);
786
+ const value1 = m1.get(by[index].field);
787
+ const value2 = m2.get(by[index].field);
832
788
  let result = 0;
833
789
  if (value1 == null && value2 != null)
834
790
  result = -1;
@@ -856,10 +812,8 @@ export class ODataCollection {
856
812
  this._sortBy = by;
857
813
  this._entries = this._entries.sort((e1, e2) => this._compare(e1, e2, by, 0));
858
814
  if (!silent) {
859
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
860
- collection: this,
861
- }));
815
+ this.events$.trigger(ODataModelEventType.Update);
862
816
  }
863
817
  }
864
818
  }
865
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFJTCx3QkFBd0IsRUFDeEIsc0JBQXNCLEVBRXRCLHNCQUFzQixFQUV0QiwrQkFBK0IsRUFFL0IscUJBQXFCLEdBR3RCLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFDWixlQUFlLEVBR2YsZUFBZSxFQUNmLG1CQUFtQixFQUVuQixpQkFBaUIsRUFDakIsZUFBZSxHQUNoQixNQUFNLFdBQVcsQ0FBQztBQUVuQixNQUFNLE9BQU8sZUFBZTthQUduQixVQUFLLEdBQTZCLElBQUksQUFBakMsQ0FBa0M7SUE2QjlDLE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxRQUFRO2FBQ2pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxlQUFlLENBQUMsT0FBTyxDQUFDO2FBQ2xELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lB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LElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDZixJQUFJLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUU7Z0JBQzlDLFVBQVUsRUFBRSxJQUFJO2FBQ2pCLENBQUMsQ0FDSCxDQUFDO1NBQ0g7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbmFsaXplLCBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERFRkFVTFRfVkVSU0lPTiB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBPRGF0YUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcic7XG5pbXBvcnQge1xuICBFbnRpdHlLZXksXG4gIE9EYXRhQWN0aW9uT3B0aW9ucyxcbiAgT0RhdGFFbnRpdGllcyxcbiAgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zLFxuICBPRGF0YUVudGl0eUFubm90YXRpb25zLFxuICBPRGF0YUVudGl0eVJlc291cmNlLFxuICBPRGF0YUVudGl0eVNldFJlc291cmNlLFxuICBPRGF0YUZ1bmN0aW9uT3B0aW9ucyxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFPcHRpb25zLFxuICBPRGF0YVByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcixcbiAgT0RhdGFSZXNvdXJjZSxcbn0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IE9EYXRhU3RydWN0dXJlZFR5cGUgfSBmcm9tICcuLi9zY2hlbWEvc3RydWN0dXJlZC10eXBlJztcbmltcG9ydCB7IFR5cGVzIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xuaW1wb3J0IHsgT0RhdGFNb2RlbCB9IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHtcbiAgQlVCQkxJTkcsXG4gIElOQ0xVREVfREVFUCxcbiAgSU5DTFVERV9TSEFMTE9XLFxuICBNb2RlbEZpZWxkT3B0aW9ucyxcbiAgT0RhdGFNb2RlbEVudHJ5LFxuICBPRGF0YU1vZGVsRXZlbnQsXG4gIE9EYXRhTW9kZWxFdmVudFR5cGUsXG4gIE9EYXRhTW9kZWxGaWVsZCxcbiAgT0RhdGFNb2RlbE9wdGlvbnMsXG4gIE9EYXRhTW9kZWxTdGF0ZSxcbn0gZnJvbSAnLi9vcHRpb25zJztcblxuZXhwb3J0IGNsYXNzIE9EYXRhQ29sbGVjdGlvbjxULCBNIGV4dGVuZHMgT0RhdGFNb2RlbDxUPj5cbiAgaW1wbGVtZW50cyBJdGVyYWJsZTxNPlxue1xuICBzdGF0aWMgbW9kZWw6IHR5cGVvZiBPRGF0YU1vZGVsIHwgbnVsbCA9IG51bGw7XG4gIF9wYXJlbnQ6XG4gICAgfCBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbCxcbiAgICAgIF1cbiAgICB8IG51bGwgPSBudWxsO1xuICBfcmVzb3VyY2U6XG4gICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IG51bGwgPSBudWxsO1xuICBfcmVzb3VyY2VzOiB7XG4gICAgcGFyZW50OlxuICAgICAgfCBbXG4gICAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGwsXG4gICAgICAgIF1cbiAgICAgIHwgbnVsbDtcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBudWxsO1xuICB9W10gPSBbXTtcbiAgX2Fubm90YXRpb25zITogT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPFQ+O1xuICBfZW50cmllczogT0RhdGFNb2RlbEVudHJ5PFQsIE0+W10gPSBbXTtcbiAgX21vZGVsOiB0eXBlb2YgT0RhdGFNb2RlbDtcblxuICBtb2RlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXNcbiAgICAgIC5maWx0ZXIoKGUpID0+IGUuc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKVxuICAgICAgLm1hcCgoZSkgPT4gZS5tb2RlbCk7XG4gIH1cblxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkubGVuZ3RoO1xuICB9XG5cbiAgLy9FdmVudHNcbiAgZXZlbnRzJCA9IG5ldyBFdmVudEVtaXR0ZXI8T0RhdGFNb2RlbEV2ZW50PFQ+PigpO1xuICBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdGllczogUGFydGlhbDxUPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSA9IFtdLFxuICAgIHtcbiAgICAgIHBhcmVudCxcbiAgICAgIHJlc291cmNlLFxuICAgICAgYW5ub3RzLFxuICAgICAgbW9kZWwsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIHBhcmVudD86IFtPRGF0YU1vZGVsPGFueT4sIE9EYXRhTW9kZWxGaWVsZDxhbnk+XTtcbiAgICAgIHJlc291cmNlPzogT0RhdGFSZXNvdXJjZTxUPjtcbiAgICAgIGFubm90cz86IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczxUPjtcbiAgICAgIG1vZGVsPzogdHlwZW9mIE9EYXRhTW9kZWw7XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICBjb25zdCBLbGFzcyA9IHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIE9EYXRhQ29sbGVjdGlvbjtcbiAgICBpZiAobW9kZWwgPT09IHVuZGVmaW5lZCAmJiBLbGFzcy5tb2RlbCAhPT0gbnVsbCkgbW9kZWwgPSBLbGFzcy5tb2RlbDtcbiAgICBpZiAobW9kZWwgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbjogQ29sbGVjdGlvbiBuZWVkIG1vZGVsJyk7XG4gICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcblxuICAgIC8vIFBhcmVudFxuICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIC8vIFJlc291cmNlXG4gICAgaWYgKHRoaXMuX3BhcmVudCA9PT0gbnVsbCAmJiByZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmVzb3VyY2UgPSB0aGlzLl9tb2RlbC5tZXRhLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoKSBhc1xuICAgICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmF0dGFjaChcbiAgICAgICAgcmVzb3VyY2UgYXNcbiAgICAgICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQW5ub3RhdGlvbnNcbiAgICB0aGlzLl9hbm5vdGF0aW9ucyA9XG4gICAgICBhbm5vdHMgfHxcbiAgICAgIG5ldyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMoXG4gICAgICAgIE9EYXRhSGVscGVyW3Jlc291cmNlPy5hcGk/Lm9wdGlvbnMudmVyc2lvbiB8fCBERUZBVUxUX1ZFUlNJT05dLFxuICAgICAgKTtcblxuICAgIGVudGl0aWVzID0gZW50aXRpZXMgfHwgW107XG4gICAgdGhpcy5hc3NpZ24oZW50aXRpZXMsIHsgcmVzZXQgfSk7XG4gIH1cblxuICBpc1BhcmVudE9mKFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hpbGQgIT09IHRoaXMgJiZcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmNoYWluKGNoaWxkKS5zb21lKChwKSA9PiBwWzBdID09PSB0aGlzKVxuICAgICk7XG4gIH1cblxuICByZXNvdXJjZSgpOlxuICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+IHtcbiAgICByZXR1cm4gT0RhdGFNb2RlbE9wdGlvbnMucmVzb3VyY2U8VD4odGhpcykgYXNcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPjtcbiAgfVxuXG4gIHB1c2hSZXNvdXJjZShcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPixcbiAgKSB7XG4gICAgLy8gUHVzaCBjdXJyZW50IHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICB0aGlzLl9yZXNvdXJjZXMucHVzaCh7IHBhcmVudDogdGhpcy5fcGFyZW50LCByZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UgfSk7XG4gICAgLy8gUmVwbGFjZSBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG5cbiAgcG9wUmVzb3VyY2UoKSB7XG4gICAgLy8gUG9wIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICBjb25zdCBwb3AgPSB0aGlzLl9yZXNvdXJjZXMucG9wKCk7XG4gICAgaWYgKHBvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0geyBwYXJlbnQ6IHRoaXMuX3BhcmVudCwgcmVzb3VyY2U6IHRoaXMuX3Jlc291cmNlIH07XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwb3AucGFyZW50O1xuICAgICAgdGhpcy5fcmVzb3VyY2UgPSBwb3AucmVzb3VyY2U7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGF0dGFjaChcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPixcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fcmVzb3VyY2UgIT09IG51bGwgJiZcbiAgICAgIHRoaXMuX3Jlc291cmNlLnR5cGUoKSAhPT0gcmVzb3VyY2UudHlwZSgpICYmXG4gICAgICAhdGhpcy5fcmVzb3VyY2UuaXNTdWJ0eXBlT2YocmVzb3VyY2UpXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYXR0YWNoOiBDYW4ndCByZWF0dGFjaCAke3RoaXMuX3Jlc291cmNlLnR5cGUoKX0gdG8gJHtyZXNvdXJjZS50eXBlKCl9YCxcbiAgICAgICk7XG5cbiAgICB0aGlzLl9lbnRyaWVzLmZvckVhY2goKHsgbW9kZWwgfSkgPT4ge1xuICAgICAgY29uc3QgbW9kZWxSZXNvdXJjZSA9IHRoaXMuX21vZGVsLm1ldGEubW9kZWxSZXNvdXJjZUZhY3RvcnkoXG4gICAgICAgIHJlc291cmNlLmNsb25lUXVlcnk8VD4oKSxcbiAgICAgICkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPjtcbiAgICAgIGlmIChtb2RlbFJlc291cmNlICE9PSB1bmRlZmluZWQpIG1vZGVsLmF0dGFjaChtb2RlbFJlc291cmNlKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9yZXNvdXJjZTtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCAhY3VycmVudC5pc0VxdWFsVG8ocmVzb3VyY2UpKSB7XG4gICAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5BdHRhY2gsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIHByZXZpb3VzOiBjdXJyZW50LFxuICAgICAgICAgIHZhbHVlOiByZXNvdXJjZSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuICB3aXRoUmVzb3VyY2U8Uj4oXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD4sXG4gICAgY3R4OiAoY29sbGVjdGlvbjogdGhpcykgPT4gUixcbiAgKTogUiB7XG4gICAgLy8gUHVzaFxuICAgIHRoaXMucHVzaFJlc291cmNlKHJlc291cmNlKTtcbiAgICAvLyBFeGVjdXRlXG4gICAgY29uc3QgcmVzdWx0ID0gY3R4KHRoaXMpO1xuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICByZXR1cm4gKHJlc3VsdCBhcyBhbnkpLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5wb3BSZXNvdXJjZSgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBvcFxuICAgICAgdGhpcy5wb3BSZXNvdXJjZSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICBhc0VudGl0eVNldDxSPihjdHg6IChjb2xsZWN0aW9uOiB0aGlzKSA9PiBSKTogUiB7XG4gICAgLy8gQnVpbGQgbmV3IHJlc291cmNlXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLl9yZXNvdXJjZT8uY2xvbmVRdWVyeTxUPigpO1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMuX21vZGVsLm1ldGEuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeShxdWVyeSk7XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdhc0VudGl0eVNldDogQ29sbGVjdGlvbiBkb2VzIG5vdCBoYXZlIGFzc29jaWF0ZWQgRW50aXR5U2V0IGVuZHBvaW50JyxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMud2l0aFJlc291cmNlKHJlc291cmNlLCBjdHgpO1xuICB9XG5cbiAgYW5ub3RzKCkge1xuICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgbW9kZWxGYWN0b3J5KFxuICAgIGRhdGE6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7IHJlc2V0ID0gZmFsc2UgfTogeyByZXNldD86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBNIHtcbiAgICBsZXQgTW9kZWwgPSB0aGlzLl9tb2RlbDtcbiAgICBjb25zdCBhbm5vdHMgPSBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyh0aGlzLl9hbm5vdGF0aW9ucy5oZWxwZXIpO1xuICAgIGFubm90cy51cGRhdGUoZGF0YSk7XG5cbiAgICBpZiAoYW5ub3RzPy50eXBlICE9PSB1bmRlZmluZWQgJiYgTW9kZWwubWV0YSAhPT0gbnVsbCkge1xuICAgICAgbGV0IHNjaGVtYSA9IE1vZGVsLm1ldGEuZmluZENoaWxkT3B0aW9ucygobykgPT5cbiAgICAgICAgby5pc1R5cGVPZihhbm5vdHMudHlwZSBhcyBzdHJpbmcpLFxuICAgICAgKT8uc2NoZW1hO1xuICAgICAgaWYgKHNjaGVtYSAhPT0gdW5kZWZpbmVkICYmIHNjaGVtYS5tb2RlbCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAvLyBDaGFuZ2UgdG8gY2hpbGQgbW9kZWxcbiAgICAgICAgTW9kZWwgPSBzY2hlbWEubW9kZWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbChkYXRhLCB7XG4gICAgICBhbm5vdHMsXG4gICAgICByZXNldCxcbiAgICAgIHBhcmVudDogW3RoaXMsIG51bGxdLFxuICAgIH0pIGFzIE07XG4gIH1cblxuICB0b0VudGl0aWVzKHtcbiAgICBjbGllbnRfaWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5ID0gZmFsc2UsXG4gICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfa2V5ID0gdHJ1ZSxcbiAgICBpbmNsdWRlX25vbl9maWVsZCA9IGZhbHNlLFxuICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICBjaGFpbiA9IFtdLFxuICB9OiB7XG4gICAgY2xpZW50X2lkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfa2V5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgY2hhbmdlc19vbmx5PzogYm9vbGVhbjtcbiAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgICBjaGFpbj86IChPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVtdO1xuICB9ID0ge30pOiAoUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9KVtdIHtcbiAgICByZXR1cm4gdGhpcy5fZW50cmllc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHsgbW9kZWwsIHN0YXRlIH0pID0+XG4gICAgICAgICAgc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkICYmIGNoYWluLmV2ZXJ5KChjKSA9PiBjICE9PSBtb2RlbCksXG4gICAgICApXG4gICAgICAubWFwKCh7IG1vZGVsLCBzdGF0ZSB9KSA9PiB7XG4gICAgICAgIHZhciBjaGFuZ2VzT25seSA9IGNoYW5nZXNfb25seSAmJiBzdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLkFkZGVkO1xuICAgICAgICByZXR1cm4gbW9kZWwudG9FbnRpdHkoe1xuICAgICAgICAgIGNsaWVudF9pZCxcbiAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgICAgIGluY2x1ZGVfa2V5LFxuICAgICAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkLFxuICAgICAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICAgICAgY2hhbmdlc19vbmx5OiBjaGFuZ2VzT25seSxcbiAgICAgICAgICBjaGFpbjogW3RoaXMsIC4uLmNoYWluXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0VudGl0aWVzKCk7XG4gIH1cblxuICBoYXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fZW50cmllcy5zb21lKChlKSA9PiBlLnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkKSB8fFxuICAgICAgdGhpcy5tb2RlbHMoKS5zb21lKChtKSA9PiBtLmhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfSkpXG4gICAgKTtcbiAgfVxuXG4gIGNsb25lPEMgZXh0ZW5kcyBPRGF0YUNvbGxlY3Rpb248VCwgTT4+KCkge1xuICAgIGxldCBDdG9yID0gPHR5cGVvZiBPRGF0YUNvbGxlY3Rpb24+dGhpcy5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gbmV3IEN0b3IodGhpcy50b0VudGl0aWVzKElOQ0xVREVfU0hBTExPVyksIHtcbiAgICAgIHJlc291cmNlOiB0aGlzLnJlc291cmNlKCksXG4gICAgICBhbm5vdHM6IHRoaXMuYW5ub3RzKCksXG4gICAgfSkgYXMgQztcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVlc3QoXG4gICAgb2JzJDogT2JzZXJ2YWJsZTxPRGF0YUVudGl0aWVzPGFueT4+LFxuICAgIHsgcmVtb3ZlIH06IHsgcmVtb3ZlPzogYm9vbGVhbiB9ID0ge30sXG4gICk6IE9ic2VydmFibGU8TVtdPiB7XG4gICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuUmVxdWVzdCwge1xuICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICBvcHRpb25zOiB7IG9ic2VydmFibGU6IG9icyQgfSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gb2JzJC5waXBlKFxuICAgICAgbWFwKCh7IGVudGl0aWVzLCBhbm5vdHMgfSkgPT4ge1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90cztcbiAgICAgICAgY29uc3QgbW9kZWxzID0gKGVudGl0aWVzIHx8IFtdKS5tYXAoXG4gICAgICAgICAgKGVudGl0eSkgPT4gdGhpcy5tb2RlbEZhY3RvcnkoZW50aXR5LCB7IHJlc2V0OiB0cnVlIH0pIGFzIE0sXG4gICAgICAgICkgYXMgTVtdO1xuICAgICAgICB0aGlzLmFzc2lnbihtb2RlbHMsIHsgcmVzZXQ6IHRydWUsIHJlbW92ZSB9KTtcbiAgICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChPRGF0YU1vZGVsRXZlbnRUeXBlLlN5bmMsIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgICBvcHRpb25zOiB7IG1vZGVscywgZW50aXRpZXMsIGFubm90cyB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbW9kZWxzO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoKHtcbiAgICB3aXRoQ291bnQsXG4gICAgcmVtb3ZlLFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIHJlbW92ZT86IGJvb2xlYW47XG4gICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgfSA9IHt9KTogT2JzZXJ2YWJsZTxNW10+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcblxuICAgIGNvbnN0IG9icyQgPVxuICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlXG4gICAgICAgID8gcmVzb3VyY2UuZmV0Y2goeyB3aXRoQ291bnQsIC4uLm9wdGlvbnMgfSlcbiAgICAgICAgOiByZXNvdXJjZS5mZXRjaCh7XG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdlbnRpdGllcycsXG4gICAgICAgICAgICB3aXRoQ291bnQsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCwgeyByZW1vdmUgfSk7XG4gIH1cblxuICBmZXRjaEFsbCh7XG4gICAgd2l0aENvdW50LFxuICAgIHJlbW92ZSxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICByZW1vdmU/OiBib29sZWFuO1xuICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8TVtdPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG5cbiAgICBjb25zdCBvYnMkID0gcmVzb3VyY2UuZmV0Y2hBbGwoeyB3aXRoQ291bnQsIC4uLm9wdGlvbnMgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkLCB7IHJlbW92ZSB9KTtcbiAgfVxuXG4gIGZldGNoTWFueShcbiAgICB0b3A6IG51bWJlcixcbiAgICB7XG4gICAgICB3aXRoQ291bnQsXG4gICAgICByZW1vdmUsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTogT0RhdGFPcHRpb25zICYge1xuICAgICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPE1bXT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIHJlc291cmNlLnF1ZXJ5KChxKSA9PlxuICAgICAgcmVtb3ZlIHx8IHRoaXMubGVuZ3RoID09IDAgPyBxLnNraXAoKS5jbGVhcigpIDogcS5za2lwKHRoaXMubGVuZ3RoKSxcbiAgICApO1xuXG4gICAgY29uc3Qgb2JzJCA9IHJlc291cmNlLmZldGNoTWFueSh0b3AsIHsgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCwgeyByZW1vdmU6IHJlbW92ZSA/PyBmYWxzZSB9KTtcbiAgfVxuXG4gIGZldGNoT25lKHtcbiAgICB3aXRoQ291bnQsXG4gICAgcmVtb3ZlLFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIHJlbW92ZT86IGJvb2xlYW47XG4gICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hNYW55KDEsIHsgd2l0aENvdW50LCByZW1vdmUsIC4uLm9wdGlvbnMgfSkucGlwZShcbiAgICAgIG1hcCgobW9kZWxzKSA9PiBtb2RlbHNbMF0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhbGwgbW9kZWxzIGluIHRoZSBjb2xsZWN0aW9uXG4gICAqIEBwYXJhbSByZWxNb2RlbCBUaGUgbW9kZWwgaXMgcmVsYXRpb25zaGlwXG4gICAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCB0byB1c2VcbiAgICogQHBhcmFtIG9wdGlvbnMgSHR0cE9wdGlvbnNcbiAgICovXG4gIHNhdmUoe1xuICAgIHJlbE1vZGVsID0gZmFsc2UsXG4gICAgbWV0aG9kLFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIHJlbE1vZGVsPzogYm9vbGVhbjtcbiAgICBtZXRob2Q/OiAndXBkYXRlJyB8ICdtb2RpZnknO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YVByb3BlcnR5UmVzb3VyY2UpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT4gbmV3IEVycm9yKCdzYXZlOiBSZXNvdXJjZSBpcyBPRGF0YVByb3BlcnR5UmVzb3VyY2UnKSxcbiAgICAgICk7XG5cbiAgICBsZXQgdG9EZXN0cm95RW50aXR5OiBNW10gPSBbXTtcbiAgICBsZXQgdG9SZW1vdmVSZWZlcmVuY2U6IE1bXSA9IFtdO1xuICAgIGxldCB0b0Rlc3Ryb3lDb250YWluZWQ6IE1bXSA9IFtdO1xuICAgIGxldCB0b0NyZWF0ZUVudGl0eTogTVtdID0gW107XG4gICAgbGV0IHRvQWRkUmVmZXJlbmNlOiBNW10gPSBbXTtcbiAgICBsZXQgdG9DcmVhdGVDb250YWluZWQ6IE1bXSA9IFtdO1xuICAgIGxldCB0b1VwZGF0ZUVudGl0eTogTVtdID0gW107XG4gICAgbGV0IHRvVXBkYXRlQ29udGFpbmVkOiBNW10gPSBbXTtcblxuICAgIHRoaXMuX2VudHJpZXMuZm9yRWFjaCgoeyBtb2RlbCwgc3RhdGUgfSkgPT4ge1xuICAgICAgaWYgKHN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgICBpZiAocmVsTW9kZWwpIHtcbiAgICAgICAgICB0b0Rlc3Ryb3lFbnRpdHkucHVzaChtb2RlbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW1vZGVsLmlzTmV3KCkpIHtcbiAgICAgICAgICB0b1JlbW92ZVJlZmVyZW5jZS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b0Rlc3Ryb3lDb250YWluZWQucHVzaChtb2RlbCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCkge1xuICAgICAgICBpZiAocmVsTW9kZWwpIHtcbiAgICAgICAgICB0b0NyZWF0ZUVudGl0eS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIGlmICghbW9kZWwuaXNOZXcoKSkge1xuICAgICAgICAgIHRvQWRkUmVmZXJlbmNlLnB1c2gobW9kZWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvQ3JlYXRlQ29udGFpbmVkLnB1c2gobW9kZWwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vZGVsLmhhc0NoYW5nZWQoKSkge1xuICAgICAgICB0b1VwZGF0ZUVudGl0eS5wdXNoKG1vZGVsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICB0b0Rlc3Ryb3lFbnRpdHkubGVuZ3RoID4gMCB8fFxuICAgICAgdG9SZW1vdmVSZWZlcmVuY2UubGVuZ3RoID4gMCB8fFxuICAgICAgdG9EZXN0cm95Q29udGFpbmVkLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQ3JlYXRlRW50aXR5Lmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQWRkUmVmZXJlbmNlLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQ3JlYXRlQ29udGFpbmVkLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvVXBkYXRlRW50aXR5Lmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvVXBkYXRlQ29udGFpbmVkLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IG9icyQgPSBmb3JrSm9pbihbXG4gICAgICAgIC4uLnRvRGVzdHJveUVudGl0eS5tYXAoKG0pID0+IG0uYXNFbnRpdHkoKGUpID0+IGUuZGVzdHJveShvcHRpb25zKSkpLFxuICAgICAgICAuLi50b1JlbW92ZVJlZmVyZW5jZS5tYXAoKG0pID0+IHRoaXMucmVtb3ZlUmVmZXJlbmNlKG0sIG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9EZXN0cm95Q29udGFpbmVkLm1hcCgobSkgPT4gbS5kZXN0cm95KG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9DcmVhdGVFbnRpdHkubWFwKChtKSA9PlxuICAgICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUuc2F2ZSh7IG1ldGhvZDogJ2NyZWF0ZScsIC4uLm9wdGlvbnMgfSkpLFxuICAgICAgICApLFxuICAgICAgICAuLi50b0FkZFJlZmVyZW5jZS5tYXAoKG0pID0+IHRoaXMuYWRkUmVmZXJlbmNlKG0sIG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9DcmVhdGVDb250YWluZWQubWFwKChtKSA9PlxuICAgICAgICAgIG0uc2F2ZSh7IG1ldGhvZDogJ2NyZWF0ZScsIC4uLm9wdGlvbnMgfSksXG4gICAgICAgICksXG4gICAgICAgIC4uLnRvVXBkYXRlRW50aXR5Lm1hcCgobSkgPT5cbiAgICAgICAgICBtLmFzRW50aXR5KChlKSA9PiBlLnNhdmUoeyBtZXRob2QsIC4uLm9wdGlvbnMgfSkpLFxuICAgICAgICApLFxuICAgICAgICAuLi50b1VwZGF0ZUNvbnRhaW5lZC5tYXAoKG0pID0+IG0uc2F2ZSh7IG1ldGhvZCwgLi4ub3B0aW9ucyB9KSksXG4gICAgICBdKTtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuUmVxdWVzdCwge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgb3B0aW9uczogeyBvYnNlcnZhYmxlOiBvYnMkIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBvYnMkLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZW50cmllcyA9IHRoaXMuX2VudHJpZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpXG4gICAgICAgICAgICAubWFwKChlbnRyeSkgPT4gKHsgLi4uZW50cnksIHN0YXRlOiBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkIH0pKTtcbiAgICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5TeW5jLCB7IGNvbGxlY3Rpb246IHRoaXMgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gb2YodGhpcyk7XG4gIH1cblxuICBwcml2YXRlIGFkZFJlZmVyZW5jZShtb2RlbDogTSwgb3B0aW9ucz86IE9EYXRhT3B0aW9ucyk6IE9ic2VydmFibGU8TT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghbW9kZWwuaXNOZXcoKSAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UpIHtcbiAgICAgIHJldHVybiByZXNvdXJjZVxuICAgICAgICAucmVmZXJlbmNlKClcbiAgICAgICAgLmFkZChcbiAgICAgICAgICBtb2RlbC5fbWV0YS5lbnRpdHlSZXNvdXJjZShtb2RlbCkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPixcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApXG4gICAgICAgIC5waXBlKG1hcCgoKSA9PiBtb2RlbCkpO1xuICAgIH1cbiAgICByZXR1cm4gb2YobW9kZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkTW9kZWwoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIG1lcmdlID0gZmFsc2UsXG4gICAgICBwb3NpdGlvbiA9IC0xLFxuICAgIH06IHtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBtZXJnZT86IGJvb2xlYW47XG4gICAgICBwb3NpdGlvbj86IG51bWJlcjtcbiAgICB9ID0ge30sXG4gICk6IE0ge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsLmtleSgpO1xuICAgIGxldCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7XG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIGNpZDogKDxhbnk+bW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSxcbiAgICB9KTtcbiAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCAmJiBlbnRyeS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIGlmIChtZXJnZSkge1xuICAgICAgICBlbnRyeS5tb2RlbC5hc3NpZ24obW9kZWwudG9FbnRpdHkoKSBhcyBUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyeS5tb2RlbDtcbiAgICB9XG5cbiAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCAmJiBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZW50cmllcy5pbmRleE9mKGVudHJ5KTtcbiAgICAgIHRoaXMuX2VudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgRW50cnlcbiAgICBlbnRyeSA9IHtcbiAgICAgIHN0YXRlOiByZXNldCA/IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQgOiBPRGF0YU1vZGVsU3RhdGUuQWRkZWQsXG4gICAgICBtb2RlbCxcbiAgICAgIGtleTogbW9kZWwua2V5KCksXG4gICAgfTtcbiAgICAvLyBTZXQgUGFyZW50XG4gICAgaWYgKHJlcGFyZW50KSBtb2RlbC5fcGFyZW50ID0gW3RoaXMsIG51bGxdO1xuICAgIC8vIFN1YnNjcmliZVxuICAgIHRoaXMuX2xpbmsoZW50cnkpO1xuICAgIC8vIE5vdyBhZGRcbiAgICBpZiAocG9zaXRpb24gPj0gMCkgdGhpcy5fZW50cmllcy5zcGxpY2UocG9zaXRpb24sIDAsIGVudHJ5KTtcbiAgICBlbHNlIHRoaXMuX2VudHJpZXMucHVzaChlbnRyeSk7XG5cbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgbW9kZWwuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuQWRkLCB7XG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnkubW9kZWw7XG4gIH1cblxuICBwcml2YXRlIGFkZE1vZGVsKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBtZXJnZSA9IGZhbHNlLFxuICAgICAgcG9zaXRpb24gPSAtMSxcbiAgICB9OiB7XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgbWVyZ2U/OiBib29sZWFuO1xuICAgICAgcG9zaXRpb24/OiBudW1iZXI7XG4gICAgfSA9IHt9LFxuICApOiBNIHtcbiAgICBpZiAocG9zaXRpb24gPCAwKSBwb3NpdGlvbiA9IHRoaXMuX2Jpc2VjdChtb2RlbCk7XG4gICAgY29uc3QgYWRkZWQgPSB0aGlzLl9hZGRNb2RlbChtb2RlbCwge1xuICAgICAgc2lsZW50LFxuICAgICAgcmVzZXQsXG4gICAgICBtZXJnZSxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgcmVwYXJlbnQsXG4gICAgfSk7XG4gICAgaWYgKCFzaWxlbnQgJiYgYWRkZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgYWRkZWQ6IFthZGRlZF0sIHJlbW92ZWQ6IFtdLCBtZXJnZWQ6IFtdIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZGVkO1xuICB9XG5cbiAgYWRkKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgICBtZXJnZSA9IGZhbHNlLFxuICAgICAgcG9zaXRpb24gPSAtMSxcbiAgICB9OiB7XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgc2VydmVyPzogYm9vbGVhbjtcbiAgICAgIG1lcmdlPzogYm9vbGVhbjtcbiAgICAgIHBvc2l0aW9uPzogbnVtYmVyO1xuICAgIH0gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxNPiB7XG4gICAgaWYgKHNlcnZlcikge1xuICAgICAgcmV0dXJuIHRoaXMuYWRkUmVmZXJlbmNlKG1vZGVsKS5waXBlKFxuICAgICAgICBtYXAoKG1vZGVsKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWRkTW9kZWwobW9kZWwsIHtcbiAgICAgICAgICAgIHNpbGVudCxcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgcmVwYXJlbnQsXG4gICAgICAgICAgICBtZXJnZSxcbiAgICAgICAgICAgIHJlc2V0OiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvZih0aGlzLmFkZE1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcG9zaXRpb24sIG1lcmdlLCByZXBhcmVudCB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVSZWZlcmVuY2UobW9kZWw6IE0sIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMpOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCFtb2RlbC5pc05ldygpICYmIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSkge1xuICAgICAgbGV0IHRhcmdldCA9XG4gICAgICAgIHRoaXMuX21vZGVsLm1ldGEuYXBpLm9wdGlvbnMuZGVsZXRlUmVmQnkgPT09ICdpZCdcbiAgICAgICAgICA/IChtb2RlbC5fbWV0YS5lbnRpdHlSZXNvdXJjZShtb2RlbCkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPilcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLl9tb2RlbC5tZXRhLmFwaS5vcHRpb25zLmRlbGV0ZVJlZkJ5ID09PSAncGF0aCcpIHtcbiAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZS5rZXkobW9kZWwua2V5KCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc291cmNlXG4gICAgICAgIC5yZWZlcmVuY2UoKVxuICAgICAgICAucmVtb3ZlKHRhcmdldCwgb3B0aW9ucylcbiAgICAgICAgLnBpcGUobWFwKCgpID0+IG1vZGVsKSk7XG4gICAgfVxuICAgIHJldHVybiBvZihtb2RlbCk7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyByZXNldD86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBNIHtcbiAgICBjb25zdCBrZXkgPSBtb2RlbC5rZXkoKTtcbiAgICBsZXQgZW50cnkgPSB0aGlzLl9maW5kRW50cnkoe1xuICAgICAgbW9kZWwsXG4gICAgICBrZXksXG4gICAgICBjaWQ6ICg8YW55Pm1vZGVsKVt0aGlzLl9tb2RlbC5tZXRhLmNpZF0sXG4gICAgfSk7XG4gICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQgfHwgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKSB7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBFdmVudFxuICAgIGlmICghc2lsZW50KVxuICAgICAgbW9kZWwuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuUmVtb3ZlLCB7XG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgLy8gTm93IHJlbW92ZVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZW50cmllcy5pbmRleE9mKGVudHJ5KTtcbiAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKCEocmVzZXQgfHwgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCkpIHtcbiAgICAgIC8vIE1vdmUgdG8gZW5kIG9mIGFycmF5IGFuZCBtYXJrIGFzIHJlbW92ZWRcbiAgICAgIGVudHJ5LnN0YXRlID0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQ7XG4gICAgICB0aGlzLl9lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIH1cbiAgICB0aGlzLl91bmxpbmsoZW50cnkpO1xuICAgIHJldHVybiBlbnRyeS5tb2RlbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTW9kZWwoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgIH06IHsgc2lsZW50PzogYm9vbGVhbjsgcmVzZXQ/OiBib29sZWFuIH0gPSB7fSxcbiAgKTogTSB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMuX3JlbW92ZU1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcmVzZXQgfSk7XG4gICAgaWYgKCFzaWxlbnQgJiYgcmVtb3ZlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChPRGF0YU1vZGVsRXZlbnRUeXBlLlVwZGF0ZSwge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgb3B0aW9uczogeyBhZGRlZDogW10sIHJlbW92ZWQ6IFtyZW1vdmVkXSwgbWVyZ2VkOiBbXSB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZW1vdmVkO1xuICB9XG5cbiAgcmVtb3ZlKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgc2VydmVyID0gdHJ1ZSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHNlcnZlcj86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBpZiAoc2VydmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmVSZWZlcmVuY2UobW9kZWwpLnBpcGUoXG4gICAgICAgIG1hcCgobW9kZWwpID0+IHRoaXMucmVtb3ZlTW9kZWwobW9kZWwsIHsgc2lsZW50LCByZXNldDogdHJ1ZSB9KSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5yZW1vdmVNb2RlbChtb2RlbCwgeyBzaWxlbnQgfSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX21vdmVNb2RlbChtb2RlbDogTSwgcG9zaXRpb246IG51bWJlcik6IE0ge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsLmtleSgpO1xuICAgIGxldCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7XG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIGNpZDogKDxhbnk+bW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSxcbiAgICB9KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG5cbiAgICAvLyBOb3cgcmVtb3ZlXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuICAgIHRoaXMuX2VudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShwb3NpdGlvbiwgMCwgZW50cnkpO1xuXG4gICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICB9XG5cbiAgY3JlYXRlKFxuICAgIGF0dHJzOiBUID0ge30gYXMgVCxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyBzZXJ2ZXI/OiBib29sZWFuIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsRmFjdG9yeShhdHRycyk7XG4gICAgcmV0dXJuIChtb2RlbC5pc1ZhbGlkKCkgJiYgc2VydmVyID8gbW9kZWwuc2F2ZSgpIDogb2YobW9kZWwpKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChtb2RlbCkgPT4gdGhpcy5hZGQobW9kZWwsIHsgc2lsZW50LCBzZXJ2ZXIgfSkpLFxuICAgICAgbWFwKCgpID0+IG1vZGVsKSxcbiAgICApO1xuICB9XG5cbiAgc2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCB2YWx1ZTogYW55LCB7fToge30gJiBNb2RlbEZpZWxkT3B0aW9ucykge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9lbnRyaWVzW051bWJlcihwYXRoQXJyYXlbMF0pXS5tb2RlbDtcbiAgICAgIHJldHVybiBtb2RlbC5zZXQocGF0aEFycmF5LnNsaWNlKDEpLCB2YWx1ZSwge30pO1xuICAgIH1cbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgbGV0IHRvQWRkOiBNW10gPSBbXTtcbiAgICAgIGxldCB0b0NoYW5nZTogTVtdID0gW107XG4gICAgICBsZXQgdG9SZW1vdmU6IE1bXSA9IFtdO1xuICAgICAgbGV0IGluZGV4ID0gTnVtYmVyKHBhdGhBcnJheVswXSk7XG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxzKClbaW5kZXhdO1xuICAgICAgY29uc3QgZW50cnkgPSB0aGlzLl9maW5kRW50cnkoeyBtb2RlbCB9KTtcbiAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vVE9ETzogUmVtb3ZlL0FkZCBvciBNZXJnZT9cbiAgICAgICAgLy8gTWVyZ2VcbiAgICAgICAgZW50cnkubW9kZWwuYXNzaWduKFxuICAgICAgICAgIHZhbHVlLnRvRW50aXR5KHsgY2xpZW50X2lkOiB0cnVlLCAuLi5JTkNMVURFX0RFRVAgfSksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlbnRyeS5tb2RlbC5oYXNDaGFuZ2VkKCkpIHRvQ2hhbmdlLnB1c2gobW9kZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWRkXG4gICAgICAgIHRoaXMuX2FkZE1vZGVsKHZhbHVlLCB7IHJlcGFyZW50OiB0cnVlIH0pO1xuICAgICAgICB0b0FkZC5wdXNoKG1vZGVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuVXBkYXRlLCB7XG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICBvcHRpb25zOiB7IGFkZGVkOiB0b0FkZCwgcmVtb3ZlZDogdG9SZW1vdmUsIGNoYW5nZWQ6IHRvQ2hhbmdlIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBnZXQocGF0aDogbnVtYmVyKTogTSB8IHVuZGVmaW5lZDtcbiAgZ2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKTogYW55O1xuICBnZXQocGF0aDogYW55KTogYW55IHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IGAke3BhdGh9YC5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tb2RlbHMoKVtOdW1iZXIocGF0aEFycmF5WzBdKV07XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPiAxICYmIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuZ2V0KHBhdGhBcnJheS5zbGljZSgxKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGhhcyhwYXRoOiBudW1iZXIgfCBzdHJpbmcgfCBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogYCR7cGF0aH1gLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubW9kZWxzKClbTnVtYmVyKHBhdGhBcnJheVswXSldO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLmhhcyhwYXRoQXJyYXkuc2xpY2UoMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJlc2V0KHtcbiAgICBwYXRoLFxuICAgIHNpbGVudCA9IGZhbHNlLFxuICB9OiB7IHBhdGg/OiBzdHJpbmcgfCBzdHJpbmdbXTsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBsZXQgdG9BZGQ6IE9EYXRhTW9kZWxFbnRyeTxULCBNPltdID0gW107XG4gICAgbGV0IHRvQ2hhbmdlOiBPRGF0YU1vZGVsRW50cnk8VCwgTT5bXSA9IFtdO1xuICAgIGxldCB0b1JlbW92ZTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+W10gPSBbXTtcblxuICAgIGlmIChwYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFJlc2V0IGJ5IHBhdGhcbiAgICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiBgJHtwYXRofWAubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgICApIGFzIGFueVtdO1xuICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIocGF0aEFycmF5WzBdKTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKGluZGV4KSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxzKClbaW5kZXhdO1xuICAgICAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChtb2RlbCkpIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7IG1vZGVsIH0pIGFzIE9EYXRhTW9kZWxFbnRyeTxULCBNPjtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCAmJlxuICAgICAgICAgICAgZW50cnkubW9kZWwuaGFzQ2hhbmdlZCgpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0b0NoYW5nZSA9IFtlbnRyeV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGggPSBwYXRoQXJyYXkuc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzZXQgYWxsXG4gICAgICB0b0FkZCA9IHRoaXMuX2VudHJpZXMuZmlsdGVyKChlKSA9PiBlLnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCk7XG4gICAgICB0b0NoYW5nZSA9IHRoaXMuX2VudHJpZXMuZmlsdGVyKFxuICAgICAgICAoZSkgPT4gZS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCAmJiBlLm1vZGVsLmhhc0NoYW5nZWQoKSxcbiAgICAgICk7XG4gICAgICB0b1JlbW92ZSA9IHRoaXMuX2VudHJpZXMuZmlsdGVyKChlKSA9PiBlLnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQWRkZWQpO1xuICAgIH1cblxuICAgIHRvUmVtb3ZlLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICB0aGlzLl9yZW1vdmVNb2RlbChlbnRyeS5tb2RlbCwgeyBzaWxlbnQgfSk7XG4gICAgfSk7XG4gICAgdG9BZGQuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIHRoaXMuX2FkZE1vZGVsKGVudHJ5Lm1vZGVsLCB7IHNpbGVudCB9KTtcbiAgICB9KTtcbiAgICB0b0NoYW5nZS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgZW50cnkubW9kZWwucmVzZXQoeyBwYXRoLCBzaWxlbnQgfSk7XG4gICAgICBlbnRyeS5zdGF0ZSA9IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQ7XG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgIXNpbGVudCAmJlxuICAgICAgKHRvQWRkLmxlbmd0aCA+IDAgfHwgdG9SZW1vdmUubGVuZ3RoID4gMCB8fCB0b0NoYW5nZS5sZW5ndGggPiAwKVxuICAgICkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXNldCwge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgYWRkZWQ6IHRvQWRkLm1hcCgoZSkgPT4gZS5tb2RlbCksXG4gICAgICAgICAgICByZW1vdmVkOiB0b1JlbW92ZS5tYXAoKGUpID0+IGUubW9kZWwpLFxuICAgICAgICAgICAgY2hhbmdlZDogdG9DaGFuZ2UubWFwKChlKSA9PiBlLm1vZGVsKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoeyBzaWxlbnQgPSBmYWxzZSB9OiB7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgbGV0IHRvUmVtb3ZlOiBNW10gPSB0aGlzLm1vZGVscygpO1xuICAgIHRvUmVtb3ZlLmZvckVhY2goKG0pID0+IHtcbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKG0sIHsgc2lsZW50IH0pO1xuICAgIH0pO1xuICAgIHRoaXMuX2VudHJpZXMgPSBbXTtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgcmVtb3ZlZDogdG9SZW1vdmUgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzc2lnbihcbiAgICBvYmplY3RzOiBQYXJ0aWFsPFQ+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdIHwgTVtdLFxuICAgIHtcbiAgICAgIHJlbW92ZSA9IHRydWUsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIHJlbW92ZT86IGJvb2xlYW47XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgTW9kZWwgPSB0aGlzLl9tb2RlbDtcbiAgICBjb25zdCBvZmZzZXQgPSByZW1vdmUgPyAwIDogdGhpcy5sZW5ndGg7XG5cbiAgICBsZXQgdG9BZGQ6IFtNLCBudW1iZXJdW10gPSBbXTtcbiAgICBsZXQgdG9DaGFuZ2U6IFtNLCBudW1iZXJdW10gPSBbXTtcbiAgICBsZXQgdG9SZW1vdmU6IFtNLCBudW1iZXJdW10gPSBbXTtcbiAgICBsZXQgdG9Tb3J0OiBbTSwgbnVtYmVyXVtdID0gW107XG4gICAgbGV0IG1vZGVsTWFwOiBzdHJpbmdbXSA9IFtdO1xuICAgIG9iamVjdHMuZm9yRWFjaCgob2JqLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaXNNb2RlbCA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwob2JqKTtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gaW5kZXggKyBvZmZzZXQ7XG4gICAgICBjb25zdCBrZXkgPVxuICAgICAgICBNb2RlbCAhPT0gbnVsbCAmJiBNb2RlbC5tZXRhID8gTW9kZWwubWV0YS5yZXNvbHZlS2V5KG9iaikgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBjaWQgPVxuICAgICAgICBNb2RlbC5tZXRhLmNpZCBpbiBvYmogPyAoPGFueT5vYmopW01vZGVsLm1ldGEuY2lkXSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFRyeSBmaW5kIGVudHJ5XG4gICAgICBjb25zdCBlbnRyeSA9IGlzTW9kZWxcbiAgICAgICAgPyB0aGlzLl9maW5kRW50cnkoeyBtb2RlbDogb2JqIGFzIE0gfSkgLy8gQnkgTW9kZWxcbiAgICAgICAgOiB0aGlzLl9maW5kRW50cnkoeyBjaWQsIGtleSB9KTsgLy8gQnkgQ2lkIG9yIEtleVxuXG4gICAgICBsZXQgbW9kZWw6IE07XG4gICAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBNZXJnZVxuICAgICAgICBtb2RlbCA9IGVudHJ5Lm1vZGVsO1xuICAgICAgICBpZiAobW9kZWwgIT09IG9iaikge1xuICAgICAgICAgIC8vIEdldCBlbnRpdHkgZnJvbSBtb2RlbFxuICAgICAgICAgIGlmIChpc01vZGVsKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSAob2JqIGFzIE0pLnRvRW50aXR5KHtcbiAgICAgICAgICAgICAgY2xpZW50X2lkOiB0cnVlLFxuICAgICAgICAgICAgICAuLi5JTkNMVURFX0RFRVAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1vZGVsLmFzc2lnbihlbnRpdHksIHsgcmVzZXQsIHNpbGVudCB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaGVscGVyID0gdGhpcy5fYW5ub3RhdGlvbnMuaGVscGVyO1xuICAgICAgICAgICAgY29uc3QgYW5ub3RzID0gbmV3IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM8VD4oXG4gICAgICAgICAgICAgIGhlbHBlcixcbiAgICAgICAgICAgICAgaGVscGVyLmFubm90YXRpb25zKG9iaiksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gYW5ub3RzLmF0dHJpYnV0ZXMob2JqLCAnZnVsbCcpO1xuICAgICAgICAgICAgbW9kZWwuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgICAgICAgbW9kZWwuYXNzaWduKGVudGl0eSwgeyByZXNldCwgc2lsZW50IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBNb2RlbCBDaGFuZ2U/XG4gICAgICAgICAgaWYgKG1vZGVsLmhhc0NoYW5nZWQoKSkgdG9DaGFuZ2UucHVzaChbbW9kZWwsIHBvc2l0aW9uXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc2V0KSBlbnRyeS5zdGF0ZSA9IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQ7XG4gICAgICAgIC8vIEhhcyBTb3J0IG9yIEluZGV4IENoYW5nZT9cbiAgICAgICAgaWYgKHRvU29ydC5sZW5ndGggPiAwIHx8IHBvc2l0aW9uICE9PSB0aGlzLm1vZGVscygpLmluZGV4T2YobW9kZWwpKSB7XG4gICAgICAgICAgdG9Tb3J0LnB1c2goW21vZGVsLCBwb3NpdGlvbl0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBZGRcbiAgICAgICAgbW9kZWwgPSBpc01vZGVsXG4gICAgICAgICAgPyAob2JqIGFzIE0pXG4gICAgICAgICAgOiB0aGlzLm1vZGVsRmFjdG9yeShvYmogYXMgUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LCB7XG4gICAgICAgICAgICAgIHJlc2V0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHRvQWRkLnB1c2goW21vZGVsLCBwb3NpdGlvbl0pO1xuICAgICAgfVxuICAgICAgbW9kZWxNYXAucHVzaCgoPGFueT5tb2RlbClbTW9kZWwubWV0YS5jaWRdKTtcbiAgICB9KTtcblxuICAgIGlmIChyZW1vdmUgfHwgcmVzZXQpIHtcbiAgICAgIHRoaXMuX2VudHJpZXMuZm9yRWFjaCgoZW50cnksIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgIGlmIChtb2RlbE1hcC5pbmRleE9mKCg8YW55PmVudHJ5Lm1vZGVsKVtNb2RlbC5tZXRhLmNpZF0pID09PSAtMSlcbiAgICAgICAgICB0b1JlbW92ZS5wdXNoKFtlbnRyeS5tb2RlbCwgcG9zaXRpb25dKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHJlbW92ZSwgYWRkIGFuZCBzb3J0XG4gICAgdG9SZW1vdmUuZm9yRWFjaCgoW21vZGVsLCBwb3NpdGlvbl0pID0+IHtcbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcmVzZXQgfSk7XG4gICAgfSk7XG4gICAgdG9BZGQuZm9yRWFjaCgoW21vZGVsLCBwb3NpdGlvbl0pID0+IHtcbiAgICAgIHRoaXMuX2FkZE1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcmVzZXQsIHJlcGFyZW50LCBwb3NpdGlvbiB9KTtcbiAgICB9KTtcbiAgICB0b1NvcnQuZm9yRWFjaCgoW21vZGVsLCBwb3NpdGlvbl0pID0+IHtcbiAgICAgIHRoaXMuX21vdmVNb2RlbChtb2RlbCwgcG9zaXRpb24pO1xuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgKCFzaWxlbnQgJiZcbiAgICAgICAgKHRvQWRkLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICB0b1JlbW92ZS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgdG9DaGFuZ2UubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHRvU29ydC5sZW5ndGggPiAwKSkgfHxcbiAgICAgIHJlc2V0XG4gICAgKSB7XG4gICAgICB0aGlzLl9zb3J0QnkgPSBudWxsO1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoXG4gICAgICAgICAgcmVzZXQgPyBPRGF0YU1vZGVsRXZlbnRUeXBlLlJlc2V0IDogT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgYWRkZWQ6IHRvQWRkLFxuICAgICAgICAgICAgICByZW1vdmVkOiB0b1JlbW92ZSxcbiAgICAgICAgICAgICAgY2hhbmdlZDogdG9DaGFuZ2UsXG4gICAgICAgICAgICAgIHNvcnRlZDogdG9Tb3J0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBxdWVyeShcbiAgICBjdHg6IChxOiBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXI8VD4sIHM/OiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+KSA9PiB2b2lkLFxuICApIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICByZXNvdXJjZS5xdWVyeShjdHgpO1xuICAgIHRoaXMuYXR0YWNoKHJlc291cmNlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNhbGxGdW5jdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScgfCAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nIHwgJ25vbmUnLFxuICAgIHsgLi4ub3B0aW9ucyB9OiB7fSAmIE9EYXRhRnVuY3Rpb25PcHRpb25zPFI+ID0ge30sXG4gICk6IE9ic2VydmFibGU8UiB8IE9EYXRhTW9kZWw8Uj4gfCBPRGF0YUNvbGxlY3Rpb248UiwgT0RhdGFNb2RlbDxSPj4gfCBudWxsPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkge1xuICAgICAgY29uc3QgZnVuYyA9IHJlc291cmNlLmZ1bmN0aW9uPFAsIFI+KG5hbWUpO1xuICAgICAgZnVuYy5xdWVyeSgocSkgPT4gcS5hcHBseShvcHRpb25zKSk7XG4gICAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsTW9kZWwocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgIGBjYWxsRnVuY3Rpb246IENhbid0IGZ1bmN0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZWAsXG4gICAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIGNhbGxBY3Rpb248UCwgUj4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgcmVzcG9uc2VUeXBlOiAncHJvcGVydHknIHwgJ21vZGVsJyB8ICdjb2xsZWN0aW9uJyB8ICdub25lJyxcbiAgICB7IC4uLm9wdGlvbnMgfToge30gJiBPRGF0YUFjdGlvbk9wdGlvbnM8Uj4gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSIHwgT0RhdGFNb2RlbDxSPiB8IE9EYXRhQ29sbGVjdGlvbjxSLCBPRGF0YU1vZGVsPFI+PiB8IG51bGw+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoYGNhbGxBY3Rpb246IENhbid0IGFjdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5U2V0UmVzb3VyY2VgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGFjdGlvbiA9IHJlc291cmNlLmFjdGlvbjxQLCBSPihuYW1lKTtcbiAgICBhY3Rpb24ucXVlcnkoKHEpID0+IHEuYXBwbHkob3B0aW9ucykpO1xuICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7XG4gICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbE1vZGVsKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsQ29sbGVjdGlvbihwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdW5saW5rKGVudHJ5OiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pIHtcbiAgICBpZiAoZW50cnkuc3Vic2NyaXB0aW9uKSB7XG4gICAgICBlbnRyeS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIGVudHJ5LnN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9saW5rKGVudHJ5OiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pIHtcbiAgICBpZiAoZW50cnkuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb246IFN1YnNjcmlwdGlvbiBhbHJlYWR5IGV4aXN0cycpO1xuICAgIH1cbiAgICBlbnRyeS5zdWJzY3JpcHRpb24gPSBlbnRyeS5tb2RlbC5ldmVudHMkLnN1YnNjcmliZShcbiAgICAgIChldmVudDogT0RhdGFNb2RlbEV2ZW50PFQ+KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBCVUJCTElORy5pbmRleE9mKGV2ZW50Lm5hbWUpICE9PSAtMSAmJlxuICAgICAgICAgIGV2ZW50LmJ1YmJsaW5nICYmXG4gICAgICAgICAgIWV2ZW50LnZpc2l0ZWQodGhpcylcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGV2ZW50Lm1vZGVsID09PSBlbnRyeS5tb2RlbCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50Lm5hbWUgPT09ICdkZXN0cm95Jykge1xuICAgICAgICAgICAgICB0aGlzLnJlbW92ZU1vZGVsKGVudHJ5Lm1vZGVsLCB7IHJlc2V0OiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5uYW1lID09PSAnY2hhbmdlJyAmJiBldmVudC5vcHRpb25zPy5rZXkpIHtcbiAgICAgICAgICAgICAgZW50cnkua2V5ID0gZW50cnkubW9kZWwua2V5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1vZGVscygpLmluZGV4T2YoZW50cnkubW9kZWwpO1xuICAgICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KGV2ZW50LnB1c2godGhpcywgaW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZEVudHJ5KHtcbiAgICBtb2RlbCxcbiAgICBjaWQsXG4gICAga2V5LFxuICB9OiB7XG4gICAgbW9kZWw/OiBPRGF0YU1vZGVsPFQ+O1xuICAgIGNpZD86IHN0cmluZztcbiAgICBrZXk/OiBFbnRpdHlLZXk8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXMuZmluZCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGJ5TW9kZWwgPSBtb2RlbCAhPT0gdW5kZWZpbmVkICYmIGVudHJ5Lm1vZGVsLmVxdWFscyhtb2RlbCk7XG4gICAgICBjb25zdCBieUNpZCA9XG4gICAgICAgIGNpZCAhPT0gdW5kZWZpbmVkICYmICg8YW55PmVudHJ5Lm1vZGVsKVt0aGlzLl9tb2RlbC5tZXRhLmNpZF0gPT09IGNpZDtcbiAgICAgIGNvbnN0IGJ5S2V5ID1cbiAgICAgICAga2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZW50cnkua2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgVHlwZXMuaXNFcXVhbChlbnRyeS5rZXksIGtleSk7XG4gICAgICByZXR1cm4gYnlNb2RlbCB8fCBieUNpZCB8fCBieUtleTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIENvbGxlY3Rpb24gZnVuY3Rpb25zXG4gIGVxdWFscyhvdGhlcjogT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMgPT09IG90aGVyO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnQ29sbGVjdGlvbic7XG4gIH1cblxuICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgbGV0IHBvaW50ZXIgPSAwO1xuICAgIGxldCBtb2RlbHMgPSB0aGlzLm1vZGVscygpO1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0KCk6IEl0ZXJhdG9yUmVzdWx0PE0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkb25lOiBwb2ludGVyID09PSBtb2RlbHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHVlOiBtb2RlbHNbcG9pbnRlcisrXSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZpbHRlcihcbiAgICBwcmVkaWNhdGU6ICh2YWx1ZTogTSwgaW5kZXg6IG51bWJlciwgYXJyYXk6IE1bXSkgPT4gdW5rbm93bixcbiAgICB0aGlzQXJnPzogYW55LFxuICApOiBNW10ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG5cbiAgbWFwPFU+KFxuICAgIGNhbGxiYWNrZm46ICh2YWx1ZTogTSwgaW5kZXg6IG51bWJlciwgYXJyYXk6IE1bXSkgPT4gVSxcbiAgICB0aGlzQXJnPzogYW55LFxuICApOiBVW10ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLm1hcChjYWxsYmFja2ZuLCB0aGlzQXJnKTtcbiAgfVxuXG4gIGZpbmQoXG4gICAgcHJlZGljYXRlOiAodmFsdWU6IE0sIGluZGV4OiBudW1iZXIsIG9iajogTVtdKSA9PiB1bmtub3duLFxuICAgIHRoaXNBcmc/OiBhbnksXG4gICk6IE0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuXG4gIHJlZHVjZTxVPihcbiAgICBjYWxsYmFja2ZuOiAoXG4gICAgICBwcmV2aW91c1ZhbHVlOiBVLFxuICAgICAgY3VycmVudFZhbHVlOiBNLFxuICAgICAgY3VycmVudEluZGV4OiBudW1iZXIsXG4gICAgICBhcnJheTogTVtdLFxuICAgICkgPT4gVSxcbiAgICBpbml0aWFsVmFsdWU6IFUsXG4gICk6IFUge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLnJlZHVjZShjYWxsYmFja2ZuLCBpbml0aWFsVmFsdWUpO1xuICB9XG5cbiAgZmlyc3QoKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKClbMF07XG4gIH1cblxuICBsYXN0KCk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1vZGVscyA9IHRoaXMubW9kZWxzKCk7XG4gICAgcmV0dXJuIG1vZGVsc1ttb2RlbHMubGVuZ3RoIC0gMV07XG4gIH1cblxuICBuZXh0KG1vZGVsOiBNKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4T2YobW9kZWwpO1xuICAgIGlmIChpbmRleCA9PT0gLTEgfHwgaW5kZXggPT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGluZGV4ICsgMSk7XG4gIH1cblxuICBwcmV2KG1vZGVsOiBNKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4T2YobW9kZWwpO1xuICAgIGlmIChpbmRleCA8PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXQoaW5kZXggLSAxKTtcbiAgfVxuXG4gIGV2ZXJ5KHByZWRpY2F0ZTogKG06IE0sIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5ldmVyeShwcmVkaWNhdGUpO1xuICB9XG5cbiAgc29tZShwcmVkaWNhdGU6IChtOiBNLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuc29tZShwcmVkaWNhdGUpO1xuICB9XG5cbiAgY29udGFpbnMobW9kZWw6IE0pIHtcbiAgICByZXR1cm4gdGhpcy5zb21lKChtKSA9PiBtLmVxdWFscyhtb2RlbCkpO1xuICB9XG5cbiAgaW5kZXhPZihtb2RlbDogTSk6IG51bWJlciB7XG4gICAgY29uc3QgbW9kZWxzID0gdGhpcy5tb2RlbHMoKTtcbiAgICBjb25zdCBtID0gbW9kZWxzLmZpbmQoKG0pID0+IG0uZXF1YWxzKG1vZGVsKSk7XG4gICAgcmV0dXJuIG0gPT09IHVuZGVmaW5lZCA/IC0xIDogbW9kZWxzLmluZGV4T2YobSk7XG4gIH1cblxuICBpc0VtcHR5KCkge1xuICAgIC8vIExvY2FsIGxlbmd0aCBhbmQgaWYgZXhpc3RzIHJlbW90ZSBsZW5ndGhcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5sZW5ndGggPT09IDAgJiZcbiAgICAgIHRoaXMuYW5ub3RzKCkuY291bnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5hbm5vdHMoKS5jb3VudCA9PT0gMFxuICAgICk7XG4gIH1cblxuICAvLyNyZWdpb24gU29ydFxuICBwcml2YXRlIF9iaXNlY3QobW9kZWw6IE0pIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBpZiAodGhpcy5fc29ydEJ5ICE9PSBudWxsKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9lbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBpZiAodGhpcy5fY29tcGFyZShtb2RlbCwgdGhpcy5fZW50cmllc1tpbmRleF0sIHRoaXMuX3NvcnRCeSwgMCkgPCAwKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBhcmUoXG4gICAgZTE6IE9EYXRhTW9kZWxFbnRyeTxULCBNPiB8IE0sXG4gICAgZTI6IE9EYXRhTW9kZWxFbnRyeTxULCBNPiB8IE0sXG4gICAgYnk6IHsgZmllbGQ6IHN0cmluZyB8IGtleW9mIFQ7IG9yZGVyPzogMSB8IC0xIH1bXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICApOiBudW1iZXIge1xuICAgIGxldCBtMSA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoZTEpXG4gICAgICA/IChlMSBhcyBNKVxuICAgICAgOiAoZTEgYXMgT0RhdGFNb2RlbEVudHJ5PFQsIE0+KS5tb2RlbDtcbiAgICBsZXQgbTIgPSBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGUyKVxuICAgICAgPyAoZTIgYXMgTSlcbiAgICAgIDogKGUyIGFzIE9EYXRhTW9kZWxFbnRyeTxULCBNPikubW9kZWw7XG4gICAgbGV0IHZhbHVlMSA9IG0xLmdldChieVtpbmRleF0uZmllbGQgYXMgc3RyaW5nKTtcbiAgICBsZXQgdmFsdWUyID0gbTIuZ2V0KGJ5W2luZGV4XS5maWVsZCBhcyBzdHJpbmcpO1xuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XG5cbiAgICBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyICE9IG51bGwpIHJlc3VsdCA9IC0xO1xuICAgIGVsc2UgaWYgKHZhbHVlMSAhPSBudWxsICYmIHZhbHVlMiA9PSBudWxsKSByZXN1bHQgPSAxO1xuICAgIGVsc2UgaWYgKHZhbHVlMSA9PSBudWxsICYmIHZhbHVlMiA9PSBudWxsKSByZXN1bHQgPSAwO1xuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTEgPT0gJ3N0cmluZycgfHwgdmFsdWUxIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICBpZiAodmFsdWUxLmxvY2FsZUNvbXBhcmUgJiYgdmFsdWUxICE9IHZhbHVlMikge1xuICAgICAgICByZXR1cm4gKGJ5W2luZGV4XS5vcmRlciB8fCAxKSAqIHZhbHVlMS5sb2NhbGVDb21wYXJlKHZhbHVlMik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHZhbHVlMSA8IHZhbHVlMiA/IC0xIDogMTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUxID09IHZhbHVlMikge1xuICAgICAgcmV0dXJuIGJ5Lmxlbmd0aCAtIDEgPiBpbmRleCA/IHRoaXMuX2NvbXBhcmUoZTEsIGUyLCBieSwgaW5kZXggKyAxKSA6IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIChieVtpbmRleF0ub3JkZXIgfHwgMSkgKiByZXN1bHQ7XG4gIH1cblxuICBfc29ydEJ5OiB7IGZpZWxkOiBzdHJpbmcgfCBrZXlvZiBUOyBvcmRlcj86IDEgfCAtMSB9W10gfCBudWxsID0gbnVsbDtcbiAgaXNTb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRCeSAhPT0gbnVsbDtcbiAgfVxuXG4gIHNvcnQoXG4gICAgYnk6IHsgZmllbGQ6IHN0cmluZyB8IGtleW9mIFQ7IG9yZGVyPzogMSB8IC0xIH1bXSxcbiAgICB7IHNpbGVudCB9OiB7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLl9zb3J0QnkgPSBieTtcbiAgICB0aGlzLl9lbnRyaWVzID0gdGhpcy5fZW50cmllcy5zb3J0KFxuICAgICAgKGUxOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4sIGUyOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pID0+XG4gICAgICAgIHRoaXMuX2NvbXBhcmUoZTEsIGUyLCBieSwgMCksXG4gICAgKTtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8vI2VuZHJlZ2lvblxufVxuIl19
819
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBR0wsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBRXRCLCtCQUErQixFQUUvQixxQkFBcUIsR0FHdEIsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFDTCxZQUFZLEVBQ1osZUFBZSxFQUlmLHNCQUFzQixFQUN0QixtQkFBbUIsRUFFbkIsaUJBQWlCLEVBQ2pCLGVBQWUsR0FDaEIsTUFBTSxXQUFXLENBQUM7QUFFbkIsTUFBTSxPQUFPLGVBQWU7YUFHbkIsVUFBSyxHQUE2QixJQUFJLEFBQWpDLENBQWtDO0lBNkI5QyxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsUUFBUTthQUNqQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDLE9BQU8sQ0FBQzthQUNsRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJ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SUFBSSxDQUNoQyxDQUFDLEVBQXlCLEVBQUUsRUFBeUIsRUFBRSxFQUFFLENBQ3ZELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQy9CLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbEQ7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBERUZBVUxUX1ZFUlNJT04gfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHtcbiAgRW50aXR5S2V5LFxuICBPRGF0YUFjdGlvbk9wdGlvbnMsXG4gIE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSxcbiAgT0RhdGFGdW5jdGlvbk9wdGlvbnMsXG4gIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhT3B0aW9ucyxcbiAgT0RhdGFQcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXIsXG4gIE9EYXRhUmVzb3VyY2UsXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBPRGF0YVN0cnVjdHVyZWRUeXBlIH0gZnJvbSAnLi4vc2NoZW1hL3N0cnVjdHVyZWQtdHlwZSc7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcbmltcG9ydCB7IE9EYXRhTW9kZWwgfSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7XG4gIElOQ0xVREVfREVFUCxcbiAgSU5DTFVERV9TSEFMTE9XLFxuICBNb2RlbEZpZWxkT3B0aW9ucyxcbiAgT0RhdGFNb2RlbEVudHJ5LFxuICBPRGF0YU1vZGVsRXZlbnQsXG4gIE9EYXRhTW9kZWxFdmVudEVtaXR0ZXIsXG4gIE9EYXRhTW9kZWxFdmVudFR5cGUsXG4gIE9EYXRhTW9kZWxGaWVsZCxcbiAgT0RhdGFNb2RlbE9wdGlvbnMsXG4gIE9EYXRhTW9kZWxTdGF0ZSxcbn0gZnJvbSAnLi9vcHRpb25zJztcblxuZXhwb3J0IGNsYXNzIE9EYXRhQ29sbGVjdGlvbjxULCBNIGV4dGVuZHMgT0RhdGFNb2RlbDxUPj5cbiAgaW1wbGVtZW50cyBJdGVyYWJsZTxNPlxue1xuICBzdGF0aWMgbW9kZWw6IHR5cGVvZiBPRGF0YU1vZGVsIHwgbnVsbCA9IG51bGw7XG4gIF9wYXJlbnQ6XG4gICAgfCBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbCxcbiAgICAgIF1cbiAgICB8IG51bGwgPSBudWxsO1xuICBfcmVzb3VyY2U6XG4gICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IG51bGwgPSBudWxsO1xuICBfcmVzb3VyY2VzOiB7XG4gICAgcGFyZW50OlxuICAgICAgfCBbXG4gICAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGwsXG4gICAgICAgIF1cbiAgICAgIHwgbnVsbDtcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBudWxsO1xuICB9W10gPSBbXTtcbiAgX2Fubm90YXRpb25zITogT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPFQ+O1xuICBfZW50cmllczogT0RhdGFNb2RlbEVudHJ5PFQsIE0+W10gPSBbXTtcbiAgX21vZGVsOiB0eXBlb2YgT0RhdGFNb2RlbDtcblxuICBtb2RlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXNcbiAgICAgIC5maWx0ZXIoKGUpID0+IGUuc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKVxuICAgICAgLm1hcCgoZSkgPT4gZS5tb2RlbCk7XG4gIH1cblxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkubGVuZ3RoO1xuICB9XG5cbiAgLy9FdmVudHNcbiAgZXZlbnRzJDogT0RhdGFNb2RlbEV2ZW50RW1pdHRlcjxUPjtcbiAgY29uc3RydWN0b3IoXG4gICAgZW50aXRpZXM6IFBhcnRpYWw8VD5bXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10gPSBbXSxcbiAgICB7XG4gICAgICBwYXJlbnQsXG4gICAgICByZXNvdXJjZSxcbiAgICAgIGFubm90cyxcbiAgICAgIG1vZGVsLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBwYXJlbnQ/OiBbT0RhdGFNb2RlbDxhbnk+LCBPRGF0YU1vZGVsRmllbGQ8YW55Pl07XG4gICAgICByZXNvdXJjZT86IE9EYXRhUmVzb3VyY2U8VD4gfCBudWxsO1xuICAgICAgYW5ub3RzPzogT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPFQ+O1xuICAgICAgbW9kZWw/OiB0eXBlb2YgT0RhdGFNb2RlbDtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IEtsYXNzID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT0RhdGFDb2xsZWN0aW9uO1xuICAgIGlmICghbW9kZWwgJiYgS2xhc3MubW9kZWwgIT09IG51bGwpIG1vZGVsID0gS2xhc3MubW9kZWw7XG4gICAgaWYgKCFtb2RlbCkgdGhyb3cgbmV3IEVycm9yKCdDb2xsZWN0aW9uOiBDb2xsZWN0aW9uIG5lZWQgbW9kZWwnKTtcblxuICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG5cbiAgICAvLyBFdmVudHNcbiAgICB0aGlzLmV2ZW50cyQgPSBuZXcgT0RhdGFNb2RlbEV2ZW50RW1pdHRlcjxUPih7IGNvbGxlY3Rpb246IHRoaXMgfSk7XG4gICAgdGhpcy5ldmVudHMkLnN1YnNjcmliZSgoZSkgPT4gbW9kZWwhLm1ldGEuZXZlbnRzJC5lbWl0KGUpKTtcblxuICAgIC8vIFBhcmVudFxuICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIC8vIFJlc291cmNlXG4gICAgaWYgKHRoaXMuX3BhcmVudCA9PT0gbnVsbCAmJiAhcmVzb3VyY2UpXG4gICAgICByZXNvdXJjZSA9IHRoaXMuX21vZGVsLm1ldGEuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeSgpIGFzXG4gICAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlc291cmNlKSB7XG4gICAgICB0aGlzLmF0dGFjaChcbiAgICAgICAgcmVzb3VyY2UgYXNcbiAgICAgICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQW5ub3RhdGlvbnNcbiAgICB0aGlzLl9hbm5vdGF0aW9ucyA9XG4gICAgICBhbm5vdHMgfHxcbiAgICAgIG5ldyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMoXG4gICAgICAgIE9EYXRhSGVscGVyW3Jlc291cmNlPy5hcGk/Lm9wdGlvbnMudmVyc2lvbiB8fCBERUZBVUxUX1ZFUlNJT05dLFxuICAgICAgKTtcblxuICAgIGVudGl0aWVzID0gZW50aXRpZXMgfHwgW107XG4gICAgdGhpcy5hc3NpZ24oZW50aXRpZXMsIHsgcmVzZXQgfSk7XG4gIH1cblxuICBpc1BhcmVudE9mKFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hpbGQgIT09IHRoaXMgJiZcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmNoYWluKGNoaWxkKS5zb21lKChwKSA9PiBwWzBdID09PSB0aGlzKVxuICAgICk7XG4gIH1cblxuICByZXNvdXJjZSgpOlxuICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBudWxsIHtcbiAgICByZXR1cm4gT0RhdGFNb2RlbE9wdGlvbnMucmVzb3VyY2U8VD4odGhpcykgYXNcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBudWxsO1xuICB9XG5cbiAgcHVzaFJlc291cmNlKFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IG51bGwsXG4gICkge1xuICAgIC8vIFB1c2ggY3VycmVudCBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgdGhpcy5fcmVzb3VyY2VzLnB1c2goeyBwYXJlbnQ6IHRoaXMuX3BhcmVudCwgcmVzb3VyY2U6IHRoaXMuX3Jlc291cmNlIH0pO1xuICAgIC8vIFJlcGxhY2UgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIHRoaXMuX3BhcmVudCA9IG51bGw7XG4gICAgdGhpcy5fcmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgfVxuXG4gIHBvcFJlc291cmNlKCkge1xuICAgIC8vIFBvcCBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgY29uc3QgcG9wID0gdGhpcy5fcmVzb3VyY2VzLnBvcCgpO1xuICAgIGlmIChwb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHsgcGFyZW50OiB0aGlzLl9wYXJlbnQsIHJlc291cmNlOiB0aGlzLl9yZXNvdXJjZSB9O1xuICAgICAgdGhpcy5fcGFyZW50ID0gcG9wLnBhcmVudDtcbiAgICAgIHRoaXMuX3Jlc291cmNlID0gcG9wLnJlc291cmNlO1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBhdHRhY2goXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD4sXG4gICkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX3Jlc291cmNlICE9PSBudWxsICYmXG4gICAgICB0aGlzLl9yZXNvdXJjZS50eXBlKCkgIT09IHJlc291cmNlLnR5cGUoKSAmJlxuICAgICAgIXRoaXMuX3Jlc291cmNlLmlzU3VidHlwZU9mKHJlc291cmNlKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGF0dGFjaDogQ2FuJ3QgcmVhdHRhY2ggJHt0aGlzLl9yZXNvdXJjZS50eXBlKCl9IHRvICR7cmVzb3VyY2UudHlwZSgpfWAsXG4gICAgICApO1xuXG4gICAgdGhpcy5fZW50cmllcy5mb3JFYWNoKCh7IG1vZGVsIH0pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsUmVzb3VyY2UgPSB0aGlzLl9tb2RlbC5tZXRhLm1vZGVsUmVzb3VyY2VGYWN0b3J5KFxuICAgICAgICByZXNvdXJjZS5jbG9uZVF1ZXJ5PFQ+KCksXG4gICAgICApIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD47XG4gICAgICBpZiAobW9kZWxSZXNvdXJjZSAhPT0gdW5kZWZpbmVkKSBtb2RlbC5hdHRhY2gobW9kZWxSZXNvdXJjZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fcmVzb3VyY2U7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgIWN1cnJlbnQuaXNFcXVhbFRvKHJlc291cmNlKSkge1xuICAgICAgdGhpcy5fcmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuQXR0YWNoLCB7XG4gICAgICAgIHByZXZpb3VzOiBjdXJyZW50LFxuICAgICAgICB2YWx1ZTogcmVzb3VyY2UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgd2l0aFJlc291cmNlPFI+KFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IG51bGwsXG4gICAgY3R4OiAoY29sbGVjdGlvbjogdGhpcykgPT4gUixcbiAgKTogUiB7XG4gICAgLy8gUHVzaFxuICAgIHRoaXMucHVzaFJlc291cmNlKHJlc291cmNlKTtcbiAgICAvLyBFeGVjdXRlXG4gICAgY29uc3QgcmVzdWx0ID0gY3R4KHRoaXMpO1xuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICByZXR1cm4gKHJlc3VsdCBhcyBhbnkpLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5wb3BSZXNvdXJjZSgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBvcFxuICAgICAgdGhpcy5wb3BSZXNvdXJjZSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICBhc0VudGl0eVNldDxSPihjdHg6IChjb2xsZWN0aW9uOiB0aGlzKSA9PiBSKTogUiB7XG4gICAgLy8gQnVpbGQgbmV3IHJlc291cmNlXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLl9tb2RlbC5tZXRhLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoXG4gICAgICB0aGlzLl9yZXNvdXJjZT8uY2xvbmVRdWVyeTxUPigpLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMud2l0aFJlc291cmNlKHJlc291cmNlLCBjdHgpO1xuICB9XG5cbiAgYW5ub3RzKCkge1xuICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgbW9kZWxGYWN0b3J5KFxuICAgIGRhdGE6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7IHJlc2V0ID0gZmFsc2UgfTogeyByZXNldD86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBNIHtcbiAgICBsZXQgTW9kZWwgPSB0aGlzLl9tb2RlbDtcbiAgICBjb25zdCBhbm5vdHMgPSBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyh0aGlzLl9hbm5vdGF0aW9ucy5oZWxwZXIpO1xuICAgIGFubm90cy51cGRhdGUoZGF0YSk7XG5cbiAgICBpZiAoYW5ub3RzPy50eXBlICE9PSB1bmRlZmluZWQgJiYgTW9kZWwubWV0YSAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc2NoZW1hID0gTW9kZWwubWV0YS5maW5kQ2hpbGRPcHRpb25zKChvKSA9PlxuICAgICAgICBvLmlzVHlwZU9mKGFubm90cy50eXBlIGFzIHN0cmluZyksXG4gICAgICApPy5zY2hlbWE7XG4gICAgICBpZiAoc2NoZW1hICE9PSB1bmRlZmluZWQgJiYgc2NoZW1hLm1vZGVsICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC8vIENoYW5nZSB0byBjaGlsZCBtb2RlbFxuICAgICAgICBNb2RlbCA9IHNjaGVtYS5tb2RlbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1vZGVsKGRhdGEsIHtcbiAgICAgIGFubm90cyxcbiAgICAgIHJlc2V0LFxuICAgICAgcGFyZW50OiBbdGhpcywgbnVsbF0sXG4gICAgfSkgYXMgTTtcbiAgfVxuXG4gIHRvRW50aXRpZXMoe1xuICAgIGNsaWVudF9pZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9rZXkgPSB0cnVlLFxuICAgIGluY2x1ZGVfaWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX25vbl9maWVsZCA9IGZhbHNlLFxuICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICBjaGFpbiA9IFtdLFxuICB9OiB7XG4gICAgY2xpZW50X2lkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfa2V5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2lkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgY2hhbmdlc19vbmx5PzogYm9vbGVhbjtcbiAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgICBjaGFpbj86IChPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVtdO1xuICB9ID0ge30pOiAoUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9KVtdIHtcbiAgICByZXR1cm4gdGhpcy5fZW50cmllc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHsgbW9kZWwsIHN0YXRlIH0pID0+XG4gICAgICAgICAgc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkICYmIGNoYWluLmV2ZXJ5KChjKSA9PiBjICE9PSBtb2RlbCksXG4gICAgICApXG4gICAgICAubWFwKCh7IG1vZGVsLCBzdGF0ZSB9KSA9PiB7XG4gICAgICAgIHZhciBjaGFuZ2VzT25seSA9IGNoYW5nZXNfb25seSAmJiBzdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLkFkZGVkO1xuICAgICAgICByZXR1cm4gbW9kZWwudG9FbnRpdHkoe1xuICAgICAgICAgIGNsaWVudF9pZCxcbiAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgICAgIGluY2x1ZGVfa2V5LFxuICAgICAgICAgIGluY2x1ZGVfaWQsXG4gICAgICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgICAgICBjaGFuZ2VzX29ubHk6IGNoYW5nZXNPbmx5LFxuICAgICAgICAgIGNoYWluOiBbdGhpcywgLi4uY2hhaW5dLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgdG9Kc29uKCkge1xuICAgIHJldHVybiB0aGlzLnRvRW50aXRpZXMoKTtcbiAgfVxuXG4gIGhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfTogeyBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9lbnRyaWVzLnNvbWUoKGUpID0+IGUuc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQpIHx8XG4gICAgICB0aGlzLm1vZGVscygpLnNvbWUoKG0pID0+IG0uaGFzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9KSlcbiAgICApO1xuICB9XG5cbiAgY2xvbmU8QyBleHRlbmRzIE9EYXRhQ29sbGVjdGlvbjxULCBNPj4oKSB7XG4gICAgY29uc3QgQ3RvciA9IDx0eXBlb2YgT0RhdGFDb2xsZWN0aW9uPnRoaXMuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIG5ldyBDdG9yKHRoaXMudG9FbnRpdGllcyhJTkNMVURFX1NIQUxMT1cpLCB7XG4gICAgICByZXNvdXJjZTogdGhpcy5yZXNvdXJjZSgpLFxuICAgICAgYW5ub3RzOiB0aGlzLmFubm90cygpLFxuICAgIH0pIGFzIEM7XG4gIH1cblxuICBwcml2YXRlIF9yZXF1ZXN0PFQsIFI+KFxuICAgIG9icyQ6IE9ic2VydmFibGU8VD4sXG4gICAgbWFwQ2FsbGJhY2s6IChyZXNwb25zZTogVCkgPT4gUixcbiAgKTogT2JzZXJ2YWJsZTxSPiB7XG4gICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXF1ZXN0LCB7XG4gICAgICBvcHRpb25zOiB7IG9ic2VydmFibGU6IG9icyQgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gb2JzJC5waXBlKFxuICAgICAgbWFwKChyZXNwb25zZSkgPT4gbWFwQ2FsbGJhY2socmVzcG9uc2UpKSxcbiAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuU3luYykpLFxuICAgICk7XG4gIH1cblxuICBmZXRjaCh7XG4gICAgd2l0aENvdW50LFxuICAgIHJlbW92ZSxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICByZW1vdmU/OiBib29sZWFuO1xuICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8TVtdPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCFyZXNvdXJjZSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignZmV0Y2hNYW55OiBSZXNvdXJjZSBpcyBudWxsJykpO1xuXG4gICAgY29uc3Qgb2JzJCA9XG4gICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2VcbiAgICAgICAgPyByZXNvdXJjZS5mZXRjaCh7IHdpdGhDb3VudCwgLi4ub3B0aW9ucyB9KVxuICAgICAgICA6IHJlc291cmNlLmZldGNoKHtcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2VudGl0aWVzJyxcbiAgICAgICAgICAgIHdpdGhDb3VudCxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkLCAoeyBlbnRpdGllcywgYW5ub3RzIH0pID0+IHtcbiAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgY29uc3QgbW9kZWxzID0gKGVudGl0aWVzIHx8IFtdKS5tYXAoXG4gICAgICAgIChlbnRpdHkpID0+IHRoaXMubW9kZWxGYWN0b3J5KGVudGl0eSwgeyByZXNldDogdHJ1ZSB9KSBhcyBNLFxuICAgICAgKSBhcyBNW107XG4gICAgICB0aGlzLmFzc2lnbihtb2RlbHMsIHsgcmVzZXQ6IHRydWUsIHJlbW92ZTogcmVtb3ZlID8/IHRydWUgfSk7XG4gICAgICByZXR1cm4gbW9kZWxzO1xuICAgIH0pO1xuICB9XG5cbiAgZmV0Y2hBbGwoe1xuICAgIHdpdGhDb3VudCxcbiAgICByZW1vdmUsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPE1bXT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghcmVzb3VyY2UpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ2ZldGNoTWFueTogUmVzb3VyY2UgaXMgbnVsbCcpKTtcblxuICAgIGNvbnN0IG9icyQgPSByZXNvdXJjZS5mZXRjaEFsbCh7IHdpdGhDb3VudCwgLi4ub3B0aW9ucyB9KTtcblxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsICh7IGVudGl0aWVzLCBhbm5vdHMgfSkgPT4ge1xuICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdHM7XG4gICAgICBjb25zdCBtb2RlbHMgPSAoZW50aXRpZXMgfHwgW10pLm1hcChcbiAgICAgICAgKGVudGl0eSkgPT4gdGhpcy5tb2RlbEZhY3RvcnkoZW50aXR5LCB7IHJlc2V0OiB0cnVlIH0pIGFzIE0sXG4gICAgICApIGFzIE1bXTtcbiAgICAgIHRoaXMuYXNzaWduKG1vZGVscywgeyByZXNldDogdHJ1ZSwgcmVtb3ZlOiByZW1vdmUgPz8gdHJ1ZSB9KTtcbiAgICAgIHJldHVybiBtb2RlbHM7XG4gICAgfSk7XG4gIH1cblxuICBmZXRjaE1hbnkoXG4gICAgdG9wOiBudW1iZXIsXG4gICAge1xuICAgICAgd2l0aENvdW50LFxuICAgICAgcmVtb3ZlLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIHJlbW92ZT86IGJvb2xlYW47XG4gICAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxNW10+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIXJlc291cmNlKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdmZXRjaE1hbnk6IFJlc291cmNlIGlzIG51bGwnKSk7XG5cbiAgICByZXNvdXJjZS5xdWVyeSgocSkgPT5cbiAgICAgIHJlbW92ZSB8fCB0aGlzLmxlbmd0aCA9PSAwID8gcS5za2lwKCkuY2xlYXIoKSA6IHEuc2tpcCh0aGlzLmxlbmd0aCksXG4gICAgKTtcblxuICAgIGNvbnN0IG9icyQgPSByZXNvdXJjZS5mZXRjaE1hbnkodG9wLCB7IHdpdGhDb3VudCwgLi4ub3B0aW9ucyB9KTtcblxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsICh7IGVudGl0aWVzLCBhbm5vdHMgfSkgPT4ge1xuICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdHM7XG4gICAgICBjb25zdCBtb2RlbHMgPSAoZW50aXRpZXMgfHwgW10pLm1hcChcbiAgICAgICAgKGVudGl0eSkgPT4gdGhpcy5tb2RlbEZhY3RvcnkoZW50aXR5LCB7IHJlc2V0OiB0cnVlIH0pIGFzIE0sXG4gICAgICApIGFzIE1bXTtcbiAgICAgIHRoaXMuYXNzaWduKG1vZGVscywgeyByZXNldDogdHJ1ZSwgcmVtb3ZlOiByZW1vdmUgPz8gZmFsc2UgfSk7XG4gICAgICByZXR1cm4gbW9kZWxzO1xuICAgIH0pO1xuICB9XG5cbiAgZmV0Y2hPbmUoe1xuICAgIHdpdGhDb3VudCxcbiAgICByZW1vdmUsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5mZXRjaE1hbnkoMSwgeyB3aXRoQ291bnQsIHJlbW92ZSwgLi4ub3B0aW9ucyB9KS5waXBlKFxuICAgICAgbWFwKChtb2RlbHMpID0+IG1vZGVsc1swXSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGFsbCBtb2RlbHMgaW4gdGhlIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIHJlbE1vZGVsIFRoZSBtb2RlbCBpcyByZWxhdGlvbnNoaXBcbiAgICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIHVzZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBIdHRwT3B0aW9uc1xuICAgKi9cbiAgc2F2ZSh7XG4gICAgcmVsTW9kZWwgPSBmYWxzZSxcbiAgICBtZXRob2QsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgcmVsTW9kZWw/OiBib29sZWFuO1xuICAgIG1ldGhvZD86ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhUHJvcGVydHlSZXNvdXJjZSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PiBuZXcgRXJyb3IoJ3NhdmU6IFJlc291cmNlIGlzIE9EYXRhUHJvcGVydHlSZXNvdXJjZScpLFxuICAgICAgKTtcblxuICAgIGNvbnN0IHRvRGVzdHJveUVudGl0eTogTVtdID0gW107XG4gICAgY29uc3QgdG9SZW1vdmVSZWZlcmVuY2U6IE1bXSA9IFtdO1xuICAgIGNvbnN0IHRvRGVzdHJveUNvbnRhaW5lZDogTVtdID0gW107XG4gICAgY29uc3QgdG9DcmVhdGVFbnRpdHk6IE1bXSA9IFtdO1xuICAgIGNvbnN0IHRvQWRkUmVmZXJlbmNlOiBNW10gPSBbXTtcbiAgICBjb25zdCB0b0NyZWF0ZUNvbnRhaW5lZDogTVtdID0gW107XG4gICAgY29uc3QgdG9VcGRhdGVFbnRpdHk6IE1bXSA9IFtdO1xuICAgIGNvbnN0IHRvVXBkYXRlQ29udGFpbmVkOiBNW10gPSBbXTtcblxuICAgIHRoaXMuX2VudHJpZXMuZm9yRWFjaCgoeyBtb2RlbCwgc3RhdGUgfSkgPT4ge1xuICAgICAgaWYgKHN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgICBpZiAocmVsTW9kZWwpIHtcbiAgICAgICAgICB0b0Rlc3Ryb3lFbnRpdHkucHVzaChtb2RlbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW1vZGVsLmlzTmV3KCkpIHtcbiAgICAgICAgICB0b1JlbW92ZVJlZmVyZW5jZS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b0Rlc3Ryb3lDb250YWluZWQucHVzaChtb2RlbCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCkge1xuICAgICAgICBpZiAocmVsTW9kZWwpIHtcbiAgICAgICAgICB0b0NyZWF0ZUVudGl0eS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIGlmICghbW9kZWwuaXNOZXcoKSkge1xuICAgICAgICAgIHRvQWRkUmVmZXJlbmNlLnB1c2gobW9kZWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvQ3JlYXRlQ29udGFpbmVkLnB1c2gobW9kZWwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vZGVsLmhhc0NoYW5nZWQoKSkge1xuICAgICAgICB0b1VwZGF0ZUVudGl0eS5wdXNoKG1vZGVsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICB0b0Rlc3Ryb3lFbnRpdHkubGVuZ3RoID4gMCB8fFxuICAgICAgdG9SZW1vdmVSZWZlcmVuY2UubGVuZ3RoID4gMCB8fFxuICAgICAgdG9EZXN0cm95Q29udGFpbmVkLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQ3JlYXRlRW50aXR5Lmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQWRkUmVmZXJlbmNlLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQ3JlYXRlQ29udGFpbmVkLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvVXBkYXRlRW50aXR5Lmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvVXBkYXRlQ29udGFpbmVkLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IG9icyQgPSBmb3JrSm9pbihbXG4gICAgICAgIC4uLnRvRGVzdHJveUVudGl0eS5tYXAoKG0pID0+IG0uYXNFbnRpdHkoKGUpID0+IGUuZGVzdHJveShvcHRpb25zKSkpLFxuICAgICAgICAuLi50b1JlbW92ZVJlZmVyZW5jZS5tYXAoKG0pID0+IHRoaXMucmVtb3ZlUmVmZXJlbmNlKG0sIG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9EZXN0cm95Q29udGFpbmVkLm1hcCgobSkgPT4gbS5kZXN0cm95KG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9DcmVhdGVFbnRpdHkubWFwKChtKSA9PlxuICAgICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUuc2F2ZSh7IG1ldGhvZDogJ2NyZWF0ZScsIC4uLm9wdGlvbnMgfSkpLFxuICAgICAgICApLFxuICAgICAgICAuLi50b0FkZFJlZmVyZW5jZS5tYXAoKG0pID0+IHRoaXMuYWRkUmVmZXJlbmNlKG0sIG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9DcmVhdGVDb250YWluZWQubWFwKChtKSA9PlxuICAgICAgICAgIG0uc2F2ZSh7IG1ldGhvZDogJ2NyZWF0ZScsIC4uLm9wdGlvbnMgfSksXG4gICAgICAgICksXG4gICAgICAgIC4uLnRvVXBkYXRlRW50aXR5Lm1hcCgobSkgPT5cbiAgICAgICAgICBtLmFzRW50aXR5KChlKSA9PiBlLnNhdmUoeyBtZXRob2QsIC4uLm9wdGlvbnMgfSkpLFxuICAgICAgICApLFxuICAgICAgICAuLi50b1VwZGF0ZUNvbnRhaW5lZC5tYXAoKG0pID0+IG0uc2F2ZSh7IG1ldGhvZCwgLi4ub3B0aW9ucyB9KSksXG4gICAgICBdKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsICgpID0+IHtcbiAgICAgICAgdGhpcy5fZW50cmllcyA9IHRoaXMuX2VudHJpZXNcbiAgICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKVxuICAgICAgICAgIC5tYXAoKGVudHJ5KSA9PiAoeyAuLi5lbnRyeSwgc3RhdGU6IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQgfSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb2YodGhpcyk7XG4gIH1cblxuICBwcml2YXRlIGFkZFJlZmVyZW5jZShtb2RlbDogTSwgb3B0aW9ucz86IE9EYXRhT3B0aW9ucyk6IE9ic2VydmFibGU8TT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghbW9kZWwuaXNOZXcoKSAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UpIHtcbiAgICAgIHJldHVybiByZXNvdXJjZVxuICAgICAgICAucmVmZXJlbmNlKClcbiAgICAgICAgLmFkZChcbiAgICAgICAgICBtb2RlbC5hc0VudGl0eSgoZSkgPT4gZS5yZXNvdXJjZSgpKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+LFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgIClcbiAgICAgICAgLnBpcGUobWFwKCgpID0+IG1vZGVsKSk7XG4gICAgfVxuICAgIHJldHVybiBvZihtb2RlbCk7XG4gIH1cblxuICBwcml2YXRlIF9hZGRNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgbWVyZ2UgPSBmYWxzZSxcbiAgICAgIHBvc2l0aW9uLFxuICAgIH06IHtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBtZXJnZT86IGJvb2xlYW47XG4gICAgICBwb3NpdGlvbj86IG51bWJlcjtcbiAgICB9ID0ge30sXG4gICk6IE0ge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsLmtleSgpO1xuICAgIGxldCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7XG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIGNpZDogKDxhbnk+bW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSxcbiAgICB9KTtcbiAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCAmJiBlbnRyeS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIGlmIChtZXJnZSkge1xuICAgICAgICBlbnRyeS5tb2RlbC5hc3NpZ24obW9kZWwudG9FbnRpdHkoKSBhcyBUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyeS5tb2RlbDtcbiAgICB9XG5cbiAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCAmJiBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZW50cmllcy5pbmRleE9mKGVudHJ5KTtcbiAgICAgIHRoaXMuX2VudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgRW50cnlcbiAgICBlbnRyeSA9IHtcbiAgICAgIHN0YXRlOiByZXNldCA/IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQgOiBPRGF0YU1vZGVsU3RhdGUuQWRkZWQsXG4gICAgICBtb2RlbCxcbiAgICAgIGtleTogbW9kZWwua2V5KCksXG4gICAgfTtcbiAgICAvLyBTZXQgUGFyZW50XG4gICAgaWYgKHJlcGFyZW50KSBtb2RlbC5fcGFyZW50ID0gW3RoaXMsIG51bGxdO1xuXG4gICAgLy8gU3Vic2NyaWJlXG4gICAgdGhpcy5fbGluayhlbnRyeSk7XG5cbiAgICAvLyBJZiBwb3NpdGlvbiBpcyB1bmRlZmluZWQgYW5kIHRoZSBjb2xsZWN0aW9uIGlzIHNvcnRlZCwgZmluZCB0aGUgcmlnaHQgcG9zaXRpb25cbiAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCAmJiB0aGlzLl9zb3J0QnkgIT09IG51bGwpIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9lbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBpZiAodGhpcy5fY29tcGFyZShtb2RlbCwgdGhpcy5fZW50cmllc1tpbmRleF0sIHRoaXMuX3NvcnRCeSwgMCkgPCAwKSB7XG4gICAgICAgICAgcG9zaXRpb24gPSBpbmRleDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vdyBhZGRcbiAgICBpZiAocG9zaXRpb24gIT09IHVuZGVmaW5lZCkgdGhpcy5fZW50cmllcy5zcGxpY2UocG9zaXRpb24sIDAsIGVudHJ5KTtcbiAgICBlbHNlIHRoaXMuX2VudHJpZXMucHVzaChlbnRyeSk7XG5cbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgbW9kZWwuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuQWRkLCB7IGNvbGxlY3Rpb246IHRoaXMgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICB9XG5cbiAgYWRkKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgICBtZXJnZSA9IGZhbHNlLFxuICAgICAgcG9zaXRpb24sXG4gICAgICByZXNldCxcbiAgICB9OiB7XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgc2VydmVyPzogYm9vbGVhbjtcbiAgICAgIG1lcmdlPzogYm9vbGVhbjtcbiAgICAgIHBvc2l0aW9uPzogbnVtYmVyO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxNPiB7XG4gICAgY29uc3QgX2FkZE1vZGVsID0gKG06IE0sIHJlc2V0OiBib29sZWFuKSA9PlxuICAgICAgdGhpcy5fYWRkTW9kZWwobSwgeyBzaWxlbnQsIHBvc2l0aW9uLCBtZXJnZSwgcmVwYXJlbnQsIHJlc2V0IH0pO1xuICAgIHJldHVybiBzZXJ2ZXJcbiAgICAgID8gdGhpcy5fcmVxdWVzdCh0aGlzLmFkZFJlZmVyZW5jZShtb2RlbCksIChtb2RlbCkgPT5cbiAgICAgICAgICBfYWRkTW9kZWwobW9kZWwsIHJlc2V0ID8/IHRydWUpLFxuICAgICAgICApXG4gICAgICA6IG9mKF9hZGRNb2RlbChtb2RlbCwgcmVzZXQgPz8gZmFsc2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUmVmZXJlbmNlKG1vZGVsOiBNLCBvcHRpb25zPzogT0RhdGFPcHRpb25zKTogT2JzZXJ2YWJsZTxNPiB7XG4gICAgbGV0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghbW9kZWwuaXNOZXcoKSAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgIHRoaXMuX21vZGVsLm1ldGEuYXBpLm9wdGlvbnMuZGVsZXRlUmVmQnkgPT09ICdpZCdcbiAgICAgICAgICA/IChtb2RlbC5hc0VudGl0eSgoZSkgPT4gZS5yZXNvdXJjZSgpKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHRoaXMuX21vZGVsLm1ldGEuYXBpLm9wdGlvbnMuZGVsZXRlUmVmQnkgPT09ICdwYXRoJykge1xuICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlLmtleShtb2RlbC5rZXkoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb3VyY2VcbiAgICAgICAgLnJlZmVyZW5jZSgpXG4gICAgICAgIC5yZW1vdmUodGFyZ2V0LCBvcHRpb25zKVxuICAgICAgICAucGlwZShtYXAoKCkgPT4gbW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIG9mKG1vZGVsKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZU1vZGVsKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHJlc2V0PzogYm9vbGVhbiB9ID0ge30sXG4gICk6IE0ge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsLmtleSgpO1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fZmluZEVudHJ5KHtcbiAgICAgIG1vZGVsLFxuICAgICAga2V5LFxuICAgICAgY2lkOiAoPGFueT5tb2RlbClbdGhpcy5fbW9kZWwubWV0YS5jaWRdLFxuICAgIH0pO1xuICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkIHx8IGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH1cblxuICAgIC8vIE5vdyByZW1vdmVcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2VudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgdGhpcy5fZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmICghKHJlc2V0IHx8IGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQWRkZWQpKSB7XG4gICAgICAvLyBNb3ZlIHRvIGVuZCBvZiBhcnJheSBhbmQgbWFyayBhcyByZW1vdmVkXG4gICAgICBlbnRyeS5zdGF0ZSA9IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkO1xuICAgICAgdGhpcy5fZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIEV2ZW50XG4gICAgaWYgKCFzaWxlbnQpXG4gICAgICBtb2RlbC5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5SZW1vdmUsIHsgY29sbGVjdGlvbjogdGhpcyB9KTtcblxuICAgIHRoaXMuX3VubGluayhlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyByZXNldD86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBNIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5fcmVtb3ZlTW9kZWwobW9kZWwsIHsgc2lsZW50LCByZXNldCB9KTtcbiAgICBpZiAoIXNpbGVudCAmJiByZW1vdmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuVXBkYXRlLCB7XG4gICAgICAgIG9wdGlvbnM6IHsgYWRkZWQ6IFtdLCByZW1vdmVkOiBbcmVtb3ZlZF0sIG1lcmdlZDogW10gfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVtb3ZlZDtcbiAgfVxuXG4gIHJlbW92ZShcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgICByZXNldCxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHNlcnZlcj86IGJvb2xlYW47IHJlc2V0PzogYm9vbGVhbiB9ID0ge30sXG4gICk6IE9ic2VydmFibGU8TT4ge1xuICAgIGNvbnN0IF9yZW1vdmVNb2RlbCA9IChtOiBNLCByZXNldDogYm9vbGVhbikgPT5cbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKG0sIHsgc2lsZW50LCByZXNldCB9KTtcbiAgICByZXR1cm4gc2VydmVyXG4gICAgICA/IHRoaXMuX3JlcXVlc3QodGhpcy5yZW1vdmVSZWZlcmVuY2UobW9kZWwpLCAobW9kZWwpID0+XG4gICAgICAgICAgX3JlbW92ZU1vZGVsKG1vZGVsLCByZXNldCA/PyB0cnVlKSxcbiAgICAgICAgKVxuICAgICAgOiBvZihfcmVtb3ZlTW9kZWwobW9kZWwsIHJlc2V0ID8/IGZhbHNlKSk7XG4gIH1cblxuICBwcml2YXRlIF9tb3ZlTW9kZWwobW9kZWw6IE0sIHBvc2l0aW9uOiBudW1iZXIpOiBNIHtcbiAgICBjb25zdCBrZXkgPSBtb2RlbC5rZXkoKTtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7XG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIGNpZDogKDxhbnk+bW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSxcbiAgICB9KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG5cbiAgICAvLyBOb3cgcmVtb3ZlXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuICAgIHRoaXMuX2VudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShwb3NpdGlvbiwgMCwgZW50cnkpO1xuXG4gICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICB9XG5cbiAgY3JlYXRlKFxuICAgIGF0dHJzOiBUID0ge30gYXMgVCxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyBzZXJ2ZXI/OiBib29sZWFuIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsRmFjdG9yeShhdHRycyk7XG4gICAgcmV0dXJuIChtb2RlbC5pc1ZhbGlkKCkgJiYgc2VydmVyID8gbW9kZWwuc2F2ZSgpIDogb2YobW9kZWwpKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChtb2RlbCkgPT4gdGhpcy5hZGQobW9kZWwsIHsgc2lsZW50LCBzZXJ2ZXIgfSkpLFxuICAgICAgbWFwKCgpID0+IG1vZGVsKSxcbiAgICApO1xuICB9XG5cbiAgc2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCB2YWx1ZTogYW55LCB7fToge30gJiBNb2RlbEZpZWxkT3B0aW9ucykge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9lbnRyaWVzW051bWJlcihwYXRoQXJyYXlbMF0pXS5tb2RlbDtcbiAgICAgIHJldHVybiBtb2RlbC5zZXQocGF0aEFycmF5LnNsaWNlKDEpLCB2YWx1ZSwge30pO1xuICAgIH1cbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgY29uc3QgdG9BZGQ6IE1bXSA9IFtdO1xuICAgICAgY29uc3QgdG9DaGFuZ2U6IE1bXSA9IFtdO1xuICAgICAgY29uc3QgdG9SZW1vdmU6IE1bXSA9IFtdO1xuICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIocGF0aEFycmF5WzBdKTtcbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbHMoKVtpbmRleF07XG4gICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7IG1vZGVsIH0pO1xuICAgICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9UT0RPOiBSZW1vdmUvQWRkIG9yIE1lcmdlP1xuICAgICAgICAvLyBNZXJnZVxuICAgICAgICBlbnRyeS5tb2RlbC5hc3NpZ24oXG4gICAgICAgICAgdmFsdWUudG9FbnRpdHkoeyBjbGllbnRfaWQ6IHRydWUsIC4uLklOQ0xVREVfREVFUCB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGVudHJ5Lm1vZGVsLmhhc0NoYW5nZWQoKSkgdG9DaGFuZ2UucHVzaChtb2RlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBZGRcbiAgICAgICAgdGhpcy5fYWRkTW9kZWwodmFsdWUsIHsgcmVwYXJlbnQ6IHRydWUgfSk7XG4gICAgICAgIHRvQWRkLnB1c2gobW9kZWwpO1xuICAgICAgfVxuICAgICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsIHtcbiAgICAgICAgb3B0aW9uczogeyBhZGRlZDogdG9BZGQsIHJlbW92ZWQ6IHRvUmVtb3ZlLCBjaGFuZ2VkOiB0b0NoYW5nZSB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0KHBhdGg6IG51bWJlcik6IE0gfCB1bmRlZmluZWQ7XG4gIGdldChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSk6IGFueTtcbiAgZ2V0KHBhdGg6IGFueSk6IGFueSB7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiBgJHtwYXRofWAubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubW9kZWxzKClbTnVtYmVyKHBhdGhBcnJheVswXSldO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLmdldChwYXRoQXJyYXkuc2xpY2UoMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBoYXMocGF0aDogbnVtYmVyIHwgc3RyaW5nIHwgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IGAke3BhdGh9YC5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1vZGVscygpW051bWJlcihwYXRoQXJyYXlbMF0pXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDEgJiYgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5oYXMocGF0aEFycmF5LnNsaWNlKDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICByZXNldCh7XG4gICAgcGF0aCxcbiAgICBzaWxlbnQgPSBmYWxzZSxcbiAgfTogeyBwYXRoPzogc3RyaW5nIHwgc3RyaW5nW107IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgbGV0IHRvQWRkOiBPRGF0YU1vZGVsRW50cnk8VCwgTT5bXSA9IFtdO1xuICAgIGxldCB0b0NoYW5nZTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+W10gPSBbXTtcbiAgICBsZXQgdG9SZW1vdmU6IE9EYXRhTW9kZWxFbnRyeTxULCBNPltdID0gW107XG5cbiAgICBpZiAocGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBSZXNldCBieSBwYXRoXG4gICAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogYCR7cGF0aH1gLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICAgKSBhcyBhbnlbXTtcbiAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKHBhdGhBcnJheVswXSk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihpbmRleCkpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVscygpW2luZGV4XTtcbiAgICAgICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwobW9kZWwpKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLl9maW5kRW50cnkoeyBtb2RlbCB9KSBhcyBPRGF0YU1vZGVsRW50cnk8VCwgTT47XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQgJiZcbiAgICAgICAgICAgIGVudHJ5Lm1vZGVsLmhhc0NoYW5nZWQoKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdG9DaGFuZ2UgPSBbZW50cnldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRoID0gcGF0aEFycmF5LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IGFsbFxuICAgICAgdG9BZGQgPSB0aGlzLl9lbnRyaWVzLmZpbHRlcigoZSkgPT4gZS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpO1xuICAgICAgdG9DaGFuZ2UgPSB0aGlzLl9lbnRyaWVzLmZpbHRlcihcbiAgICAgICAgKGUpID0+IGUuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQgJiYgZS5tb2RlbC5oYXNDaGFuZ2VkKCksXG4gICAgICApO1xuICAgICAgdG9SZW1vdmUgPSB0aGlzLl9lbnRyaWVzLmZpbHRlcigoZSkgPT4gZS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLkFkZGVkKTtcbiAgICB9XG5cbiAgICB0b1JlbW92ZS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgdGhpcy5fcmVtb3ZlTW9kZWwoZW50cnkubW9kZWwsIHsgc2lsZW50IH0pO1xuICAgIH0pO1xuICAgIHRvQWRkLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICB0aGlzLl9hZGRNb2RlbChlbnRyeS5tb2RlbCwgeyBzaWxlbnQgfSk7XG4gICAgfSk7XG4gICAgdG9DaGFuZ2UuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIGVudHJ5Lm1vZGVsLnJlc2V0KHsgcGF0aCwgc2lsZW50IH0pO1xuICAgICAgZW50cnkuc3RhdGUgPSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkO1xuICAgIH0pO1xuICAgIGlmIChcbiAgICAgICFzaWxlbnQgJiZcbiAgICAgICh0b0FkZC5sZW5ndGggPiAwIHx8IHRvUmVtb3ZlLmxlbmd0aCA+IDAgfHwgdG9DaGFuZ2UubGVuZ3RoID4gMClcbiAgICApIHtcbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuUmVzZXQsIHtcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGFkZGVkOiB0b0FkZC5tYXAoKGUpID0+IGUubW9kZWwpLFxuICAgICAgICAgIHJlbW92ZWQ6IHRvUmVtb3ZlLm1hcCgoZSkgPT4gZS5tb2RlbCksXG4gICAgICAgICAgY2hhbmdlZDogdG9DaGFuZ2UubWFwKChlKSA9PiBlLm1vZGVsKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKHsgc2lsZW50ID0gZmFsc2UgfTogeyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIGNvbnN0IHRvUmVtb3ZlOiBNW10gPSB0aGlzLm1vZGVscygpO1xuICAgIHRvUmVtb3ZlLmZvckVhY2goKG0pID0+IHtcbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKG0sIHsgc2lsZW50IH0pO1xuICAgIH0pO1xuICAgIHRoaXMuX2VudHJpZXMgPSBbXTtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsIHtcbiAgICAgICAgb3B0aW9uczogeyByZW1vdmVkOiB0b1JlbW92ZSB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYXNzaWduKFxuICAgIG9iamVjdHM6IFBhcnRpYWw8VD5bXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10gfCBNW10sXG4gICAge1xuICAgICAgcmVtb3ZlID0gdHJ1ZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICAgIHJlcGFyZW50PzogYm9vbGVhbjtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICBjb25zdCBNb2RlbCA9IHRoaXMuX21vZGVsO1xuICAgIGNvbnN0IG9mZnNldCA9IHJlbW92ZSA/IDAgOiB0aGlzLmxlbmd0aDtcblxuICAgIGNvbnN0IHRvQWRkOiBbTSwgbnVtYmVyXVtdID0gW107XG4gICAgY29uc3QgdG9DaGFuZ2U6IFtNLCBudW1iZXJdW10gPSBbXTtcbiAgICBjb25zdCB0b1JlbW92ZTogW00sIG51bWJlcl1bXSA9IFtdO1xuICAgIGNvbnN0IHRvU29ydDogW00sIG51bWJlcl1bXSA9IFtdO1xuICAgIGNvbnN0IG1vZGVsTWFwOiBzdHJpbmdbXSA9IFtdO1xuICAgIG9iamVjdHMuZm9yRWFjaCgob2JqLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaXNNb2RlbCA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwob2JqKTtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gaW5kZXggKyBvZmZzZXQ7XG4gICAgICBjb25zdCBrZXkgPVxuICAgICAgICBNb2RlbCAhPT0gbnVsbCAmJiBNb2RlbC5tZXRhID8gTW9kZWwubWV0YS5yZXNvbHZlS2V5KG9iaikgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBjaWQgPVxuICAgICAgICBNb2RlbC5tZXRhLmNpZCBpbiBvYmogPyAoPGFueT5vYmopW01vZGVsLm1ldGEuY2lkXSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFRyeSBmaW5kIGVudHJ5XG4gICAgICBjb25zdCBlbnRyeSA9IGlzTW9kZWxcbiAgICAgICAgPyB0aGlzLl9maW5kRW50cnkoeyBtb2RlbDogb2JqIGFzIE0gfSkgLy8gQnkgTW9kZWxcbiAgICAgICAgOiB0aGlzLl9maW5kRW50cnkoeyBjaWQsIGtleSB9KTsgLy8gQnkgQ2lkIG9yIEtleVxuXG4gICAgICBsZXQgbW9kZWw6IE07XG4gICAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBNZXJnZVxuICAgICAgICBtb2RlbCA9IGVudHJ5Lm1vZGVsO1xuICAgICAgICBpZiAobW9kZWwgIT09IG9iaikge1xuICAgICAgICAgIC8vIEdldCBlbnRpdHkgZnJvbSBtb2RlbFxuICAgICAgICAgIGlmIChpc01vZGVsKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSAob2JqIGFzIE0pLnRvRW50aXR5KHtcbiAgICAgICAgICAgICAgY2xpZW50X2lkOiB0cnVlLFxuICAgICAgICAgICAgICAuLi5JTkNMVURFX0RFRVAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1vZGVsLmFzc2lnbihlbnRpdHksIHsgcmVzZXQsIHNpbGVudCB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaGVscGVyID0gdGhpcy5fYW5ub3RhdGlvbnMuaGVscGVyO1xuICAgICAgICAgICAgY29uc3QgYW5ub3RzID0gbmV3IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM8VD4oXG4gICAgICAgICAgICAgIGhlbHBlcixcbiAgICAgICAgICAgICAgaGVscGVyLmFubm90YXRpb25zKG9iaiksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gYW5ub3RzLmF0dHJpYnV0ZXMob2JqLCAnZnVsbCcpO1xuICAgICAgICAgICAgbW9kZWwuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgICAgICAgbW9kZWwuYXNzaWduKGVudGl0eSwgeyByZXNldCwgc2lsZW50IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBNb2RlbCBDaGFuZ2U/XG4gICAgICAgICAgaWYgKG1vZGVsLmhhc0NoYW5nZWQoKSkgdG9DaGFuZ2UucHVzaChbbW9kZWwsIHBvc2l0aW9uXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc2V0KSBlbnRyeS5zdGF0ZSA9IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQ7XG4gICAgICAgIC8vIEhhcyBTb3J0IG9yIEluZGV4IENoYW5nZT9cbiAgICAgICAgaWYgKHRvU29ydC5sZW5ndGggPiAwIHx8IHBvc2l0aW9uICE9PSB0aGlzLm1vZGVscygpLmluZGV4T2YobW9kZWwpKSB7XG4gICAgICAgICAgdG9Tb3J0LnB1c2goW21vZGVsLCBwb3NpdGlvbl0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBZGRcbiAgICAgICAgbW9kZWwgPSBpc01vZGVsXG4gICAgICAgICAgPyAob2JqIGFzIE0pXG4gICAgICAgICAgOiB0aGlzLm1vZGVsRmFjdG9yeShvYmogYXMgUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LCB7XG4gICAgICAgICAgICAgIHJlc2V0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHRvQWRkLnB1c2goW21vZGVsLCBwb3NpdGlvbl0pO1xuICAgICAgfVxuICAgICAgbW9kZWxNYXAucHVzaCgoPGFueT5tb2RlbClbTW9kZWwubWV0YS5jaWRdKTtcbiAgICB9KTtcblxuICAgIGlmIChyZW1vdmUpIHtcbiAgICAgIHRoaXMuX2VudHJpZXMuZm9yRWFjaCgoZW50cnksIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgIGlmIChtb2RlbE1hcC5pbmRleE9mKCg8YW55PmVudHJ5Lm1vZGVsKVtNb2RlbC5tZXRhLmNpZF0pID09PSAtMSlcbiAgICAgICAgICB0b1JlbW92ZS5wdXNoKFtlbnRyeS5tb2RlbCwgcG9zaXRpb25dKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHJlbW92ZSwgYWRkIGFuZCBzb3J0XG4gICAgdG9SZW1vdmUuZm9yRWFjaCgoW21vZGVsLCBwb3NpdGlvbl0pID0+IHtcbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcmVzZXQgfSk7XG4gICAgfSk7XG4gICAgdG9BZGQuZm9yRWFjaCgoW21vZGVsLCBwb3NpdGlvbl0pID0+IHtcbiAgICAgIHRoaXMuX2FkZE1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcmVzZXQsIHJlcGFyZW50LCBwb3NpdGlvbiB9KTtcbiAgICB9KTtcbiAgICB0b1NvcnQuZm9yRWFjaCgoW21vZGVsLCBwb3NpdGlvbl0pID0+IHtcbiAgICAgIHRoaXMuX21vdmVNb2RlbChtb2RlbCwgcG9zaXRpb24pO1xuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgKCFzaWxlbnQgJiZcbiAgICAgICAgKHRvQWRkLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICB0b1JlbW92ZS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgdG9DaGFuZ2UubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHRvU29ydC5sZW5ndGggPiAwKSkgfHxcbiAgICAgIHJlc2V0XG4gICAgKSB7XG4gICAgICB0aGlzLl9zb3J0QnkgPSBudWxsO1xuICAgICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoXG4gICAgICAgIHJlc2V0ID8gT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXNldCA6IE9EYXRhTW9kZWxFdmVudFR5cGUuVXBkYXRlLFxuICAgICAgICB7XG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgYWRkZWQ6IHRvQWRkLFxuICAgICAgICAgICAgcmVtb3ZlZDogdG9SZW1vdmUsXG4gICAgICAgICAgICBjaGFuZ2VkOiB0b0NoYW5nZSxcbiAgICAgICAgICAgIHNvcnRlZDogdG9Tb3J0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHF1ZXJ5KFxuICAgIGN0eDogKHE6IE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcjxUPiwgcz86IE9EYXRhU3RydWN0dXJlZFR5cGU8VD4pID0+IHZvaWQsXG4gICkge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgcmVzb3VyY2UucXVlcnkoY3R4KTtcbiAgICAgIHRoaXMuYXR0YWNoKHJlc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjYWxsRnVuY3Rpb248UCwgUj4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgcmVzcG9uc2VUeXBlOiAncHJvcGVydHknIHwgJ21vZGVsJyB8ICdjb2xsZWN0aW9uJyB8ICdub25lJyxcbiAgICBvcHRpb25zOiBPRGF0YUZ1bmN0aW9uT3B0aW9uczxSPiA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFIgfCBPRGF0YU1vZGVsPFI+IHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcImNhbGxGdW5jdGlvbjogQ2FuJ3QgY2FsbCBmdW5jdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5U2V0UmVzb3VyY2VcIixcbiAgICAgICAgICApLFxuICAgICAgKTtcblxuICAgIGNvbnN0IGZ1bmMgPSByZXNvdXJjZS5mdW5jdGlvbjxQLCBSPihuYW1lKS5xdWVyeSgocSkgPT4gcS5hcHBseShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgZnVuYy5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoZnVuYy5jYWxsTW9kZWwocGFyYW1zLCBvcHRpb25zKSwgKHJlc3ApID0+IHJlc3ApO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGZ1bmMuY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGZ1bmMuY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlLCAuLi5vcHRpb25zIH0pLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxBY3Rpb248UCwgUj4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgcmVzcG9uc2VUeXBlOiAncHJvcGVydHknIHwgJ21vZGVsJyB8ICdjb2xsZWN0aW9uJyB8ICdub25lJyxcbiAgICBvcHRpb25zOiBPRGF0YUFjdGlvbk9wdGlvbnM8Uj4gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSIHwgT0RhdGFNb2RlbDxSPiB8IE9EYXRhQ29sbGVjdGlvbjxSLCBPRGF0YU1vZGVsPFI+PiB8IG51bGw+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgY2FsbEFjdGlvbjogQ2FuJ3QgY2FsbCBhY3Rpb24gd2l0aG91dCBPRGF0YUVudGl0eVNldFJlc291cmNlYCxcbiAgICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYWN0aW9uID0gcmVzb3VyY2UuYWN0aW9uPFAsIFI+KG5hbWUpLnF1ZXJ5KChxKSA9PiBxLmFwcGx5KG9wdGlvbnMpKTtcbiAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBhY3Rpb24uY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KGFjdGlvbi5jYWxsTW9kZWwocGFyYW1zLCBvcHRpb25zKSwgKHJlc3ApID0+IHJlc3ApO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGFjdGlvbi5jYWxsQ29sbGVjdGlvbihwYXJhbXMsIG9wdGlvbnMpLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgYWN0aW9uLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF91bmxpbmsoZW50cnk6IE9EYXRhTW9kZWxFbnRyeTxULCBNPikge1xuICAgIGlmIChlbnRyeS5zdWJzY3JpcHRpb24pIHtcbiAgICAgIGVudHJ5LnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgZW50cnkuc3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xpbmsoZW50cnk6IE9EYXRhTW9kZWxFbnRyeTxULCBNPikge1xuICAgIGlmIChlbnRyeS5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbjogU3Vic2NyaXB0aW9uIGFscmVhZHkgZXhpc3RzJyk7XG4gICAgfVxuICAgIGVudHJ5LnN1YnNjcmlwdGlvbiA9IGVudHJ5Lm1vZGVsLmV2ZW50cyQuc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50OiBPRGF0YU1vZGVsRXZlbnQ8VD4pID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmNhbkNvbnRpbnVlV2l0aCh0aGlzKSkge1xuICAgICAgICAgIGlmIChldmVudC5tb2RlbCA9PT0gZW50cnkubW9kZWwpIHtcbiAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBPRGF0YU1vZGVsRXZlbnRUeXBlLkRlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVNb2RlbChlbnRyeS5tb2RlbCwgeyByZXNldDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGV2ZW50LnR5cGUgPT09IE9EYXRhTW9kZWxFdmVudFR5cGUuQ2hhbmdlICYmXG4gICAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnM/LmtleVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGVudHJ5LmtleSA9IGVudHJ5Lm1vZGVsLmtleSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5tb2RlbHMoKS5pbmRleE9mKGVudHJ5Lm1vZGVsKTtcbiAgICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChldmVudC5wdXNoKHRoaXMsIGluZGV4KSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRFbnRyeSh7XG4gICAgbW9kZWwsXG4gICAgY2lkLFxuICAgIGtleSxcbiAgfToge1xuICAgIG1vZGVsPzogT0RhdGFNb2RlbDxUPjtcbiAgICBjaWQ/OiBzdHJpbmc7XG4gICAga2V5PzogRW50aXR5S2V5PFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzLmZpbmQoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBieU1vZGVsID0gbW9kZWwgIT09IHVuZGVmaW5lZCAmJiBlbnRyeS5tb2RlbC5lcXVhbHMobW9kZWwpO1xuICAgICAgY29uc3QgYnlDaWQgPVxuICAgICAgICBjaWQgIT09IHVuZGVmaW5lZCAmJiAoPGFueT5lbnRyeS5tb2RlbClbdGhpcy5fbW9kZWwubWV0YS5jaWRdID09PSBjaWQ7XG4gICAgICBjb25zdCBieUtleSA9XG4gICAgICAgIGtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGVudHJ5LmtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIFR5cGVzLmlzRXF1YWwoZW50cnkua2V5LCBrZXkpO1xuICAgICAgcmV0dXJuIGJ5TW9kZWwgfHwgYnlDaWQgfHwgYnlLZXk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBDb2xsZWN0aW9uIGZ1bmN0aW9uc1xuICBlcXVhbHMob3RoZXI6IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzID09PSBvdGhlcjtcbiAgfVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ0NvbGxlY3Rpb24nO1xuICB9XG5cbiAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIGxldCBwb2ludGVyID0gMDtcbiAgICBjb25zdCBtb2RlbHMgPSB0aGlzLm1vZGVscygpO1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0KCk6IEl0ZXJhdG9yUmVzdWx0PE0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkb25lOiBwb2ludGVyID09PSBtb2RlbHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHVlOiBtb2RlbHNbcG9pbnRlcisrXSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSBhcyBJdGVyYXRvcjxNPjtcbiAgfVxuXG4gIGZpbHRlcihcbiAgICBwcmVkaWNhdGU6ICh2YWx1ZTogTSwgaW5kZXg6IG51bWJlciwgYXJyYXk6IE1bXSkgPT4gdW5rbm93bixcbiAgICB0aGlzQXJnPzogYW55LFxuICApOiBNW10ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG5cbiAgbWFwPFU+KFxuICAgIGNhbGxiYWNrZm46ICh2YWx1ZTogTSwgaW5kZXg6IG51bWJlciwgYXJyYXk6IE1bXSkgPT4gVSxcbiAgICB0aGlzQXJnPzogYW55LFxuICApOiBVW10ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLm1hcChjYWxsYmFja2ZuLCB0aGlzQXJnKTtcbiAgfVxuXG4gIGZpbmQoXG4gICAgcHJlZGljYXRlOiAodmFsdWU6IE0sIGluZGV4OiBudW1iZXIsIG9iajogTVtdKSA9PiB1bmtub3duLFxuICApOiBNIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5maW5kKHByZWRpY2F0ZSk7XG4gIH1cblxuICByZWR1Y2U8VT4oXG4gICAgY2FsbGJhY2tmbjogKFxuICAgICAgcHJldmlvdXNWYWx1ZTogVSxcbiAgICAgIGN1cnJlbnRWYWx1ZTogTSxcbiAgICAgIGN1cnJlbnRJbmRleDogbnVtYmVyLFxuICAgICAgYXJyYXk6IE1bXSxcbiAgICApID0+IFUsXG4gICAgaW5pdGlhbFZhbHVlOiBVLFxuICApOiBVIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5yZWR1Y2UoY2FsbGJhY2tmbiwgaW5pdGlhbFZhbHVlKTtcbiAgfVxuXG4gIGZpcnN0KCk6IE0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpWzBdO1xuICB9XG5cbiAgbGFzdCgpOiBNIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtb2RlbHMgPSB0aGlzLm1vZGVscygpO1xuICAgIHJldHVybiBtb2RlbHNbbW9kZWxzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgbmV4dChtb2RlbDogTSk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleE9mKG1vZGVsKTtcbiAgICBpZiAoaW5kZXggPT09IC0xIHx8IGluZGV4ID09PSB0aGlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldChpbmRleCArIDEpO1xuICB9XG5cbiAgcHJldihtb2RlbDogTSk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleE9mKG1vZGVsKTtcbiAgICBpZiAoaW5kZXggPD0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGluZGV4IC0gMSk7XG4gIH1cblxuICBldmVyeShwcmVkaWNhdGU6IChtOiBNLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuZXZlcnkocHJlZGljYXRlKTtcbiAgfVxuXG4gIHNvbWUocHJlZGljYXRlOiAobTogTSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLnNvbWUocHJlZGljYXRlKTtcbiAgfVxuXG4gIGluY2x1ZGVzKG1vZGVsOiBNLCBzdGFydDogbnVtYmVyID0gMCkge1xuICAgIHJldHVybiB0aGlzLnNvbWUoKG0sIGkpID0+IGkgPj0gc3RhcnQgJiYgbS5lcXVhbHMobW9kZWwpKTtcbiAgfVxuXG4gIGluZGV4T2YobW9kZWw6IE0pOiBudW1iZXIge1xuICAgIGNvbnN0IG1vZGVscyA9IHRoaXMubW9kZWxzKCk7XG4gICAgY29uc3QgbSA9IG1vZGVscy5maW5kKChtKSA9PiBtLmVxdWFscyhtb2RlbCkpO1xuICAgIHJldHVybiAhbSA/IC0xIDogbW9kZWxzLmluZGV4T2YobSk7XG4gIH1cblxuICBpc0VtcHR5KCkge1xuICAgIC8vIExvY2FsIGxlbmd0aCA9PSAwIGFuZCBpZiBleGlzdCByZW1vdGUgY291bnQgaXMgMCBvciB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDAgJiYgIXRoaXMuYW5ub3RzKCkuY291bnQ7XG4gIH1cblxuICAvLyNyZWdpb24gU29ydFxuICBwcml2YXRlIF9jb21wYXJlKFxuICAgIGUxOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4gfCBNLFxuICAgIGUyOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4gfCBNLFxuICAgIGJ5OiB7IGZpZWxkOiBzdHJpbmcgfCBrZXlvZiBUOyBvcmRlcj86IDEgfCAtMSB9W10sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgKTogbnVtYmVyIHtcbiAgICBjb25zdCBtMSA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoZTEpXG4gICAgICA/IChlMSBhcyBNKVxuICAgICAgOiAoZTEgYXMgT0RhdGFNb2RlbEVudHJ5PFQsIE0+KS5tb2RlbDtcbiAgICBjb25zdCBtMiA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoZTIpXG4gICAgICA/IChlMiBhcyBNKVxuICAgICAgOiAoZTIgYXMgT0RhdGFNb2RlbEVudHJ5PFQsIE0+KS5tb2RlbDtcbiAgICBjb25zdCB2YWx1ZTEgPSBtMS5nZXQoYnlbaW5kZXhdLmZpZWxkIGFzIHN0cmluZyk7XG4gICAgY29uc3QgdmFsdWUyID0gbTIuZ2V0KGJ5W2luZGV4XS5maWVsZCBhcyBzdHJpbmcpO1xuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XG5cbiAgICBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyICE9IG51bGwpIHJlc3VsdCA9IC0xO1xuICAgIGVsc2UgaWYgKHZhbHVlMSAhPSBudWxsICYmIHZhbHVlMiA9PSBudWxsKSByZXN1bHQgPSAxO1xuICAgIGVsc2UgaWYgKHZhbHVlMSA9PSBudWxsICYmIHZhbHVlMiA9PSBudWxsKSByZXN1bHQgPSAwO1xuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTEgPT0gJ3N0cmluZycgfHwgdmFsdWUxIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICBpZiAodmFsdWUxLmxvY2FsZUNvbXBhcmUgJiYgdmFsdWUxICE9IHZhbHVlMikge1xuICAgICAgICByZXR1cm4gKGJ5W2luZGV4XS5vcmRlciB8fCAxKSAqIHZhbHVlMS5sb2NhbGVDb21wYXJlKHZhbHVlMik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHZhbHVlMSA8IHZhbHVlMiA/IC0xIDogMTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUxID09IHZhbHVlMikge1xuICAgICAgcmV0dXJuIGJ5Lmxlbmd0aCAtIDEgPiBpbmRleCA/IHRoaXMuX2NvbXBhcmUoZTEsIGUyLCBieSwgaW5kZXggKyAxKSA6IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIChieVtpbmRleF0ub3JkZXIgfHwgMSkgKiByZXN1bHQ7XG4gIH1cblxuICBfc29ydEJ5OiB7IGZpZWxkOiBzdHJpbmcgfCBrZXlvZiBUOyBvcmRlcj86IDEgfCAtMSB9W10gfCBudWxsID0gbnVsbDtcbiAgaXNTb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRCeSAhPT0gbnVsbDtcbiAgfVxuXG4gIHNvcnQoXG4gICAgYnk6IHsgZmllbGQ6IHN0cmluZyB8IGtleW9mIFQ7IG9yZGVyPzogMSB8IC0xIH1bXSxcbiAgICB7IHNpbGVudCB9OiB7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLl9zb3J0QnkgPSBieTtcbiAgICB0aGlzLl9lbnRyaWVzID0gdGhpcy5fZW50cmllcy5zb3J0KFxuICAgICAgKGUxOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4sIGUyOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pID0+XG4gICAgICAgIHRoaXMuX2NvbXBhcmUoZTEsIGUyLCBieSwgMCksXG4gICAgKTtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUpO1xuICAgIH1cbiAgfVxuICAvLyNlbmRyZWdpb25cbn1cbiJdfQ==