angular-odata 0.115.0 → 0.121.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 (86) hide show
  1. package/README.md +4 -2
  2. package/esm2020/lib/api.mjs +7 -7
  3. package/esm2020/lib/cache/cache.mjs +3 -3
  4. package/esm2020/lib/client.mjs +33 -27
  5. package/esm2020/lib/index.mjs +2 -2
  6. package/esm2020/lib/loaders.mjs +33 -0
  7. package/esm2020/lib/models/collection.mjs +79 -48
  8. package/esm2020/lib/models/model.mjs +35 -9
  9. package/esm2020/lib/models/options.mjs +99 -39
  10. package/esm2020/lib/module.mjs +21 -17
  11. package/esm2020/lib/options.mjs +4 -3
  12. package/esm2020/lib/resources/path/handlers.mjs +8 -8
  13. package/esm2020/lib/resources/path/segments.mjs +6 -6
  14. package/esm2020/lib/resources/query/builder.mjs +1 -1
  15. package/esm2020/lib/resources/query/expressions/count.mjs +5 -5
  16. package/esm2020/lib/resources/query/expressions/expand.mjs +18 -18
  17. package/esm2020/lib/resources/query/handlers.mjs +45 -45
  18. package/esm2020/lib/resources/query/options.mjs +27 -27
  19. package/esm2020/lib/resources/request.mjs +1 -1
  20. package/esm2020/lib/resources/resource.mjs +11 -9
  21. package/esm2020/lib/resources/responses/annotations.mjs +1 -1
  22. package/esm2020/lib/resources/types/action.mjs +16 -7
  23. package/esm2020/lib/resources/types/batch.mjs +135 -31
  24. package/esm2020/lib/resources/types/count.mjs +4 -4
  25. package/esm2020/lib/resources/types/entity-set.mjs +5 -7
  26. package/esm2020/lib/resources/types/entity.mjs +5 -5
  27. package/esm2020/lib/resources/types/function.mjs +16 -7
  28. package/esm2020/lib/resources/types/media.mjs +3 -3
  29. package/esm2020/lib/resources/types/metadata.mjs +3 -3
  30. package/esm2020/lib/resources/types/navigation-property.mjs +7 -9
  31. package/esm2020/lib/resources/types/options.mjs +1 -1
  32. package/esm2020/lib/resources/types/property.mjs +6 -10
  33. package/esm2020/lib/resources/types/reference.mjs +3 -3
  34. package/esm2020/lib/resources/types/singleton.mjs +4 -4
  35. package/esm2020/lib/resources/types/value.mjs +3 -3
  36. package/esm2020/lib/schema/parsers/edm.mjs +18 -17
  37. package/esm2020/lib/schema/parsers/enum-type.mjs +1 -1
  38. package/esm2020/lib/schema/parsers/structured-type.mjs +31 -19
  39. package/esm2020/lib/schema/structured-type.mjs +7 -1
  40. package/esm2020/lib/services/factory.mjs +3 -3
  41. package/esm2020/lib/settings.mjs +2 -2
  42. package/esm2020/lib/types.mjs +101 -32
  43. package/esm2020/lib/utils/enums.mjs +20 -20
  44. package/esm2020/lib/utils/strings.mjs +2 -2
  45. package/fesm2015/angular-odata.mjs +761 -406
  46. package/fesm2015/angular-odata.mjs.map +1 -1
  47. package/fesm2020/angular-odata.mjs +763 -404
  48. package/fesm2020/angular-odata.mjs.map +1 -1
  49. package/lib/api.d.ts +3 -3
  50. package/lib/client.d.ts +8 -7
  51. package/lib/index.d.ts +1 -1
  52. package/lib/loaders.d.ts +15 -0
  53. package/lib/models/collection.d.ts +21 -13
  54. package/lib/models/model.d.ts +10 -5
  55. package/lib/models/options.d.ts +20 -7
  56. package/lib/module.d.ts +12 -6
  57. package/lib/options.d.ts +6 -2
  58. package/lib/resources/path/handlers.d.ts +2 -2
  59. package/lib/resources/path/segments.d.ts +2 -2
  60. package/lib/resources/query/builder.d.ts +4 -1
  61. package/lib/resources/query/handlers.d.ts +3 -3
  62. package/lib/resources/query/options.d.ts +21 -21
  63. package/lib/resources/request.d.ts +4 -4
  64. package/lib/resources/resource.d.ts +4 -6
  65. package/lib/resources/types/action.d.ts +19 -2
  66. package/lib/resources/types/batch.d.ts +16 -5
  67. package/lib/resources/types/entity-set.d.ts +8 -8
  68. package/lib/resources/types/entity.d.ts +5 -5
  69. package/lib/resources/types/function.d.ts +17 -2
  70. package/lib/resources/types/navigation-property.d.ts +11 -11
  71. package/lib/resources/types/options.d.ts +0 -3
  72. package/lib/resources/types/property.d.ts +4 -4
  73. package/lib/resources/types/reference.d.ts +5 -5
  74. package/lib/resources/types/singleton.d.ts +5 -5
  75. package/lib/schema/parsers/edm.d.ts +2 -2
  76. package/lib/schema/parsers/enum-type.d.ts +2 -2
  77. package/lib/schema/parsers/structured-type.d.ts +8 -7
  78. package/lib/schema/structured-type.d.ts +3 -1
  79. package/lib/services/entity-set.d.ts +1 -6
  80. package/lib/settings.d.ts +3 -3
  81. package/lib/types.d.ts +46 -3
  82. package/lib/utils/enums.d.ts +18 -6
  83. package/lib/utils/strings.d.ts +4 -1
  84. package/package.json +1 -1
  85. package/esm2020/lib/tokens.mjs +0 -3
  86. package/lib/tokens.d.ts +0 -3
