@decaf-ts/for-couchdb 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/for-couchdb.cjs +16 -46
  2. package/dist/for-couchdb.esm.cjs +7 -36
  3. package/lib/adapter.cjs +1 -1
  4. package/lib/adapter.d.ts +7 -8
  5. package/lib/esm/adapter.d.ts +7 -8
  6. package/lib/esm/adapter.js +1 -1
  7. package/lib/esm/index.d.ts +1 -1
  8. package/lib/esm/index.js +1 -1
  9. package/lib/esm/interfaces/CouchDBRepository.d.ts +2 -1
  10. package/lib/esm/interfaces/CouchDBRepository.js +1 -1
  11. package/lib/esm/query/Paginator.js +5 -2
  12. package/lib/esm/query/Statement.d.ts +1 -1
  13. package/lib/esm/query/Statement.js +1 -1
  14. package/lib/esm/query/factory.d.ts +3 -2
  15. package/lib/esm/query/factory.js +2 -2
  16. package/lib/esm/sequences/Sequence.d.ts +2 -2
  17. package/lib/esm/sequences/Sequence.js +1 -1
  18. package/lib/index.cjs +2 -2
  19. package/lib/index.d.ts +1 -1
  20. package/lib/indexes/generator.cjs +3 -3
  21. package/lib/indexes/index.cjs +1 -1
  22. package/lib/interfaces/CouchDBRepository.cjs +1 -1
  23. package/lib/interfaces/CouchDBRepository.d.ts +2 -1
  24. package/lib/interfaces/index.cjs +1 -1
  25. package/lib/model/CouchDBSequence.cjs +2 -2
  26. package/lib/model/index.cjs +1 -1
  27. package/lib/query/FromClause.cjs +2 -2
  28. package/lib/query/Paginator.cjs +6 -3
  29. package/lib/query/Statement.cjs +3 -3
  30. package/lib/query/Statement.d.ts +1 -1
  31. package/lib/query/WhereClause.cjs +2 -2
  32. package/lib/query/factory.cjs +1 -1
  33. package/lib/query/factory.d.ts +3 -2
  34. package/lib/query/index.cjs +1 -1
  35. package/lib/query/translate.cjs +1 -1
  36. package/lib/sequences/Sequence.cjs +2 -2
  37. package/lib/sequences/Sequence.d.ts +2 -2
  38. package/lib/sequences/index.cjs +1 -1
  39. package/lib/utils.cjs +1 -1
  40. package/package.json +3 -3
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@decaf-ts/core'), require('@decaf-ts/db-decorators'), require('@decaf-ts/decorator-validation'), require('reflect-metadata')) :
3
- typeof define === 'function' && define.amd ? define(['exports', '@decaf-ts/core', '@decaf-ts/db-decorators', '@decaf-ts/decorator-validation', 'reflect-metadata'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["for-couchdb"] = {}, global.core, global.dbDecorators, global.decoratorValidation));
5
- })(this, (function (exports, core, dbDecorators, decoratorValidation) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@decaf-ts/core'), require('@decaf-ts/db-decorators'), require('tslib'), require('@decaf-ts/decorator-validation'), require('reflect-metadata')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', '@decaf-ts/core', '@decaf-ts/db-decorators', 'tslib', '@decaf-ts/decorator-validation', 'reflect-metadata'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["for-couchdb"] = {}, global.core, global.dbDecorators, global.tslib, global.decoratorValidation));
5
+ })(this, (function (exports, core, dbDecorators, tslib, decoratorValidation) { 'use strict';
6
6
 
7
7
  const reservedAttributes = /^_.*$/g;
8
8
  const CouchDBKeys = {
@@ -102,57 +102,24 @@
102
102
  return Object.values(indexes);
103
103
  }
104
104
 
105
- /******************************************************************************
106
- Copyright (c) Microsoft Corporation.
107
-
108
- Permission to use, copy, modify, and/or distribute this software for any
109
- purpose with or without fee is hereby granted.
110
-
111
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
112
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
113
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
114
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
115
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
116
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
117
- PERFORMANCE OF THIS SOFTWARE.
118
- ***************************************************************************** */
119
- /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
120
-
121
-
122
- function __decorate(decorators, target, key, desc) {
123
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
124
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
125
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
126
- return c > 3 && r && Object.defineProperty(target, key, r), r;
127
- }
128
-
129
- function __metadata(metadataKey, metadataValue) {
130
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
131
- }
132
-
133
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
134
- var e = new Error(message);
135
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
136
- };
137
-
138
105
  exports.Sequence = class Sequence extends core.BaseModel {
139
106
  constructor(seq) {
140
107
  super(seq);
141
108
  }
142
109
  };
143
- __decorate([
110
+ tslib.__decorate([
144
111
  core.pk(),
145
- __metadata("design:type", String)
112
+ tslib.__metadata("design:type", String)
146
113
  ], exports.Sequence.prototype, "id", void 0);
147
- __decorate([
114
+ tslib.__decorate([
148
115
  decoratorValidation.required(),
149
116
  core.index(),
150
- __metadata("design:type", Object)
117
+ tslib.__metadata("design:type", Object)
151
118
  ], exports.Sequence.prototype, "current", void 0);
152
- exports.Sequence = __decorate([
119
+ exports.Sequence = tslib.__decorate([
153
120
  core.table(CouchDBKeys.SEQUENCE),
154
121
  decoratorValidation.model(),
155
- __metadata("design:paramtypes", [Object])
122
+ tslib.__metadata("design:paramtypes", [Object])
156
123
  ], exports.Sequence);
157
124
 
158
125
  function parseSequenceValue(type, value) {
@@ -305,6 +272,7 @@
305
272
  // // .from(target)
306
273
  // // .execute<number>();
307
274
  // }
275
+ this.validatePage(page);
308
276
  if (page !== 1) {
309
277
  if (!this.bookMark)
310
278
  throw new core.PagingError("No bookmark. Did you start in the first page?");
@@ -314,13 +282,15 @@
314
282
  const { docs, bookmark, warning } = rawResult;
315
283
  if (warning)
316
284
  console.warn(warning);
285
+ if (!target)
286
+ throw new core.PagingError("No statement target defined");
287
+ const pkDef = dbDecorators.findPrimaryKey(new target());
317
288
  const results = statement.fields && statement.fields.length
318
289
  ? docs // has fields means its not full model
319
290
  : docs.map((d) => {
320
291
  //no fields means we need to revert to saving process
321
292
  if (!target)
322
293
  throw new core.PagingError("No statement target defined");
323
- const pkDef = dbDecorators.findPrimaryKey(new target());
324
294
  const pk = pkDef.id;
325
295
  const originalId = d._id.split(dbDecorators.DefaultSeparator);
326
296
  originalId.splice(0, 1); // remove the table name
@@ -853,7 +823,7 @@
853
823
  * @const VERSION
854
824
  * @memberOf module:ts-workspace
855
825
  */
856
- const VERSION = "0.2.0";
826
+ const VERSION = "0.3.0";
857
827
 
858
828
  exports.CouchDBAdapter = CouchDBAdapter;
859
829
  exports.CouchDBKeys = CouchDBKeys;
@@ -869,4 +839,4 @@
869
839
  exports.wrapDocumentScope = wrapDocumentScope;
870
840
 
871
841
  }));
872
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWNvdWNoZGIuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3F1ZXJ5L2NvbnN0YW50cy50cyIsIi4uL3NyYy9pbmRleGVzL2dlbmVyYXRvci50cyIsIi4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi9zcmMvbW9kZWwvQ291Y2hEQlNlcXVlbmNlLnRzIiwiLi4vc3JjL3NlcXVlbmNlcy91dGlscy50cyIsIi4uL3NyYy9zZXF1ZW5jZXMvU2VxdWVuY2UudHMiLCIuLi9zcmMvcXVlcnkvUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3F1ZXJ5L1N0YXRlbWVudC50cyIsIi4uL3NyYy9xdWVyeS9Gcm9tQ2xhdXNlLnRzIiwiLi4vc3JjL3F1ZXJ5L0luc2VydENsYXVzZS50cyIsIi4uL3NyYy9xdWVyeS9XaGVyZUNsYXVzZS50cyIsIi4uL3NyYy9xdWVyeS9TZWxlY3RDbGF1c2UudHMiLCIuLi9zcmMvcXVlcnkvVmFsdWVzQ2xhdXNlLnRzIiwiLi4vc3JjL3F1ZXJ5L2ZhY3RvcnkudHMiLCIuLi9zcmMvcXVlcnkvdHJhbnNsYXRlLnRzIiwiLi4vc3JjL2Vycm9ycy50cyIsIi4uL3NyYy9hZGFwdGVyLnRzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCByZXNlcnZlZEF0dHJpYnV0ZXMgPSAvXl8uKiQvZztcblxuZXhwb3J0IGNvbnN0IENvdWNoREJLZXlzID0ge1xuICBTRVBBUkFUT1I6IFwiX1wiLFxuICBJRDogXCJfaWRcIixcbiAgUkVWOiBcIl9yZXZcIixcbiAgREVMRVRFRDogXCJfZGVsZXRlZFwiLFxuICBUQUJMRTogXCI/P3RhYmxlXCIsXG4gIFNFUVVFTkNFOiBcIj8/c2VxdWVuY2VcIixcbiAgRERPQzogXCJkZG9jXCIsXG4gIE5BVElWRTogXCJfX25hdGl2ZVwiLFxuICBJTkRFWDogXCJpbmRleFwiLFxufTtcbiIsImltcG9ydCB7IE1hbmdvT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IENvdWNoREJPcGVyYXRvcjogUmVjb3JkPHN0cmluZywgTWFuZ29PcGVyYXRvcj4gPSB7XG4gIEVRVUFMOiBcIiRlcVwiLFxuICBESUZGRVJFTlQ6IFwiJG5lXCIsXG4gIEJJR0dFUjogXCIkZ3RcIixcbiAgQklHR0VSX0VROiBcIiRndGVcIixcbiAgU01BTExFUjogXCIkbHRcIixcbiAgU01BTExFUl9FUTogXCIkbHRlXCIsXG4gIC8vIEJFVFdFRU4gPSBcIkJFVFdFRU5cIixcbiAgTk9UOiBcIiRub3RcIixcbiAgSU46IFwiJGluXCIsXG4gIC8vIElTID0gXCJJU1wiLFxuICBSRUdFWFA6IFwiJHJlZ2V4XCIsXG59O1xuXG5leHBvcnQgY29uc3QgQ291Y2hEQkdyb3VwT3BlcmF0b3I6IFJlY29yZDxzdHJpbmcsIE1hbmdvT3BlcmF0b3I+ID0ge1xuICBBTkQ6IFwiJGFuZFwiLFxuICBPUjogXCIkb3JcIixcbn07XG5cbmV4cG9ydCBjb25zdCBDb3VjaERCQ29uc3Q6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIE5VTEw6IFwibnVsbFwiLFxufTtcbiIsImltcG9ydCB7XG4gIEluZGV4TWV0YWRhdGEsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlcG9zaXRvcnksXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWZhdWx0U2VwYXJhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb3VjaERCT3BlcmF0b3IgfSBmcm9tIFwiLi4vcXVlcnkvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDcmVhdGVJbmRleFJlcXVlc3QgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZnVuY3Rpb24gZ2VuZXJhdGVJbmRleE5hbWUoXG4gIG5hbWU6IHN0cmluZ1tdLFxuICBkaXJlY3Rpb24/OiBPcmRlckRpcmVjdGlvbixcbiAgY29tcG9zaXRpb25zPzogc3RyaW5nW10sXG4gIHNlcGFyYXRvciA9IERlZmF1bHRTZXBhcmF0b3Jcbikge1xuICByZXR1cm4gW1xuICAgIC4uLm5hbWUubWFwKChuKSA9PiAobiA9PT0gQ291Y2hEQktleXMuVEFCTEUgPyBcInRhYmxlXCIgOiBuKSksXG4gICAgLi4uKGNvbXBvc2l0aW9ucyB8fCBbXSksXG4gICAgLi4uKGRpcmVjdGlvbiA/IFtkaXJlY3Rpb25dIDogW10pLFxuICAgIENvdWNoREJLZXlzLklOREVYLFxuICBdLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSW5kZXhlczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbik6IENyZWF0ZUluZGV4UmVxdWVzdFtdIHtcbiAgY29uc3QgdGFibGVOYW1lID0gZ2VuZXJhdGVJbmRleE5hbWUoW0NvdWNoREJLZXlzLlRBQkxFXSk7XG4gIGNvbnN0IGluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIENyZWF0ZUluZGV4UmVxdWVzdD4gPSB7fTtcbiAgaW5kZXhlc1t0YWJsZU5hbWVdID0ge1xuICAgIGluZGV4OiB7XG4gICAgICBmaWVsZHM6IFtDb3VjaERCS2V5cy5UQUJMRV0sXG4gICAgfSxcbiAgICBuYW1lOiB0YWJsZU5hbWUsXG4gICAgZGRvYzogdGFibGVOYW1lLFxuICAgIHR5cGU6IFwianNvblwiLFxuICB9O1xuXG4gIG1vZGVscy5mb3JFYWNoKChtKSA9PiB7XG4gICAgY29uc3QgaW5kOiBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPiA9IFJlcG9zaXRvcnkuaW5kZXhlcyhtKTtcbiAgICBPYmplY3QuZW50cmllcyhpbmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgY29uc3QgayA9IE9iamVjdC5rZXlzKHZhbHVlKVswXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgIGxldCB7IGRpcmVjdGlvbnMsIGNvbXBvc2l0aW9ucyB9ID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG0pO1xuICAgICAgY29tcG9zaXRpb25zID0gY29tcG9zaXRpb25zIHx8IFtdO1xuXG4gICAgICBmdW5jdGlvbiBnZW5lcmF0ZShzb3J0PzogT3JkZXJEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtcbiAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIC4uLihjb21wb3NpdGlvbnMgYXMgW10pLFxuICAgICAgICAgIFBlcnNpc3RlbmNlS2V5cy5JTkRFWCxcbiAgICAgICAgXS5qb2luKERlZmF1bHRTZXBhcmF0b3IpO1xuXG4gICAgICAgIGluZGV4ZXNbbmFtZV0gPSB7XG4gICAgICAgICAgaW5kZXg6IHtcbiAgICAgICAgICAgIGZpZWxkczogW2tleSwgLi4uKGNvbXBvc2l0aW9ucyBhcyBbXSksIENvdWNoREJLZXlzLlRBQkxFXS5yZWR1Y2UoXG4gICAgICAgICAgICAgIChhY2N1bTogYW55W10sIGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNvcnQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlczogYW55ID0ge307XG4gICAgICAgICAgICAgICAgICByZXNbZWxdID0gc29ydDtcbiAgICAgICAgICAgICAgICAgIGFjY3VtLnB1c2gocmVzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgYWNjdW0ucHVzaChlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIGRkb2M6IG5hbWUsXG4gICAgICAgICAgdHlwZTogXCJqc29uXCIsXG4gICAgICAgIH07XG4gICAgICAgIGlmICghc29ydCkge1xuICAgICAgICAgIGNvbnN0IHRhYmxlRmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICAgICAgdGFibGVGaWx0ZXJbQ291Y2hEQktleXMuVEFCTEVdID0ge307XG4gICAgICAgICAgdGFibGVGaWx0ZXJbQ291Y2hEQktleXMuVEFCTEVdW0NvdWNoREJPcGVyYXRvci5FUVVBTF0gPSB0YWJsZU5hbWU7XG4gICAgICAgICAgaW5kZXhlc1tuYW1lXS5pbmRleC5wYXJ0aWFsX2ZpbHRlcl9zZWxlY3RvciA9IHRhYmxlRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRlKCk7XG4gICAgICBpZiAoZGlyZWN0aW9ucylcbiAgICAgICAgKGRpcmVjdGlvbnMgYXMgdW5rbm93biBhcyBPcmRlckRpcmVjdGlvbltdKS5mb3JFYWNoKChkKSA9PiBnZW5lcmF0ZShkKSk7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhpbmRleGVzKTtcbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcclxuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxyXG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcclxuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xyXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XHJcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xyXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xyXG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xyXG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcclxuICAgIGRvbmUgPSB0cnVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcclxuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xyXG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xyXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcclxuICAgIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcclxuICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG52YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHtcclxuICAgIG93bktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiAobykge1xyXG4gICAgICAgIHZhciBhciA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGsgaW4gbykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKSkgYXJbYXIubGVuZ3RoXSA9IGs7XHJcbiAgICAgICAgcmV0dXJuIGFyO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBvd25LZXlzKG8pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09IFwiZGVmYXVsdFwiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xyXG4gICAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XHJcbiAgICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcclxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XHJcbiAgICAgICAgdmFyIGRpc3Bvc2UsIGlubmVyO1xyXG4gICAgICAgIGlmIChhc3luYykge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XHJcbiAgICAgICAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XHJcbiAgICAgICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XHJcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuXHJcbn1cclxuXHJcbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XHJcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kaXNwb3NlUmVzb3VyY2VzKGVudikge1xyXG4gICAgZnVuY3Rpb24gZmFpbChlKSB7XHJcbiAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xyXG4gICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB2YXIgciwgcyA9IDA7XHJcbiAgICBmdW5jdGlvbiBuZXh0KCkge1xyXG4gICAgICAgIHdoaWxlIChyID0gZW52LnN0YWNrLnBvcCgpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXIuYXN5bmMgJiYgcyA9PT0gMSkgcmV0dXJuIHMgPSAwLCBlbnYuc3RhY2sucHVzaChyKSwgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihuZXh0KTtcclxuICAgICAgICAgICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgcyB8PSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBmYWlsKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXh0KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbihwYXRoLCBwcmVzZXJ2ZUpzeCkge1xyXG4gICAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiICYmIC9eXFwuXFwuP1xcLy8udGVzdChwYXRoKSkge1xyXG4gICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcLih0c3gpJHwoKD86XFwuZCk/KSgoPzpcXC5bXi4vXSs/KT8pXFwuKFtjbV0/KXRzJC9pLCBmdW5jdGlvbiAobSwgdHN4LCBkLCBleHQsIGNtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0c3ggPyBwcmVzZXJ2ZUpzeCA/IFwiLmpzeFwiIDogXCIuanNcIiA6IGQgJiYgKCFleHQgfHwgIWNtKSA/IG0gOiAoZCArIGV4dCArIFwiLlwiICsgY20udG9Mb3dlckNhc2UoKSArIFwianNcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGF0aDtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgX19leHRlbmRzOiBfX2V4dGVuZHMsXHJcbiAgICBfX2Fzc2lnbjogX19hc3NpZ24sXHJcbiAgICBfX3Jlc3Q6IF9fcmVzdCxcclxuICAgIF9fZGVjb3JhdGU6IF9fZGVjb3JhdGUsXHJcbiAgICBfX3BhcmFtOiBfX3BhcmFtLFxyXG4gICAgX19lc0RlY29yYXRlOiBfX2VzRGVjb3JhdGUsXHJcbiAgICBfX3J1bkluaXRpYWxpemVyczogX19ydW5Jbml0aWFsaXplcnMsXHJcbiAgICBfX3Byb3BLZXk6IF9fcHJvcEtleSxcclxuICAgIF9fc2V0RnVuY3Rpb25OYW1lOiBfX3NldEZ1bmN0aW9uTmFtZSxcclxuICAgIF9fbWV0YWRhdGE6IF9fbWV0YWRhdGEsXHJcbiAgICBfX2F3YWl0ZXI6IF9fYXdhaXRlcixcclxuICAgIF9fZ2VuZXJhdG9yOiBfX2dlbmVyYXRvcixcclxuICAgIF9fY3JlYXRlQmluZGluZzogX19jcmVhdGVCaW5kaW5nLFxyXG4gICAgX19leHBvcnRTdGFyOiBfX2V4cG9ydFN0YXIsXHJcbiAgICBfX3ZhbHVlczogX192YWx1ZXMsXHJcbiAgICBfX3JlYWQ6IF9fcmVhZCxcclxuICAgIF9fc3ByZWFkOiBfX3NwcmVhZCxcclxuICAgIF9fc3ByZWFkQXJyYXlzOiBfX3NwcmVhZEFycmF5cyxcclxuICAgIF9fc3ByZWFkQXJyYXk6IF9fc3ByZWFkQXJyYXksXHJcbiAgICBfX2F3YWl0OiBfX2F3YWl0LFxyXG4gICAgX19hc3luY0dlbmVyYXRvcjogX19hc3luY0dlbmVyYXRvcixcclxuICAgIF9fYXN5bmNEZWxlZ2F0b3I6IF9fYXN5bmNEZWxlZ2F0b3IsXHJcbiAgICBfX2FzeW5jVmFsdWVzOiBfX2FzeW5jVmFsdWVzLFxyXG4gICAgX19tYWtlVGVtcGxhdGVPYmplY3Q6IF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxyXG4gICAgX19pbXBvcnRTdGFyOiBfX2ltcG9ydFN0YXIsXHJcbiAgICBfX2ltcG9ydERlZmF1bHQ6IF9faW1wb3J0RGVmYXVsdCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEluOiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXHJcbiAgICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZTogX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXHJcbiAgICBfX2Rpc3Bvc2VSZXNvdXJjZXM6IF9fZGlzcG9zZVJlc291cmNlcyxcclxuICAgIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uOiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbixcclxufTtcclxuIiwiaW1wb3J0IHR5cGUgeyBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEJhc2VNb2RlbCwgcGssIGluZGV4LCB0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbkB0YWJsZShDb3VjaERCS2V5cy5TRVFVRU5DRSlcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgU2VxdWVuY2UgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAvKipcbiAgICogQHN1bW1hcnkgdGhlIFByaW1hcnkga2V5IGZvciB0aGUgREJTZXF1ZW5jZVxuICAgKiBAcHJvcCBuYW1lXG4gICAqXG4gICAqIEBzZWUgcGtcbiAgICovXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuICAvKipcbiAgICogQHN1bW1hcnkgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBEQlNlcXVlbmNlXG4gICAqIEBwcm9wIGN1cnJlbnRcbiAgICpcbiAgICogQHNlZSByZXF1aXJlZFxuICAgKiBAc2VlIGluZGV4XG4gICAqL1xuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBjdXJyZW50ITogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHNlcT86IE1vZGVsQXJnPFNlcXVlbmNlPikge1xuICAgIHN1cGVyKHNlcSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VxdWVuY2VWYWx1ZShcbiAgdHlwZTogXCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCB1bmRlZmluZWQsXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbik6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJOdW1iZXJcIjpcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBwYXJzZUludCh2YWx1ZSlcbiAgICAgICAgOiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgOiBCaWdJbnQodmFsdWUpO1xuICAgIGNhc2UgXCJCaWdJbnRcIjpcbiAgICAgIHJldHVybiBCaWdJbnQodmFsdWUpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIlNob3VsZCBuZXZlciBoYXBwZW5cIik7XG4gIH1cbn1cbiIsImltcG9ydCB7IHNmIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2UgYXMgU2VxIH0gZnJvbSBcIi4uL21vZGVsL0NvdWNoREJTZXF1ZW5jZVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgTm90Rm91bmRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQWRhcHRlciwgUmVwb3NpdG9yeSwgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgcGFyc2VTZXF1ZW5jZVZhbHVlIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IE1hbmdvUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IENvdWNoREJSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIFNlcXVlbmNlXG4gKiBAZGVzY3JpcHRpb24gcHJvdmlkZXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgZm9yIHtAbGluayBTZXF1ZW5jZX1zXG4gKlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnNcbiAqXG4gKiBAY2xhc3MgQ291Y2hEQlNlcXVlbmNlXG4gKiBAaW1wbGVtZW50cyBTZXF1ZW5jZVxuICpcbiAqIEBjYXRlZ29yeSBTZXF1ZW5jZXNcbiAqL1xuZXhwb3J0IGNsYXNzIENvdWNoREJTZXF1ZW5jZSBleHRlbmRzIFNlcXVlbmNlIHtcbiAgcHJvdGVjdGVkIHJlcG86IENvdWNoREJSZXBvc2l0b3J5PFNlcSwgYW55PjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMsIGFkYXB0ZXI6IEFkYXB0ZXI8YW55LCBNYW5nb1F1ZXJ5Pikge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMucmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoU2VxLCBhZGFwdGVyLmZsYXZvdXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIGFzeW5jIGN1cnJlbnQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCB7IG5hbWUsIHN0YXJ0V2l0aCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXF1ZW5jZTogU2VxID0gYXdhaXQgdGhpcy5yZXBvLnJlYWQobmFtZSBhcyBzdHJpbmcpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2Uoc2VxdWVuY2UuY3VycmVudCBhcyBzdHJpbmcgfCBudW1iZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhcnRXaXRoID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgXCJTdGFydGluZyB2YWx1ZSBpcyBub3QgZGVmaW5lZCBmb3IgYSBub24gZXhpc3Rpbmcgc2VxdWVuY2VcIlxuICAgICAgICAgICk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2Uoc3RhcnRXaXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBzZihcbiAgICAgICAgICAgICAgXCJGYWlsZWQgdG8gcGFyc2UgaW5pdGlhbCB2YWx1ZSBmb3Igc2VxdWVuY2UgezB9OiB7MX1cIixcbiAgICAgICAgICAgICAgc3RhcnRXaXRoLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgc2YoXG4gICAgICAgICAgXCJGYWlsZWQgdG8gcmV0cmlldmUgY3VycmVudCB2YWx1ZSBmb3Igc2VxdWVuY2UgezB9OiB7MX1cIixcbiAgICAgICAgICBuYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFBhcnNlcyB0aGUge0BsaW5rIFNlcXVlbmNlfSB2YWx1ZVxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHtcbiAgICByZXR1cm4gcGFyc2VTZXF1ZW5jZVZhbHVlKHRoaXMub3B0aW9ucy50eXBlLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgaW5jcmVtZW50cyB0aGUgc2VxdWVuY2VcbiAgICogQGRlc2NyaXB0aW9uIFNlcXVlbmNlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50fSBjdXJyZW50XG4gICAqIEBwYXJhbSBjb3VudFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluY3JlbWVudChcbiAgICBjdXJyZW50OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgY291bnQ/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCB7IHR5cGUsIGluY3JlbWVudEJ5LCBuYW1lIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgbGV0IG5leHQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcbiAgICBjb25zdCB0b0luY3JlbWVudEJ5ID0gY291bnQgfHwgaW5jcmVtZW50Qnk7XG4gICAgaWYgKHRvSW5jcmVtZW50QnkgJSBpbmNyZW1lbnRCeSAhPT0gMClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgVmFsdWUgdG8gaW5jcmVtZW50IGRvZXMgbm90IGNvbnNpZGVyIHRoZSBpbmNyZW1lbnRCeSBzZXR0aW5nOiAke2luY3JlbWVudEJ5fWBcbiAgICAgICk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiTnVtYmVyXCI6XG4gICAgICAgIG5leHQgPSAodGhpcy5wYXJzZShjdXJyZW50KSBhcyBudW1iZXIpICsgdG9JbmNyZW1lbnRCeTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQmlnSW50XCI6XG4gICAgICAgIG5leHQgPSAodGhpcy5wYXJzZShjdXJyZW50KSBhcyBiaWdpbnQpICsgQmlnSW50KHRvSW5jcmVtZW50QnkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiU2hvdWxkIG5ldmVyIGhhcHBlblwiKTtcbiAgICB9XG4gICAgbGV0IHNlcTogU2VxO1xuICAgIHRyeSB7XG4gICAgICBzZXEgPSBhd2FpdCB0aGlzLnJlcG8udXBkYXRlKG5ldyBTZXEoeyBpZDogbmFtZSwgY3VycmVudDogbmV4dCB9KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoIShlIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikpIHRocm93IGU7XG4gICAgICBzZXEgPSBhd2FpdCB0aGlzLnJlcG8uY3JlYXRlKG5ldyBTZXEoeyBpZDogbmFtZSwgY3VycmVudDogbmV4dCB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcS5jdXJyZW50IGFzIHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgdGhlIG5leHQgdmFsdWUgaW4gdGggc2VxdWVuY2VcbiAgICogQGRlc2NyaXB0aW9uIGNhbGxzIHtAbGluayBTZXF1ZW5jZSNwYXJzZX0gb24gdGhlIGN1cnJlbnQgdmFsdWVcbiAgICogZm9sbG93ZWQgYnkge0BsaW5rIFNlcXVlbmNlI2luY3JlbWVudH1cbiAgICpcbiAgICovXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5jdXJyZW50KCk7XG4gICAgcmV0dXJuIHRoaXMuaW5jcmVtZW50KGN1cnJlbnQpO1xuICB9XG5cbiAgYXN5bmMgcmFuZ2UoY291bnQ6IG51bWJlcik6IFByb21pc2U8KG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXT4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSAoYXdhaXQgdGhpcy5jdXJyZW50KCkpIGFzIG51bWJlcjtcbiAgICBjb25zdCBpbmNyZW1lbnRCeSA9IHRoaXMucGFyc2UodGhpcy5vcHRpb25zLmluY3JlbWVudEJ5KSBhcyBudW1iZXI7XG4gICAgY29uc3QgbmV4dDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50ID0gYXdhaXQgdGhpcy5pbmNyZW1lbnQoXG4gICAgICBjdXJyZW50LFxuICAgICAgKHRoaXMucGFyc2UoY291bnQpIGFzIG51bWJlcikgKiBpbmNyZW1lbnRCeVxuICAgICk7XG4gICAgY29uc3QgcmFuZ2U6IChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10gPSBbXTtcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDw9IGNvdW50OyBpKyspIHtcbiAgICAgIHJhbmdlLnB1c2goY3VycmVudCArIGluY3JlbWVudEJ5ICogKHRoaXMucGFyc2UoaSkgYXMgbnVtYmVyKSk7XG4gICAgfVxuICAgIGlmIChyYW5nZVtyYW5nZS5sZW5ndGggLSAxXSAhPT0gbmV4dClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzY2FsY3VsYXRpb24gb2YgcmFuZ2VcIik7XG4gICAgcmV0dXJuIHJhbmdlO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBQYWdpbmF0b3IsXG4gIFBhZ2luZ0Vycm9yLFxuICBTZXF1ZW5jZU9wdGlvbnMsXG4gIFN0YXRlbWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBEZWZhdWx0U2VwYXJhdG9yLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBwYXJzZVNlcXVlbmNlVmFsdWUgfSBmcm9tIFwiLi4vc2VxdWVuY2VzL3V0aWxzXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5LCBNYW5nb1Jlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBDb3VjaERCUGFnaW5hdG9yPFY+IGV4dGVuZHMgUGFnaW5hdG9yPFYsIE1hbmdvUXVlcnk+IHtcbiAgcHJpdmF0ZSBib29rTWFyaz86IHN0cmluZztcblxuICBnZXQgdG90YWwoKTogbnVtYmVyIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVGhlIHRvdGFsIHBhZ2VzIGFwaSBpcyBub3QgYXZhaWxhYmxlIGZvciBjb3VjaGRiYCk7XG4gIH1cblxuICBnZXQgY291bnQoKTogbnVtYmVyIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBUaGUgcmVjb3JkIGNvdW50IGFwaSBpcyBub3QgYXZhaWxhYmxlIGZvciBjb3VjaGRiYFxuICAgICk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzdGF0ZW1lbnQ6IFN0YXRlbWVudDxNYW5nb1F1ZXJ5PixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgcmF3U3RhdGVtZW50OiBNYW5nb1F1ZXJ5XG4gICkge1xuICAgIHN1cGVyKHN0YXRlbWVudCwgc2l6ZSwgcmF3U3RhdGVtZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgIGNvbnN0IHF1ZXJ5OiBNYW5nb1F1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgcmF3U3RhdGVtZW50KTtcbiAgICBpZiAocXVlcnkubGltaXQpIHRoaXMubGltaXQgPSBxdWVyeS5saW1pdDtcblxuICAgIHF1ZXJ5LmxpbWl0ID0gdGhpcy5zaXplO1xuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgYXN5bmMgcGFnZShwYWdlOiBudW1iZXIgPSAxLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VltdPiB7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZW1lbnQpO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuc3RhdC5nZXRUYXJnZXQoKTtcbiAgICAvLyBpZiAoIXRoaXMuX3JlY29yZENvdW50IHx8ICF0aGlzLl90b3RhbFBhZ2VzKSB7XG4gICAgLy8gICAvLyB0aGlzLl9yZWNvcmRDb3VudCA9IGF3YWl0IHRoaXMuYWRhcHRlclxuICAgIC8vICAgLy8gICAuUXVlcnkoKVxuICAgIC8vICAgLy8gICAuY291bnQoKVxuICAgIC8vICAgLy8gICAuZnJvbSh0YXJnZXQpXG4gICAgLy8gICAvLyAgIC5leGVjdXRlPG51bWJlcj4oKTtcbiAgICAvLyB9XG5cbiAgICBpZiAocGFnZSAhPT0gMSkge1xuICAgICAgaWYgKCF0aGlzLmJvb2tNYXJrKVxuICAgICAgICB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXCJObyBib29rbWFyay4gRGlkIHlvdSBzdGFydCBpbiB0aGUgZmlyc3QgcGFnZT9cIik7XG4gICAgICBzdGF0ZW1lbnRbXCJib29rbWFya1wiXSA9IHRoaXMuYm9va01hcms7XG4gICAgfVxuICAgIGNvbnN0IHJhd1Jlc3VsdDogTWFuZ29SZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyhcbiAgICAgIHN0YXRlbWVudCxcbiAgICAgIGZhbHNlLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG5cbiAgICBjb25zdCB7IGRvY3MsIGJvb2ttYXJrLCB3YXJuaW5nIH0gPSByYXdSZXN1bHQ7XG4gICAgaWYgKHdhcm5pbmcpIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICBjb25zdCByZXN1bHRzID1cbiAgICAgIHN0YXRlbWVudC5maWVsZHMgJiYgc3RhdGVtZW50LmZpZWxkcy5sZW5ndGhcbiAgICAgICAgPyBkb2NzIC8vIGhhcyBmaWVsZHMgbWVhbnMgaXRzIG5vdCBmdWxsIG1vZGVsXG4gICAgICAgIDogZG9jcy5tYXAoKGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy9ubyBmaWVsZHMgbWVhbnMgd2UgbmVlZCB0byByZXZlcnQgdG8gc2F2aW5nIHByb2Nlc3NcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXCJObyBzdGF0ZW1lbnQgdGFyZ2V0IGRlZmluZWRcIik7XG4gICAgICAgICAgICBjb25zdCBwa0RlZiA9IGZpbmRQcmltYXJ5S2V5KG5ldyB0YXJnZXQoKSkgYXMge1xuICAgICAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgICAgICBwcm9wczogU2VxdWVuY2VPcHRpb25zO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHBrID0gcGtEZWYuaWQ7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbElkID0gZC5faWQuc3BsaXQoRGVmYXVsdFNlcGFyYXRvcik7XG4gICAgICAgICAgICBvcmlnaW5hbElkLnNwbGljZSgwLCAxKTsgLy8gcmVtb3ZlIHRoZSB0YWJsZSBuYW1lXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChcbiAgICAgICAgICAgICAgZCxcbiAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICBwayxcbiAgICAgICAgICAgICAgcGFyc2VTZXF1ZW5jZVZhbHVlKFxuICAgICAgICAgICAgICAgIHBrRGVmLnByb3BzLnR5cGUsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxJZC5qb2luKERlZmF1bHRTZXBhcmF0b3IpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgdGhpcy5ib29rTWFyayA9IGJvb2ttYXJrO1xuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gcGFnZTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQWRhcHRlciwgU3RhdGVtZW50IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBmaW5kUHJpbWFyeUtleSwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb3VjaERCS2V5cyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHBhcnNlU2VxdWVuY2VWYWx1ZSB9IGZyb20gXCIuLi9zZXF1ZW5jZXMvdXRpbHNcIjtcbmltcG9ydCB7IFBhZ2luYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ291Y2hEQlBhZ2luYXRvciB9IGZyb20gXCIuL1BhZ2luYXRvclwiO1xuaW1wb3J0IHsgTWFuZ29RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgQ291Y2hEQlN0YXRlbWVudDxZPiBleHRlbmRzIFN0YXRlbWVudDxNYW5nb1F1ZXJ5PiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IEFkYXB0ZXI8WSwgTWFuZ29RdWVyeT4pIHtcbiAgICBzdXBlcihhZGFwdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZTxZPigpOiBQcm9taXNlPFk+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnk6IE1hbmdvUXVlcnkgPSB0aGlzLmJ1aWxkKCk7XG4gICAgICBpZiAoIXF1ZXJ5LmxpbWl0KSBxdWVyeS5saW1pdCA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgcmV0dXJuIHRoaXMucmF3KHF1ZXJ5KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHBhZ2luYXRlPFI+KHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPFIsIE1hbmdvUXVlcnk+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5OiBNYW5nb1F1ZXJ5ID0gdGhpcy5idWlsZCgpO1xuICAgICAgcmV0dXJuIG5ldyBDb3VjaERCUGFnaW5hdG9yKHRoaXMsIHNpemUsIHF1ZXJ5KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1JlY29yZChcbiAgICByOiBhbnksXG4gICAgcGtBdHRyOiBzdHJpbmcsXG4gICAgc2VxdWVuY2VUeXBlOiBcIk51bWJlclwiIHwgXCJCaWdJbnRcIiB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAoIXJbQ291Y2hEQktleXMuSURdKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyBDb3VjaERCIElkIGRlZmluaXRpb24gZm91bmQuIFNob3VsZCBub3QgYmUgcG9zc2libGVgXG4gICAgICApO1xuICAgIGNvbnN0IFssIC4uLmtleUFyZ3NdID0gcltDb3VjaERCS2V5cy5JRF0uc3BsaXQoXCJfXCIpO1xuXG4gICAgY29uc3QgaWQgPSBrZXlBcmdzLmpvaW4oXCJfXCIpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KFxuICAgICAgcixcbiAgICAgIHRoaXMudGFyZ2V0IGFzIENvbnN0cnVjdG9yPGFueT4sXG4gICAgICBwa0F0dHIsXG4gICAgICBwYXJzZVNlcXVlbmNlVmFsdWUoc2VxdWVuY2VUeXBlLCBpZClcbiAgICApIGFzIGFueTtcbiAgfVxuXG4gIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdzxSPihyYXdJbnB1dCwgdHJ1ZSwgLi4uYXJncyk7XG4gICAgaWYgKCF0aGlzLmZ1bGxSZWNvcmQpIHJldHVybiByZXN1bHRzO1xuICAgIGlmICghdGhpcy50YXJnZXQpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJObyB0YXJnZXQgZGVmaW5lZCBpbiBzdGF0ZW1lbnQuIHNob3VsZCBuZXZlciBoYXBwZW5cIlxuICAgICAgKTtcblxuICAgIGNvbnN0IHBrRGVmID0gZmluZFByaW1hcnlLZXkobmV3IHRoaXMudGFyZ2V0KCkgYXMgYW55KTtcbiAgICBjb25zdCBwa0F0dHIgPSBwa0RlZi5pZDtcbiAgICBjb25zdCB0eXBlID0gcGtEZWYucHJvcHMudHlwZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRzKSlcbiAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocikgPT4gdGhpcy5wcm9jZXNzUmVjb3JkKHIsIHBrQXR0ciwgdHlwZSkpIGFzIFI7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlY29yZChyZXN1bHRzLCBwa0F0dHIsIHR5cGUpIGFzIFI7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZyb21DbGF1c2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsQXJnLCBNb2RlbCwgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb3VjaERCS2V5cyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1hbmdvUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLy8gbm9pbnNwZWN0aW9uIEpTQW5ub3RhdG9yXG5leHBvcnQgY2xhc3MgQ291Y2hEQkZyb21DbGF1c2U8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEZyb21DbGF1c2U8XG4gIE1hbmdvUXVlcnksXG4gIE1cbj4ge1xuICBjb25zdHJ1Y3RvcihjbGF1c2U6IE1vZGVsQXJnPEZyb21DbGF1c2U8TWFuZ29RdWVyeSwgTT4+KSB7XG4gICAgc3VwZXIoY2xhdXNlKTtcbiAgfVxuXG4gIGJ1aWxkKHByZXZpb3VzOiBNYW5nb1F1ZXJ5KTogTWFuZ29RdWVyeSB7XG4gICAgY29uc3Qgc2VsZWN0b3JzOiBhbnkgPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9XG4gICAgICB0eXBlb2YgdGhpcy5zZWxlY3RvciA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IHRoaXMuc2VsZWN0b3JcbiAgICAgICAgOiBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuc2VsZWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pO1xuICAgIHByZXZpb3VzLnNlbGVjdG9yID0gc2VsZWN0b3JzO1xuICAgIHJldHVybiBwcmV2aW91cztcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5zZXJ0Q2xhdXNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbEFyZywgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8vIG5vaW5zcGVjdGlvbiBKU0Fubm90YXRvclxuZXhwb3J0IGNsYXNzIENvdWNoREJJbnNlcnRDbGF1c2U8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEluc2VydENsYXVzZTxcbiAgTWFuZ29RdWVyeSxcbiAgTVxuPiB7XG4gIGNvbnN0cnVjdG9yKGNsYXVzZTogTW9kZWxBcmc8SW5zZXJ0Q2xhdXNlPE1hbmdvUXVlcnksIE0+Pikge1xuICAgIHN1cGVyKGNsYXVzZSk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGJ1aWxkKHF1ZXJ5OiBNYW5nb1F1ZXJ5KTogTWFuZ29RdWVyeSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJOb3Qgc3VwcG9ydGVkXCIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb25kaXRpb24sIFdoZXJlQ2xhdXNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvdWNoREJHcm91cE9wZXJhdG9yIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvdWNoREJLZXlzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTWFuZ29PcGVyYXRvciwgTWFuZ29RdWVyeSwgTWFuZ29TZWxlY3RvciB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgQ291Y2hEQldoZXJlQ2xhdXNlIGV4dGVuZHMgV2hlcmVDbGF1c2U8TWFuZ29RdWVyeT4ge1xuICBjb25zdHJ1Y3RvcihjbGF1c2U6IE1vZGVsQXJnPFdoZXJlQ2xhdXNlPE1hbmdvUXVlcnk+Pikge1xuICAgIHN1cGVyKGNsYXVzZSk7XG4gIH1cblxuICBidWlsZChxdWVyeTogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgIGNvbnN0IGNvbmRpdGlvbjogTWFuZ29TZWxlY3RvciA9IHRoaXMuYWRhcHRlci5wYXJzZUNvbmRpdGlvbihcbiAgICAgIENvbmRpdGlvbi5hbmQoXG4gICAgICAgIHRoaXMuY29uZGl0aW9uIGFzIENvbmRpdGlvbixcbiAgICAgICAgQ29uZGl0aW9uLmF0dHJpYnV0ZShDb3VjaERCS2V5cy5UQUJMRSkuZXEoXG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3JbQ291Y2hEQktleXMuVEFCTEVdXG4gICAgICAgIClcbiAgICAgIClcbiAgICApLnNlbGVjdG9yO1xuXG4gICAgY29uc3Qgc2VsZWN0b3JLZXlzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uKSBhcyBNYW5nb09wZXJhdG9yW107XG4gICAgaWYgKFxuICAgICAgc2VsZWN0b3JLZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgT2JqZWN0LnZhbHVlcyhDb3VjaERCR3JvdXBPcGVyYXRvcikuaW5kZXhPZihzZWxlY3RvcktleXNbMF0pICE9PSAtMVxuICAgIClcbiAgICAgIHN3aXRjaCAoc2VsZWN0b3JLZXlzWzBdKSB7XG4gICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgIGNvbmRpdGlvbltDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdID0gW1xuICAgICAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gYXMgTWFuZ29TZWxlY3RvclxuICAgICAgICAgICAgKS5yZWR1Y2UoKGFjY3VtOiBNYW5nb1NlbGVjdG9yW10sIHZhbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJUb28gbWFueSBrZXlzIGluIHF1ZXJ5IHNlbGVjdG9yLiBzaG91bGQgYmUgb25lXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCBrID0ga2V5c1swXTtcbiAgICAgICAgICAgICAgaWYgKGsgPT09IENvdWNoREJHcm91cE9wZXJhdG9yLkFORClcbiAgICAgICAgICAgICAgICBhY2N1bS5wdXNoKC4uLih2YWxba10gYXMgYW55W10pKTtcbiAgICAgICAgICAgICAgZWxzZSBhY2N1bS5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgICAgIH0sIFtdKSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gY29uZGl0aW9uO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvdWNoREJHcm91cE9wZXJhdG9yLk9SOiB7XG4gICAgICAgICAgY29uc3QgczogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgIHNbQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHF1ZXJ5LnNlbGVjdG9yKS5tYXAoKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXTtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IHM7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlXCIpO1xuICAgICAgfVxuICAgIGVsc2Uge1xuICAgICAgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmIChxdWVyeS5zZWxlY3RvcltrZXldKVxuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIHNmKFxuICAgICAgICAgICAgICBcIkEgezB9IHF1ZXJ5IHBhcmFtIGlzIGFib3V0IHRvIGJlIG92ZXJyaWRkZW46IHsxfSBieSB7Mn1cIixcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICBxdWVyeS5zZWxlY3RvcltrZXldIGFzIHVua25vd24gYXMgc3RyaW5nLFxuICAgICAgICAgICAgICB2YWwgYXMgdW5rbm93biBhcyBzdHJpbmdcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICBxdWVyeS5zZWxlY3RvcltrZXldID0gdmFsO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb25zdCwgU2VsZWN0Q2xhdXNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbEFyZywgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBDb3VjaERCU2VsZWN0Q2xhdXNlPE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBTZWxlY3RDbGF1c2U8XG4gIE1hbmdvUXVlcnksXG4gIE1cbj4ge1xuICBjb25zdHJ1Y3RvcihjbGF1c2U6IE1vZGVsQXJnPFNlbGVjdENsYXVzZTxNYW5nb1F1ZXJ5LCBNPj4pIHtcbiAgICBzdXBlcihjbGF1c2UpO1xuICB9XG5cbiAgYnVpbGQocXVlcnk6IE1hbmdvUXVlcnkpOiBNYW5nb1F1ZXJ5IHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0b3IgfHwgdGhpcy5zZWxlY3RvciA9PT0gQ29uc3QuRlVMTF9SRUNPUkQpIHJldHVybiBxdWVyeTtcbiAgICBxdWVyeS5maWVsZHMgPVxuICAgICAgdHlwZW9mIHRoaXMuc2VsZWN0b3IgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBbdGhpcy5zZWxlY3RvciBhcyBzdHJpbmddXG4gICAgICAgIDogKHRoaXMuc2VsZWN0b3IgYXMgc3RyaW5nW10pO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsdWVzQ2xhdXNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbEFyZywgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBDb3VjaERCVmFsdWVzQ2xhdXNlPE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBWYWx1ZXNDbGF1c2U8XG4gIE1hbmdvUXVlcnksXG4gIE1cbj4ge1xuICBjb25zdHJ1Y3RvcihjbGF1c2U6IE1vZGVsQXJnPFZhbHVlc0NsYXVzZTxNYW5nb1F1ZXJ5LCBNPj4pIHtcbiAgICBzdXBlcihjbGF1c2UpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBidWlsZChwcmV2aW91czogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDbGF1c2VGYWN0b3J5LFxuICBDb25kaXRpb24sXG4gIEZyb21DbGF1c2UsXG4gIEZyb21TZWxlY3RvcixcbiAgR3JvdXBCeVNlbGVjdG9yLFxuICBMaW1pdFNlbGVjdG9yLFxuICBPZmZzZXRTZWxlY3RvcixcbiAgT3JkZXJCeVNlbGVjdG9yLFxuICBRdWVyeUVycm9yLFxuICBTZWxlY3RTZWxlY3RvcixcbiAgU3RhdGVtZW50LFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IExpbWl0Q2xhdXNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBTZWxlY3RDbGF1c2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFdoZXJlQ2xhdXNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBPZmZzZXRDbGF1c2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE9yZGVyQnlDbGF1c2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEdyb3VwQnlDbGF1c2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFZhbHVlc0NsYXVzZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSW5zZXJ0Q2xhdXNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBDb3VjaERCRnJvbUNsYXVzZSB9IGZyb20gXCIuL0Zyb21DbGF1c2VcIjtcbmltcG9ydCB7IE1vZGVsQXJnLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvdWNoREJJbnNlcnRDbGF1c2UgfSBmcm9tIFwiLi9JbnNlcnRDbGF1c2VcIjtcbmltcG9ydCB7IENvdWNoREJTdGF0ZW1lbnQgfSBmcm9tIFwiLi9TdGF0ZW1lbnRcIjtcbmltcG9ydCB7IENvdWNoREJXaGVyZUNsYXVzZSB9IGZyb20gXCIuL1doZXJlQ2xhdXNlXCI7XG5pbXBvcnQgeyBDb3VjaERCU2VsZWN0Q2xhdXNlIH0gZnJvbSBcIi4vU2VsZWN0Q2xhdXNlXCI7XG5pbXBvcnQgeyBDb3VjaERCVmFsdWVzQ2xhdXNlIH0gZnJvbSBcIi4vVmFsdWVzQ2xhdXNlXCI7XG5pbXBvcnQgeyBDb3VjaERCT3BlcmF0b3IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvdWNoREJBZGFwdGVyIH0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB7IE1hbmdvUXVlcnksIE1hbmdvU2VsZWN0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIEZhY3Rvcnk8Uz4gZXh0ZW5kcyBDbGF1c2VGYWN0b3J5PFMsIE1hbmdvUXVlcnk+IHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcjogQ291Y2hEQkFkYXB0ZXI8Uz4pIHtcbiAgICBzdXBlcihhZGFwdGVyKTtcbiAgfVxuXG4gIGZyb208TSBleHRlbmRzIE1vZGVsPihcbiAgICBzdGF0ZW1lbnQ6IFN0YXRlbWVudDxNYW5nb1F1ZXJ5PixcbiAgICBzZWxlY3RvcjogRnJvbVNlbGVjdG9yPE0+XG4gICk6IEZyb21DbGF1c2U8TWFuZ29RdWVyeSwgTT4ge1xuICAgIHJldHVybiBuZXcgQ291Y2hEQkZyb21DbGF1c2UoeyBzdGF0ZW1lbnQ6IHN0YXRlbWVudCwgc2VsZWN0b3I6IHNlbGVjdG9yIH0pO1xuICB9XG5cbiAgZ3JvdXBCeShcbiAgICBzdGF0ZW1lbnQ6IFN0YXRlbWVudDxNYW5nb1F1ZXJ5PixcbiAgICBzZWxlY3RvcjogR3JvdXBCeVNlbGVjdG9yXG4gICk6IEdyb3VwQnlDbGF1c2U8TWFuZ29RdWVyeT4ge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgR3JvdXBCeUNsYXVzZTxNYW5nb1F1ZXJ5PiB7XG4gICAgICBjb25zdHJ1Y3RvcihjbGF1c2U6IE1vZGVsQXJnPEdyb3VwQnlDbGF1c2U8TWFuZ29RdWVyeT4+KSB7XG4gICAgICAgIHN1cGVyKGNsYXVzZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGJ1aWxkKHF1ZXJ5OiBNYW5nb1F1ZXJ5KTogTWFuZ29RdWVyeSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIHN0YXRlbWVudDogc3RhdGVtZW50LFxuICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIH0pO1xuICB9XG5cbiAgaW5zZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oKTogSW5zZXJ0Q2xhdXNlPE1hbmdvUXVlcnksIE0+IHtcbiAgICByZXR1cm4gbmV3IENvdWNoREJJbnNlcnRDbGF1c2Uoe1xuICAgICAgc3RhdGVtZW50OiBuZXcgQ291Y2hEQlN0YXRlbWVudCh0aGlzLmFkYXB0ZXIpLFxuICAgIH0pO1xuICB9XG5cbiAgbGltaXQoXG4gICAgc3RhdGVtZW50OiBTdGF0ZW1lbnQ8TWFuZ29RdWVyeT4sXG4gICAgc2VsZWN0b3I6IExpbWl0U2VsZWN0b3JcbiAgKTogTGltaXRDbGF1c2U8TWFuZ29RdWVyeT4ge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgTGltaXRDbGF1c2U8TWFuZ29RdWVyeT4ge1xuICAgICAgY29uc3RydWN0b3IoY2xhdXNlOiBNb2RlbEFyZzxMaW1pdENsYXVzZTxNYW5nb1F1ZXJ5Pj4pIHtcbiAgICAgICAgc3VwZXIoY2xhdXNlKTtcbiAgICAgIH1cblxuICAgICAgYnVpbGQocXVlcnk6IE1hbmdvUXVlcnkpOiBNYW5nb1F1ZXJ5IHtcbiAgICAgICAgcXVlcnkubGltaXQgPSB0aGlzLnNlbGVjdG9yIGFzIG51bWJlcjtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIHN0YXRlbWVudDogc3RhdGVtZW50LFxuICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIH0pO1xuICB9XG5cbiAgb2Zmc2V0KFxuICAgIHN0YXRlbWVudDogU3RhdGVtZW50PE1hbmdvUXVlcnk+LFxuICAgIHNlbGVjdG9yOiBPZmZzZXRTZWxlY3RvclxuICApOiBPZmZzZXRDbGF1c2U8TWFuZ29RdWVyeT4ge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgT2Zmc2V0Q2xhdXNlPE1hbmdvUXVlcnk+IHtcbiAgICAgIGNvbnN0cnVjdG9yKGNsYXVzZTogTW9kZWxBcmc8T2Zmc2V0Q2xhdXNlPE1hbmdvUXVlcnk+Pikge1xuICAgICAgICBzdXBlcihjbGF1c2UpO1xuICAgICAgfVxuXG4gICAgICBidWlsZChxdWVyeTogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgICAgICBjb25zdCBza2lwOiBudW1iZXIgPSBwYXJzZUludCh0aGlzLnNlbGVjdG9yIGFzIHVua25vd24gYXMgc3RyaW5nKTtcbiAgICAgICAgaWYgKGlzTmFOKHNraXApKSB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkZhaWxlZCB0byBwYXJzZSBvZmZzZXRcIik7XG4gICAgICAgIHF1ZXJ5LnNraXAgPSBza2lwO1xuICAgICAgICByZXR1cm4gcXVlcnk7XG4gICAgICB9XG4gICAgfSkoe1xuICAgICAgc3RhdGVtZW50OiBzdGF0ZW1lbnQsXG4gICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgfSk7XG4gIH1cblxuICBvcmRlckJ5KFxuICAgIHN0YXRlbWVudDogU3RhdGVtZW50PE1hbmdvUXVlcnk+LFxuICAgIHNlbGVjdG9yOiBPcmRlckJ5U2VsZWN0b3JbXVxuICApOiBPcmRlckJ5Q2xhdXNlPE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IChjbGFzcyBleHRlbmRzIE9yZGVyQnlDbGF1c2U8TWFuZ29RdWVyeT4ge1xuICAgICAgY29uc3RydWN0b3IoY2xhdXNlOiBNb2RlbEFyZzxPcmRlckJ5Q2xhdXNlPE1hbmdvUXVlcnk+Pikge1xuICAgICAgICBzdXBlcihjbGF1c2UpO1xuICAgICAgfVxuXG4gICAgICBidWlsZChxdWVyeTogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgICAgICBxdWVyeS5zb3J0ID0gcXVlcnkuc29ydCB8fCBbXTtcbiAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBxdWVyeS5zZWxlY3RvciB8fCAoe30gYXMgTWFuZ29TZWxlY3Rvcik7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IhLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgICBjb25zdCBbc2VsZWN0b3IsIHZhbHVlXSA9IHM7XG4gICAgICAgICAgY29uc3QgcmVjOiBhbnkgPSB7fTtcbiAgICAgICAgICByZWNbc2VsZWN0b3JdID0gdmFsdWU7XG4gICAgICAgICAgKHF1ZXJ5LnNvcnQgYXMgYW55W10pLnB1c2gocmVjIGFzIGFueSk7XG4gICAgICAgICAgaWYgKCFxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0pIHtcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAgICAgICAocXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICAgICAgICBDb3VjaERCT3BlcmF0b3IuQklHR0VSXG4gICAgICAgICAgICBdID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcXVlcnkuZmllbGRzID0gcXVlcnkuZmllbGRzIHx8IFtdO1xuICAgICAgICAgIC8vIHF1ZXJ5LmZpZWxkcyA9IFsuLi5uZXcgU2V0KFsuLi5xdWVyeS5maWVsZHMsIHNlbGVjdG9yXSkua2V5cygpXVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIHN0YXRlbWVudDogc3RhdGVtZW50LFxuICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIH0pO1xuICB9XG5cbiAgc2VsZWN0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgc2VsZWN0b3I6IFNlbGVjdFNlbGVjdG9yIHwgdW5kZWZpbmVkXG4gICk6IFNlbGVjdENsYXVzZTxNYW5nb1F1ZXJ5LCBNPiB7XG4gICAgcmV0dXJuIG5ldyBDb3VjaERCU2VsZWN0Q2xhdXNlKHtcbiAgICAgIHN0YXRlbWVudDogbmV3IENvdWNoREJTdGF0ZW1lbnQodGhpcy5hZGFwdGVyKSxcbiAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICB9KTtcbiAgfVxuXG4gIHZhbHVlczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHN0YXRlbWVudDogU3RhdGVtZW50PE1hbmdvUXVlcnk+LFxuICAgIHZhbHVlczogTVtdXG4gICk6IFZhbHVlc0NsYXVzZTxNYW5nb1F1ZXJ5LCBNPiB7XG4gICAgcmV0dXJuIG5ldyBDb3VjaERCVmFsdWVzQ2xhdXNlPE0+KHtcbiAgICAgIHN0YXRlbWVudDogc3RhdGVtZW50LFxuICAgICAgdmFsdWVzOiB2YWx1ZXMsXG4gICAgfSk7XG4gIH1cblxuICB3aGVyZShcbiAgICBzdGF0ZW1lbnQ6IFN0YXRlbWVudDxNYW5nb1F1ZXJ5PixcbiAgICBjb25kaXRpb246IENvbmRpdGlvblxuICApOiBXaGVyZUNsYXVzZTxNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBDb3VjaERCV2hlcmVDbGF1c2Uoe1xuICAgICAgc3RhdGVtZW50OiBzdGF0ZW1lbnQsXG4gICAgICBjb25kaXRpb246IGNvbmRpdGlvbixcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgR3JvdXBPcGVyYXRvciwgT3BlcmF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvdWNoREJHcm91cE9wZXJhdG9yLCBDb3VjaERCT3BlcmF0b3IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1hbmdvT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZU9wZXJhdG9ycyhcbiAgb3BlcmF0b3I6IEdyb3VwT3BlcmF0b3IgfCBPcGVyYXRvclxuKTogTWFuZ29PcGVyYXRvciB7XG4gIGZvciAoY29uc3Qgb3BlcmF0b3JzIG9mIFtDb3VjaERCT3BlcmF0b3IsIENvdWNoREJHcm91cE9wZXJhdG9yXSkge1xuICAgIGNvbnN0IGVsID0gT2JqZWN0LmtleXMob3BlcmF0b3JzKS5maW5kKChrKSA9PiBrID09PSBvcGVyYXRvcik7XG4gICAgaWYgKGVsKSByZXR1cm4gb3BlcmF0b3JzW2VsXTtcbiAgfVxuICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICBgQ291bGQgbm90IGZpbmQgYWRhcHRlciB0cmFuc2xhdGlvbiBmb3Igb3BlcmF0b3IgJHtvcGVyYXRvcn1gXG4gICk7XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIEluZGV4RXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoSW5kZXhFcnJvci5uYW1lLCBtc2cpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBTZXF1ZW5jZSxcbiAgU2VxdWVuY2VPcHRpb25zLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIE9wZXJhdG9yLFxuICBHcm91cE9wZXJhdG9yLFxuICBTdGF0ZW1lbnQsXG4gIFF1ZXJ5LFxuICBDbGF1c2VGYWN0b3J5LFxuICBDb25kaXRpb24sXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgVXNlcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBDb3VjaERCS2V5cywgcmVzZXJ2ZWRBdHRyaWJ1dGVzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIHByZWZpeE1ldGhvZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQgeyBDb3VjaERCU3RhdGVtZW50IH0gZnJvbSBcIi4vcXVlcnkvU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBGYWN0b3J5IH0gZnJvbSBcIi4vcXVlcnlcIjtcbmltcG9ydCB7IHRyYW5zbGF0ZU9wZXJhdG9ycyB9IGZyb20gXCIuL3F1ZXJ5L3RyYW5zbGF0ZVwiO1xuaW1wb3J0IHsgQ291Y2hEQlNlcXVlbmNlIH0gZnJvbSBcIi4vc2VxdWVuY2VzL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJbmRleEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBNYW5nb09wZXJhdG9yLCBNYW5nb1F1ZXJ5LCBNYW5nb1NlbGVjdG9yIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvdWNoREJBZGFwdGVyPFM+IGV4dGVuZHMgQWRhcHRlcjxTLCBNYW5nb1F1ZXJ5PiB7XG4gIHByb3RlY3RlZCBmYWN0b3J5PzogRmFjdG9yeTxTPjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3Ioc2NvcGU6IFMsIGZsYXZvdXI6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBmbGF2b3VyKTtcbiAgICBbdGhpcy5jcmVhdGUsIHRoaXMuY3JlYXRlQWxsLCB0aGlzLnVwZGF0ZSwgdGhpcy51cGRhdGVBbGxdLmZvckVhY2goKG0pID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBtLm5hbWU7XG4gICAgICBwcmVmaXhNZXRob2QodGhpcywgbSwgKHRoaXMgYXMgYW55KVtuYW1lICsgXCJQcmVmaXhcIl0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IENsYXVzZXMoKTogQ2xhdXNlRmFjdG9yeTxTLCBNYW5nb1F1ZXJ5PiB7XG4gICAgaWYgKCF0aGlzLmZhY3RvcnkpIHRoaXMuZmFjdG9yeSA9IG5ldyBGYWN0b3J5KHRoaXMpO1xuICAgIHJldHVybiB0aGlzLmZhY3Rvcnk7XG4gIH1cblxuICBRdWVyeTxNIGV4dGVuZHMgTW9kZWw+KCk6IFF1ZXJ5PE1hbmdvUXVlcnksIE0+IHtcbiAgICByZXR1cm4gc3VwZXIuUXVlcnkoKTtcbiAgfVxuXG4gIGdldCBTdGF0ZW1lbnQoKTogU3RhdGVtZW50PE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IENvdWNoREJTdGF0ZW1lbnQodGhpcyk7XG4gIH1cblxuICBwYXJzZUNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbik6IE1hbmdvUXVlcnkge1xuICAgIGZ1bmN0aW9uIG1lcmdlKFxuICAgICAgb3A6IE1hbmdvT3BlcmF0b3IsXG4gICAgICBvYmoxOiBNYW5nb1NlbGVjdG9yLFxuICAgICAgb2JqMjogTWFuZ29TZWxlY3RvclxuICAgICk6IE1hbmdvUXVlcnkge1xuICAgICAgY29uc3QgcmVzdWx0OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjoge30gYXMgTWFuZ29TZWxlY3RvciB9O1xuICAgICAgcmVzdWx0LnNlbGVjdG9yW29wXSA9IFtvYmoxLCBvYmoyXTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb24gfSA9IGNvbmRpdGlvbiBhcyB1bmtub3duIGFzIHtcbiAgICAgIGF0dHIxOiBzdHJpbmcgfCBDb25kaXRpb247XG4gICAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yO1xuICAgICAgY29tcGFyaXNvbjogYW55O1xuICAgIH07XG5cbiAgICBsZXQgb3A6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgIGlmIChcbiAgICAgIFtHcm91cE9wZXJhdG9yLkFORCwgR3JvdXBPcGVyYXRvci5PUiwgT3BlcmF0b3IuTk9UXS5pbmRleE9mKFxuICAgICAgICBvcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yXG4gICAgICApID09PSAtMVxuICAgICkge1xuICAgICAgb3BbYXR0cjEgYXMgc3RyaW5nXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BbYXR0cjEgYXMgc3RyaW5nXSBhcyBNYW5nb1NlbGVjdG9yKVt0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpXSA9XG4gICAgICAgIGNvbXBhcmlzb247XG4gICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuTk9UKSB7XG4gICAgICBvcCA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uKS5zZWxlY3RvciBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BbdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLk5PVCldID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIChhdHRyMSBhcyB1bmtub3duIGFzIHsgYXR0cjE6IHN0cmluZyB9KS5hdHRyMVxuICAgICAgXSA9IGNvbXBhcmlzb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wMTogYW55ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb24pLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgb3AyOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGNvbXBhcmlzb24gYXMgQ29uZGl0aW9uKS5zZWxlY3RvcjtcbiAgICAgIG9wID0gbWVyZ2UodHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKSwgb3AxLCBvcDIpLnNlbGVjdG9yO1xuICAgIH1cblxuICAgIHJldHVybiB7IHNlbGVjdG9yOiBvcCB9O1xuICB9XG5cbiAgYXN5bmMgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBuZXcgQ291Y2hEQlNlcXVlbmNlKG9wdGlvbnMsIHRoaXMpO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtYW5hZ2VkTW9kZWxzID0gQWRhcHRlci5tb2RlbHModGhpcy5mbGF2b3VyKTtcbiAgICByZXR1cm4gdGhpcy5pbmRleCguLi5tYW5hZ2VkTW9kZWxzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBpbmRleDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIC4uLm1vZGVsczogQ29uc3RydWN0b3I8TT5bXVxuICApOiBQcm9taXNlPHZvaWQ+O1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCB1c2VyKCk6IFByb21pc2U8VXNlcj47XG5cbiAgYWJzdHJhY3QgcmF3PFY+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5LCBwcm9jZXNzOiBib29sZWFuKTogUHJvbWlzZTxWPjtcblxuICBwcm90ZWN0ZWQgYXNzaWduTWV0YWRhdGEoXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcmV2OiBzdHJpbmdcbiAgKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiByZXYsXG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzc2lnbk11bHRpcGxlTWV0YWRhdGEoXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgcmV2czogc3RyaW5nW11cbiAgKTogUmVjb3JkPHN0cmluZywgYW55PltdIHtcbiAgICBtb2RlbHMuZm9yRWFjaCgobSwgaSkgPT4ge1xuICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtIGFzIGFueSwgcmV2c1tpXSk7XG4gICAgICByZXR1cm4gbTtcbiAgICB9KTtcbiAgICByZXR1cm4gbW9kZWxzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByZWZpeChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICkge1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLklEXSA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuICAgIHJldHVybiBbdGFibGVOYW1lLCBpZCwgcmVjb3JkXTtcbiAgfVxuXG4gIGFic3RyYWN0IGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUFsbFByZWZpeChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKSB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG5cbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoaWQsIGNvdW50KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuSURdID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsc1tjb3VudF0pO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW3RhYmxlTmFtZSwgaWRzLCByZWNvcmRzXTtcbiAgfVxuXG4gIGFic3RyYWN0IGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+O1xuXG4gIGFic3RyYWN0IHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIGFic3RyYWN0IHJlYWRBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPjtcblxuICB1cGRhdGVQcmVmaXgoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApIHtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5JRF0gPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgY29uc3QgcmV2ID0gbW9kZWxbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXTtcbiAgICBpZiAoIXJldilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcmV2aXNpb24gbnVtYmVyIGZvdW5kIGZvciByZWNvcmQgd2l0aCBpZCAke2lkfWBcbiAgICAgICk7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuUkVWXSA9IHJldjtcbiAgICByZXR1cm4gW3RhYmxlTmFtZSwgaWQsIHJlY29yZF07XG4gIH1cblxuICBhYnN0cmFjdCB1cGRhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIHByb3RlY3RlZCB1cGRhdGVBbGxQcmVmaXgoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdXG4gICkge1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuXG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKGlkLCBjb3VudCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLklEXSA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICAgIGNvbnN0IHJldiA9IG1vZGVsc1tjb3VudF1bUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXTtcbiAgICAgIGlmICghcmV2KVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTm8gcmV2aXNpb24gbnVtYmVyIGZvdW5kIGZvciByZWNvcmQgd2l0aCBpZCAke2lkfWBcbiAgICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbHNbY291bnRdKTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5SRVZdID0gcmV2O1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW3RhYmxlTmFtZSwgaWRzLCByZWNvcmRzXTtcbiAgfVxuXG4gIGFic3RyYWN0IHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+O1xuXG4gIGFic3RyYWN0IGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgYWJzdHJhY3QgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT47XG5cbiAgcHJvdGVjdGVkIGdlbmVyYXRlSWQodGFibGVOYW1lOiBzdHJpbmcsIGlkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gW3RhYmxlTmFtZSwgaWRdLmpvaW4oQ291Y2hEQktleXMuU0VQQVJBVE9SKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgcmV0dXJuIENvdWNoREJBZGFwdGVyLnBhcnNlRXJyb3IoZXJyLCByZWFzb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzUmVzZXJ2ZWQoYXR0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhYXR0ci5tYXRjaChyZXNlcnZlZEF0dHJpYnV0ZXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBhbnk7XG4gICAgbGV0IGNvZGU6IHN0cmluZyA9IFwiXCI7XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvZGUgPSBlcnI7XG4gICAgICBpZiAoY29kZS5tYXRjaCgvYWxyZWFkeSBleGlzdHx1cGRhdGUgY29uZmxpY3QvZykpXG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihjb2RlKTtcbiAgICAgIGlmIChjb2RlLm1hdGNoKC9taXNzaW5nfGRlbGV0ZWQvZykpIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKTtcbiAgICB9IGVsc2UgaWYgKChlcnIgYXMgYW55KS5jb2RlKSB7XG4gICAgICBjb2RlID0gKGVyciBhcyBhbnkpLmNvZGU7XG4gICAgICByZWFzb24gPSByZWFzb24gfHwgZXJyLm1lc3NhZ2U7XG4gICAgfSBlbHNlIGlmICgoZXJyIGFzIGFueSkuc3RhdHVzQ29kZSkge1xuICAgICAgY29kZSA9IChlcnIgYXMgYW55KS5zdGF0dXNDb2RlO1xuICAgICAgcmVhc29uID0gcmVhc29uIHx8IGVyci5tZXNzYWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlID0gZXJyLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2RlLnRvU3RyaW5nKCkpIHtcbiAgICAgIGNhc2UgXCI0MDFcIjpcbiAgICAgIGNhc2UgXCI0MTJcIjpcbiAgICAgIGNhc2UgXCI0MDlcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuICAgICAgY2FzZSBcIjQwNFwiOlxuICAgICAgICByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uIGFzIHN0cmluZyk7XG4gICAgICBjYXNlIFwiNDAwXCI6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL05vXFxzaW5kZXhcXHNleGlzdHMvZykpXG4gICAgICAgICAgcmV0dXJuIG5ldyBJbmRleEVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGNvZGUudG9TdHJpbmcoKS5tYXRjaCgvRUNPTk5SRUZVU0VEL2cpKVxuICAgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgT3JkZXJEaXJlY3Rpb24sIFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERlZmF1bHRTZXBhcmF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvdWNoREJPcGVyYXRvciB9IGZyb20gXCIuL3F1ZXJ5L2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ3JlYXRlSW5kZXhSZXF1ZXN0LCBNYW5nb1NlbGVjdG9yLCBTb3J0T3JkZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVBdXRoKGNvbjogYW55LCB1c2VyOiBzdHJpbmcsIHBhc3M6IHN0cmluZykge1xuICByZXR1cm4gY29uLmF1dGgodXNlciwgcGFzcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwRG9jdW1lbnRTY29wZShcbiAgY29uOiBhbnksXG4gIGRiTmFtZTogc3RyaW5nLFxuICB1c2VyOiBzdHJpbmcsXG4gIHBhc3M6IHN0cmluZ1xuKTogYW55IHtcbiAgY29uc3QgZGIgPSBjb24udXNlKGRiTmFtZSk7XG4gIFtcImluc2VydFwiLCBcImdldFwiLCBcInB1dFwiLCBcImRlc3Ryb3lcIiwgXCJmaW5kXCJdLmZvckVhY2goKGspID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IChkYiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrXTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGIsIGssIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGFzeW5jICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICBhd2FpdCByZUF1dGgoY29uLCB1c2VyLCBwYXNzKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmNhbGwoZGIsIC4uLmFyZ3MpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYiwgQ291Y2hEQktleXMuTkFUSVZFLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IGNvbixcbiAgfSk7XG4gIHJldHVybiBkYjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3RSZXNlcnZlZEF0dHJpYnV0ZXMoYXR0cjogc3RyaW5nKSB7XG4gIGNvbnN0IHJlZ2V4cCA9IC9eXy4qJC9nO1xuICByZXR1cm4gYXR0ci5tYXRjaChyZWdleHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleE5hbWUoXG4gIGF0dHJpYnV0ZTogc3RyaW5nLFxuICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgY29tcG9zaXRpb25zPzogc3RyaW5nW10sXG4gIG9yZGVyPzogT3JkZXJEaXJlY3Rpb24sXG4gIHNlcGFyYXRvciA9IERlZmF1bHRTZXBhcmF0b3Jcbik6IHN0cmluZyB7XG4gIGNvbnN0IGF0dHIgPSBbUGVyc2lzdGVuY2VLZXlzLklOREVYLCB0YWJsZU5hbWUsIGF0dHJpYnV0ZV07XG4gIGlmIChjb21wb3NpdGlvbnMpIGF0dHIucHVzaCguLi5jb21wb3NpdGlvbnMpO1xuICBpZiAob3JkZXIpIGF0dHIucHVzaChvcmRlcik7XG4gIHJldHVybiBhdHRyLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSW5kZXhEb2MoXG4gIGF0dHJpYnV0ZTogc3RyaW5nLFxuICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgY29tcG9zaXRpb25zPzogc3RyaW5nW10sXG4gIG9yZGVyPzogT3JkZXJEaXJlY3Rpb24sXG4gIHNlcGFyYXRvciA9IERlZmF1bHRTZXBhcmF0b3Jcbik6IENyZWF0ZUluZGV4UmVxdWVzdCB7XG4gIGNvbnN0IHBhcnRpYWxGaWx0ZXJTZWxlY3RvcjogTWFuZ29TZWxlY3RvciA9IHt9O1xuICBwYXJ0aWFsRmlsdGVyU2VsZWN0b3JbQ291Y2hEQktleXMuVEFCTEVdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgKHBhcnRpYWxGaWx0ZXJTZWxlY3RvcltDb3VjaERCS2V5cy5UQUJMRV0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgQ291Y2hEQk9wZXJhdG9yLkVRVUFMXG4gIF0gPSB0YWJsZU5hbWU7XG4gIGxldCBmaWVsZHM6IFNvcnRPcmRlcltdO1xuICBpZiAob3JkZXIpIHtcbiAgICBjb25zdCBvcmRlclByb3A6IFNvcnRPcmRlciA9IHt9O1xuICAgIG9yZGVyUHJvcFthdHRyaWJ1dGVdID0gb3JkZXIgYXMgXCJhc2NcIiB8IFwiZGVzY1wiO1xuICAgIGNvbnN0IHNvcnRlZENvbXBvc2l0aW9uczogU29ydE9yZGVyW10gPSAoY29tcG9zaXRpb25zIHx8IFtdKS5tYXAoKGMpID0+IHtcbiAgICAgIGNvbnN0IHI6IFNvcnRPcmRlciA9IHt9O1xuICAgICAgcltjXSA9IG9yZGVyIGFzIFwiYXNjXCIgfCBcImRlc2NcIjtcbiAgICAgIHJldHVybiByO1xuICAgIH0pO1xuICAgIGNvbnN0IHNvcnRlZFRhYmxlOiBTb3J0T3JkZXIgPSB7fTtcbiAgICBzb3J0ZWRUYWJsZVtDb3VjaERCS2V5cy5UQUJMRV0gPSBvcmRlciBhcyBcImFzY1wiIHwgXCJkZXNjXCI7XG4gICAgZmllbGRzID0gW29yZGVyUHJvcCwgLi4uc29ydGVkQ29tcG9zaXRpb25zLCBzb3J0ZWRUYWJsZV07XG4gIH0gZWxzZSB7XG4gICAgZmllbGRzID0gW2F0dHJpYnV0ZSwgLi4uKGNvbXBvc2l0aW9ucyB8fCBbXSksIENvdWNoREJLZXlzLlRBQkxFXTtcbiAgfVxuICBjb25zdCBuYW1lID0gZ2VuZXJhdGVJbmRleE5hbWUoXG4gICAgYXR0cmlidXRlLFxuICAgIHRhYmxlTmFtZSxcbiAgICBjb21wb3NpdGlvbnMsXG4gICAgb3JkZXIsXG4gICAgc2VwYXJhdG9yXG4gICk7XG4gIHJldHVybiB7XG4gICAgaW5kZXg6IHtcbiAgICAgIGZpZWxkczogZmllbGRzLFxuICAgICAgLy8gcGFydGlhbF9maWx0ZXJfc2VsZWN0b3I6IHBhcnRpYWxGaWx0ZXJTZWxlY3RvcixcbiAgICB9LFxuICAgIGRkb2M6IFtuYW1lLCBDb3VjaERCS2V5cy5ERE9DXS5qb2luKHNlcGFyYXRvciksXG4gICAgbmFtZTogbmFtZSxcbiAgfTtcbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL2luZGV4ZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2FkYXB0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNb2R1bGUgc3VtbWFyeVxuICogQGRlc2NyaXB0aW9uIE1vZHVsZSBkZXNjcmlwdGlvblxuICogQG1vZHVsZSB0cy13b3Jrc3BhY2VcbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IE5hbWVzcGFjZSBzdW1tYXJ5XG4gKiBAZGVzY3JpcHRpb24gTmFtZXNwYWNlIGRlc2NyaXB0aW9uXG4gKiBAbmFtZXNwYWNlIE5hbWVzcGFjZVxuICogQG1lbWJlck9mIG1vZHVsZTp0cy13b3Jrc3BhY2VcbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IHN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb25cbiAqIEBkZXNjcmlwdGlvbiB0aGlzIGlzIGhvdyB5b3Ugc2hvdWxkIGRvY3VtZW50IGEgY29uc3RhbnRcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnRzLXdvcmtzcGFjZVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJnZW5lcmF0ZUluZGV4TmFtZSIsIkRlZmF1bHRTZXBhcmF0b3IiLCJSZXBvc2l0b3J5IiwiUGVyc2lzdGVuY2VLZXlzIiwiU2VxdWVuY2UiLCJCYXNlTW9kZWwiLCJwayIsInJlcXVpcmVkIiwiaW5kZXgiLCJ0YWJsZSIsIm1vZGVsIiwiSW50ZXJuYWxFcnJvciIsIlNlcSIsIk5vdEZvdW5kRXJyb3IiLCJzZiIsIlBhZ2luYXRvciIsIlBhZ2luZ0Vycm9yIiwiZmluZFByaW1hcnlLZXkiLCJTdGF0ZW1lbnQiLCJGcm9tQ2xhdXNlIiwiSW5zZXJ0Q2xhdXNlIiwiV2hlcmVDbGF1c2UiLCJDb25kaXRpb24iLCJTZWxlY3RDbGF1c2UiLCJDb25zdCIsIlZhbHVlc0NsYXVzZSIsIkNsYXVzZUZhY3RvcnkiLCJHcm91cEJ5Q2xhdXNlIiwiTGltaXRDbGF1c2UiLCJPZmZzZXRDbGF1c2UiLCJRdWVyeUVycm9yIiwiT3JkZXJCeUNsYXVzZSIsIkJhc2VFcnJvciIsIkFkYXB0ZXIiLCJwcmVmaXhNZXRob2QiLCJHcm91cE9wZXJhdG9yIiwiT3BlcmF0b3IiLCJDb25mbGljdEVycm9yIiwiQ29ubmVjdGlvbkVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBTyxVQUFNLGtCQUFrQixHQUFHO0FBRXJCLFVBQUEsV0FBVyxHQUFHO0lBQ3pCLElBQUEsU0FBUyxFQUFFLEdBQUc7SUFDZCxJQUFBLEVBQUUsRUFBRSxLQUFLO0lBQ1QsSUFBQSxHQUFHLEVBQUUsTUFBTTtJQUNYLElBQUEsT0FBTyxFQUFFLFVBQVU7SUFDbkIsSUFBQSxLQUFLLEVBQUUsU0FBUztJQUNoQixJQUFBLFFBQVEsRUFBRSxZQUFZO0lBQ3RCLElBQUEsSUFBSSxFQUFFLE1BQU07SUFDWixJQUFBLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLElBQUEsS0FBSyxFQUFFLE9BQU87OztJQ1RULE1BQU0sZUFBZSxHQUFrQztJQUM1RCxJQUFBLEtBQUssRUFBRSxLQUFLO0lBQ1osSUFBQSxTQUFT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
842
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWNvdWNoZGIuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3F1ZXJ5L2NvbnN0YW50cy50cyIsIi4uL3NyYy9pbmRleGVzL2dlbmVyYXRvci50cyIsIi4uL3NyYy9tb2RlbC9Db3VjaERCU2VxdWVuY2UudHMiLCIuLi9zcmMvc2VxdWVuY2VzL3V0aWxzLnRzIiwiLi4vc3JjL3NlcXVlbmNlcy9TZXF1ZW5jZS50cyIsIi4uL3NyYy9xdWVyeS9QYWdpbmF0b3IudHMiLCIuLi9zcmMvcXVlcnkvU3RhdGVtZW50LnRzIiwiLi4vc3JjL3F1ZXJ5L0Zyb21DbGF1c2UudHMiLCIuLi9zcmMvcXVlcnkvSW5zZXJ0Q2xhdXNlLnRzIiwiLi4vc3JjL3F1ZXJ5L1doZXJlQ2xhdXNlLnRzIiwiLi4vc3JjL3F1ZXJ5L1NlbGVjdENsYXVzZS50cyIsIi4uL3NyYy9xdWVyeS9WYWx1ZXNDbGF1c2UudHMiLCIuLi9zcmMvcXVlcnkvZmFjdG9yeS50cyIsIi4uL3NyYy9xdWVyeS90cmFuc2xhdGUudHMiLCIuLi9zcmMvZXJyb3JzLnRzIiwiLi4vc3JjL2FkYXB0ZXIudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHJlc2VydmVkQXR0cmlidXRlcyA9IC9eXy4qJC9nO1xuXG5leHBvcnQgY29uc3QgQ291Y2hEQktleXMgPSB7XG4gIFNFUEFSQVRPUjogXCJfXCIsXG4gIElEOiBcIl9pZFwiLFxuICBSRVY6IFwiX3JldlwiLFxuICBERUxFVEVEOiBcIl9kZWxldGVkXCIsXG4gIFRBQkxFOiBcIj8/dGFibGVcIixcbiAgU0VRVUVOQ0U6IFwiPz9zZXF1ZW5jZVwiLFxuICBERE9DOiBcImRkb2NcIixcbiAgTkFUSVZFOiBcIl9fbmF0aXZlXCIsXG4gIElOREVYOiBcImluZGV4XCIsXG59O1xuIiwiaW1wb3J0IHsgTWFuZ29PcGVyYXRvciB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgQ291Y2hEQk9wZXJhdG9yOiBSZWNvcmQ8c3RyaW5nLCBNYW5nb09wZXJhdG9yPiA9IHtcbiAgRVFVQUw6IFwiJGVxXCIsXG4gIERJRkZFUkVOVDogXCIkbmVcIixcbiAgQklHR0VSOiBcIiRndFwiLFxuICBCSUdHRVJfRVE6IFwiJGd0ZVwiLFxuICBTTUFMTEVSOiBcIiRsdFwiLFxuICBTTUFMTEVSX0VROiBcIiRsdGVcIixcbiAgLy8gQkVUV0VFTiA9IFwiQkVUV0VFTlwiLFxuICBOT1Q6IFwiJG5vdFwiLFxuICBJTjogXCIkaW5cIixcbiAgLy8gSVMgPSBcIklTXCIsXG4gIFJFR0VYUDogXCIkcmVnZXhcIixcbn07XG5cbmV4cG9ydCBjb25zdCBDb3VjaERCR3JvdXBPcGVyYXRvcjogUmVjb3JkPHN0cmluZywgTWFuZ29PcGVyYXRvcj4gPSB7XG4gIEFORDogXCIkYW5kXCIsXG4gIE9SOiBcIiRvclwiLFxufTtcblxuZXhwb3J0IGNvbnN0IENvdWNoREJDb25zdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgTlVMTDogXCJudWxsXCIsXG59O1xuIiwiaW1wb3J0IHtcbiAgSW5kZXhNZXRhZGF0YSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUmVwb3NpdG9yeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBDb3VjaERCS2V5cyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERlZmF1bHRTZXBhcmF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvdWNoREJPcGVyYXRvciB9IGZyb20gXCIuLi9xdWVyeS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENyZWF0ZUluZGV4UmVxdWVzdCB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5mdW5jdGlvbiBnZW5lcmF0ZUluZGV4TmFtZShcbiAgbmFtZTogc3RyaW5nW10sXG4gIGRpcmVjdGlvbj86IE9yZGVyRGlyZWN0aW9uLFxuICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSxcbiAgc2VwYXJhdG9yID0gRGVmYXVsdFNlcGFyYXRvclxuKSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmFtZS5tYXAoKG4pID0+IChuID09PSBDb3VjaERCS2V5cy5UQUJMRSA/IFwidGFibGVcIiA6IG4pKSxcbiAgICAuLi4oY29tcG9zaXRpb25zIHx8IFtdKSxcbiAgICAuLi4oZGlyZWN0aW9uID8gW2RpcmVjdGlvbl0gOiBbXSksXG4gICAgQ291Y2hEQktleXMuSU5ERVgsXG4gIF0uam9pbihzZXBhcmF0b3IpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleGVzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsczogQ29uc3RydWN0b3I8TT5bXVxuKTogQ3JlYXRlSW5kZXhSZXF1ZXN0W10ge1xuICBjb25zdCB0YWJsZU5hbWUgPSBnZW5lcmF0ZUluZGV4TmFtZShbQ291Y2hEQktleXMuVEFCTEVdKTtcbiAgY29uc3QgaW5kZXhlczogUmVjb3JkPHN0cmluZywgQ3JlYXRlSW5kZXhSZXF1ZXN0PiA9IHt9O1xuICBpbmRleGVzW3RhYmxlTmFtZV0gPSB7XG4gICAgaW5kZXg6IHtcbiAgICAgIGZpZWxkczogW0NvdWNoREJLZXlzLlRBQkxFXSxcbiAgICB9LFxuICAgIG5hbWU6IHRhYmxlTmFtZSxcbiAgICBkZG9jOiB0YWJsZU5hbWUsXG4gICAgdHlwZTogXCJqc29uXCIsXG4gIH07XG5cbiAgbW9kZWxzLmZvckVhY2goKG0pID0+IHtcbiAgICBjb25zdCBpbmQ6IFJlY29yZDxzdHJpbmcsIEluZGV4TWV0YWRhdGE+ID0gUmVwb3NpdG9yeS5pbmRleGVzKG0pO1xuICAgIE9iamVjdC5lbnRyaWVzKGluZCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBjb25zdCBrID0gT2JqZWN0LmtleXModmFsdWUpWzBdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgbGV0IHsgZGlyZWN0aW9ucywgY29tcG9zaXRpb25zIH0gPSAodmFsdWUgYXMgYW55KVtrXTtcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUobSk7XG4gICAgICBjb21wb3NpdGlvbnMgPSBjb21wb3NpdGlvbnMgfHwgW107XG5cbiAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlKHNvcnQ/OiBPcmRlckRpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBuYW1lID0gW1xuICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgLi4uKGNvbXBvc2l0aW9ucyBhcyBbXSksXG4gICAgICAgICAgUGVyc2lzdGVuY2VLZXlzLklOREVYLFxuICAgICAgICBdLmpvaW4oRGVmYXVsdFNlcGFyYXRvcik7XG5cbiAgICAgICAgaW5kZXhlc1tuYW1lXSA9IHtcbiAgICAgICAgICBpbmRleDoge1xuICAgICAgICAgICAgZmllbGRzOiBba2V5LCAuLi4oY29tcG9zaXRpb25zIGFzIFtdKSwgQ291Y2hEQktleXMuVEFCTEVdLnJlZHVjZShcbiAgICAgICAgICAgICAgKGFjY3VtOiBhbnlbXSwgZWwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc29ydCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgIHJlc1tlbF0gPSBzb3J0O1xuICAgICAgICAgICAgICAgICAgYWNjdW0ucHVzaChyZXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBhY2N1bS5wdXNoKGVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgZGRvYzogbmFtZSxcbiAgICAgICAgICB0eXBlOiBcImpzb25cIixcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFzb3J0KSB7XG4gICAgICAgICAgY29uc3QgdGFibGVGaWx0ZXI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgICAgICB0YWJsZUZpbHRlcltDb3VjaERCS2V5cy5UQUJMRV0gPSB7fTtcbiAgICAgICAgICB0YWJsZUZpbHRlcltDb3VjaERCS2V5cy5UQUJMRV1bQ291Y2hEQk9wZXJhdG9yLkVRVUFMXSA9IHRhYmxlTmFtZTtcbiAgICAgICAgICBpbmRleGVzW25hbWVdLmluZGV4LnBhcnRpYWxfZmlsdGVyX3NlbGVjdG9yID0gdGFibGVGaWx0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZ2VuZXJhdGUoKTtcbiAgICAgIGlmIChkaXJlY3Rpb25zKVxuICAgICAgICAoZGlyZWN0aW9ucyBhcyB1bmtub3duIGFzIE9yZGVyRGlyZWN0aW9uW10pLmZvckVhY2goKGQpID0+IGdlbmVyYXRlKGQpKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGluZGV4ZXMpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEJhc2VNb2RlbCwgcGssIGluZGV4LCB0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbkB0YWJsZShDb3VjaERCS2V5cy5TRVFVRU5DRSlcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgU2VxdWVuY2UgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAvKipcbiAgICogQHN1bW1hcnkgdGhlIFByaW1hcnkga2V5IGZvciB0aGUgREJTZXF1ZW5jZVxuICAgKiBAcHJvcCBuYW1lXG4gICAqXG4gICAqIEBzZWUgcGtcbiAgICovXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuICAvKipcbiAgICogQHN1bW1hcnkgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBEQlNlcXVlbmNlXG4gICAqIEBwcm9wIGN1cnJlbnRcbiAgICpcbiAgICogQHNlZSByZXF1aXJlZFxuICAgKiBAc2VlIGluZGV4XG4gICAqL1xuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBjdXJyZW50ITogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHNlcT86IE1vZGVsQXJnPFNlcXVlbmNlPikge1xuICAgIHN1cGVyKHNlcSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VxdWVuY2VWYWx1ZShcbiAgdHlwZTogXCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCB1bmRlZmluZWQsXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbik6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJOdW1iZXJcIjpcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBwYXJzZUludCh2YWx1ZSlcbiAgICAgICAgOiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgOiBCaWdJbnQodmFsdWUpO1xuICAgIGNhc2UgXCJCaWdJbnRcIjpcbiAgICAgIHJldHVybiBCaWdJbnQodmFsdWUpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIlNob3VsZCBuZXZlciBoYXBwZW5cIik7XG4gIH1cbn1cbiIsImltcG9ydCB7IHNmIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2UgYXMgU2VxIH0gZnJvbSBcIi4uL21vZGVsL0NvdWNoREJTZXF1ZW5jZVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgTm90Rm91bmRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQWRhcHRlciwgUmVwb3NpdG9yeSwgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgcGFyc2VTZXF1ZW5jZVZhbHVlIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IE1hbmdvUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IENvdWNoREJSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIFNlcXVlbmNlXG4gKiBAZGVzY3JpcHRpb24gcHJvdmlkZXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgZm9yIHtAbGluayBTZXF1ZW5jZX1zXG4gKlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnNcbiAqXG4gKiBAY2xhc3MgQ291Y2hEQlNlcXVlbmNlXG4gKiBAaW1wbGVtZW50cyBTZXF1ZW5jZVxuICpcbiAqIEBjYXRlZ29yeSBTZXF1ZW5jZXNcbiAqL1xuZXhwb3J0IGNsYXNzIENvdWNoREJTZXF1ZW5jZSBleHRlbmRzIFNlcXVlbmNlIHtcbiAgcHJvdGVjdGVkIHJlcG86IENvdWNoREJSZXBvc2l0b3J5PFNlcSwgYW55LCBhbnksIGFueT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogU2VxdWVuY2VPcHRpb25zLFxuICAgIGFkYXB0ZXI6IEFkYXB0ZXI8YW55LCBNYW5nb1F1ZXJ5LCBhbnksIGFueT5cbiAgKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5yZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbChTZXEsIGFkYXB0ZXIuZmxhdm91cik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgYXN5bmMgY3VycmVudCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IHsgbmFtZSwgc3RhcnRXaXRoIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNlcXVlbmNlOiBTZXEgPSBhd2FpdCB0aGlzLnJlcG8ucmVhZChuYW1lIGFzIHN0cmluZyk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZShzZXF1ZW5jZS5jdXJyZW50IGFzIHN0cmluZyB8IG51bWJlcik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdGFydFdpdGggPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBcIlN0YXJ0aW5nIHZhbHVlIGlzIG5vdCBkZWZpbmVkIGZvciBhIG5vbiBleGlzdGluZyBzZXF1ZW5jZVwiXG4gICAgICAgICAgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZShzdGFydFdpdGgpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIHNmKFxuICAgICAgICAgICAgICBcIkZhaWxlZCB0byBwYXJzZSBpbml0aWFsIHZhbHVlIGZvciBzZXF1ZW5jZSB7MH06IHsxfVwiLFxuICAgICAgICAgICAgICBzdGFydFdpdGgudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBzZihcbiAgICAgICAgICBcIkZhaWxlZCB0byByZXRyaWV2ZSBjdXJyZW50IHZhbHVlIGZvciBzZXF1ZW5jZSB7MH06IHsxfVwiLFxuICAgICAgICAgIG5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGVcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUGFyc2VzIHRoZSB7QGxpbmsgU2VxdWVuY2V9IHZhbHVlXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIHBhcnNlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQge1xuICAgIHJldHVybiBwYXJzZVNlcXVlbmNlVmFsdWUodGhpcy5vcHRpb25zLnR5cGUsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBpbmNyZW1lbnRzIHRoZSBzZXF1ZW5jZVxuICAgKiBAZGVzY3JpcHRpb24gU2VxdWVuY2Ugc3BlY2lmaWMgaW1wbGVtZW50YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnR9IGN1cnJlbnRcbiAgICogQHBhcmFtIGNvdW50XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5jcmVtZW50KFxuICAgIGN1cnJlbnQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICBjb3VudD86IG51bWJlclxuICApOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IHsgdHlwZSwgaW5jcmVtZW50QnksIG5hbWUgfSA9IHRoaXMub3B0aW9ucztcbiAgICBsZXQgbmV4dDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICAgIGNvbnN0IHRvSW5jcmVtZW50QnkgPSBjb3VudCB8fCBpbmNyZW1lbnRCeTtcbiAgICBpZiAodG9JbmNyZW1lbnRCeSAlIGluY3JlbWVudEJ5ICE9PSAwKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBWYWx1ZSB0byBpbmNyZW1lbnQgZG9lcyBub3QgY29uc2lkZXIgdGhlIGluY3JlbWVudEJ5IHNldHRpbmc6ICR7aW5jcmVtZW50Qnl9YFxuICAgICAgKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJOdW1iZXJcIjpcbiAgICAgICAgbmV4dCA9ICh0aGlzLnBhcnNlKGN1cnJlbnQpIGFzIG51bWJlcikgKyB0b0luY3JlbWVudEJ5O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJCaWdJbnRcIjpcbiAgICAgICAgbmV4dCA9ICh0aGlzLnBhcnNlKGN1cnJlbnQpIGFzIGJpZ2ludCkgKyBCaWdJbnQodG9JbmNyZW1lbnRCeSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJTaG91bGQgbmV2ZXIgaGFwcGVuXCIpO1xuICAgIH1cbiAgICBsZXQgc2VxOiBTZXE7XG4gICAgdHJ5IHtcbiAgICAgIHNlcSA9IGF3YWl0IHRoaXMucmVwby51cGRhdGUobmV3IFNlcSh7IGlkOiBuYW1lLCBjdXJyZW50OiBuZXh0IH0pKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSkgdGhyb3cgZTtcbiAgICAgIHNlcSA9IGF3YWl0IHRoaXMucmVwby5jcmVhdGUobmV3IFNlcSh7IGlkOiBuYW1lLCBjdXJyZW50OiBuZXh0IH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VxLmN1cnJlbnQgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyB0aGUgbmV4dCB2YWx1ZSBpbiB0aCBzZXF1ZW5jZVxuICAgKiBAZGVzY3JpcHRpb24gY2FsbHMge0BsaW5rIFNlcXVlbmNlI3BhcnNlfSBvbiB0aGUgY3VycmVudCB2YWx1ZVxuICAgKiBmb2xsb3dlZCBieSB7QGxpbmsgU2VxdWVuY2UjaW5jcmVtZW50fVxuICAgKlxuICAgKi9cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPG51bWJlciB8IHN0cmluZyB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmN1cnJlbnQoKTtcbiAgICByZXR1cm4gdGhpcy5pbmNyZW1lbnQoY3VycmVudCk7XG4gIH1cblxuICBhc3luYyByYW5nZShjb3VudDogbnVtYmVyKTogUHJvbWlzZTwobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdPiB7XG4gICAgY29uc3QgY3VycmVudCA9IChhd2FpdCB0aGlzLmN1cnJlbnQoKSkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IGluY3JlbWVudEJ5ID0gdGhpcy5wYXJzZSh0aGlzLm9wdGlvbnMuaW5jcmVtZW50QnkpIGFzIG51bWJlcjtcbiAgICBjb25zdCBuZXh0OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgPSBhd2FpdCB0aGlzLmluY3JlbWVudChcbiAgICAgIGN1cnJlbnQsXG4gICAgICAodGhpcy5wYXJzZShjb3VudCkgYXMgbnVtYmVyKSAqIGluY3JlbWVudEJ5XG4gICAgKTtcbiAgICBjb25zdCByYW5nZTogKG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXSA9IFtdO1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gY291bnQ7IGkrKykge1xuICAgICAgcmFuZ2UucHVzaChjdXJyZW50ICsgaW5jcmVtZW50QnkgKiAodGhpcy5wYXJzZShpKSBhcyBudW1iZXIpKTtcbiAgICB9XG4gICAgaWYgKHJhbmdlW3JhbmdlLmxlbmd0aCAtIDFdICE9PSBuZXh0KVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNjYWxjdWxhdGlvbiBvZiByYW5nZVwiKTtcbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIFBhZ2luYXRvcixcbiAgUGFnaW5nRXJyb3IsXG4gIFNlcXVlbmNlT3B0aW9ucyxcbiAgU3RhdGVtZW50LFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIERlZmF1bHRTZXBhcmF0b3IsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IHBhcnNlU2VxdWVuY2VWYWx1ZSB9IGZyb20gXCIuLi9zZXF1ZW5jZXMvdXRpbHNcIjtcbmltcG9ydCB7IE1hbmdvUXVlcnksIE1hbmdvUmVzcG9uc2UgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIENvdWNoREJQYWdpbmF0b3I8Vj4gZXh0ZW5kcyBQYWdpbmF0b3I8ViwgTWFuZ29RdWVyeT4ge1xuICBwcml2YXRlIGJvb2tNYXJrPzogc3RyaW5nO1xuXG4gIGdldCB0b3RhbCgpOiBudW1iZXIge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBUaGUgdG90YWwgcGFnZXMgYXBpIGlzIG5vdCBhdmFpbGFibGUgZm9yIGNvdWNoZGJgKTtcbiAgfVxuXG4gIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFRoZSByZWNvcmQgY291bnQgYXBpIGlzIG5vdCBhdmFpbGFibGUgZm9yIGNvdWNoZGJgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0YXRlbWVudDogU3RhdGVtZW50PE1hbmdvUXVlcnk+LFxuICAgIHNpemU6IG51bWJlcixcbiAgICByYXdTdGF0ZW1lbnQ6IE1hbmdvUXVlcnlcbiAgKSB7XG4gICAgc3VwZXIoc3RhdGVtZW50LCBzaXplLCByYXdTdGF0ZW1lbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBNYW5nb1F1ZXJ5KTogTWFuZ29RdWVyeSB7XG4gICAgY29uc3QgcXVlcnk6IE1hbmdvUXVlcnkgPSBPYmplY3QuYXNzaWduKHt9LCByYXdTdGF0ZW1lbnQpO1xuICAgIGlmIChxdWVyeS5saW1pdCkgdGhpcy5saW1pdCA9IHF1ZXJ5LmxpbWl0O1xuXG4gICAgcXVlcnkubGltaXQgPSB0aGlzLnNpemU7XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICBhc3luYyBwYWdlKHBhZ2U6IG51bWJlciA9IDEsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxWW10+IHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlbWVudCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5zdGF0LmdldFRhcmdldCgpO1xuICAgIC8vIGlmICghdGhpcy5fcmVjb3JkQ291bnQgfHwgIXRoaXMuX3RvdGFsUGFnZXMpIHtcbiAgICAvLyAgIC8vIHRoaXMuX3JlY29yZENvdW50ID0gYXdhaXQgdGhpcy5hZGFwdGVyXG4gICAgLy8gICAvLyAgIC5RdWVyeSgpXG4gICAgLy8gICAvLyAgIC5jb3VudCgpXG4gICAgLy8gICAvLyAgIC5mcm9tKHRhcmdldClcbiAgICAvLyAgIC8vICAgLmV4ZWN1dGU8bnVtYmVyPigpO1xuICAgIC8vIH1cbiAgICB0aGlzLnZhbGlkYXRlUGFnZShwYWdlKTtcblxuICAgIGlmIChwYWdlICE9PSAxKSB7XG4gICAgICBpZiAoIXRoaXMuYm9va01hcmspXG4gICAgICAgIHRocm93IG5ldyBQYWdpbmdFcnJvcihcIk5vIGJvb2ttYXJrLiBEaWQgeW91IHN0YXJ0IGluIHRoZSBmaXJzdCBwYWdlP1wiKTtcbiAgICAgIHN0YXRlbWVudFtcImJvb2ttYXJrXCJdID0gdGhpcy5ib29rTWFyaztcbiAgICB9XG4gICAgY29uc3QgcmF3UmVzdWx0OiBNYW5nb1Jlc3BvbnNlPGFueT4gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KFxuICAgICAgc3RhdGVtZW50LFxuICAgICAgZmFsc2UsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcblxuICAgIGNvbnN0IHsgZG9jcywgYm9va21hcmssIHdhcm5pbmcgfSA9IHJhd1Jlc3VsdDtcbiAgICBpZiAod2FybmluZykgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgIGlmICghdGFyZ2V0KSB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXCJObyBzdGF0ZW1lbnQgdGFyZ2V0IGRlZmluZWRcIik7XG4gICAgY29uc3QgcGtEZWYgPSBmaW5kUHJpbWFyeUtleShuZXcgdGFyZ2V0KCkpIGFzIHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBwcm9wczogU2VxdWVuY2VPcHRpb25zO1xuICAgIH07XG4gICAgY29uc3QgcmVzdWx0cyA9XG4gICAgICBzdGF0ZW1lbnQuZmllbGRzICYmIHN0YXRlbWVudC5maWVsZHMubGVuZ3RoXG4gICAgICAgID8gZG9jcyAvLyBoYXMgZmllbGRzIG1lYW5zIGl0cyBub3QgZnVsbCBtb2RlbFxuICAgICAgICA6IGRvY3MubWFwKChkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vbm8gZmllbGRzIG1lYW5zIHdlIG5lZWQgdG8gcmV2ZXJ0IHRvIHNhdmluZyBwcm9jZXNzXG4gICAgICAgICAgICBpZiAoIXRhcmdldCkgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFwiTm8gc3RhdGVtZW50IHRhcmdldCBkZWZpbmVkXCIpO1xuICAgICAgICAgICAgY29uc3QgcGsgPSBwa0RlZi5pZDtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSWQgPSBkLl9pZC5zcGxpdChEZWZhdWx0U2VwYXJhdG9yKTtcbiAgICAgICAgICAgIG9yaWdpbmFsSWQuc3BsaWNlKDAsIDEpOyAvLyByZW1vdmUgdGhlIHRhYmxlIG5hbWVcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KFxuICAgICAgICAgICAgICBkLFxuICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgIHBrLFxuICAgICAgICAgICAgICBwYXJzZVNlcXVlbmNlVmFsdWUoXG4gICAgICAgICAgICAgICAgcGtEZWYucHJvcHMudHlwZSxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbElkLmpvaW4oRGVmYXVsdFNlcGFyYXRvcilcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICB0aGlzLmJvb2tNYXJrID0gYm9va21hcms7XG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBBZGFwdGVyLCBTdGF0ZW1lbnQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5LCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvdWNoREJLZXlzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgcGFyc2VTZXF1ZW5jZVZhbHVlIH0gZnJvbSBcIi4uL3NlcXVlbmNlcy91dGlsc1wiO1xuaW1wb3J0IHsgUGFnaW5hdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBDb3VjaERCUGFnaW5hdG9yIH0gZnJvbSBcIi4vUGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBDb3VjaERCU3RhdGVtZW50PFk+IGV4dGVuZHMgU3RhdGVtZW50PE1hbmdvUXVlcnk+IHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcjogQWRhcHRlcjxZLCBNYW5nb1F1ZXJ5LCBhbnksIGFueT4pIHtcbiAgICBzdXBlcihhZGFwdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZTxZPigpOiBQcm9taXNlPFk+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnk6IE1hbmdvUXVlcnkgPSB0aGlzLmJ1aWxkKCk7XG4gICAgICBpZiAoIXF1ZXJ5LmxpbWl0KSBxdWVyeS5saW1pdCA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgcmV0dXJuIHRoaXMucmF3KHF1ZXJ5KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHBhZ2luYXRlPFI+KHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPFIsIE1hbmdvUXVlcnk+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5OiBNYW5nb1F1ZXJ5ID0gdGhpcy5idWlsZCgpO1xuICAgICAgcmV0dXJuIG5ldyBDb3VjaERCUGFnaW5hdG9yKHRoaXMsIHNpemUsIHF1ZXJ5KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1JlY29yZChcbiAgICByOiBhbnksXG4gICAgcGtBdHRyOiBzdHJpbmcsXG4gICAgc2VxdWVuY2VUeXBlOiBcIk51bWJlclwiIHwgXCJCaWdJbnRcIiB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAoIXJbQ291Y2hEQktleXMuSURdKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyBDb3VjaERCIElkIGRlZmluaXRpb24gZm91bmQuIFNob3VsZCBub3QgYmUgcG9zc2libGVgXG4gICAgICApO1xuICAgIGNvbnN0IFssIC4uLmtleUFyZ3NdID0gcltDb3VjaERCS2V5cy5JRF0uc3BsaXQoXCJfXCIpO1xuXG4gICAgY29uc3QgaWQgPSBrZXlBcmdzLmpvaW4oXCJfXCIpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KFxuICAgICAgcixcbiAgICAgIHRoaXMudGFyZ2V0IGFzIENvbnN0cnVjdG9yPGFueT4sXG4gICAgICBwa0F0dHIsXG4gICAgICBwYXJzZVNlcXVlbmNlVmFsdWUoc2VxdWVuY2VUeXBlLCBpZClcbiAgICApIGFzIGFueTtcbiAgfVxuXG4gIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdzxSPihyYXdJbnB1dCwgdHJ1ZSwgLi4uYXJncyk7XG4gICAgaWYgKCF0aGlzLmZ1bGxSZWNvcmQpIHJldHVybiByZXN1bHRzO1xuICAgIGlmICghdGhpcy50YXJnZXQpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJObyB0YXJnZXQgZGVmaW5lZCBpbiBzdGF0ZW1lbnQuIHNob3VsZCBuZXZlciBoYXBwZW5cIlxuICAgICAgKTtcblxuICAgIGNvbnN0IHBrRGVmID0gZmluZFByaW1hcnlLZXkobmV3IHRoaXMudGFyZ2V0KCkgYXMgYW55KTtcbiAgICBjb25zdCBwa0F0dHIgPSBwa0RlZi5pZDtcbiAgICBjb25zdCB0eXBlID0gcGtEZWYucHJvcHMudHlwZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRzKSlcbiAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocikgPT5cbiAgICAgICAgdGhpcy5wcm9jZXNzUmVjb3JkKHIsIHBrQXR0ciBhcyBzdHJpbmcsIHR5cGUpXG4gICAgICApIGFzIFI7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlY29yZChyZXN1bHRzLCBwa0F0dHIgYXMgc3RyaW5nLCB0eXBlKSBhcyBSO1xuICB9XG59XG4iLCJpbXBvcnQgeyBGcm9tQ2xhdXNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbEFyZywgTW9kZWwsIENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8vIG5vaW5zcGVjdGlvbiBKU0Fubm90YXRvclxuZXhwb3J0IGNsYXNzIENvdWNoREJGcm9tQ2xhdXNlPE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBGcm9tQ2xhdXNlPFxuICBNYW5nb1F1ZXJ5LFxuICBNXG4+IHtcbiAgY29uc3RydWN0b3IoY2xhdXNlOiBNb2RlbEFyZzxGcm9tQ2xhdXNlPE1hbmdvUXVlcnksIE0+Pikge1xuICAgIHN1cGVyKGNsYXVzZSk7XG4gIH1cblxuICBidWlsZChwcmV2aW91czogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgIGNvbnN0IHNlbGVjdG9yczogYW55ID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPVxuICAgICAgdHlwZW9mIHRoaXMuc2VsZWN0b3IgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyB0aGlzLnNlbGVjdG9yXG4gICAgICAgIDogUmVwb3NpdG9yeS50YWJsZSh0aGlzLnNlbGVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KTtcbiAgICBwcmV2aW91cy5zZWxlY3RvciA9IHNlbGVjdG9ycztcbiAgICByZXR1cm4gcHJldmlvdXM7XG4gIH1cbn1cbiIsImltcG9ydCB7IEluc2VydENsYXVzZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWxBcmcsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWFuZ29RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vLyBub2luc3BlY3Rpb24gSlNBbm5vdGF0b3JcbmV4cG9ydCBjbGFzcyBDb3VjaERCSW5zZXJ0Q2xhdXNlPE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBJbnNlcnRDbGF1c2U8XG4gIE1hbmdvUXVlcnksXG4gIE1cbj4ge1xuICBjb25zdHJ1Y3RvcihjbGF1c2U6IE1vZGVsQXJnPEluc2VydENsYXVzZTxNYW5nb1F1ZXJ5LCBNPj4pIHtcbiAgICBzdXBlcihjbGF1c2UpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBidWlsZChxdWVyeTogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm90IHN1cHBvcnRlZFwiKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29uZGl0aW9uLCBXaGVyZUNsYXVzZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb3VjaERCR3JvdXBPcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb3VjaERCS2V5cyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1hbmdvT3BlcmF0b3IsIE1hbmdvUXVlcnksIE1hbmdvU2VsZWN0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIENvdWNoREJXaGVyZUNsYXVzZSBleHRlbmRzIFdoZXJlQ2xhdXNlPE1hbmdvUXVlcnk+IHtcbiAgY29uc3RydWN0b3IoY2xhdXNlOiBNb2RlbEFyZzxXaGVyZUNsYXVzZTxNYW5nb1F1ZXJ5Pj4pIHtcbiAgICBzdXBlcihjbGF1c2UpO1xuICB9XG5cbiAgYnVpbGQocXVlcnk6IE1hbmdvUXVlcnkpOiBNYW5nb1F1ZXJ5IHtcbiAgICBjb25zdCBjb25kaXRpb246IE1hbmdvU2VsZWN0b3IgPSB0aGlzLmFkYXB0ZXIucGFyc2VDb25kaXRpb24oXG4gICAgICBDb25kaXRpb24uYW5kKFxuICAgICAgICB0aGlzLmNvbmRpdGlvbiBhcyBDb25kaXRpb24sXG4gICAgICAgIENvbmRpdGlvbi5hdHRyaWJ1dGUoQ291Y2hEQktleXMuVEFCTEUpLmVxKFxuICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW0NvdWNoREJLZXlzLlRBQkxFXVxuICAgICAgICApXG4gICAgICApXG4gICAgKS5zZWxlY3RvcjtcblxuICAgIGNvbnN0IHNlbGVjdG9yS2V5cyA9IE9iamVjdC5rZXlzKGNvbmRpdGlvbikgYXMgTWFuZ29PcGVyYXRvcltdO1xuICAgIGlmIChcbiAgICAgIHNlbGVjdG9yS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgIE9iamVjdC52YWx1ZXMoQ291Y2hEQkdyb3VwT3BlcmF0b3IpLmluZGV4T2Yoc2VsZWN0b3JLZXlzWzBdKSAhPT0gLTFcbiAgICApXG4gICAgICBzd2l0Y2ggKHNlbGVjdG9yS2V5c1swXSkge1xuICAgICAgICBjYXNlIENvdWNoREJHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgIC4uLk9iamVjdC52YWx1ZXMoXG4gICAgICAgICAgICAgIGNvbmRpdGlvbltDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdIGFzIE1hbmdvU2VsZWN0b3JcbiAgICAgICAgICAgICkucmVkdWNlKChhY2N1bTogTWFuZ29TZWxlY3RvcltdLCB2YWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsKTtcbiAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoICE9PSAxKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiVG9vIG1hbnkga2V5cyBpbiBxdWVyeSBzZWxlY3Rvci4gc2hvdWxkIGJlIG9uZVwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29uc3QgayA9IGtleXNbMF07XG4gICAgICAgICAgICAgIGlmIChrID09PSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQpXG4gICAgICAgICAgICAgICAgYWNjdW0ucHVzaCguLi4odmFsW2tdIGFzIGFueVtdKSk7XG4gICAgICAgICAgICAgIGVsc2UgYWNjdW0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgICAgICB9LCBbXSksXG4gICAgICAgICAgXTtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IGNvbmRpdGlvbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5PUjoge1xuICAgICAgICAgIGNvbnN0IHM6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICBzW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhxdWVyeS5zZWxlY3RvcikubWFwKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF07XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZVwiKTtcbiAgICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbikuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICBpZiAocXVlcnkuc2VsZWN0b3Jba2V5XSlcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBzZihcbiAgICAgICAgICAgICAgXCJBIHswfSBxdWVyeSBwYXJhbSBpcyBhYm91dCB0byBiZSBvdmVycmlkZGVuOiB7MX0gYnkgezJ9XCIsXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3Jba2V5XSBhcyB1bmtub3duIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgdmFsIGFzIHVua25vd24gYXMgc3RyaW5nXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgcXVlcnkuc2VsZWN0b3Jba2V5XSA9IHZhbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29uc3QsIFNlbGVjdENsYXVzZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWxBcmcsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTWFuZ29RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgQ291Y2hEQlNlbGVjdENsYXVzZTxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgU2VsZWN0Q2xhdXNlPFxuICBNYW5nb1F1ZXJ5LFxuICBNXG4+IHtcbiAgY29uc3RydWN0b3IoY2xhdXNlOiBNb2RlbEFyZzxTZWxlY3RDbGF1c2U8TWFuZ29RdWVyeSwgTT4+KSB7XG4gICAgc3VwZXIoY2xhdXNlKTtcbiAgfVxuXG4gIGJ1aWxkKHF1ZXJ5OiBNYW5nb1F1ZXJ5KTogTWFuZ29RdWVyeSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdG9yIHx8IHRoaXMuc2VsZWN0b3IgPT09IENvbnN0LkZVTExfUkVDT1JEKSByZXR1cm4gcXVlcnk7XG4gICAgcXVlcnkuZmllbGRzID1cbiAgICAgIHR5cGVvZiB0aGlzLnNlbGVjdG9yID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gW3RoaXMuc2VsZWN0b3IgYXMgc3RyaW5nXVxuICAgICAgICA6ICh0aGlzLnNlbGVjdG9yIGFzIHN0cmluZ1tdKTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbHVlc0NsYXVzZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWxBcmcsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWFuZ29RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgQ291Y2hEQlZhbHVlc0NsYXVzZTxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgVmFsdWVzQ2xhdXNlPFxuICBNYW5nb1F1ZXJ5LFxuICBNXG4+IHtcbiAgY29uc3RydWN0b3IoY2xhdXNlOiBNb2RlbEFyZzxWYWx1ZXNDbGF1c2U8TWFuZ29RdWVyeSwgTT4+KSB7XG4gICAgc3VwZXIoY2xhdXNlKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYnVpbGQocHJldmlvdXM6IE1hbmdvUXVlcnkpOiBNYW5nb1F1ZXJ5IHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2xhdXNlRmFjdG9yeSxcbiAgQ29uZGl0aW9uLFxuICBGcm9tQ2xhdXNlLFxuICBGcm9tU2VsZWN0b3IsXG4gIEdyb3VwQnlTZWxlY3RvcixcbiAgTGltaXRTZWxlY3RvcixcbiAgT2Zmc2V0U2VsZWN0b3IsXG4gIE9yZGVyQnlTZWxlY3RvcixcbiAgUXVlcnlFcnJvcixcbiAgU2VsZWN0U2VsZWN0b3IsXG4gIFN0YXRlbWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMaW1pdENsYXVzZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgU2VsZWN0Q2xhdXNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBXaGVyZUNsYXVzZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgT2Zmc2V0Q2xhdXNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBPcmRlckJ5Q2xhdXNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBHcm91cEJ5Q2xhdXNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBWYWx1ZXNDbGF1c2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEluc2VydENsYXVzZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ291Y2hEQkZyb21DbGF1c2UgfSBmcm9tIFwiLi9Gcm9tQ2xhdXNlXCI7XG5pbXBvcnQgeyBNb2RlbEFyZywgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBDb250ZXh0LFxuICBJbnRlcm5hbEVycm9yLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ291Y2hEQkluc2VydENsYXVzZSB9IGZyb20gXCIuL0luc2VydENsYXVzZVwiO1xuaW1wb3J0IHsgQ291Y2hEQlN0YXRlbWVudCB9IGZyb20gXCIuL1N0YXRlbWVudFwiO1xuaW1wb3J0IHsgQ291Y2hEQldoZXJlQ2xhdXNlIH0gZnJvbSBcIi4vV2hlcmVDbGF1c2VcIjtcbmltcG9ydCB7IENvdWNoREJTZWxlY3RDbGF1c2UgfSBmcm9tIFwiLi9TZWxlY3RDbGF1c2VcIjtcbmltcG9ydCB7IENvdWNoREJWYWx1ZXNDbGF1c2UgfSBmcm9tIFwiLi9WYWx1ZXNDbGF1c2VcIjtcbmltcG9ydCB7IENvdWNoREJPcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ291Y2hEQkFkYXB0ZXIgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHsgTWFuZ29RdWVyeSwgTWFuZ29TZWxlY3RvciB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgRmFjdG9yeTxcbiAgWSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+IGV4dGVuZHMgQ2xhdXNlRmFjdG9yeTxZLCBNYW5nb1F1ZXJ5LCBDb3VjaERCQWRhcHRlcjxZLCBGLCBDPj4ge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBDb3VjaERCQWRhcHRlcjxZLCBGLCBDPikge1xuICAgIHN1cGVyKGFkYXB0ZXIpO1xuICB9XG5cbiAgZnJvbTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHN0YXRlbWVudDogU3RhdGVtZW50PE1hbmdvUXVlcnk+LFxuICAgIHNlbGVjdG9yOiBGcm9tU2VsZWN0b3I8TT5cbiAgKTogRnJvbUNsYXVzZTxNYW5nb1F1ZXJ5LCBNPiB7XG4gICAgcmV0dXJuIG5ldyBDb3VjaERCRnJvbUNsYXVzZSh7IHN0YXRlbWVudDogc3RhdGVtZW50LCBzZWxlY3Rvcjogc2VsZWN0b3IgfSk7XG4gIH1cblxuICBncm91cEJ5KFxuICAgIHN0YXRlbWVudDogU3RhdGVtZW50PE1hbmdvUXVlcnk+LFxuICAgIHNlbGVjdG9yOiBHcm91cEJ5U2VsZWN0b3JcbiAgKTogR3JvdXBCeUNsYXVzZTxNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyAoY2xhc3MgZXh0ZW5kcyBHcm91cEJ5Q2xhdXNlPE1hbmdvUXVlcnk+IHtcbiAgICAgIGNvbnN0cnVjdG9yKGNsYXVzZTogTW9kZWxBcmc8R3JvdXBCeUNsYXVzZTxNYW5nb1F1ZXJ5Pj4pIHtcbiAgICAgICAgc3VwZXIoY2xhdXNlKTtcbiAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgYnVpbGQocXVlcnk6IE1hbmdvUXVlcnkpOiBNYW5nb1F1ZXJ5IHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICB9XG4gICAgfSkoe1xuICAgICAgc3RhdGVtZW50OiBzdGF0ZW1lbnQsXG4gICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgfSk7XG4gIH1cblxuICBpbnNlcnQ8TSBleHRlbmRzIE1vZGVsPigpOiBJbnNlcnRDbGF1c2U8TWFuZ29RdWVyeSwgTT4ge1xuICAgIHJldHVybiBuZXcgQ291Y2hEQkluc2VydENsYXVzZSh7XG4gICAgICBzdGF0ZW1lbnQ6IG5ldyBDb3VjaERCU3RhdGVtZW50KHRoaXMuYWRhcHRlciksXG4gICAgfSk7XG4gIH1cblxuICBsaW1pdChcbiAgICBzdGF0ZW1lbnQ6IFN0YXRlbWVudDxNYW5nb1F1ZXJ5PixcbiAgICBzZWxlY3RvcjogTGltaXRTZWxlY3RvclxuICApOiBMaW1pdENsYXVzZTxNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyAoY2xhc3MgZXh0ZW5kcyBMaW1pdENsYXVzZTxNYW5nb1F1ZXJ5PiB7XG4gICAgICBjb25zdHJ1Y3RvcihjbGF1c2U6IE1vZGVsQXJnPExpbWl0Q2xhdXNlPE1hbmdvUXVlcnk+Pikge1xuICAgICAgICBzdXBlcihjbGF1c2UpO1xuICAgICAgfVxuXG4gICAgICBidWlsZChxdWVyeTogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgICAgICBxdWVyeS5saW1pdCA9IHRoaXMuc2VsZWN0b3IgYXMgbnVtYmVyO1xuICAgICAgICByZXR1cm4gcXVlcnk7XG4gICAgICB9XG4gICAgfSkoe1xuICAgICAgc3RhdGVtZW50OiBzdGF0ZW1lbnQsXG4gICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgfSk7XG4gIH1cblxuICBvZmZzZXQoXG4gICAgc3RhdGVtZW50OiBTdGF0ZW1lbnQ8TWFuZ29RdWVyeT4sXG4gICAgc2VsZWN0b3I6IE9mZnNldFNlbGVjdG9yXG4gICk6IE9mZnNldENsYXVzZTxNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyAoY2xhc3MgZXh0ZW5kcyBPZmZzZXRDbGF1c2U8TWFuZ29RdWVyeT4ge1xuICAgICAgY29uc3RydWN0b3IoY2xhdXNlOiBNb2RlbEFyZzxPZmZzZXRDbGF1c2U8TWFuZ29RdWVyeT4+KSB7XG4gICAgICAgIHN1cGVyKGNsYXVzZSk7XG4gICAgICB9XG5cbiAgICAgIGJ1aWxkKHF1ZXJ5OiBNYW5nb1F1ZXJ5KTogTWFuZ29RdWVyeSB7XG4gICAgICAgIGNvbnN0IHNraXA6IG51bWJlciA9IHBhcnNlSW50KHRoaXMuc2VsZWN0b3IgYXMgdW5rbm93biBhcyBzdHJpbmcpO1xuICAgICAgICBpZiAoaXNOYU4oc2tpcCkpIHRocm93IG5ldyBRdWVyeUVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIG9mZnNldFwiKTtcbiAgICAgICAgcXVlcnkuc2tpcCA9IHNraXA7XG4gICAgICAgIHJldHVybiBxdWVyeTtcbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICBzdGF0ZW1lbnQ6IHN0YXRlbWVudCxcbiAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICB9KTtcbiAgfVxuXG4gIG9yZGVyQnkoXG4gICAgc3RhdGVtZW50OiBTdGF0ZW1lbnQ8TWFuZ29RdWVyeT4sXG4gICAgc2VsZWN0b3I6IE9yZGVyQnlTZWxlY3RvcltdXG4gICk6IE9yZGVyQnlDbGF1c2U8TWFuZ29RdWVyeT4ge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgT3JkZXJCeUNsYXVzZTxNYW5nb1F1ZXJ5PiB7XG4gICAgICBjb25zdHJ1Y3RvcihjbGF1c2U6IE1vZGVsQXJnPE9yZGVyQnlDbGF1c2U8TWFuZ29RdWVyeT4+KSB7XG4gICAgICAgIHN1cGVyKGNsYXVzZSk7XG4gICAgICB9XG5cbiAgICAgIGJ1aWxkKHF1ZXJ5OiBNYW5nb1F1ZXJ5KTogTWFuZ29RdWVyeSB7XG4gICAgICAgIHF1ZXJ5LnNvcnQgPSBxdWVyeS5zb3J0IHx8IFtdO1xuICAgICAgICBxdWVyeS5zZWxlY3RvciA9IHF1ZXJ5LnNlbGVjdG9yIHx8ICh7fSBhcyBNYW5nb1NlbGVjdG9yKTtcbiAgICAgICAgdGhpcy5zZWxlY3RvciEuZm9yRWFjaCgocykgPT4ge1xuICAgICAgICAgIGNvbnN0IFtzZWxlY3RvciwgdmFsdWVdID0gcztcbiAgICAgICAgICBjb25zdCByZWM6IGFueSA9IHt9O1xuICAgICAgICAgIHJlY1tzZWxlY3Rvcl0gPSB2YWx1ZTtcbiAgICAgICAgICAocXVlcnkuc29ydCBhcyBhbnlbXSkucHVzaChyZWMgYXMgYW55KTtcbiAgICAgICAgICBpZiAoIXF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSkge1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgICAgICAgIChxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgICAgICAgIENvdWNoREJPcGVyYXRvci5CSUdHRVJcbiAgICAgICAgICAgIF0gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBxdWVyeS5maWVsZHMgPSBxdWVyeS5maWVsZHMgfHwgW107XG4gICAgICAgICAgLy8gcXVlcnkuZmllbGRzID0gWy4uLm5ldyBTZXQoWy4uLnF1ZXJ5LmZpZWxkcywgc2VsZWN0b3JdKS5rZXlzKCldXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcXVlcnk7XG4gICAgICB9XG4gICAgfSkoe1xuICAgICAgc3RhdGVtZW50OiBzdGF0ZW1lbnQsXG4gICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3Q8TSBleHRlbmRzIE1vZGVsPihcbiAgICBzZWxlY3RvcjogU2VsZWN0U2VsZWN0b3IgfCB1bmRlZmluZWRcbiAgKTogU2VsZWN0Q2xhdXNlPE1hbmdvUXVlcnksIE0+IHtcbiAgICByZXR1cm4gbmV3IENvdWNoREJTZWxlY3RDbGF1c2Uoe1xuICAgICAgc3RhdGVtZW50OiBuZXcgQ291Y2hEQlN0YXRlbWVudCh0aGlzLmFkYXB0ZXIpLFxuICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIH0pO1xuICB9XG5cbiAgdmFsdWVzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgc3RhdGVtZW50OiBTdGF0ZW1lbnQ8TWFuZ29RdWVyeT4sXG4gICAgdmFsdWVzOiBNW11cbiAgKTogVmFsdWVzQ2xhdXNlPE1hbmdvUXVlcnksIE0+IHtcbiAgICByZXR1cm4gbmV3IENvdWNoREJWYWx1ZXNDbGF1c2U8TT4oe1xuICAgICAgc3RhdGVtZW50OiBzdGF0ZW1lbnQsXG4gICAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICB9KTtcbiAgfVxuXG4gIHdoZXJlKFxuICAgIHN0YXRlbWVudDogU3RhdGVtZW50PE1hbmdvUXVlcnk+LFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uXG4gICk6IFdoZXJlQ2xhdXNlPE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IENvdWNoREJXaGVyZUNsYXVzZSh7XG4gICAgICBzdGF0ZW1lbnQ6IHN0YXRlbWVudCxcbiAgICAgIGNvbmRpdGlvbjogY29uZGl0aW9uLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBHcm91cE9wZXJhdG9yLCBPcGVyYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ291Y2hEQkdyb3VwT3BlcmF0b3IsIENvdWNoREJPcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTWFuZ29PcGVyYXRvciB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlT3BlcmF0b3JzKFxuICBvcGVyYXRvcjogR3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yXG4pOiBNYW5nb09wZXJhdG9yIHtcbiAgZm9yIChjb25zdCBvcGVyYXRvcnMgb2YgW0NvdWNoREJPcGVyYXRvciwgQ291Y2hEQkdyb3VwT3BlcmF0b3JdKSB7XG4gICAgY29uc3QgZWwgPSBPYmplY3Qua2V5cyhvcGVyYXRvcnMpLmZpbmQoKGspID0+IGsgPT09IG9wZXJhdG9yKTtcbiAgICBpZiAoZWwpIHJldHVybiBvcGVyYXRvcnNbZWxdO1xuICB9XG4gIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgIGBDb3VsZCBub3QgZmluZCBhZGFwdGVyIHRyYW5zbGF0aW9uIGZvciBvcGVyYXRvciAke29wZXJhdG9yfWBcbiAgKTtcbn1cbiIsImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgY2xhc3MgSW5kZXhFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihJbmRleEVycm9yLm5hbWUsIG1zZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEFkYXB0ZXIsXG4gIFNlcXVlbmNlLFxuICBTZXF1ZW5jZU9wdGlvbnMsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgT3BlcmF0b3IsXG4gIEdyb3VwT3BlcmF0b3IsXG4gIFN0YXRlbWVudCxcbiAgUXVlcnksXG4gIENsYXVzZUZhY3RvcnksXG4gIENvbmRpdGlvbixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBSZXBvc2l0b3J5LFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvdWNoREJLZXlzLCByZXNlcnZlZEF0dHJpYnV0ZXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQ29udGV4dCxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgcHJlZml4TWV0aG9kLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHsgQ291Y2hEQlN0YXRlbWVudCB9IGZyb20gXCIuL3F1ZXJ5L1N0YXRlbWVudFwiO1xuaW1wb3J0IHsgRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXJ5XCI7XG5pbXBvcnQgeyB0cmFuc2xhdGVPcGVyYXRvcnMgfSBmcm9tIFwiLi9xdWVyeS90cmFuc2xhdGVcIjtcbmltcG9ydCB7IENvdWNoREJTZXF1ZW5jZSB9IGZyb20gXCIuL3NlcXVlbmNlcy9TZXF1ZW5jZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgTWFuZ29PcGVyYXRvciwgTWFuZ29RdWVyeSwgTWFuZ29TZWxlY3RvciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb3VjaERCQWRhcHRlcjxcbiAgWSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+IGV4dGVuZHMgQWRhcHRlcjxZLCBNYW5nb1F1ZXJ5LCBGLCBDPiB7XG4gIHByb3RlY3RlZCBmYWN0b3J5PzogRmFjdG9yeTxZLCBGLCBDPjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3Ioc2NvcGU6IFksIGZsYXZvdXI6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBmbGF2b3VyKTtcbiAgICBbdGhpcy5jcmVhdGUsIHRoaXMuY3JlYXRlQWxsLCB0aGlzLnVwZGF0ZSwgdGhpcy51cGRhdGVBbGxdLmZvckVhY2goKG0pID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBtLm5hbWU7XG4gICAgICBwcmVmaXhNZXRob2QodGhpcywgbSwgKHRoaXMgYXMgYW55KVtuYW1lICsgXCJQcmVmaXhcIl0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IENsYXVzZXMoKTogQ2xhdXNlRmFjdG9yeTxZLCBNYW5nb1F1ZXJ5LCB0eXBlb2YgdGhpcz4ge1xuICAgIGlmICghdGhpcy5mYWN0b3J5KSB0aGlzLmZhY3RvcnkgPSBuZXcgRmFjdG9yeSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5mYWN0b3J5IGFzIENsYXVzZUZhY3Rvcnk8WSwgTWFuZ29RdWVyeSwgdHlwZW9mIHRoaXM+O1xuICB9XG5cbiAgUXVlcnk8TSBleHRlbmRzIE1vZGVsPigpOiBRdWVyeTxNYW5nb1F1ZXJ5LCBNPiB7XG4gICAgcmV0dXJuIHN1cGVyLlF1ZXJ5KCk7XG4gIH1cblxuICBnZXQgU3RhdGVtZW50KCk6IFN0YXRlbWVudDxNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBDb3VjaERCU3RhdGVtZW50KHRoaXMpO1xuICB9XG5cbiAgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb24pOiBNYW5nb1F1ZXJ5IHtcbiAgICBmdW5jdGlvbiBtZXJnZShcbiAgICAgIG9wOiBNYW5nb09wZXJhdG9yLFxuICAgICAgb2JqMTogTWFuZ29TZWxlY3RvcixcbiAgICAgIG9iajI6IE1hbmdvU2VsZWN0b3JcbiAgICApOiBNYW5nb1F1ZXJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdDogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHt9IGFzIE1hbmdvU2VsZWN0b3IgfTtcbiAgICAgIHJlc3VsdC5zZWxlY3RvcltvcF0gPSBbb2JqMSwgb2JqMl07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uO1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgbGV0IG9wOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICBpZiAoXG4gICAgICBbR3JvdXBPcGVyYXRvci5BTkQsIEdyb3VwT3BlcmF0b3IuT1IsIE9wZXJhdG9yLk5PVF0uaW5kZXhPZihcbiAgICAgICAgb3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgKSA9PT0gLTFcbiAgICApIHtcbiAgICAgIG9wW2F0dHIxIGFzIHN0cmluZ10gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW2F0dHIxIGFzIHN0cmluZ10gYXMgTWFuZ29TZWxlY3RvcilbdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKV0gPVxuICAgICAgICBjb21wYXJpc29uO1xuICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLk5PVCkge1xuICAgICAgb3AgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbikuc2VsZWN0b3IgYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BbdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLk5PVCldIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICAoYXR0cjEgYXMgdW5rbm93biBhcyB7IGF0dHIxOiBzdHJpbmcgfSkuYXR0cjFcbiAgICAgIF0gPSBjb21wYXJpc29uO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcDE6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uKS5zZWxlY3RvcjtcbiAgICAgIGNvbnN0IG9wMjogYW55ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihjb21wYXJpc29uIGFzIENvbmRpdGlvbikuc2VsZWN0b3I7XG4gICAgICBvcCA9IG1lcmdlKHRyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvciksIG9wMSwgb3AyKS5zZWxlY3RvcjtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzZWxlY3Rvcjogb3AgfTtcbiAgfVxuXG4gIGFzeW5jIFNlcXVlbmNlKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyk6IFByb21pc2U8U2VxdWVuY2U+IHtcbiAgICByZXR1cm4gbmV3IENvdWNoREJTZXF1ZW5jZShvcHRpb25zLCB0aGlzKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWFuYWdlZE1vZGVscyA9IEFkYXB0ZXIubW9kZWxzKHRoaXMuZmxhdm91cik7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXgoLi4ubWFuYWdlZE1vZGVscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW5kZXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICAuLi5tb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbiAgKTogUHJvbWlzZTx2b2lkPjtcblxuICBhYnN0cmFjdCByYXc8Vj4ocmF3SW5wdXQ6IE1hbmdvUXVlcnksIHByb2Nlc3M6IGJvb2xlYW4pOiBQcm9taXNlPFY+O1xuXG4gIHByb3RlY3RlZCBhc3NpZ25NZXRhZGF0YShcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICByZXY6IHN0cmluZ1xuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHJldixcbiAgICB9KTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXNzaWduTXVsdGlwbGVNZXRhZGF0YShcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICByZXZzOiBzdHJpbmdbXVxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10ge1xuICAgIG1vZGVscy5mb3JFYWNoKChtLCBpKSA9PiB7XG4gICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG0gYXMgYW55LCByZXZzW2ldKTtcbiAgICAgIHJldHVybiBtO1xuICAgIH0pO1xuICAgIHJldHVybiBtb2RlbHM7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJlZml4KFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKSB7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuSURdID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgcmV0dXJuIFt0YWJsZU5hbWUsIGlkLCByZWNvcmRdO1xuICB9XG5cbiAgYWJzdHJhY3QgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICBwcm90ZWN0ZWQgY3JlYXRlQWxsUHJlZml4KFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICApIHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcblxuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKChpZCwgY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5JRF0gPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWxzW2NvdW50XSk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbdGFibGVOYW1lLCBpZHMsIHJlY29yZHNdO1xuICB9XG5cbiAgYWJzdHJhY3QgY3JlYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT47XG5cbiAgYWJzdHJhY3QgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgYWJzdHJhY3QgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+O1xuXG4gIHVwZGF0ZVByZWZpeChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICkge1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLklEXSA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBjb25zdCByZXYgPSBtb2RlbFtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICAgIGlmICghcmV2KVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyByZXZpc2lvbiBudW1iZXIgZm91bmQgZm9yIHJlY29yZCB3aXRoIGlkICR7aWR9YFxuICAgICAgKTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5SRVZdID0gcmV2O1xuICAgIHJldHVybiBbdGFibGVOYW1lLCBpZCwgcmVjb3JkXTtcbiAgfVxuXG4gIGFic3RyYWN0IHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUFsbFByZWZpeChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKSB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG5cbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoaWQsIGNvdW50KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuSURdID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgICAgY29uc3QgcmV2ID0gbW9kZWxzW2NvdW50XVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICAgICAgaWYgKCFyZXYpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBObyByZXZpc2lvbiBudW1iZXIgZm91bmQgZm9yIHJlY29yZCB3aXRoIGlkICR7aWR9YFxuICAgICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsc1tjb3VudF0pO1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlJFVl0gPSByZXY7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbdGFibGVOYW1lLCBpZHMsIHJlY29yZHNdO1xuICB9XG5cbiAgYWJzdHJhY3QgdXBkYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT47XG5cbiAgYWJzdHJhY3QgZGVsZXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICBhYnN0cmFjdCBkZWxldGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPjtcblxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVJZCh0YWJsZU5hbWU6IHN0cmluZywgaWQ6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHJldHVybiBbdGFibGVOYW1lLCBpZF0uam9pbihDb3VjaERCS2V5cy5TRVBBUkFUT1IpO1xuICB9XG5cbiAgcGFyc2VFcnJvcihlcnI6IEVycm9yIHwgc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICAgIHJldHVybiBDb3VjaERCQWRhcHRlci5wYXJzZUVycm9yKGVyciwgcmVhc29uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1Jlc2VydmVkKGF0dHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWF0dHIubWF0Y2gocmVzZXJ2ZWRBdHRyaWJ1dGVzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgcGFyc2VFcnJvcihlcnI6IEVycm9yIHwgc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnIgYXMgYW55O1xuICAgIGxldCBjb2RlOiBzdHJpbmcgPSBcIlwiO1xuICAgIGlmICh0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb2RlID0gZXJyO1xuICAgICAgaWYgKGNvZGUubWF0Y2goL2FscmVhZHkgZXhpc3R8dXBkYXRlIGNvbmZsaWN0L2cpKVxuICAgICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoY29kZSk7XG4gICAgICBpZiAoY29kZS5tYXRjaCgvbWlzc2luZ3xkZWxldGVkL2cpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoY29kZSk7XG4gICAgfSBlbHNlIGlmICgoZXJyIGFzIGFueSkuY29kZSkge1xuICAgICAgY29kZSA9IChlcnIgYXMgYW55KS5jb2RlO1xuICAgICAgcmVhc29uID0gcmVhc29uIHx8IGVyci5tZXNzYWdlO1xuICAgIH0gZWxzZSBpZiAoKGVyciBhcyBhbnkpLnN0YXR1c0NvZGUpIHtcbiAgICAgIGNvZGUgPSAoZXJyIGFzIGFueSkuc3RhdHVzQ29kZTtcbiAgICAgIHJlYXNvbiA9IHJlYXNvbiB8fCBlcnIubWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZSA9IGVyci5tZXNzYWdlO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29kZS50b1N0cmluZygpKSB7XG4gICAgICBjYXNlIFwiNDAxXCI6XG4gICAgICBjYXNlIFwiNDEyXCI6XG4gICAgICBjYXNlIFwiNDA5XCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcbiAgICAgIGNhc2UgXCI0MDRcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuICAgICAgY2FzZSBcIjQwMFwiOlxuICAgICAgICBpZiAoY29kZS50b1N0cmluZygpLm1hdGNoKC9Ob1xcc2luZGV4XFxzZXhpc3RzL2cpKVxuICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhFcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL0VDT05OUkVGVVNFRC9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IE9yZGVyRGlyZWN0aW9uLCBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvdWNoREJLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWZhdWx0U2VwYXJhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3VjaERCT3BlcmF0b3IgfSBmcm9tIFwiLi9xdWVyeS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENyZWF0ZUluZGV4UmVxdWVzdCwgTWFuZ29TZWxlY3RvciwgU29ydE9yZGVyIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlQXV0aChjb246IGFueSwgdXNlcjogc3RyaW5nLCBwYXNzOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGNvbi5hdXRoKHVzZXIsIHBhc3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JhcERvY3VtZW50U2NvcGUoXG4gIGNvbjogYW55LFxuICBkYk5hbWU6IHN0cmluZyxcbiAgdXNlcjogc3RyaW5nLFxuICBwYXNzOiBzdHJpbmdcbik6IGFueSB7XG4gIGNvbnN0IGRiID0gY29uLnVzZShkYk5hbWUpO1xuICBbXCJpbnNlcnRcIiwgXCJnZXRcIiwgXCJwdXRcIiwgXCJkZXN0cm95XCIsIFwiZmluZFwiXS5mb3JFYWNoKChrKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSAoZGIgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba107XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRiLCBrLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBhc3luYyAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgYXdhaXQgcmVBdXRoKGNvbiwgdXNlciwgcGFzcyk7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKGRiLCAuLi5hcmdzKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGIsIENvdWNoREJLZXlzLk5BVElWRSwge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBjb24sXG4gIH0pO1xuICByZXR1cm4gZGI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0UmVzZXJ2ZWRBdHRyaWJ1dGVzKGF0dHI6IHN0cmluZykge1xuICBjb25zdCByZWdleHAgPSAvXl8uKiQvZztcbiAgcmV0dXJuIGF0dHIubWF0Y2gocmVnZXhwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSW5kZXhOYW1lKFxuICBhdHRyaWJ1dGU6IHN0cmluZyxcbiAgdGFibGVOYW1lOiBzdHJpbmcsXG4gIGNvbXBvc2l0aW9ucz86IHN0cmluZ1tdLFxuICBvcmRlcj86IE9yZGVyRGlyZWN0aW9uLFxuICBzZXBhcmF0b3IgPSBEZWZhdWx0U2VwYXJhdG9yXG4pOiBzdHJpbmcge1xuICBjb25zdCBhdHRyID0gW1BlcnNpc3RlbmNlS2V5cy5JTkRFWCwgdGFibGVOYW1lLCBhdHRyaWJ1dGVdO1xuICBpZiAoY29tcG9zaXRpb25zKSBhdHRyLnB1c2goLi4uY29tcG9zaXRpb25zKTtcbiAgaWYgKG9yZGVyKSBhdHRyLnB1c2gob3JkZXIpO1xuICByZXR1cm4gYXR0ci5qb2luKHNlcGFyYXRvcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4RG9jKFxuICBhdHRyaWJ1dGU6IHN0cmluZyxcbiAgdGFibGVOYW1lOiBzdHJpbmcsXG4gIGNvbXBvc2l0aW9ucz86IHN0cmluZ1tdLFxuICBvcmRlcj86IE9yZGVyRGlyZWN0aW9uLFxuICBzZXBhcmF0b3IgPSBEZWZhdWx0U2VwYXJhdG9yXG4pOiBDcmVhdGVJbmRleFJlcXVlc3Qge1xuICBjb25zdCBwYXJ0aWFsRmlsdGVyU2VsZWN0b3I6IE1hbmdvU2VsZWN0b3IgPSB7fTtcbiAgcGFydGlhbEZpbHRlclNlbGVjdG9yW0NvdWNoREJLZXlzLlRBQkxFXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gIChwYXJ0aWFsRmlsdGVyU2VsZWN0b3JbQ291Y2hEQktleXMuVEFCTEVdIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgIENvdWNoREJPcGVyYXRvci5FUVVBTFxuICBdID0gdGFibGVOYW1lO1xuICBsZXQgZmllbGRzOiBTb3J0T3JkZXJbXTtcbiAgaWYgKG9yZGVyKSB7XG4gICAgY29uc3Qgb3JkZXJQcm9wOiBTb3J0T3JkZXIgPSB7fTtcbiAgICBvcmRlclByb3BbYXR0cmlidXRlXSA9IG9yZGVyIGFzIFwiYXNjXCIgfCBcImRlc2NcIjtcbiAgICBjb25zdCBzb3J0ZWRDb21wb3NpdGlvbnM6IFNvcnRPcmRlcltdID0gKGNvbXBvc2l0aW9ucyB8fCBbXSkubWFwKChjKSA9PiB7XG4gICAgICBjb25zdCByOiBTb3J0T3JkZXIgPSB7fTtcbiAgICAgIHJbY10gPSBvcmRlciBhcyBcImFzY1wiIHwgXCJkZXNjXCI7XG4gICAgICByZXR1cm4gcjtcbiAgICB9KTtcbiAgICBjb25zdCBzb3J0ZWRUYWJsZTogU29ydE9yZGVyID0ge307XG4gICAgc29ydGVkVGFibGVbQ291Y2hEQktleXMuVEFCTEVdID0gb3JkZXIgYXMgXCJhc2NcIiB8IFwiZGVzY1wiO1xuICAgIGZpZWxkcyA9IFtvcmRlclByb3AsIC4uLnNvcnRlZENvbXBvc2l0aW9ucywgc29ydGVkVGFibGVdO1xuICB9IGVsc2Uge1xuICAgIGZpZWxkcyA9IFthdHRyaWJ1dGUsIC4uLihjb21wb3NpdGlvbnMgfHwgW10pLCBDb3VjaERCS2V5cy5UQUJMRV07XG4gIH1cbiAgY29uc3QgbmFtZSA9IGdlbmVyYXRlSW5kZXhOYW1lKFxuICAgIGF0dHJpYnV0ZSxcbiAgICB0YWJsZU5hbWUsXG4gICAgY29tcG9zaXRpb25zLFxuICAgIG9yZGVyLFxuICAgIHNlcGFyYXRvclxuICApO1xuICByZXR1cm4ge1xuICAgIGluZGV4OiB7XG4gICAgICBmaWVsZHM6IGZpZWxkcyxcbiAgICAgIC8vIHBhcnRpYWxfZmlsdGVyX3NlbGVjdG9yOiBwYXJ0aWFsRmlsdGVyU2VsZWN0b3IsXG4gICAgfSxcbiAgICBkZG9jOiBbbmFtZSwgQ291Y2hEQktleXMuRERPQ10uam9pbihzZXBhcmF0b3IpLFxuICAgIG5hbWU6IG5hbWUsXG4gIH07XG59XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9pbmRleGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2VxdWVuY2VzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hZGFwdGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTW9kdWxlIHN1bW1hcnlcbiAqIEBkZXNjcmlwdGlvbiBNb2R1bGUgZGVzY3JpcHRpb25cbiAqIEBtb2R1bGUgdHMtd29ya3NwYWNlXG4gKi9cblxuLyoqXG4gKiBAc3VtbWFyeSBOYW1lc3BhY2Ugc3VtbWFyeVxuICogQGRlc2NyaXB0aW9uIE5hbWVzcGFjZSBkZXNjcmlwdGlvblxuICogQG5hbWVzcGFjZSBOYW1lc3BhY2VcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dHMtd29ya3NwYWNlXG4gKi9cblxuLyoqXG4gKiBAc3VtbWFyeSBzdG9yZXMgdGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uXG4gKiBAZGVzY3JpcHRpb24gdGhpcyBpcyBob3cgeW91IHNob3VsZCBkb2N1bWVudCBhIGNvbnN0YW50XG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTp0cy13b3Jrc3BhY2VcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOlsiZ2VuZXJhdGVJbmRleE5hbWUiLCJEZWZhdWx0U2VwYXJhdG9yIiwiUmVwb3NpdG9yeSIsIlBlcnNpc3RlbmNlS2V5cyIsIlNlcXVlbmNlIiwiQmFzZU1vZGVsIiwiX19kZWNvcmF0ZSIsInBrIiwicmVxdWlyZWQiLCJpbmRleCIsInRhYmxlIiwibW9kZWwiLCJJbnRlcm5hbEVycm9yIiwiU2VxIiwiTm90Rm91bmRFcnJvciIsInNmIiwiUGFnaW5hdG9yIiwiUGFnaW5nRXJyb3IiLCJmaW5kUHJpbWFyeUtleSIsIlN0YXRlbWVudCIsIkZyb21DbGF1c2UiLCJJbnNlcnRDbGF1c2UiLCJXaGVyZUNsYXVzZSIsIkNvbmRpdGlvbiIsIlNlbGVjdENsYXVzZSIsIkNvbnN0IiwiVmFsdWVzQ2xhdXNlIiwiQ2xhdXNlRmFjdG9yeSIsIkdyb3VwQnlDbGF1c2UiLCJMaW1pdENsYXVzZSIsIk9mZnNldENsYXVzZSIsIlF1ZXJ5RXJyb3IiLCJPcmRlckJ5Q2xhdXNlIiwiQmFzZUVycm9yIiwiQWRhcHRlciIsInByZWZpeE1ldGhvZCIsIkdyb3VwT3BlcmF0b3IiLCJPcGVyYXRvciIsIkNvbmZsaWN0RXJyb3IiLCJDb25uZWN0aW9uRXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFPLFVBQU0sa0JBQWtCLEdBQUc7QUFFckIsVUFBQSxXQUFXLEdBQUc7SUFDekIsSUFBQSxTQUFTLEVBQUUsR0FBRztJQUNkLElBQUEsRUFBRSxFQUFFLEtBQUs7SUFDVCxJQUFBLEdBQUcsRUFBRSxNQUFNO0lBQ1gsSUFBQSxPQUFPLEVBQUUsVUFBVTtJQUNuQixJQUFBLEtBQUssRUFBRSxTQUFTO0lBQ2hCLElBQUEsUUFBUSxFQUFFLFlBQVk7SUFDdEIsSUFBQSxJQUFJLEVBQUUsTUFBTTtJQUNaLElBQUEsTUFBTSxFQUFFLFVBQVU7SUFDbEIsSUFBQSxLQUFLLEVBQUUsT0FBTzs7O0lDVFQsTUFBTSxlQUFlLEdBQWtDO0lBQzVELElBQUEsS0FBSyxFQUFFLEtBQUs7SUFDWixJQUFBLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLElBQUEsTUFBTSxFQUFFLEtBQUs7SUFDYixJQUFBLFNBQVMsRUFBRSxNQUFNO0lBQ2pCLElBQUEs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