@decaf-ts/core 0.5.39 → 0.5.40

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.
@@ -273,9 +273,11 @@ export class Repository extends Rep {
273
273
  models = await Promise.all(models.map(async (m, i) => {
274
274
  m = new this.class(m);
275
275
  if (opts.type) {
276
- m[this.pk] = (opts.type !== 'String' ?
277
- ids[i] : opts.generated ?
278
- ids[i] : `${m[this.pk]}`.toString());
276
+ m[this.pk] = (opts.type !== "String"
277
+ ? ids[i]
278
+ : opts.generated
279
+ ? ids[i]
280
+ : `${m[this.pk]}`.toString());
279
281
  }
280
282
  await enforceDBDecorators(this, contextArgs.context, m, OperationKeys.CREATE, OperationKeys.ON);
281
283
  return m;
@@ -651,10 +653,13 @@ export class Repository extends Rep {
651
653
  * @throws {InternalError} If no repository is registered for the model.
652
654
  */
653
655
  static get(model, alias) {
654
- let name = Repository.table(model);
656
+ const name = Repository.table(model);
657
+ let registryName = name;
655
658
  if (alias) {
656
- name = [name, alias].join(DefaultSeparator);
659
+ registryName = [name, alias].join(DefaultSeparator);
657
660
  }
661
+ if (registryName in this._cache)
662
+ return this._cache[registryName];
658
663
  if (name in this._cache)
659
664
  return this._cache[name];
660
665
  throw new InternalError(`Could not find repository registered under ${name}`);
@@ -673,8 +678,10 @@ export class Repository extends Rep {
673
678
  if (alias) {
674
679
  name = [name, alias].join(DefaultSeparator);
675
680
  }
676
- if (name in this._cache)
677
- throw new InternalError(`${name} already registered as a repository`);
681
+ if (name in this._cache) {
682
+ if (this._cache[name] instanceof Repository)
683
+ throw new InternalError(`${name} already has a registered instance`);
684
+ }
678
685
  this._cache[name] = repo;
679
686
  }
680
687
  /**
@@ -807,4 +814,4 @@ __decorate([
807
814
  ], Repository.prototype, "unObserve", null);
808
815
  if (Adapter)
809
816
  Adapter["_baseRepository"] = Repository;
810
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVwb3NpdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXBvc2l0b3J5L1JlcG9zaXRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUVMLE9BQU8sRUFDUCxNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QsYUFBYSxFQUViLGFBQWEsRUFDYixVQUFVLElBQUksR0FBRyxFQUVqQixlQUFlLEVBQ2YscUJBQXFCLEdBQ3RCLE1BQU0seUJBQXlCLENBQUM7QUFHakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxvQ0FBK0I7QUFDakQsT0FBTyxFQUFlLEtBQUssRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsc0NBQWlDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsdUJBQW9CO0FBRzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsUUFBUSxFQUFFLHFDQUFnQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdDQUEyQjtBQUcvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSwrQkFBMEI7QUFDaEUsT0FBTyxFQUFFLElBQUksRUFBRSx1Q0FBa0M7QUFFakQsT0FBTyxFQUFFLGVBQWUsRUFBRSw0Q0FBdUM7QUFDakUsT0FBTyxFQUFFLEtBQUssRUFBRSw0QkFBaUI7QUEwQmpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0RHO0FBQ0gsTUFBTSxPQUFPLFVBT1gsU0FBUSxHQUFZO2FBR0wsV0FBTSxHQUdqQixFQUFFLEFBSGUsQ0FHZDtJQVlQOzs7O09BSUc7SUFDSCxJQUFJLEdBQUc7UUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDZCxJQUFJLENBQUMsTUFBTSxHQUNULElBQUksQ0FBQyxP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Q0FBQztRQUM1QixJQUFJLFNBQVMsR0FDWCxLQUFLLFlBQVksS0FBSztZQUNwQixDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDOUIsQ0FBQyxDQUFFLEtBQWEsQ0FBQyxTQUFTLENBQUM7UUFDL0IsT0FBTyxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7WUFDekIsTUFBTSxLQUFLLEdBQWEsU0FBUyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3RCxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUN4QixDQUFDO1lBQ0QsU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFrQixLQUF5QjtRQUNyRCxPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxNQUFNLENBQWtCLEtBQVEsRUFBRSxTQUFpQjtRQUN4RCxPQUFPLGFBQWEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDekMsQ0FBQzs7QUE3VUQ7SUFEQyxLQUFLLEVBQUU7Ozs7eUNBZVA7QUFXRDtJQURDLEtBQUssRUFBRTs7OzsyQ0FpQlA7QUF1U0gsSUFBSSxPQUFPO0lBQUUsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBDb250ZXh0LFxuICBEQktleXMsXG4gIERlZmF1bHRTZXBhcmF0b3IsXG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBJUmVwb3NpdG9yeSxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUmVwb3NpdG9yeSBhcyBSZXAsXG4gIFJlcG9zaXRvcnlGbGFncyxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICB3cmFwTWV0aG9kV2l0aENvbnRleHQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmFibGVcIjtcbmltcG9ydCB7IHR5cGUgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZlclwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPcmRlckRpcmVjdGlvbiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBRdWVyaWFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9RdWVyaWFibGVcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvU2VxdWVuY2VcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9Db25kaXRpb25cIjtcbmltcG9ydCB7IFdoZXJlT3B0aW9uIH0gZnJvbSBcIi4uL3F1ZXJ5L29wdGlvbnNcIjtcbmltcG9ydCB7IE9yZGVyQnlTZWxlY3RvciwgU2VsZWN0U2VsZWN0b3IgfSBmcm9tIFwiLi4vcXVlcnkvc2VsZWN0b3JzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lLCBnZXRUYWJsZU5hbWUgfSBmcm9tIFwiLi4vaWRlbnRpdHkvdXRpbHNcIjtcbmltcG9ydCB7IHVzZXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBPYnNlcnZlckhhbmRsZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvT2JzZXJ2ZXJIYW5kbGVyXCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgRXZlbnRJZHMsXG4gIEluZmVycmVkQWRhcHRlckNvbmZpZyxcbiAgdHlwZSBPYnNlcnZlckZpbHRlcixcbn0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgYWxpYXMgZm9yIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCBzaW1wbGlmaWVkIGdlbmVyaWMgcGFyYW1ldGVycy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgbW9yZSBjb25jaXNlIHdheSB0byByZWZlcmVuY2UgdGhlIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCBpdHMgZ2VuZXJpYyBwYXJhbWV0ZXJzLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUuXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUuXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlLlxuICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlLlxuICogQHR5cGVkZWYgUmVwb1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCB0eXBlIFJlcG88XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IGFueSxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBhbnksXG4gIFEgPSBhbnksXG4gIEEgZXh0ZW5kcyBBZGFwdGVyPGFueSwgYW55LCBRLCBGLCBDPiA9IGFueSxcbj4gPSBSZXBvc2l0b3J5PE0sIFEsIEEsIEYsIEM+O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb3JlIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMgb24gbW9kZWxzIG9uIGEgdGFibGUgYnkgdGFibGUgd2F5LlxuICogQHN1bW1hcnkgUHJvdmlkZXMgQ1JVRCBvcGVyYXRpb25zLCBxdWVyeWluZyBjYXBhYmlsaXRpZXMsIGFuZCBvYnNlcnZlciBwYXR0ZXJuIGltcGxlbWVudGF0aW9uIGZvciBtb2RlbCBwZXJzaXN0ZW5jZS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgdHlwZSB1c2VkIGJ5IHRoZSBhZGFwdGVyLlxuICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLlxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGZvciBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtBfSBbYWRhcHRlcl0gLSBPcHRpb25hbCBhZGFwdGVyIGluc3RhbmNlIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gW2NsYXp6XSAtIE9wdGlvbmFsIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0gey4uLmFueVtdfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgcmVwb3NpdG9yeSBpbml0aWFsaXphdGlvbi5cbiAqIEBjbGFzcyBSZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRpbmcgYSByZXBvc2l0b3J5IGZvciBVc2VyIG1vZGVsXG4gKiBjb25zdCB1c2VyUmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoVXNlcik7XG4gKlxuICogLy8gVXNpbmcgdGhlIHJlcG9zaXRvcnkgZm9yIENSVUQgb3BlcmF0aW9uc1xuICogY29uc3QgdXNlciA9IGF3YWl0IHVzZXJSZXBvLmNyZWF0ZShuZXcgVXNlcih7IG5hbWU6ICdKb2huJyB9KSk7XG4gKiBjb25zdCByZXRyaWV2ZWRVc2VyID0gYXdhaXQgdXNlclJlcG8ucmVhZCh1c2VyLmlkKTtcbiAqIHVzZXIubmFtZSA9ICdKYW5lJztcbiAqIGF3YWl0IHVzZXJSZXBvLnVwZGF0ZSh1c2VyKTtcbiAqIGF3YWl0IHVzZXJSZXBvLmRlbGV0ZSh1c2VyLmlkKTtcbiAqXG4gKiAvLyBRdWVyeWluZyB3aXRoIGNvbmRpdGlvbnNcbiAqIGNvbnN0IHVzZXJzID0gYXdhaXQgdXNlclJlcG9cbiAqICAgLnNlbGVjdCgpXG4gKiAgIC53aGVyZSh7IG5hbWU6ICdKYW5lJyB9KVxuICogICAub3JkZXJCeSgnY3JlYXRlZEF0JywgT3JkZXJEaXJlY3Rpb24uRFNDKVxuICogICAubGltaXQoMTApXG4gKiAgIC5leGVjdXRlKCk7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50IENvZGVcbiAqICAgcGFydGljaXBhbnQgUiBhcyBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEEgYXMgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICogICBwYXJ0aWNpcGFudCBPIGFzIE9ic2VydmVyc1xuICpcbiAqICAgQy0+PitSOiBjcmVhdGUobW9kZWwpXG4gKiAgIFItPj5SOiBjcmVhdGVQcmVmaXgobW9kZWwpXG4gKiAgIFItPj4rQTogcHJlcGFyZShtb2RlbClcbiAqICAgQS0tPj4tUjogcHJlcGFyZWQgZGF0YVxuICogICBSLT4+K0E6IGNyZWF0ZSh0YWJsZSwgaWQsIHJlY29yZClcbiAqICAgQS0+PitEQjogSW5zZXJ0IE9wZXJhdGlvblxuICogICBEQi0tPj4tQTogUmVzdWx0XG4gKiAgIEEtLT4+LVI6IHJlY29yZFxuICogICBSLT4+K0E6IHJldmVydChyZWNvcmQpXG4gKiAgIEEtLT4+LVI6IG1vZGVsIGluc3RhbmNlXG4gKiAgIFItPj5SOiBjcmVhdGVTdWZmaXgobW9kZWwpXG4gKiAgIFItPj4rTzogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBDUkVBVEUsIGlkKVxuICogICBPLS0+Pi1SOiBOb3RpZmljYXRpb24gY29tcGxldGVcbiAqICAgUi0tPj4tQzogY3JlYXRlZCBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgUmVwb3NpdG9yeTxcbiAgICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gICAgUSxcbiAgICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgUSwgRiwgQz4sXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4gID5cbiAgZXh0ZW5kcyBSZXA8TSwgRiwgQz5cbiAgaW1wbGVtZW50cyBPYnNlcnZhYmxlLCBPYnNlcnZlciwgUXVlcmlhYmxlPE0+LCBJUmVwb3NpdG9yeTxNLCBGLCBDPlxue1xuICBwcml2YXRlIHN0YXRpYyBfY2FjaGU6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgQ29uc3RydWN0b3I8UmVwbzxNb2RlbD4+IHwgUmVwbzxNb2RlbD5cbiAgPiA9IHt9O1xuXG4gIHByb3RlY3RlZCBvYnNlcnZlcnM6IE9ic2VydmVyW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgb2JzZXJ2ZXJIYW5kbGVyPzogT2JzZXJ2ZXJIYW5kbGVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkYXB0ZXIhOiBBO1xuICBwcml2YXRlIF90YWJsZU5hbWUhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfb3ZlcnJpZGVzPzogUGFydGlhbDxGPjtcblxuICBwcml2YXRlIGxvZ2dlciE6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ2dlciBpbnN0YW5jZSBmb3IgdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxvZ2dlciBmb3IgdGhpcyByZXBvc2l0b3J5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLmxvZ2dlcilcbiAgICAgIHRoaXMubG9nZ2VyID0gKFxuICAgICAgICB0aGlzLmFkYXB0ZXJbXCJsb2dcIiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5hZGFwdGVyXSBhcyBMb2dnZXJcbiAgICAgICkuZm9yKHRoaXMudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIHRoaXMubG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGFkYXB0ZXIgaW5zdGFuY2UgZm9yIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlLlxuICAgKiBAcmV0dXJuIHtBfSBUaGUgYWRhcHRlciBpbnN0YW5jZS5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gYWRhcHRlciBpcyBmb3VuZC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgYWRhcHRlcigpOiBBIHtcbiAgICBpZiAoIXRoaXMuX2FkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIGFkYXB0ZXIgZm91bmQgZm9yIHRoaXMgcmVwb3NpdG9yeS4gZGlkIHlvdSB1c2UgdGhlIEB1c2VzIGRlY29yYXRvciBvciBwYXNzIGl0IGluIHRoZSBjb25zdHJ1Y3Rvcj9gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUYWJsZSBuYW1lIGZvciB0aGlzIHJlcG9zaXRvcnkncyBtb2RlbC5cbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgZGF0YWJhc2UgdGFibGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXBvc2l0b3J5J3MgbW9kZWwuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRhYmxlIG5hbWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRhYmxlTmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fdGFibGVOYW1lKSB0aGlzLl90YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaW1hcnkga2V5IHByb3BlcnRpZXMgZm9yIHRoaXMgcmVwb3NpdG9yeSdzIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBzZXF1ZW5jZSBvcHRpb25zIGNvbnRhaW5pbmcgcHJpbWFyeSBrZXkgaW5mb3JtYXRpb24uXG4gICAqIEByZXR1cm4ge1NlcXVlbmNlT3B0aW9uc30gVGhlIHByaW1hcnkga2V5IHByb3BlcnRpZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0IHBrUHJvcHMoKTogU2VxdWVuY2VPcHRpb25zIHtcbiAgICByZXR1cm4gc3VwZXIucGtQcm9wcztcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgc3VwZXIoY2xhenopO1xuICAgIGlmIChhZGFwdGVyKSB0aGlzLl9hZGFwdGVyID0gYWRhcHRlcjtcbiAgICBpZiAoY2xhenopIHtcbiAgICAgIFJlcG9zaXRvcnkucmVnaXN0ZXIoY2xhenosIHRoaXMsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBjb25zdCBmbGF2b3VyID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgY2xhenpcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZsYXZvdXIgJiYgZmxhdm91ciAhPT0gYWRhcHRlci5mbGF2b3VyKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSW5jb21wYXRpYmxlIGZsYXZvdXJzXCIpO1xuICAgICAgICB1c2VzKGFkYXB0ZXIuZmxhdm91cikoY2xhenopO1xuICAgICAgfVxuICAgIH1cbiAgICBbdGhpcy5jcmVhdGVBbGwsIHRoaXMucmVhZEFsbCwgdGhpcy51cGRhdGVBbGwsIHRoaXMuZGVsZXRlQWxsXS5mb3JFYWNoKFxuICAgICAgKG0pID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IG0ubmFtZTtcbiAgICAgICAgd3JhcE1ldGhvZFdpdGhDb250ZXh0KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKHRoaXMgYXMgYW55KVtuYW1lICsgXCJQcmVmaXhcIl0sXG4gICAgICAgICAgbSxcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW25hbWUgKyBcIlN1ZmZpeFwiXVxuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBwcm94eSB3aXRoIG92ZXJyaWRkZW4gcmVwb3NpdG9yeSBmbGFncy5cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIHByb3h5IG9mIHRoaXMgcmVwb3NpdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQgZmxhZ3Mgb3ZlcnJpZGRlbi5cbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBmbGFncyAtIFRoZSBmbGFncyB0byBvdmVycmlkZS5cbiAgICogQHJldHVybiB7UmVwb3NpdG9yeX0gQSBwcm94eSBvZiB0aGlzIHJlcG9zaXRvcnkgd2l0aCBvdmVycmlkZGVuIGZsYWdzLlxuICAgKi9cbiAgb3ZlcnJpZGUoZmxhZ3M6IFBhcnRpYWw8Rj4pOiBSZXBvc2l0b3J5PE0sIFEsIEEsIEYsIEM+IHtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLm92ZXJyaWRlKVxuICAgICAgLmRlYnVnKGBPdmVycmlkaW5nIHJlcG9zaXRvcnkgZmxhZ3Mgd2l0aCAke0pTT04uc3RyaW5naWZ5KGZsYWdzKX1gKTtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldDogKHRhcmdldDogdHlwZW9mIHRoaXMsIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgaWYgKHAgIT09IFwiX292ZXJyaWRlc1wiKSByZXR1cm4gcmVzdWx0O1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVzdWx0LCBmbGFncyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBSZXBvc2l0b3J5IGNsYXNzIHdpdGggYSBzcGVjaWZpYyBhZGFwdGVyIGFuZCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBBIC0gVGhlIHR5cGUgb2YgdGhlIGFkYXB0ZXIuXG4gICAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHR5cGUgb2YgdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHR5cGUgb2YgdGhlIGZpbHRlci5cbiAgICogQHRlbXBsYXRlIEMgLSBUaGUgdHlwZSBvZiB0aGUgY29udGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEluZmVycmVkQWRhcHRlckNvbmZpZzxBPj59IGNvbmYgLSBhZGFwdGVyIGNvbmZpZ3VyYXRpb25zIHRvIG92ZXJyaWRlLlxuICAgKiBAcGFyYW0gW2FyZ3NdIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBuZXcgaW5zdGFuY2UuXG4gICAqXG4gICAqIEByZXR1cm4gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgYW5kIGFyZ3VtZW50cy5cbiAgICovXG4gIGZvcihcbiAgICBjb25mOiBQYXJ0aWFsPEluZmVycmVkQWRhcHRlckNvbmZpZzxBPj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUmVwb3NpdG9yeTxNLCBRLCBBLCBGLCBDPiB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQ6IGFueSwgcDogc3RyaW5nIHwgc3ltYm9sLCByZWNlaXZlcjogYW55KSA9PiB7XG4gICAgICAgIGlmIChwID09PSBcImFkYXB0ZXJcIikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuZm9yKGNvbmYsIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXIgaGFuZGxlci5cbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIG9ic2VydmVyIGhhbmRsZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge09ic2VydmVySGFuZGxlcn0gQSBuZXcgb2JzZXJ2ZXIgaGFuZGxlciBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmVySGFuZGxlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciBjcmVhdGlvbi5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoZSBtb2RlbCBhbmQgcHJlcGFyZXMgaXQgZm9yIGNyZWF0aW9uIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIG1vZGVsID0gbmV3IHRoaXMuY2xhc3MobW9kZWwpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIG1vZGVsLmhhc0Vycm9ycyhcbiAgICAgICAgLi4uKGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdKVxuICAgICAgKVxuICAgICk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gW21vZGVsLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG1vZGVsIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgYSBtb2RlbCBpbnN0YW5jZSB0byB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBjcmVhdGVkIG1vZGVsIHdpdGggdXBkYXRlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlKHRoaXMudGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5hcmdzKTtcbiAgICBsZXQgYzogQyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYXJncy5sZW5ndGgpIGMgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gYXMgQztcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihcbiAgICAgIHJlY29yZCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICB0aGlzLnBrLFxuICAgICAgaWQsXG4gICAgICBjICYmIGMuZ2V0KFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikgPyB0cmFuc2llbnQgOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQb3N0LWNyZWF0aW9uIGhvb2suXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGFmdGVyIGEgbW9kZWwgaXMgY3JlYXRlZCB0byBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucy5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBjcmVhdGVkIG1vZGVsLlxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBwcm9jZXNzZWQgbW9kZWwuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVTdWZmaXgobW9kZWw6IE0sIGNvbnRleHQ6IEMpOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gc3VwZXIuY3JlYXRlU3VmZml4KG1vZGVsLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgdG8gdGhlIGRhdGFiYXNlIGluIGEgYmF0Y2ggb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgY3JlYXRlZCBtb2RlbHMgd2l0aCB1cGRhdGVkIHByb3BlcnRpZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy50YWJsZU5hbWUsXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIHJlY29yZHMsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkc1tpXSBhcyBzdHJpbmcgfCBudW1iZXIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgbW9kZWxzIGZvciBjcmVhdGlvbi5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIG11bHRpcGxlIG1vZGVscyBhbmQgcHJlcGFyZXMgdGhlbSBmb3IgY3JlYXRpb24gaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiBhbnkgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgICBjb25zdCBvcHRzID0gUmVwb3NpdG9yeS5nZXRTZXF1ZW5jZU9wdGlvbnMobW9kZWxzWzBdKTtcbiAgICBsZXQgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHwgdW5kZWZpbmVkKVtdID0gW107XG4gICAgaWYgKG9wdHMudHlwZSkge1xuICAgICAgaWYgKCFvcHRzLm5hbWUpIG9wdHMubmFtZSA9IFNlcXVlbmNlLnBrKG1vZGVsc1swXSk7XG4gICAgICBpZHMgPSBhd2FpdCAoYXdhaXQgdGhpcy5hZGFwdGVyLlNlcXVlbmNlKG9wdHMpKS5yYW5nZShtb2RlbHMubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRzID0gbW9kZWxzLm1hcCgobSwgaSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1bdGhpcy5wa10gPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgUHJpbWFyeSBrZXkgaXMgbm90IGRlZmluZWQgZm9yIG1vZGVsIGluIHBvc2l0aW9uICR7aX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG1bdGhpcy5wa10gYXMgc3RyaW5nO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbW9kZWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtLCBpKSA9PiB7XG4gICAgICAgIG0gPSBuZXcgdGhpcy5jbGFzcyhtKTtcbiAgICAgICAgaWYgKG9wdHMudHlwZSkge1xuICAgICAgICAgIG1bdGhpcy5wa10gPSAob3B0cy50eXBlICE9PSAnU3RyaW5nJyA/IFxuICAgICAgICAgICAgaWRzW2ldIDogb3B0cy5nZW5lcmF0ZWQgPyBcbiAgICAgICAgICAgICAgaWRzW2ldIDogYCR7bVt0aGlzLnBrXX1gLnRvU3RyaW5nKCkpIGFzIE1ba2V5b2YgTV07XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgaWdub3JlZFByb3BzID1cbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtKSA9PiBQcm9taXNlLnJlc29sdmUobS5oYXNFcnJvcnMoLi4uaWdub3JlZFByb3BzKSkpXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBlcnJvcnMucmVkdWNlKChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICBpZiAoZSlcbiAgICAgICAgYWNjdW0gPVxuICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoZXJyb3JNZXNzYWdlcykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvck1lc3NhZ2VzKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciByZWFkaW5nIGEgbW9kZWwgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSByZWFkaW5nIGEgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkUHJlZml4KGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gbmV3IHRoaXMuY2xhc3MoKTtcbiAgICBtb2RlbFt0aGlzLnBrXSA9IGtleSBhcyBNW2tleW9mIE1dO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG4gICAgcmV0dXJuIFtrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIG1vZGVsIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBhc3luYyByZWFkKGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgcmVhZGluZyBtdWx0aXBsZSBtb2RlbHMgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgY29udGV4dCBhbmQgZW5mb3JjZXMgZGVjb3JhdG9ycyBiZWZvcmUgcmVhZGluZyBtdWx0aXBsZSBtb2RlbHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGtleXMgLSBUaGUgcHJpbWFyeSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXlzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkQWxsUHJlZml4KFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBrZXlzLm1hcChhc3luYyAoaykgPT4ge1xuICAgICAgICBjb25zdCBtID0gbmV3IHRoaXMuY2xhc3MoKTtcbiAgICAgICAgbVt0aGlzLnBrXSA9IGsgYXMgTVtrZXlvZiBNXTtcbiAgICAgICAgcmV0dXJuIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWRBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgbW9kZWwgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBjaGFuZ2VzIHRvIGFuIGV4aXN0aW5nIG1vZGVsIGluc3RhbmNlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIHVwZGF0ZWQgbW9kZWwgd2l0aCByZWZyZXNoZWQgcHJvcGVydGllcy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4ocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCwgdHJhbnNpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgdXBkYXRlLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhlIG1vZGVsIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXBkYXRlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgbW9kZWwgaGFzIG5vIHByaW1hcnkga2V5IHZhbHVlLlxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hcmdzOiBhbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHBrID0gbW9kZWxbdGhpcy5wa10gYXMgc3RyaW5nO1xuICAgIGlmICghcGspXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHZhbHVlIGZvciB0aGUgSWQgaXMgZGVmaW5lZCB1bmRlciB0aGUgcHJvcGVydHkgJHt0aGlzLnBrIGFzIHN0cmluZ31gXG4gICAgICApO1xuICAgIGNvbnN0IG9sZE1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKHBrLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbCA9IHRoaXMubWVyZ2Uob2xkTW9kZWwsIG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgIG9sZE1vZGVsXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIG1vZGVsLmhhc0Vycm9ycyhcbiAgICAgICAgb2xkTW9kZWwsXG4gICAgICAgIC4uLlJlcG9zaXRvcnkucmVsYXRpb25zKHRoaXMuY2xhc3MpLFxuICAgICAgICAuLi4oY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW10pXG4gICAgICApXG4gICAgKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcbiAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbCkpIHtcbiAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtb2RlbCkpXG4gICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobW9kZWwsIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgbW9kZWxzIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgY2hhbmdlcyB0byBtdWx0aXBsZSBleGlzdGluZyBtb2RlbCBpbnN0YW5jZXMgaW4gdGhlIGRhdGFiYXNlIGluIGEgYmF0Y2ggb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgdXBkYXRlZCBtb2RlbHMgd2l0aCByZWZyZXNoZWQgcHJvcGVydGllcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci51cGRhdGVBbGwoXG4gICAgICB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLmlkKSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLnJlY29yZCksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHUsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHUsIHRoaXMuY2xhc3MsIHRoaXMucGssIHJlY29yZHNbaV0uaWQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgbW9kZWxzIGZvciB1cGRhdGUuXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBtdWx0aXBsZSBtb2RlbHMgYW5kIHByZXBhcmVzIHRoZW0gZm9yIHVwZGF0ZSBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueVtdPn0gVGhlIHByZXBhcmVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGFueSBtb2RlbCBoYXMgbm8gcHJpbWFyeSBrZXkgdmFsdWUuXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgYW55IG1vZGVsIGZhaWxzIHZhbGlkYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsUHJlZml4KFxuICAgIG1vZGVsczogTVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IGlkcyA9IG1vZGVscy5tYXAoKG0pID0+IHtcbiAgICAgIGNvbnN0IGlkID0gbVt0aGlzLnBrXSBhcyBzdHJpbmc7XG4gICAgICBpZiAoIWlkKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIm1pc3NpbmcgaWQgb24gdXBkYXRlIG9wZXJhdGlvblwiKTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9KTtcbiAgICBjb25zdCBvbGRNb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoaWRzLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbHMgPSBtb2RlbHMubWFwKChtLCBpKSA9PiB7XG4gICAgICBtID0gdGhpcy5tZXJnZShvbGRNb2RlbHNbaV0sIG0pO1xuICAgICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSkge1xuICAgICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobSkpXG4gICAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG07XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT04sXG4gICAgICAgICAgb2xkTW9kZWxzW2ldXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgaWdub3JlZFByb3BzID1cbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICBQcm9taXNlLnJlc29sdmUobS5oYXNFcnJvcnMob2xkTW9kZWxzW2ldLCBtLCAuLi5pZ25vcmVkUHJvcHMpKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gZXJyb3JzLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgaWYgKGUpXG4gICAgICAgIGFjY3VtID1cbiAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgOiBgIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YDtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB1bmRlZmluZWQpO1xuXG4gICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobSwgaSkgPT4ge1xuICAgICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSkge1xuICAgICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobSkpXG4gICAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIGRlbGV0aW5nIGEgbW9kZWwgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSBkZWxldGluZyBhIG1vZGVsLlxuICAgKiBAcGFyYW0ge2FueX0ga2V5IC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVQcmVmaXgoa2V5OiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMucmVhZChrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgZGVsZXRpbmcgbXVsdGlwbGUgbW9kZWxzIGJ5IElEcy5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIGNvbnRleHQgYW5kIGVuZm9yY2VzIGRlY29yYXRvcnMgYmVmb3JlIGRlbGV0aW5nIG11bHRpcGxlIG1vZGVscy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5cyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsUHJlZml4KFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoa2V5cywgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIHJldHVybiBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRHMuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlQWxsKHRoaXMudGFibGVOYW1lLCBrZXlzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGtleXNbaV0pXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzZWxlY3QgcXVlcnkgd2l0aG91dCBzcGVjaWZ5aW5nIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgU3RhcnRzIGJ1aWxkaW5nIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybiBhbGwgZmllbGRzIG9mIHRoZSBtb2RlbC5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlciBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgc2VsZWN0PFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXSxcbiAgPigpOiBXaGVyZU9wdGlvbjxNLCBNW10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNlbGVjdCBxdWVyeSB3aXRoIHNwZWNpZmljIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgU3RhcnRzIGJ1aWxkaW5nIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybiBvbmx5IHRoZSBzcGVjaWZpZWQgZmllbGRzIG9mIHRoZSBtb2RlbC5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgZmllbGRzIHRvIHNlbGVjdC5cbiAgICogQHJldHVybiBBIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSBzZWxlY3RlZCBmaWVsZHMuXG4gICAqL1xuICBzZWxlY3Q8UyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10+KFxuICAgIHNlbGVjdG9yOiByZWFkb25seSBbLi4uU11cbiAgKTogV2hlcmVPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW1wbGVtZW50YXRpb24gb2YgdGhlIHNlbGVjdCBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBxdWVyeSBidWlsZGVyIGZvciB0aGUgbW9kZWwgd2l0aCBvcHRpb25hbCBmaWVsZCBzZWxlY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBTIC0gVGhlIGFycmF5IHR5cGUgb2Ygc2VsZWN0IHNlbGVjdG9ycy5cbiAgICogQHBhcmFtIFtzZWxlY3Rvcl0gLSBPcHRpb25hbCBmaWVsZHMgdG8gc2VsZWN0LlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlci5cbiAgICovXG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I/OiByZWFkb25seSBbLi4uU11cbiAgKTogV2hlcmVPcHRpb248TSwgTVtdPiB8IFdoZXJlT3B0aW9uPE0sIFBpY2s8TSwgU1tudW1iZXJdPltdPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlclxuICAgICAgLlN0YXRlbWVudDxNPigpXG4gICAgICAuc2VsZWN0KHNlbGVjdG9yIGFzIHJlYWRvbmx5IFsuLi5TXSlcbiAgICAgIC5mcm9tKHRoaXMuY2xhc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHF1ZXJ5IHdpdGggdGhlIHNwZWNpZmllZCBjb25kaXRpb25zIGFuZCBvcHRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHNpbXBsaWZpZWQgd2F5IHRvIHF1ZXJ5IHRoZSBkYXRhYmFzZSB3aXRoIGNvbW1vbiBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiB0byBmaWx0ZXIgcmVjb3Jkcy5cbiAgICogQHBhcmFtIG9yZGVyQnkgLSBUaGUgZmllbGQgdG8gb3JkZXIgcmVzdWx0cyBieS5cbiAgICogQHBhcmFtIHtPcmRlckRpcmVjdGlvbn0gW29yZGVyPU9yZGVyRGlyZWN0aW9uLkFTQ10gLSBUaGUgc29ydCBkaXJlY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIC0gT3B0aW9uYWwgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF0gLSBPcHRpb25hbCBudW1iZXIgb2YgcmVzdWx0cyB0byBza2lwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBxdWVyeSByZXN1bHRzIGFzIG1vZGVsIGluc3RhbmNlcy5cbiAgICovXG4gIGFzeW5jIHF1ZXJ5KFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIG9yZGVyQnk6IGtleW9mIE0sXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIGxpbWl0PzogbnVtYmVyLFxuICAgIHNraXA/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCBzb3J0OiBPcmRlckJ5U2VsZWN0b3I8TT4gPSBbb3JkZXJCeSwgb3JkZXIgYXMgT3JkZXJEaXJlY3Rpb25dO1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zZWxlY3QoKS53aGVyZShjb25kaXRpb24pLm9yZGVyQnkoc29ydCk7XG4gICAgaWYgKGxpbWl0KSBxdWVyeS5saW1pdChsaW1pdCk7XG4gICAgaWYgKHNraXApIHF1ZXJ5Lm9mZnNldChza2lwKTtcbiAgICByZXR1cm4gcXVlcnkuZXhlY3V0ZSgpO1xuICB9XG5cbiAgYXR0cihwcm9wOiBrZXlvZiBNKSB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5hdHRyPE0+KHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb2JzZXJ2ZXIgZm9yIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgb2YgY2hhbmdlcyB0byBtb2RlbHMgaW4gdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3Rlci5cbiAgICogQHBhcmFtIHtPYnNlcnZlckZpbHRlcn0gW2ZpbHRlcl0gLSBPcHRpb25hbCBmaWx0ZXIgdG8gbGltaXQgd2hpY2ggZXZlbnRzIHRoZSBvYnNlcnZlciByZWNlaXZlcy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogQHNlZSB7T2JzZXJ2YWJsZSNvYnNlcnZlfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIsIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9ic2VydmVySGFuZGxlclwiLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLk9ic2VydmVySGFuZGxlcigpLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5vYnNlcnZlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHRoaXMuYWRhcHRlci5vYnNlcnZlKHRoaXMsICh0YWJsZTogc3RyaW5nKSA9PiB0YWJsZU5hbWUgPT09IHRhYmxlKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBub3cgb2JzZXJ2aW5nICR7dGhpcy5hZGFwdGVyfSBmaWx0ZXJpbmcgb24gdGFibGUgPT09ICR7dGFibGVOYW1lfWBcbiAgICApO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyIS5vYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpO1xuICAgIGxvZy52ZXJib3NlKGBSZWdpc3RlcmVkIG5ldyBvYnNlcnZlciAke29ic2VydmVyLnRvU3RyaW5nKCl9YCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVucmVnaXN0ZXJzIGFuIG9ic2VydmVyIGZyb20gdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGFuIG9ic2VydmVyIHNvIGl0IHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBvZiBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqIEBzZWUge09ic2VydmFibGUjdW5PYnNlcnZlfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICB0aGlzLm9ic2VydmVySGFuZGxlci51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMudW5PYnNlcnZlKVxuICAgICAgLnZlcmJvc2UoYE9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX0gcmVtb3ZlZGApO1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKSkge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgYE5vIG1vcmUgb2JzZXJ2ZXJzIHJlZ2lzdGVyZWQgZm9yICR7dGhpcy5hZGFwdGVyfSwgdW5zdWJzY3JpYmluZ2BcbiAgICAgICk7XG4gICAgICB0aGlzLmFkYXB0ZXIudW5PYnNlcnZlKHRoaXMpO1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgTm8gbG9uZ2VyIG9ic2VydmluZyBhZGFwdGVyICR7dGhpcy5hZGFwdGVyLmZsYXZvdXJ9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGFuIGV2ZW50LlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGFsbCByZWdpc3RlcmVkIG9ic2VydmVycyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGEgZGF0YWJhc2UgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSB0YWJsZSBuYW1lIHdoZXJlIHRoZSBldmVudCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgSUQgb3IgSURzIG9mIHRoZSBhZmZlY3RlZCByZWNvcmRzLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWQuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBvYnNlcnZlciBoYW5kbGVyIGlzIG5vdCBpbml0aWFsaXplZC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy51cGRhdGVPYnNlcnZlcnMpXG4gICAgICAudmVyYm9zZShcbiAgICAgICAgYFVwZGF0aW5nICR7dGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKX0gb2JzZXJ2ZXJzIGZvciAke3RoaXN9YFxuICAgICAgKTtcbiAgICBhd2FpdCB0aGlzLm9ic2VydmVySGFuZGxlci51cGRhdGVPYnNlcnZlcnMoXG4gICAgICB0aGlzLmxvZyxcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBBcnJheS5pc0FycmF5KGlkKVxuICAgICAgICA/IGlkLm1hcCgoaSkgPT4gU2VxdWVuY2UucGFyc2VWYWx1ZSh0aGlzLnBrUHJvcHMudHlwZSwgaSkgYXMgc3RyaW5nKVxuICAgICAgICA6IChTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMucGtQcm9wcy50eXBlLCBpZCkgYXMgc3RyaW5nKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbGlhcyBmb3IgdXBkYXRlT2JzZXJ2ZXJzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGFuIGV2ZW50IChhbGlhcyBmb3IgdXBkYXRlT2JzZXJ2ZXJzKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlIG5hbWUgd2hlcmUgdGhlIGV2ZW50IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBldmVudCB0aGF0IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBJRCBvciBJRHMgb2YgdGhlIGFmZmVjdGVkIHJlY29yZHMuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZC5cbiAgICovXG4gIGFzeW5jIHJlZnJlc2goXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9yIHJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgcmV0dXJucyBhIHJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZWwuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgdGhhdCBleHRlbmRzIFJlcG88TT4uXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGRlZmF1bHQgYWRhcHRlciBmbGF2b3VyIGlmIG5vdCBzcGVjaWZpZWQgb24gdGhlIG1vZGVsLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtSfSBBIHJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIHRoZSBtb2RlbC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gYWRhcHRlciBpcyByZWdpc3RlcmVkIGZvciB0aGUgZmxhdm91ci5cbiAgICovXG4gIHN0YXRpYyBmb3JNb2RlbDxNIGV4dGVuZHMgTW9kZWwsIFIgZXh0ZW5kcyBSZXBvPE0+PihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgYWxpYXM/OiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUiB7XG4gICAgbGV0IHJlcG86IFIgfCBDb25zdHJ1Y3RvcjxSPiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IF9hbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIGFsaWFzIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgbW9kZWwpIHx8XG4gICAgICBBZGFwdGVyLmN1cnJlbnRGbGF2b3VyO1xuICAgIHRyeSB7XG4gICAgICByZXBvID0gdGhpcy5nZXQobW9kZWwsIF9hbGlhcykgYXMgQ29uc3RydWN0b3I8Uj4gfCBSO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmVwbyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAocmVwbyBpbnN0YW5jZW9mIFJlcG9zaXRvcnkpIHJldHVybiByZXBvIGFzIFI7XG5cbiAgICBjb25zdCBmbGF2b3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgYWxpYXMgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBtb2RlbCkgfHxcbiAgICAgIChyZXBvICYmXG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCByZXBvKSkgfHxcbiAgICAgIEFkYXB0ZXIuY3VycmVudEZsYXZvdXI7XG4gICAgY29uc3QgYWRhcHRlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+IHwgdW5kZWZpbmVkID0gZmxhdm91clxuICAgICAgPyBBZGFwdGVyLmdldChmbGF2b3VyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgcGVyc2lzdGVuY2UgYWRhcHRlciBmb3VuZCBmbGF2b3VyICR7Zmxhdm91cn1gXG4gICAgICApO1xuXG4gICAgcmVwbyA9IHJlcG8gfHwgKGFkYXB0ZXIucmVwb3NpdG9yeSgpIGFzIENvbnN0cnVjdG9yPFI+KTtcbiAgICByZXR1cm4gbmV3IHJlcG8oYWRhcHRlciwgbW9kZWwsIC4uLmFyZ3MpIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwgZnJvbSB0aGUgY2FjaGUuXG4gICAqIEBzdW1tYXJ5IEdldHMgYSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsIGZyb20gdGhlIGludGVybmFsIGNhY2hlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gVGhlIGFkYXB0ZXIgYWxpYXMuXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPn0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIHJlcG9zaXRvcnkgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICk6IENvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPiB7XG4gICAgbGV0IG5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG1vZGVsKTtcbiAgICBpZiAoYWxpYXMpIHtcbiAgICAgIG5hbWUgPSBbbmFtZSwgYWxpYXNdLmpvaW4oRGVmYXVsdFNlcGFyYXRvcik7XG4gICAgfVxuICAgIGlmIChuYW1lIGluIHRoaXMuX2NhY2hlKVxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlW25hbWVdIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+O1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYENvdWxkIG5vdCBmaW5kIHJlcG9zaXRvcnkgcmVnaXN0ZXJlZCB1bmRlciAke25hbWV9YFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEFzc29jaWF0ZXMgYSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIHdpdGggYSBtb2RlbCBpbiB0aGUgaW50ZXJuYWwgY2FjaGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxSZXBvPE0+PiB8IFJlcG88TT59IHJlcG8gLSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gdGhlIGFkYXB0ZXIgYWxpYXMvZmxhdm91ci5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgYSByZXBvc2l0b3J5IGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIHJlcG86IENvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPixcbiAgICBhbGlhcz86IHN0cmluZ1xuICApIHtcbiAgICBsZXQgbmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGlmIChhbGlhcykge1xuICAgICAgbmFtZSA9IFtuYW1lLCBhbGlhc10uam9pbihEZWZhdWx0U2VwYXJhdG9yKTtcbiAgICB9XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5fY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgJHtuYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWQgYXMgYSByZXBvc2l0b3J5YCk7XG4gICAgdGhpcy5fY2FjaGVbbmFtZV0gPSByZXBvIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyBtZXRhZGF0YSBvbiBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBBdHRhY2hlcyBtZXRhZGF0YSB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2FueX0gbWV0YWRhdGEgLSBUaGUgbWV0YWRhdGEgdG8gYXR0YWNoIHRvIHRoZSBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBzZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCBtZXRhZGF0YTogYW55KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG1ldGFkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHByZXZpb3VzbHkgYXR0YWNoZWQgbWV0YWRhdGEgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7YW55fSBUaGUgbWV0YWRhdGEgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cbiAgICovXG4gIHN0YXRpYyBnZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLnZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgRGVsZXRlcyB0aGUgbWV0YWRhdGEgcHJvcGVydHkgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyByZW1vdmVNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgaWYgKGRlc2NyaXB0b3IpIGRlbGV0ZSAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHNlcXVlbmNlIG9wdGlvbnMgZm9yIGEgbW9kZWwncyBwcmltYXJ5IGtleS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBzZXF1ZW5jZSBjb25maWd1cmF0aW9uIGZvciBhIG1vZGVsJ3MgcHJpbWFyeSBrZXkgZnJvbSBtZXRhZGF0YS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge1NlcXVlbmNlT3B0aW9uc30gVGhlIHNlcXVlbmNlIG9wdGlvbnMgZm9yIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBzZXF1ZW5jZSBvcHRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2VxdWVuY2VPcHRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG1vZGVsKS5pZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBSZXBvc2l0b3J5LmtleShEQktleXMuSUQpLFxuICAgICAgbW9kZWwsXG4gICAgICBwayBhcyBzdHJpbmdcbiAgICApO1xuICAgIGlmICghbWV0YWRhdGEpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJObyBzZXF1ZW5jZSBvcHRpb25zIGRlZmluZWQgZm9yIG1vZGVsLiBkaWQgeW91IHVzZSB0aGUgQHBrIGRlY29yYXRvcj9cIlxuICAgICAgKTtcbiAgICByZXR1cm4gbWV0YWRhdGEgYXMgU2VxdWVuY2VPcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCBpbmRleGVzIGRlZmluZWQgb24gYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFsbCBpbmRleCBtZXRhZGF0YSBmcm9tIGEgbW9kZWwncyBwcm9wZXJ0eSBkZWNvcmF0b3JzLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj59IEEgbmVzdGVkIHJlY29yZCBvZiBwcm9wZXJ0eSBuYW1lcyB0byBpbmRleCBtZXRhZGF0YS5cbiAgICovXG4gIHN0YXRpYyBpbmRleGVzPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGNvbnN0IGluZGV4RGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsIDogbmV3IG1vZGVsKCksXG4gICAgICBEQktleXMuUkVGTEVDVFxuICAgICk7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGluZGV4RGVjb3JhdG9ycyB8fCB7fSkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj4sIFtrLCB2YWxdKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSB2YWwuZmlsdGVyKCh2KSA9PiB2LmtleS5zdGFydHNXaXRoKFBlcnNpc3RlbmNlS2V5cy5JTkRFWCkpO1xuICAgICAgICBpZiAoZGVjcyAmJiBkZWNzLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgZGVjIG9mIGRlY3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjO1xuICAgICAgICAgICAgYWNjdW1ba10gPSBhY2N1bVtrXSB8fCB7fTtcbiAgICAgICAgICAgIGFjY3VtW2tdW2tleV0gPSBwcm9wcyBhcyBJbmRleE1ldGFkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCByZWxhdGlvbiBwcm9wZXJ0aWVzIGRlZmluZWQgb24gYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBuYW1lcyBvZiBhbGwgcHJvcGVydGllcyBtYXJrZWQgYXMgcmVsYXRpb25zIGluIHRoZSBtb2RlbCBoaWVyYXJjaHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IGFyZSByZWxhdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgcmVsYXRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHByb3RvdHlwZSA9XG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsXG4gICAgICAgID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZGVsKVxuICAgICAgICA6IChtb2RlbCBhcyBhbnkpLnByb3RvdHlwZTtcbiAgICB3aGlsZSAocHJvdG90eXBlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHByb3BzOiBzdHJpbmdbXSA9IHByb3RvdHlwZVtQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TXTtcbiAgICAgIGlmIChwcm9wcykge1xuICAgICAgICByZXN1bHQucHVzaCguLi5wcm9wcyk7XG4gICAgICB9XG4gICAgICBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdGFibGUgbmFtZSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBhIG1vZGVsLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgdGFibGU8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0VGFibGVOYW1lKG1vZGVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY29sdW1uIG5hbWUgZm9yIGEgbW9kZWwgYXR0cmlidXRlLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIHByb3BlcnR5LlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIFRoZSBhdHRyaWJ1dGUvcHJvcGVydHkgbmFtZS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29sdW1uIG5hbWUgZm9yIHRoZSBhdHRyaWJ1dGUuXG4gICAqL1xuICBzdGF0aWMgY29sdW1uPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0sIGF0dHJpYnV0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Q29sdW1uTmFtZShtb2RlbCwgYXR0cmlidXRlKTtcbiAgfVxufVxuXG5pZiAoQWRhcHRlcikgQWRhcHRlcltcIl9iYXNlUmVwb3NpdG9yeVwiXSA9IFJlcG9zaXRvcnk7XG4iXX0=
817
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVwb3NpdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXBvc2l0b3J5L1JlcG9zaXRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUVMLE9BQU8sRUFDUCxNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QsYUFBYSxFQUViLGFBQWEsRUFDYixVQUFVLElBQUksR0FBRyxFQUVqQixlQUFlLEVBQ2YscUJBQXFCLEdBQ3RCLE1BQU0seUJBQXlCLENBQUM7QUFHakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxvQ0FBK0I7QUFDakQsT0FBTyxFQUFlLEtBQUssRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsc0NBQWlDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsdUJBQW9CO0FBRzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsUUFBUSxFQUFFLHFDQUFnQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdDQUEyQjtBQUcvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSwrQkFBMEI7QUFDaEUsT0FBTyxFQUFFLElBQUksRUFBRSx1Q0FBa0M7QUFFakQsT0FBTyxFQUFFLGVBQWUsRUFBRSw0Q0FBdUM7QUFDakUsT0FBTyxFQUFFLEtBQUssRUFBRSw0QkFBaUI7QUEwQmpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0RHO0FBQ0gsTUFBTSxPQUFPLFVBT1gsU0FBUSxHQUFZO2FBR0wsV0FBTSxHQUdqQixFQUFFLEFBSGUsQ0FHZDtJQVlQOzs7O09BSUc7SUFDSCxJQUFJLEdBQUc7UUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDZCxJQUFJLENBQUMsTUFBTSxHQUNULElBQUksQ0FBQyxPQUFPLENBQUMsS0FBa0MsQ0FDaEQsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFjLE9BQU87UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQ2hCLE1BQU0sSUFBSSxhQUFhLENBQ3JCLHNHQUFzRyxDQUN2RyxDQUFDO1FBQ0osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBYyxTQUFTO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBdUIsT0FBTztRQUM1QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDdkIsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCxZQUFZLE9BQVcsRUFBRSxLQUFzQixFQUFFLEdBQUcsSUFBVztRQUM3RCxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUEzREwsY0FBUyxHQUFlLEVBQUUsQ0FBQztRQTREbkMsSUFBSSxPQUFPO1lBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDckMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JELElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQ3BDLEtBQUssQ0FDTixDQUFDO2dCQUNGLElBQUksT0FBTyxJQUFJLE9BQU8sS0FBSyxPQUFPLENBQUMsT0FBTztvQkFDeEMsTUFBTSxJQUFJLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBQ0QsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUNwRSxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ0osTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNwQixxQkFBcUIsQ0FDbkIsSUFBSSxFQUNILElBQVksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEVBQzlCLENBQUMsRUFDQSxJQUFZLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUMvQixDQUFDO1FBQ0osQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxRQUFRLENBQUMsS0FBaUI7UUFDeEIsSUFBSSxDQUFDLEdBQUc7YUFDTCxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUNsQixLQUFLLENBQUMsb0NBQW9DLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ3JCLEdBQUcsRUFBRSxDQUFDLE1BQW1CLEVBQUUsQ0FBa0IsRUFBRSxRQUFhLEVBQUUsRUFBRTtnQkFDOUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLENBQUMsS0FBSyxZQUFZO29CQUFFLE9BQU8sTUFBTSxDQUFDO2dCQUN0QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMxQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILEdBQUcsQ0FDRCxJQUF1QyxFQUN2QyxHQUFHLElBQVc7UUFFZCxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksRUFBRTtZQUNyQixHQUFHLEVBQUUsQ0FBQyxNQUFXLEVBQUUsQ0FBa0IsRUFBRSxRQUFhLEVBQUUsRUFBRTtnQkFDdEQsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLENBQUM7Z0JBQ0QsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDMUMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sZUFBZTtRQUN2QixPQUFPLElBQUksZUFBZSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ2dCLEtBQUssQ0FBQyxZQUFZLENBQ25DLEtBQVEsRUFDUixHQUFHLElBQVc7UUFFZCxNQUFNLFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQ3BDLGFBQWEsQ0FBQyxNQUFNLEVBQ3BCLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxFQUNKLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQ3RCLENBQUM7UUFDRixLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLE1BQU0sbUJBQW1CLENBQ3ZCLElBQUksRUFDSixXQUFXLENBQUMsT0FBTyxFQUNuQixLQUFLLEVBQ0wsYUFBYSxDQUFDLE1BQU0sRUFDcEIsYUFBYSxDQUFDLEVBQUUsQ0FDakIsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FDbEMsS0FBSyxDQUFDLFNBQVMsQ0FDYixHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FDbEUsQ0FDRixDQUFDO1FBQ0YsSUFBSSxNQUFNO1lBQUUsTUFBTSxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV6RCxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQVEsRUFBRSxHQUFHLElBQVc7UUFDbkMsd0NBQXdDO1FBQ3hDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckUsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLEdBQWtCLFNBQVMsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBTSxDQUFDO1FBQ2hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ3hCLE1BQU0sRUFDTixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxFQUFFLEVBQ1AsRUFBRSxFQUNGLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUMzRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNNLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBUSxFQUFFLE9BQVU7UUFDOUMsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ00sS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFXLEVBQUUsR0FBRyxJQUFXO1FBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRSxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUNwQyxJQUFJLENBQUMsU0FBUyxFQUNkLEdBQTBCLEVBQzFCLE9BQU8sRUFDUCxHQUFHLElBQUksQ0FDUixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBb0IsQ0FBQyxDQUN2RSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDZ0IsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFXLEVBQUUsR0FBRyxJQUFXO1FBQ2xFLE1BQU0sV0FBVyxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FDcEMsYUFBYSxDQUFDLE1BQU0sRUFDcEIsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLEVBQ0osSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FDdEIsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELElBQUksR0FBRyxHQUE2QyxFQUFFLENBQUM7UUFDdkQsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25ELEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkUsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEIsSUFBSSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssV0FBVztvQkFDbkMsTUFBTSxJQUFJLGFBQWEsQ0FDckIsb0RBQW9ELENBQUMsRUFBRSxDQUN4RCxDQUFDO2dCQUNKLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQVcsQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEIsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDZCxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQ1gsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRO29CQUNwQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDUixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVM7d0JBQ2QsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ1IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUNuQixDQUFDO1lBQ2xCLENBQUM7WUFFRCxNQUFNLG1CQUFtQixDQUN2QixJQUFJLEVBQ0osV0FBVyxDQUFDLE9BQU8sRUFDbkIsQ0FBQyxFQUNELGFBQWEsQ0FBQyxNQUFNLEVBQ3BCLGFBQWEsQ0FBQyxFQUFFLENBQ2pCLENBQUM7WUFDRixPQUFPLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixNQUFNLFlBQVksR0FDaEIsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFL0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUM5QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQ2pFLENBQUM7UUFFRixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBeUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEUsSUFBSSxDQUFDO2dCQUNILEtBQUs7b0JBQ0gsT0FBTyxLQUFLLEtBQUssUUFBUTt3QkFDdkIsQ0FBQyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7d0JBQ3RDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNuQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVkLElBQUksYUFBYTtZQUFFLE1BQU0sSUFBSSxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUQsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ2dCLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBVyxFQUFFLEdBQUcsSUFBVztRQUM3RCxNQUFNLFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQ3BDLGFBQWEsQ0FBQyxJQUFJLEVBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxFQUNKLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQ3RCLENBQUM7UUFDRixNQUFNLEtBQUssR0FBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQWlCLENBQUM7UUFDbkMsTUFBTSxtQkFBbUIsQ0FDdkIsSUFBSSxFQUNKLFdBQVcsQ0FBQyxPQUFPLEVBQ25CLEtBQUssRUFDTCxhQUFhLENBQUMsSUFBSSxFQUNsQixhQUFhLENBQUMsRUFBRSxDQUNqQixDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUE0QixFQUFFLEdBQUcsSUFBVztRQUNyRCxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDL0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDZ0IsS0FBSyxDQUFDLGFBQWEsQ0FDcEMsSUFBeUIsRUFDekIsR0FBRyxJQUFXO1FBRWQsTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUNwQyxhQUFhLENBQUMsSUFBSSxFQUNsQixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksRUFDSixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUN0QixDQUFDO1FBQ0YsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25CLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBZSxDQUFDO1lBQzdCLE9BQU8sbUJBQW1CLENBQ3hCLElBQUksRUFDSixXQUFXLENBQUMsT0FBTyxFQUNuQixDQUFDLEVBQ0QsYUFBYSxDQUFDLElBQUksRUFDbEIsYUFBYSxDQUFDLEVBQUUsQ0FDakIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDRixPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTSxLQUFLLENBQUMsT0FBTyxDQUNwQixJQUF5QixFQUN6QixHQUFHLElBQVc7UUFFZCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDMUUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3JELENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFRLEVBQUUsR0FBRyxJQUFXO1FBQ25DLHdDQUF3QztRQUN4QyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUksTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ2dCLEtBQUssQ0FBQyxZQUFZLENBQ25DLEtBQVEsRUFDUixHQUFHLElBQVc7UUFFZCxNQUFNLFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQ3BDLGFBQWEsQ0FBQyxNQUFNLEVBQ3BCLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxFQUNKLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQ3RCLENBQUM7UUFDRixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBVyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxFQUFFO1lBQ0wsTUFBTSxJQUFJLGFBQWEsQ0FDckIscURBQXFELElBQUksQ0FBQyxFQUFZLEVBQUUsQ0FDekUsQ0FBQztRQUNKLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sbUJBQW1CLENBQ3ZCLElBQUksRUFDSixXQUFXLENBQUMsT0FBTyxFQUNuQixLQUFLLEVBQ0wsYUFBYSxDQUFDLE1BQU0sRUFDcEIsYUFBYSxDQUFDLEVBQUUsRUFDaEIsUUFBUSxDQUNULENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQ2xDLEtBQUssQ0FBQyxTQUFTLENBQ2IsUUFBUSxFQUNSLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQ25DLEdBQUcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUNsRSxDQUNGLENBQUM7UUFDRixJQUFJLE1BQU07WUFBRSxNQUFNLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztnQkFDaEMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQVcsRUFBRSxHQUFHLElBQVc7UUFDbEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQzFDLElBQUksQ0FBQyxTQUFTLEVBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQzVCLEdBQUcsSUFBSSxDQUNSLENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQzNELENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDZ0IsS0FBSyxDQUFDLGVBQWUsQ0FDdEMsTUFBVyxFQUNYLEdBQUcsSUFBVztRQUVkLE1BQU0sV0FBVyxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FDcEMsYUFBYSxDQUFDLE1BQU0sRUFDcEIsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLEVBQ0osSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FDdEIsQ0FBQztRQUNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMzQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBVyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxFQUFFO2dCQUFFLE1BQU0sSUFBSSxhQUFhLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUNuRSxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvRCxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQixDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztvQkFDNUIsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFDRCxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDbEIsbUJBQW1CLENBQ2pCLElBQUksRUFDSixXQUFXLENBQUMsT0FBTyxFQUNuQixDQUFDLEVBQ0QsYUFBYSxDQUFDLE1BQU0sRUFDcEIsYUFBYSxDQUFDLEVBQUUsRUFDaEIsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUNiLENBQ0YsQ0FDRixDQUFDO1FBRUYsTUFBTSxZQUFZLEdBQ2hCLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLElBQUksRUFBRSxDQUFDO1FBRS9ELE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDOUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNsQixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQy9ELENBQ0YsQ0FBQztRQUVGLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUF5QixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0RSxJQUFJLENBQUM7Z0JBQ0gsS0FBSztvQkFDSCxPQUFPLEtBQUssS0FBSyxRQUFRO3dCQUN2QixDQUFDLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTt3QkFDdEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRWQsSUFBSSxhQUFhO1lBQUUsTUFBTSxJQUFJLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU1RCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RCLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7b0JBQzVCLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDZ0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFRLEVBQUUsR0FBRyxJQUFXO1FBQzVELE1BQU0sV0FBVyxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FDcEMsYUFBYSxDQUFDLE1BQU0sRUFDcEIsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLEVBQ0osSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FDdEIsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEQsTUFBTSxtQkFBbUIsQ0FDdkIsSUFBSSxFQUNKLFdBQVcsQ0FBQyxPQUFPLEVBQ25CLEtBQUssRUFDTCxhQUFhLENBQUMsTUFBTSxFQUNwQixhQUFhLENBQUMsRUFBRSxDQUNqQixDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUE0QixFQUFFLEdBQUcsSUFBVztRQUN2RCxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDZ0IsS0FBSyxDQUFDLGVBQWUsQ0FDdEMsSUFBeUIsRUFDekIsR0FBRyxJQUFXO1FBRWQsTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUNwQyxhQUFhLENBQUMsTUFBTSxFQUNwQixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksRUFDSixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUN0QixDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckIsT0FBTyxtQkFBbUIsQ0FDeEIsSUFBSSxFQUNKLFdBQVcsQ0FBQyxPQUFPLEVBQ25CLENBQUMsRUFDRCxhQUFhLENBQUMsTUFBTSxFQUNwQixhQUFhLENBQUMsRUFBRSxDQUNqQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNGLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNNLEtBQUssQ0FBQyxTQUFTLENBQ3RCLElBQXlCLEVBQ3pCLEdBQUcsSUFBVztRQUVkLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM1RSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDckQsQ0FBQztJQUNKLENBQUM7SUF1QkQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUNKLFFBQTBCO1FBRTFCLE9BQU8sSUFBSSxDQUFDLE9BQU87YUFDaEIsU0FBUyxFQUFLO2FBQ2QsTUFBTSxDQUFDLFFBQTJCLENBQUM7YUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLEtBQUssQ0FDVCxTQUF1QixFQUN2QixPQUFnQixFQUNoQixRQUF3QixjQUFjLENBQUMsR0FBRyxFQUMxQyxLQUFjLEVBQ2QsSUFBYTtRQUViLE1BQU0sSUFBSSxHQUF1QixDQUFDLE9BQU8sRUFBRSxLQUF1QixDQUFDLENBQUM7UUFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsSUFBSSxLQUFLO1lBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLElBQUk7WUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLENBQUMsSUFBYTtRQUNoQixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUksSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFFSCxPQUFPLENBQUMsUUFBa0IsRUFBRSxNQUF1QjtRQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7WUFDdkIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7Z0JBQzdDLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUM3QixRQUFRLEVBQUUsS0FBSzthQUNoQixDQUFDLENBQUM7UUFDTCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDbkUsR0FBRyxDQUFDLE9BQU8sQ0FDVCxpQkFBaUIsSUFBSSxDQUFDLE9BQU8sMkJBQTJCLFNBQVMsRUFBRSxDQUNwRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRCxHQUFHLENBQUMsT0FBTyxDQUFDLDJCQUEyQixRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBRUgsU0FBUyxDQUFDLFFBQWtCO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZTtZQUN2QixNQUFNLElBQUksYUFBYSxDQUNyQixvRUFBb0UsQ0FDckUsQ0FBQztRQUNKLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxHQUFHO2FBQ0wsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDbkIsT0FBTyxDQUFDLFlBQVksUUFBUSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUNkLG9DQUFvQyxJQUFJLENBQUMsT0FBTyxpQkFBaUIsQ0FDbEUsQ0FBQztZQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLCtCQUErQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUNuQixLQUFhLEVBQ2IsS0FBcUQsRUFDckQsRUFBWSxFQUNaLEdBQUcsSUFBVztRQUVkLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZTtZQUN2QixNQUFNLElBQUksYUFBYSxDQUNyQixvRUFBb0UsQ0FDckUsQ0FBQztRQUNKLElBQUksQ0FBQyxHQUFHO2FBQ0wsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7YUFDekIsT0FBTyxDQUNOLFlBQVksSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLElBQUksRUFBRSxDQUNqRSxDQUFDO1FBQ0osTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FDeEMsSUFBSSxDQUFDLEdBQUcsRUFDUixLQUFLLEVBQ0wsS0FBSyxFQUNMLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFXLENBQUM7WUFDcEUsQ0FBQyxDQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFZLEVBQzFELEdBQUcsSUFBSSxDQUNSLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUNYLEtBQWEsRUFDYixLQUFxRCxFQUNyRCxFQUFZLEVBQ1osR0FBRyxJQUFXO1FBRWQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUNiLEtBQXFCLEVBQ3JCLEtBQWMsRUFDZCxHQUFHLElBQVc7UUFFZCxJQUFJLElBQW9DLENBQUM7UUFFekMsTUFBTSxNQUFNLEdBQ1YsS0FBSztZQUNMLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQ2hFLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFDekIsSUFBSSxDQUFDO1lBQ0gsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBdUIsQ0FBQztZQUNyRCw2REFBNkQ7UUFDL0QsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsSUFBSSxJQUFJLFlBQVksVUFBVTtZQUFFLE9BQU8sSUFBUyxDQUFDO1FBRWpELE1BQU0sT0FBTyxHQUNYLEtBQUs7WUFDTCxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQztZQUNoRSxDQUFDLElBQUk7Z0JBQ0gsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsRSxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQ3pCLE1BQU0sT0FBTyxHQUE0QyxPQUFPO1lBQzlELENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUN0QixDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWQsSUFBSSxDQUFDLE9BQU87WUFDVixNQUFNLElBQUksYUFBYSxDQUNyQixtREFBbUQsT0FBTyxFQUFFLENBQzdELENBQUM7UUFFSixJQUFJLEdBQUcsSUFBSSxJQUFLLE9BQU8sQ0FBQyxVQUFVLEVBQXFCLENBQUM7UUFDeEQsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFNLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssTUFBTSxDQUFDLEdBQUcsQ0FDaEIsS0FBcUIsRUFDckIsS0FBYztRQUVkLE1BQU0sSUFBSSxHQUFXLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsSUFBSSxZQUFZLEdBQVcsSUFBSSxDQUFDO1FBQ2hDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixZQUFZLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNELElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQzdCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBRXBCLENBQUM7UUFDZCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTTtZQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUE4QyxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxhQUFhLENBQ3JCLDhDQUE4QyxJQUFJLEVBQUUsQ0FDckQsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxRQUFRLENBQ2IsS0FBcUIsRUFDckIsSUFBb0MsRUFDcEMsS0FBYztRQUVkLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxVQUFVO2dCQUN6QyxNQUFNLElBQUksYUFBYSxDQUFDLEdBQUcsSUFBSSxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBa0IsS0FBUSxFQUFFLFFBQWE7UUFDekQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRTtZQUNyRCxVQUFVLEVBQUUsS0FBSztZQUNqQixZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsS0FBSztZQUNmLEtBQUssRUFBRSxRQUFRO1NBQ2hCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFrQixLQUFRO1FBQzFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FDaEQsS0FBSyxFQUNMLGVBQWUsQ0FBQyxRQUFRLENBQ3pCLENBQUM7UUFDRixPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQWtCLEtBQVE7UUFDN0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUNoRCxLQUFLLEVBQ0wsZUFBZSxDQUFDLFFBQVEsQ0FDekIsQ0FBQztRQUNGLElBQUksVUFBVTtZQUFFLE9BQVEsS0FBYSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBa0IsS0FBUTtRQUNqRCxNQUFNLEVBQUUsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQ2xDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUN6QixLQUFLLEVBQ0wsRUFBWSxDQUNiLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUTtZQUNYLE1BQU0sSUFBSSxhQUFhLENBQ3JCLHVFQUF1RSxDQUN4RSxDQUFDO1FBQ0osT0FBTyxRQUEyQixDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFrQixLQUF5QjtRQUN2RCxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsd0JBQXdCLENBQ3pELEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsRUFDNUMsTUFBTSxDQUFDLE9BQU8sQ0FDZixDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQ2pELENBQUMsS0FBb0QsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFO1lBQ2pFLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDdkIsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUM7b0JBQzNCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUMxQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBc0IsQ0FBQztnQkFDekMsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFDRCxFQUFFLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsU0FBUyxDQUFrQixLQUF5QjtRQUN6RCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsSUFBSSxTQUFTLEdBQ1gsS0FBSyxZQUFZLEtBQUs7WUFDcEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1lBQzlCLENBQUMsQ0FBRSxLQUFhLENBQUMsU0FBUyxDQUFDO1FBQy9CLE9BQU8sU0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3pCLE1BQU0sS0FBSyxHQUFhLFNBQVMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDN0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQztZQUNELFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBa0IsS0FBeUI7UUFDckQsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUFrQixLQUFRLEVBQUUsU0FBaUI7UUFDeEQsT0FBTyxhQUFhLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7O0FBcFZEO0lBREMsS0FBSyxFQUFFOzs7O3lDQWVQO0FBV0Q7SUFEQyxLQUFLLEVBQUU7Ozs7MkNBaUJQO0FBOFNILElBQUksT0FBTztJQUFFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgQ29udGV4dCxcbiAgREJLZXlzLFxuICBEZWZhdWx0U2VwYXJhdG9yLFxuICBlbmZvcmNlREJEZWNvcmF0b3JzLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgSVJlcG9zaXRvcnksXG4gIE9wZXJhdGlvbktleXMsXG4gIFJlcG9zaXRvcnkgYXMgUmVwLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgd3JhcE1ldGhvZFdpdGhDb250ZXh0LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZhYmxlXCI7XG5pbXBvcnQgeyB0eXBlIE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2ZXJcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3JkZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1NlcXVlbmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgUXVlcmlhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvUXVlcmlhYmxlXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBJbmRleE1ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcXVlcnkvQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBXaGVyZU9wdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9vcHRpb25zXCI7XG5pbXBvcnQgeyBPcmRlckJ5U2VsZWN0b3IsIFNlbGVjdFNlbGVjdG9yIH0gZnJvbSBcIi4uL3F1ZXJ5L3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZSwgZ2V0VGFibGVOYW1lIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyB1c2VzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgT2JzZXJ2ZXJIYW5kbGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL09ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHsgZmluYWwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIEV2ZW50SWRzLFxuICBJbmZlcnJlZEFkYXB0ZXJDb25maWcsXG4gIHR5cGUgT2JzZXJ2ZXJGaWx0ZXIsXG59IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGFsaWFzIGZvciBSZXBvc2l0b3J5IGNsYXNzIHdpdGggc2ltcGxpZmllZCBnZW5lcmljIHBhcmFtZXRlcnMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIG1vcmUgY29uY2lzZSB3YXkgdG8gcmVmZXJlbmNlIHRoZSBSZXBvc2l0b3J5IGNsYXNzIHdpdGggaXRzIGdlbmVyaWMgcGFyYW1ldGVycy5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLlxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlLlxuICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBBIC0gVGhlIGFkYXB0ZXIgdHlwZS5cbiAqIEB0eXBlZGVmIFJlcG9cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgdHlwZSBSZXBvPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBhbnksXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gYW55LFxuICBRID0gYW55LFxuICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgUSwgRiwgQz4gPSBhbnksXG4+ID0gUmVwb3NpdG9yeTxNLCBRLCBBLCBGLCBDPjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zIG9uIG1vZGVscyBvbiBhIHRhYmxlIGJ5IHRhYmxlIHdheS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIENSVUQgb3BlcmF0aW9ucywgcXVlcnlpbmcgY2FwYWJpbGl0aWVzLCBhbmQgb2JzZXJ2ZXIgcGF0dGVybiBpbXBsZW1lbnRhdGlvbiBmb3IgbW9kZWwgcGVyc2lzdGVuY2UuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHF1ZXJ5IHR5cGUgdXNlZCBieSB0aGUgYWRhcHRlci5cbiAqIEB0ZW1wbGF0ZSBBIC0gVGhlIGFkYXB0ZXIgdHlwZSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBmb3Igb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7QX0gW2FkYXB0ZXJdIC0gT3B0aW9uYWwgYWRhcHRlciBpbnN0YW5jZSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IFtjbGF6el0gLSBPcHRpb25hbCBjb25zdHJ1Y3RvciBmb3IgdGhlIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHsuLi5hbnlbXX0gW2FyZ3NdIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHJlcG9zaXRvcnkgaW5pdGlhbGl6YXRpb24uXG4gKiBAY2xhc3MgUmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0aW5nIGEgcmVwb3NpdG9yeSBmb3IgVXNlciBtb2RlbFxuICogY29uc3QgdXNlclJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKFVzZXIpO1xuICpcbiAqIC8vIFVzaW5nIHRoZSByZXBvc2l0b3J5IGZvciBDUlVEIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHVzZXIgPSBhd2FpdCB1c2VyUmVwby5jcmVhdGUobmV3IFVzZXIoeyBuYW1lOiAnSm9obicgfSkpO1xuICogY29uc3QgcmV0cmlldmVkVXNlciA9IGF3YWl0IHVzZXJSZXBvLnJlYWQodXNlci5pZCk7XG4gKiB1c2VyLm5hbWUgPSAnSmFuZSc7XG4gKiBhd2FpdCB1c2VyUmVwby51cGRhdGUodXNlcik7XG4gKiBhd2FpdCB1c2VyUmVwby5kZWxldGUodXNlci5pZCk7XG4gKlxuICogLy8gUXVlcnlpbmcgd2l0aCBjb25kaXRpb25zXG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHVzZXJSZXBvXG4gKiAgIC5zZWxlY3QoKVxuICogICAud2hlcmUoeyBuYW1lOiAnSmFuZScgfSlcbiAqICAgLm9yZGVyQnkoJ2NyZWF0ZWRBdCcsIE9yZGVyRGlyZWN0aW9uLkRTQylcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudCBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBBIGFzIEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgREIgYXMgRGF0YWJhc2VcbiAqICAgcGFydGljaXBhbnQgTyBhcyBPYnNlcnZlcnNcbiAqXG4gKiAgIEMtPj4rUjogY3JlYXRlKG1vZGVsKVxuICogICBSLT4+UjogY3JlYXRlUHJlZml4KG1vZGVsKVxuICogICBSLT4+K0E6IHByZXBhcmUobW9kZWwpXG4gKiAgIEEtLT4+LVI6IHByZXBhcmVkIGRhdGFcbiAqICAgUi0+PitBOiBjcmVhdGUodGFibGUsIGlkLCByZWNvcmQpXG4gKiAgIEEtPj4rREI6IEluc2VydCBPcGVyYXRpb25cbiAqICAgREItLT4+LUE6IFJlc3VsdFxuICogICBBLS0+Pi1SOiByZWNvcmRcbiAqICAgUi0+PitBOiByZXZlcnQocmVjb3JkKVxuICogICBBLS0+Pi1SOiBtb2RlbCBpbnN0YW5jZVxuICogICBSLT4+UjogY3JlYXRlU3VmZml4KG1vZGVsKVxuICogICBSLT4+K086IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgQ1JFQVRFLCBpZClcbiAqICAgTy0tPj4tUjogTm90aWZpY2F0aW9uIGNvbXBsZXRlXG4gKiAgIFItLT4+LUM6IGNyZWF0ZWQgbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFJlcG9zaXRvcnk8XG4gICAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICAgIFEsXG4gICAgQSBleHRlbmRzIEFkYXB0ZXI8YW55LCBhbnksIFEsIEYsIEM+LFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuICA+XG4gIGV4dGVuZHMgUmVwPE0sIEYsIEM+XG4gIGltcGxlbWVudHMgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIFF1ZXJpYWJsZTxNPiwgSVJlcG9zaXRvcnk8TSwgRiwgQz5cbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2NhY2hlOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIENvbnN0cnVjdG9yPFJlcG88TW9kZWw+PiB8IFJlcG88TW9kZWw+XG4gID4gPSB7fTtcblxuICBwcm90ZWN0ZWQgb2JzZXJ2ZXJzOiBPYnNlcnZlcltdID0gW107XG5cbiAgcHJvdGVjdGVkIG9ic2VydmVySGFuZGxlcj86IE9ic2VydmVySGFuZGxlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hZGFwdGVyITogQTtcbiAgcHJpdmF0ZSBfdGFibGVOYW1lITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX292ZXJyaWRlcz86IFBhcnRpYWw8Rj47XG5cbiAgcHJpdmF0ZSBsb2dnZXIhOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgaW5zdGFuY2UgZm9yIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBsb2dnZXIgZm9yIHRoaXMgcmVwb3NpdG9yeSBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgbG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5sb2dnZXIpXG4gICAgICB0aGlzLmxvZ2dlciA9IChcbiAgICAgICAgdGhpcy5hZGFwdGVyW1wibG9nXCIgYXMga2V5b2YgdHlwZW9mIHRoaXMuYWRhcHRlcl0gYXMgTG9nZ2VyXG4gICAgICApLmZvcih0aGlzLnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiB0aGlzLmxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBhZGFwdGVyIGluc3RhbmNlIGZvciB0aGlzIHJlcG9zaXRvcnkuXG4gICAqIEB0ZW1wbGF0ZSBBIC0gVGhlIGFkYXB0ZXIgdHlwZS5cbiAgICogQHJldHVybiB7QX0gVGhlIGFkYXB0ZXIgaW5zdGFuY2UuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIGFkYXB0ZXIgaXMgZm91bmQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGFkYXB0ZXIoKTogQSB7XG4gICAgaWYgKCF0aGlzLl9hZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyBhZGFwdGVyIGZvdW5kIGZvciB0aGlzIHJlcG9zaXRvcnkuIGRpZCB5b3UgdXNlIHRoZSBAdXNlcyBkZWNvcmF0b3Igb3IgcGFzcyBpdCBpbiB0aGUgY29uc3RydWN0b3I/YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGFibGUgbmFtZSBmb3IgdGhpcyByZXBvc2l0b3J5J3MgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEdldHMgdGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVwb3NpdG9yeSdzIG1vZGVsLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCB0YWJsZU5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3RhYmxlTmFtZSkgdGhpcy5fdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZSh0aGlzLmNsYXNzKTtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IGtleSBwcm9wZXJ0aWVzIGZvciB0aGlzIHJlcG9zaXRvcnkncyBtb2RlbC5cbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgc2VxdWVuY2Ugb3B0aW9ucyBjb250YWluaW5nIHByaW1hcnkga2V5IGluZm9ybWF0aW9uLlxuICAgKiBAcmV0dXJuIHtTZXF1ZW5jZU9wdGlvbnN9IFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldCBwa1Byb3BzKCk6IFNlcXVlbmNlT3B0aW9ucyB7XG4gICAgcmV0dXJuIHN1cGVyLnBrUHJvcHM7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI/OiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIHN1cGVyKGNsYXp6KTtcbiAgICBpZiAoYWRhcHRlcikgdGhpcy5fYWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgaWYgKGNsYXp6KSB7XG4gICAgICBSZXBvc2l0b3J5LnJlZ2lzdGVyKGNsYXp6LCB0aGlzLCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgICAgaWYgKGFkYXB0ZXIpIHtcbiAgICAgICAgY29uc3QgZmxhdm91ciA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgIGNsYXp6XG4gICAgICAgICk7XG4gICAgICAgIGlmIChmbGF2b3VyICYmIGZsYXZvdXIgIT09IGFkYXB0ZXIuZmxhdm91cilcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkluY29tcGF0aWJsZSBmbGF2b3Vyc1wiKTtcbiAgICAgICAgdXNlcyhhZGFwdGVyLmZsYXZvdXIpKGNsYXp6KTtcbiAgICAgIH1cbiAgICB9XG4gICAgW3RoaXMuY3JlYXRlQWxsLCB0aGlzLnJlYWRBbGwsIHRoaXMudXBkYXRlQWxsLCB0aGlzLmRlbGV0ZUFsbF0uZm9yRWFjaChcbiAgICAgIChtKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBtLm5hbWU7XG4gICAgICAgIHdyYXBNZXRob2RXaXRoQ29udGV4dChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgICh0aGlzIGFzIGFueSlbbmFtZSArIFwiUHJlZml4XCJdLFxuICAgICAgICAgIG0sXG4gICAgICAgICAgKHRoaXMgYXMgYW55KVtuYW1lICsgXCJTdWZmaXhcIl1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcHJveHkgd2l0aCBvdmVycmlkZGVuIHJlcG9zaXRvcnkgZmxhZ3MuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBwcm94eSBvZiB0aGlzIHJlcG9zaXRvcnkgd2l0aCB0aGUgc3BlY2lmaWVkIGZsYWdzIG92ZXJyaWRkZW4uXG4gICAqIEBwYXJhbSB7UGFydGlhbDxGPn0gZmxhZ3MgLSBUaGUgZmxhZ3MgdG8gb3ZlcnJpZGUuXG4gICAqIEByZXR1cm4ge1JlcG9zaXRvcnl9IEEgcHJveHkgb2YgdGhpcyByZXBvc2l0b3J5IHdpdGggb3ZlcnJpZGRlbiBmbGFncy5cbiAgICovXG4gIG92ZXJyaWRlKGZsYWdzOiBQYXJ0aWFsPEY+KTogUmVwb3NpdG9yeTxNLCBRLCBBLCBGLCBDPiB7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy5vdmVycmlkZSlcbiAgICAgIC5kZWJ1ZyhgT3ZlcnJpZGluZyByZXBvc2l0b3J5IGZsYWdzIHdpdGggJHtKU09OLnN0cmluZ2lmeShmbGFncyl9YCk7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQ6IHR5cGVvZiB0aGlzLCBwOiBzdHJpbmcgfCBzeW1ib2wsIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgIGlmIChwICE9PSBcIl9vdmVycmlkZXNcIikgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHJlc3VsdCwgZmxhZ3MpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUmVwb3NpdG9yeSBjbGFzcyB3aXRoIGEgc3BlY2lmaWMgYWRhcHRlciBhbmQgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgQSAtIFRoZSB0eXBlIG9mIHRoZSBhZGFwdGVyLlxuICAgKiBAdGVtcGxhdGUgUSAtIFRoZSB0eXBlIG9mIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgKiBAdGVtcGxhdGUgRiAtIFRoZSB0eXBlIG9mIHRoZSBmaWx0ZXIuXG4gICAqIEB0ZW1wbGF0ZSBDIC0gVGhlIHR5cGUgb2YgdGhlIGNvbnRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFydGlhbDxJbmZlcnJlZEFkYXB0ZXJDb25maWc8QT4+fSBjb25mIC0gYWRhcHRlciBjb25maWd1cmF0aW9ucyB0byBvdmVycmlkZS5cbiAgICogQHBhcmFtIFthcmdzXSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcmV0dXJuIEEgbmV3IGluc3RhbmNlIG9mIHRoZSBSZXBvc2l0b3J5IGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBhZGFwdGVyIGFuZCBhcmd1bWVudHMuXG4gICAqL1xuICBmb3IoXG4gICAgY29uZjogUGFydGlhbDxJbmZlcnJlZEFkYXB0ZXJDb25maWc8QT4+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFJlcG9zaXRvcnk8TSwgUSwgQSwgRiwgQz4ge1xuICAgIHJldHVybiBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0OiAodGFyZ2V0OiBhbnksIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocCA9PT0gXCJhZGFwdGVyXCIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmZvcihjb25mLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IG9ic2VydmVyIGhhbmRsZXIuXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBvYnNlcnZlciBoYW5kbGVyIGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHtPYnNlcnZlckhhbmRsZXJ9IEEgbmV3IG9ic2VydmVyIGhhbmRsZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgT2JzZXJ2ZXJIYW5kbGVyKCk6IE9ic2VydmVySGFuZGxlciB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZlckhhbmRsZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgY3JlYXRpb24uXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGUgbW9kZWwgYW5kIHByZXBhcmVzIGl0IGZvciBjcmVhdGlvbiBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIG1vZGVsIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiB0aGUgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVQcmVmaXgoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxbTSwgLi4uYW55W11dPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBtb2RlbCA9IG5ldyB0aGlzLmNsYXNzKG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBtb2RlbC5oYXNFcnJvcnMoXG4gICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgIClcbiAgICApO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBtb2RlbCBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBzdW1tYXJ5IFBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UgdG8gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgY3JlYXRlZCBtb2RlbCB3aXRoIHVwZGF0ZWQgcHJvcGVydGllcy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgbGV0IGM6IEMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGFyZ3MubGVuZ3RoKSBjID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdIGFzIEM7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICByZWNvcmQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgdGhpcy5wayxcbiAgICAgIGlkLFxuICAgICAgYyAmJiBjLmdldChcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpID8gdHJhbnNpZW50IDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUG9zdC1jcmVhdGlvbiBob29rLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhZnRlciBhIG1vZGVsIGlzIGNyZWF0ZWQgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgY3JlYXRlZCBtb2RlbC5cbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIG9wZXJhdGlvbiBjb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgcHJvY2Vzc2VkIG1vZGVsLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlU3VmZml4KG1vZGVsOiBNLCBjb250ZXh0OiBDKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHN1cGVyLmNyZWF0ZVN1ZmZpeChtb2RlbCwgY29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgbW9kZWxzIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIHRvIHRoZSBkYXRhYmFzZSBpbiBhIGJhdGNoIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIGNyZWF0ZWQgbW9kZWxzIHdpdGggdXBkYXRlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gbW9kZWxzO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgdGhpcy5waykpO1xuICAgIGNvbnN0IGlkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5pZCk7XG4gICAgbGV0IHJlY29yZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAucmVjb3JkKTtcbiAgICByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgaWRzIGFzIChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgICByZWNvcmRzLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZHNbaV0gYXMgc3RyaW5nIHwgbnVtYmVyKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIG1vZGVscyBmb3IgY3JlYXRpb24uXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBtdWx0aXBsZSBtb2RlbHMgYW5kIHByZXBhcmVzIHRoZW0gZm9yIGNyZWF0aW9uIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgYW55IG1vZGVsIGZhaWxzIHZhbGlkYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsUHJlZml4KG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gICAgY29uc3Qgb3B0cyA9IFJlcG9zaXRvcnkuZ2V0U2VxdWVuY2VPcHRpb25zKG1vZGVsc1swXSk7XG4gICAgbGV0IGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB8IHVuZGVmaW5lZClbXSA9IFtdO1xuICAgIGlmIChvcHRzLnR5cGUpIHtcbiAgICAgIGlmICghb3B0cy5uYW1lKSBvcHRzLm5hbWUgPSBTZXF1ZW5jZS5wayhtb2RlbHNbMF0pO1xuICAgICAgaWRzID0gYXdhaXQgKGF3YWl0IHRoaXMuYWRhcHRlci5TZXF1ZW5jZShvcHRzKSkucmFuZ2UobW9kZWxzLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkcyA9IG1vZGVscy5tYXAoKG0sIGkpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBtW3RoaXMucGtdID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYFByaW1hcnkga2V5IGlzIG5vdCBkZWZpbmVkIGZvciBtb2RlbCBpbiBwb3NpdGlvbiAke2l9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBtW3RoaXMucGtdIGFzIHN0cmluZztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSwgaSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGlmIChvcHRzLnR5cGUpIHtcbiAgICAgICAgICBtW3RoaXMucGtdID0gKFxuICAgICAgICAgICAgb3B0cy50eXBlICE9PSBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgID8gaWRzW2ldXG4gICAgICAgICAgICAgIDogb3B0cy5nZW5lcmF0ZWRcbiAgICAgICAgICAgICAgICA/IGlkc1tpXVxuICAgICAgICAgICAgICAgIDogYCR7bVt0aGlzLnBrXX1gLnRvU3RyaW5nKClcbiAgICAgICAgICApIGFzIE1ba2V5b2YgTV07XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBpZ25vcmVkUHJvcHMgPVxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW107XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0pID0+IFByb21pc2UucmVzb2x2ZShtLmhhc0Vycm9ycyguLi5pZ25vcmVkUHJvcHMpKSlcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IGVycm9ycy5yZWR1Y2UoKGFjY3VtOiBzdHJpbmcgfCB1bmRlZmluZWQsIGUsIGkpID0+IHtcbiAgICAgIGlmIChlKVxuICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgdHlwZW9mIGFjY3VtID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IGFjY3VtICsgYFxcbiAtICR7aX06ICR7ZS50b1N0cmluZygpfWBcbiAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgdW5kZWZpbmVkKTtcblxuICAgIGlmIChlcnJvck1lc3NhZ2VzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9yTWVzc2FnZXMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIHJlYWRpbmcgYSBtb2RlbCBieSBJRC5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIGNvbnRleHQgYW5kIGVuZm9yY2VzIGRlY29yYXRvcnMgYmVmb3JlIHJlYWRpbmcgYSBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXkgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHJlYWRQcmVmaXgoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgbW9kZWw6IE0gPSBuZXcgdGhpcy5jbGFzcygpO1xuICAgIG1vZGVsW3RoaXMucGtdID0ga2V5IGFzIE1ba2V5b2YgTV07XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgbW9kZWwgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIGFzeW5jIHJlYWQoaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQodGhpcy50YWJsZU5hbWUsIGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciByZWFkaW5nIG11bHRpcGxlIG1vZGVscyBieSBJRHMuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSByZWFkaW5nIG11bHRpcGxlIG1vZGVscy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIGtleXMgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGxQcmVmaXgoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGtleXMubWFwKGFzeW5jIChrKSA9PiB7XG4gICAgICAgIGNvbnN0IG0gPSBuZXcgdGhpcy5jbGFzcygpO1xuICAgICAgICBtW3RoaXMucGtdID0gayBhcyBNW2tleW9mIE1dO1xuICAgICAgICByZXR1cm4gZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBba2V5cywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIG11bHRpcGxlIG1vZGVscyBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRHMuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBrZXlzIC0gVGhlIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgcmV0cmlldmVkIG1vZGVsIGluc3RhbmNlcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGwoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbCh0aGlzLnRhYmxlTmFtZSwga2V5cywgLi4uYXJncyk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSBtb2RlbCBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBzdW1tYXJ5IFBlcnNpc3RzIGNoYW5nZXMgdG8gYW4gZXhpc3RpbmcgbW9kZWwgaW5zdGFuY2UgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgdXBkYXRlZCBtb2RlbCB3aXRoIHJlZnJlc2hlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlKHRoaXMudGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZWNvcmQsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkLCB0cmFuc2llbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciB1cGRhdGUuXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGUgbW9kZWwgYW5kIHByZXBhcmVzIGl0IGZvciB1cGRhdGUgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBwcmVwYXJlZCBtb2RlbCBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBtb2RlbCBoYXMgbm8gcHJpbWFyeSBrZXkgdmFsdWUuXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgdGhlIG1vZGVsIGZhaWxzIHZhbGlkYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlUHJlZml4KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8W00sIC4uLmFyZ3M6IGFueVtdXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgcGsgPSBtb2RlbFt0aGlzLnBrXSBhcyBzdHJpbmc7XG4gICAgaWYgKCFwaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gdmFsdWUgZm9yIHRoZSBJZCBpcyBkZWZpbmVkIHVuZGVyIHRoZSBwcm9wZXJ0eSAke3RoaXMucGsgYXMgc3RyaW5nfWBcbiAgICAgICk7XG4gICAgY29uc3Qgb2xkTW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQocGssIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIG1vZGVsID0gdGhpcy5tZXJnZShvbGRNb2RlbCwgbW9kZWwpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OLFxuICAgICAgb2xkTW9kZWxcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgbW9kZWwuaGFzRXJyb3JzKFxuICAgICAgICBvbGRNb2RlbCxcbiAgICAgICAgLi4uUmVwb3NpdG9yeS5yZWxhdGlvbnModGhpcy5jbGFzcyksXG4gICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgIClcbiAgICApO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLnRvU3RyaW5nKCkpO1xuICAgIGlmIChSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsKSkge1xuICAgICAgaWYgKCFSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG1vZGVsKSlcbiAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtb2RlbCwgUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbCkpO1xuICAgIH1cbiAgICByZXR1cm4gW21vZGVsLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSBtb2RlbHMgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBjaGFuZ2VzIHRvIG11bHRpcGxlIGV4aXN0aW5nIG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgZGF0YWJhc2UgaW4gYSBiYXRjaCBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSB1cGRhdGVkIG1vZGVscyB3aXRoIHJlZnJlc2hlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIucmVjb3JkKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB1cGRhdGVkLm1hcCgodSwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSBtb2RlbHMgZm9yIHVwZGF0ZS5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIG11bHRpcGxlIG1vZGVscyBhbmQgcHJlcGFyZXMgdGhlbSBmb3IgdXBkYXRlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55W10+fSBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgYW55IG1vZGVsIGhhcyBubyBwcmltYXJ5IGtleSB2YWx1ZS5cbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiBhbnkgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGxQcmVmaXgoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgaWRzID0gbW9kZWxzLm1hcCgobSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBtW3RoaXMucGtdIGFzIHN0cmluZztcbiAgICAgIGlmICghaWQpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwibWlzc2luZyBpZCBvbiB1cGRhdGUgb3BlcmF0aW9uXCIpO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH0pO1xuICAgIGNvbnN0IG9sZE1vZGVscyA9IGF3YWl0IHRoaXMucmVhZEFsbChpZHMsIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIG1vZGVscyA9IG1vZGVscy5tYXAoKG0sIGkpID0+IHtcbiAgICAgIG0gPSB0aGlzLm1lcmdlKG9sZE1vZGVsc1tpXSwgbSk7XG4gICAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKSB7XG4gICAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtKSlcbiAgICAgICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG0sIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbTtcbiAgICB9KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgICAgICBvbGRNb2RlbHNbaV1cbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBpZ25vcmVkUHJvcHMgPVxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW107XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShtLmhhc0Vycm9ycyhvbGRNb2RlbHNbaV0sIG0sIC4uLmlnbm9yZWRQcm9wcykpXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBlcnJvcnMucmVkdWNlKChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICBpZiAoZSlcbiAgICAgICAgYWNjdW0gPVxuICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoZXJyb3JNZXNzYWdlcykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvck1lc3NhZ2VzKTtcblxuICAgIG1vZGVscy5mb3JFYWNoKChtLCBpKSA9PiB7XG4gICAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKSB7XG4gICAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtKSlcbiAgICAgICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG0sIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgZGVsZXRpbmcgYSBtb2RlbCBieSBJRC5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIGNvbnRleHQgYW5kIGVuZm9yY2VzIGRlY29yYXRvcnMgYmVmb3JlIGRlbGV0aW5nIGEgbW9kZWwuXG4gICAqIEBwYXJhbSB7YW55fSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXkgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZVByZWZpeChrZXk6IGFueSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKGtleSwgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuICAgIHJldHVybiBba2V5LCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIG1vZGVsIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElELlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgaXRzIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBkZWxldGVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGUodGhpcy50YWJsZU5hbWUsIGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciBkZWxldGluZyBtdWx0aXBsZSBtb2RlbHMgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgY29udGV4dCBhbmQgZW5mb3JjZXMgZGVjb3JhdG9ycyBiZWZvcmUgZGVsZXRpbmcgbXVsdGlwbGUgbW9kZWxzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBrZXlzIC0gVGhlIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXlzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVBbGxQcmVmaXgoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IHRoaXMucmVhZEFsbChrZXlzLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgcmV0dXJuIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBba2V5cywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgbW9kZWxzIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElEcy5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBrZXlzIC0gVGhlIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBkZWxldGVkIG1vZGVsIGluc3RhbmNlcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNlbGVjdCBxdWVyeSB3aXRob3V0IHNwZWNpZnlpbmcgZmllbGRzLlxuICAgKiBAc3VtbWFyeSBTdGFydHMgYnVpbGRpbmcgYSBxdWVyeSB0aGF0IHdpbGwgcmV0dXJuIGFsbCBmaWVsZHMgb2YgdGhlIG1vZGVsLlxuICAgKiBAdGVtcGxhdGUgUyAtIFRoZSBhcnJheSB0eXBlIG9mIHNlbGVjdCBzZWxlY3RvcnMuXG4gICAqIEByZXR1cm4gQSBxdWVyeSBidWlsZGVyIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzZWxlY3Q8XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIFMgZXh0ZW5kcyByZWFkb25seSBTZWxlY3RTZWxlY3RvcjxNPltdLFxuICA+KCk6IFdoZXJlT3B0aW9uPE0sIE1bXT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2VsZWN0IHF1ZXJ5IHdpdGggc3BlY2lmaWMgZmllbGRzLlxuICAgKiBAc3VtbWFyeSBTdGFydHMgYnVpbGRpbmcgYSBxdWVyeSB0aGF0IHdpbGwgcmV0dXJuIG9ubHkgdGhlIHNwZWNpZmllZCBmaWVsZHMgb2YgdGhlIG1vZGVsLlxuICAgKiBAdGVtcGxhdGUgUyAtIFRoZSBhcnJheSB0eXBlIG9mIHNlbGVjdCBzZWxlY3RvcnMuXG4gICAqIEBwYXJhbSBzZWxlY3RvciAtIFRoZSBmaWVsZHMgdG8gc2VsZWN0LlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlciBmb3IgdGhlIHNlbGVjdGVkIGZpZWxkcy5cbiAgICovXG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I6IHJlYWRvbmx5IFsuLi5TXVxuICApOiBXaGVyZU9wdGlvbjxNLCBQaWNrPE0sIFNbbnVtYmVyXT5bXT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VsZWN0IG1ldGhvZC5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSBtb2RlbCB3aXRoIG9wdGlvbmFsIGZpZWxkIHNlbGVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcGFyYW0gW3NlbGVjdG9yXSAtIE9wdGlvbmFsIGZpZWxkcyB0byBzZWxlY3QuXG4gICAqIEByZXR1cm4gQSBxdWVyeSBidWlsZGVyLlxuICAgKi9cbiAgc2VsZWN0PFMgZXh0ZW5kcyByZWFkb25seSBTZWxlY3RTZWxlY3RvcjxNPltdPihcbiAgICBzZWxlY3Rvcj86IHJlYWRvbmx5IFsuLi5TXVxuICApOiBXaGVyZU9wdGlvbjxNLCBNW10+IHwgV2hlcmVPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+IHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyXG4gICAgICAuU3RhdGVtZW50PE0+KClcbiAgICAgIC5zZWxlY3Qoc2VsZWN0b3IgYXMgcmVhZG9ubHkgWy4uLlNdKVxuICAgICAgLmZyb20odGhpcy5jbGFzcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcXVlcnkgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbnMgYW5kIG9wdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgc2ltcGxpZmllZCB3YXkgdG8gcXVlcnkgdGhlIGRhdGFiYXNlIHdpdGggY29tbW9uIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIGZpbHRlciByZWNvcmRzLlxuICAgKiBAcGFyYW0gb3JkZXJCeSAtIFRoZSBmaWVsZCB0byBvcmRlciByZXN1bHRzIGJ5LlxuICAgKiBAcGFyYW0ge09yZGVyRGlyZWN0aW9ufSBbb3JkZXI9T3JkZXJEaXJlY3Rpb24uQVNDXSAtIFRoZSBzb3J0IGRpcmVjdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gLSBPcHRpb25hbCBtYXhpbXVtIG51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtza2lwXSAtIE9wdGlvbmFsIG51bWJlciBvZiByZXN1bHRzIHRvIHNraXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHF1ZXJ5IHJlc3VsdHMgYXMgbW9kZWwgaW5zdGFuY2VzLlxuICAgKi9cbiAgYXN5bmMgcXVlcnkoXG4gICAgY29uZGl0aW9uOiBDb25kaXRpb248TT4sXG4gICAgb3JkZXJCeToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5BU0MsXG4gICAgbGltaXQ/OiBudW1iZXIsXG4gICAgc2tpcD86IG51bWJlclxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHNvcnQ6IE9yZGVyQnlTZWxlY3RvcjxNPiA9IFtvcmRlckJ5LCBvcmRlciBhcyBPcmRlckRpcmVjdGlvbl07XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNlbGVjdCgpLndoZXJlKGNvbmRpdGlvbikub3JkZXJCeShzb3J0KTtcbiAgICBpZiAobGltaXQpIHF1ZXJ5LmxpbWl0KGxpbWl0KTtcbiAgICBpZiAoc2tpcCkgcXVlcnkub2Zmc2V0KHNraXApO1xuICAgIHJldHVybiBxdWVyeS5leGVjdXRlKCk7XG4gIH1cblxuICBhdHRyKHByb3A6IGtleW9mIE0pIHtcbiAgICByZXR1cm4gQ29uZGl0aW9uLmF0dHI8TT4ocHJvcCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhbiBvYnNlcnZlciBmb3IgdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBBZGRzIGFuIG9ic2VydmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCBvZiBjaGFuZ2VzIHRvIG1vZGVscyBpbiB0aGlzIHJlcG9zaXRvcnkuXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHJlZ2lzdGVyLlxuICAgKiBAcGFyYW0ge09ic2VydmVyRmlsdGVyfSBbZmlsdGVyXSAtIE9wdGlvbmFsIGZpbHRlciB0byBsaW1pdCB3aGljaCBldmVudHMgdGhlIG9ic2VydmVyIHJlY2VpdmVzLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAc2VlIHtPYnNlcnZhYmxlI29ic2VydmV9XG4gICAqL1xuICBAZmluYWwoKVxuICBvYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlciwgZmlsdGVyPzogT2JzZXJ2ZXJGaWx0ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwib2JzZXJ2ZXJIYW5kbGVyXCIsIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuT2JzZXJ2ZXJIYW5kbGVyKCksXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLm9ic2VydmUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUodGhpcy5jbGFzcyk7XG4gICAgdGhpcy5hZGFwdGVyLm9ic2VydmUodGhpcywgKHRhYmxlOiBzdHJpbmcpID0+IHRhYmxlTmFtZSA9PT0gdGFibGUpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYG5vdyBvYnNlcnZpbmcgJHt0aGlzLmFkYXB0ZXJ9IGZpbHRlcmluZyBvbiB0YWJsZSA9PT0gJHt0YWJsZU5hbWV9YFxuICAgICk7XG4gICAgdGhpcy5vYnNlcnZlckhhbmRsZXIhLm9ic2VydmUob2JzZXJ2ZXIsIGZpbHRlcik7XG4gICAgbG9nLnZlcmJvc2UoYFJlZ2lzdGVyZWQgbmV3IG9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgYW4gb2JzZXJ2ZXIgZnJvbSB0aGlzIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYW4gb2JzZXJ2ZXIgc28gaXQgd2lsbCBubyBsb25nZXIgcmVjZWl2ZSBub3RpZmljYXRpb25zIG9mIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBvYnNlcnZlciBoYW5kbGVyIGlzIG5vdCBpbml0aWFsaXplZC5cbiAgICogQHNlZSB7T2JzZXJ2YWJsZSN1bk9ic2VydmV9XG4gICAqL1xuICBAZmluYWwoKVxuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy51bk9ic2VydmUpXG4gICAgICAudmVyYm9zZShgT2JzZXJ2ZXIgJHtvYnNlcnZlci50b1N0cmluZygpfSByZW1vdmVkYCk7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpKSB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKFxuICAgICAgICBgTm8gbW9yZSBvYnNlcnZlcnMgcmVnaXN0ZXJlZCBmb3IgJHt0aGlzLmFkYXB0ZXJ9LCB1bnN1YnNjcmliaW5nYFxuICAgICAgKTtcbiAgICAgIHRoaXMuYWRhcHRlci51bk9ic2VydmUodGhpcyk7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKGBObyBsb25nZXIgb2JzZXJ2aW5nIGFkYXB0ZXIgJHt0aGlzLmFkYXB0ZXIuZmxhdm91cn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5vdGlmaWVzIGFsbCBvYnNlcnZlcnMgb2YgYW4gZXZlbnQuXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYWxsIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgYSBkYXRhYmFzZSBldmVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlIG5hbWUgd2hlcmUgdGhlIGV2ZW50IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBldmVudCB0aGF0IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBJRCBvciBJRHMgb2YgdGhlIGFmZmVjdGVkIHJlY29yZHMuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIG9ic2VydmVyIGhhbmRsZXIgaXMgbm90IGluaXRpYWxpemVkLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLnVwZGF0ZU9ic2VydmVycylcbiAgICAgIC52ZXJib3NlKFxuICAgICAgICBgVXBkYXRpbmcgJHt0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpfSBvYnNlcnZlcnMgZm9yICR7dGhpc31gXG4gICAgICApO1xuICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIHRoaXMubG9nLFxuICAgICAgdGFibGUsXG4gICAgICBldmVudCxcbiAgICAgIEFycmF5LmlzQXJyYXkoaWQpXG4gICAgICAgID8gaWQubWFwKChpKSA9PiBTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMucGtQcm9wcy50eXBlLCBpKSBhcyBzdHJpbmcpXG4gICAgICAgIDogKFNlcXVlbmNlLnBhcnNlVmFsdWUodGhpcy5wa1Byb3BzLnR5cGUsIGlkKSBhcyBzdHJpbmcpLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsaWFzIGZvciB1cGRhdGVPYnNlcnZlcnMuXG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIGFsbCBvYnNlcnZlcnMgb2YgYW4gZXZlbnQgKGFsaWFzIGZvciB1cGRhdGVPYnNlcnZlcnMpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUgbmFtZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIElEIG9yIElEcyBvZiB0aGUgYWZmZWN0ZWQgcmVjb3Jkcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLlxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaChcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgb3IgcmV0cmlldmVzIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCByZXR1cm5zIGEgcmVwb3NpdG9yeSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBtb2RlbC5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSB0aGF0IGV4dGVuZHMgUmVwbzxNPi5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgZGVmYXVsdCBhZGFwdGVyIGZsYXZvdXIgaWYgbm90IHNwZWNpZmllZCBvbiB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IFthcmdzXSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge1J9IEEgcmVwb3NpdG9yeSBpbnN0YW5jZSBmb3IgdGhlIG1vZGVsLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBhZGFwdGVyIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBmbGF2b3VyLlxuICAgKi9cbiAgc3RhdGljIGZvck1vZGVsPE0gZXh0ZW5kcyBNb2RlbCwgUiBleHRlbmRzIFJlcG88TT4+KFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBhbGlhcz86IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBSIHtcbiAgICBsZXQgcmVwbzogUiB8IENvbnN0cnVjdG9yPFI+IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgX2FsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgYWxpYXMgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBtb2RlbCkgfHxcbiAgICAgIEFkYXB0ZXIuY3VycmVudEZsYXZvdXI7XG4gICAgdHJ5IHtcbiAgICAgIHJlcG8gPSB0aGlzLmdldChtb2RlbCwgX2FsaWFzKSBhcyBDb25zdHJ1Y3RvcjxSPiB8IFI7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICByZXBvID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChyZXBvIGluc3RhbmNlb2YgUmVwb3NpdG9yeSkgcmV0dXJuIHJlcG8gYXMgUjtcblxuICAgIGNvbnN0IGZsYXZvdXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9XG4gICAgICBhbGlhcyB8fFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIG1vZGVsKSB8fFxuICAgICAgKHJlcG8gJiZcbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIHJlcG8pKSB8fFxuICAgICAgQWRhcHRlci5jdXJyZW50Rmxhdm91cjtcbiAgICBjb25zdCBhZGFwdGVyOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4gfCB1bmRlZmluZWQgPSBmbGF2b3VyXG4gICAgICA/IEFkYXB0ZXIuZ2V0KGZsYXZvdXIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcmVnaXN0ZXJlZCBwZXJzaXN0ZW5jZSBhZGFwdGVyIGZvdW5kIGZsYXZvdXIgJHtmbGF2b3VyfWBcbiAgICAgICk7XG5cbiAgICByZXBvID0gcmVwbyB8fCAoYWRhcHRlci5yZXBvc2l0b3J5KCkgYXMgQ29uc3RydWN0b3I8Uj4pO1xuICAgIHJldHVybiBuZXcgcmVwbyhhZGFwdGVyLCBtb2RlbCwgLi4uYXJncykgYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbCBmcm9tIHRoZSBjYWNoZS5cbiAgICogQHN1bW1hcnkgR2V0cyBhIHJlcG9zaXRvcnkgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZWwgZnJvbSB0aGUgaW50ZXJuYWwgY2FjaGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gLSBUaGUgYWRhcHRlciBhbGlhcy5cbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+fSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZS5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gcmVwb3NpdG9yeSBpcyByZWdpc3RlcmVkIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKTogQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+IHtcbiAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSBSZXBvc2l0b3J5LnRhYmxlKG1vZGVsKTtcbiAgICBsZXQgcmVnaXN0cnlOYW1lOiBzdHJpbmcgPSBuYW1lO1xuICAgIGlmIChhbGlhcykge1xuICAgICAgcmVnaXN0cnlOYW1lID0gW25hbWUsIGFsaWFzXS5qb2luKERlZmF1bHRTZXBhcmF0b3IpO1xuICAgIH1cbiAgICBpZiAocmVnaXN0cnlOYW1lIGluIHRoaXMuX2NhY2hlKVxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlW3JlZ2lzdHJ5TmFtZV0gYXMgdW5rbm93biBhc1xuICAgICAgICB8IENvbnN0cnVjdG9yPFJlcG88TT4+XG4gICAgICAgIHwgUmVwbzxNPjtcbiAgICBpZiAobmFtZSBpbiB0aGlzLl9jYWNoZSlcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZVtuYW1lXSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPjtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBDb3VsZCBub3QgZmluZCByZXBvc2l0b3J5IHJlZ2lzdGVyZWQgdW5kZXIgJHtuYW1lfWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSByZXBvc2l0b3J5IGZvciBhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBBc3NvY2lhdGVzIGEgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZSB3aXRoIGEgbW9kZWwgaW4gdGhlIGludGVybmFsIGNhY2hlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+fSByZXBvIC0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIHRoZSBhZGFwdGVyIGFsaWFzL2ZsYXZvdXIuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGEgcmVwb3NpdG9yeSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoZSBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICByZXBvOiBDb25zdHJ1Y3RvcjxSZXBvPE0+PiB8IFJlcG88TT4sXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IG5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG1vZGVsKTtcbiAgICBpZiAoYWxpYXMpIHtcbiAgICAgIG5hbWUgPSBbbmFtZSwgYWxpYXNdLmpvaW4oRGVmYXVsdFNlcGFyYXRvcik7XG4gICAgfVxuICAgIGlmIChuYW1lIGluIHRoaXMuX2NhY2hlKSB7XG4gICAgICBpZiAodGhpcy5fY2FjaGVbbmFtZV0gaW5zdGFuY2VvZiBSZXBvc2l0b3J5KVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgJHtuYW1lfSBhbHJlYWR5IGhhcyBhIHJlZ2lzdGVyZWQgaW5zdGFuY2VgKTtcbiAgICB9XG4gICAgdGhpcy5fY2FjaGVbbmFtZV0gPSByZXBvIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyBtZXRhZGF0YSBvbiBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBBdHRhY2hlcyBtZXRhZGF0YSB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2FueX0gbWV0YWRhdGEgLSBUaGUgbWV0YWRhdGEgdG8gYXR0YWNoIHRvIHRoZSBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBzZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCBtZXRhZGF0YTogYW55KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG1ldGFkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHByZXZpb3VzbHkgYXR0YWNoZWQgbWV0YWRhdGEgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7YW55fSBUaGUgbWV0YWRhdGEgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cbiAgICovXG4gIHN0YXRpYyBnZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLnZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgRGVsZXRlcyB0aGUgbWV0YWRhdGEgcHJvcGVydHkgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyByZW1vdmVNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgaWYgKGRlc2NyaXB0b3IpIGRlbGV0ZSAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHNlcXVlbmNlIG9wdGlvbnMgZm9yIGEgbW9kZWwncyBwcmltYXJ5IGtleS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBzZXF1ZW5jZSBjb25maWd1cmF0aW9uIGZvciBhIG1vZGVsJ3MgcHJpbWFyeSBrZXkgZnJvbSBtZXRhZGF0YS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge1NlcXVlbmNlT3B0aW9uc30gVGhlIHNlcXVlbmNlIG9wdGlvbnMgZm9yIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBzZXF1ZW5jZSBvcHRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2VxdWVuY2VPcHRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG1vZGVsKS5pZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBSZXBvc2l0b3J5LmtleShEQktleXMuSUQpLFxuICAgICAgbW9kZWwsXG4gICAgICBwayBhcyBzdHJpbmdcbiAgICApO1xuICAgIGlmICghbWV0YWRhdGEpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJObyBzZXF1ZW5jZSBvcHRpb25zIGRlZmluZWQgZm9yIG1vZGVsLiBkaWQgeW91IHVzZSB0aGUgQHBrIGRlY29yYXRvcj9cIlxuICAgICAgKTtcbiAgICByZXR1cm4gbWV0YWRhdGEgYXMgU2VxdWVuY2VPcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCBpbmRleGVzIGRlZmluZWQgb24gYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFsbCBpbmRleCBtZXRhZGF0YSBmcm9tIGEgbW9kZWwncyBwcm9wZXJ0eSBkZWNvcmF0b3JzLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj59IEEgbmVzdGVkIHJlY29yZCBvZiBwcm9wZXJ0eSBuYW1lcyB0byBpbmRleCBtZXRhZGF0YS5cbiAgICovXG4gIHN0YXRpYyBpbmRleGVzPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGNvbnN0IGluZGV4RGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsIDogbmV3IG1vZGVsKCksXG4gICAgICBEQktleXMuUkVGTEVDVFxuICAgICk7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGluZGV4RGVjb3JhdG9ycyB8fCB7fSkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj4sIFtrLCB2YWxdKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSB2YWwuZmlsdGVyKCh2KSA9PiB2LmtleS5zdGFydHNXaXRoKFBlcnNpc3RlbmNlS2V5cy5JTkRFWCkpO1xuICAgICAgICBpZiAoZGVjcyAmJiBkZWNzLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgZGVjIG9mIGRlY3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjO1xuICAgICAgICAgICAgYWNjdW1ba10gPSBhY2N1bVtrXSB8fCB7fTtcbiAgICAgICAgICAgIGFjY3VtW2tdW2tleV0gPSBwcm9wcyBhcyBJbmRleE1ldGFkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCByZWxhdGlvbiBwcm9wZXJ0aWVzIGRlZmluZWQgb24gYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBuYW1lcyBvZiBhbGwgcHJvcGVydGllcyBtYXJrZWQgYXMgcmVsYXRpb25zIGluIHRoZSBtb2RlbCBoaWVyYXJjaHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IGFyZSByZWxhdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgcmVsYXRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHByb3RvdHlwZSA9XG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsXG4gICAgICAgID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZGVsKVxuICAgICAgICA6IChtb2RlbCBhcyBhbnkpLnByb3RvdHlwZTtcbiAgICB3aGlsZSAocHJvdG90eXBlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHByb3BzOiBzdHJpbmdbXSA9IHByb3RvdHlwZVtQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TXTtcbiAgICAgIGlmIChwcm9wcykge1xuICAgICAgICByZXN1bHQucHVzaCguLi5wcm9wcyk7XG4gICAgICB9XG4gICAgICBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdGFibGUgbmFtZSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBhIG1vZGVsLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgdGFibGU8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0VGFibGVOYW1lKG1vZGVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY29sdW1uIG5hbWUgZm9yIGEgbW9kZWwgYXR0cmlidXRlLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIHByb3BlcnR5LlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIFRoZSBhdHRyaWJ1dGUvcHJvcGVydHkgbmFtZS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29sdW1uIG5hbWUgZm9yIHRoZSBhdHRyaWJ1dGUuXG4gICAqL1xuICBzdGF0aWMgY29sdW1uPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0sIGF0dHJpYnV0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Q29sdW1uTmFtZShtb2RlbCwgYXR0cmlidXRlKTtcbiAgfVxufVxuXG5pZiAoQWRhcHRlcikgQWRhcHRlcltcIl9iYXNlUmVwb3NpdG9yeVwiXSA9IFJlcG9zaXRvcnk7XG4iXX0=
package/lib/index.cjs CHANGED
@@ -42,5 +42,5 @@ __exportStar(require("./persistence/index.cjs"), exports);
42
42
  * @const VERSION
43
43
  * @memberOf module:core
44
44
  */
45
- exports.VERSION = "0.5.38";
45
+ exports.VERSION = "0.5.39";
46
46
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCw4REFBK0Q7QUFDL0QsMkVBQThEO0FBRTlELGtGQUFrRjtBQUNsRixtQ0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLGlDQUFtQixFQUFFLENBQUMsQ0FBQztBQUVuRCw0QkFBNEI7QUFDNUIseURBQTZCO0FBRTdCLHVEQUEyQjtBQUMzQix5REFBNkI7QUFDN0Isb0RBQXdCO0FBQ3hCLG9EQUF3QjtBQUN4QixvREFBd0I7QUFDeEIsdURBQWlDO0FBQ2pDLHlCQUF5QjtBQUN6QiwwREFBOEI7QUFFOUI7Ozs7O0dBS0c7QUFDVSxRQUFBLE9BQU8sR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgY29yZVxuICogQGRlc2NyaXB0aW9uIENvcmUgbW9kdWxlIGZvciB0aGUgRGVjYWYgVHlwZVNjcmlwdCBmcmFtZXdvcmtcbiAqIEBzdW1tYXJ5IFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uYWwgY29tcG9uZW50cyBvZiB0aGUgRGVjYWYgZnJhbWV3b3JrLCBpbmNsdWRpbmcgaWRlbnRpdHkgbWFuYWdlbWVudCxcbiAqIG1vZGVsIGRlZmluaXRpb25zLCByZXBvc2l0b3J5IHBhdHRlcm5zLCBwZXJzaXN0ZW5jZSBsYXllciwgcXVlcnkgYnVpbGRpbmcsIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucy5cbiAqIEl0IGV4cG9ydHMgZnVuY3Rpb25hbGl0eSBmcm9tIHZhcmlvdXMgc3VibW9kdWxlcyBhbmQgc2V0cyB1cCB0aGUgaW5qZWN0YWJsZSByZWdpc3RyeSBmb3IgcmVwb3NpdG9yeSBkZWNvcmF0b3JzLlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGVzUmVnaXN0cnkgfSBmcm9tIFwiLi9yZXBvc2l0b3J5L2luamVjdGFibGVzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5cbi8vIG92ZXJyaWRlcyB0aGUgcHJldmlvdXMgSW5qZWN0YWJsZXMgcmVnaXN0cnkgdG8gZW5hYmxlIHRoZSBAcmVwb3NpdG9yeSBkZWNvcmF0b3JcbkluamVjdGFibGVzLnNldFJlZ2lzdHJ5KG5ldyBJbmplY3RhYmxlc1JlZ2lzdHJ5KCkpO1xuXG4vLyBpbXBvcnRlZCBmaXJzdCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9yZXBvc2l0b3J5XCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2lkZW50aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcXVlcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yYW0vUmFtQWRhcHRlclwiO1xuLy9sZWZ0IHRvIGxhc3Qgb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvblxuICogQHN1bW1hcnkgQSBjb25zdGFudCByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIGNvcmUgcGFja2FnZVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdfQ==
package/lib/index.d.ts CHANGED
@@ -19,4 +19,4 @@ export * from "./persistence";
19
19
  * @const VERSION
20
20
  * @memberOf module:core
21
21
  */
22
- export declare const VERSION = "0.5.38";
22
+ export declare const VERSION = "0.5.39";