@@ -31,7 +31,7 @@ export class ODataModel {
31
31
  // Client Id
32
32
  this[this._meta.cid] =
33
33
  data[this._meta.cid] ||
34
- Strings.uniqueId(`${Klass.meta.schema.name.toLowerCase()}-`);
34
+ Strings.uniqueId({ prefix: `${Klass.meta.schema.name.toLowerCase()}-` });
35
35
  let attrs = this.annots().attributes(data, 'full');
36
36
  let defaults = this.defaults();
37
37
  this.assign(Objects.merge(defaults, attrs), {
@@ -114,6 +114,9 @@ export class ODataModel {
114
114
  key({ field_mapping = false, resolve = true, } = {}) {
115
115
  return this._meta.resolveKey(this, { field_mapping, resolve });
116
116
  }
117
+ isOpenModel() {
118
+ return this._meta.isOpenType();
119
+ }
117
120
  isParentOf(child) {
118
121
  return (child !== this &&
119
122
  ODataModelOptions.chain(child).some((p) => p[0] === this));
@@ -171,29 +174,40 @@ export class ODataModel {
171
174
  field_mapping,
172
175
  });
173
176
  }
174
- set(path, value) {
177
+ set(path, value, { type } = {}) {
175
178
  const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
176
179
  if (pathArray.length === 0)
177
180
  return undefined;
178
181
  if (pathArray.length > 1) {
179
182
  const model = this[pathArray[0]];
180
- return model.set(pathArray.slice(1), value);
183
+ return model.set(pathArray.slice(1), value, {});
181
184
  }
182
185
  if (pathArray.length === 1) {
183
- return (this[pathArray[0]] = value);
186
+ return this._meta.set(this, pathArray[0], value, { type });
184
187
  }
185
188
  }
186
189
  get(path) {
187
190
  const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
188
191
  if (pathArray.length === 0)
189
192
  return undefined;
190
- const value = this[pathArray[0]];
193
+ const value = this._meta.get(this, pathArray[0]);
191
194
  if (pathArray.length > 1 &&
192
195
  (value instanceof ODataModel || value instanceof ODataCollection)) {
193
196
  return value.get(pathArray.slice(1));
194
197
  }
195
198
  return value;
196
199
  }
200
+ has(path) {
201
+ const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
202
+ if (pathArray.length === 0)
203
+ return false;
204
+ const value = this._meta.get(this, pathArray[0]);
205
+ if (pathArray.length > 1 &&
206
+ (value instanceof ODataModel || value instanceof ODataCollection)) {
207
+ return value.has(pathArray.slice(1));
208
+ }
209
+ return value !== undefined;
210
+ }
197
211
  reset({ path, silent = false, } = {}) {
198
212
  const pathArray = (path === undefined
199
213
  ? []
@@ -316,10 +330,10 @@ export class ODataModel {
316
330
  }
317
331
  /**
318
332
  * Create an execution context for change the internal query of a resource
319
- * @param func Function to execute
333
+ * @param ctx Function to execute
320
334
  */
321
- query(func) {
322
- return this._meta.query(this, this.resource(), func);
335
+ query(ctx) {
336
+ return this._meta.query(this, this.resource(), ctx);
323
337
  }
324
338
  /**
325
339
  * Perform a check on the internal state of the model and return true if the model is changed.
@@ -332,6 +346,9 @@ export class ODataModel {
332
346
  isNew() {
333
347
  return !this._meta.hasKey(this);
334
348
  }
349
+ withResource(resource, ctx) {
350
+ return this._meta.withResource(this, resource, ctx);
351
+ }
335
352
  /**
336
353
  * Create an execution context for a given function, where the model is bound to its entity endpoint
337
354
  * @param ctx Context function
@@ -352,6 +369,10 @@ export class ODataModel {
352
369
  return func.callModel(params, options);
353
370
  case 'collection':
354
371
  return func.callCollection(params, options);
372
+ case 'blob':
373
+ return func.callBlob(params, options);
374
+ case 'arraybuffer':
375
+ return func.callArraybuffer(params, options);
355
376
  default:
356
377
  return func.call(params, { responseType, ...options });
357
378
  }
@@ -368,12 +389,17 @@ export class ODataModel {
368
389
  return action.callModel(params, options);
369
390
  case 'collection':
370
391
  return action.callCollection(params, options);
392
+ case 'blob':
393
+ return action.callBlob(params, options);
394
+ case 'arraybuffer':
395
+ return action.callArraybuffer(params, options);
371
396
  default:
372
397
  return action.call(params, { responseType, ...options });
373
398
  }
374
399
  }
375
400
  // Cast
376
401
  cast(type) {
402
+ //: ODataModel<S> {
377
403
  const resource = this.resource();
378
404
  if (!(resource instanceof ODataEntityResource))
379
405
  throw new Error(`cast: Can't cast to derived model without ODataEntityResource`);
@@ -489,4 +515,4 @@ export class ODataModel {
489
515
  }
490
516
  }
491
517
  export const RESERVED_FIELD_NAMES = Object.getOwnPropertyNames(ODataModel.prototype);
492
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvbW9kZWxzL21vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBSUwsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUVuQiwrQkFBK0IsR0FPaEMsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUNMLFlBQVksRUFDWixlQUFlLEVBRWYsZUFBZSxFQUVmLGlCQUFpQixHQUVsQixNQUFNLFdBQVcsQ0FBQztBQUVuQixXQUFXO0FBQ1gsTUFBTSxPQUFPLFVBQVU7SUErRHJCLFlBQ0UsT0FBNkMsRUFBRSxFQUMvQyxFQUNFLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssR0FBRyxLQUFLLE1BU1gsRUFBRTtRQTlDUixTQUFTO1FBQ1QsWUFBTyxHQUtJLElBQUksQ0FBQztRQUNoQixjQUFTLEdBQTRCLElBQUksQ0FBQztRQUMxQyxlQUFVLEdBUUosRUFBRSxDQUFDO1FBQ1QsZ0JBQVcsR0FBcUIsSUFBSSxHQUFHLEVBQWUsQ0FBQztRQUN2RCxhQUFRLEdBQXFCLElBQUksR0FBRyxFQUFlLENBQUM7UUFDcEQsZUFBVSxHQUF5QyxJQUFJLEdBQUcsRUFHdkQsQ0FBQztRQUNKLGlCQUFZLEdBQXFDLElBQUksQ0FBQztRQUN0RCxXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUV6QixTQUFTO1FBQ1QsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBbUIvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBZ0MsQ0FBQztRQUNwRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUztZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUVwRCxZQUFZO1FBQ04sSUFBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQ25CLElBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztnQkFDM0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFL0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBZ0MsQ0FBQyxFQUFFO1lBQ3JFLEtBQUs7U0FDTixDQUFDLENBQUM7SUFDTCxDQUFDO0lBN0ZELE1BQU0sQ0FBQyxTQUFTLENBQUksRUFDbEIsT0FBTyxFQUNQLE1BQU0sR0FJUDtRQUNDLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUN6QixJQUFJLE1BQU0sR0FBRyxNQUFNO2lCQUNoQixNQUFNLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUMzRCxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xCLDJDQUEyQztnQkFDM0MsT0FBTyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzFDLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDO2lCQUNuQjtnQkFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO29CQUN4QixDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUNOLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSTt3QkFDYixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87d0JBQ2xCLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRO3FCQUN0QjtpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDVCxPQUFPLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUN0QjtRQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxpQkFBaUIsQ0FBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFvRUQsbUJBQW1CO0lBQ25CLFFBQVE7UUFLTixPQUFPLGlCQUFpQixDQUFDLFFBQVEsQ0FBSSxJQUFJLENBSVosQ0FBQztJQUNoQyxDQUFDO0lBRUQsWUFBWSxDQUNWLFFBSTZCO1FBRTdCLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN6RSw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7SUFDNUIsQ0FBQztJQUVELFdBQVc7UUFDVCwwQkFBMEI7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsQyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDckIsTUFBTSxPQUFPLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25FLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDOUIsT0FBTyxPQUFPLENBQUM7U0FDaEI7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsa0JBQWtCLENBQ2hCLElBQXNCO1FBRXRCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQzFDLE1BQU0sS0FBSyxDQUNULHNEQUFzRCxJQUFjLEVBQUUsQ0FDdkUsQ0FBQztRQUVKLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsQ0FBQyxRQUFRLFlBQVksbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDbEUsTUFBTSxLQUFLLENBQ1QsK0VBQStFLENBQ2hGLENBQUM7UUFFSixPQUFPLEtBQUssQ0FBQyxlQUFlLENBQzFCLFFBQVEsQ0FDNkIsQ0FBQztJQUMxQyxDQUFDO0lBRUQsUUFBUSxDQUFJLElBQVk7UUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxVQUFVO1lBQ3pDLE1BQU0sS0FBSyxDQUFDLGlDQUFpQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXZELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsQ0FBQyxRQUFRLFlBQVksbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDbEUsTUFBTSxLQUFLLENBQ1QsbUVBQW1FLENBQ3BFLENBQUM7UUFFSixPQUFPLEtBQUssQ0FBQyxlQUFlLENBQU8sUUFBUSxDQUE2QixDQUFDO0lBQzNFLENBQUM7SUFFRCxNQUFNLENBQ0osUUFJNkI7UUFFN0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELFlBQVk7SUFFWixNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sQ0FDTCxJQUFJLENBQUMsWUFBWTtZQUNqQixJQUFJLHNCQUFzQixDQUFJLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUM1RCxDQUFDO0lBQ0osQ0FBQztJQUVELEdBQUcsQ0FBQyxFQUNGLGFBQWEsR0FBRyxLQUFLLEVBQ3JCLE9BQU8sR0FBRyxJQUFJLE1BQ29DLEVBQUU7UUFJcEQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsVUFBVSxDQUNSLEtBQThEO1FBRTlELE9BQU8sQ0FDTCxLQUFLLEtBQUssSUFBSTtZQUNkLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FDMUQsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXLENBQ1QsS0FBMkIsRUFDM0IsRUFDRSxhQUFhLEdBQUcsS0FBSyxFQUNyQixPQUFPLEdBQUcsSUFBSSxNQUNvQyxFQUFFO1FBRXRELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQ2hELGFBQWE7WUFDYixPQUFPO1NBQ1IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FDUixLQUEyQixFQUMzQixFQUNFLGFBQWEsR0FBRyxLQUFLLEVBQ3JCLE9BQU8sR0FBRyxJQUFJLE1BQ29DLEVBQUU7UUFFdEQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFDL0MsYUFBYTtZQUNiLE9BQU87U0FDUixDQUFDLENBQUM7SUFDTCxDQUFDO0lBSUQsUUFBUSxDQUFDLEVBQ1AsTUFBTSxFQUNOLFVBQVUsR0FBRyxLQUFLLE1BSWhCLEVBQUU7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxPQUFPLENBQUMsRUFDTixNQUFNLEVBQ04sVUFBVSxHQUFHLEtBQUssTUFJaEIsRUFBRTtRQUNKLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTO1lBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLElBQUksZUFBZSxDQUFDLFNBQVMsRUFBRTtnQkFDN0IsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNuQixPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUU7YUFDcEIsQ0FBQyxDQUNILENBQUM7UUFDSixPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsUUFBUSxDQUFDLEVBQ1AsU0FBUyxHQUFHLEtBQUssRUFDakIsa0JBQWtCLEdBQUcsS0FBSyxFQUMxQixtQkFBbUIsR0FBRyxLQUFLLEVBQzNCLGdCQUFnQixHQUFHLEtBQUssRUFDeEIsV0FBVyxHQUFHLElBQUksRUFDbEIsaUJBQWlCLEdBQUcsS0FBSyxFQUN6QixZQUFZLEdBQUcsS0FBSyxFQUNwQixhQUFhLEdBQUcsS0FBSyxFQUNyQixLQUFLLEdBQUcsRUFBRSxNQVdSLEVBQUU7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUMvQixTQUFTO1lBQ1Qsa0JBQWtCO1lBQ2xCLG1CQUFtQjtZQUNuQixnQkFBZ0I7WUFDaEIsV0FBVztZQUNYLGlCQUFpQjtZQUNqQixZQUFZO1lBQ1osYUFBYTtZQUNiLEtBQUs7U0FDTixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxVQUFVLENBQUMsRUFDVCxZQUFZLEdBQUcsS0FBSyxFQUNwQixtQkFBbUIsR0FBRyxLQUFLLEVBQzNCLGdCQUFnQixHQUFHLEtBQUssRUFDeEIsaUJBQWlCLEdBQUcsS0FBSyxFQUN6QixhQUFhLEdBQUcsS0FBSyxNQU9uQixFQUFFO1FBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7WUFDakMsWUFBWTtZQUNaLG1CQUFtQjtZQUNuQixnQkFBZ0I7WUFDaEIsaUJBQWlCO1lBQ2pCLGFBQWE7U0FDZCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsR0FBRyxDQUFDLElBQXVCLEVBQUUsS0FBVTtRQUNyQyxNQUFNLFNBQVMsR0FBRyxDQUNoQixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFFLElBQWUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQzFELENBQUM7UUFDWCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzdDLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDeEIsTUFBTSxLQUFLLEdBQVMsSUFBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxQixPQUFPLENBQU8sSUFBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUF1QjtRQUN6QixNQUFNLFNBQVMsR0FBRyxDQUNoQixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFFLElBQWUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQzFELENBQUM7UUFDWCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzdDLE1BQU0sS0FBSyxHQUFTLElBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUNFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNwQixDQUFDLEtBQUssWUFBWSxVQUFVLElBQUksS0FBSyxZQUFZLGVBQWUsQ0FBQyxFQUNqRTtZQUNBLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxLQUFLLENBQUMsRUFDSixJQUFJLEVBQ0osTUFBTSxHQUFHLEtBQUssTUFDb0MsRUFBRTtRQUNwRCxNQUFNLFNBQVMsR0FBYSxDQUMxQixJQUFJLEtBQUssU0FBUztZQUNoQixDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDckIsQ0FBQyxDQUFDLElBQUk7Z0JBQ04sQ0FBQyxDQUFFLElBQWUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQ2pDLENBQUM7UUFDWCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQU8sSUFBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDakUsSUFDRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ2hDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFDckM7WUFDQSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNuRDthQUFNO1lBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQ3hEO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxFQUFFLE1BQU0sR0FBRyxLQUFLLEtBQTJCLEVBQUU7UUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRTtnQkFDNUIsS0FBSyxFQUFFLElBQUk7YUFDWixDQUFDLENBQ0gsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FDSixNQUE0QyxFQUM1QyxFQUNFLEtBQUssR0FBRyxLQUFLLEVBQ2IsUUFBUSxHQUFHLEtBQUssRUFDaEIsTUFBTSxHQUFHLEtBQUssTUFDK0MsRUFBRTtRQUVqRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLElBQUksR0FBc0IsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMvQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDOUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQXNCO1lBQzdDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFO1NBQ3RCLENBQU0sQ0FBQztJQUNWLENBQUM7SUFFTyxRQUFRLENBQUMsSUFBa0M7UUFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2YsSUFBSSxlQUFlLENBQUMsU0FBUyxFQUFFO1lBQzdCLEtBQUssRUFBRSxJQUFJO1lBQ1gsT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtTQUM5QixDQUFDLENBQ0gsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FDZCxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO2dCQUNuRCxLQUFLLEVBQUUsSUFBSTthQUNaLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLElBQUksZUFBZSxDQUFDLE1BQU0sRUFBRTtnQkFDMUIsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRTthQUM1QixDQUFDLENBQ0gsQ0FBQztZQUNGLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsRUFDSixHQUFHLE9BQU8sS0FHUixFQUFFO1FBQ0osSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksUUFBUSxLQUFLLFNBQVM7WUFDeEIsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDO1FBRXJFLElBQUksSUFBZ0MsQ0FBQztRQUNyQyxJQUFJLFFBQVEsWUFBWSxtQkFBbUIsRUFBRTtZQUMzQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNoQzthQUFNLElBQUksUUFBUSxZQUFZLCtCQUErQixFQUFFO1lBQzlELElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDL0Q7YUFBTTtZQUNMLElBQUksR0FBSSxRQUFxQyxDQUFDLEtBQUssQ0FBQztnQkFDbEQsWUFBWSxFQUFFLFFBQVE7Z0JBQ3RCLEdBQUcsT0FBTzthQUNYLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLENBQUMsRUFDSCxNQUFNLEVBQ04sVUFBVSxHQUFHLEtBQUssRUFDbEIsUUFBUSxHQUFHLElBQUksRUFDZixHQUFHLE9BQU8sS0FNUixFQUFFO1FBQ0osSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksUUFBUSxLQUFLLFNBQVM7WUFDeEIsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLElBQ0UsQ0FBQyxDQUNDLFFBQVEsWUFBWSxtQkFBbUI7WUFDdkMsUUFBUSxZQUFZLCtCQUErQixDQUNwRDtZQUVELE9BQU8sVUFBVSxDQUNmLEdBQUcsRUFBRSxDQUNILElBQUksS0FBSyxDQUNQLGdGQUFnRixDQUNqRixDQUNKLENBQUM7UUFFSixrQ0FBa0M7UUFDbEMsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxhQUFhLEVBQUU7WUFDdkQsT0FBTyxVQUFVLENBQ2YsR0FBRyxFQUFFLENBQ0gsSUFBSSxLQUFLLENBQ1AseUVBQXlFLENBQzFFLENBQ0osQ0FBQztRQUNKLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5RCxJQUNFLFFBQVEsWUFBWSxtQkFBbUI7WUFDdkMsQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sS0FBSyxRQUFRLENBQUM7WUFDNUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBRWxCLE9BQU8sVUFBVSxDQUNmLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQ3pELENBQUM7UUFDSixJQUNFLFFBQVEsWUFBWSwrQkFBK0I7WUFDbkQsTUFBTSxLQUFLLFFBQVE7WUFFbkIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXRCLElBQUksUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFO1lBQ3JELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQztTQUMvRDtRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDNUIsWUFBWSxFQUFFLE1BQU0sS0FBSyxRQUFRO1lBQ2pDLGFBQWEsRUFBRSxJQUFJO1lBQ25CLG1CQUFtQixFQUFFLElBQUk7WUFDekIsa0JBQWtCLEVBQUUsVUFBVTtTQUMvQixDQUFNLENBQUM7UUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQ2xCLENBQUMsTUFBTSxLQUFLLFFBQVE7WUFDbEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUNuQyxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVE7Z0JBQ3JCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7Z0JBQ3BFLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FDckUsQ0FBQyxJQUFJLENBQ0osR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQ3JFLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLENBQUMsRUFDTixHQUFHLE9BQU8sS0FHUixFQUFFO1FBQ0osSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksUUFBUSxLQUFLLFNBQVM7WUFDeEIsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQ0UsQ0FBQyxDQUNDLFFBQVEsWUFBWSxtQkFBbUI7WUFDdkMsUUFBUSxZQUFZLCtCQUErQixDQUNwRDtZQUVELE9BQU8sVUFBVSxDQUNmLEdBQUcsRUFBRSxDQUNILElBQUksS0FBSyxDQUNQLG1GQUFtRixDQUNwRixDQUNKLENBQUM7UUFDSixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNwQixPQUFPLFVBQVUsQ0FDZixHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUM1RCxDQUFDO1FBRUosTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBTSxDQUFDO1FBQzVELE1BQU0sSUFBSSxHQUFHLFFBQVE7YUFDbEIsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQzthQUNqRCxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQ3JFLENBQUM7UUFDSixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUM3QixHQUFHLENBQUMsR0FBRyxFQUFFLENBQ1AsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FDbkUsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FDSCxJQUEwRTtRQUUxRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFTLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsRUFDVCxrQkFBa0IsR0FBRyxLQUFLLE1BQ1UsRUFBRTtRQUN0QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBSSxHQUF1QjtRQUNqQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsWUFBWSxDQUNWLElBQVksRUFDWixNQUFnQixFQUNoQixZQUEwRCxFQUMxRCxFQUFFLEdBQUcsT0FBTyxLQUFtQyxFQUFFO1FBRWpELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsQ0FBQyxRQUFRLFlBQVksbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDbEUsT0FBTyxVQUFVLENBQ2YsR0FBRyxFQUFFLENBQ0gsSUFBSSxLQUFLLENBQ1Asd0VBQXdFLENBQ3pFLENBQ0osQ0FBQztRQUVKLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQU8sSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDMUUsUUFBUSxZQUFZLEVBQUU7WUFDcEIsS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDNUMsS0FBSyxPQUFPO2dCQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDekMsS0FBSyxZQUFZO2dCQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDOUM7Z0JBQ0UsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLFlBQVksRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDMUQ7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUNSLElBQVksRUFDWixNQUFnQixFQUNoQixZQUEwRCxFQUMxRCxFQUFFLEdBQUcsT0FBTyxLQUFpQyxFQUFFO1FBRS9DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsQ0FBQyxRQUFRLFlBQVksbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDbEUsT0FBTyxVQUFVLENBQ2YsR0FBRyxFQUFFLENBQ0gsSUFBSSxLQUFLLENBQ1Asb0VBQW9FLENBQ3JFLENBQ0osQ0FBQztRQUVKLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQU8sSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDMUUsUUFBUSxZQUFZLEVBQUU7WUFDcEIsS0FBSyxVQUFVO2dCQUNiLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDOUMsS0FBSyxPQUFPO2dCQUNWLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDM0MsS0FBSyxZQUFZO2dCQUNmLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEQ7Z0JBQ0UsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLFlBQVksRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDNUQ7SUFDSCxDQUFDO0lBRUQsT0FBTztJQUNQLElBQUksQ0FBSSxJQUFZO1FBQ2xCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsQ0FBQyxRQUFRLFlBQVksbUJBQW1CLENBQUM7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FDYiwrREFBK0QsQ0FDaEUsQ0FBQztRQUVKLE9BQU8sUUFBUTthQUNaLElBQUksQ0FBSSxJQUFJLENBQUM7YUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQTRCLEVBQUU7WUFDL0QsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQVM7U0FDN0IsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHVCQUF1QixDQUNyQixJQUFzQixFQUN0QixZQUFvQyxFQUNwQyxFQUFFLEdBQUcsT0FBTyxLQUF5QyxFQUFFO1FBRXZELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDakMsSUFBSSxDQUNpQyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNuQyxRQUFRLFlBQVksRUFBRTtZQUNwQixLQUFLLE9BQU87Z0JBQ1YsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLEtBQUssWUFBWTtnQkFDZixPQUFPLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQsWUFBWTtJQUNaLFFBQVEsQ0FDTixJQUFzQixFQUN0QixPQUFzQjtRQUV0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLFVBQVU7WUFDekMsTUFBTSxLQUFLLENBQUMsaUNBQWlDLElBQWMsRUFBRSxDQUFDLENBQUM7UUFFakUsSUFBSSxLQUFLLEdBQUksSUFBWSxDQUFDLElBQUksQ0FHTyxDQUFDO1FBQ3RDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsZUFBZSxDQUNoQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQ1ksQ0FBQztZQUM5QixPQUFPLEtBQUssQ0FBQyxVQUFVO2dCQUNyQixDQUFDLENBQUMsSUFBSTtxQkFDRCxlQUFlLENBQUMsT0FBTyxDQUFDO3FCQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7b0JBQzFCLENBQUMsQ0FBQyxJQUFJO3lCQUNELFVBQVUsQ0FBQyxPQUFPLENBQUM7eUJBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDbkUsQ0FBQyxDQUFDLElBQUk7eUJBQ0QsYUFBYSxDQUFDLE9BQU8sQ0FBQzt5QkFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdkU7UUFDRCxPQUFPLEVBQUUsQ0FBQyxLQUFVLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFlBQVksQ0FDVixJQUFzQixFQUN0QixLQUErRCxFQUMvRCxPQUFzQjtRQUV0QixNQUFNLFNBQVMsR0FDYixJQUFJLENBQUMsa0JBQWtCLENBQUksSUFBSSxDQUNoQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQztRQUNoQyxJQUFJLElBQUksR0FBRyxLQUF3QixDQUFDO1FBQ3BDLElBQUksS0FBSyxZQUFZLFVBQVUsRUFBRTtZQUMvQixJQUFJLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FDbEIsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUEyQixFQUMzRCxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUNyQixDQUFDO1NBQ0g7YUFBTSxJQUFJLEtBQUssWUFBWSxlQUFlLEVBQUU7WUFDM0MsSUFBSSxHQUFHLFFBQVEsQ0FDYixLQUFLO2lCQUNGLE1BQU0sRUFBRTtpQkFDUixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNULFNBQVMsQ0FBQyxHQUFHLENBQ1gsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUEyQixFQUNuRCxPQUFPLENBQ1IsQ0FDRixDQUNKLENBQUM7U0FDSDthQUFNLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUN6QixJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDOUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDZixJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUU7WUFDN0IsS0FBSyxFQUFFLElBQUk7WUFDWCxPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO1NBQzlCLENBQUMsQ0FDSCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUNkLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxZQUFZLENBQ1YsSUFBc0I7UUFFdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUksSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVU7WUFDMUMsTUFBTSxLQUFLLENBQ1QsZ0RBQWdELElBQWMsRUFBRSxDQUNqRSxDQUFDO1FBRUosSUFBSSxLQUFLLEdBQUksSUFBWSxDQUFDLElBQUksQ0FHdEIsQ0FBQztRQUNULElBQUksS0FBSyxLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNoQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO2dCQUNwQixLQUFLLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7YUFDbkQ7aUJBQU07Z0JBQ0wsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQU0sQ0FBQztnQkFDMUMsS0FBSztvQkFDSCxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDdkU7WUFDQSxJQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1NBQzdCO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLE1BQU0sQ0FBQyxLQUFvQjtRQUN6QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDM0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLE9BQU8sQ0FDTCxJQUFJLEtBQUssS0FBSztZQUNkLENBQUMsT0FBTyxJQUFJLEtBQUssT0FBTyxLQUFLO2dCQUMzQixDQUFPLElBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFXLEtBQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztvQkFDM0QsQ0FBQyxPQUFPLEtBQUssU0FBUzt3QkFDcEIsUUFBUSxLQUFLLFNBQVM7d0JBQ3RCLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3RCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUk7WUFDMUIsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUF1QztZQUN4RCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FDNUQsVUFBVSxDQUFDLFNBQVMsQ0FDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE5FVkVSLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBERUZBVUxUX1ZFUlNJT04gfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHtcbiAgRW50aXR5S2V5LFxuICBPRGF0YUFjdGlvbk9wdGlvbnMsXG4gIE9EYXRhRW50aXR5LFxuICBPRGF0YUVudGl0eUFubm90YXRpb25zLFxuICBPRGF0YUVudGl0eVJlc291cmNlLFxuICBPRGF0YUZ1bmN0aW9uT3B0aW9ucyxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFPcHRpb25zLFxuICBPRGF0YVByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhUXVlcnlBcmd1bWVudHNPcHRpb25zLFxuICBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXIsXG4gIE9EYXRhUmVzb3VyY2UsXG4gIE9EYXRhU2luZ2xldG9uUmVzb3VyY2UsXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBPRGF0YVN0cnVjdHVyZWRUeXBlIH0gZnJvbSAnLi4vc2NoZW1hJztcbmltcG9ydCB7IE9iamVjdHMsIFN0cmluZ3MsIFR5cGVzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgT0RhdGFDb2xsZWN0aW9uIH0gZnJvbSAnLi9jb2xsZWN0aW9uJztcbmltcG9ydCB7XG4gIElOQ0xVREVfREVFUCxcbiAgSU5DTFVERV9TSEFMTE9XLFxuICBNb2RlbE9wdGlvbnMsXG4gIE9EYXRhTW9kZWxFdmVudCxcbiAgT0RhdGFNb2RlbEZpZWxkLFxuICBPRGF0YU1vZGVsT3B0aW9ucyxcbiAgT0RhdGFNb2RlbFJlbGF0aW9uLFxufSBmcm9tICcuL29wdGlvbnMnO1xuXG4vLyBAZHluYW1pY1xuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWw8VD4ge1xuICAvLyBQcm9wZXJ0aWVzXG4gIHN0YXRpYyBvcHRpb25zOiBNb2RlbE9wdGlvbnM7XG4gIHN0YXRpYyBtZXRhOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICBzdGF0aWMgYnVpbGRNZXRhPFQ+KHtcbiAgICBvcHRpb25zLFxuICAgIHNjaGVtYSxcbiAgfToge1xuICAgIG9wdGlvbnM/OiBNb2RlbE9wdGlvbnM7XG4gICAgc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+O1xuICB9KSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IGZpZWxkcyA9IHNjaGVtYVxuICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLCBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBmKSA9PiB7XG4gICAgICAgICAgbGV0IG5hbWUgPSBmLm5hbWU7XG4gICAgICAgICAgLy8gUHJldmVudCBjb2xsaXNpb24gd2l0aCByZXNlcnZlZCBrZXl3b3Jkc1xuICAgICAgICAgIHdoaWxlIChSRVNFUlZFRF9GSUVMRF9OQU1FUy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAnXyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywge1xuICAgICAgICAgICAgW25hbWVdOiB7XG4gICAgICAgICAgICAgIGZpZWxkOiBmLm5hbWUsXG4gICAgICAgICAgICAgIGRlZmF1bHQ6IGYuZGVmYXVsdCxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6ICFmLm51bGxhYmxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwge30pO1xuICAgICAgb3B0aW9ucyA9IHsgZmllbGRzIH07XG4gICAgfVxuICAgIHRoaXMubWV0YSA9IG5ldyBPRGF0YU1vZGVsT3B0aW9uczxUPih7IG9wdGlvbnMsIHNjaGVtYSB9KTtcbiAgfVxuICAvLyBQYXJlbnRcbiAgX3BhcmVudDpcbiAgICB8IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICBdXG4gICAgfCBudWxsID0gbnVsbDtcbiAgX3Jlc291cmNlOiBPRGF0YVJlc291cmNlPFQ+IHwgbnVsbCA9IG51bGw7XG4gIF9yZXNvdXJjZXM6IHtcbiAgICBwYXJlbnQ6XG4gICAgICB8IFtcbiAgICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICAgICAgICBdXG4gICAgICB8IG51bGw7XG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8VD4gfCBudWxsO1xuICB9W10gPSBbXTtcbiAgX2F0dHJpYnV0ZXM6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICBfY2hhbmdlczogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIF9yZWxhdGlvbnM6IE1hcDxzdHJpbmcsIE9EYXRhTW9kZWxSZWxhdGlvbjxhbnk+PiA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIE9EYXRhTW9kZWxSZWxhdGlvbjxhbnk+XG4gID4oKTtcbiAgX2Fubm90YXRpb25zOiBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+IHwgbnVsbCA9IG51bGw7XG4gIF9yZXNldDogYm9vbGVhbiA9IGZhbHNlO1xuICBfcmVwYXJlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgX3NpbGVudDogYm9vbGVhbiA9IGZhbHNlO1xuICBfbWV0YTogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgLy8gRXZlbnRzXG4gIGV2ZW50cyQgPSBuZXcgRXZlbnRFbWl0dGVyPE9EYXRhTW9kZWxFdmVudDxUPj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkYXRhOiBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICB7XG4gICAgICBwYXJlbnQsXG4gICAgICByZXNvdXJjZSxcbiAgICAgIGFubm90cyxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgcGFyZW50PzogW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgIF07XG4gICAgICByZXNvdXJjZT86IE9EYXRhUmVzb3VyY2U8VD47XG4gICAgICBhbm5vdHM/OiBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+O1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApIHtcbiAgICBjb25zdCBLbGFzcyA9IHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIE9EYXRhTW9kZWw7XG4gICAgaWYgKEtsYXNzLm1ldGEgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT0RhdGFNb2RlbDogQ2FuJ3QgY3JlYXRlIG1vZGVsIHdpdGhvdXQgbWV0YWRhdGFgKTtcbiAgICB0aGlzLl9tZXRhID0gS2xhc3MubWV0YTtcbiAgICB0aGlzLl9tZXRhLmJpbmQodGhpcywgeyBwYXJlbnQsIHJlc291cmNlLCBhbm5vdHMgfSk7XG5cbiAgICAvLyBDbGllbnQgSWRcbiAgICAoPGFueT50aGlzKVt0aGlzLl9tZXRhLmNpZF0gPVxuICAgICAgKDxhbnk+ZGF0YSlbdGhpcy5fbWV0YS5jaWRdIHx8XG4gICAgICBTdHJpbmdzLnVuaXF1ZUlkKGAke0tsYXNzLm1ldGEuc2NoZW1hLm5hbWUudG9Mb3dlckNhc2UoKX0tYCk7XG5cbiAgICBsZXQgYXR0cnMgPSB0aGlzLmFubm90cygpLmF0dHJpYnV0ZXMoZGF0YSwgJ2Z1bGwnKTtcbiAgICBsZXQgZGVmYXVsdHMgPSB0aGlzLmRlZmF1bHRzKCk7XG5cbiAgICB0aGlzLmFzc2lnbihPYmplY3RzLm1lcmdlKGRlZmF1bHRzLCBhdHRycyBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSksIHtcbiAgICAgIHJlc2V0LFxuICAgIH0pO1xuICB9XG5cbiAgLy8jcmVnaW9uIFJlc291cmNlc1xuICByZXNvdXJjZSgpOlxuICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+IHtcbiAgICByZXR1cm4gT0RhdGFNb2RlbE9wdGlvbnMucmVzb3VyY2U8VD4odGhpcykgYXNcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+O1xuICB9XG5cbiAgcHVzaFJlc291cmNlKFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgKSB7XG4gICAgLy8gUHVzaCBjdXJyZW50IHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICB0aGlzLl9yZXNvdXJjZXMucHVzaCh7IHBhcmVudDogdGhpcy5fcGFyZW50LCByZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UgfSk7XG4gICAgLy8gUmVwbGFjZSBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG5cbiAgcG9wUmVzb3VyY2UoKSB7XG4gICAgLy8gUG9wIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICBjb25zdCBwb3AgPSB0aGlzLl9yZXNvdXJjZXMucG9wKCk7XG4gICAgaWYgKHBvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0geyBwYXJlbnQ6IHRoaXMuX3BhcmVudCwgcmVzb3VyY2U6IHRoaXMuX3Jlc291cmNlIH07XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwb3AucGFyZW50O1xuICAgICAgdGhpcy5fcmVzb3VyY2UgPSBwb3AucmVzb3VyY2U7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5hdmlnYXRpb25Qcm9wZXJ0eTxOPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nXG4gICk6IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Tj4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fbWV0YS5maWVsZChuYW1lKTtcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCAhZmllbGQubmF2aWdhdGlvbilcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgbmF2aWdhdGlvblByb3BlcnR5OiBDYW4ndCBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHkgJHtuYW1lIGFzIHN0cmluZ31gXG4gICAgICApO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB8fCAhcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJuYXZpZ2F0aW9uUHJvcGVydHk6IENhbid0IGdldCBuYXZpZ2F0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGZpZWxkLnJlc291cmNlRmFjdG9yeTxULCBOPihcbiAgICAgIHJlc291cmNlXG4gICAgKSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPE4+O1xuICB9XG5cbiAgcHJvcGVydHk8Tj4obmFtZTogc3RyaW5nKTogT0RhdGFQcm9wZXJ0eVJlc291cmNlPE4+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmllbGQobmFtZSk7XG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgZmllbGQubmF2aWdhdGlvbilcbiAgICAgIHRocm93IEVycm9yKGBwcm9wZXJ0eTogQ2FuJ3QgZmluZCBwcm9wZXJ0eSAke25hbWV9YCk7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBcInByb3BlcnR5OiBDYW4ndCBnZXQgcHJvcGVydHkgd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlIHdpdGgga2V5XCJcbiAgICAgICk7XG5cbiAgICByZXR1cm4gZmllbGQucmVzb3VyY2VGYWN0b3J5PFQsIE4+KHJlc291cmNlKSBhcyBPRGF0YVByb3BlcnR5UmVzb3VyY2U8Tj47XG4gIH1cblxuICBhdHRhY2goXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPlxuICApIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5hdHRhY2godGhpcywgcmVzb3VyY2UpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIHNjaGVtYSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5zY2hlbWE7XG4gIH1cblxuICBhbm5vdHMoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2Fubm90YXRpb25zID8/XG4gICAgICBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxUPihPRGF0YUhlbHBlcltERUZBVUxUX1ZFUlNJT05dKVxuICAgICk7XG4gIH1cblxuICBrZXkoe1xuICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICByZXNvbHZlID0gdHJ1ZSxcbiAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9KTpcbiAgICB8IEVudGl0eUtleTxUPlxuICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEucmVzb2x2ZUtleSh0aGlzLCB7IGZpZWxkX21hcHBpbmcsIHJlc29sdmUgfSk7XG4gIH1cblxuICBpc1BhcmVudE9mKFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjaGlsZCAhPT0gdGhpcyAmJlxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuY2hhaW4oY2hpbGQpLnNvbWUoKHApID0+IHBbMF0gPT09IHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIHJlZmVyZW50aWFsKFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PixcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5yZXNvbHZlUmVmZXJlbnRpYWwodGhpcywgZmllbGQsIHtcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICByZXNvbHZlLFxuICAgIH0pO1xuICB9XG5cbiAgcmVmZXJlbmNlZChcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEucmVzb2x2ZVJlZmVyZW5jZWQodGhpcywgZmllbGQsIHtcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICByZXNvbHZlLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gVmFsaWRhdGlvblxuICBfZXJyb3JzPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgdmFsaWRhdGUoe1xuICAgIG1ldGhvZCxcbiAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHtcbiAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnZhbGlkYXRlKHRoaXMsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pO1xuICB9XG5cbiAgaXNWYWxpZCh7XG4gICAgbWV0aG9kLFxuICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgfToge1xuICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgfSA9IHt9KTogYm9vbGVhbiB7XG4gICAgdGhpcy5fZXJyb3JzID0gdGhpcy52YWxpZGF0ZSh7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KTtcbiAgICBpZiAodGhpcy5fZXJyb3JzICE9PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnaW52YWxpZCcsIHtcbiAgICAgICAgICBtb2RlbDogdGhpcyxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5fZXJyb3JzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgbWV0aG9kIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9lcnJvcnMgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGRlZmF1bHRzKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmRlZmF1bHRzKCkgfHwge307XG4gIH1cblxuICB0b0VudGl0eSh7XG4gICAgY2xpZW50X2lkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29tcHV0ZWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2tleSA9IHRydWUsXG4gICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICBjaGFuZ2VzX29ubHkgPSBmYWxzZSxcbiAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgY2hhaW4gPSBbXSxcbiAgfToge1xuICAgIGNsaWVudF9pZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2tleT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9ub25fZmllbGQ/OiBib29sZWFuO1xuICAgIGNoYW5nZXNfb25seT86IGJvb2xlYW47XG4gICAgZmllbGRfbWFwcGluZz86IGJvb2xlYW47XG4gICAgY2hhaW4/OiAoT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PilbXTtcbiAgfSA9IHt9KTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS50b0VudGl0eSh0aGlzLCB7XG4gICAgICBjbGllbnRfaWQsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCxcbiAgICAgIGluY2x1ZGVfa2V5LFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICBjaGFuZ2VzX29ubHksXG4gICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgY2hhaW4sXG4gICAgfSk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9FbnRpdHkoKTtcbiAgfVxuXG4gIGF0dHJpYnV0ZXMoe1xuICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gIH06IHtcbiAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgfSA9IHt9KTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmF0dHJpYnV0ZXModGhpcywge1xuICAgICAgY2hhbmdlc19vbmx5LFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQsXG4gICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgfSk7XG4gIH1cblxuICBzZXQocGF0aDogc3RyaW5nIHwgc3RyaW5nW10sIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gKDxhbnk+dGhpcylbcGF0aEFycmF5WzBdXTtcbiAgICAgIHJldHVybiBtb2RlbC5zZXQocGF0aEFycmF5LnNsaWNlKDEpLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gKCg8YW55PnRoaXMpW3BhdGhBcnJheVswXV0gPSB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKTogYW55IHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB2YWx1ZSA9ICg8YW55PnRoaXMpW3BhdGhBcnJheVswXV07XG4gICAgaWYgKFxuICAgICAgcGF0aEFycmF5Lmxlbmd0aCA+IDEgJiZcbiAgICAgICh2YWx1ZSBpbnN0YW5jZW9mIE9EYXRhTW9kZWwgfHwgdmFsdWUgaW5zdGFuY2VvZiBPRGF0YUNvbGxlY3Rpb24pXG4gICAgKSB7XG4gICAgICByZXR1cm4gdmFsdWUuZ2V0KHBhdGhBcnJheS5zbGljZSgxKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJlc2V0KHtcbiAgICBwYXRoLFxuICAgIHNpbGVudCA9IGZhbHNlLFxuICB9OiB7IHBhdGg/OiBzdHJpbmcgfCBzdHJpbmdbXTsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBjb25zdCBwYXRoQXJyYXk6IHN0cmluZ1tdID0gKFxuICAgICAgcGF0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gW11cbiAgICAgICAgOiBUeXBlcy5pc0FycmF5KHBhdGgpXG4gICAgICAgID8gcGF0aFxuICAgICAgICA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBjb25zdCBuYW1lID0gcGF0aEFycmF5WzBdO1xuICAgIGNvbnN0IHZhbHVlID0gbmFtZSAhPT0gdW5kZWZpbmVkID8gKDxhbnk+dGhpcylbbmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkgfHxcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSlcbiAgICApIHtcbiAgICAgIHZhbHVlLnJlc2V0KHsgcGF0aDogcGF0aEFycmF5LnNsaWNlKDEpLCBzaWxlbnQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21ldGEucmVzZXQodGhpcywgeyBuYW1lOiBwYXRoQXJyYXlbMF0sIHNpbGVudCB9KTtcbiAgICB9XG4gIH1cblxuICBjbGVhcih7IHNpbGVudCA9IGZhbHNlIH06IHsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICB0aGlzLl9hdHRyaWJ1dGVzLmNsZWFyKCk7XG4gICAgdGhpcy5fY2hhbmdlcy5jbGVhcigpO1xuICAgIHRoaXMuX3JlbGF0aW9ucy5jbGVhcigpO1xuICAgIGlmICghc2lsZW50KSB7XG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgndXBkYXRlJywge1xuICAgICAgICAgIG1vZGVsOiB0aGlzLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3NpZ24oXG4gICAgZW50aXR5OiBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAge1xuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICB9OiB7IHJlc2V0PzogYm9vbGVhbjsgcmVwYXJlbnQ/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5hc3NpZ24odGhpcywgZW50aXR5LCB7IHJlc2V0LCBzaWxlbnQsIHJlcGFyZW50IH0pO1xuICB9XG5cbiAgY2xvbmU8TSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+KCkge1xuICAgIGxldCBDdG9yID0gPHR5cGVvZiBPRGF0YU1vZGVsPnRoaXMuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIG5ldyBDdG9yKHRoaXMudG9FbnRpdHkoSU5DTFVERV9TSEFMTE9XKSwge1xuICAgICAgcmVzb3VyY2U6IHRoaXMucmVzb3VyY2UoKSBhcyBPRGF0YVJlc291cmNlPFQ+LFxuICAgICAgYW5ub3RzOiB0aGlzLmFubm90cygpLFxuICAgIH0pIGFzIE07XG4gIH1cblxuICBwcml2YXRlIF9yZXF1ZXN0KG9icyQ6IE9ic2VydmFibGU8T0RhdGFFbnRpdHk8YW55Pj4pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3JlcXVlc3QnLCB7XG4gICAgICAgIG1vZGVsOiB0aGlzLFxuICAgICAgICBvcHRpb25zOiB7IG9ic2VydmFibGU6IG9icyQgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gb2JzJC5waXBlKFxuICAgICAgbWFwKCh7IGVudGl0eSwgYW5ub3RzIH0pID0+IHtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdHM7XG4gICAgICAgIHRoaXMuYXNzaWduKGFubm90cy5hdHRyaWJ1dGVzKGVudGl0eSB8fCB7fSwgJ2Z1bGwnKSwge1xuICAgICAgICAgIHJlc2V0OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnc3luYycsIHtcbiAgICAgICAgICAgIG1vZGVsOiB0aGlzLFxuICAgICAgICAgICAgb3B0aW9uczogeyBlbnRpdHksIGFubm90cyB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZmV0Y2goe1xuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnM7XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignZmV0Y2g6IFJlc291cmNlIGlzIHVuZGVmaW5lZCcpKTtcblxuICAgIGxldCBvYnMkOiBPYnNlcnZhYmxlPE9EYXRhRW50aXR5PFQ+PjtcbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB7XG4gICAgICBvYnMkID0gcmVzb3VyY2UuZmV0Y2gob3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UpIHtcbiAgICAgIG9icyQgPSByZXNvdXJjZS5mZXRjaCh7IHJlc3BvbnNlVHlwZTogJ2VudGl0eScsIC4uLm9wdGlvbnMgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9icyQgPSAocmVzb3VyY2UgYXMgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+KS5mZXRjaCh7XG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2VudGl0eScsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCk7XG4gIH1cblxuICBzYXZlKHtcbiAgICBtZXRob2QsXG4gICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIHZhbGlkYXRlID0gdHJ1ZSxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgdmFsaWRhdGU/OiBib29sZWFuO1xuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnM7XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignc2F2ZTogUmVzb3VyY2UgaXMgdW5kZWZpbmVkJykpO1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSB8fFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2VcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnc2F2ZTogUmVzb3VyY2UgdHlwZSBPRGF0YUVudGl0eVJlc291cmNlL09EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UgbmVlZGVkJ1xuICAgICAgICAgIClcbiAgICAgICk7XG5cbiAgICAvLyBSZXNvbHZlIG1ldGhvZCBhbmQgcmVzb3VyY2Uga2V5XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkICYmIHRoaXMuc2NoZW1hKCkuaXNDb21wb3VuZEtleSgpKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ3NhdmU6IENvbXBvc2l0ZSBrZXkgcmVxdWlyZSBhIHNwZWNpZmljIG1ldGhvZCwgdXNlIGNyZWF0ZS91cGRhdGUvbW9kaWZ5J1xuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgbWV0aG9kID0gbWV0aG9kIHx8ICghcmVzb3VyY2UuaGFzS2V5KCkgPyAnY3JlYXRlJyA6ICd1cGRhdGUnKTtcbiAgICBpZiAoXG4gICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgJiZcbiAgICAgIChtZXRob2QgPT09ICd1cGRhdGUnIHx8IG1ldGhvZCA9PT0gJ21vZGlmeScpICYmXG4gICAgICAhcmVzb3VyY2UuaGFzS2V5KClcbiAgICApXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT4gbmV3IEVycm9yKCdzYXZlOiBVcGRhdGUvUGF0Y2ggcmVxdWlyZSBlbnRpdHkga2V5JylcbiAgICAgICk7XG4gICAgaWYgKFxuICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlIHx8XG4gICAgICBtZXRob2QgPT09ICdjcmVhdGUnXG4gICAgKVxuICAgICAgcmVzb3VyY2UuY2xlYXJLZXkoKTtcblxuICAgIGlmICh2YWxpZGF0ZSAmJiAhdGhpcy5pc1ZhbGlkKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ3NhdmU6IFZhbGlkYXRpb24gZXJyb3JzJykpO1xuICAgIH1cbiAgICBjb25zdCBfZW50aXR5ID0gdGhpcy50b0VudGl0eSh7XG4gICAgICBjaGFuZ2VzX29ubHk6IG1ldGhvZCA9PT0gJ21vZGlmeScsXG4gICAgICBmaWVsZF9tYXBwaW5nOiB0cnVlLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeTogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogbmF2aWdhdGlvbixcbiAgICB9KSBhcyBUO1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgKG1ldGhvZCA9PT0gJ2NyZWF0ZSdcbiAgICAgICAgPyByZXNvdXJjZS5jcmVhdGUoX2VudGl0eSwgb3B0aW9ucylcbiAgICAgICAgOiBtZXRob2QgPT09ICdtb2RpZnknXG4gICAgICAgID8gcmVzb3VyY2UubW9kaWZ5KF9lbnRpdHksIHsgZXRhZzogdGhpcy5hbm5vdHMoKS5ldGFnLCAuLi5vcHRpb25zIH0pXG4gICAgICAgIDogcmVzb3VyY2UudXBkYXRlKF9lbnRpdHksIHsgZXRhZzogdGhpcy5hbm5vdHMoKS5ldGFnLCAuLi5vcHRpb25zIH0pXG4gICAgICApLnBpcGUoXG4gICAgICAgIG1hcCgoeyBlbnRpdHksIGFubm90cyB9KSA9PiAoeyBlbnRpdHk6IGVudGl0eSB8fCBfZW50aXR5LCBhbm5vdHMgfSkpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGRlc3Ryb3koe1xuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnM7XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignZGVzdHJveTogUmVzb3VyY2UgaXMgdW5kZWZpbmVkJykpO1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSB8fFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2VcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnZGVzdHJveTogUmVzb3VyY2UgdHlwZSBPRGF0YUVudGl0eVJlc291cmNlL09EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UgbmVlZGVkJ1xuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgaWYgKCFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PiBuZXcgRXJyb3IoXCJkZXN0cm95OiBDYW4ndCBkZXN0cm95IG1vZGVsIHdpdGhvdXQga2V5XCIpXG4gICAgICApO1xuXG4gICAgY29uc3QgX2VudGl0eSA9IHRoaXMudG9FbnRpdHkoeyBmaWVsZF9tYXBwaW5nOiB0cnVlIH0pIGFzIFQ7XG4gICAgY29uc3Qgb2JzJCA9IHJlc291cmNlXG4gICAgICAuZGVzdHJveSh7IGV0YWc6IHRoaXMuYW5ub3RzKCkuZXRhZywgLi4ub3B0aW9ucyB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoeyBlbnRpdHksIGFubm90cyB9KSA9PiAoeyBlbnRpdHk6IGVudGl0eSB8fCBfZW50aXR5LCBhbm5vdHMgfSkpXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQpLnBpcGUoXG4gICAgICB0YXAoKCkgPT5cbiAgICAgICAgdGhpcy5ldmVudHMkLmVtaXQobmV3IE9EYXRhTW9kZWxFdmVudCgnZGVzdHJveScsIHsgbW9kZWw6IHRoaXMgfSkpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZXhlY3V0aW9uIGNvbnRleHQgZm9yIGNoYW5nZSB0aGUgaW50ZXJuYWwgcXVlcnkgb2YgYSByZXNvdXJjZVxuICAgKiBAcGFyYW0gZnVuYyBGdW5jdGlvbiB0byBleGVjdXRlXG4gICAqL1xuICBxdWVyeShcbiAgICBmdW5jOiAocTogT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyPFQ+LCBzPzogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPikgPT4gdm9pZFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5xdWVyeSh0aGlzLCB0aGlzLnJlc291cmNlKCksIGZ1bmMpIGFzIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIGNoZWNrIG9uIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgbW9kZWwgYW5kIHJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBpcyBjaGFuZ2VkLlxuICAgKiBAcGFyYW0gaW5jbHVkZV9uYXZpZ2F0aW9uIENoZWNrIGluIG5hdmlnYXRpb24gcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBtb2RlbCBoYXMgY2hhbmdlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBoYXNDaGFuZ2VkKHtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgfTogeyBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmhhc0NoYW5nZWQodGhpcywgeyBpbmNsdWRlX25hdmlnYXRpb24gfSk7XG4gIH1cblxuICBpc05ldygpIHtcbiAgICByZXR1cm4gIXRoaXMuX21ldGEuaGFzS2V5KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBleGVjdXRpb24gY29udGV4dCBmb3IgYSBnaXZlbiBmdW5jdGlvbiwgd2hlcmUgdGhlIG1vZGVsIGlzIGJvdW5kIHRvIGl0cyBlbnRpdHkgZW5kcG9pbnRcbiAgICogQHBhcmFtIGN0eCBDb250ZXh0IGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGNvbnRleHRcbiAgICovXG4gIGFzRW50aXR5PFI+KGN0eDogKG1vZGVsOiB0aGlzKSA9PiBSKTogUiB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuYXNFbnRpdHkodGhpcywgY3R4KTtcbiAgfVxuXG4gIGNhbGxGdW5jdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScgfCAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nIHwgJ25vbmUnLFxuICAgIHsgLi4ub3B0aW9ucyB9OiB7fSAmIE9EYXRhRnVuY3Rpb25PcHRpb25zPFI+ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxSIHwgT0RhdGFNb2RlbDxSPiB8IE9EYXRhQ29sbGVjdGlvbjxSLCBPRGF0YU1vZGVsPFI+PiB8IG51bGw+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiY2FsbEZ1bmN0aW9uOiBDYW4ndCBjYWxsIGZ1bmN0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiXG4gICAgICAgICAgKVxuICAgICAgKTtcblxuICAgIGNvbnN0IGZ1bmMgPSByZXNvdXJjZS5mdW5jdGlvbjxQLCBSPihuYW1lKS5xdWVyeSgocSkgPT4gcS5hcHBseShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGxDb2xsZWN0aW9uKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICB9XG5cbiAgY2FsbEFjdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScgfCAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nIHwgJ25vbmUnLFxuICAgIHsgLi4ub3B0aW9ucyB9OiB7fSAmIE9EYXRhQWN0aW9uT3B0aW9uczxSPiA9IHt9XG4gICk6IE9ic2VydmFibGU8UiB8IE9EYXRhTW9kZWw8Uj4gfCBPRGF0YUNvbGxlY3Rpb248UiwgT0RhdGFNb2RlbDxSPj4gfCBudWxsPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB8fCAhcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcImNhbGxBY3Rpb246IENhbid0IGNhbGwgYWN0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiXG4gICAgICAgICAgKVxuICAgICAgKTtcblxuICAgIGNvbnN0IGFjdGlvbiA9IHJlc291cmNlLmFjdGlvbjxQLCBSPihuYW1lKS5xdWVyeSgocSkgPT4gcS5hcHBseShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsTW9kZWwocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGxDb2xsZWN0aW9uKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBDYXN0XG4gIGNhc3Q8Uz4odHlwZTogc3RyaW5nKTogT0RhdGFNb2RlbDxTPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGNhc3Q6IENhbid0IGNhc3QgdG8gZGVyaXZlZCBtb2RlbCB3aXRob3V0IE9EYXRhRW50aXR5UmVzb3VyY2VgXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHJlc291cmNlXG4gICAgICAuY2FzdDxTPih0eXBlKVxuICAgICAgLmFzTW9kZWwodGhpcy50b0VudGl0eShJTkNMVURFX0RFRVApIGFzIHsgW25hbWU6IHN0cmluZ106IGFueSB9LCB7XG4gICAgICAgIGFubm90czogdGhpcy5hbm5vdHMoKSBhcyBhbnksXG4gICAgICB9KTtcbiAgfVxuXG4gIGZldGNoTmF2aWdhdGlvblByb3BlcnR5PFM+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmcsXG4gICAgcmVzcG9uc2VUeXBlOiAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nLFxuICAgIHsgLi4ub3B0aW9ucyB9OiB7fSAmIE9EYXRhUXVlcnlBcmd1bWVudHNPcHRpb25zPFM+ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxPRGF0YU1vZGVsPFM+IHwgT0RhdGFDb2xsZWN0aW9uPFMsIE9EYXRhTW9kZWw8Uz4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IG5hdiA9IHRoaXMubmF2aWdhdGlvblByb3BlcnR5PFM+KFxuICAgICAgbmFtZVxuICAgICkgYXMgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxTPjtcbiAgICBuYXYucXVlcnkoKHEpID0+IHEuYXBwbHkob3B0aW9ucykpO1xuICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiBuYXYuZmV0Y2hNb2RlbChvcHRpb25zKTtcbiAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICByZXR1cm4gbmF2LmZldGNoQ29sbGVjdGlvbihvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgVmFsdWVcbiAgZ2V0VmFsdWU8UD4oXG4gICAgbmFtZToga2V5b2YgVCB8IHN0cmluZyxcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zXG4gICk6IE9ic2VydmFibGU8UCB8IE9EYXRhTW9kZWw8UD4gfCBPRGF0YUNvbGxlY3Rpb248UCwgT0RhdGFNb2RlbDxQPj4gfCBudWxsPiB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLl9tZXRhLmZpZWxkKG5hbWUpO1xuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IGZpZWxkLm5hdmlnYXRpb24pXG4gICAgICB0aHJvdyBFcnJvcihgZ2V0VmFsdWU6IENhbid0IGZpbmQgcHJvcGVydHkgJHtuYW1lIGFzIHN0cmluZ31gKTtcblxuICAgIGxldCB2YWx1ZSA9ICh0aGlzIGFzIGFueSlbbmFtZV0gYXNcbiAgICAgIHwgUFxuICAgICAgfCBPRGF0YU1vZGVsPFA+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PjtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcHJvcCA9IGZpZWxkLnJlc291cmNlRmFjdG9yeShcbiAgICAgICAgdGhpcy5yZXNvdXJjZSgpXG4gICAgICApIGFzIE9EYXRhUHJvcGVydHlSZXNvdXJjZTxQPjtcbiAgICAgIHJldHVybiBmaWVsZC5jb2xsZWN0aW9uXG4gICAgICAgID8gcHJvcFxuICAgICAgICAgICAgLmZldGNoQ29sbGVjdGlvbihvcHRpb25zKVxuICAgICAgICAgICAgLnBpcGUodGFwKChjKSA9PiB0aGlzLmFzc2lnbih7IFtuYW1lXTogYyB9LCB7IHNpbGVudDogdHJ1ZSB9KSkpXG4gICAgICAgIDogZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpXG4gICAgICAgID8gcHJvcFxuICAgICAgICAgICAgLmZldGNoTW9kZWwob3B0aW9ucylcbiAgICAgICAgICAgIC5waXBlKHRhcCgoYykgPT4gdGhpcy5hc3NpZ24oeyBbbmFtZV06IGMgfSwgeyBzaWxlbnQ6IHRydWUgfSkpKVxuICAgICAgICA6IHByb3BcbiAgICAgICAgICAgIC5mZXRjaFByb3BlcnR5KG9wdGlvbnMpXG4gICAgICAgICAgICAucGlwZSh0YXAoKGMpID0+IHRoaXMuYXNzaWduKHsgW25hbWVdOiBjIH0sIHsgc2lsZW50OiB0cnVlIH0pKSk7XG4gICAgfVxuICAgIHJldHVybiBvZih2YWx1ZSBhcyBQKTtcbiAgfVxuXG4gIC8vIFNldCBSZWZlcmVuY2VcbiAgc2V0UmVmZXJlbmNlPE4+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmcsXG4gICAgbW9kZWw6IE9EYXRhTW9kZWw8Tj4gfCBPRGF0YUNvbGxlY3Rpb248TiwgT0RhdGFNb2RlbDxOPj4gfCBudWxsLFxuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnNcbiAgKTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gKFxuICAgICAgdGhpcy5uYXZpZ2F0aW9uUHJvcGVydHk8Tj4obmFtZSkgYXMgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxOPlxuICAgICkucmVmZXJlbmNlKCk7XG5cbiAgICBjb25zdCBldGFnID0gdGhpcy5hbm5vdHMoKS5ldGFnO1xuICAgIGxldCBvYnMkID0gTkVWRVIgYXMgT2JzZXJ2YWJsZTxhbnk+O1xuICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIE9EYXRhTW9kZWwpIHtcbiAgICAgIG9icyQgPSByZWZlcmVuY2Uuc2V0KFxuICAgICAgICBtb2RlbC5fbWV0YS5lbnRpdHlSZXNvdXJjZShtb2RlbCkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxOPixcbiAgICAgICAgeyBldGFnLCAuLi5vcHRpb25zIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIE9EYXRhQ29sbGVjdGlvbikge1xuICAgICAgb2JzJCA9IGZvcmtKb2luKFxuICAgICAgICBtb2RlbFxuICAgICAgICAgIC5tb2RlbHMoKVxuICAgICAgICAgIC5tYXAoKG0pID0+XG4gICAgICAgICAgICByZWZlcmVuY2UuYWRkKFxuICAgICAgICAgICAgICBtLl9tZXRhLmVudGl0eVJlc291cmNlKG0pIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8Tj4sXG4gICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobW9kZWwgPT09IG51bGwpIHtcbiAgICAgIG9icyQgPSByZWZlcmVuY2UudW5zZXQoeyBldGFnLCAuLi5vcHRpb25zIH0pO1xuICAgIH1cbiAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3JlcXVlc3QnLCB7XG4gICAgICAgIG1vZGVsOiB0aGlzLFxuICAgICAgICBvcHRpb25zOiB7IG9ic2VydmFibGU6IG9icyQgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gb2JzJC5waXBlKFxuICAgICAgbWFwKChtb2RlbCkgPT4ge1xuICAgICAgICB0aGlzLmFzc2lnbih7IFtuYW1lXTogbW9kZWwgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3N5bmMnLCB7IG1vZGVsOiB0aGlzIH0pKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRSZWZlcmVuY2U8UD4oXG4gICAgbmFtZToga2V5b2YgVCB8IHN0cmluZ1xuICApOiBPRGF0YU1vZGVsPFA+IHwgT0RhdGFDb2xsZWN0aW9uPFAsIE9EYXRhTW9kZWw8UD4+IHwgbnVsbCB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLl9tZXRhLmZpZWxkPFA+KG5hbWUpO1xuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8ICFmaWVsZC5uYXZpZ2F0aW9uKVxuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBnZXRSZWZlcmVuY2U6IENhbid0IGZpbmQgbmF2aWdhdGlvbiBwcm9wZXJ0eSAke25hbWUgYXMgc3RyaW5nfWBcbiAgICAgICk7XG5cbiAgICBsZXQgbW9kZWwgPSAodGhpcyBhcyBhbnkpW25hbWVdIGFzXG4gICAgICB8IE9EYXRhTW9kZWw8UD5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPFAsIE9EYXRhTW9kZWw8UD4+XG4gICAgICB8IG51bGw7XG4gICAgaWYgKG1vZGVsID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICBpZiAobW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpZWxkLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgbW9kZWwgPSBmaWVsZC5jb2xsZWN0aW9uRmFjdG9yeSh7IHBhcmVudDogdGhpcyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWZlcmVuY2VkKGZpZWxkKSBhcyBQO1xuICAgICAgICBtb2RlbCA9XG4gICAgICAgICAgdmFsdWUgPT09IG51bGwgPyBudWxsIDogZmllbGQubW9kZWxGYWN0b3J5KHsgcGFyZW50OiB0aGlzLCB2YWx1ZSB9KTtcbiAgICAgIH1cbiAgICAgICh0aGlzIGFzIGFueSlbbmFtZV0gPSBtb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLy8gTW9kZWwgZnVuY3Rpb25zXG4gIGVxdWFscyhvdGhlcjogT0RhdGFNb2RlbDxUPikge1xuICAgIGNvbnN0IHRoaXNLZXkgPSB0aGlzLmtleSgpO1xuICAgIGNvbnN0IG90aGVyS2V5ID0gb3RoZXIua2V5KCk7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMgPT09IG90aGVyIHx8XG4gICAgICAodHlwZW9mIHRoaXMgPT09IHR5cGVvZiBvdGhlciAmJlxuICAgICAgICAoKDxhbnk+dGhpcylbdGhpcy5fbWV0YS5jaWRdID09PSAoPGFueT5vdGhlcilbdGhpcy5fbWV0YS5jaWRdIHx8XG4gICAgICAgICAgKHRoaXNLZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgb3RoZXJLZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgVHlwZXMuaXNFcXVhbCh0aGlzS2V5LCBvdGhlcktleSkpKSlcbiAgICApO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnTW9kZWwnO1xuICB9XG5cbiAgY29sbGVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50ICE9PSBudWxsICYmXG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odGhpcy5fcGFyZW50WzBdKVxuICAgICAgPyAodGhpcy5fcGFyZW50WzBdIGFzIE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PilcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgbmV4dCgpOiBPRGF0YU1vZGVsPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uKCk/Lm5leHQodGhpcyk7XG4gIH1cblxuICBwcmV2KCk6IE9EYXRhTW9kZWw8VD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb24oKT8ucHJldih0aGlzKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUkVTRVJWRURfRklFTERfTkFNRVMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhcbiAgT0RhdGFNb2RlbC5wcm90b3R5cGVcbik7XG4iXX0=
518
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvbW9kZWxzL21vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBSUwsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUVuQiwrQkFBK0IsR0FPaEMsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUNMLFlBQVksRUFDWixlQUFlLEVBR2YsZUFBZSxFQUVmLGlCQUFpQixHQUVsQixNQUFNLFdBQVcsQ0FBQztBQUVuQixXQUFXO0FBQ1gsTUFBTSxPQUFPLFVBQVU7SUErRHJCLFlBQ0UsT0FBNkMsRUFBRSxFQUMvQyxFQUNFLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssR0FBRyxLQUFLLE1BU1gsRUFBRTtRQTlDUixTQUFTO1FBQ1QsWUFBTyxHQUtJLElBQUksQ0FBQztRQUNoQixjQUFTLEdBQTRCLElBQUksQ0FBQztRQUMxQyxlQUFVLEdBUUosRUFBRSxDQUFDO1FBQ1QsZ0JBQVcsR0FBcUIsSUFBSSxHQUFHLEVBQWUsQ0FBQztRQUN2RCxhQUFRLEdBQXFC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T0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSTtZQUMxQixpQkFBaUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQyxDQUFDLENBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQXVDO1lBQ3hELENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUM1RCxVQUFVLENBQUMsU0FBUyxDQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgTkVWRVIsIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERFRkFVTFRfVkVSU0lPTiB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBPRGF0YUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcic7XG5pbXBvcnQge1xuICBFbnRpdHlLZXksXG4gIE9EYXRhQWN0aW9uT3B0aW9ucyxcbiAgT0RhdGFFbnRpdHksXG4gIE9EYXRhRW50aXR5QW5ub3RhdGlvbnMsXG4gIE9EYXRhRW50aXR5UmVzb3VyY2UsXG4gIE9EYXRhRnVuY3Rpb25PcHRpb25zLFxuICBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YU9wdGlvbnMsXG4gIE9EYXRhUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFRdWVyeUFyZ3VtZW50c09wdGlvbnMsXG4gIE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcixcbiAgT0RhdGFSZXNvdXJjZSxcbiAgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSxcbn0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IE9EYXRhU3RydWN0dXJlZFR5cGUgfSBmcm9tICcuLi9zY2hlbWEnO1xuaW1wb3J0IHsgT2JqZWN0cywgU3RyaW5ncywgVHlwZXMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBPRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtcbiAgSU5DTFVERV9ERUVQLFxuICBJTkNMVURFX1NIQUxMT1csXG4gIE1vZGVsRmllbGRPcHRpb25zLFxuICBNb2RlbE9wdGlvbnMsXG4gIE9EYXRhTW9kZWxFdmVudCxcbiAgT0RhdGFNb2RlbEZpZWxkLFxuICBPRGF0YU1vZGVsT3B0aW9ucyxcbiAgT0RhdGFNb2RlbFJlbGF0aW9uLFxufSBmcm9tICcuL29wdGlvbnMnO1xuXG4vLyBAZHluYW1pY1xuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWw8VD4ge1xuICAvLyBQcm9wZXJ0aWVzXG4gIHN0YXRpYyBvcHRpb25zOiBNb2RlbE9wdGlvbnM7XG4gIHN0YXRpYyBtZXRhOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICBzdGF0aWMgYnVpbGRNZXRhPFQ+KHtcbiAgICBvcHRpb25zLFxuICAgIHNjaGVtYSxcbiAgfToge1xuICAgIG9wdGlvbnM/OiBNb2RlbE9wdGlvbnM7XG4gICAgc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+O1xuICB9KSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IGZpZWxkcyA9IHNjaGVtYVxuICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLCBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBmKSA9PiB7XG4gICAgICAgICAgbGV0IG5hbWUgPSBmLm5hbWU7XG4gICAgICAgICAgLy8gUHJldmVudCBjb2xsaXNpb24gd2l0aCByZXNlcnZlZCBrZXl3b3Jkc1xuICAgICAgICAgIHdoaWxlIChSRVNFUlZFRF9GSUVMRF9OQU1FUy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAnXyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywge1xuICAgICAgICAgICAgW25hbWVdOiB7XG4gICAgICAgICAgICAgIGZpZWxkOiBmLm5hbWUsXG4gICAgICAgICAgICAgIGRlZmF1bHQ6IGYuZGVmYXVsdCxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6ICFmLm51bGxhYmxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwge30pO1xuICAgICAgb3B0aW9ucyA9IHsgZmllbGRzIH07XG4gICAgfVxuICAgIHRoaXMubWV0YSA9IG5ldyBPRGF0YU1vZGVsT3B0aW9uczxUPih7IG9wdGlvbnMsIHNjaGVtYSB9KTtcbiAgfVxuICAvLyBQYXJlbnRcbiAgX3BhcmVudDpcbiAgICB8IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICBdXG4gICAgfCBudWxsID0gbnVsbDtcbiAgX3Jlc291cmNlOiBPRGF0YVJlc291cmNlPFQ+IHwgbnVsbCA9IG51bGw7XG4gIF9yZXNvdXJjZXM6IHtcbiAgICBwYXJlbnQ6XG4gICAgICB8IFtcbiAgICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICAgICAgICBdXG4gICAgICB8IG51bGw7XG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8VD4gfCBudWxsO1xuICB9W10gPSBbXTtcbiAgX2F0dHJpYnV0ZXM6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICBfY2hhbmdlczogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIF9yZWxhdGlvbnM6IE1hcDxzdHJpbmcsIE9EYXRhTW9kZWxSZWxhdGlvbjxhbnk+PiA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIE9EYXRhTW9kZWxSZWxhdGlvbjxhbnk+XG4gID4oKTtcbiAgX2Fubm90YXRpb25zOiBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+IHwgbnVsbCA9IG51bGw7XG4gIF9yZXNldDogYm9vbGVhbiA9IGZhbHNlO1xuICBfcmVwYXJlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgX3NpbGVudDogYm9vbGVhbiA9IGZhbHNlO1xuICBfbWV0YTogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgLy8gRXZlbnRzXG4gIGV2ZW50cyQgPSBuZXcgRXZlbnRFbWl0dGVyPE9EYXRhTW9kZWxFdmVudDxUPj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkYXRhOiBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICB7XG4gICAgICBwYXJlbnQsXG4gICAgICByZXNvdXJjZSxcbiAgICAgIGFubm90cyxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgcGFyZW50PzogW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgIF07XG4gICAgICByZXNvdXJjZT86IE9EYXRhUmVzb3VyY2U8VD47XG4gICAgICBhbm5vdHM/OiBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+O1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApIHtcbiAgICBjb25zdCBLbGFzcyA9IHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIE9EYXRhTW9kZWw7XG4gICAgaWYgKEtsYXNzLm1ldGEgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT0RhdGFNb2RlbDogQ2FuJ3QgY3JlYXRlIG1vZGVsIHdpdGhvdXQgbWV0YWRhdGFgKTtcbiAgICB0aGlzLl9tZXRhID0gS2xhc3MubWV0YTtcbiAgICB0aGlzLl9tZXRhLmJpbmQodGhpcywgeyBwYXJlbnQsIHJlc291cmNlLCBhbm5vdHMgfSk7XG5cbiAgICAvLyBDbGllbnQgSWRcbiAgICAoPGFueT50aGlzKVt0aGlzLl9tZXRhLmNpZF0gPVxuICAgICAgKDxhbnk+ZGF0YSlbdGhpcy5fbWV0YS5jaWRdIHx8XG4gICAgICBTdHJpbmdzLnVuaXF1ZUlkKHsgcHJlZml4OiBgJHtLbGFzcy5tZXRhLnNjaGVtYS5uYW1lLnRvTG93ZXJDYXNlKCl9LWAgfSk7XG5cbiAgICBsZXQgYXR0cnMgPSB0aGlzLmFubm90cygpLmF0dHJpYnV0ZXMoZGF0YSwgJ2Z1bGwnKTtcbiAgICBsZXQgZGVmYXVsdHMgPSB0aGlzLmRlZmF1bHRzKCk7XG5cbiAgICB0aGlzLmFzc2lnbihPYmplY3RzLm1lcmdlKGRlZmF1bHRzLCBhdHRycyBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSksIHtcbiAgICAgIHJlc2V0LFxuICAgIH0pO1xuICB9XG5cbiAgLy8jcmVnaW9uIFJlc291cmNlc1xuICByZXNvdXJjZSgpOlxuICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+IHtcbiAgICByZXR1cm4gT0RhdGFNb2RlbE9wdGlvbnMucmVzb3VyY2U8VD4odGhpcykgYXNcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+O1xuICB9XG5cbiAgcHVzaFJlc291cmNlKFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgKSB7XG4gICAgLy8gUHVzaCBjdXJyZW50IHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICB0aGlzLl9yZXNvdXJjZXMucHVzaCh7IHBhcmVudDogdGhpcy5fcGFyZW50LCByZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UgfSk7XG4gICAgLy8gUmVwbGFjZSBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG5cbiAgcG9wUmVzb3VyY2UoKSB7XG4gICAgLy8gUG9wIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICBjb25zdCBwb3AgPSB0aGlzLl9yZXNvdXJjZXMucG9wKCk7XG4gICAgaWYgKHBvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0geyBwYXJlbnQ6IHRoaXMuX3BhcmVudCwgcmVzb3VyY2U6IHRoaXMuX3Jlc291cmNlIH07XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwb3AucGFyZW50O1xuICAgICAgdGhpcy5fcmVzb3VyY2UgPSBwb3AucmVzb3VyY2U7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5hdmlnYXRpb25Qcm9wZXJ0eTxOPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nXG4gICk6IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Tj4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fbWV0YS5maWVsZChuYW1lKTtcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCAhZmllbGQubmF2aWdhdGlvbilcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgbmF2aWdhdGlvblByb3BlcnR5OiBDYW4ndCBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHkgJHtuYW1lIGFzIHN0cmluZ31gXG4gICAgICApO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB8fCAhcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJuYXZpZ2F0aW9uUHJvcGVydHk6IENhbid0IGdldCBuYXZpZ2F0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGZpZWxkLnJlc291cmNlRmFjdG9yeTxULCBOPihcbiAgICAgIHJlc291cmNlXG4gICAgKSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPE4+O1xuICB9XG5cbiAgcHJvcGVydHk8Tj4obmFtZTogc3RyaW5nKTogT0RhdGFQcm9wZXJ0eVJlc291cmNlPE4+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmllbGQobmFtZSk7XG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgZmllbGQubmF2aWdhdGlvbilcbiAgICAgIHRocm93IEVycm9yKGBwcm9wZXJ0eTogQ2FuJ3QgZmluZCBwcm9wZXJ0eSAke25hbWV9YCk7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBcInByb3BlcnR5OiBDYW4ndCBnZXQgcHJvcGVydHkgd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlIHdpdGgga2V5XCJcbiAgICAgICk7XG5cbiAgICByZXR1cm4gZmllbGQucmVzb3VyY2VGYWN0b3J5PFQsIE4+KHJlc291cmNlKSBhcyBPRGF0YVByb3BlcnR5UmVzb3VyY2U8Tj47XG4gIH1cblxuICBhdHRhY2goXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPlxuICApIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5hdHRhY2godGhpcywgcmVzb3VyY2UpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIHNjaGVtYSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5zY2hlbWE7XG4gIH1cblxuICBhbm5vdHMoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2Fubm90YXRpb25zID8/XG4gICAgICBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxUPihPRGF0YUhlbHBlcltERUZBVUxUX1ZFUlNJT05dKVxuICAgICk7XG4gIH1cblxuICBrZXkoe1xuICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICByZXNvbHZlID0gdHJ1ZSxcbiAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9KTpcbiAgICB8IEVudGl0eUtleTxUPlxuICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEucmVzb2x2ZUtleSh0aGlzLCB7IGZpZWxkX21hcHBpbmcsIHJlc29sdmUgfSk7XG4gIH1cblxuICBpc09wZW5Nb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5pc09wZW5UeXBlKCk7XG4gIH1cblxuICBpc1BhcmVudE9mKFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjaGlsZCAhPT0gdGhpcyAmJlxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuY2hhaW4oY2hpbGQpLnNvbWUoKHApID0+IHBbMF0gPT09IHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIHJlZmVyZW50aWFsKFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PixcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5yZXNvbHZlUmVmZXJlbnRpYWwodGhpcywgZmllbGQsIHtcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICByZXNvbHZlLFxuICAgIH0pO1xuICB9XG5cbiAgcmVmZXJlbmNlZChcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEucmVzb2x2ZVJlZmVyZW5jZWQodGhpcywgZmllbGQsIHtcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICByZXNvbHZlLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gVmFsaWRhdGlvblxuICBfZXJyb3JzPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgdmFsaWRhdGUoe1xuICAgIG1ldGhvZCxcbiAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHtcbiAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnZhbGlkYXRlKHRoaXMsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pO1xuICB9XG5cbiAgaXNWYWxpZCh7XG4gICAgbWV0aG9kLFxuICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgfToge1xuICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgfSA9IHt9KTogYm9vbGVhbiB7XG4gICAgdGhpcy5fZXJyb3JzID0gdGhpcy52YWxpZGF0ZSh7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KTtcbiAgICBpZiAodGhpcy5fZXJyb3JzICE9PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnaW52YWxpZCcsIHtcbiAgICAgICAgICBtb2RlbDogdGhpcyxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5fZXJyb3JzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgbWV0aG9kIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9lcnJvcnMgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGRlZmF1bHRzKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmRlZmF1bHRzKCkgfHwge307XG4gIH1cblxuICB0b0VudGl0eSh7XG4gICAgY2xpZW50X2lkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29tcHV0ZWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2tleSA9IHRydWUsXG4gICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICBjaGFuZ2VzX29ubHkgPSBmYWxzZSxcbiAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgY2hhaW4gPSBbXSxcbiAgfToge1xuICAgIGNsaWVudF9pZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2tleT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9ub25fZmllbGQ/OiBib29sZWFuO1xuICAgIGNoYW5nZXNfb25seT86IGJvb2xlYW47XG4gICAgZmllbGRfbWFwcGluZz86IGJvb2xlYW47XG4gICAgY2hhaW4/OiAoT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PilbXTtcbiAgfSA9IHt9KTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS50b0VudGl0eSh0aGlzLCB7XG4gICAgICBjbGllbnRfaWQsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCxcbiAgICAgIGluY2x1ZGVfa2V5LFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICBjaGFuZ2VzX29ubHksXG4gICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgY2hhaW4sXG4gICAgfSk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9FbnRpdHkoKTtcbiAgfVxuXG4gIGF0dHJpYnV0ZXMoe1xuICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gIH06IHtcbiAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgfSA9IHt9KTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmF0dHJpYnV0ZXModGhpcywge1xuICAgICAgY2hhbmdlc19vbmx5LFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQsXG4gICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgfSk7XG4gIH1cblxuICBzZXQocGF0aDogc3RyaW5nIHwgc3RyaW5nW10sIHZhbHVlOiBhbnksIHsgdHlwZSB9OiB7IHR5cGU/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiAocGF0aCBhcyBzdHJpbmcpLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBtb2RlbCA9ICg8YW55PnRoaXMpW3BhdGhBcnJheVswXV07XG4gICAgICByZXR1cm4gbW9kZWwuc2V0KHBhdGhBcnJheS5zbGljZSgxKSwgdmFsdWUsIHt9KTtcbiAgICB9XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tZXRhLnNldCh0aGlzLCBwYXRoQXJyYXlbMF0sIHZhbHVlLCB7IHR5cGUgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKTogYW55IHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX21ldGEuZ2V0PGFueT4odGhpcywgcGF0aEFycmF5WzBdKTtcbiAgICBpZiAoXG4gICAgICBwYXRoQXJyYXkubGVuZ3RoID4gMSAmJlxuICAgICAgKHZhbHVlIGluc3RhbmNlb2YgT0RhdGFNb2RlbCB8fCB2YWx1ZSBpbnN0YW5jZW9mIE9EYXRhQ29sbGVjdGlvbilcbiAgICApIHtcbiAgICAgIHJldHVybiB2YWx1ZS5nZXQocGF0aEFycmF5LnNsaWNlKDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaGFzKHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiAocGF0aCBhcyBzdHJpbmcpLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX21ldGEuZ2V0PGFueT4odGhpcywgcGF0aEFycmF5WzBdKTtcbiAgICBpZiAoXG4gICAgICBwYXRoQXJyYXkubGVuZ3RoID4gMSAmJlxuICAgICAgKHZhbHVlIGluc3RhbmNlb2YgT0RhdGFNb2RlbCB8fCB2YWx1ZSBpbnN0YW5jZW9mIE9EYXRhQ29sbGVjdGlvbilcbiAgICApIHtcbiAgICAgIHJldHVybiB2YWx1ZS5oYXMocGF0aEFycmF5LnNsaWNlKDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICByZXNldCh7XG4gICAgcGF0aCxcbiAgICBzaWxlbnQgPSBmYWxzZSxcbiAgfTogeyBwYXRoPzogc3RyaW5nIHwgc3RyaW5nW107IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgY29uc3QgcGF0aEFycmF5OiBzdHJpbmdbXSA9IChcbiAgICAgIHBhdGggPT09IHVuZGVmaW5lZFxuICAgICAgICA/IFtdXG4gICAgICAgIDogVHlwZXMuaXNBcnJheShwYXRoKVxuICAgICAgICA/IHBhdGhcbiAgICAgICAgOiAocGF0aCBhcyBzdHJpbmcpLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgY29uc3QgbmFtZSA9IHBhdGhBcnJheVswXTtcbiAgICBjb25zdCB2YWx1ZSA9IG5hbWUgIT09IHVuZGVmaW5lZCA/ICg8YW55PnRoaXMpW25hbWVdIDogdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpIHx8XG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpXG4gICAgKSB7XG4gICAgICB2YWx1ZS5yZXNldCh7IHBhdGg6IHBhdGhBcnJheS5zbGljZSgxKSwgc2lsZW50IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tZXRhLnJlc2V0KHRoaXMsIHsgbmFtZTogcGF0aEFycmF5WzBdLCBzaWxlbnQgfSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoeyBzaWxlbnQgPSBmYWxzZSB9OiB7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgdGhpcy5fYXR0cmlidXRlcy5jbGVhcigpO1xuICAgIHRoaXMuX2NoYW5nZXMuY2xlYXIoKTtcbiAgICB0aGlzLl9yZWxhdGlvbnMuY2xlYXIoKTtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3VwZGF0ZScsIHtcbiAgICAgICAgICBtb2RlbDogdGhpcyxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXNzaWduKFxuICAgIGVudGl0eTogUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHtcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgc2lsZW50PzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuYXNzaWduKHRoaXMsIGVudGl0eSwgeyByZXNldCwgc2lsZW50LCByZXBhcmVudCB9KTtcbiAgfVxuXG4gIGNsb25lPE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PigpIHtcbiAgICBsZXQgQ3RvciA9IDx0eXBlb2YgT0RhdGFNb2RlbD50aGlzLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBuZXcgQ3Rvcih0aGlzLnRvRW50aXR5KElOQ0xVREVfU0hBTExPVyksIHtcbiAgICAgIHJlc291cmNlOiB0aGlzLnJlc291cmNlKCkgYXMgT0RhdGFSZXNvdXJjZTxUPixcbiAgICAgIGFubm90czogdGhpcy5hbm5vdHMoKSxcbiAgICB9KSBhcyBNO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWVzdChvYnMkOiBPYnNlcnZhYmxlPE9EYXRhRW50aXR5PGFueT4+KTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdyZXF1ZXN0Jywge1xuICAgICAgICBtb2RlbDogdGhpcyxcbiAgICAgICAgb3B0aW9uczogeyBvYnNlcnZhYmxlOiBvYnMkIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgIG1hcCgoeyBlbnRpdHksIGFubm90cyB9KSA9PiB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgICB0aGlzLmFzc2lnbihhbm5vdHMuYXR0cmlidXRlcyhlbnRpdHkgfHwge30sICdmdWxsJyksIHtcbiAgICAgICAgICByZXNldDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3N5bmMnLCB7XG4gICAgICAgICAgICBtb2RlbDogdGhpcyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHsgZW50aXR5LCBhbm5vdHMgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoKHtcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ2ZldGNoOiBSZXNvdXJjZSBpcyB1bmRlZmluZWQnKSk7XG5cbiAgICBsZXQgb2JzJDogT2JzZXJ2YWJsZTxPRGF0YUVudGl0eTxUPj47XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkge1xuICAgICAgb2JzJCA9IHJlc291cmNlLmZldGNoKG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKSB7XG4gICAgICBvYnMkID0gcmVzb3VyY2UuZmV0Y2goeyByZXNwb25zZVR5cGU6ICdlbnRpdHknLCAuLi5vcHRpb25zIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYnMkID0gKHJlc291cmNlIGFzIE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPikuZmV0Y2goe1xuICAgICAgICByZXNwb25zZVR5cGU6ICdlbnRpdHknLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQpO1xuICB9XG5cbiAgc2F2ZSh7XG4gICAgbWV0aG9kLFxuICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB2YWxpZGF0ZSA9IHRydWUsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIHZhbGlkYXRlPzogYm9vbGVhbjtcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ3NhdmU6IFJlc291cmNlIGlzIHVuZGVmaW5lZCcpKTtcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgfHxcbiAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlXG4gICAgICApXG4gICAgKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ3NhdmU6IFJlc291cmNlIHR5cGUgT0RhdGFFbnRpdHlSZXNvdXJjZS9PRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlIG5lZWRlZCdcbiAgICAgICAgICApXG4gICAgICApO1xuXG4gICAgLy8gUmVzb2x2ZSBtZXRob2QgYW5kIHJlc291cmNlIGtleVxuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnNjaGVtYSgpLmlzQ29tcG91bmRLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICdzYXZlOiBDb21wb3NpdGUga2V5IHJlcXVpcmUgYSBzcGVjaWZpYyBtZXRob2QsIHVzZSBjcmVhdGUvdXBkYXRlL21vZGlmeSdcbiAgICAgICAgICApXG4gICAgICApO1xuICAgIG1ldGhvZCA9IG1ldGhvZCB8fCAoIXJlc291cmNlLmhhc0tleSgpID8gJ2NyZWF0ZScgOiAndXBkYXRlJyk7XG4gICAgaWYgKFxuICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlICYmXG4gICAgICAobWV0aG9kID09PSAndXBkYXRlJyB8fCBtZXRob2QgPT09ICdtb2RpZnknKSAmJlxuICAgICAgIXJlc291cmNlLmhhc0tleSgpXG4gICAgKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+IG5ldyBFcnJvcignc2F2ZTogVXBkYXRlL1BhdGNoIHJlcXVpcmUgZW50aXR5IGtleScpXG4gICAgICApO1xuICAgIGlmIChcbiAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSB8fFxuICAgICAgbWV0aG9kID09PSAnY3JlYXRlJ1xuICAgIClcbiAgICAgIHJlc291cmNlLmNsZWFyS2V5KCk7XG5cbiAgICBpZiAodmFsaWRhdGUgJiYgIXRoaXMuaXNWYWxpZCh7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSkge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdzYXZlOiBWYWxpZGF0aW9uIGVycm9ycycpKTtcbiAgICB9XG4gICAgY29uc3QgX2VudGl0eSA9IHRoaXMudG9FbnRpdHkoe1xuICAgICAgY2hhbmdlc19vbmx5OiBtZXRob2QgPT09ICdtb2RpZnknLFxuICAgICAgZmllbGRfbWFwcGluZzogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k6IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IG5hdmlnYXRpb24sXG4gICAgfSkgYXMgVDtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgIChtZXRob2QgPT09ICdjcmVhdGUnXG4gICAgICAgID8gcmVzb3VyY2UuY3JlYXRlKF9lbnRpdHksIG9wdGlvbnMpXG4gICAgICAgIDogbWV0aG9kID09PSAnbW9kaWZ5J1xuICAgICAgICA/IHJlc291cmNlLm1vZGlmeShfZW50aXR5LCB7IGV0YWc6IHRoaXMuYW5ub3RzKCkuZXRhZywgLi4ub3B0aW9ucyB9KVxuICAgICAgICA6IHJlc291cmNlLnVwZGF0ZShfZW50aXR5LCB7IGV0YWc6IHRoaXMuYW5ub3RzKCkuZXRhZywgLi4ub3B0aW9ucyB9KVxuICAgICAgKS5waXBlKFxuICAgICAgICBtYXAoKHsgZW50aXR5LCBhbm5vdHMgfSkgPT4gKHsgZW50aXR5OiBlbnRpdHkgfHwgX2VudGl0eSwgYW5ub3RzIH0pKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBkZXN0cm95KHtcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ2Rlc3Ryb3k6IFJlc291cmNlIGlzIHVuZGVmaW5lZCcpKTtcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgfHxcbiAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlXG4gICAgICApXG4gICAgKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ2Rlc3Ryb3k6IFJlc291cmNlIHR5cGUgT0RhdGFFbnRpdHlSZXNvdXJjZS9PRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlIG5lZWRlZCdcbiAgICAgICAgICApXG4gICAgICApO1xuICAgIGlmICghcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT4gbmV3IEVycm9yKFwiZGVzdHJveTogQ2FuJ3QgZGVzdHJveSBtb2RlbCB3aXRob3V0IGtleVwiKVxuICAgICAgKTtcblxuICAgIGNvbnN0IF9lbnRpdHkgPSB0aGlzLnRvRW50aXR5KHsgZmllbGRfbWFwcGluZzogdHJ1ZSB9KSBhcyBUO1xuICAgIGNvbnN0IG9icyQgPSByZXNvdXJjZVxuICAgICAgLmRlc3Ryb3koeyBldGFnOiB0aGlzLmFubm90cygpLmV0YWcsIC4uLm9wdGlvbnMgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHsgZW50aXR5LCBhbm5vdHMgfSkgPT4gKHsgZW50aXR5OiBlbnRpdHkgfHwgX2VudGl0eSwgYW5ub3RzIH0pKVxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkKS5waXBlKFxuICAgICAgdGFwKCgpID0+XG4gICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2Rlc3Ryb3knLCB7IG1vZGVsOiB0aGlzIH0pKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGV4ZWN1dGlvbiBjb250ZXh0IGZvciBjaGFuZ2UgdGhlIGludGVybmFsIHF1ZXJ5IG9mIGEgcmVzb3VyY2VcbiAgICogQHBhcmFtIGN0eCBGdW5jdGlvbiB0byBleGVjdXRlXG4gICAqL1xuICBxdWVyeShcbiAgICBjdHg6IChxOiBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXI8VD4sIHM/OiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+KSA9PiB2b2lkXG4gICkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnF1ZXJ5KHRoaXMsIHRoaXMucmVzb3VyY2UoKSwgY3R4KSBhcyB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBjaGVjayBvbiB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIG1vZGVsIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kZWwgaXMgY2hhbmdlZC5cbiAgICogQHBhcmFtIGluY2x1ZGVfbmF2aWdhdGlvbiBDaGVjayBpbiBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgbW9kZWwgaGFzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgaGFzQ2hhbmdlZCh7XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5oYXNDaGFuZ2VkKHRoaXMsIHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pO1xuICB9XG5cbiAgaXNOZXcoKSB7XG4gICAgcmV0dXJuICF0aGlzLl9tZXRhLmhhc0tleSh0aGlzKTtcbiAgfVxuICB3aXRoUmVzb3VyY2U8Uj4ocmVzb3VyY2U6IGFueSwgY3R4OiAobW9kZWw6IHRoaXMpID0+IFIpOiBSIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS53aXRoUmVzb3VyY2UodGhpcywgcmVzb3VyY2UsIGN0eCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGV4ZWN1dGlvbiBjb250ZXh0IGZvciBhIGdpdmVuIGZ1bmN0aW9uLCB3aGVyZSB0aGUgbW9kZWwgaXMgYm91bmQgdG8gaXRzIGVudGl0eSBlbmRwb2ludFxuICAgKiBAcGFyYW0gY3R4IENvbnRleHQgZnVuY3Rpb25cbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgY29udGV4dFxuICAgKi9cbiAgYXNFbnRpdHk8Uj4oY3R4OiAobW9kZWw6IHRoaXMpID0+IFIpOiBSIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5hc0VudGl0eSh0aGlzLCBjdHgpO1xuICB9XG5cbiAgY2FsbEZ1bmN0aW9uPFAsIFI+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHJlc3BvbnNlVHlwZTpcbiAgICAgIHwgJ3Byb3BlcnR5J1xuICAgICAgfCAnbW9kZWwnXG4gICAgICB8ICdjb2xsZWN0aW9uJ1xuICAgICAgfCAnbm9uZSdcbiAgICAgIHwgJ2Jsb2InXG4gICAgICB8ICdhcnJheWJ1ZmZlcicsXG4gICAgeyAuLi5vcHRpb25zIH06IHt9ICYgT0RhdGFGdW5jdGlvbk9wdGlvbnM8Uj4gPSB7fVxuICApOiBPYnNlcnZhYmxlPFxuICAgIHwgUlxuICAgIHwgT0RhdGFNb2RlbDxSPlxuICAgIHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+XG4gICAgfCBudWxsXG4gICAgfCBCbG9iXG4gICAgfCBBcnJheUJ1ZmZlclxuICA+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiY2FsbEZ1bmN0aW9uOiBDYW4ndCBjYWxsIGZ1bmN0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiXG4gICAgICAgICAgKVxuICAgICAgKTtcblxuICAgIGNvbnN0IGZ1bmMgPSByZXNvdXJjZS5mdW5jdGlvbjxQLCBSPihuYW1lKS5xdWVyeSgocSkgPT4gcS5hcHBseShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGxDb2xsZWN0aW9uKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdibG9iJzpcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbEJsb2IocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGNhc2UgJ2FycmF5YnVmZmVyJzpcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbEFycmF5YnVmZmVyKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICB9XG5cbiAgY2FsbEFjdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU/OlxuICAgICAgfCAncHJvcGVydHknXG4gICAgICB8ICdtb2RlbCdcbiAgICAgIHwgJ2NvbGxlY3Rpb24nXG4gICAgICB8ICdub25lJ1xuICAgICAgfCAnYmxvYidcbiAgICAgIHwgJ2FycmF5YnVmZmVyJyxcbiAgICB7IC4uLm9wdGlvbnMgfToge30gJiBPRGF0YUFjdGlvbk9wdGlvbnM8Uj4gPSB7fVxuICApOiBPYnNlcnZhYmxlPFxuICAgIHwgUlxuICAgIHwgT0RhdGFNb2RlbDxSPlxuICAgIHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+XG4gICAgfCBudWxsXG4gICAgfCBCbG9iXG4gICAgfCBBcnJheUJ1ZmZlclxuICA+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiY2FsbEFjdGlvbjogQ2FuJ3QgY2FsbCBhY3Rpb24gd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlIHdpdGgga2V5XCJcbiAgICAgICAgICApXG4gICAgICApO1xuXG4gICAgY29uc3QgYWN0aW9uID0gcmVzb3VyY2UuYWN0aW9uPFAsIFI+KG5hbWUpLnF1ZXJ5KChxKSA9PiBxLmFwcGx5KG9wdGlvbnMpKTtcbiAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGxQcm9wZXJ0eShwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGNhc2UgJ2Jsb2InOlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGxCbG9iKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdhcnJheWJ1ZmZlcic6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbEFycmF5YnVmZmVyKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBDYXN0XG4gIGNhc3Q8Uz4odHlwZTogc3RyaW5nKSB7XG4gICAgLy86IE9EYXRhTW9kZWw8Uz4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYXN0OiBDYW4ndCBjYXN0IHRvIGRlcml2ZWQgbW9kZWwgd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlYFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXNvdXJjZVxuICAgICAgLmNhc3Q8Uz4odHlwZSlcbiAgICAgIC5hc01vZGVsKHRoaXMudG9FbnRpdHkoSU5DTFVERV9ERUVQKSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSwge1xuICAgICAgICBhbm5vdHM6IHRoaXMuYW5ub3RzKCkgYXMgYW55LFxuICAgICAgfSk7XG4gIH1cblxuICBmZXRjaE5hdmlnYXRpb25Qcm9wZXJ0eTxTPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIHJlc3BvbnNlVHlwZTogJ21vZGVsJyB8ICdjb2xsZWN0aW9uJyxcbiAgICB7IC4uLm9wdGlvbnMgfToge30gJiBPRGF0YVF1ZXJ5QXJndW1lbnRzT3B0aW9uczxTPiA9IHt9XG4gICk6IE9ic2VydmFibGU8T0RhdGFNb2RlbDxTPiB8IE9EYXRhQ29sbGVjdGlvbjxTLCBPRGF0YU1vZGVsPFM+PiB8IG51bGw+IHtcbiAgICBjb25zdCBuYXYgPSB0aGlzLm5hdmlnYXRpb25Qcm9wZXJ0eTxTPihcbiAgICAgIG5hbWVcbiAgICApIGFzIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Uz47XG4gICAgbmF2LnF1ZXJ5KChxKSA9PiBxLmFwcGx5KG9wdGlvbnMpKTtcbiAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICByZXR1cm4gbmF2LmZldGNoTW9kZWwob3B0aW9ucyk7XG4gICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgcmV0dXJuIG5hdi5mZXRjaENvbGxlY3Rpb24ob3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2V0IFZhbHVlXG4gIGdldFZhbHVlPFA+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmcsXG4gICAgb3B0aW9ucz86IE9EYXRhT3B0aW9uc1xuICApOiBPYnNlcnZhYmxlPFAgfCBPRGF0YU1vZGVsPFA+IHwgT0RhdGFDb2xsZWN0aW9uPFAsIE9EYXRhTW9kZWw8UD4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fbWV0YS5maWVsZChuYW1lKTtcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBmaWVsZC5uYXZpZ2F0aW9uKVxuICAgICAgdGhyb3cgRXJyb3IoYGdldFZhbHVlOiBDYW4ndCBmaW5kIHByb3BlcnR5ICR7bmFtZSBhcyBzdHJpbmd9YCk7XG5cbiAgICBsZXQgdmFsdWUgPSAodGhpcyBhcyBhbnkpW25hbWVdIGFzXG4gICAgICB8IFBcbiAgICAgIHwgT0RhdGFNb2RlbDxQPlxuICAgICAgfCBPRGF0YUNvbGxlY3Rpb248UCwgT0RhdGFNb2RlbDxQPj47XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHByb3AgPSBmaWVsZC5yZXNvdXJjZUZhY3RvcnkoXG4gICAgICAgIHRoaXMucmVzb3VyY2UoKVxuICAgICAgKSBhcyBPRGF0YVByb3BlcnR5UmVzb3VyY2U8UD47XG4gICAgICByZXR1cm4gZmllbGQuY29sbGVjdGlvblxuICAgICAgICA/IHByb3BcbiAgICAgICAgICAgIC5mZXRjaENvbGxlY3Rpb24ob3B0aW9ucylcbiAgICAgICAgICAgIC5waXBlKHRhcCgoYykgPT4gdGhpcy5hc3NpZ24oeyBbbmFtZV06IGMgfSwgeyBzaWxlbnQ6IHRydWUgfSkpKVxuICAgICAgICA6IGZpZWxkLmlzU3RydWN0dXJlZFR5cGUoKVxuICAgICAgICA/IHByb3BcbiAgICAgICAgICAgIC5mZXRjaE1vZGVsKG9wdGlvbnMpXG4gICAgICAgICAgICAucGlwZSh0YXAoKGMpID0+IHRoaXMuYXNzaWduKHsgW25hbWVdOiBjIH0sIHsgc2lsZW50OiB0cnVlIH0pKSlcbiAgICAgICAgOiBwcm9wXG4gICAgICAgICAgICAuZmV0Y2hQcm9wZXJ0eShvcHRpb25zKVxuICAgICAgICAgICAgLnBpcGUodGFwKChjKSA9PiB0aGlzLmFzc2lnbih7IFtuYW1lXTogYyB9LCB7IHNpbGVudDogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2YodmFsdWUgYXMgUCk7XG4gIH1cblxuICAvLyBTZXQgUmVmZXJlbmNlXG4gIHNldFJlZmVyZW5jZTxOPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPE4+IHwgT0RhdGFDb2xsZWN0aW9uPE4sIE9EYXRhTW9kZWw8Tj4+IHwgbnVsbCxcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zXG4gICk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IChcbiAgICAgIHRoaXMubmF2aWdhdGlvblByb3BlcnR5PE4+KG5hbWUpIGFzIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Tj5cbiAgICApLnJlZmVyZW5jZSgpO1xuXG4gICAgY29uc3QgZXRhZyA9IHRoaXMuYW5ub3RzKCkuZXRhZztcbiAgICBsZXQgb2JzJCA9IE5FVkVSIGFzIE9ic2VydmFibGU8YW55PjtcbiAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBPRGF0YU1vZGVsKSB7XG4gICAgICBvYnMkID0gcmVmZXJlbmNlLnNldChcbiAgICAgICAgbW9kZWwuX21ldGEuZW50aXR5UmVzb3VyY2UobW9kZWwpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8Tj4sXG4gICAgICAgIHsgZXRhZywgLi4ub3B0aW9ucyB9XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBPRGF0YUNvbGxlY3Rpb24pIHtcbiAgICAgIG9icyQgPSBmb3JrSm9pbihcbiAgICAgICAgbW9kZWxcbiAgICAgICAgICAubW9kZWxzKClcbiAgICAgICAgICAubWFwKChtKSA9PlxuICAgICAgICAgICAgcmVmZXJlbmNlLmFkZChcbiAgICAgICAgICAgICAgbS5fbWV0YS5lbnRpdHlSZXNvdXJjZShtKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPE4+LFxuICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGVsID09PSBudWxsKSB7XG4gICAgICBvYnMkID0gcmVmZXJlbmNlLnVuc2V0KHsgZXRhZywgLi4ub3B0aW9ucyB9KTtcbiAgICB9XG4gICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdyZXF1ZXN0Jywge1xuICAgICAgICBtb2RlbDogdGhpcyxcbiAgICAgICAgb3B0aW9uczogeyBvYnNlcnZhYmxlOiBvYnMkIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgIG1hcCgobW9kZWwpID0+IHtcbiAgICAgICAgdGhpcy5hc3NpZ24oeyBbbmFtZV06IG1vZGVsIH0pO1xuICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChuZXcgT0RhdGFNb2RlbEV2ZW50KCdzeW5jJywgeyBtb2RlbDogdGhpcyB9KSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0UmVmZXJlbmNlPFA+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmdcbiAgKTogT0RhdGFNb2RlbDxQPiB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PiB8IG51bGwge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fbWV0YS5maWVsZDxQPihuYW1lKTtcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCAhZmllbGQubmF2aWdhdGlvbilcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgZ2V0UmVmZXJlbmNlOiBDYW4ndCBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHkgJHtuYW1lIGFzIHN0cmluZ31gXG4gICAgICApO1xuXG4gICAgbGV0IG1vZGVsID0gKHRoaXMgYXMgYW55KVtuYW1lXSBhc1xuICAgICAgfCBPRGF0YU1vZGVsPFA+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PlxuICAgICAgfCBudWxsO1xuICAgIGlmIChtb2RlbCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKG1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChmaWVsZC5jb2xsZWN0aW9uKSB7XG4gICAgICAgIG1vZGVsID0gZmllbGQuY29sbGVjdGlvbkZhY3RvcnkoeyBwYXJlbnQ6IHRoaXMgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVmZXJlbmNlZChmaWVsZCkgYXMgUDtcbiAgICAgICAgbW9kZWwgPVxuICAgICAgICAgIHZhbHVlID09PSBudWxsID8gbnVsbCA6IGZpZWxkLm1vZGVsRmFjdG9yeSh7IHBhcmVudDogdGhpcywgdmFsdWUgfSk7XG4gICAgICB9XG4gICAgICAodGhpcyBhcyBhbnkpW25hbWVdID0gbW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8vIE1vZGVsIGZ1bmN0aW9uc1xuICBlcXVhbHMob3RoZXI6IE9EYXRhTW9kZWw8VD4pIHtcbiAgICBjb25zdCB0aGlzS2V5ID0gdGhpcy5rZXkoKTtcbiAgICBjb25zdCBvdGhlcktleSA9IG90aGVyLmtleSgpO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzID09PSBvdGhlciB8fFxuICAgICAgKHR5cGVvZiB0aGlzID09PSB0eXBlb2Ygb3RoZXIgJiZcbiAgICAgICAgKCg8YW55PnRoaXMpW3RoaXMuX21ldGEuY2lkXSA9PT0gKDxhbnk+b3RoZXIpW3RoaXMuX21ldGEuY2lkXSB8fFxuICAgICAgICAgICh0aGlzS2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIG90aGVyS2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIFR5cGVzLmlzRXF1YWwodGhpc0tleSwgb3RoZXJLZXkpKSkpXG4gICAgKTtcbiAgfVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ01vZGVsJztcbiAgfVxuXG4gIGNvbGxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudCAhPT0gbnVsbCAmJlxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHRoaXMuX3BhcmVudFswXSlcbiAgICAgID8gKHRoaXMuX3BhcmVudFswXSBhcyBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5leHQoKTogT0RhdGFNb2RlbDxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbigpPy5uZXh0KHRoaXMpO1xuICB9XG5cbiAgcHJldigpOiBPRGF0YU1vZGVsPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uKCk/LnByZXYodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFJFU0VSVkVEX0ZJRUxEX05BTUVTID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoXG4gIE9EYXRhTW9kZWwucHJvdG90eXBlXG4pO1xuIl19