@decaf-ts/for-nest 0.11.2-refactor.2 → 0.11.2-refactor.3

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.
package/dist/for-nest.cjs CHANGED
@@ -408,6 +408,9 @@
408
408
  this.uuid = core.UUID.instance.generate();
409
409
  this.request = req;
410
410
  }
411
+ get headers() {
412
+ return this.getOrUndefined("headers");
413
+ }
411
414
  put(record) {
412
415
  let overrides;
413
416
  try {
@@ -465,7 +468,8 @@
465
468
  for (const flavour of flavours) {
466
469
  const transformer = core.Adapter.transformerFor(flavour);
467
470
  if (!transformer) continue;
468
- const from = await transformer.from(this.requestContext);
471
+ const instance = transformer.from ? transformer : new transformer;
472
+ const from = await instance.from(this.requestContext);
469
473
  if (from) this.requestContext.accumulate(from);
470
474
  }
471
475
  }
@@ -585,103 +589,10 @@
585
589
  }
586
590
  }
587
591
  class DecafRoleAuthHandler extends DecafAuthHandler {}
588
- core.Adapter.transformerFor = function toContextFlags(adapter) {
589
- const alias = typeof adapter === "string" ? adapter : adapter.alias;
590
- return decoration.Metadata["innerGet"](Symbol.for("transformers"), alias);
591
- }.bind(core.Adapter);
592
- core.Adapter.flavoursToTransform = function requestTransformers() {
593
- const meta = decoration.Metadata["innerGet"](Symbol.for("transformers"));
594
- if (!meta) return undefined;
595
- return Object.keys(meta);
596
- }.bind(core.Adapter);
597
- core.Context.prototype.toResponse = function toResponse(res) {
598
- const pending = this.pending();
599
- if (pending) res.header("x-pending-task", JSON.stringify(pending));
600
- return res;
601
- };
602
- const prototype = decoratorValidation.ModelBuilder.prototype;
603
- if (!prototype.decorateClass) {
604
- prototype.decorateClass = function(decorator) {
605
- if (!this._classDecorators) {
606
- this._classDecorators = [];
607
- }
608
- this._classDecorators.push(decorator);
609
- return this;
610
- };
611
- }
612
- prototype.Auth = function(model) {
613
- return this.decorateClass(Auth(model));
614
- };
615
- if (!prototype.__hasClassDecoratorSupport) {
616
- const originalBuild = prototype.build;
617
- prototype.build = function() {
618
- let result = originalBuild.call(this);
619
- const decorators = this._classDecorators;
620
- if (decorators?.length) {
621
- for (const decorator of decorators) {
622
- const decorated = decorator(result);
623
- if (decorated) {
624
- result = decorated;
625
- }
626
- }
627
- }
628
- return result;
629
- };
630
- prototype.__hasClassDecoratorSupport = true;
631
- }
632
- var DecafRequestHandlerInterceptor_1;
633
- exports.DecafRequestHandlerInterceptor = DecafRequestHandlerInterceptor_1 = class DecafRequestHandlerInterceptor {
634
- constructor(requestContext, executor) {
635
- this.requestContext = requestContext;
636
- this.executor = executor;
637
- }
638
- async contextualize(req) {
639
- const headers = req.headers;
640
- const flags = {
641
- headers: headers,
642
- overrides: {}
643
- };
644
- const ip = extractIp(req);
645
- const logger = logging.Logging.get().for({
646
- ip: ip
647
- });
648
- this.requestContext.accumulate(Object.assign({}, core.DefaultAdapterFlags, {
649
- logger: logger,
650
- timestamp: new Date,
651
- operation: `${req.method} ${req.url}`
652
- }, flags));
653
- }
654
- async intercept(context, next) {
655
- const req = context.switchToHttp().getRequest();
656
- const res = context.switchToHttp().getResponse();
657
- const log = logging.Logging.for(DecafRequestHandlerInterceptor_1).for(this.intercept);
658
- log.debug(`CONTEXT ${this.requestContext.uuid} - request: ${req.method} ${req.url}`);
659
- await this.contextualize(req);
660
- log.debug(`CONTEXT ${this.requestContext.uuid} contextualized - request: ${req.method} ${req.url}`);
661
- await this.executor.exec(req, res);
662
- log.debug(`CONTEXT ${this.requestContext.uuid} executors finished - request: ${req.method} ${req.url}`);
663
- return next.handle();
664
- }
665
- };
666
- exports.DecafRequestHandlerInterceptor = DecafRequestHandlerInterceptor_1 = tslib.__decorate([ common.Injectable({
667
- scope: common.Scope.REQUEST
668
- }), tslib.__metadata("design:paramtypes", [ exports.DecafRequestContext, exports.DecafHandlerExecutor ]) ], exports.DecafRequestHandlerInterceptor);
669
- function extractIp(req) {
670
- const headers = req.headers;
671
- function parseIpHeader(value) {
672
- if (!value) return undefined;
673
- const candidate = Array.isArray(value) ? value[0] : value;
674
- return candidate.split(",").map(segment => segment.trim()).filter(Boolean)[0];
675
- }
676
- return parseIpHeader(headers?.["x-forwarded-for"]) ?? parseIpHeader(headers?.["x-real-ip"]) ?? parseIpHeader(headers?.["X-Forwarded-For"]) ?? parseIpHeader(headers?.["X-Real-IP"]) ?? req.ip;
677
- }
678
592
  var DecafAuthModule_1;
679
593
  exports.DecafAuthModule = DecafAuthModule_1 = class DecafAuthModule {
680
594
  static forRoot(options = {}) {
681
- const providers = [ exports.AuthInterceptor, exports.DecafRequestHandlerInterceptor, {
682
- provide: core$1.APP_INTERCEPTOR,
683
- useClass: exports.DecafRequestHandlerInterceptor
684
- } ];
595
+ const providers = [ exports.AuthInterceptor ];
685
596
  if (options.handler) {
686
597
  providers.push(options.handler);
687
598
  providers.push({
@@ -953,6 +864,50 @@
953
864
  }
954
865
  return dtoCache.get(op);
955
866
  }
867
+ core.Adapter.transformerFor = function toContextFlags(adapter) {
868
+ const alias = typeof adapter === "string" ? adapter : adapter.alias;
869
+ return decoration.Metadata["innerGet"](Symbol.for("transformers"), alias);
870
+ }.bind(core.Adapter);
871
+ core.Adapter.flavoursToTransform = function requestTransformers() {
872
+ const meta = decoration.Metadata["innerGet"](Symbol.for("transformers"));
873
+ if (!meta) return undefined;
874
+ return Object.keys(meta);
875
+ }.bind(core.Adapter);
876
+ core.Context.prototype.toResponse = function toResponse(res) {
877
+ const pending = this.pending();
878
+ if (pending) res.header("x-pending-task", JSON.stringify(pending));
879
+ return res;
880
+ };
881
+ const prototype = decoratorValidation.ModelBuilder.prototype;
882
+ if (!prototype.decorateClass) {
883
+ prototype.decorateClass = function(decorator) {
884
+ if (!this._classDecorators) {
885
+ this._classDecorators = [];
886
+ }
887
+ this._classDecorators.push(decorator);
888
+ return this;
889
+ };
890
+ }
891
+ prototype.Auth = function(model) {
892
+ return this.decorateClass(Auth(model));
893
+ };
894
+ if (!prototype.__hasClassDecoratorSupport) {
895
+ const originalBuild = prototype.build;
896
+ prototype.build = function() {
897
+ let result = originalBuild.call(this);
898
+ const decorators = this._classDecorators;
899
+ if (decorators?.length) {
900
+ for (const decorator of decorators) {
901
+ const decorated = decorator(result);
902
+ if (decorated) {
903
+ result = decorated;
904
+ }
905
+ }
906
+ }
907
+ return result;
908
+ };
909
+ prototype.__hasClassDecoratorSupport = true;
910
+ }
956
911
  var DynamicModelController_1;
957
912
  class FromModelController {
958
913
  static {
@@ -2277,6 +2232,52 @@
2277
2232
  });
2278
2233
  }
2279
2234
  }
2235
+ var DecafRequestHandlerInterceptor_1;
2236
+ exports.DecafRequestHandlerInterceptor = DecafRequestHandlerInterceptor_1 = class DecafRequestHandlerInterceptor {
2237
+ constructor(requestContext, executor) {
2238
+ this.requestContext = requestContext;
2239
+ this.executor = executor;
2240
+ }
2241
+ async contextualize(req) {
2242
+ const headers = req.headers;
2243
+ const flags = {
2244
+ headers: headers,
2245
+ overrides: {}
2246
+ };
2247
+ const ip = extractIp(req);
2248
+ const logger = logging.Logging.get().for({
2249
+ ip: ip
2250
+ });
2251
+ this.requestContext.accumulate(Object.assign({}, core.DefaultAdapterFlags, {
2252
+ logger: logger,
2253
+ timestamp: new Date,
2254
+ operation: `${req.method} ${req.url}`
2255
+ }, flags));
2256
+ }
2257
+ async intercept(context, next) {
2258
+ const req = context.switchToHttp().getRequest();
2259
+ const res = context.switchToHttp().getResponse();
2260
+ const log = logging.Logging.for(DecafRequestHandlerInterceptor_1).for(this.intercept);
2261
+ log.debug(`CONTEXT ${this.requestContext.uuid} - request: ${req.method} ${req.url}`);
2262
+ await this.contextualize(req);
2263
+ log.debug(`CONTEXT ${this.requestContext.uuid} contextualized - request: ${req.method} ${req.url}`);
2264
+ await this.executor.exec(req, res);
2265
+ log.debug(`CONTEXT ${this.requestContext.uuid} executors finished - request: ${req.method} ${req.url}`);
2266
+ return next.handle();
2267
+ }
2268
+ };
2269
+ exports.DecafRequestHandlerInterceptor = DecafRequestHandlerInterceptor_1 = tslib.__decorate([ common.Injectable({
2270
+ scope: common.Scope.REQUEST
2271
+ }), tslib.__metadata("design:paramtypes", [ exports.DecafRequestContext, exports.DecafHandlerExecutor ]) ], exports.DecafRequestHandlerInterceptor);
2272
+ function extractIp(req) {
2273
+ const headers = req.headers;
2274
+ function parseIpHeader(value) {
2275
+ if (!value) return undefined;
2276
+ const candidate = Array.isArray(value) ? value[0] : value;
2277
+ return candidate.split(",").map(segment => segment.trim()).filter(Boolean)[0];
2278
+ }
2279
+ return parseIpHeader(headers?.["x-forwarded-for"]) ?? parseIpHeader(headers?.["x-real-ip"]) ?? parseIpHeader(headers?.["X-Forwarded-For"]) ?? parseIpHeader(headers?.["X-Real-IP"]) ?? req.ip;
2280
+ }
2280
2281
  const pendingProviders = new Map;
2281
2282
  function getRegisteredDecafProviders() {
2282
2283
  return Array.from(pendingProviders.values());
@@ -2586,9 +2587,9 @@
2586
2587
  const repo = core.Repository.forModel(m);
2587
2588
  return repo;
2588
2589
  }
2589
- const VERSION = "0.11.2-refactor.2";
2590
- const COMMIT = "85f1cec";
2591
- const FULL_VERSION = "0.11.2-refactor.2-85f1cec";
2590
+ const VERSION = "0.11.2-refactor.3";
2591
+ const COMMIT = "d657fc5";
2592
+ const FULL_VERSION = "0.11.2-refactor.3-d657fc5";
2592
2593
  const PACKAGE_NAME = "@decaf-ts/for-nest";
2593
2594
  decoration.Metadata.allowReregistration(true);
2594
2595
  decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
@@ -2651,4 +2652,4 @@
2651
2652
  exports.resolvePersistenceMethod = resolvePersistenceMethod;
2652
2653
  exports.runMigrations = runMigrations;
2653
2654
  });
2654
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvb3ZlcnJpZGVzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9vdmVycmlkZXMvaGVscGVycy50cyIsIi4uL3NyYy9vdmVycmlkZXMvZGVjb3JhdGlvbi50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0FwaU9wZXJhdGlvbkZyb21Nb2RlbC50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0FwaVBhcmFtc0Zyb21Nb2RlbC50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0RlY2FmQm9keS50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0RlY2FmUGFyYW1zLnRzIiwiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2V4cG9zZS50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2NvbnRyb2xsZXItY29uZmlnLnRzIiwiLi4vc3JjL2F1dGgvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dC50cyIsIi4uL3NyYy9hdXRoL0F1dGhJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9hdXRoL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvZGVjb3JhdG9ycy91dGlscy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC91dGlscy50cyIsIi4uL3NyYy9hdXRoL0RlY2FmQXV0aEhhbmRsZXIudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL292ZXJyaWRlcy50cyIsIi4uL3NyYy9vdmVycmlkZXMvTW9kZWxCdWlsZGVyRXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9pbnRlcmNlcHRvcnMvRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLnRzIiwiLi4vc3JjL2F1dGgvRGVjYWZBdXRoTW9kdWxlLnRzIiwiLi4vc3JjL3JlcXVlc3QvRGVjYWZIYW5kbGVyRXhlY3V0b3IudHMiLCIuLi9zcmMvcmVxdWVzdC9EZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IudHMiLCIuLi9zcmMvY29udHJvbGxlcnMudHMiLCIuLi9zcmMvZmFjdG9yeS9vcGVuYXBpL0R0b0J1aWxkZXIudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvRnJvbU1vZGVsQ29udHJvbGxlci50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9EZWNhZk1vZGVsTW9kdWxlLnRzIiwiLi4vc3JjL2RlY29yYXRpb24udHMiLCIuLi9zcmMvZmFjdG9yeS9lcnJvcnMvY29ycy50cyIsIi4uL3NyYy9mYWN0b3J5L2Vycm9ycy90aHJvdHRsaW5nLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXhjZXB0aW9ucy9EZWNhZkVycm9yRmlsdGVyLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXhjZXB0aW9ucy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9jb25zdGFudHMudHMiLCIuLi9zcmMvZmFjdG9yeS9vcGVuYXBpL1N3YWdnZXJDdXN0b21VSS50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvU3dhZ2dlckJ1aWxkZXIudHMiLCIuLi9zcmMvZmFjdG9yeS9OZXN0Qm9vdHN0cmFwZXIudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9jb3JlLW1vZHVsZS50cyIsIi4uL3NyYy9ldmVudHMtbW9kdWxlL2NvbnN0YW50LnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvdXRpbHMudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS9FdmVudHNDb250cm9sbGVyLnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvRGVjYWZTdHJlYW1Nb2R1bGUudHMiLCIuLi9zcmMvbW9kdWxlLnRzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBERUNPUkFUT1JTX1BSRUZJWCA9IFwic3dhZ2dlclwiO1xuZXhwb3J0IGNvbnN0IERFQ09SQVRPUlMgPSB7XG4gIEFQSV9PUEVSQVRJT046IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlPcGVyYXRpb25gLFxuICBBUElfUkVTUE9OU0U6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlSZXNwb25zZWAsXG4gIEFQSV9QUk9EVUNFUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVByb2R1Y2VzYCxcbiAgQVBJX0NPTlNVTUVTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpQ29uc3VtZXNgLFxuICBBUElfVEFHUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVVzZVRhZ3NgLFxuICBBUElfQ0FMTEJBQ0tTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpQ2FsbGJhY2tzYCxcbiAgQVBJX1BBUkFNRVRFUlM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlQYXJhbWV0ZXJzYCxcbiAgQVBJX0hFQURFUlM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlIZWFkZXJzYCxcbiAgQVBJX01PREVMX1BST1BFUlRJRVM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlNb2RlbFByb3BlcnRpZXNgLFxuICBBUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWTogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU1vZGVsUHJvcGVydGllc0FycmF5YCxcbiAgQVBJX1NFQ1VSSVRZOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpU2VjdXJpdHlgLFxuICBBUElfRVhDTFVERV9FTkRQT0lOVDogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4Y2x1ZGVFbmRwb2ludGAsXG4gIEFQSV9FWENMVURFX0NPTlRST0xMRVI6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeGNsdWRlQ29udHJvbGxlcmAsXG4gIEFQSV9FWFRSQV9NT0RFTFM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeHRyYU1vZGVsc2AsXG4gIEFQSV9FWFRFTlNJT046IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeHRlbnNpb25gLFxuICBBUElfU0NIRU1BOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpU2NoZW1hYCxcbiAgQVBJX0RFRkFVTFRfR0VUVEVSOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpRGVmYXVsdEdldHRlcmAsXG4gIEFQSV9MSU5LOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpTGlua2AsXG59O1xuIiwiaW1wb3J0IHsgaXNBcnJheSwgaXNVbmRlZmluZWQsIG5lZ2F0ZSwgcGlja0J5IH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHsgREVDT1JBVE9SUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgY29uc3QgaXNDb25zdHJ1Y3RvciA9ICh2YWw6IGFueSk6IGJvb2xlYW4gPT4gdmFsID09PSBcImNvbnN0cnVjdG9yXCI7XG5leHBvcnQgY29uc3QgTUVUQURBVEFfRkFDVE9SWV9OQU1FID0gXCJfT1BFTkFQSV9NRVRBREFUQV9GQUNUT1JZXCI7XG5cbmV4cG9ydCBjb25zdCBNRVRIT0RfTUVUQURBVEEgPSBcIm1ldGhvZFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWV0aG9kRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBULFxuICB7IG92ZXJyaWRlRXhpc3RpbmcgfSA9IHsgb3ZlcnJpZGVFeGlzdGluZzogdHJ1ZSB9XG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIGtleTogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuICApID0+IHtcbiAgICBpZiAodHlwZW9mIG1ldGFkYXRhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgaWYgKHByZXZWYWx1ZSAmJiAhb3ZlcnJpZGVFeGlzdGluZykge1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgIH1cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIG1ldGFrZXksXG4gICAgICAgIHsgLi4ucHJldlZhbHVlLCAuLi5tZXRhZGF0YSB9LFxuICAgICAgICBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGEsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2xhc3NEZWNvcmF0b3I8VCBleHRlbmRzIEFycmF5PGFueT4gPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUID0gW10gYXMgYW55XG4pOiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAodGFyZ2V0KSA9PiB7XG4gICAgY29uc3QgcHJldlZhbHVlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQpIHx8IFtdO1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgWy4uLnByZXZWYWx1ZSwgLi4ubWV0YWRhdGFdLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiAoKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksIHRhcmdldCkgfHwgW107XG5cbiAgICBjb25zdCBrZXkgPSBgOiR7cHJvcGVydHlLZXl9YDtcbiAgICBpZiAoIXByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSxcbiAgICAgICAgWy4uLnByb3BlcnRpZXMsIGA6JHtwcm9wZXJ0eUtleX1gXSxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZ01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoZXhpc3RpbmdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBwaWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpO1xuICAgICAgY29uc3QgbWV0YWRhdGFUb1NhdmUgPSBvdmVycmlkZUV4aXN0aW5nXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YVRvU2F2ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPVxuICAgICAgICAodGFyZ2V0Py5jb25zdHJ1Y3RvciBhcyBhbnkpPy5bTUVUQURBVEFfRkFDVE9SWV9OQU1FIGFzIGFueV0/LigpW1xuICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgIF0/LnR5cGUgPz8gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfSkgYXMgUHJvcGVydHlEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNaXhlZERlY29yYXRvcjxUID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVFxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIGtleT86IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApOiBhbnkgPT4ge1xuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICBsZXQgbWV0YWRhdGFzOiBhbnk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YSkpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCBbXTtcbiAgICAgICAgbWV0YWRhdGFzID0gWy4uLnByZXZpb3VzTWV0YWRhdGEsIC4uLm1ldGFkYXRhXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPVxuICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgZGVzY3JpcHRvci52YWx1ZSkgfHwge307XG4gICAgICAgIG1ldGFkYXRhcyA9IHsgLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGEgfTtcbiAgICAgIH1cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YSkpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwgW107XG4gICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQpIHx8IHt9O1xuICAgICAgbWV0YWRhdGFzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2aW91c01ldGFkYXRhKSwgbWV0YWRhdGEpO1xuICAgIH1cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhcywgdGFyZ2V0KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFyYW1EZWNvcmF0b3I8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBhbnk+KFxuICBtZXRhZGF0YTogVCxcbiAgaW5pdGlhbDogUGFydGlhbDxUPlxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICB0YXJnZXQ6IG9iamVjdCB8IEZ1bmN0aW9uLFxuICAgIGtleT86IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApOiBhbnkgPT4ge1xuICAgIGNvbnN0IHBhcmFtT3B0aW9ucyA9IHtcbiAgICAgIC4uLmluaXRpYWwsXG4gICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgIH07XG5cbiAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgY29uc3QgcGFyYW1ldGVycyA9XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUywgZGVzY3JpcHRvci52YWx1ZSkgfHwgW107XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICBbLi4ucGFyYW1ldGVycywgcGFyYW1PcHRpb25zXSxcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldC5wcm90b3R5cGUpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eUtleSBvZiBwcm9wZXJ0eUtleXMpIHtcbiAgICAgIGlmIChpc0NvbnN0cnVjdG9yKHByb3BlcnR5S2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0aG9kRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgIHRhcmdldC5wcm90b3R5cGUsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuXG4gICAgICBpZiAoIW1ldGhvZERlc2NyaXB0b3IpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQXBpTWV0aG9kID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcbiAgICAgICAgTUVUSE9EX01FVEFEQVRBLFxuICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlzQXBpTWV0aG9kKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICAgKSB8fCBbXTtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgIFsuLi5wYXJhbWV0ZXJzLCBwYXJhbU9wdGlvbnNdLFxuICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVJc0FycmF5VHVwbGUoXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgaW5wdXQ6IEZ1bmN0aW9uIHwgW0Z1bmN0aW9uXSB8IHVuZGVmaW5lZCB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGlzQXJyYXlGbGFnOiBib29sZWFuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbik6IFtGdW5jdGlvbiB8IHVuZGVmaW5lZCwgYm9vbGVhbl0ge1xuICBpZiAoIWlucHV0KSB7XG4gICAgcmV0dXJuIFtpbnB1dCBhcyB1bmRlZmluZWQsIGlzQXJyYXlGbGFnXTtcbiAgfVxuICBpZiAoaXNBcnJheUZsYWcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgcmV0dXJuIFtpbnB1dCBhcyBGdW5jdGlvbiwgaXNBcnJheUZsYWddO1xuICB9XG4gIGNvbnN0IGlzSW5wdXRBcnJheSA9IGlzQXJyYXkoaW5wdXQpO1xuICBjb25zdCB0eXBlID0gaXNJbnB1dEFycmF5ID8gaW5wdXRbMF0gOiBpbnB1dDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICByZXR1cm4gW3R5cGUgYXMgRnVuY3Rpb24sIGlzSW5wdXRBcnJheV07XG59XG4iLCJpbXBvcnQgeyBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBpc1N0cmluZywgbmVnYXRlLCBwaWNrQnkgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRUeXBlSXNBcnJheVR1cGxlLCBNRVRBREFUQV9GQUNUT1JZX05BTUUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEVudW1BbGxvd2VkVHlwZXMsXG4gIEVudW1TY2hlbWFBdHRyaWJ1dGVzLFxuICBTY2hlbWFPYmplY3RNZXRhZGF0YSxcbiAgU3dhZ2dlckVudW1UeXBlLFxufSBmcm9tIFwiLi4vc3dhZ2dlci10eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgaXNVbmRlZmluZWQgPSAob2JqOiBhbnkpOiBvYmogaXMgdW5kZWZpbmVkID0+XG4gIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtVmFsdWVzKFxuICBlbnVtVHlwZTogU3dhZ2dlckVudW1UeXBlIHwgKCgpID0+IFN3YWdnZXJFbnVtVHlwZSlcbik6IHN0cmluZ1tdIHwgbnVtYmVyW10ge1xuICBpZiAodHlwZW9mIGVudW1UeXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZ2V0RW51bVZhbHVlcyhlbnVtVHlwZSgpKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGVudW1UeXBlKSkge1xuICAgIHJldHVybiBlbnVtVHlwZSBhcyBzdHJpbmdbXTtcbiAgfVxuICBpZiAodHlwZW9mIGVudW1UeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8vIEVudW1zIHdpdGggbnVtZXJpYyB2YWx1ZXNcbiAgLy8gICBlbnVtIFNpemUge1xuICAvLyAgICAgU01BTEwgPSAxLFxuICAvLyAgICAgQklHID0gMlxuICAvLyAgIH1cbiAgLy8gYXJlIHRyYW5zcGlsZWQgdG8gaW5jbHVkZSBhIHJldmVyc2UgbWFwcGluZ1xuICAvLyAgIGNvbnN0IFNpemUgPSB7XG4gIC8vICAgICBcIjFcIjogXCJTTUFMTFwiLFxuICAvLyAgICAgXCIyXCI6IFwiQklHXCIsXG4gIC8vICAgICBcIlNNQUxMXCI6IDEsXG4gIC8vICAgICBcIkJJR1wiOiAyLFxuICAvLyAgIH1cbiAgY29uc3QgbnVtZXJpY1ZhbHVlcyA9IE9iamVjdC52YWx1ZXMoZW51bVR5cGUpXG4gICAgLmZpbHRlcigodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAubWFwKCh2YWx1ZTogYW55KSA9PiB2YWx1ZS50b1N0cmluZygpKTtcblxuICByZXR1cm4gT2JqZWN0LmtleXMoZW51bVR5cGUpXG4gICAgLmZpbHRlcigoa2V5KSA9PiAhbnVtZXJpY1ZhbHVlcy5pbmNsdWRlcyhrZXkpKVxuICAgIC5tYXAoKGtleSkgPT4gZW51bVR5cGVba2V5IGFzIGFueV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW51bVR5cGUodmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIge1xuICBjb25zdCBoYXNTdHJpbmcgPSB2YWx1ZXMuZmlsdGVyKGlzU3RyaW5nKS5sZW5ndGggPiAwO1xuICByZXR1cm4gaGFzU3RyaW5nID8gXCJzdHJpbmdcIiA6IFwibnVtYmVyXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiAoKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksIHRhcmdldCkgfHwgW107XG5cbiAgICBjb25zdCBrZXkgPSBgOiR7cHJvcGVydHlLZXl9YDtcbiAgICBpZiAoIXByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSxcbiAgICAgICAgWy4uLnByb3BlcnRpZXMsIGA6JHtwcm9wZXJ0eUtleX1gXSxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZ01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoZXhpc3RpbmdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBwaWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpO1xuICAgICAgY29uc3QgbWV0YWRhdGFUb1NhdmUgPSBvdmVycmlkZUV4aXN0aW5nXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YVRvU2F2ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5lc3QganMgY29kZVxuICAgICAgICB0YXJnZXQ/LmNvbnN0cnVjdG9yPy5bTUVUQURBVEFfRkFDVE9SWV9OQU1FXT8uKClbcHJvcGVydHlLZXldPy50eXBlID8/XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgbWV0YWtleSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLCAvLyBEZWZhdWx0IHRvIG9wdGlvbmFsIHVubGVzcyBAcmVxdWlyZWQoKSBpcyB1c2VkXG4gICAgICAgICAgLi4ucGlja0J5KG1ldGFkYXRhLCBuZWdhdGUoaXNVbmRlZmluZWQpKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgKTtcbiAgICB9XG4gIH0pIGFzIFByb3BlcnR5RGVjb3JhdG9yO1xufVxuXG5leHBvcnQgdHlwZSBBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnMgPSBTY2hlbWFPYmplY3RNZXRhZGF0YSAmIHtcbiAgXCJ4LWVudW1OYW1lc1wiPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBMYXp5IGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdHlwZSBmb3Igd2hpY2ggdGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICAgKiBjYW4gYmUgdXNlZCBhcyBhbiBpZFxuICAgKlxuICAgKiBVc2UgdG9nZXRoZXIgd2l0aCBAQXBpRGVmYXVsdEdldHRlciBvbiB0aGUgZ2V0dGVyIHJvdXRlIG9mIHRoZSB0eXBlXG4gICAqIHRvIGdlbmVyYXRlIE9wZW5BUEkgbGluayBvYmplY3RzXG4gICAqXG4gICAqIEBzZWUgW1N3YWdnZXIgbGluayBvYmplY3RzXShodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL2xpbmtzLylcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgbGluaz86ICgpID0+IFR5cGU8dW5rbm93bj4gfCBGdW5jdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIEFwaVByb3BlcnR5T3B0aW9ucyA9XG4gIHwgQXBpUHJvcGVydHlDb21tb25PcHRpb25zXG4gIHwgKEFwaVByb3BlcnR5Q29tbW9uT3B0aW9ucyAmIHtcbiAgICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgICBlbnVtU2NoZW1hPzogRW51bVNjaGVtYUF0dHJpYnV0ZXM7XG4gICAgfSk7XG5cbmNvbnN0IGlzRW51bUFycmF5ID0gKFxuICBvcHRzOiBBcGlQcm9wZXJ0eU9wdGlvbnNcbik6IG9wdHMgaXMge1xuICBpc0FycmF5OiB0cnVlO1xuICBlbnVtOiBFbnVtQWxsb3dlZFR5cGVzO1xuICB0eXBlOiBhbnk7XG4gIGl0ZW1zOiBhbnk7XG59ID0+IChvcHRzLmlzQXJyYXkgJiYgXCJlbnVtXCIgaW4gb3B0cyAmJiBvcHRzLmVudW0gIT09IHVuZGVmaW5lZCkgYXMgYm9vbGVhbjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlQcm9wZXJ0eShcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge31cbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGNyZWF0ZUFwaVByb3BlcnR5RGVjb3JhdG9yKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3IoXG4gIG9wdGlvbnM6IEFwaVByb3BlcnR5T3B0aW9ucyA9IHt9LFxuICBvdmVycmlkZUV4aXN0aW5nID0gdHJ1ZVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICBjb25zdCBbdHlwZSwgaXNBcnJheV0gPSBnZXRUeXBlSXNBcnJheVR1cGxlKFxuICAgIG9wdGlvbnMudHlwZSxcbiAgICBvcHRpb25zLmlzQXJyYXkgYXMgYW55XG4gICk7XG4gIG9wdGlvbnMgPSB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICB0eXBlLFxuICAgIGlzQXJyYXksXG4gIH0gYXMgQXBpUHJvcGVydHlPcHRpb25zO1xuXG4gIGlmIChpc0VudW1BcnJheShvcHRpb25zKSkge1xuICAgIG9wdGlvbnMudHlwZSA9IFwiYXJyYXlcIjtcblxuICAgIGNvbnN0IGVudW1WYWx1ZXMgPSBnZXRFbnVtVmFsdWVzKG9wdGlvbnMuZW51bSk7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IGdldEVudW1UeXBlKGVudW1WYWx1ZXMpLFxuICAgICAgZW51bTogZW51bVZhbHVlcyxcbiAgICB9O1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVzdCBqcyBjb2RlXG4gICAgZGVsZXRlIG9wdGlvbnMuZW51bTtcbiAgfSBlbHNlIGlmIChcImVudW1cIiBpbiBvcHRpb25zICYmIG9wdGlvbnMuZW51bSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcblxuICAgIG9wdGlvbnMuZW51bSA9IGVudW1WYWx1ZXM7XG4gICAgb3B0aW9ucy50eXBlID0gZ2V0RW51bVR5cGUoZW51bVZhbHVlcyk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnR5cGUpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuICAgIG9wdGlvbnMuaXRlbXMgPSB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBpdGVtczoge1xuICAgICAgICB0eXBlOiBvcHRpb25zLnR5cGVbMF0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IoXG4gICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFUyxcbiAgICBvcHRpb25zLFxuICAgIG92ZXJyaWRlRXhpc3RpbmdcbiAgKTtcbn1cbiIsImltcG9ydCB7IGFwcGx5LCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQXBpRXhjbHVkZUVuZHBvaW50IH0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBPcGVyYXRpb25LZXlzLFxuICBDcnVkT3BlcmF0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRGVsZXRlLCBHZXQsIFBhdGNoLCBQb3N0LCBQdXQgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcblxuaW1wb3J0IHsgaXNPcGVyYXRpb25CbG9ja2VkIGFzIGNvcmVJc09wZXJhdGlvbkJsb2NrZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFByZXBhcmVkU3RhdGVtZW50S2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIENSVUQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgZm9yIGEgc3BlY2lmaWMgbW9kZWwgY29uc3RydWN0b3IuXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG9wZXJhdGlvbi1ibG9ja2luZyBoYW5kbGVyIG1ldGFkYXRhIHN0b3JlZCBvbiB0aGUgcHJvdmlkZWQgbW9kZWwgY29uc3RydWN0b3IgKHVuZGVyIGBPcGVyYXRpb25LZXlzLlJFRkxFQ1QgKyBPcGVyYXRpb25LZXlzLkJMT0NLYCksIGV4ZWN1dGVzIGl0IChpZiBwcmVzZW50KSB3aXRoIGl0cyBwZXJzaXN0ZWQgYXJndW1lbnRzIHBsdXMgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24sIGFuZCByZXR1cm5zIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBibG9ja2VkLiBJZiBubyBoYW5kbGVyIGV4aXN0cywgdGhlIG9wZXJhdGlvbiBpcyBjb25zaWRlcmVkIGFsbG93ZWQgKHJldHVybnMgYGZhbHNlYCkuXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3I8YW55Pn0gTW9kZWxDb25zdHJ1Y3RvciAtIFRoZSB0YXJnZXQgbW9kZWwgY29uc3RydWN0b3Igd2hvc2UgbWV0YWRhdGEgbWF5IGluY2x1ZGUgYSBibG9ja2luZyBoYW5kbGVyLlxuICogQHBhcmFtIHtDcnVkT3BlcmF0aW9uc30gb3AgLSBUaGUgQ1JVRCBvcGVyYXRpb24gdG8gZXZhbHVhdGUgKGUuZy4sIGBPcGVyYXRpb25LZXlzLkNSRUFURWAsIGBPcGVyYXRpb25LZXlzLlJFQURgLCBgT3BlcmF0aW9uS2V5cy5VUERBVEVgLCBgT3BlcmF0aW9uS2V5cy5ERUxFVEVgKS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCB3aGVuIHRoZSBvcGVyYXRpb24gaXMgZXhwbGljaXRseSBibG9ja2VkIGJ5IHRoZSBtb2RlbCdzIGhhbmRsZXI7IG90aGVyd2lzZSBgZmFsc2VgLlxuICogQGZ1bmN0aW9uIGlzT3BlcmF0aW9uQmxvY2tlZFxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25kaXRpb25hbGx5IGFwcGxpZXMgYW4gSFRUUCBtZXRob2QgZGVjb3JhdG9yIGZvciBhIGdpdmVuIG1vZGVsIGFuZCB2ZXJiLCBoaWRpbmcgdGhlIGVuZHBvaW50IGluIFN3YWdnZXIgKGFuZCBub3QgcmVnaXN0ZXJpbmcgdGhlIHJvdXRlKSB3aGVuIHRoZSBtb2RlbCBibG9ja3MgdGhhdCBDUlVEIG9wZXJhdGlvbi5cbiAqIEBzdW1tYXJ5IE1hcHMgYW4gSFRUUCB2ZXJiIHRvIGl0cyBjb3JyZXNwb25kaW5nIGBDcnVkT3BlcmF0aW9uc2Aga2V5IGFuZCBOZXN0IEhUVFAgZGVjb3JhdG9yIChgQEdldGAsIGBAUG9zdGAsIGV0Yy4pLiBJdCBjaGVja3MgYGlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCBjcnVkT3ApYCBhbmQsIGlmIGJsb2NrZWQsIGFwcGxpZXMgb25seSBgQEFwaUV4Y2x1ZGVFbmRwb2ludCgpYCAoU3dhZ2dlci1oaWRkZW4sIG5vIE5lc3Qgcm91dGUpLiBJZiBwZXJtaXR0ZWQsIGl0IGFwcGxpZXMgdGhlIGFwcHJvcHJpYXRlIEhUVFAgZGVjb3JhdG9yIHdpdGggdGhlIG9wdGlvbmFsIGBwYXRoYC5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHVzZWQgdG8gcmVzb2x2ZSBvcGVyYXRpb24tYmxvY2tpbmcgcnVsZXMuXG4gKiBAcGFyYW0ge0h0dHBWZXJic30gdmVyYiAtIFRoZSBIVFRQIHZlcmIgdG8gbWFwIChlLmcuLCBgXCJHRVRcIiB8IFwiUE9TVFwiIHwgXCJQVVRcIiB8IFwiUEFUQ0hcIiB8IFwiREVMRVRFXCJgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCByb3V0ZSBwYXRoIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5lc3QgSFRUUCBtZXRob2QgZGVjb3JhdG9yLlxuICogQHJldHVybiB7TWV0aG9kRGVjb3JhdG9yfSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCBlaXRoZXIgZXhjbHVkZXMgdGhlIGVuZHBvaW50IGZyb20gU3dhZ2dlciAoYW5kIHJvdXRlIHJlZ2lzdHJhdGlvbikgb3IgYXBwbGllcyB0aGUgY29ycmVjdCBIVFRQIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChcbiAgTW9kZWxDb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICB2ZXJiOiBIdHRwVmVyYnMsXG4gIHBhdGg/OiBzdHJpbmdcbik6IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxcbiAgICBIdHRwVmVyYnMsXG4gICAgW0NydWRPcGVyYXRpb25zLCAocGF0aD86IHN0cmluZykgPT4gTWV0aG9kRGVjb3JhdG9yXVxuICA+ID0ge1xuICAgIEdFVDogW09wZXJhdGlvbktleXMuUkVBRCwgR2V0XSxcbiAgICBQT1NUOiBbT3BlcmF0aW9uS2V5cy5DUkVBVEUsIFBvc3RdLFxuICAgIFBVVDogW09wZXJhdGlvbktleXMuVVBEQVRFLCBQdXRdLFxuICAgIFBBVENIOiBbT3BlcmF0aW9uS2V5cy5VUERBVEUsIFBhdGNoXSxcbiAgICBERUxFVEU6IFtPcGVyYXRpb25LZXlzLkRFTEVURSwgRGVsZXRlXSxcbiAgfTtcblxuICBjb25zdCBbY3J1ZE9wLCBIdHRwTWV0aG9kRGVjb3JhdG9yXSA9IGh0dHBUb0NydWRbdmVyYl07XG4gIGNvbnN0IHRhcmdldCA9IHJlc29sdmVCbG9ja1RhcmdldCh2ZXJiLCBwYXRoKTtcbiAgcmV0dXJuIHRhcmdldFxuICAgID8gY29yZUlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCB0YXJnZXQua2luZCBhcyBhbnksIHRhcmdldC52YWx1ZSlcbiAgICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgICA6IGFwcGx5KEh0dHBNZXRob2REZWNvcmF0b3IocGF0aCkpXG4gICAgOiBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClcbiAgICA/IGFwcGx5KEFwaUV4Y2x1ZGVFbmRwb2ludCgpKVxuICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25kaXRpb25hbGx5IGFwcGxpZXMgYW4gSFRUUCBtZXRob2QgZGVjb3JhdG9yIGZvciBhIGdpdmVuIG1vZGVsIGFuZCB2ZXJiLCBoaWRpbmcgdGhlIGVuZHBvaW50IGluIFN3YWdnZXIgKGFuZCBub3QgcmVnaXN0ZXJpbmcgdGhlIHJvdXRlKSB3aGVuIHRoZSBtb2RlbCBibG9ja3MgdGhhdCBDUlVEIG9wZXJhdGlvbi5cbiAqIEBzdW1tYXJ5IE1hcHMgYW4gSFRUUCB2ZXJiIHRvIGl0cyBjb3JyZXNwb25kaW5nIGBDcnVkT3BlcmF0aW9uc2Aga2V5IGFuZCBOZXN0IEhUVFAgZGVjb3JhdG9yIChgQEdldGAsIGBAUG9zdGAsIGV0Yy4pLiBJdCBjaGVja3MgYGlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCBjcnVkT3ApYCBhbmQsIGlmIGJsb2NrZWQsIGFwcGxpZXMgb25seSBgQEFwaUV4Y2x1ZGVFbmRwb2ludCgpYCAoU3dhZ2dlci1oaWRkZW4sIG5vIE5lc3Qgcm91dGUpLiBJZiBwZXJtaXR0ZWQsIGl0IGFwcGxpZXMgdGhlIGFwcHJvcHJpYXRlIEhUVFAgZGVjb3JhdG9yIHdpdGggdGhlIG9wdGlvbmFsIGBwYXRoYC5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHVzZWQgdG8gcmVzb2x2ZSBvcGVyYXRpb24tYmxvY2tpbmcgcnVsZXMuXG4gKiBAcGFyYW0ge0h0dHBWZXJic30gdmVyYiAtIFRoZSBIVFRQIHZlcmIgdG8gbWFwIChlLmcuLCBgXCJHRVRcIiB8IFwiUE9TVFwiIHwgXCJQVVRcIiB8IFwiUEFUQ0hcIiB8IFwiREVMRVRFXCJgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCByb3V0ZSBwYXRoIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5lc3QgSFRUUCBtZXRob2QgZGVjb3JhdG9yLlxuICogQHJldHVybiB7TWV0aG9kRGVjb3JhdG9yfSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCBlaXRoZXIgZXhjbHVkZXMgdGhlIGVuZHBvaW50IGZyb20gU3dhZ2dlciAoYW5kIHJvdXRlIHJlZ2lzdHJhdGlvbikgb3IgYXBwbGllcyB0aGUgY29ycmVjdCBIVFRQIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ1bGtBcGlPcGVyYXRpb25Gcm9tTW9kZWwoXG4gIE1vZGVsQ29uc3RydWN0b3I6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgdmVyYjogSHR0cFZlcmJzLFxuICBwYXRoPzogc3RyaW5nXG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICBjb25zdCBodHRwVG9DcnVkOiBSZWNvcmQ8XG4gICAgSHR0cFZlcmJzLFxuICAgIFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3JdXG4gID4gPSB7XG4gICAgR0VUOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLCBHZXRdLFxuICAgIFBPU1Q6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCwgUG9zdF0sXG4gICAgUFVUOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsIFB1dF0sXG4gICAgUEFUQ0g6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgUGF0Y2hdLFxuICAgIERFTEVURTogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLCBEZWxldGVdLFxuICB9O1xuXG4gIGNvbnN0IFtjcnVkT3AsIEh0dHBNZXRob2REZWNvcmF0b3JdID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcbiAgY29uc3QgdGFyZ2V0ID0gcGF0aCA/IHJlc29sdmVCbG9ja1RhcmdldCh2ZXJiLCBwYXRoKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRhcmdldFxuICAgID8gY29yZUlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCB0YXJnZXQua2luZCBhcyBhbnksIHRhcmdldC52YWx1ZSlcbiAgICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgICA6IGFwcGx5KEh0dHBNZXRob2REZWNvcmF0b3IocGF0aCkpXG4gICAgOiBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIFwiYnVsa1wiIGFzIGFueSwgY3J1ZE9wIGFzIGFueSlcbiAgICA/IGFwcGx5KEFwaUV4Y2x1ZGVFbmRwb2ludCgpKVxuICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSk7XG59XG5mdW5jdGlvbiByZXNvbHZlQmxvY2tUYXJnZXQoXG4gIHZlcmI6IEh0dHBWZXJicyxcbiAgcGF0aD86IHN0cmluZ1xuKTogeyBraW5kOiBcImNydWRcIiB8IFwic3RhdGVtZW50XCIgfCBcInF1ZXJ5XCIgfCBcImJ1bGtcIjsgdmFsdWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpO1xuICBjb25zdCBzdGF0ZW1lbnRUYXJnZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwibGlzdEJ5LzprZXlcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksXG4gICAgXCJwYWdpbmF0ZUJ5LzprZXkvOnBhZ2VcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksXG4gICAgXCJmaW5kLzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCxcbiAgICBcInBhZ2UvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLFxuICAgIFwiZmluZE9uZUJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWSxcbiAgICBcImZpbmRCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWSxcbiAgICBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCI6IFwic3RhdGVtZW50XCIsXG4gICAgXCJjb3VudE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YsXG4gICAgXCJtYXhPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRixcbiAgICBcIm1pbk9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLFxuICAgIFwiYXZnT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsXG4gICAgXCJzdW1PZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRixcbiAgICBcImRpc3RpbmN0T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRixcbiAgICBcImdyb3VwT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRixcbiAgfTtcblxuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgcmV0dXJuIHsga2luZDogXCJxdWVyeVwiLCB2YWx1ZTogbm9ybWFsaXplZC5yZXBsYWNlKC9ecXVlcnlcXC8vLCBcIlwiKSB9O1xuICB9XG5cbiAgY29uc3Qgc3RhdGVtZW50VmFsdWUgPSBzdGF0ZW1lbnRUYXJnZXRzW25vcm1hbGl6ZWRdO1xuICBpZiAoc3RhdGVtZW50VmFsdWUpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInN0YXRlbWVudFwiLCB2YWx1ZTogc3RhdGVtZW50VmFsdWUgfTtcbiAgfVxuXG4gIGlmICh2ZXJiID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWQgPT09IFwiXCIpIHtcbiAgICByZXR1cm4geyBraW5kOiBcImNydWRcIiwgdmFsdWU6IE9wZXJhdGlvbktleXMuUkVBRCB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB7IGFwcGx5RGVjb3JhdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXBpUGFyYW0gYXMgQXBpUGFyYW1EZWMgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IERlY2FmQXBpUHJvcGVydHkgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgc2V0IG9mIFN3YWdnZXIgYEBBcGlQYXJhbWAgZGVjb3JhdG9ycyBnZW5lcmF0ZWQgZnJvbSBhIHR5cGVkIHNwZWNpZmljYXRpb24gYXJyYXkuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIGVhY2ggZW50cnkgb2YgdGhlIHByb3ZpZGVkIGBBcGlQYXJhbVtdYCBpbnRvIGEgY29ycmVzcG9uZGluZyBgQEFwaVBhcmFtKClgIGRlY29yYXRvciAoZGVmYXVsdGluZyBgZGVzY3JpcHRpb25gLCBgcmVxdWlyZWRgLCBhbmQgYHR5cGVgIHdoZW4gb21pdHRlZCkgYW5kIGNvbXBvc2VzIHRoZW0gaW50byBhIHNpbmdsZSBkZWNvcmF0b3IgdmlhIE5lc3QncyBgYXBwbHlEZWNvcmF0b3JzYC4gVXNlZnVsIGZvciBzeW5jaHJvbml6aW5nIHJ1bnRpbWUgcm91dGUgcGFyYW1zIHdpdGggT3BlbkFQSSBkb2N1bWVudGF0aW9uIGluIGEgY29uY2lzZSwgZGVjbGFyYXRpdmUgd2F5LlxuICogQHBhcmFtIHtBcGlQYXJhbVtdfSBbcHJvcHM9W11dIEFycmF5IGRlc2NyaWJpbmcgcGF0aCBwYXJhbWV0ZXJzIHRvIGJlIGRvY3VtZW50ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcHNbXS5uYW1lIFRoZSBwYXJhbWV0ZXIncyBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIHJvdXRlIHRlbXBsYXRlIChlLmcuLCBgOmlkYCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BzW10uZGVzY3JpcHRpb25dIEh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXI7IGRlZmF1bHRzIHRvIGBcIlBhdGggcGFyYW1ldGVyOiA8bmFtZT5cImAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wc1tdLnJlcXVpcmVkPXRydWVdIFdoZXRoZXIgdGhlIHBhcmFtZXRlciBpcyByZXF1aXJlZDsgZGVmYXVsdHMgdG8gYHRydWVgLlxuICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBbcHJvcHNbXS50eXBlPVN0cmluZ10gQ29uc3RydWN0b3IvdHlwZSB1c2VkIGJ5IFN3YWdnZXIgdG8gaW5mZXIgc2NoZW1hIChlLmcuLCBgU3RyaW5nYCwgYE51bWJlcmAsIGBVVUlEYCwgY3VzdG9tIGNsYXNzKS5cbiAqIEByZXR1cm4ge2FueX0gQSBjb21wb3NlZCBkZWNvcmF0b3IgYXBwbHlpbmcgYWxsIGdlbmVyYXRlZCBgQEFwaVBhcmFtYCBkZWNvcmF0b3JzIHRvIHRoZSB0YXJnZXQgbWV0aG9kIG9yIGNvbnRyb2xsZXIuXG4gKiBAZnVuY3Rpb24gQXBpUGFyYW1zRnJvbU1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlQYXJhbXNGcm9tTW9kZWwoXG4gIHByb3BzOiBEZWNhZkFwaVByb3BlcnR5W10gPSBbXVxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICBjb25zdCBkZWNvcmF0b3JzID0gcHJvcHMubWFwKChwKSA9PlxuICAgIEFwaVBhcmFtRGVjKHtcbiAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwLmRlc2NyaXB0aW9uID8/IGBQYXRoIHBhcmFtZXRlcjogJHtwLm5hbWV9YCxcbiAgICAgIHJlcXVpcmVkOiBwLnJlcXVpcmVkID8/IHRydWUsXG4gICAgICAvLyBzY2hlbWE6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgIHR5cGU6IHAudHlwZSA/PyBTdHJpbmcsXG4gICAgfSlcbiAgKTtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyguLi5kZWNvcmF0b3JzKTtcbn1cbiIsImltcG9ydCB7XG4gIGNyZWF0ZVBhcmFtRGVjb3JhdG9yLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VzdG9tIGRlY29yYXRvciB0aGF0IGV4dHJhY3RzIHRoZSByZXF1ZXN0IGJvZHkgYW5kIGluc3RhbnRpYXRlcyBpdCB1c2luZyB0aGUgTW9kZWwgY29uc3RydWN0b3JcbiAqIGZvdW5kIG9uIHRoZSBjb250cm9sbGVyLiBIYW5kbGVzIGJvdGggc2luZ2xlIG9iamVjdHMgYW5kIGFycmF5cy5cbiAqL1xuZXhwb3J0IGNvbnN0IERlY2FmQm9keSA9IGNyZWF0ZVBhcmFtRGVjb3JhdG9yKFxuICAoZGF0YTogdW5rbm93biwgY3R4OiBFeGVjdXRpb25Db250ZXh0KSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgYm9keSA9IHJlcXVlc3QuYm9keTtcblxuICAgIC8vIFRoZSBEeW5hbWljTW9kZWxDb250cm9sbGVyIHdpbGwgaGF2ZSAnTW9kZWxDb25zdHInIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBjdHguZ2V0Q2xhc3MoKTtcbiAgICAvLyBXZSBhY2Nlc3MgdGhlIHN0YXRpYyBwcm9wZXJ0eSB3ZSB3aWxsIGFkZCB0byB0aGUgRHluYW1pY01vZGVsQ29udHJvbGxlclxuICAgIGNvbnN0IE1vZGVsQ29uc3RyID0gKGNvbnRyb2xsZXIgYXMgYW55KS5jbGFzcztcblxuICAgIGlmICghTW9kZWxDb25zdHIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKFxuICAgICAgICBgTW9kZWxDb25zdHJ1Y3RvciBub3QgZm91bmQgb24gY29udHJvbGxlciAke2NvbnRyb2xsZXIubmFtZX0uIEVuc3VyZSB0aGUgY29udHJvbGxlciB3YXMgY3JlYXRlZCB2aWEgRnJvbU1vZGVsQ29udHJvbGxlci5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghYm9keSkgcmV0dXJuIGJvZHk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShib2R5KSkge1xuICAgICAgcmV0dXJuIGJvZHkubWFwKChpdGVtKSA9PiBuZXcgTW9kZWxDb25zdHIoaXRlbSkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTW9kZWxDb25zdHIoYm9keSk7XG4gIH1cbik7XG4iLCJpbXBvcnQgeyBjcmVhdGVQYXJhbURlY29yYXRvciwgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZQYXJhbVByb3BzLCBEZWNhZkFwaVByb3BlcnR5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjdXN0b20gTmVzdEpTIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBleHRyYWN0cyBhbmQgcmV0dXJucyByb3V0ZSBwYXJhbWV0ZXJzIG9yZGVyZWQgYnkgYSBzcGVjaWZpYyBrZXkgc2VxdWVuY2UuXG4gKiBAc3VtbWFyeSBUaGUgYE9yZGVyZWRQYXJhbXNgIGRlY29yYXRvciByZWFkcyB0aGUgaW5jb21pbmcgSFRUUCByZXF1ZXN0J3MgYHBhcmFtc2Agb2JqZWN0LCBvcHRpb25hbGx5IG9yZGVycyBpdCBhY2NvcmRpbmcgdG8gYSBwcm92aWRlZCBsaXN0IG9mIHBhcmFtZXRlciBuYW1lcywgYW5kIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIHBhcmFtcywgdGhlIG9yZGVyZWQgdmFsdWVzLCBhbmQgdGhlIGFwcGxpZWQgb3JkZXIgbGlzdC4gVGhpcyBlbnN1cmVzIGRldGVybWluaXN0aWMgcGFyYW1ldGVyIGFjY2VzcyBmb3Igcm91dGVzIHdpdGggbXVsdGlwbGUgcGF0aCBwYXJhbWV0ZXJzLlxuICogQHRlbXBsYXRlIHtzdHJpbmdbXX0gVE9yZGVyIC0gUmVwcmVzZW50cyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2Ugb2YgcGFyYW1ldGVyIG5hbWVzLlxuICogQHBhcmFtIHtUT3JkZXIgfCB1bmRlZmluZWR9IG9yZGVyIEFuIG9wdGlvbmFsIGFycmF5IHNwZWNpZnlpbmcgdGhlIHBhcmFtZXRlciBuYW1lcycgZGVzaXJlZCBvcmRlci4gSWYgbm90IHByb3ZpZGVkLCB0aGUgZGVjb3JhdG9yIHdpbGwgcHJlc2VydmUgdGhlIG9yZGVyIG9mIHRoZSBrZXlzIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBvcmlnaW5hbCBgcmVxLnBhcmFtc2Agb2JqZWN0LlxuICogQHBhcmFtIHtFeGVjdXRpb25Db250ZXh0fSBjdHggVGhlIE5lc3RKUyBleGVjdXRpb24gY29udGV4dCwgdXNlZCB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBIVFRQIHJlcXVlc3Qgb2JqZWN0LlxuICogQHJldHVybiB7RGVjYWZQYXJhbVByb3BzfSBBbiBvYmplY3QgY29udGFpbmluZzpcbiAqIC0gYG9yaWdpbmFsYDogdGhlIHJhdyBwYXJhbWV0ZXIgbWFwIGZyb20gYHJlcS5wYXJhbXNgO1xuICogLSBgb3JkZXJlZGA6IGFuIGFycmF5IG9mIHBhcmFtZXRlciB2YWx1ZXMgaW4gdGhlIHJlcXVlc3RlZCBvcmRlcjtcbiAqIC0gYG9yZGVyYDogdGhlIGVmZmVjdGl2ZSBvcmRlciBsaXN0IHVzZWQuXG4gKiBAZnVuY3Rpb24gT3JkZXJlZFBhcmFtc1xuICovXG5jb25zdCBPcmRlcmVkUGFyYW1zID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChvcmRlcjogc3RyaW5nW10gfCB1bmRlZmluZWQsIGN0eDogRXhlY3V0aW9uQ29udGV4dCk6IERlY2FmUGFyYW1Qcm9wcyA9PiB7XG4gICAgY29uc3QgcmVxID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCBvcmlnaW5hbCA9IChyZXE/LnBhcmFtcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCBvcmRlckxpc3QgPSBvcmRlciA/PyBPYmplY3Qua2V5cyhvcmlnaW5hbCk7XG4gICAgY29uc3Qgb3JkZXJlZCA9IG9yZGVyTGlzdC5tYXAoKGspID0+IG9yaWdpbmFsW2tdKTtcbiAgICByZXR1cm4geyByYXc6IG9yaWdpbmFsLCB2YWx1ZXNJbk9yZGVyOiBvcmRlcmVkLCBrZXlzSW5PcmRlcjogb3JkZXJMaXN0IH07XG4gIH1cbik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgaGlnaGVyLWxldmVsIGRlY29yYXRvciBmYWN0b3J5IHRoYXQgbGV2ZXJhZ2VzIGBPcmRlcmVkUGFyYW1zYCB0byBleHRyYWN0IHJvdXRlIHBhcmFtZXRlcnMgaW4gYSBzcGVjaWZpYyBvcmRlciBkZXJpdmVkIGZyb20gYSBsaXN0IG9mIGBBcGlQYXJhbWAgZGVmaW5pdGlvbnMuXG4gKiBAc3VtbWFyeSBgRGVjYWZQYXJhbXNgIGNvbXB1dGVzIHRoZSBvcmRlciBvZiByb3V0ZSBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBgQXBpUGFyYW1bXWAgc3BlY2lmaWNhdGlvbiAodXNpbmcgZWFjaCBlbGVtZW504oCZcyBgbmFtZWApLCB0aGVuIGFwcGxpZXMgYE9yZGVyZWRQYXJhbXMob3JkZXIpYCBhcyBhIHBhcmFtZXRlciBkZWNvcmF0b3IuIFRoaXMgZW5hYmxlcyBwYXJhbWV0ZXItbGV2ZWwgYmluZGluZyB0aGF0IHJlbWFpbnMgY29uc2lzdGVudCB3aXRoIHRoZSBkb2N1bWVudGVkIEFQSSBwYXJhbWV0ZXIgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge0FwaVBhcmFtW119IFtwcm9wcz1bXV0gQXJyYXkgb2YgYEFwaVBhcmFtYCBkZWZpbml0aW9ucyB3aG9zZSBgbmFtZWAgZmllbGRzIGRldGVybWluZSB0aGUgcGFyYW1ldGVyIGV4dHJhY3Rpb24gb3JkZXIuXG4gKiBAcmV0dXJuIHtQYXJhbWV0ZXJEZWNvcmF0b3J9IEEgTmVzdEpTIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGFuIG9yZGVyZWQgbGlzdCBvZiBwYXJhbWV0ZXJzIGFuZCBtZXRhZGF0YSBpbnRvIHRoZSBjb250cm9sbGVyIG1ldGhvZCBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERlY2FmUGFyYW1zKFxuICBwcm9wczogRGVjYWZBcGlQcm9wZXJ0eVtdID0gW11cbik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gIGNvbnN0IG9yZGVyID0gcHJvcHMubWFwKChwKSA9PiBwLm5hbWUpO1xuICByZXR1cm4gT3JkZXJlZFBhcmFtcyhvcmRlcik7XG59XG5cbmV4cG9ydCBjb25zdCBEZWNhZlF1ZXJ5ID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChfOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gcmVxLnF1ZXJ5ID8/IHt9O1xuXG4gICAgY29uc3QgcGFyc2VkOiBhbnkgPSB7IC4uLnF1ZXJ5IH07XG5cbiAgICAvLyBQYXJzZSBsaW1pdCAmIG9mZnNldFxuICAgIGlmIChwYXJzZWQubGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQubGltaXQpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIHBhcnNlZC5saW1pdCA9IG47XG4gICAgfVxuXG4gICAgaWYgKHBhcnNlZC5vZmZzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQub2Zmc2V0KTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKG4pKSBwYXJzZWQub2Zmc2V0ID0gbjtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBib29rbWFyayBvbmx5IGlmIG51bWVyaWNcbiAgICBpZiAocGFyc2VkLmJvb2ttYXJrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG4gPSBOdW1iZXIocGFyc2VkLmJvb2ttYXJrKTtcbiAgICAgIHBhcnNlZC5ib29rbWFyayA9IE51bWJlci5pc05hTihuKSA/IHBhcnNlZC5ib29rbWFyayA6IG47XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuKTtcbiIsImltcG9ydCB7IEFkYXB0ZXJGbGFncywgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9NT0RVTEVfT1BUSU9OUyA9IFwiRGVjYWZNb2R1bGVPcHRpb25zXCI7XG5leHBvcnQgY29uc3QgREVDQUZfQURBUFRFUl9JRCA9IFwiRGVjYWZBZGFwdGVyXCI7XG5leHBvcnQgY29uc3QgREVDQUZfVEFTS19TRVJWSUNFX0lEID0gXCJEZWNhZlRhc2tTZXJ2aWNlXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9ST1VURSA9IFwiRGVjYWZSb3V0ZVwiO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0hBTkRMRVJTID0gU3ltYm9sKFwiRGVjYWZIYW5kbGVyc1wiKTtcbmV4cG9ydCBjb25zdCBERUNBRl9FWFBPU0UgPSBcIkRlY2FmRXhwb3NlXCI7XG5leHBvcnQgY29uc3QgREVDQUZfQ09OVFJPTExFUl9DT05GSUcgPSBcIkRlY2FmQ29udHJvbGxlckNvbmZpZ1wiO1xuXG5leHBvcnQgY29uc3QgREVDQUZfQ09OVEVYVF9LRVkgPSBTeW1ib2woXCJkZWNhZjpjb250ZXh0XCIpO1xuXG5leHBvcnQgdHlwZSBEZWNhZlNlcnZlckZsYWdzPExPRyBleHRlbmRzIExvZ2dlciA9IExvZ2dlcj4gPVxuICBBZGFwdGVyRmxhZ3M8TE9HPiAmIHtcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG92ZXJyaWRlczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGVjYWZTZXJ2ZXJDdHggPSBDb250ZXh0PERlY2FmU2VydmVyRmxhZ3M+O1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuaW1wb3J0IHsgREVDQUZfRVhQT1NFIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3NlKC4uLmZsYXZvdXJzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gZnVuY3Rpb24gZXhwb3NlKHRhcmdldDogYW55KSB7XG4gICAgTWV0YWRhdGEuc2V0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgREVDQUZfRVhQT1NFLFxuICAgICAgKGZsYXZvdXJzLmxlbmd0aCA/IGZsYXZvdXJzIDogdHJ1ZSkgYXMgYW55XG4gICAgKTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmltcG9ydCB7IERFQ0FGX0NPTlRST0xMRVJfQ09ORklHIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIENsYXNzIGRlY29yYXRvciB0aGF0IGF0dGFjaGVzIGEge0BsaW5rIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWd9IHRvIGEgTW9kZWwsXG4gKiBzbyBgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGUoKWAgY2FuIHBhc3MgaXQgdG8gYE1vZGVsQ29udHJvbGxlckZhY3RvcnkuY3JlYXRlKClgLlxuICpcbiAqIFRoZSBwZXItbW9kZWwgY29uZmlnIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBtb2R1bGUtbGV2ZWwgYGNvbnRyb2xsZXJDb25maWdgXG4gKiBvcHRpb24gaW4gYERlY2FmTW9kdWxlT3B0aW9uc2AuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBAY29udHJvbGxlckNvbmZpZyh7IGFsbG93R3JvdXBpbmdRdWVyaWVzOiB0cnVlLCBhbGxvd0J1bGtTdGF0ZW1lbnQ6IHsgY3JlYXRlOiB0cnVlLCByZWFkOiB0cnVlLCB1cGRhdGU6IGZhbHNlLCBkZWxldGU6IHRydWUgfSB9KVxuICogQG1vZGVsKClcbiAqIGNsYXNzIE9yZGVyIGV4dGVuZHMgTW9kZWw8T3JkZXI+IHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBGYWN0b3J5IGNvbmZpZ3VyYXRpb24ga25vYnMgKGFsbG93U3RhdGVtZW50bGVzc1F1ZXJ5LCBhbGxvd0dyb3VwaW5nUXVlcmllcywgYWxsb3dCdWxrU3RhdGVtZW50KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyb2xsZXJDb25maWcoY29uZmlnOiBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb250cm9sbGVyQ29uZmlnRGVjb3JhdG9yKHRhcmdldDogYW55KSB7XG4gICAgTWV0YWRhdGEuc2V0KHRhcmdldCwgREVDQUZfQ09OVFJPTExFUl9DT05GSUcsIGNvbmZpZyBhcyBhbnkpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG4iLCJleHBvcnQgY29uc3QgQVVUSF9IQU5ETEVSID0gU3ltYm9sKFwiQVVUSF9IQU5ETEVSXCIpO1xuZXhwb3J0IGNvbnN0IEFVVEhfTUVUQV9LRVkgPSBcImF1dGg6bWV0YVwiO1xuZXhwb3J0IGNvbnN0IElTX1BVQkxJQ19LRVkgPSBcImlzUHVibGljXCI7XG5leHBvcnQgY29uc3QgUkVRVUlSRURfUk9MRVNfS0VZID0gXCJyZXF1aXJlZFJvbGVzXCI7XG5leHBvcnQgY29uc3QgU0tJUF9NT0RFTF9ST0xFU19LRVkgPSBcInNraXBNb2RlbFJvbGVzXCI7XG4iLCJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBSRVFVRVNUIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHsgVVVJRCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0IH0gZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJDdHggfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZlJlcXVlc3RDb250ZXh0PEMgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4PiBleHRlbmRzIFJlcXVlc3RDb250ZXh0PFJlcXVlc3Q+IHtcbiAgdXVpZCA9IFVVSUQuaW5zdGFuY2UuZ2VuZXJhdGUoKTtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFJFUVVFU1QpIHByaXZhdGUgcmVhZG9ubHkgcmVxOiBSZXF1ZXN0KSB7XG4gICAgc3VwZXIoXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnNPZjogKHJlcXVlc3Q6IFJlcXVlc3QpID0+IChyZXF1ZXN0IGFzIGFueSk/LmhlYWRlcnMgfHwgdW5kZWZpbmVkLFxuICAgICAgfSBhcyBhbnksXG4gICAgICByZXFcbiAgICApO1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcTtcbiAgfVxuXG4gIHB1dChyZWNvcmQ6IFJlY29yZDxhbnksIGFueT4pIHtcbiAgICBsZXQgb3ZlcnJpZGVzOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIG92ZXJyaWRlcyA9IHRoaXMuZ2V0KFwib3ZlcnJpZGVzXCIpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIG92ZXJyaWRlcyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMuYWNjdW11bGF0ZSh7XG4gICAgICBvdmVycmlkZXM6IE9iamVjdC5hc3NpZ24ob3ZlcnJpZGVzLCByZWNvcmQpLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIENhbGxIYW5kbGVyLFxuICBJbmplY3QsXG4gIE9wdGlvbmFsLFxuICBTY29wZSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBSZWZsZWN0b3IgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmltcG9ydCB7IEFVVEhfSEFORExFUiwgQVVUSF9NRVRBX0tFWSwgSVNfUFVCTElDX0tFWSwgUkVRVUlSRURfUk9MRVNfS0VZLCBTS0lQX01PREVMX1JPTEVTX0tFWSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoSGFuZGxlciB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0L0RlY2FmUmVxdWVzdENvbnRleHRcIjtcblxuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIEF1dGhJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE5lc3RJbnRlcmNlcHRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVmbGVjdG9yOiBSZWZsZWN0b3IsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlcXVlc3RDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVVUSF9IQU5ETEVSKSBwcml2YXRlIHJlYWRvbmx5IGF1dGhIYW5kbGVyPzogQXV0aEhhbmRsZXJcbiAgKSB7fVxuXG4gIGFzeW5jIGludGVyY2VwdChcbiAgICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gICAgbmV4dDogQ2FsbEhhbmRsZXJcbiAgKTogUHJvbWlzZTxPYnNlcnZhYmxlPGFueT4+IHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzIGFzIGFueSkuZm9yKHRoaXMuaW50ZXJjZXB0KTtcblxuICAgIGNvbnN0IGlzUHVibGljID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8Ym9vbGVhbj4oSVNfUFVCTElDX0tFWSwgW1xuICAgICAgY3R4LmdldEhhbmRsZXIoKSxcbiAgICAgIGN0eC5nZXRDbGFzcygpLFxuICAgIF0pO1xuXG4gICAgY29uc3QgbW9kZWxOYW1lID1cbiAgICAgIHRoaXMucmVmbGVjdG9yLmdldDxzdHJpbmcgfCBDb25zdHJ1Y3Rvcj4oXG4gICAgICAgIEFVVEhfTUVUQV9LRVksXG4gICAgICAgIGN0eC5nZXRIYW5kbGVyKClcbiAgICAgICkgPz9cbiAgICAgIHRoaXMucmVmbGVjdG9yLmdldDxzdHJpbmcgfCBDb25zdHJ1Y3Rvcj4oQVVUSF9NRVRBX0tFWSwgY3R4LmdldENsYXNzKCkpO1xuXG4gICAgY29uc3QgcmVxdWlyZWRSb2xlcyA9IHRoaXMucmVmbGVjdG9yLmdldEFsbEFuZE92ZXJyaWRlPHN0cmluZ1tdPihcbiAgICAgIFJFUVVJUkVEX1JPTEVTX0tFWSxcbiAgICAgIFtjdHguZ2V0SGFuZGxlcigpLCBjdHguZ2V0Q2xhc3MoKV1cbiAgICApO1xuXG4gICAgY29uc3Qgc2tpcE1vZGVsUm9sZXMgPSB0aGlzLnJlZmxlY3Rvci5nZXRBbGxBbmRPdmVycmlkZTxib29sZWFuPihcbiAgICAgIFNLSVBfTU9ERUxfUk9MRVNfS0VZLFxuICAgICAgW2N0eC5nZXRIYW5kbGVyKCksIGN0eC5nZXRDbGFzcygpXVxuICAgICk7XG5cbiAgICBjb25zdCBlZmZlY3RpdmVNb2RlbCA9IHNraXBNb2RlbFJvbGVzID8gdW5kZWZpbmVkIDogbW9kZWxOYW1lO1xuXG4gICAgbG9nLnZlcmJvc2UoYEludGVyY2VwdGVkIHJlcXVlc3Qke21vZGVsTmFtZSA/IGAgZm9yICR7bW9kZWxOYW1lfWAgOiBcIlwifWApO1xuXG4gICAgaWYgKGlzUHVibGljKSB7XG4gICAgICBsb2cuZGVidWcoYFB1YmxpYyByb3V0ZSDigJQgc2tpcHBpbmcgYXV0aGApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hdXRoSGFuZGxlcikge1xuICAgICAgYXdhaXQgdGhpcy5hdXRoSGFuZGxlci5hdXRob3JpemUoXG4gICAgICAgIGN0eCxcbiAgICAgICAgZWZmZWN0aXZlTW9kZWwgYXMgc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICAgIHJlcXVpcmVkUm9sZXMsXG4gICAgICAgIHRoaXMucmVxdWVzdENvbnRleHRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZyhgTm8gYXV0aCBoYW5kbGVyIHJlZ2lzdGVyZWRgKTtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2Zvcm1lcnMgcnVuIEFGVEVSIGF1dGggc28gdGhleSBjYW4gcmVhZCBhdXRoLXBvcHVsYXRlZCBmaWVsZHNcbiAgICAvLyAoZS5nLiBgdXNlcmApIGZyb20gdGhlIGNvbnRleHQgYW5kIG1hcCB0aGVtIHRvIGFkYXB0ZXItc3BlY2lmaWMga2V5c1xuICAgIC8vIChlLmcuIGBVVUlEYCBmb3IgUmFtQWRhcHRlcidzIEBjcmVhdGVkQnkvQHVwZGF0ZWRCeSBoYW5kbGVycykuXG4gICAgYXdhaXQgdGhpcy5hcHBseVRyYW5zZm9ybWVycygpO1xuXG4gICAgY29uc3QgdXNlciA9IHRoaXMucmVxdWVzdENvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJ1c2VyXCIgYXMgYW55KTtcbiAgICBjb25zdCBvcmdhbml6YXRpb24gPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldE9yVW5kZWZpbmVkKFwib3JnYW5pemF0aW9uXCIgYXMgYW55KTtcbiAgICBpZiAodXNlciB8fCBvcmdhbml6YXRpb24pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMb2cgPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldChcImxvZ2dlclwiIGFzIGFueSk7XG4gICAgICBjb25zdCBjaGlsZExvZyA9IGN1cnJlbnRMb2cuZm9yKHsgdXNlciwgb3JnYW5pemF0aW9uIH0pO1xuICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKHsgbG9nZ2VyOiBjaGlsZExvZyB9IGFzIGFueSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYXBwbHlUcmFuc2Zvcm1lcnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmxhdm91cnMgPSBBZGFwdGVyLmZsYXZvdXJzVG9UcmFuc2Zvcm0oKTtcbiAgICBpZiAoIWZsYXZvdXJzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGZsYXZvdXIgb2YgZmxhdm91cnMpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gQWRhcHRlci50cmFuc2Zvcm1lckZvcihcbiAgICAgICAgZmxhdm91clxuICAgICAgKSBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PjtcbiAgICAgIGlmICghdHJhbnNmb3JtZXIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZnJvbSA9IGF3YWl0IHRyYW5zZm9ybWVyLmZyb20odGhpcy5yZXF1ZXN0Q29udGV4dCk7XG4gICAgICBpZiAoZnJvbSkgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKGZyb20pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgYXBwbHlEZWNvcmF0b3JzLCBTZXRNZXRhZGF0YSwgVXNlSW50ZXJjZXB0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBcGlCZWFyZXJBdXRoLCBBcGlTZWN1cml0eSB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbmltcG9ydCB7IEFVVEhfTUVUQV9LRVksIElTX1BVQkxJQ19LRVksIFJFUVVJUkVEX1JPTEVTX0tFWSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXV0aEludGVyY2VwdG9yIH0gZnJvbSBcIi4vQXV0aEludGVyY2VwdG9yXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBBdXRoKG1vZGVsPzogc3RyaW5nIHwgQ29uc3RydWN0b3IpIHtcbiAgY29uc3QgcmVzb3VyY2UgPSBtb2RlbFxuICAgID8gdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiXG4gICAgICA/IG1vZGVsXG4gICAgICA6IG1vZGVsLm5hbWVcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZGVjcyA9IFtBcGlCZWFyZXJBdXRoKCksIFVzZUludGVyY2VwdG9ycyhBdXRoSW50ZXJjZXB0b3IpXTtcbiAgaWYgKHJlc291cmNlKSBkZWNzLnB1c2goU2V0TWV0YWRhdGEoQVVUSF9NRVRBX0tFWSwgcmVzb3VyY2UpKTtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyguLi5kZWNzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFB1YmxpYygpIHtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyhTZXRNZXRhZGF0YShJU19QVUJMSUNfS0VZLCB0cnVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXF1aXJlUm9sZXMoLi4ucm9sZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBhcHBseURlY29yYXRvcnMoXG4gICAgQXBpU2VjdXJpdHkoXCJiZWFyZXJcIiksXG4gICAgU2V0TWV0YWRhdGEoUkVRVUlSRURfUk9MRVNfS0VZLCByb2xlcyksXG4gICAgVXNlSW50ZXJjZXB0b3JzKEF1dGhJbnRlcmNlcHRvcilcbiAgKTtcbn1cbiIsImltcG9ydCB7IERlbGV0ZSwgR2V0LCBQYXRjaCwgUG9zdCwgUHV0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIE1hcHMgYW4gSFRUUCB2ZXJiIHRvIGl0cyBjb3JyZXNwb25kaW5nIE5lc3RKUyBtZXRob2QgZGVjb3JhdG9yLlxuICpcbiAqIEBwYXJhbSB2ZXJiIC0gSFRUUCB2ZXJiIHRvIGJlIGNvbnZlcnRlZCAoZS5nLiBHRVQsIFBPU1QsIFBVVCwgUEFUQ0gsIERFTEVURSkuXG4gKiBAcmV0dXJucyBBIE5lc3RKUyBtZXRob2QgZGVjb3JhdG9yIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBIVFRQIHZlcmIuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwcm92aWRlZCBIVFRQIHZlcmIgaXMgbm90IHN1cHBvcnRlZCBvciBub3QgbWFwcGVkXG4gKiB0byBhIE5lc3RKUyBkZWNvcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBIdHRwVmVyYlRvRGVjb3JhdG9yKFxuICB2ZXJiOiBIdHRwVmVyYnNcbik6IChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3Ige1xuICBjb25zdCBodHRwVG9DcnVkOiBSZWNvcmQ8SHR0cFZlcmJzLCAocGF0aD86IHN0cmluZykgPT4gTWV0aG9kRGVjb3JhdG9yPiA9IHtcbiAgICBHRVQ6IEdldCxcbiAgICBQT1NUOiBQb3N0LFxuICAgIFBVVDogUHV0LFxuICAgIFBBVENIOiBQYXRjaCxcbiAgICBERUxFVEU6IERlbGV0ZSxcbiAgfTtcblxuICBjb25zdCBkZWNvcmF0b3IgPSBodHRwVG9DcnVkW3ZlcmJdO1xuXG4gIGlmICghZGVjb3JhdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFVuc3VwcG9ydGVkIEhUVFAgdmVyYiBcIiR7dmVyYn1cIi4gTm8gTmVzdEpTIGRlY29yYXRvciBtYXBwaW5nIHdhcyBmb3VuZC5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBkZWNvcmF0b3I7XG59XG4iLCJpbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyB0eXBlIERlY29yYXRvckJ1bmRsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBBcGlOb0NvbnRlbnRSZXNwb25zZSxcbiAgQXBpT2tSZXNwb25zZSxcbiAgQXBpT3BlcmF0aW9uLFxuICBBcGlQYXJhbSxcbiAgQXBpUXVlcnksXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIERlY2FmQXBpUHJvcGVydHksXG4gIHR5cGUgRGVjYWZQYXJhbVByb3BzLFxuICBEZWNhZlBhcmFtcyxcbn0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3R5cGVzXCI7XG5pbXBvcnQge1xuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgTW9kZWxTZXJ2aWNlLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUmVwbyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEh0dHBWZXJiVG9EZWNvcmF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3V0aWxzXCI7XG5pbXBvcnQgeyBEZWNhZk1vZGVsQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyc1wiO1xuXG5jb25zdCBleHRyYWN0UGF0aFBhcmFtcyA9IChyb3V0ZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgcmV0dXJuIHJvdXRlUGF0aFxuICAgIC5zcGxpdChcIi9cIilcbiAgICAuZmlsdGVyKChwKSA9PiBwLnN0YXJ0c1dpdGgoXCI6XCIpKVxuICAgIC5tYXAoKHApID0+IHAuc2xpY2UoMSkpO1xufTtcblxuY29uc3QgYXBpUGFyYW1TcGVjID0gKG5hbWU6IHN0cmluZyk6IERlY2FmQXBpUHJvcGVydHkgPT4gKHtcbiAgbmFtZSxcbiAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgcmVxdWlyZWQ6IHRydWUsXG4gIHR5cGU6IFN0cmluZyxcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBpRGVjb3JhdG9ycyhcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICByb3V0ZVBhdGg6IHN0cmluZyxcbiAgaHR0cFZlcmI6IEh0dHBWZXJicyxcbiAgaW5jbHVkZVF1ZXJ5UGFyYW1zOiBib29sZWFuID0gZmFsc2Vcbik6IERlY29yYXRvckJ1bmRsZSB7XG4gIGNvbnN0IE5lc3RIdHRwUm91dGVEZWMgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKGh0dHBWZXJiKTtcbiAgY29uc3QgYXBpUGF0aFBhcmFtcyA9IGV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlUGF0aCkubWFwKGFwaVBhcmFtU3BlYyk7XG5cbiAgY29uc3Qgc3dhZ2dlclF1ZXJ5UGFyYW1zID0gW107XG4gIGlmIChodHRwVmVyYiA9PT0gXCJHRVRcIiAmJiBpbmNsdWRlUXVlcnlQYXJhbXMpIHtcbiAgICBzd2FnZ2VyUXVlcnlQYXJhbXMucHVzaChcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXIgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJsaW1pdFwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZSB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcIm9mZnNldFwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFyayB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiBbXG4gICAgICBOZXN0SHR0cFJvdXRlRGVjKHJvdXRlUGF0aCksXG4gICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcChBcGlQYXJhbSksXG4gICAgICAuLi5zd2FnZ2VyUXVlcnlQYXJhbXMsXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBhY2NvcmRpbmcgdG8gXCIke21ldGhvZE5hbWV9XCIuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUmVzdWx0IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vIGNvbnRlbnQgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC5gLFxuICAgICAgfSksXG4gICAgXSxcbiAgICBwYXJhbXM6IFtEZWNhZlBhcmFtcyhhcGlQYXRoUGFyYW1zKSwgUXVlcnkoKV0sIC8vICwgRGVjYWZCb2R5KCldLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBcGlEZWNvcmF0b3JzKFxuICB0YXJnZXQ6IGFueSxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGRlY29yYXRvcnM6IERlY29yYXRvckJ1bmRsZVxuKSB7XG4gIGNvbnN0IHByb3RvID0gdGFyZ2V0Py5wcm90b3R5cGUgPz8gdGFyZ2V0O1xuICBkZWNvcmF0b3JzLm1ldGhvZC5mb3JFYWNoKChkKSA9PiBkKHByb3RvLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSk7XG4gIGRlY29yYXRvcnMucGFyYW1zPy5mb3JFYWNoKChkLCBpbmRleCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgaW5kZXgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZDxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICBwZXJzaXN0ZW5jZTogUmVwbzxUPiB8IE1vZGVsU2VydmljZTxUPixcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAuLi5hcmdzOiBhbnlbXVxuKTogYW55IHtcbiAgaWYgKHBlcnNpc3RlbmNlIGluc3RhbmNlb2YgTW9kZWxTZXJ2aWNlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gICAgICA6IHBlcnNpc3RlbmNlLnN0YXRlbWVudChtZXRob2ROYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0oLi4uYXJncyk7XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBQZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfWBcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlSGFuZGxlcjxUPihtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChcbiAgICB0aGlzOiBEZWNhZk1vZGVsQ29udHJvbGxlcjxhbnk+LFxuICAgIHBhdGhQYXJhbXM6IERlY2FmUGFyYW1Qcm9wcyxcbiAgICBxdWVyeVBhcmFtczogRGlyZWN0aW9uTGltaXRPZmZzZXRcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgbG9nOiBMb2dnZXIgPSB0aGlzLmxvZy5mb3IobWV0aG9kTmFtZSk7XG5cbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgSW52b2tpbmcgcGVyc2lzdGVuY2UgbWV0aG9kIFwiJHttZXRob2ROYW1lfVwiIGdpdmVuIHBhcmFtZXRlcnM6ICR7SlNPTi5zdHJpbmdpZnkocGF0aFBhcmFtcy52YWx1ZXNJbk9yZGVyKX1gXG4gICAgICApO1xuICAgICAgY29uc3QgeyBkaXJlY3Rpb24sIGxpbWl0LCBvZmZzZXQgfSA9IHF1ZXJ5UGFyYW1zO1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZChcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZSgpLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAuLi5wYXRoUGFyYW1zLnZhbHVlc0luT3JkZXIsXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgbGltaXQsXG4gICAgICAgIG9mZnNldFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGxvZy5lcnJvcihgQ3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiIGZhaWxlZGAsIGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSb3V0ZU1ldGhvZChcbiAgQ29udHJvbGxlckNsYXNzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbik6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lLFxuICAgIHtcbiAgICAgIHZhbHVlOiBoYW5kbGVyLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH1cbiAgKTtcblxuICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lXG4gICk7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhIYW5kbGVyLCBBdXRoRGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG4vKipcbiAqIFNpbXBsZSBhdXRoIGhhbmRsZXIgdGhhdCByZWFkcyBhIHJvbGUgc3RyaW5nIGZyb20gdGhlIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPHJvbGU+YCBoZWFkZXIuXG4gKlxuICogT25seSBvdmVycmlkZXMge0BsaW5rIEF1dGhIYW5kbGVyLmV4dHJhY3RGcm9tQXV0aH0gdG8gcmV0dXJuIHRoZSBiZWFyZXIgdG9rZW4gYXNcbiAqIGJvdGggdGhlIHVzZXIgaWRlbnRpZmllciBhbmQgdGhlIHNpbmdsZSByb2xlLiBUaGUgYmFzZSBjbGFzcyBgYmluZFRvQ29udGV4dGBcbiAqIChgY3R4LmFjY3VtdWxhdGUoZGF0YSlgKSBpcyBzdWZmaWNpZW50IOKAlCB0aGUgdHJhbnNmb3JtZXIvYWRhcHRlciBpcyByZXNwb25zaWJsZVxuICogZm9yIG1hcHBpbmcgY29udGV4dCBmaWVsZHMgdG8gYWRhcHRlci1zcGVjaWZpYyBrZXlzIGxpa2UgYFVVSURgLlxuICovXG5leHBvcnQgY2xhc3MgRGVjYWZBdXRoSGFuZGxlciBleHRlbmRzIEF1dGhIYW5kbGVyPFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICBBdXRoRGF0YVxuPiB7XG4gIHByb3RlY3RlZCBwYXJzZVJlcXVlc3QocmVxOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJSb2xlID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoXCIgXCIpWzFdIGFzIHN0cmluZztcbiAgICByZXR1cm4gdXNlclJvbGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZXh0cmFjdEZyb21BdXRoKGN0eDogRXhlY3V0aW9uQ29udGV4dCk6IEF1dGhEYXRhIHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHVzZXJSb2xlID0gdGhpcy5wYXJzZVJlcXVlc3QocmVxKTtcbiAgICBpZiAoIXVzZXJSb2xlKSB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFwiVW5hdXRoZW50aWNhdGVkXCIpO1xuICAgIHJldHVybiB7IHVzZXI6IHVzZXJSb2xlLCByb2xlczogW3VzZXJSb2xlXSB9O1xuICB9XG59XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBEZWNhZkF1dGhIYW5kbGVyfSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICogVGhlIFwicm9sZVwiIHZhcmlhbnQgcHJldmlvdXNseSByZXR1cm5lZCByb2xlcyBmcm9tIGBhdXRob3JpemVgOyB3aXRoIHRoZSBiYXNlXG4gKiBjbGFzcyBub3cgb3JjaGVzdHJhdGluZyByb2xlIGNoZWNrcyBpbnRlcm5hbGx5LCB0aGUgdHdvIGNsYXNzZXMgYXJlIGVxdWl2YWxlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNhZlJvbGVBdXRoSGFuZGxlciBleHRlbmRzIERlY2FmQXV0aEhhbmRsZXIge31cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIENvbnRleHRPZiwgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG4oQWRhcHRlciBhcyBhbnkpLnRyYW5zZm9ybWVyRm9yID0gZnVuY3Rpb24gdG9Db250ZXh0RmxhZ3M8XG4gIEEgZXh0ZW5kcyBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4sXG4+KGFkYXB0ZXI6IEEgfCBzdHJpbmcpOiBDb25zdHJ1Y3RvcjxSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8Q29udGV4dE9mPEE+Pj4ge1xuICBjb25zdCBhbGlhcyA9XG4gICAgdHlwZW9mIGFkYXB0ZXIgPT09IFwic3RyaW5nXCIgPyBhZGFwdGVyIDogKGFkYXB0ZXIuYWxpYXMgYXMgc3RyaW5nKTtcbiAgcmV0dXJuIE1ldGFkYXRhW1wiaW5uZXJHZXRcIl0oU3ltYm9sLmZvcihcInRyYW5zZm9ybWVyc1wiKSwgYWxpYXMpO1xufS5iaW5kKEFkYXB0ZXIpO1xuXG4oQWRhcHRlciBhcyBhbnkpLmZsYXZvdXJzVG9UcmFuc2Zvcm0gPSBmdW5jdGlvbiByZXF1ZXN0VHJhbnNmb3JtZXJzKCk6XG4gIHwgc3RyaW5nW11cbiAgfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXRhID0gTWV0YWRhdGFbXCJpbm5lckdldFwiXShTeW1ib2wuZm9yKFwidHJhbnNmb3JtZXJzXCIpKTtcbiAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gT2JqZWN0LmtleXMobWV0YSk7XG59LmJpbmQoQWRhcHRlcik7XG5cbihDb250ZXh0IGFzIGFueSkucHJvdG90eXBlLnRvUmVzcG9uc2UgPSBmdW5jdGlvbiB0b1Jlc3BvbnNlPFxuICBSRVMgZXh0ZW5kcyB7IGhlYWRlcjogYW55IH0sXG4+KHRoaXM6IENvbnRleHQsIHJlczogUkVTKTogUkVTIHtcbiAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZygpO1xuICBpZiAocGVuZGluZykgcmVzLmhlYWRlcihcIngtcGVuZGluZy10YXNrXCIsIEpTT04uc3RyaW5naWZ5KHBlbmRpbmcpKTtcbiAgcmV0dXJuIHJlcztcbn07XG4iLCJpbXBvcnQgXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbEJ1aWxkZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSBcIi4uL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvZGVjb3JhdG9yc1wiO1xuXG5kZWNsYXJlIG1vZHVsZSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiIHtcbiAgZXhwb3J0IGludGVyZmFjZSBNb2RlbEJ1aWxkZXI8TT4ge1xuICAgIEF1dGgobW9kZWw6IHN0cmluZyB8IENvbnN0cnVjdG9yKTogTW9kZWxCdWlsZGVyPE0+O1xuICAgIGRlY29yYXRlQ2xhc3MoZGVjb3JhdG9yOiBDbGFzc0RlY29yYXRvcik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgfVxufVxuXG5jb25zdCBwcm90b3R5cGUgPSBNb2RlbEJ1aWxkZXIucHJvdG90eXBlIGFzIE1vZGVsQnVpbGRlcjxhbnk+ICYge1xuICBBdXRoOiAobW9kZWw6IHN0cmluZyB8IENvbnN0cnVjdG9yKSA9PiBNb2RlbEJ1aWxkZXI8YW55Pjtcbn07XG5cbmlmICghcHJvdG90eXBlLmRlY29yYXRlQ2xhc3MpIHtcbiAgcHJvdG90eXBlLmRlY29yYXRlQ2xhc3MgPSBmdW5jdGlvbiAoZGVjb3JhdG9yOiBDbGFzc0RlY29yYXRvcikge1xuICAgIGlmICghKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzKSB7XG4gICAgICAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMgPSBbXTtcbiAgICB9XG4gICAgKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzLnB1c2goZGVjb3JhdG9yKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxucHJvdG90eXBlLkF1dGggPSBmdW5jdGlvbiAobW9kZWw6IHN0cmluZyB8IENvbnN0cnVjdG9yKSB7XG4gIHJldHVybiB0aGlzLmRlY29yYXRlQ2xhc3MoQXV0aChtb2RlbCkpO1xufTtcblxuaWYgKCEocHJvdG90eXBlIGFzIGFueSkuX19oYXNDbGFzc0RlY29yYXRvclN1cHBvcnQpIHtcbiAgY29uc3Qgb3JpZ2luYWxCdWlsZCA9IHByb3RvdHlwZS5idWlsZDtcbiAgcHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCByZXN1bHQgPSBvcmlnaW5hbEJ1aWxkLmNhbGwodGhpcyk7XG4gICAgY29uc3QgZGVjb3JhdG9ycyA9ICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycztcbiAgICBpZiAoZGVjb3JhdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRlZCA9IGRlY29yYXRvcihyZXN1bHQgYXMgYW55KSBhcyB0eXBlb2YgcmVzdWx0IHwgdm9pZDtcbiAgICAgICAgaWYgKGRlY29yYXRlZCkge1xuICAgICAgICAgIHJlc3VsdCA9IGRlY29yYXRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICAocHJvdG90eXBlIGFzIGFueSkuX19oYXNDbGFzc0RlY29yYXRvclN1cHBvcnQgPSB0cnVlO1xufVxuIiwiaW1wb3J0IHtcbiAgQ2FsbEhhbmRsZXIsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgU2NvcGUsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZIYW5kbGVyRXhlY3V0b3IsIERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgRGVmYXVsdEFkYXB0ZXJGbGFncyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJGbGFncyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCBcIi4uL292ZXJyaWRlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogSW50ZXJjZXB0b3IgcmVzcG9uc2libGUgZm9yIGV4ZWN1dGluZyBhbGwgcmVnaXN0ZXJlZCBEZWNhZiByZXF1ZXN0IGhhbmRsZXJzXG4gKiBiZWZvcmUgdGhlIGNvbnRyb2xsZXIgbWV0aG9kIGlzIGludm9rZWQuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSB7QGxpbmsgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yfSBpbnRlZ3JhdGVzIHRoZSBEZWNhZiByZXF1ZXN0LWhhbmRsaW5nIHBpcGVsaW5lXG4gKiBpbnRvIE5lc3RKUycgaW50ZXJjZXB0b3IgbWVjaGFuaXNtLiBCZWZvcmUgcGFzc2luZyBleGVjdXRpb24gdG8gdGhlIG5leHQgaGFuZGxlciBpbiB0aGVcbiAqIE5lc3RKUyBjaGFpbiwgaXQgZGVsZWdhdGVzIHJlcXVlc3QgcHJvY2Vzc2luZyB0byB0aGUge0BsaW5rIERlY2FmSGFuZGxlckV4ZWN1dG9yfSwgd2hpY2hcbiAqIHNlcXVlbnRpYWxseSBydW5zIGFsbCByZWdpc3RlcmVkIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVyfSBpbnN0YW5jZXMuIFRoaXMgYWxsb3dzXG4gKiBiZWhhdmlvcnMgc3VjaCBhcyBhdXRoZW50aWNhdGlvbiwgbG9nZ2luZywgdGVuYW50IHJlc29sdXRpb24sIG9yIG1ldGFkYXRhIGVucmljaG1lbnRcbiAqIHRvIG9jY3VyIHByaW9yIHRvIGNvbnRyb2xsZXIgZXhlY3V0aW9uLlxuICpcbiAqIEBjbGFzcyBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEFwcGx5IGdsb2JhbGx5OlxuICogYXBwLnVzZUdsb2JhbEludGVyY2VwdG9ycyhuZXcgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yKGV4ZWN1dG9yKSk7XG4gKlxuICogLy8gT3IgaW4gYSBtb2R1bGU6XG4gKiBATW9kdWxlKHtcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gKiAgICAge1xuICogICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICogICAgICAgdXNlQ2xhc3M6IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbiAqICAgICB9LFxuICogICBdLFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgICBwYXJ0aWNpcGFudCBJbnRlcmNlcHRvclxuICogICAgIHBhcnRpY2lwYW50IEV4ZWN1dG9yXG4gKiAgICAgcGFydGljaXBhbnQgQ29udHJvbGxlclxuICpcbiAqICAgICBDbGllbnQtPj5JbnRlcmNlcHRvcjogSFRUUCBSZXF1ZXN0XG4gKiAgICAgSW50ZXJjZXB0b3ItPj5FeGVjdXRvcjogZXhlYyhyZXF1ZXN0KVxuICogICAgIEV4ZWN1dG9yLS0+PkludGVyY2VwdG9yOiBoYW5kbGVycyBjb21wbGV0ZWRcbiAqICAgICBJbnRlcmNlcHRvci0+PkNvbnRyb2xsZXI6IG5leHQuaGFuZGxlKClcbiAqICAgICBDb250cm9sbGVyLS0+PkNsaWVudDogUmVzcG9uc2VcbiAqL1xuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE5lc3RJbnRlcmNlcHRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXF1ZXN0Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXhlY3V0b3I6IERlY2FmSGFuZGxlckV4ZWN1dG9yXG4gICkge31cblxuICBwcm90ZWN0ZWQgYXN5bmMgY29udGV4dHVhbGl6ZShyZXE6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycztcbiAgICBjb25zdCBmbGFnczogRGVjYWZTZXJ2ZXJGbGFncyA9IHtcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBvdmVycmlkZXM6IHt9LFxuICAgIH0gYXMgYW55O1xuXG4gICAgY29uc3QgaXAgPSBleHRyYWN0SXAocmVxKTtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmdldCgpLmZvcih7IGlwIH0pO1xuXG4gICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIERlZmF1bHRBZGFwdGVyRmxhZ3MsXG4gICAgICAgIHtcbiAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIG9wZXJhdGlvbjogYCR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWAsXG4gICAgICAgIH0sXG4gICAgICAgIGZsYWdzXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGludGVyY2VwdChjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBuZXh0OiBDYWxsSGFuZGxlcikge1xuICAgIGNvbnN0IHJlcSA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHJlcyA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVzcG9uc2UoKTtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IpLmZvcih0aGlzLmludGVyY2VwdCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jb250ZXh0dWFsaXplKHJlcSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IGNvbnRleHR1YWxpemVkIC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG5cbiAgICBhd2FpdCB0aGlzLmV4ZWN1dG9yLmV4ZWMocmVxLCByZXMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDT05URVhUICR7dGhpcy5yZXF1ZXN0Q29udGV4dC51dWlkfSBleGVjdXRvcnMgZmluaXNoZWQgLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0SXAocmVxOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBoZWFkZXJzID0gcmVxLmhlYWRlcnM7XG4gIGZ1bmN0aW9uIHBhcnNlSXBIZWFkZXIodmFsdWU/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pWzBdO1xuICB9XG4gIHJldHVybiAoXG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJ4LWZvcndhcmRlZC1mb3JcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJ4LXJlYWwtaXBcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJYLUZvcndhcmRlZC1Gb3JcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJYLVJlYWwtSVBcIl0pID8/XG4gICAgcmVxLmlwXG4gICk7XG59XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBNb2R1bGUsIFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFQUF9JTlRFUkNFUFRPUiB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcblxuaW1wb3J0IHsgQXV0aEludGVyY2VwdG9yIH0gZnJvbSBcIi4vQXV0aEludGVyY2VwdG9yXCI7XG5pbXBvcnQgeyBBVVRIX0hBTkRMRVIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvciB9IGZyb20gXCIuLi9pbnRlcmNlcHRvcnMvRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yXCI7XG5pbXBvcnQgeyBBdXRoSGFuZGxlciB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBEZWNhZkF1dGhNb2R1bGVPcHRpb25zID0ge1xuICBnbG9iYWw/OiBib29sZWFuO1xuICBoYW5kbGVyPzogVHlwZTxBdXRoSGFuZGxlcj47XG59O1xuXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmQXV0aE1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KFxuICAgIG9wdGlvbnM6IERlY2FmQXV0aE1vZHVsZU9wdGlvbnMgPSB7fVxuICApOiBEeW5hbWljTW9kdWxlIHtcbiAgICBjb25zdCBwcm92aWRlcnM6IER5bmFtaWNNb2R1bGVbXCJwcm92aWRlcnNcIl0gPSBbXG4gICAgICBBdXRoSW50ZXJjZXB0b3IsXG4gICAgICBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IsXG4gICAgICB7XG4gICAgICAgIHByb3ZpZGU6IEFQUF9JTlRFUkNFUFRPUixcbiAgICAgICAgdXNlQ2xhc3M6IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGlmIChvcHRpb25zLmhhbmRsZXIpIHtcbiAgICAgIHByb3ZpZGVycy5wdXNoKG9wdGlvbnMuaGFuZGxlcik7XG4gICAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICAgIHByb3ZpZGU6IEFVVEhfSEFORExFUixcbiAgICAgICAgdXNlQ2xhc3M6IG9wdGlvbnMuaGFuZGxlcixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmdsb2JhbCkge1xuICAgICAgKHByb3ZpZGVycyBhcyBhbnlbXSkucHVzaCh7XG4gICAgICAgIHByb3ZpZGU6IEFQUF9JTlRFUkNFUFRPUixcbiAgICAgICAgdXNlRXhpc3Rpbmc6IEF1dGhJbnRlcmNlcHRvcixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmQXV0aE1vZHVsZSxcbiAgICAgIGdsb2JhbDogb3B0aW9ucy5nbG9iYWwgPz8gZmFsc2UsXG4gICAgICBwcm92aWRlcnMsXG4gICAgICBleHBvcnRzOiBbQXV0aEludGVyY2VwdG9yLCBBVVRIX0hBTkRMRVJdLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5pbXBvcnQgeyB0eXBlIERlY2FmUmVxdWVzdEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERFQ0FGX0hBTkRMRVJTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRXhlY3V0ZXMgYWxsIHJlZ2lzdGVyZWQge0BsaW5rIERlY2FmUmVxdWVzdEhhbmRsZXJ9IGluc3RhbmNlcyBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCxcbiAqIHByb3ZpZGluZyB0aGVtIHdpdGggYSBzaGFyZWQge0BsaW5rIERlY2FmUmVxdWVzdENvbnRleHR9LlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUge0BsaW5rIERlY2FmSGFuZGxlckV4ZWN1dG9yfSBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3Igb3JjaGVzdHJhdGluZyBhbmQgZXhlY3V0aW5nXG4gKiBhIHNlcXVlbmNlIG9mIHJlcXVlc3QgaGFuZGxlcnMuIEVhY2ggaGFuZGxlciByZWNlaXZlcyB0aGUgc2FtZSByZXF1ZXN0LXNjb3BlZCBjb250ZXh0LFxuICogYWxsb3dpbmcgY29vcmRpbmF0ZWQgcHJvY2Vzc2luZyBzdWNoIGFzIGF1dGhlbnRpY2F0aW9uLCBtZXRhZGF0YSBleHRyYWN0aW9uLCBhdWRpdGluZyxcbiAqIGFuZCBjdXN0b20gcGlwZWxpbmUgYmVoYXZpb3IuIEhhbmRsZXJzIGFyZSBpbmplY3RlZCB2aWEgdGhlIHtAbGluayBERUNBRl9IQU5ETEVSU30gdG9rZW4sXG4gKiBlbnN1cmluZyBleHRlbnNpYmlsaXR5IGFuZCBsb29zZSBjb3VwbGluZy5cbiAqXG4gKiBAY2xhc3MgRGVjYWZIYW5kbGVyRXhlY3V0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEV4YW1wbGUgaGFuZGxlcjpcbiAqIGNsYXNzIEF1dGhIYW5kbGVyIGltcGxlbWVudHMgRGVjYWZSZXF1ZXN0SGFuZGxlciB7XG4gKiAgIGFzeW5jIGhhbmRsZShjb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LCByZXE6IFJlcXVlc3QpIHtcbiAqICAgICBjb25zdCB0b2tlbiA9IHJlcS5oZWFkZXJzW1wiYXV0aG9yaXphdGlvblwiXTtcbiAqICAgICBjb25zdCByZXN1bHQgPSBNeVNlcnZpY2UuZG9Tb21ldGhpbmcodG9rZW4pO1xuICogICAgIGNvbnRleHQuc2V0KFwibXkta2V5XCIsIHJlc3VsdCk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBFeGVjdXRvciB1c2FnZSBpbiBhIHJlcXVlc3Q6XG4gKiBhd2FpdCBleGVjdXRvci5leGVjKHJlcXVlc3QpO1xuICogLy8gQWxsIGhhbmRsZXJzIHdpbGwgcnVuIGluIHNlcXVlbmNlXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgICAgcGFydGljaXBhbnQgRXhlY3V0b3JcbiAqICAgICBwYXJ0aWNpcGFudCBIYW5kbGVyQVxuICogICAgIHBhcnRpY2lwYW50IEhhbmRsZXJCXG4gKlxuICogICAgIENsaWVudC0+PkV4ZWN1dG9yOiBleGVjKHJlcSlcbiAqICAgICBFeGVjdXRvci0+PkhhbmRsZXJBOiBoYW5kbGUoY29udGV4dCwgcmVxKVxuICogICAgIEhhbmRsZXJBLS0+PkV4ZWN1dG9yOiBjb21wbGV0ZWRcbiAqICAgICBFeGVjdXRvci0+PkhhbmRsZXJCOiBoYW5kbGUoY29udGV4dCwgcmVxKVxuICogICAgIEhhbmRsZXJCLS0+PkV4ZWN1dG9yOiBjb21wbGV0ZWRcbiAqICAgICBFeGVjdXRvci0tPj5DbGllbnQ6IHByb2Nlc3NpbmcgZmluaXNoZWRcbiAqL1xuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmSGFuZGxlckV4ZWN1dG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChERUNBRl9IQU5ETEVSUykgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVyczogRGVjYWZSZXF1ZXN0SGFuZGxlcltdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dFxuICApIHt9XG5cbiAgYXN5bmMgZXhlYyhyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZkhhbmRsZXJFeGVjdXRvci5uYW1lKS5mb3IodGhpcy5leGVjKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ09OVEVYVCAke3RoaXMuY29udGV4dC51dWlkfSBydW5uaW5nICR7dGhpcy5oYW5kbGVycy5sZW5ndGh9IGhhbmRsZXJzIGZvciByZXF1ZXN0ICR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWBcbiAgICApO1xuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB0aGlzLmhhbmRsZXJzKSB7XG4gICAgICBhd2FpdCBoYW5kbGVyLmhhbmRsZSh0aGlzLmNvbnRleHQsIHJlcSwgcmVzKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgQ2FsbEhhbmRsZXIsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGFwIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBOZXN0SW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY3R4OiBEZWNhZlJlcXVlc3RDb250ZXh0KSB7fVxuXG4gIGludGVyY2VwdChjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBuZXh0OiBDYWxsSGFuZGxlcik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHJlc3BvbnNlID0gY29udGV4dC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXNwb25zZSgpO1xuXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKCkucGlwZShcbiAgICAgIHRhcCgoZGF0YSkgPT4ge1xuICAgICAgICByZXNwb25zZSA9IHRoaXMuY3R4LnRvUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyB0eXBlIFJlcXVlc3QgfSBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHsgRGVjYWZDb250cm9sbGVyIGFzIEh0dHBEZWNhZkNvbnRyb2xsZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgTW9kZWxTZXJ2aWNlLFxuICBSZXBvLFxuICBSZXBvc2l0b3J5LFxuICBTZXJ2aWNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsLCB0eXBlIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmltcG9ydCB7IERlY2FmU2VydmVyQ3R4IH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEZWNhZkNvbnRyb2xsZXI8XG4gIENPTlRFWFQgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4LFxuPiBleHRlbmRzIEh0dHBEZWNhZkNvbnRyb2xsZXI8UmVxdWVzdCwgYW55LCBEZWNhZlJlcXVlc3RDb250ZXh0PiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBfbmFtZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKGNsaWVudENvbnRleHQpO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBDIGV4dGVuZHMgRGVjYWZTZXJ2ZXJDdHggPSBEZWNhZlNlcnZlckN0eCxcbj4gZXh0ZW5kcyBEZWNhZkNvbnRyb2xsZXI8Qz4ge1xuICBwcml2YXRlIF9wZXJzaXN0ZW5jZT86IFJlcG88TT4gfCBNb2RlbFNlcnZpY2U8TT47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSByZWFkb25seSBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIF9uYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCwgX25hbWUpO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8TT47XG5cbiAgcGVyc2lzdGVuY2UoY3R4PzogQ29udGV4dDxhbnk+KTogUmVwbzxNPiB8IE1vZGVsU2VydmljZTxNPiB7XG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSlcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gU2VydmljZS5nZXQ8TW9kZWxTZXJ2aWNlPE0+Pih0aGlzLmNsYXNzKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gTW9kZWxTZXJ2aWNlLmdldFNlcnZpY2UoXG4gICAgICAgICAgICB0aGlzLmNsYXNzXG4gICAgICAgICAgKSBhcyBNb2RlbFNlcnZpY2U8TT47XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhpcy5fcGVyc2lzdGVuY2UgPSBSZXBvc2l0b3J5LmZvck1vZGVsKHRoaXMuY2xhc3MpIGFzIFJlcG88TT47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGNvbnN0IG92ZXJyaWRlcyA9IHRoaXMuY2xpZW50Q29udGV4dC50b092ZXJyaWRlcygpO1xuXG4gICAgcmV0dXJuIGN0eFxuICAgICAgPyB0aGlzLl9wZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIFJlcG9zaXRvcnlcbiAgICAgICAgPyB0aGlzLl9wZXJzaXN0ZW5jZS5vdmVycmlkZShvdmVycmlkZXMpXG4gICAgICAgIDogdGhpcy5fcGVyc2lzdGVuY2UuZm9yKG92ZXJyaWRlcylcbiAgICAgIDogdGhpcy5fcGVyc2lzdGVuY2U7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEFwaVByb3BlcnR5IH0gZnJvbSBcIi4uLy4uL292ZXJyaWRlcy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbCwgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IHRvUGFzY2FsQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgREVDT1JBVE9SUyB9IGZyb20gXCIuLi8uLi9vdmVycmlkZXMvY29uc3RhbnRzXCI7XG5cbmNvbnN0IGR0b0NhY2hlID0gbmV3IE1hcDxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgV2Vha01hcDxDb25zdHJ1Y3Rvcjxhbnk+LCBDb25zdHJ1Y3Rvcjxhbnk+PlxuPigpO1xuXG4vKipcbiAqIEJ1aWxkcyBhIE5lc3QvU3dhZ2dlciBEVE8gY2xhc3MgZm9yIHRoZSBnaXZlbiBtb2RlbCBhbmQgQ1JVRCBvcGVyYXRpb24uXG4gKlxuICogUnVsZXM6XG4gKiAgLSBPbmx5IENSRUFURSBhbmQgVVBEQVRFIChhbmQgdGhlaXIgYnVsayB2YXJpYW50cykgcHJvZHVjZSBhIERUTztcbiAqICAgIGFsbCBvdGhlciBvcGVyYXRpb25zIHJldHVybiB0aGUgb3JpZ2luYWwgbW9kZWwgY2xhc3MgdW5jaGFuZ2VkLlxuICogIC0gQGdlbmVyYXRlZCgpIHByb3BlcnRpZXMgKGNyZWF0ZWRBdCwgdXBkYXRlZEF0LCBjcmVhdGVkQnksIHVwZGF0ZWRCeSxcbiAqICAgIHV1aWQsIHZlcnNpb24sIEBjb21wb3NlZCBwa3MsIOKApikgYXJlICoqbmV2ZXIqKiBleHBvc2VkIGluIGFueSBEVE8uXG4gKiAgLSBUaGUgQHBrKCkgcHJvcGVydHk6XG4gKiAgICAgIOKAoiBVUERBVEUg4oCTIGFsd2F5cyBpbmNsdWRlZC5cbiAqICAgICAg4oCiIENSRUFURSAg4oCTIGluY2x1ZGVkIG9ubHkgd2hlbiB0aGUgcGsgaXMgTk9UIGF1dG8tZ2VuZXJhdGVkXG4gKiAgICAgICAgICAgICAgICAgIChjaGVja2VkIHZpYSBNb2RlbC5wa1Byb3BzKCkuZ2VuZXJhdGVkIEFORCBNb2RlbC5nZW5lcmF0ZWQoKSkuXG4gKiAgLSBSZWxhdGlvbiBwcm9wZXJ0aWVzIChAb25lVG9PbmUsIEBvbmVUb01hbnksIOKApik6XG4gKiAgICAgIOKAoiBDUkVBVEUgIOKAkyBuZXN0ZWQgYXMgRHRvRm9yKENSRUFURSwgUmVsYXRlZE1vZGVsKS4gV2hlbiB0aGUgcmVsYXRpb25cbiAqICAgICAgICAgICAgICAgICAgY3JlYXRlcyBhIGNpcmN1bGFyIHJlZmVyZW5jZSAobW9kZWwgQSDihpIgbW9kZWwgQiDihpIgbW9kZWwgQSksXG4gKiAgICAgICAgICAgICAgICAgIHRoZSBiYWNrLXJlZmVyZW5jZSB1c2VzIHRoZSByZWxhdGVkIG1vZGVsJ3MgUEsgdHlwZVxuICogICAgICAgICAgICAgICAgICAoc3RyaW5nL2ludGVnZXIpIGluc3RlYWQgb2YgdGhlIGZ1bGwgRFRPIHRvIGJyZWFrIHRoZSBjeWNsZS5cbiAqICAgICAg4oCiIFVQREFURSAg4oCTIHVuaW9uIG9mIER0b0ZvcihVUERBVEUsIFJlbGF0ZWRNb2RlbCkgKipvcioqIHRoZVxuICogICAgICAgICAgICAgICAgICByZWxhdGVkIG1vZGVsJ3MgcHJpbWFyeS1rZXkgdHlwZSAoc3RyaW5nIC8gaW50ZWdlciksXG4gKiAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhIFN3YWdnZXIgb25lT2YuIENpcmN1bGFyIGJhY2stcmVmZXJlbmNlc1xuICogICAgICAgICAgICAgICAgICBvbWl0IHRoZSBEVE8gJHJlZiBhbmQgb25seSBpbmNsdWRlIHRoZSBQSyB0eXBlLlxuICpcbiAqIE1ldGFkYXRhLnByb3BlcnRpZXMoKSBub3cgcmV0dXJucyBBTEwgcHJvcGVydGllcyBhY3Jvc3MgdGhlIHByb3RvdHlwZSBjaGFpbixcbiAqIHNvIERUTyBpbmhlcml0YW5jZSBpcyBubyBsb25nZXIgbmVlZGVkOyBldmVyeSBEVE8gaXMgYSBmbGF0IGNsYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRHRvRm9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG9wOiBPcGVyYXRpb25LZXlzLFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gIHN0YWNrOiBTZXQ8Q29uc3RydWN0b3I8YW55Pj4gPSBuZXcgU2V0KClcbik6IENvbnN0cnVjdG9yPGFueT4ge1xuICBpZiAoIVRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cy5pbmNsdWRlcyhvcCkpIHtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBjb25zdCBjYWNoZSA9IGdldER0b0NhY2hlKG9wKTtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KG1vZGVsKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBpc1VwZGF0ZU9wID0gW1xuICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICBdLmluY2x1ZGVzKG9wIGFzIGFueSk7XG5cbiAgY2xhc3MgRHluYW1pY0RUTyB7fVxuICBjYWNoZS5zZXQobW9kZWwsIER5bmFtaWNEVE8pO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEeW5hbWljRFRPLCBcIm5hbWVcIiwge1xuICAgIHZhbHVlOiBgJHt0b1Bhc2NhbENhc2UobW9kZWwubmFtZSl9JHt0b1Bhc2NhbENhc2Uob3ApfURUT2AsXG4gIH0pO1xuXG4gIGNvbnN0IHBrUHJvcCA9ICgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBNb2RlbC5wayhtb2RlbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSkoKTtcblxuICBjb25zdCBwa1Byb3BzTWV0YWRhdGEgPSBwa1Byb3AgPyBNb2RlbC5wa1Byb3BzKG1vZGVsIGFzIGFueSkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBrRGVzaWduVHlwZSA9IHBrUHJvcFxuICAgID8gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG1vZGVsLnByb3RvdHlwZSwgcGtQcm9wIGFzIHN0cmluZylcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcGtUeXBlSXNOdW1lcmljID1cbiAgICBwa0Rlc2lnblR5cGUgPT09IE51bWJlciB8fCBwa0Rlc2lnblR5cGUgPT09IEJpZ0ludDtcbiAgY29uc3QgcGtJc0dlbmVyYXRlZCA9XG4gICAgISFwa1Byb3BzTWV0YWRhdGE/LmdlbmVyYXRlZCB8fFxuICAgIChwa1Byb3BcbiAgICAgID8gTW9kZWwuZ2VuZXJhdGVkQnlTZXF1ZW5jZShtb2RlbCBhcyBhbnksIHBrUHJvcCBhcyBhbnkpIHx8XG4gICAgICAgIGlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcGtQcm9wIGFzIHN0cmluZykgfHxcbiAgICAgICAgcGtUeXBlSXNOdW1lcmljXG4gICAgICA6IGZhbHNlKTtcblxuICBjb25zdCBhbGxQcm9wcyA9IEFycmF5LmZyb20obmV3IFNldChNZXRhZGF0YS5wcm9wZXJ0aWVzKG1vZGVsKSB8fCBbXSkpO1xuICBjb25zdCByZWxhdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oKE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkgYXMgc3RyaW5nW10pIHx8IFtdKTtcbiAgY29uc3Qgc2NhbGFyUHJvcHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIGFsbFByb3BzKSB7XG4gICAgaWYgKCFwcm9wKSBjb250aW51ZTtcbiAgICBpZiAocmVsYXRpb25zLmhhcyhwcm9wKSkgY29udGludWU7XG5cbiAgICBpZiAocHJvcCA9PT0gcGtQcm9wICYmICFpc1VwZGF0ZU9wICYmIHBrSXNHZW5lcmF0ZWQpIGNvbnRpbnVlO1xuICAgIGlmIChwcm9wICE9PSBwa1Byb3AgJiYgaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwcm9wKSlcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgc2NhbGFyUHJvcHMucHVzaChwcm9wKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBzY2FsYXJQcm9wcykge1xuICAgIGNvbnN0IHZhbGlkYXRpb24gPSBnZXRWYWxpZGF0aW9uQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHByb3ApO1xuICAgIGNvbnN0IGlzUmVxdWlyZWQgPSAhIXZhbGlkYXRpb24/LltWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRF07XG4gICAgY29uc3QgdHlwZUhpbnQgPVxuICAgICAgZ2V0VHlwZUFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwcm9wKSA/P1xuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG1vZGVsLnByb3RvdHlwZSwgcHJvcCk7XG5cbiAgICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSB7XG4gICAgICByZXF1aXJlZDogaXNSZXF1aXJlZCxcbiAgICB9O1xuICAgIGlmICh0eXBlSGludCkgYXBpT3B0aW9ucy50eXBlID0gdHlwZUhpbnQ7XG5cbiAgICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEeW5hbWljRFRPLnByb3RvdHlwZSwgcHJvcCk7XG5cbiAgICBjb25zdCBkZXNpZ25UeXBlID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBtb2RlbC5wcm90b3R5cGUsIHByb3ApID8/IHR5cGVIaW50O1xuICAgIGlmICh0eXBlb2YgZGVzaWduVHlwZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgXCJkZXNpZ246dHlwZVwiLFxuICAgICAgICBkZXNpZ25UeXBlLFxuICAgICAgICBEeW5hbWljRFRPLnByb3RvdHlwZSxcbiAgICAgICAgcHJvcFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHluYW1pY0RUTy5wcm90b3R5cGUsIHByb3AsIHtcbiAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHJlbGF0aW9uIG9mIHJlbGF0aW9ucykge1xuICAgIGNvbnN0IHJlbGF0aW9uTWV0YSA9IE1ldGFkYXRhLnJlbGF0aW9ucyhtb2RlbCwgcmVsYXRpb24gYXMgYW55KTtcbiAgICBpZiAoIXJlbGF0aW9uTWV0YSkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE1ldGFkYXRhIGZvciByZWxhdGlvbiAke3JlbGF0aW9ufSBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICBsZXQgcmVsYXRpb25UeXBlOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkID1cbiAgICAgIHJlbGF0aW9uTWV0YS5jbGFzcyBhcyBDb25zdHJ1Y3Rvcjxhbnk+O1xuICAgIGlmICh0eXBlb2YgcmVsYXRpb25UeXBlID09PSBcImZ1bmN0aW9uXCIgJiYgIXJlbGF0aW9uVHlwZS5uYW1lKSB7XG4gICAgICByZWxhdGlvblR5cGUgPSAocmVsYXRpb25UeXBlIGFzIGFueSkoKTtcbiAgICB9XG4gICAgaWYgKCFyZWxhdGlvblR5cGUgfHwgdHlwZW9mIHJlbGF0aW9uVHlwZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVHlwZSBmb3IgcmVsYXRpb24gJHtyZWxhdGlvbn0gbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIGlmICghTW9kZWwuZ2V0KHJlbGF0aW9uVHlwZS5uYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLnZhbGlkYXRpb25Gb3IobW9kZWwsIHJlbGF0aW9uIGFzIGFueSk7XG4gICAgY29uc3QgaXNBcnJheSA9ICEhKG1ldGEgYXMgYW55KT8uW1ZhbGlkYXRpb25LZXlzLkxJU1RdO1xuICAgIGNvbnN0IGlzUmVxdWlyZWQgPSAhIShtZXRhIGFzIGFueSk/LltWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRF07XG5cbiAgICAvLyBEZXRlY3QgY2lyY3VsYXIgcmVmZXJlbmNlOiBpZiB0aGUgcmVsYXRlZCBtb2RlbCBpcyBhbHJlYWR5IGluIHRoZVxuICAgIC8vIHJlY3Vyc2lvbiBzdGFjaywgdXNlIHRoZSBQSyB0eXBlIGluc3RlYWQgb2YgdGhlIGZ1bGwgRFRPIHRvIGJyZWFrXG4gICAgLy8gdGhlIGN5Y2xlLiBUaGlzIHByZXZlbnRzIEBuZXN0anMvc3dhZ2dlcidzIFNjaGVtYU9iamVjdEZhY3RvcnkgZnJvbVxuICAgIC8vIGluZmluaXRlbHkgcmVjdXJzaW5nIHdoZW4gZXhwbG9yaW5nIHRoZSBzY2hlbWFzLlxuICAgIGNvbnN0IGlzQ2lyY3VsYXIgPSBzdGFjay5oYXMocmVsYXRpb25UeXBlKTtcblxuICAgIGlmIChpc0NpcmN1bGFyKSB7XG4gICAgICBjb25zdCBwa1R5cGVOYW1lID0gZ2V0UGtPcGVuQXBpVHlwZShyZWxhdGlvblR5cGUpO1xuICAgICAgYWRkUmVsYXRpb25Qa1JlZihEeW5hbWljRFRPLCByZWxhdGlvbiwgcGtUeXBlTmFtZSwgaXNBcnJheSwgaXNSZXF1aXJlZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGlvbkR0byA9IER0b0ZvcihvcCwgcmVsYXRpb25UeXBlLCBuZXcgU2V0KHN0YWNrKS5hZGQobW9kZWwpKTtcblxuICAgIGlmIChpc1VwZGF0ZU9wKSB7XG4gICAgICBhZGRSZWxhdGlvblVwZGF0ZShcbiAgICAgICAgRHluYW1pY0RUTyxcbiAgICAgICAgcmVsYXRpb24sXG4gICAgICAgIHJlbGF0aW9uVHlwZSxcbiAgICAgICAgcmVsYXRpb25EdG8sXG4gICAgICAgIGlzQXJyYXksXG4gICAgICAgIGlzUmVxdWlyZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZFJlbGF0aW9uKER5bmFtaWNEVE8sIHJlbGF0aW9uLCByZWxhdGlvbkR0bywgaXNBcnJheSwgaXNSZXF1aXJlZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIER5bmFtaWNEVE87XG59XG5cbmZ1bmN0aW9uIGFkZFJlbGF0aW9uKFxuICBEdG9DbGFzczogYW55LFxuICByZWxhdGlvbjogc3RyaW5nLFxuICByZWxhdGlvbkR0bzogYW55LFxuICBpc0FycmF5OiBib29sZWFuLFxuICBpc1JlcXVpcmVkOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0ge1xuICAgIHR5cGU6IHJlbGF0aW9uRHRvLFxuICAgIHJlcXVpcmVkOiBpc1JlcXVpcmVkLFxuICAgIGlzQXJyYXksXG4gIH07XG4gIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24pO1xuICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICBpc0FycmF5ID8gQXJyYXkgOiByZWxhdGlvbkR0byxcbiAgICBEdG9DbGFzcy5wcm90b3R5cGUsXG4gICAgcmVsYXRpb25cbiAgKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24sIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcbn1cblxuLyoqXG4gKiBBZGRzIGEgcmVsYXRpb24gcHJvcGVydHkgdGhhdCB1c2VzIHRoZSBQSyB0eXBlIChzdHJpbmcvaW50ZWdlcikgaW5zdGVhZCBvZlxuICogYSBmdWxsIERUTyBjbGFzcy4gVXNlZCB0byBicmVhayBjaXJjdWxhciByZWZlcmVuY2VzIChlLmcuIEN1c3RvbWVyIOKGkiBPcmRlciDihpIgQ3VzdG9tZXIpLlxuICovXG5mdW5jdGlvbiBhZGRSZWxhdGlvblBrUmVmKFxuICBEdG9DbGFzczogYW55LFxuICByZWxhdGlvbjogc3RyaW5nLFxuICBwa1R5cGVOYW1lOiBzdHJpbmcsXG4gIGlzQXJyYXk6IGJvb2xlYW4sXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSBpc0FycmF5XG4gICAgPyAoeyB0eXBlOiBcImFycmF5XCIsIGl0ZW1zOiB7IHR5cGU6IHBrVHlwZU5hbWUgfSwgcmVxdWlyZWQ6IGlzUmVxdWlyZWQgfSBhcyBhbnkpXG4gICAgOiAoeyB0eXBlOiBwa1R5cGVOYW1lID09PSBcImludGVnZXJcIiA/IE51bWJlciA6IFN0cmluZywgcmVxdWlyZWQ6IGlzUmVxdWlyZWQgfSBhcyBhbnkpO1xuICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uKTtcbiAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgaXNBcnJheSA/IEFycmF5IDogKHBrVHlwZU5hbWUgPT09IFwiaW50ZWdlclwiID8gTnVtYmVyIDogU3RyaW5nKSxcbiAgICBEdG9DbGFzcy5wcm90b3R5cGUsXG4gICAgcmVsYXRpb25cbiAgKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24sIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkUmVsYXRpb25VcGRhdGUoXG4gIER0b0NsYXNzOiBhbnksXG4gIHJlbGF0aW9uOiBzdHJpbmcsXG4gIHJlbGF0aW9uVHlwZTogQ29uc3RydWN0b3I8YW55PixcbiAgcmVsYXRpb25EdG86IGFueSxcbiAgaXNBcnJheTogYm9vbGVhbixcbiAgaXNSZXF1aXJlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IGV4dHJhTW9kZWxzID1cbiAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX0VYVFJBX01PREVMUywgRHRvQ2xhc3MpIHx8IFtdO1xuICBpZiAoIWV4dHJhTW9kZWxzLmluY2x1ZGVzKHJlbGF0aW9uRHRvKSkge1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBERUNPUkFUT1JTLkFQSV9FWFRSQV9NT0RFTFMsXG4gICAgICBbLi4uZXh0cmFNb2RlbHMsIHJlbGF0aW9uRHRvXSxcbiAgICAgIER0b0NsYXNzXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGR0b1JlZiA9IGAjL2NvbXBvbmVudHMvc2NoZW1hcy8ke3JlbGF0aW9uRHRvLm5hbWV9YDtcbiAgY29uc3QgcGtUeXBlTmFtZSA9IGdldFBrT3BlbkFwaVR5cGUocmVsYXRpb25UeXBlKTtcbiAgY29uc3Qgb25lT2ZJdGVtcyA9IFt7ICRyZWY6IGR0b1JlZiB9LCB7IHR5cGU6IHBrVHlwZU5hbWUgfV07XG5cbiAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0gaXNBcnJheVxuICAgID8gKHsgdHlwZTogXCJhcnJheVwiLCByZXF1aXJlZDogaXNSZXF1aXJlZCwgb25lT2Y6IG9uZU9mSXRlbXMgfSBhcyBhbnkpXG4gICAgOiAoeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiBpc1JlcXVpcmVkLCBvbmVPZjogb25lT2ZJdGVtcyB9IGFzIGFueSk7XG5cbiAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbik7XG4gIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgXCJkZXNpZ246dHlwZVwiLFxuICAgIGlzQXJyYXkgPyBBcnJheSA6IE9iamVjdCxcbiAgICBEdG9DbGFzcy5wcm90b3R5cGUsXG4gICAgcmVsYXRpb25cbiAgKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24sIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UGtPcGVuQXBpVHlwZShyZWxhdGlvblR5cGU6IENvbnN0cnVjdG9yPGFueT4pOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBrUHJvcHNNZXRhZGF0YSA9IE1vZGVsLnBrUHJvcHMocmVsYXRpb25UeXBlIGFzIGFueSk7XG4gICAgY29uc3QgcGtUeXBlID0gcGtQcm9wc01ldGFkYXRhPy50eXBlO1xuICAgIGlmIChwa1R5cGUgPT09IE51bWJlciB8fCBwa1R5cGUgPT09IEJpZ0ludCkgcmV0dXJuIFwiaW50ZWdlclwiO1xuICAgIHJldHVybiBcInN0cmluZ1wiO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UoXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBwcm9wOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBsZXQgY3VycmVudDogYW55ID0gbW9kZWw7XG4gIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IE9iamVjdCAmJiBjdXJyZW50ICE9PSBGdW5jdGlvbikge1xuICAgIGlmIChNb2RlbC5nZW5lcmF0ZWQoY3VycmVudCwgcHJvcCBhcyBhbnkpKSByZXR1cm4gdHJ1ZTtcbiAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsaWRhdGlvbkFjcm9zc0luaGVyaXRhbmNlKFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgcHJvcDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG1vZGVsO1xuICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QgJiYgY3VycmVudCAhPT0gRnVuY3Rpb24pIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gTWV0YWRhdGEudmFsaWRhdGlvbkZvcihjdXJyZW50LCBwcm9wIGFzIGFueSk7XG4gICAgaWYgKHZhbGlkYXRpb24pIHJldHVybiB2YWxpZGF0aW9uIGFzIGFueTtcbiAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFR5cGVBY3Jvc3NJbmhlcml0YW5jZShtb2RlbDogQ29uc3RydWN0b3I8YW55PiwgcHJvcDogc3RyaW5nKTogYW55IHtcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG1vZGVsO1xuICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QgJiYgY3VycmVudCAhPT0gRnVuY3Rpb24pIHtcbiAgICBjb25zdCB0eXBlID0gTWV0YWRhdGEudHlwZShjdXJyZW50LCBwcm9wKTtcbiAgICBpZiAodHlwZSkgcmV0dXJuIHR5cGU7XG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXREdG9DYWNoZShcbiAgb3A6IE9wZXJhdGlvbktleXNcbik6IFdlYWtNYXA8Q29uc3RydWN0b3I8YW55PiwgQ29uc3RydWN0b3I8YW55Pj4ge1xuICBpZiAoIWR0b0NhY2hlLmhhcyhvcCkpIHtcbiAgICBkdG9DYWNoZS5zZXQob3AsIG5ldyBXZWFrTWFwKCkpO1xuICB9XG4gIHJldHVybiBkdG9DYWNoZS5nZXQob3ApITtcbn1cbiIsImltcG9ydCB7IENvbnRyb2xsZXIsIFBhcmFtLCBRdWVyeSwgUmVzcG9uc2UsIFNldE1ldGFkYXRhIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQge1xuICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UsXG4gIEFwaUJvZHksXG4gIEFwaUNyZWF0ZWRSZXNwb25zZSxcbiAgQXBpRXh0cmFNb2RlbHMsXG4gIEFwaU5vQ29udGVudFJlc3BvbnNlLFxuICBBcGlOb3RGb3VuZFJlc3BvbnNlLFxuICBBcGlPa1Jlc3BvbnNlLFxuICBBcGlPcGVyYXRpb24sXG4gIEFwaVBhcmFtLFxuICBBcGlRdWVyeSxcbiAgQXBpVGFncyxcbiAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlLFxuICBnZXRTY2hlbWFQYXRoLFxufSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIERpcmVjdGlvbkxpbWl0T2Zmc2V0LFxuICBNb2RlbFNlcnZpY2UsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFByZXBhcmVkU3RhdGVtZW50S2V5cyxcbiAgdHlwZSBSZXBvLFxuICBSZXBvc2l0b3J5LFxuICBTZXJ2aWNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2luZywgdG9LZWJhYkNhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgREJLZXlzLFxuICBPcGVyYXRpb25LZXlzLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwsXG4gIEFwaVBhcmFtc0Zyb21Nb2RlbCxcbiAgdHlwZSBEZWNhZkFwaVByb3BlcnR5LFxuICBEZWNhZkJvZHksXG4gIERlY2FmUGFyYW1zLFxuICBEZWNhZlF1ZXJ5LFxufSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBIdHRwVmVyYlRvRGVjb3JhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IERFQ0FGX0NPTlRST0xMRVJfQ09ORklHLCBERUNBRl9ST1VURSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNLSVBfTU9ERUxfUk9MRVNfS0VZIH0gZnJvbSBcIi4uL2F1dGgvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBdXRoLCBQdWJsaWMsIFJlcXVpcmVSb2xlcyB9IGZyb20gXCIuLi9hdXRoL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnRyb2xsZXJDb25zdHJ1Y3RvciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNhZk1vZGVsQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyc1wiO1xuaW1wb3J0IHsgRHRvRm9yIH0gZnJvbSBcIi4uL2ZhY3Rvcnkvb3BlbmFwaS9EdG9CdWlsZGVyXCI7XG5pbXBvcnQgXCIuLi9vdmVycmlkZXNcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ29udHJvbGxlckZhY3RvcnksXG4gIHR5cGUgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyxcbiAgdHlwZSBBdXRoQ29uZmlnLFxuICB0eXBlIFNlcnZlclJvdXRlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuXG5leHBvcnQgY2xhc3MgRnJvbU1vZGVsQ29udHJvbGxlciB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZyA9IExvZ2dpbmcuZm9yKEZyb21Nb2RlbENvbnRyb2xsZXIubmFtZSk7XG5cbiAgc3RhdGljIGdldFBlcnNpc3RlbmNlPFQgZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gICAgTW9kZWxDbGF6ejogTW9kZWxDb25zdHJ1Y3RvcjxUPlxuICApOiBSZXBvPFQ+IHwgTW9kZWxTZXJ2aWNlPFQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIFNlcnZpY2UuZ2V0PE1vZGVsU2VydmljZTxUPj4oTW9kZWxDbGF6eik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE1vZGVsU2VydmljZS5nZXRTZXJ2aWNlKE1vZGVsQ2xhenopIGFzIE1vZGVsU2VydmljZTxUPjtcbiAgICAgIH0gY2F0Y2ggKGUyOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBSZXBvc2l0b3J5LmZvck1vZGVsKE1vZGVsQ2xhenopIGFzIFJlcG88VD47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVF1ZXJ5Um91dGVzRnJvbVJlcG9zaXRvcnk8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICBwZXJzaXN0ZW5jZTogUmVwbzxUPiB8IE1vZGVsU2VydmljZTxUPixcbiAgICBwcmVmaXg6IHN0cmluZyA9IFBlcnNpc3RlbmNlS2V5cy5RVUVSWVxuICApOiBDb250cm9sbGVyQ29uc3RydWN0b3I8VD4ge1xuICAgIGNvbnN0IHJlcG86IFJlcG88VD4gPVxuICAgICAgcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBNb2RlbFNlcnZpY2UgPyBwZXJzaXN0ZW5jZS5yZXBvIDogcGVyc2lzdGVuY2U7XG4gICAgY29uc3QgTW9kZWxDb25zdHI6IENvbnN0cnVjdG9yID0gcmVwby5jbGFzcztcbiAgICBjb25zdCBxdWVyeU1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIHsgZmllbGRzPzogc3RyaW5nW10gfCB1bmRlZmluZWQgfT4gPVxuICAgICAgTWV0YWRhdGEuZ2V0KFxuICAgICAgICByZXBvLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBNZXRhZGF0YS5rZXkoUGVyc2lzdGVuY2VLZXlzLlFVRVJZKVxuICAgICAgKSA/PyB7fTtcblxuICAgIGNvbnN0IHJvdXRlTWV0aG9kczogUmVjb3JkPHN0cmluZywgYW55PiA9XG4gICAgICBNZXRhZGF0YS5nZXQoXG4gICAgICAgIHBlcnNpc3RlbmNlLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBNZXRhZGF0YS5rZXkoREVDQUZfUk9VVEUpXG4gICAgICApID8/IHt9O1xuXG4gICAgY2xhc3MgUXVlcnlDb250cm9sbGVyIGV4dGVuZHMgRGVjYWZNb2RlbENvbnRyb2xsZXI8VD4ge1xuICAgICAgb3ZlcnJpZGUgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8VD4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0cnVjdG9yKGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihjbGllbnRDb250ZXh0LCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBwYXJhbXNdIG9mIE9iamVjdC5lbnRyaWVzKHJvdXRlTWV0aG9kcykpIHtcbiAgICAgIGNvbnN0IHJvdXRlUGF0aCA9IFtwYXJhbXMucGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKV1cbiAgICAgICAgLmZpbHRlcigoc2VnbWVudDogc3RyaW5nKSA9PiBzZWdtZW50ICYmIHNlZ21lbnQudHJpbSgpKVxuICAgICAgICAuam9pbihcIi9cIik7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIoXG4gICAgICAgIG1ldGhvZE5hbWVcbiAgICAgICkgYXMgYW55O1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWZpbmVNZXRob2QoXG4gICAgICAgIFF1ZXJ5Q29udHJvbGxlcixcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgaGFuZGxlclxuICAgICAgKTtcblxuICAgICAgY29uc3QgaHR0cERlY29yYXRvciA9IEh0dHBWZXJiVG9EZWNvcmF0b3IocGFyYW1zLmh0dHBNZXRob2QgYXMgSHR0cFZlcmJzKShyb3V0ZVBhdGggfHwgdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBGcm9tTW9kZWxDb250cm9sbGVyLmdldFF1ZXJ5RGVjb3JhdG9ycyhcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcm91dGVQYXRoLFxuICAgICAgICBwYXJhbXMuaHR0cE1ldGhvZFxuICAgICAgKTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFxuICAgICAgICBRdWVyeUNvbnRyb2xsZXIsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIFtodHRwRGVjb3JhdG9yLCAuLi5kZWNvcmF0b3JzXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBvYmpWYWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHF1ZXJ5TWV0aG9kcykpIHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IG9ialZhbHVlcy5maWVsZHMgPz8gW107XG4gICAgICBjb25zdCByb3V0ZVBhdGggPSBbcHJlZml4LCBtZXRob2ROYW1lLCAuLi5maWVsZHMubWFwKChmKSA9PiBgOiR7Zn1gKV1cbiAgICAgICAgLmZpbHRlcigoc2VnbWVudCkgPT4gc2VnbWVudCAmJiBzZWdtZW50LnRyaW0oKSlcbiAgICAgICAgLmpvaW4oXCIvXCIpO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKFxuICAgICAgICBtZXRob2ROYW1lXG4gICAgICApIGFzIGFueTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVmaW5lTWV0aG9kKFxuICAgICAgICBRdWVyeUNvbnRyb2xsZXIsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIGhhbmRsZXJcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGh0dHBEZWNvcmF0b3IgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKFwiR0VUXCIgYXMgSHR0cFZlcmJzKShyb3V0ZVBhdGggfHwgdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBGcm9tTW9kZWxDb250cm9sbGVyLmdldFF1ZXJ5RGVjb3JhdG9ycyhcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcm91dGVQYXRoLFxuICAgICAgICBcIkdFVFwiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5hcHBseURlY29yYXRvcnMoXG4gICAgICAgIFF1ZXJ5Q29udHJvbGxlcixcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgW2h0dHBEZWNvcmF0b3IsIC4uLmRlY29yYXRvcnNdXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBRdWVyeUNvbnRyb2xsZXI7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlPFQgZXh0ZW5kcyBNb2RlbDxhbnk+PihcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3RvcjxUPixcbiAgICBtb2R1bGVDb25maWdPdmVycmlkZXM/OiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnPixcbiAgICBnbG9iYWxEZWZhdWx0cz86IFBhcnRpYWw8TW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZz5cbiAgKTogQ29udHJvbGxlckNvbnN0cnVjdG9yPFQ+IHtcbiAgICBjb25zdCBsb2cgPSBGcm9tTW9kZWxDb250cm9sbGVyLmxvZy5mb3IoRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShNb2RlbENvbnN0cik7XG4gICAgY29uc3Qgcm91dGVQYXRoID0gdG9LZWJhYkNhc2UodGFibGVOYW1lKTtcbiAgICBjb25zdCBtb2RlbENsYXp6TmFtZSA9IE1vZGVsQ29uc3RyLm5hbWU7XG4gICAgY29uc3QgcGVyc2lzdGVuY2UgPSBGcm9tTW9kZWxDb250cm9sbGVyLmdldFBlcnNpc3RlbmNlKE1vZGVsQ29uc3RyKTtcblxuICAgIC8vIFdoZW4gcGVyc2lzdGVuY2UgaXMgYSBNb2RlbFNlcnZpY2UsIHRoZSBAcXVlcnkvQHJvdXRlIG1ldGFkYXRhIGxpdmVzIG9uXG4gICAgLy8gdGhlIHVuZGVybHlpbmcgcmVwb3NpdG9yeSBjbGFzcyAoY3VzdG9tIHJlcG8pLCBub3Qgb24gTW9kZWxTZXJ2aWNlIGl0c2VsZi5cbiAgICAvLyBQYXNzIHRoZSByZXBvIHRvIHRoZSBmYWN0b3J5IHNvIGFkZENvbXBsZXhRdWVyaWVzKCkgY2FuIGRpc2NvdmVyIHRoZW0uXG4gICAgY29uc3QgZmFjdG9yeVBlcnNpc3RlbmNlID1cbiAgICAgIHBlcnNpc3RlbmNlIGluc3RhbmNlb2YgTW9kZWxTZXJ2aWNlID8gcGVyc2lzdGVuY2UucmVwbyA6IHBlcnNpc3RlbmNlO1xuXG4gICAgY29uc3QgZGVjb3JhdG9yQ29uZmlnID0gTWV0YWRhdGEuZ2V0KFxuICAgICAgTW9kZWxDb25zdHIsXG4gICAgICBNZXRhZGF0YS5rZXkoREVDQUZfQ09OVFJPTExFUl9DT05GSUcpXG4gICAgKSBhcyBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1vZHVsZU92ZXJyaWRlID0gbW9kdWxlQ29uZmlnT3ZlcnJpZGVzPy5bTW9kZWxDb25zdHIubmFtZV07XG4gICAgY29uc3QgbWVyZ2VkQ29uZmlnOiBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnID0ge1xuICAgICAgLi4uKGdsb2JhbERlZmF1bHRzIHx8IHt9KSxcbiAgICAgIC4uLihkZWNvcmF0b3JDb25maWcgfHwge30pLFxuICAgICAgLi4uKG1vZHVsZU92ZXJyaWRlIHx8IHt9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgRmFjdG9yeUNvbnRyb2xsZXIgPSBNb2RlbENvbnRyb2xsZXJGYWN0b3J5LmNyZWF0ZTxUPihcbiAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgZmFjdG9yeVBlcnNpc3RlbmNlLFxuICAgICAgbWVyZ2VkQ29uZmlnXG4gICAgKTtcbiAgICBjb25zdCBmYWN0b3J5Um91dGVzID0gKEZhY3RvcnlDb250cm9sbGVyIGFzIGFueSkuX19yb3V0ZXNfXyBhc1xuICAgICAgfCBTZXJ2ZXJSb3V0ZVtdXG4gICAgICB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHsgZ2V0UEssIGFwaVByb3BlcnRpZXMsIHBhdGg6IHBrUGF0aCB9ID1cbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0Um91dGVQYXJhbWV0ZXJzRnJvbU1vZGVsKE1vZGVsQ29uc3RyKTtcblxuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBjb250cm9sbGVyIGZvciBtb2RlbDogJHttb2RlbENsYXp6TmFtZX0gd2l0aCAke2ZhY3RvcnlSb3V0ZXM/Lmxlbmd0aCA/PyAwfSBmYWN0b3J5IHJvdXRlc2BcbiAgICApO1xuXG4gICAgY29uc3QgYXV0aENvbmZpZzogQXV0aENvbmZpZyB8IHVuZGVmaW5lZCA9IG1lcmdlZENvbmZpZy5hdXRoO1xuXG4gICAgZnVuY3Rpb24gYXBwbHlDbGFzc0F1dGgodGFyZ2V0OiBhbnkpIHtcbiAgICAgIGlmIChhdXRoQ29uZmlnPy5wdWJsaWMpIHtcbiAgICAgICAgUHVibGljKCkodGFyZ2V0KTtcbiAgICAgIH0gZWxzZSBpZiAoYXV0aENvbmZpZz8ucm9sZXM/Lmxlbmd0aCkge1xuICAgICAgICBSZXF1aXJlUm9sZXMoLi4uYXV0aENvbmZpZy5yb2xlcykodGFyZ2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEF1dGgoTW9kZWxDb25zdHIpKHRhcmdldCk7XG4gICAgICB9XG4gICAgICBpZiAoYXV0aENvbmZpZz8uc2tpcE1vZGVsUm9sZXMpIHtcbiAgICAgICAgU2V0TWV0YWRhdGEoU0tJUF9NT0RFTF9ST0xFU19LRVksIHRydWUpKHRhcmdldCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQENvbnRyb2xsZXIocm91dGVQYXRoKVxuICAgIEBBcGlUYWdzKG1vZGVsQ2xhenpOYW1lKVxuICAgIEBBcGlFeHRyYU1vZGVscyhNb2RlbENvbnN0cilcbiAgICBjbGFzcyBEeW5hbWljTW9kZWxDb250cm9sbGVyIGV4dGVuZHMgRGVjYWZNb2RlbENvbnRyb2xsZXI8VD4ge1xuICAgICAgcHJpdmF0ZSByZWFkb25seSBwazogc3RyaW5nID0gTW9kZWwucGsoTW9kZWxDb25zdHIpIGFzIHN0cmluZztcblxuICAgICAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgY2xhc3MoKSB7XG4gICAgICAgIHJldHVybiBNb2RlbENvbnN0cjtcbiAgICAgIH1cblxuICAgICAgb3ZlcnJpZGUgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8VD4ge1xuICAgICAgICByZXR1cm4gTW9kZWxDb25zdHI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0cnVjdG9yKGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQpIHtcbiAgICAgICAgc3VwZXIoY2xpZW50Q29udGV4dCwgRHluYW1pY01vZGVsQ29udHJvbGxlci5uYW1lKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYFJlZ2lzdGVyaW5nIGR5bmFtaWMgY29udHJvbGxlciBmb3IgbW9kZWw6ICR7dGhpcy5jbGFzcy5uYW1lfSByb3V0ZTogLyR7cm91dGVQYXRofWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseUNsYXNzQXV0aChEeW5hbWljTW9kZWxDb250cm9sbGVyKTtcblxuICAgIGlmIChmYWN0b3J5Um91dGVzKSB7XG4gICAgICBjb25zdCBzb3J0ZWRSb3V0ZXMgPSBbLi4uZmFjdG9yeVJvdXRlc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhU2VnbWVudHMgPSBhLnBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgY29uc3QgYlNlZ21lbnRzID0gYi5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGNvbnN0IGFQYXJhbUNvdW50ID0gYVNlZ21lbnRzLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSkubGVuZ3RoO1xuICAgICAgICBjb25zdCBiUGFyYW1Db3VudCA9IGJTZWdtZW50cy5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYUxpdGVyYWxDb3VudCA9IGFTZWdtZW50cy5sZW5ndGggLSBhUGFyYW1Db3VudDtcbiAgICAgICAgY29uc3QgYkxpdGVyYWxDb3VudCA9IGJTZWdtZW50cy5sZW5ndGggLSBiUGFyYW1Db3VudDtcbiAgICAgICAgaWYgKGFMaXRlcmFsQ291bnQgIT09IGJMaXRlcmFsQ291bnQpXG4gICAgICAgICAgcmV0dXJuIGJMaXRlcmFsQ291bnQgLSBhTGl0ZXJhbENvdW50O1xuICAgICAgICBpZiAoYVBhcmFtQ291bnQgIT09IGJQYXJhbUNvdW50KVxuICAgICAgICAgIHJldHVybiBhUGFyYW1Db3VudCAtIGJQYXJhbUNvdW50O1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiBzb3J0ZWRSb3V0ZXMpIHtcbiAgICAgICAgY29uc3QgcmVnaXN0cmF0aW9uID0gRnJvbU1vZGVsQ29udHJvbGxlci5tYXRjaFJvdXRlKFxuICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgIHBrUGF0aCxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgICAgIGdldFBLLFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIGZhY3RvcnlQZXJzaXN0ZW5jZVxuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlZ2lzdHJhdGlvbikgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgeyBtZXRob2ROYW1lLCBoYW5kbGVyLCBkZWNvcmF0b3JzLCBwYXJhbURlY29yYXRvcnMgfSA9XG4gICAgICAgICAgcmVnaXN0cmF0aW9uO1xuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChcbiAgICAgICAgICBEeW5hbWljTW9kZWxDb250cm9sbGVyLFxuICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgaGFuZGxlclxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgY29uc3QgaHR0cERlY29yYXRvciA9IEh0dHBWZXJiVG9EZWNvcmF0b3Iocm91dGUubWV0aG9kIGFzIEh0dHBWZXJicykoXG4gICAgICAgICAgICByb3V0ZS5wYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpIHx8IHVuZGVmaW5lZFxuICAgICAgICAgICk7XG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5hcHBseURlY29yYXRvcnMoXG4gICAgICAgICAgICBEeW5hbWljTW9kZWxDb250cm9sbGVyLFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIFtodHRwRGVjb3JhdG9yLCAuLi5kZWNvcmF0b3JzXSxcbiAgICAgICAgICAgIHBhcmFtRGVjb3JhdG9yc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gRHluYW1pY01vZGVsQ29udHJvbGxlciBhcyBhbnk7XG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVQYXJhbWV0ZXJzRnJvbU1vZGVsPFQgZXh0ZW5kcyBNb2RlbDxhbnk+PihcbiAgICBNb2RlbENsYXp6OiBNb2RlbENvbnN0cnVjdG9yPFQ+XG4gICk6IHtcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W107XG4gICAgZ2V0UEs6ICguLi5wYXJhbXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZztcbiAgfSB7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhNb2RlbENsYXp6KSBhcyBrZXlvZiBNb2RlbDxhbnk+O1xuICAgIGNvbnN0IGNvbXBvc2VkID0gTWV0YWRhdGEuZ2V0KFxuICAgICAgTW9kZWxDbGF6eixcbiAgICAgIE1ldGFkYXRhLmtleShEQktleXMuQ09NUE9TRUQsIHBrKVxuICAgICk7XG4gICAgY29uc3QgY29tcG9zZWRLZXlzID0gY29tcG9zZWQ/LmFyZ3MgPz8gW107XG5cbiAgICBjb25zdCB1bmlxdWVLZXlzID1cbiAgICAgIEFycmF5LmlzQXJyYXkoY29tcG9zZWRLZXlzKSAmJiBjb21wb3NlZEtleXMubGVuZ3RoID4gMFxuICAgICAgICA/IEFycmF5LmZyb20obmV3IFNldChbLi4uY29tcG9zZWRLZXlzXSkpXG4gICAgICAgIDogQXJyYXkuZnJvbShuZXcgU2V0KFtwa10pKTtcblxuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gTWV0YWRhdGEuZGVzY3JpcHRpb24oTW9kZWxDbGF6eikgPz8gXCJcIjtcbiAgICBjb25zdCBwYXRoID0gYDoke3VuaXF1ZUtleXMuam9pbihcIi86XCIpfWA7XG4gICAgY29uc3QgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdID0gdW5pcXVlS2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZToga2V5LFxuICAgICAgICBkZXNjcmlwdGlvbjogTWV0YWRhdGEuZGVzY3JpcHRpb24oTW9kZWxDbGF6eiwga2V5KSxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgIGdldFBLOiAoLi4ucGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PlxuICAgICAgICBjb21wb3NlZD8uc2VwYXJhdG9yID8gcGFyYW1zLmpvaW4oY29tcG9zZWQuc2VwYXJhdG9yKSA6IHBhcmFtcy5qb2luKFwiXCIpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkZWZpbmVNZXRob2QoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4gICk6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgdGFyZ2V0LnByb3RvdHlwZSB8fCB0YXJnZXQsXG4gICAgICBtZXRob2ROYW1lLFxuICAgICAge1xuICAgICAgICB2YWx1ZTogaGFuZGxlcixcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgIHRhcmdldC5wcm90b3R5cGUgfHwgdGFyZ2V0LFxuICAgICAgbWV0aG9kTmFtZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBhcHBseURlY29yYXRvcnMoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIG1ldGhvZERlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4sXG4gICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+ID0gW11cbiAgKSB7XG4gICAgY29uc3QgcHJvdG8gPSB0YXJnZXQ/LnByb3RvdHlwZSA/PyB0YXJnZXQ7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG1ldGhvZE5hbWUpO1xuICAgIG1ldGhvZERlY29yYXRvcnMuZm9yRWFjaCgoZCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcikpO1xuICAgIHBhcmFtRGVjb3JhdG9ycy5mb3JFYWNoKCh7IGRlY29yYXRvciwgaW5kZXggfSkgPT5cbiAgICAgIGRlY29yYXRvcihwcm90bywgbWV0aG9kTmFtZSwgaW5kZXgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG1hdGNoUm91dGUoXG4gICAgcm91dGU6IFNlcnZlclJvdXRlLFxuICAgIHBrUGF0aDogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBnZXRQSzogKC4uLnA6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZyxcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgcGVyc2lzdGVuY2U/OiBhbnlcbiAgKToge1xuICAgIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueTtcbiAgICBkZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+O1xuICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PjtcbiAgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgeyBtZXRob2QsIHBhdGggfSA9IHJvdXRlO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKTtcblxuICAgIGlmIChtZXRob2QgPT09IFwiUE9TVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiY3JlYXRlXCIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ3JlYXRlSGFuZGxlcihNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNyZWF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQT1NUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiY3JlYXRlQWxsXCIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQnVsa0NyZWF0ZUhhbmRsZXIoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrQ3JlYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSwgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInJlYWRBbGxcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVCdWxrUmVhZEhhbmRsZXIobW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtSZWFkRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IFF1ZXJ5KFwiaWRzXCIpIGFzIGFueSwgaW5kZXg6IDAgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQVVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJ1cGRhdGVBbGxcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVCdWxrVXBkYXRlSGFuZGxlcihtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa1VwZGF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBhcGlQcm9wZXJ0aWVzKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJERUxFVEVcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJkZWxldGVBbGxcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVCdWxrRGVsZXRlSGFuZGxlcihtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa0RlbGV0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBhcGlQcm9wZXJ0aWVzKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBRdWVyeShcImlkc1wiKSBhcyBhbnksIGluZGV4OiAwIH0sIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gcGtQYXRoKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwicmVhZFwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlYWRIYW5kbGVyKGdldFBLLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucmVhZERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBhcGlQcm9wZXJ0aWVzLCBwa1BhdGgpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IERlY2FmUGFyYW1zKGFwaVByb3BlcnRpZXMpIGFzIGFueSwgaW5kZXg6IDAgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQVVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gcGtQYXRoKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwidXBkYXRlXCIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlVXBkYXRlSGFuZGxlcihnZXRQSywgTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci51cGRhdGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgYXBpUHJvcGVydGllcywgcGtQYXRoKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZlBhcmFtcyhhcGlQcm9wZXJ0aWVzKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAyIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJERUxFVEVcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gcGtQYXRoKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiZGVsZXRlXCIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlRGVsZXRlSGFuZGxlcihnZXRQSywgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlbGV0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBhcGlQcm9wZXJ0aWVzLCBwa1BhdGgpLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmUGFyYW1zKGFwaVByb3BlcnRpZXMpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ29tcG9zZWQgUEsgZmFsbGJhY2sgcm91dGVzIChmaWx0ZXJFbXB0eSkg4oCUIHBhdGggZGlmZmVycyBmcm9tIHBrUGF0aFxuICAgIGNvbnN0IGZhbGxiYWNrU2VnbWVudHMgPSBub3JtYWxpemVkUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGlzQWxsUGFyYW1zID0gZmFsbGJhY2tTZWdtZW50cy5sZW5ndGggPiAwICYmIGZhbGxiYWNrU2VnbWVudHMuZXZlcnkoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgIGlmIChpc0FsbFBhcmFtcyAmJiBub3JtYWxpemVkUGF0aCAhPT0gcGtQYXRoKSB7XG4gICAgICBjb25zdCBmYWxsYmFja0FwaVByb3BzID0gZmFsbGJhY2tTZWdtZW50cy5tYXAoKHMpID0+IHMuc2xpY2UoMSkpLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlcmAsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCBzdWZmaXggPSBmYWxsYmFja1NlZ21lbnRzLm1hcCgocykgPT4gcy5zbGljZSgxKSkuam9pbihcIkFuZFwiKTtcbiAgICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICAgIGByZWFkQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVhZEhhbmRsZXIoZ2V0UEssIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJlYWREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgZmFsbGJhY2tBcGlQcm9wcywgbm9ybWFsaXplZFBhdGgpLFxuICAgICAgICAgIFt7IGRlY29yYXRvcjogRGVjYWZQYXJhbXMoZmFsbGJhY2tBcGlQcm9wcykgYXMgYW55LCBpbmRleDogMCB9XVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJQVVRcIikge1xuICAgICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgICAgYHVwZGF0ZUJ5JHtzdWZmaXh9YCxcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVVwZGF0ZUhhbmRsZXIoZ2V0UEssIE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci51cGRhdGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgZmFsbGJhY2tBcGlQcm9wcywgbm9ybWFsaXplZFBhdGgpLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZlBhcmFtcyhmYWxsYmFja0FwaVByb3BzKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMiB9LFxuICAgICAgICAgIF1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRob2QgPT09IFwiREVMRVRFXCIpIHtcbiAgICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICAgIGBkZWxldGVCeSR7c3VmZml4fWAsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVEZWxldGVIYW5kbGVyKGdldFBLLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWxldGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgZmFsbGJhY2tBcGlQcm9wcywgbm9ybWFsaXplZFBhdGgpLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZlBhcmFtcyhmYWxsYmFja0FwaVByb3BzKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgICAgXVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInN0YXRlbWVudFwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVN0YXRlbWVudEhhbmRsZXIobW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBQYXJhbShcIm1ldGhvZFwiKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFBhcmFtKFwiYXJnc1wiKSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiAyIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGVtZW50Um91dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgXCJsaXN0QnkvOmtleVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSxcbiAgICAgIFwicGFnaW5hdGVCeS86a2V5LzpwYWdlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZLFxuICAgICAgXCJmaW5kLzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCxcbiAgICAgIFwicGFnZS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsXG4gICAgICBcImZpbmRPbmVCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlksXG4gICAgICBcImZpbmRCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWSxcbiAgICAgIFwiY291bnRPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLFxuICAgICAgXCJtYXhPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRixcbiAgICAgIFwibWluT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsXG4gICAgICBcImF2Z09mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GLFxuICAgICAgXCJzdW1PZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRixcbiAgICAgIFwiZGlzdGluY3RPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLFxuICAgICAgXCJncm91cE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsXG4gICAgfTtcblxuICAgIGNvbnN0IHN0YXRlbWVudEtleSA9IHN0YXRlbWVudFJvdXRlc1tub3JtYWxpemVkUGF0aF07XG4gICAgaWYgKHN0YXRlbWVudEtleSAmJiBtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRNZXRob2ROYW1lKG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVTdGF0ZW1lbnRTaG9ydGN1dEhhbmRsZXIoc3RhdGVtZW50S2V5LCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgbm9ybWFsaXplZFBhdGgsIHN0YXRlbWVudEtleSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50U2hvcnRjdXRQYXJhbXMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSkge1xuICAgICAgY29uc3QgcXVlcnlNZXRob2QgPSBub3JtYWxpemVkUGF0aC5yZXBsYWNlKC9ecXVlcnlcXC8vLCBcIlwiKS5zcGxpdChcIi9cIilbMF07XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIHF1ZXJ5TWV0aG9kLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIocXVlcnlNZXRob2QpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmdldFF1ZXJ5RGVjb3JhdG9ycyhxdWVyeU1ldGhvZCwgbm9ybWFsaXplZFBhdGgsIFwiR0VUXCIsIHRydWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNvbXBsZXhRdWVyeVBhcmFtcyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIGN1c3RvbSBAcm91dGUoKSBwYXRocyAoZS5nLiBcIm1ldGFkYXRhL2Zvci1wcm9kdWN0Lzpwcm9kdWN0Q29kZVwiKVxuICAgIGNvbnN0IHBhdGhTZWdtZW50cyA9IG5vcm1hbGl6ZWRQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3Qga25vd25QcmVmaXhlcyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICAgICBcImxpc3RCeVwiLCBcImZpbmRCeVwiLCBcImZpbmRCeVBhZ2luYXRlXCIsIFwiZmluZE9uZUJ5XCIsIFwicGFnaW5hdGVCeVwiLFxuICAgICAgXCJmaW5kXCIsIFwicGFnZVwiLCBcImNvdW50T2ZcIiwgXCJtYXhPZlwiLCBcIm1pbk9mXCIsIFwiYXZnT2ZcIiwgXCJzdW1PZlwiLFxuICAgICAgXCJkaXN0aW5jdE9mXCIsIFwiZ3JvdXBPZlwiLCBcInN0YXRlbWVudFwiLCBcImJ1bGtcIiwgXCJxdWVyeVwiLFxuICAgIF0pO1xuICAgIGlmIChcbiAgICAgIHBhdGhTZWdtZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAhbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSAmJlxuICAgICAgIWtub3duUHJlZml4ZXMuaGFzKHBhdGhTZWdtZW50c1swXSlcbiAgICApIHtcbiAgICAgIC8vIExvb2sgdXAgdGhlIGFjdHVhbCBtZXRob2QgbmFtZSBmcm9tIEByb3V0ZSBtZXRhZGF0YSBieSBtYXRjaGluZyB0aGUgcGF0aC5cbiAgICAgIC8vIFRoZSBAcm91dGUgZGVjb3JhdG9yIHN0b3JlcyB7IHBhdGgsIGh0dHBNZXRob2QsIGhhbmRsZXIgfSBrZXllZCBieSBtZXRob2QgbmFtZVxuICAgICAgLy8gb24gdGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3IuXG4gICAgICBjb25zdCByb3V0ZU1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgICAgTWV0YWRhdGEuZ2V0KFxuICAgICAgICAgIChwZXJzaXN0ZW5jZSBhcyBhbnkpPy5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBNZXRhZGF0YS5rZXkoREVDQUZfUk9VVEUpXG4gICAgICAgICkgPz8ge307XG4gICAgICBjb25zdCBtYXRjaGVkRW50cnkgPSBPYmplY3QuZW50cmllcyhyb3V0ZU1ldGFkYXRhKS5maW5kKFxuICAgICAgICAoWywgaW5mb10pID0+XG4gICAgICAgICAgaW5mbyAmJlxuICAgICAgICAgIHR5cGVvZiBpbmZvID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgaW5mby5wYXRoPy5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKSA9PT0gbm9ybWFsaXplZFBhdGhcbiAgICAgICk7XG4gICAgICBjb25zdCBhY3R1YWxNZXRob2ROYW1lID0gbWF0Y2hlZEVudHJ5Py5bMF0gfHwgcGF0aFNlZ21lbnRzWzBdO1xuXG4gICAgICBjb25zdCBwYXJhbVNlZ21lbnRzID0gcGF0aFNlZ21lbnRzLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgICBjb25zdCBhcGlQYXRoUGFyYW1zID0gcGFyYW1TZWdtZW50cy5tYXAoKHMpID0+IHMuc2xpY2UoMSkpLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBhY3R1YWxNZXRob2ROYW1lLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUN1c3RvbVJvdXRlSGFuZGxlcihhY3R1YWxNZXRob2ROYW1lKSxcbiAgICAgICAgW1xuICAgICAgICAgIC4uLmFwaVBhdGhQYXJhbXMubWFwKChwKSA9PiBBcGlQYXJhbShwKSksXG4gICAgICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgXCIke2FjdHVhbE1ldGhvZE5hbWV9XCIuYCB9KSxcbiAgICAgICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUmVzdWx0IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuXCIgfSksXG4gICAgICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuXCIgfSksXG4gICAgICAgIF0sXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY29tcGxleFF1ZXJ5UGFyYW1zKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgICBkZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+LFxuICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PlxuICApIHtcbiAgICByZXR1cm4geyBtZXRob2ROYW1lLCBoYW5kbGVyLCBkZWNvcmF0b3JzLCBwYXJhbURlY29yYXRvcnMgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudE1ldGhvZE5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmaXJzdFNlZ21lbnQgPSBwYXRoLnNwbGl0KFwiL1wiKVswXTtcbiAgICByZXR1cm4gZmlyc3RTZWdtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50U2hvcnRjdXRQYXJhbXMoXG4gICAgcGF0aDogc3RyaW5nXG4gICk6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBjb25zdCBwYXJhbXM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4gPSBbXTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWcsIGkpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzZWcucmVwbGFjZShcIjpcIiwgXCJcIik7XG4gICAgICBwYXJhbXMucHVzaCh7IGRlY29yYXRvcjogUGFyYW0obmFtZSkgYXMgYW55LCBpbmRleDogaSB9KTtcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJsaXN0QnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdpbmF0ZUJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwiZmluZC9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2UvXCIpXG4gICAgKSB7XG4gICAgICBwYXJhbXMucHVzaCh7IGRlY29yYXRvcjogRGVjYWZRdWVyeSgpIGFzIGFueSwgaW5kZXg6IHNlZ21lbnRzLmxlbmd0aCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNvbXBsZXhRdWVyeVBhcmFtcyhcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgIGNvbnN0IHBhcmFtczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZywgaSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHNlZy5yZXBsYWNlKFwiOlwiLCBcIlwiKTtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBQYXJhbShuYW1lKSBhcyBhbnksIGluZGV4OiBpIH0pO1xuICAgIH0pO1xuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogc2VnbWVudHMubGVuZ3RoIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQ3JlYXRlSGFuZGxlcihcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGRhdGE6IGFueSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPE1vZGVsPGFueT4+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIE9wZXJhdGlvbktleXMuQ1JFQVRFLCB0cnVlKVxuICAgICAgKS5mb3IoY3JlYXRlKTtcbiAgICAgIGxvZy52ZXJib3NlKGBjcmVhdGluZyBuZXcgJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgIGxldCBjcmVhdGVkOiBNb2RlbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNyZWF0ZWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuY3JlYXRlKGRhdGEsIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgJHttb2RlbENsYXp6TmFtZX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGBjcmVhdGVkIG5ldyAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7KGNyZWF0ZWQgYXMgYW55KVt0aGlzLnBrXX1gKTtcbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVCdWxrQ3JlYXRlSGFuZGxlcihcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFsbChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGRhdGE6IGFueVtdLFxuICAgICAgcmVzcD86IGFueVxuICAgICk6IFByb21pc2U8TW9kZWxbXT4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsIHRydWUpXG4gICAgICApLmZvcihjcmVhdGVBbGwpO1xuICAgICAgbG9nLnZlcmJvc2UoYGNyZWF0aW5nIG5ldyAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgbGV0IGNyZWF0ZWQ6IGFueVtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY3JlYXRlZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5jcmVhdGVBbGwoXG4gICAgICAgICAgZGF0YS5tYXAoKGQpID0+IG5ldyBNb2RlbENvbnN0cihkKSksXG4gICAgICAgICAgY3R4XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgJHttb2RlbENsYXp6TmFtZX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGBjcmVhdGVkIG5ldyAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7KGNyZWF0ZWQgYXMgYW55KVt0aGlzLnBrXX1gKTtcbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVCdWxrUmVhZEhhbmRsZXIobW9kZWxDbGF6ek5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiByZWFkQWxsKFxuICAgICAgdGhpczogYW55LFxuICAgICAgaWRzOiBzdHJpbmdbXVxuICAgICk6IFByb21pc2U8TW9kZWxbXT4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLCB0cnVlKVxuICAgICAgKS5mb3IocmVhZEFsbCk7XG4gICAgICBjb25zdCBub3JtYWxpemVkSWRzID0gQXJyYXkuaXNBcnJheShpZHMpID8gaWRzIDogW2lkc107XG4gICAgICBsZXQgcmVhZDogTW9kZWxbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgcmVhZGluZyAke25vcm1hbGl6ZWRJZHN9ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICAgIHJlYWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkucmVhZEFsbChub3JtYWxpemVkSWRzIGFzIGFueSwgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gcmVhZCAke21vZGVsQ2xhenpOYW1lfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYHJlYWQgJHtyZWFkLmxlbmd0aH0gJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgIHJldHVybiByZWFkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVCdWxrVXBkYXRlSGFuZGxlcihtb2RlbENsYXp6TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUFsbChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGJvZHk6IGFueVtdLFxuICAgICAgcmVzcD86IGFueVxuICAgICk6IFByb21pc2U8YW55W10+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLCB0cnVlKVxuICAgICAgKS5mb3IodXBkYXRlQWxsKTtcbiAgICAgIGxldCB1cGRhdGVkOiBhbnlbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZy5pbmZvKGB1cGRhdGluZyAke2JvZHkubGVuZ3RofSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgICB1cGRhdGVkID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnVwZGF0ZUFsbChib2R5LCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQnVsa0RlbGV0ZUhhbmRsZXIobW9kZWxDbGF6ek5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBkZWxldGVBbGwoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBpZHM6IHN0cmluZ1tdLFxuICAgICAgcmVzcD86IGFueVxuICAgICk6IFByb21pc2U8TW9kZWxbXT4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsIHRydWUpXG4gICAgICApLmZvcihkZWxldGVBbGwpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZElkcyA9IEFycmF5LmlzQXJyYXkoaWRzKSA/IGlkcyA6IFtpZHNdO1xuICAgICAgbGV0IHJlYWQ6IE1vZGVsW107XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuZGVidWcoYGRlbGV0aW5nICR7bm9ybWFsaXplZElkcy5sZW5ndGh9ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICAgIHJlYWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuZGVsZXRlQWxsKG5vcm1hbGl6ZWRJZHMsIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSAke21vZGVsQ2xhenpOYW1lfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYGRlbGV0ZWQgJHtyZWFkLmxlbmd0aH0gJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiByZWFkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVSZWFkSGFuZGxlcihcbiAgICBnZXRQSzogKC4uLnA6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZyxcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiByZWFkKFxuICAgICAgdGhpczogYW55LFxuICAgICAgcm91dGVQYXJhbXM6IGFueVxuICAgICk6IFByb21pc2U8TW9kZWw+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSlcbiAgICAgICkuZm9yKHJlYWQpO1xuICAgICAgY29uc3QgaWQgPSBnZXRQSyguLi5yb3V0ZVBhcmFtcy52YWx1ZXNJbk9yZGVyKTtcbiAgICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYE5vICR7dGhpcy5wa30gcHJvdmlkZWRgKTtcbiAgICAgIGxldCByZWFkUmVzdWx0OiBNb2RlbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgcmVhZGluZyAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7dGhpcy5wa30gJHtpZH1gKTtcbiAgICAgICAgcmVhZFJlc3VsdCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5yZWFkKGlkLCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byByZWFkICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtpZH1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGByZWFkICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHsocmVhZFJlc3VsdCBhcyBhbnkpW3RoaXMucGtdfWApO1xuICAgICAgcmV0dXJuIHJlYWRSZXN1bHQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVVwZGF0ZUhhbmRsZXIoXG4gICAgZ2V0UEs6ICguLi5wOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmcsXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiB1cGRhdGUoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICByb3V0ZVBhcmFtczogYW55LFxuICAgICAgYm9keTogYW55LFxuICAgICAgcmVzcD86IGFueVxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBPcGVyYXRpb25LZXlzLlVQREFURSwgdHJ1ZSlcbiAgICAgICkuZm9yKHVwZGF0ZSk7XG4gICAgICBjb25zdCBpZCA9IGdldFBLKC4uLnJvdXRlUGFyYW1zLnZhbHVlc0luT3JkZXIpO1xuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgTm8gJHt0aGlzLnBrfSBwcm92aWRlZGApO1xuICAgICAgbGV0IHVwZGF0ZWQ6IGFueTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZy5pbmZvKGB1cGRhdGluZyAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7dGhpcy5wa30gJHtpZH1gKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYm9keSkpO1xuICAgICAgICB1cGRhdGVkID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnVwZGF0ZShcbiAgICAgICAgICBuZXcgTW9kZWxDb25zdHIoeyAuLi5wYXlsb2FkLCBbdGhpcy5wa106IGlkIH0pLFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlRGVsZXRlSGFuZGxlcihcbiAgICBnZXRQSzogKC4uLnA6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZyxcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiByZW1vdmUoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICByb3V0ZVBhcmFtczogYW55LFxuICAgICAgcmVzcD86IGFueVxuICAgICk6IFByb21pc2U8TW9kZWw+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIE9wZXJhdGlvbktleXMuREVMRVRFLCB0cnVlKVxuICAgICAgKS5mb3IocmVtb3ZlKTtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UEsoLi4ucm91dGVQYXJhbXMudmFsdWVzSW5PcmRlcik7XG4gICAgICBpZiAodHlwZW9mIGlkID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBObyAke3RoaXMucGt9IHByb3ZpZGVkYCk7XG4gICAgICBsZXQgZGVsOiBNb2RlbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgZGVsZXRpbmcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCAke3RoaXMucGt9ICR7aWR9YCk7XG4gICAgICAgIGRlbCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5kZWxldGUoaWQsIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7aWR9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgZGVsZXRlZCAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7aWR9YCk7XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gZGVsO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVTdGF0ZW1lbnRIYW5kbGVyKG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gc3RhdGVtZW50KFxuICAgICAgdGhpczogYW55LFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgYXJnczogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIGRldGFpbHM6IERpcmVjdGlvbkxpbWl0T2Zmc2V0XG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IHsgY3R4IH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBQZXJzaXN0ZW5jZUtleXMuU1RBVEVNRU5ULCB0cnVlKVxuICAgICAgKS5mb3Ioc3RhdGVtZW50KTtcbiAgICAgIGNvbnN0IHsgZGlyZWN0aW9uLCBvZmZzZXQsIGxpbWl0LCBib29rbWFyayB9ID0gZGV0YWlscztcbiAgICAgIGFyZ3MgPSBhcmdzLm1hcChcbiAgICAgICAgKGEpID0+ICh0eXBlb2YgYSA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlSW50KGEgYXMgc3RyaW5nKSA6IGEpIHx8IGFcbiAgICAgICkgYXMgYW55W107XG4gICAgICBjb25zdCBwYXRoRGlyZWN0aW9uID0gYXJncy5sZW5ndGggPiAxID8gYXJnc1sxXSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlc29sdmVkRGlyZWN0aW9uID0gKGRpcmVjdGlvbiA/PyBwYXRoRGlyZWN0aW9uKSBhc1xuICAgICAgICB8IHN0cmluZ1xuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChyZXNvbHZlZERpcmVjdGlvbiAmJiBhcmdzLmxlbmd0aCA+IDEpIGFyZ3NbMV0gPSByZXNvbHZlZERpcmVjdGlvbjtcbiAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZOlxuICAgICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24gYXMgc3RyaW5nKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRTpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWTpcbiAgICAgICAgICBhcmdzID0gW1xuICAgICAgICAgICAgYXJnc1swXSxcbiAgICAgICAgICAgIHJlc29sdmVkRGlyZWN0aW9uIGFzIGFueSxcbiAgICAgICAgICAgIHsgbGltaXQsIG9mZnNldCwgYm9va21hcmsgfSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KS5zdGF0ZW1lbnQobmFtZSwgLi4uYXJncywgY3R4KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlU3RhdGVtZW50U2hvcnRjdXRIYW5kbGVyKFxuICAgIHN0YXRlbWVudEtleTogc3RyaW5nLFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHN0YXRlbWVudFNob3J0Y3V0KFxuICAgICAgdGhpczogYW55LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApOiBQcm9taXNlPGFueT4ge1xuICAgICAgY29uc3QgeyBjdHggfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIHN0YXRlbWVudEtleSwgdHJ1ZSlcbiAgICAgICkuZm9yKHN0YXRlbWVudFNob3J0Y3V0KTtcblxuICAgICAgc3dpdGNoIChzdGF0ZW1lbnRLZXkpIHtcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWToge1xuICAgICAgICAgIGNvbnN0IFtrZXksIGRldGFpbHNdID0gYXJncztcbiAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmxpc3RCeShcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIChkZXRhaWxzIGFzIGFueSk/LmRpcmVjdGlvbiBhcyBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICAgIGN0eFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWToge1xuICAgICAgICAgIGNvbnN0IFtrZXksIHBhZ2UsIGRldGFpbHNdID0gYXJncztcbiAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnBhZ2luYXRlQnkoXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAoZGV0YWlscyBhcyBhbnkpPy5kaXJlY3Rpb24gYXMgT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxpbWl0OiAoZGV0YWlscyBhcyBhbnkpPy5saW1pdCxcbiAgICAgICAgICAgICAgb2Zmc2V0OiAoZGV0YWlscyBhcyBhbnkpPy5vZmZzZXQsXG4gICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgICAgIGN0eFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORDoge1xuICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgZGV0YWlsc10gPSBhcmdzO1xuICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9XG4gICAgICAgICAgICAoZGV0YWlscyBhcyBhbnkpPy5kaXJlY3Rpb24gPz8gT3JkZXJEaXJlY3Rpb24uQVNDO1xuICAgICAgICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gdGhpcy5wZXJzaXN0ZW5jZShjdHgpO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2UuZmluZCA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLmZpbmQodmFsdWUsIGRpcmVjdGlvbiwgY3R4KTtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2Uuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELCB2YWx1ZSwgZGlyZWN0aW9uLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0U6IHtcbiAgICAgICAgICBjb25zdCBbdmFsdWUsIGRldGFpbHNdID0gYXJncztcbiAgICAgICAgICBjb25zdCByZWYgPSB7XG4gICAgICAgICAgICBvZmZzZXQ6IChkZXRhaWxzIGFzIGFueSk/Lm9mZnNldCA/PyAxLFxuICAgICAgICAgICAgbGltaXQ6IChkZXRhaWxzIGFzIGFueSk/LmxpbWl0ID8/IDEwLFxuICAgICAgICAgICAgYm9va21hcms6IChkZXRhaWxzIGFzIGFueSk/LmJvb2ttYXJrLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gKGRldGFpbHMgYXMgYW55KT8uZGlyZWN0aW9uID8/IE9yZGVyRGlyZWN0aW9uLkFTQztcbiAgICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLnBhZ2UgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5wYWdlKHZhbHVlLCBkaXJlY3Rpb24sIHJlZiwgY3R4KTtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2Uuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLCB2YWx1ZSwgZGlyZWN0aW9uLCByZWYsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlk6IHtcbiAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBhcmdzO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuZmluZE9uZUJ5KGtleSwgdmFsdWUsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWToge1xuICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGFyZ3M7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KVxuICAgICAgICAgICAgLmZvcihjdHgudG9PdmVycmlkZXMoKSlcbiAgICAgICAgICAgIC5maW5kQnkoa2V5LCB2YWx1ZSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1JTl9PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgW2ZpZWxkXSA9IGFyZ3M7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnN0YXRlbWVudChzdGF0ZW1lbnRLZXksIGZpZWxkLCBjdHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhdGVtZW50OiAke3N0YXRlbWVudEtleX1gKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY29tcGxleFF1ZXJ5KFxuICAgICAgdGhpczogYW55LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApOiBQcm9taXNlPGFueT4ge1xuICAgICAgY29uc3QgbG9nOiBhbnkgPSB0aGlzLmxvZz8uZm9yPy4oY29tcGxleFF1ZXJ5KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChsb2cpIGxvZy5kZWJ1ZyhgSW52b2tpbmcgY3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiYCk7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSAoXG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIG1ldGhvZE5hbWUsIHRydWUpXG4gICAgICAgICkuZm9yKGNvbXBsZXhRdWVyeSk7XG4gICAgICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gdGhpcy5wZXJzaXN0ZW5jZShjdHgpO1xuICAgICAgICBjb25zdCBzcHJlYWRBcmdzID0gRnJvbU1vZGVsQ29udHJvbGxlci5leHRyYWN0UXVlcnlBcmdzKGFyZ3MpO1xuICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2VbbWV0aG9kTmFtZV0oLi4uc3ByZWFkQXJncywgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLnN0YXRlbWVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnN0YXRlbWVudChtZXRob2ROYW1lLCAuLi5zcHJlYWRBcmdzLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGVyc2lzdGVuY2UgbWV0aG9kIFwiJHttZXRob2ROYW1lfVwiIG5vdCBmb3VuZCBvbiAke3BlcnNpc3RlbmNlPy5jb25zdHJ1Y3Rvcj8ubmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgaWYgKGxvZykgbG9nLmVycm9yKGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYCwgZSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUN1c3RvbVJvdXRlSGFuZGxlcihtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY3VzdG9tUm91dGUoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCBsb2c6IGFueSA9IHRoaXMubG9nPy5mb3I/LihjdXN0b21Sb3V0ZSk7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgbWV0aG9kTmFtZSwgdHJ1ZSlcbiAgICAgICkuZm9yKGN1c3RvbVJvdXRlKTtcbiAgICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gdGhpcy5wZXJzaXN0ZW5jZShjdHgpO1xuICAgICAgY29uc3Qgc3ByZWFkQXJncyA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZXh0cmFjdFF1ZXJ5QXJncyhhcmdzKTtcblxuICAgICAgLy8gVHJ5IHRoZSBwZXJzaXN0ZW5jZSBkaXJlY3RseSAod29ya3Mgd2hlbiBpdCdzIGEgY3VzdG9tIFJlcG9zaXRvcnkpXG4gICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdKC4uLnNwcmVhZEFyZ3MsIGN0eCk7XG4gICAgICB9XG4gICAgICAvLyBXaGVuIHBlcnNpc3RlbmNlIGlzIGEgTW9kZWxTZXJ2aWNlLCB0aGUgbWV0aG9kIGxpdmVzIG9uIHRoZSB1bmRlcmx5aW5nIHJlcG9cbiAgICAgIGlmIChwZXJzaXN0ZW5jZT8ucmVwbyAmJiB0eXBlb2YgcGVyc2lzdGVuY2UucmVwb1ttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5yZXBvW21ldGhvZE5hbWVdKC4uLnNwcmVhZEFyZ3MsIGN0eCk7XG4gICAgICB9XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gc3RhdGVtZW50IGdhdGV3YXlcbiAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2Uuc3RhdGVtZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnN0YXRlbWVudChtZXRob2ROYW1lLCAuLi5zcHJlYWRBcmdzLCBjdHgpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWV0aG9kIFwiJHttZXRob2ROYW1lfVwiIG5vdCBmb3VuZCBvbiAke3BlcnNpc3RlbmNlPy5jb25zdHJ1Y3Rvcj8ubmFtZX0gb3IgaXRzIHJlcG9gXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0UXVlcnlBcmdzKGFyZ3M6IGFueVtdKTogYW55W10ge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFyZ3M7XG4gICAgY29uc3QgbGFzdCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICBpZiAoXG4gICAgICBsYXN0ICYmXG4gICAgICB0eXBlb2YgbGFzdCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkobGFzdClcbiAgICApIHtcbiAgICAgIGNvbnN0IHF1ZXJ5T2JqID0gYXJncy5wb3AoKTtcbiAgICAgIGNvbnN0IGhhc0RpcmVjdGlvbiA9IHF1ZXJ5T2JqLmRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzTGltaXQgPSBxdWVyeU9iai5saW1pdCAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzT2Zmc2V0ID0gcXVlcnlPYmoub2Zmc2V0ICE9PSB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWhhc0RpcmVjdGlvbiAmJiAhaGFzTGltaXQgJiYgIWhhc09mZnNldCkgcmV0dXJuIGFyZ3M7XG4gICAgICBjb25zdCBleHRyYXM6IGFueVtdID0gW107XG4gICAgICBpZiAoaGFzRGlyZWN0aW9uKSBleHRyYXMucHVzaChxdWVyeU9iai5kaXJlY3Rpb24pO1xuICAgICAgZWxzZSBpZiAoaGFzTGltaXQgfHwgaGFzT2Zmc2V0KSBleHRyYXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgaWYgKGhhc0xpbWl0KSBleHRyYXMucHVzaChxdWVyeU9iai5saW1pdCk7XG4gICAgICBpZiAoaGFzT2Zmc2V0KSBleHRyYXMucHVzaChxdWVyeU9iai5vZmZzZXQpO1xuICAgICAgcmV0dXJuIFsuLi5hcmdzLCAuLi5leHRyYXNdO1xuICAgIH1cbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUNyZWF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiUE9TVFwiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBDcmVhdGUgYSBuZXcgJHttb2RlbENsYXp6TmFtZX0uYCB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgdHlwZTogRHRvRm9yKE9wZXJhdGlvbktleXMuQ1JFQVRFLCBNb2RlbENvbnN0ciksXG4gICAgICB9KSxcbiAgICAgIEFwaUNyZWF0ZWRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJSZXBvc2l0b3J5IHJlamVjdGVkIHRoZSBwcm92aWRlZCBwYXlsb2FkLlwiLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtDcmVhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBPU1RcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYENyZWF0ZSBhIG5ldyAke21vZGVsQ2xhenpOYW1lfS5gIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgJHttb2RlbENsYXp6TmFtZX1gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpQ3JlYXRlZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KSxcbiAgICAgIEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJlcG9zaXRvcnkgcmVqZWN0ZWQgdGhlIHByb3ZpZGVkIHBheWxvYWQuXCIsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVsa1JlYWREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBcImJ1bGtcIiksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkcyBieSBpZHMuYCB9KSxcbiAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJpZHNcIiwgcmVxdWlyZWQ6IHRydWUsIHR5cGU6IFwiYXJyYXlcIiB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVsa1VwZGF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXVxuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBVVFwiLCBcImJ1bGtcIiksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgUmVwbGFjZSBleGlzdGluZyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzIHdpdGggbmV3IHBheWxvYWRzLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yIHJlcGxhY2luZyBleGlzdGluZyByZWNvcmRzIG9mICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICRyZWY6IGdldFNjaGVtYVBhdGgoRHRvRm9yKE9wZXJhdGlvbktleXMuVVBEQVRFLCBNb2RlbENvbnN0cikpLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVsa0RlbGV0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXVxuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkRFTEVURVwiLCBcImJ1bGtcIiksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgRGVsZXRlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMgYnkgaWRzLmAgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwiaWRzXCIsIHJlcXVpcmVkOiB0cnVlLCB0eXBlOiBcImFycmF5XCIgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBkZWxldGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByZWFkRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIHBrUGF0aDogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIHBrUGF0aCksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdXBkYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIHBrUGF0aDogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiUFVUXCIsIHBrUGF0aCksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgUmVwbGFjZSBhbiBleGlzdGluZyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgd2l0aCBhIG5ldyBwYXlsb2FkLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yIHJlcGxhY2luZyBhbiBleGlzdGluZyByZWNvcmQgb2YgJHttb2RlbENsYXp6TmFtZX1gLFxuICAgICAgICB0eXBlOiBEdG9Gb3IoT3BlcmF0aW9uS2V5cy5VUERBVEUsIE1vZGVsQ29uc3RyKSxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gdXBkYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRlbGV0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkRFTEVURVwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYERlbGV0ZSBhICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBieSBpZC5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gZGVsZXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50RGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgXCJzdGF0ZW1lbnQvOm1ldGhvZC8qYXJnc1wiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBFeGVjdXRlcyBhIHByZXBhcmVkIHN0YXRlbWVudCBvbiAke21vZGVsQ2xhenpOYW1lfS5gLFxuICAgICAgfSksXG4gICAgICBBcGlQYXJhbSh7IG5hbWU6IFwibWV0aG9kXCIsIGRlc2NyaXB0aW9uOiBcInRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQgdG8gZXhlY3V0ZVwiIH0pLFxuICAgICAgQXBpUGFyYW0oe1xuICAgICAgICBuYW1lOiBcImFyZ3NcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiY29uY2F0ZW5hdGVkIGxpc3Qgb2YgYXJndW1lbnRzIHRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQgY2FuIGFjY2VwdFwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXIgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJsaW1pdFwiLCByZXF1aXJlZDogdHJ1ZSwgZGVzY3JpcHRpb246IFwibGltaXQgb3IgcGFnZSBzaXplIHdoZW4gYXBwbGljYWJsZVwiIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcIm9mZnNldFwiLCByZXF1aXJlZDogdHJ1ZSwgZGVzY3JpcHRpb246IFwib2Zmc2V0IG9yIGJvb2ttYXJrIHdoZW4gYXBwbGljYWJsZVwiIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gbGlzdGVkIGZvdW5kLmAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHN0YXRlbWVudEtleTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIGNvbnN0IGJhc2U6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4gPSBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIHBhdGgpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuYCB9KSxcbiAgICBdO1xuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZykgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHNlZy5yZXBsYWNlKFwiOlwiLCBcIlwiKTtcbiAgICAgIGJhc2UucHVzaChBcGlQYXJhbSh7IG5hbWUsIGRlc2NyaXB0aW9uOiBgVGhlICR7bmFtZX0gcGFyYW1ldGVyYCB9KSk7XG4gICAgfSk7XG5cbiAgICBpZiAoXG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJsaXN0QnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdpbmF0ZUJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwiZmluZC9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2UvXCIpXG4gICAgKSB7XG4gICAgICBiYXNlLnB1c2goXG4gICAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgICBuYW1lOiBcImRpcmVjdGlvblwiLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyXCIsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwicGFnaW5hdGVCeS9cIikgfHwgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIikpIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImxpbWl0XCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwicGFnZSBzaXplXCIgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJvZmZzZXRcIiwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogXCJwYWdlIG51bWJlclwiIH0pLFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwiYm9va21hcmtcIiwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogXCJib29rbWFyayBmb3IgY3Vyc29yIHBhZ2luYXRpb25cIiB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiZmluZE9uZUJ5L1wiKSB8fCBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kQnkvXCIpKSB7XG4gICAgICBiYXNlLnB1c2goXG4gICAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YgfHxcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRiB8fFxuICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GXG4gICAgKSB7XG4gICAgICBiYXNlLnB1c2goQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBgUmVzdWx0IGZvciAke21vZGVsQ2xhenpOYW1lfS5gLCB0eXBlOiBOdW1iZXIgfSkpO1xuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0YpIHtcbiAgICAgIGJhc2UucHVzaChBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IGBEaXN0aW5jdCB2YWx1ZXMgZm9yICR7bW9kZWxDbGF6ek5hbWV9LmAsIHR5cGU6IFtTdHJpbmddIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldFF1ZXJ5RGVjb3JhdG9ycyhcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgcm91dGVQYXRoOiBzdHJpbmcsXG4gICAgaHR0cFZlcmI6IHN0cmluZyxcbiAgICBpbmNsdWRlUXVlcnlQYXJhbXM6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICBjb25zdCBleHRyYWN0UGF0aFBhcmFtcyA9IChwOiBzdHJpbmcpOiBzdHJpbmdbXSA9PlxuICAgICAgcC5zcGxpdChcIi9cIikuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKS5tYXAoKHMpID0+IHMuc2xpY2UoMSkpO1xuXG4gICAgY29uc3QgYXBpUGF0aFBhcmFtcyA9IGV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlUGF0aCkubWFwKChuYW1lKSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgJHtuYW1lfSBwYXJhbWV0ZXIgZm9yIHRoZSBxdWVyeWAsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBkZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+ID0gW1xuICAgICAgLi4uYXBpUGF0aFBhcmFtcy5tYXAoKHApID0+IEFwaVBhcmFtKHApKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSByZWNvcmRzIHVzaW5nIFwiJHttZXRob2ROYW1lfVwiLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUmVzdWx0IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuXCIgfSksXG4gICAgICBBcGlOb0NvbnRlbnRSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIk5vIGNvbnRlbnQgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC5cIiB9KSxcbiAgICBdO1xuXG4gICAgaWYgKGh0dHBWZXJiID09PSBcIkdFVFwiICYmIGluY2x1ZGVRdWVyeVBhcmFtcykge1xuICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXIgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICAgIH0pLFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwibGltaXRcIiwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogXCJsaW1pdCBvciBwYWdlIHNpemVcIiB9KSxcbiAgICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcIm9mZnNldFwiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFya1wiIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBkZWNvcmF0b3JzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBNb2R1bGUsIFByb3ZpZGVyIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBNb2RlbFNlcnZpY2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZyb21Nb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi9Gcm9tTW9kZWxDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IERFQ0FGX0VYUE9TRSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2R1bGVGb3IoZmxhdm91cjogc3RyaW5nKSB7XG4gIEBNb2R1bGUoe30pXG4gIGNsYXNzIERlY2FmTW9kZWxNb2R1bGUge1xuICAgIHN0YXRpYyByZWFkb25seSBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZk1vZGVsTW9kdWxlLm5hbWUpLmZvcihmbGF2b3VyKTtcblxuICAgIHN0YXRpYyBjcmVhdGVNb2RlbFNlcnZpY2VzPFQgZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gICAgICBtb2RlbHM6IE1vZGVsQ29uc3RydWN0b3I8VD5bXVxuICAgICk6IFByb3ZpZGVyW10ge1xuICAgICAgcmV0dXJuIG1vZGVscy5tYXAoKG1vZGVsKSA9PiAoe1xuICAgICAgICBwcm92aWRlOiBgJHttb2RlbC5uYW1lfVNlcnZpY2VgLFxuICAgICAgICB1c2VGYWN0b3J5OiAoKSA9PiBNb2RlbFNlcnZpY2UuZm9yTW9kZWwobW9kZWwgYXMgYW55KSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNFeHBvc2VkKFxuICAgICAgbW9kZWw6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICAgIGV4cG9zdXJlPzogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHN0cmluZ1tdPlxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBleHBvc3VyZT8uW21vZGVsLm5hbWVdO1xuICAgICAgY29uc3QgdmFsdWUgPVxuICAgICAgICB0eXBlb2Ygb3ZlcnJpZGUgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICA/IG92ZXJyaWRlXG4gICAgICAgICAgOiBNZXRhZGF0YS5nZXQobW9kZWwsIE1ldGFkYXRhLmtleShERUNBRl9FWFBPU0UpKTtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuaW5jbHVkZXMoZmxhdm91cik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc3RhdGljIGZvclJvb3QoXG4gICAgICBmbGF2b3VyOiBzdHJpbmcsXG4gICAgICBvcHRpb25zOiBQYXJ0aWFsPERlY2FmTW9kdWxlT3B0aW9ucz4gPSB7fVxuICAgICk6IER5bmFtaWNNb2R1bGUge1xuICAgICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZm9yUm9vdCk7XG4gICAgICBsb2cuaW5mbyhgR2VuZXJhdGluZyBjb250cm9sbGVycyBmb3IgZmxhdm91ci4uLmApO1xuXG4gICAgICBjb25zdCB0cmFja2VkTW9kZWxzID0gQWRhcHRlci5tb2RlbHMoZmxhdm91cikuZmlsdGVyKChtb2RlbCkgPT5cbiAgICAgICAgdGhpcy5pc0V4cG9zZWQobW9kZWwsIG9wdGlvbnMuY29udHJvbGxlckV4cG9zdXJlKVxuICAgICAgKTtcblxuICAgICAgbGV0IG1vZGVsU2VydmljZXM6IFByb3ZpZGVyW10gPSBbXTtcbiAgICAgIGlmIChvcHRpb25zLmF1dG9TZXJ2aWNlcykge1xuICAgICAgICBsb2cuaW5mbyhcIkF1dG8tc2VydmljZXMgZW5hYmxlZC4gSW5pdGlhbGl6aW5nIHNlcnZpY2UgZ2VuZXJhdGlvbi5cIik7XG4gICAgICAgIG1vZGVsU2VydmljZXMgPSB0aGlzLmNyZWF0ZU1vZGVsU2VydmljZXModHJhY2tlZE1vZGVscyk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBBdXRvLXNlcnZpY2VzIGNvbXBsZXRlZC4gJHttb2RlbFNlcnZpY2VzLmxlbmd0aH0gc2VydmljZXMgaW5pdGlhbGl6ZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBnbG9iYWxEZWZhdWx0czogUGFydGlhbDxNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnPiA9IHt9O1xuICAgICAgaWYgKG9wdGlvbnMuYWdncmVnYXRpb25zID09PSBmYWxzZSkge1xuICAgICAgICBnbG9iYWxEZWZhdWx0cy5hbGxvd0dyb3VwaW5nUXVlcmllcyA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250cm9sbGVycyA9IHRyYWNrZWRNb2RlbHMubWFwKChtb2RlbCkgPT5cbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGUobW9kZWwsIG9wdGlvbnMuY29udHJvbGxlckNvbmZpZywgZ2xvYmFsRGVmYXVsdHMpXG4gICAgICApO1xuICAgICAgbG9nLmluZm8oYEdlbmVyYXRlZCAke2NvbnRyb2xsZXJzLmxlbmd0aH0gY29udHJvbGxlcnNgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kdWxlOiBEZWNhZk1vZGVsTW9kdWxlLFxuICAgICAgICBjb250cm9sbGVycyxcbiAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgLi4ubW9kZWxTZXJ2aWNlcyxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIE9iamVjdC5hc3NpZ24oRGVjYWZNb2RlbE1vZHVsZSwgXCJuYW1lXCIsIHtcbiAgICB2YWx1ZTogYERlY2FmTW9kdWxlJHtmbGF2b3VyfWAsXG4gIH0pO1xuICByZXR1cm4gRGVjYWZNb2RlbE1vZHVsZTtcbn1cbiIsImltcG9ydCB7XG4gIERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyxcbiAgSW5qZWN0YWJsZUNvbmZpZyxcbiAgSW5qZWN0YWJsZXNLZXlzLFxuICBJbmplY3RPcHRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBTY29wZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIERlY29yYXRpb24sIERlY29yYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQXBpUHJvcGVydHkgfSBmcm9tIFwiLi9vdmVycmlkZXMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gXCIuL2RlY2FmLW1vZGVsXCI7XG5cbkRlY29yYXRpb24uZm9yKEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG5lc3RJbmplY3RhYmxlKFxuICAgICAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgY2ZnPzogSW5qZWN0YWJsZUNvbmZpZ1xuICAgICkge1xuICAgICAgY2ZnID1cbiAgICAgICAgY2ZnIHx8XG4gICAgICAgICh0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIGNhdGVnb3J5IGFzIFJlY29yZDxhbnksIGFueT4sXG4gICAgICAgICAgICAgIERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIDogRGVmYXVsdEluamVjdGFibGVzQ29uZmlnKTtcbiAgICAgIHJldHVybiBJbmplY3RhYmxlKHtcbiAgICAgICAgc2NvcGU6IGNmZy5zaW5nbGV0b24gPyBTY29wZS5ERUZBVUxUIDogU2NvcGUuUkVRVUVTVCxcbiAgICAgICAgZHVyYWJsZTogY2ZnLnNpbmdsZXRvbiA/IHVuZGVmaW5lZCA6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBuZXN0SW5qZWN0KFxuICAgICAgY2F0ZWdvcnk6IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgY2ZnOiBJbmplY3RPcHRpb25zXG4gICAgKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gaW5uZXJOZXN0SW5qZWN0KFxuICAgICAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgICAgIGRlc2NyaXB0b3I/OiBhbnlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gSW5qZWN0KGNhdGVnb3J5IHx8ICh0YXJnZXQgYXMgQ29uc3RydWN0b3IpKShcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuUkVRVUlSRUQpXG4gIC5leHRlbmQoXG4gICAgQXBpUHJvcGVydHkoe1xuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSlcbiAgKVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUFYKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1heERlYyhtYXg6IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWF4aW11bTogbWF4LCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1JTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtaW5EZWMobWluOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1pbmltdW06IG1pbiwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1heExlbmd0aERlYyhtYXg6IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWF4TGVuZ3RoOiBtYXgsIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtaW5MZW5ndGhEZWMobWluOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1pbkxlbmd0aDogbWluLCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlRZUEUpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gdHlwZURlYyhcbiAgICAgIHR5cGU6XG4gICAgICAgIHwgKENvbnN0cnVjdG9yIHwgKCgpID0+IENvbnN0cnVjdG9yKSlbXVxuICAgICAgICB8IENvbnN0cnVjdG9yXG4gICAgICAgIHwgKCgpID0+IENvbnN0cnVjdG9yKVxuICAgICkge1xuICAgICAgcmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgcHJvcDogYW55KSA9PiB7XG4gICAgICAgIHR5cGUgPSBBcnJheS5pc0FycmF5KHR5cGUpID8gdHlwZVswXSA6IHR5cGU7XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gXCJmdW5jdGlvblwiICYmICF0eXBlLm5hbWUpXG4gICAgICAgICAgdHlwZSA9ICh0eXBlIGFzICgpID0+IENvbnN0cnVjdG9yKSgpO1xuICAgICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICAgIHR5cGU6IHR5cGUgYXMgYW55LFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgfSkodGFyZ2V0LCBwcm9wKTtcbiAgICAgIH07XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG4vL1xuLy8gRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTElTVClcbi8vICAgLmV4dGVuZCh7XG4vLyAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBsaXN0RGVjKFxuLy8gICAgICAgY2xheno6XG4vLyAgICAgICAgIHwgQ29uc3RydWN0b3Jcbi8vICAgICAgICAgfCAoKCkgPT4gQ29uc3RydWN0b3IpXG4vLyAgICAgICAgIHwgKENvbnN0cnVjdG9yIHwgKCgpID0+IENvbnN0cnVjdG9yKSlbXSxcbi8vICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbi8vICAgICAgIGNvbGxlY3Rpb246IFwiQXJyYXlcIiB8IFwiU2V0XCIgPSBcIkFycmF5XCJcbi8vICAgICApIHtcbi8vICAgICAgIHJldHVybiAodGFyZ2V0OiBvYmplY3QsIHByb3A6IGFueSkgPT4ge1xuLy8gICAgICAgICBjbGF6eiA9IEFycmF5LmlzQXJyYXkoY2xhenopID8gY2xhenpbMF0gOiBjbGF6ejtcbi8vICAgICAgICAgaWYgKHR5cGVvZiBjbGF6eiA9PT0gXCJmdW5jdGlvblwiICYmICFjbGF6ei5uYW1lKVxuLy8gICAgICAgICAgIGNsYXp6ID0gKGNsYXp6IGFzICgpID0+IENvbnN0cnVjdG9yKSgpO1xuLy8gICAgICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyB0eXBlOiBbY2xhenogYXMgYW55XSB9KSh0YXJnZXQsIHByb3ApO1xuLy8gICAgICAgfTtcbi8vICAgICB9LFxuLy8gICB9KVxuLy8gICAuYXBwbHkoKTtcbi8vIC8vXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5EQVRFKVxuICAuZXh0ZW5kKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBkYXRlRGVjKGZvcm1hdDogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIGZvcm1hdDogXCJkYXRlLXRpbWVcIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAvLyBleGFtcGxlOiBwYXJzZURhdGUoZm9ybWF0LCBuZXcgRGF0ZSgpKSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5FTlVNKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG9wdGlvbkRlYyhvcHRpb25zOiBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgIGNvbnN0IG9wdHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IE9iamVjdC52YWx1ZXMob3B0aW9ucyk7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBlbnVtOiBvcHRzLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuUEFUVEVSTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBwYXR0ZXJuRGVjKHBhdDogUmVnRXhwIHwgc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBwYXR0ZXJuOiB0eXBlb2YgcGF0ID09PSBcInN0cmluZ1wiID8gcGF0IDogcGF0LnNvdXJjZSxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gY29sdW1uRGVjKG5hbWU6IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKERlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uRGVjKGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFBlcnNpc3RlbmNlS2V5cy5BVVRIKS5leHRlbmQoeyBkZWNvcmF0b3I6IEF1dGggfSkuYXBwbHkoKTtcbiIsImltcG9ydCB7IEZvcmJpZGRlbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBDb3JzRXJyb3IgZXh0ZW5kcyBGb3JiaWRkZW5FcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIENvcnNFcnJvci5uYW1lKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBjbGFzcyBUb01hbnlSZXF1ZXN0c0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciApIHtcbiAgICBzdXBlcihUb01hbnlSZXF1ZXN0c0Vycm9yLm5hbWUsIG1zZyAsIDQyOSk7XG4gIH1cbn0iLCJpbXBvcnQge1xuICBBcmd1bWVudHNIb3N0LFxuICBDYXRjaCxcbiAgRXhjZXB0aW9uRmlsdGVyLFxuICBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBCYXNlRXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlZEVudmlyb25tZW50IH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUb01hbnlSZXF1ZXN0c0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy90aHJvdHRsaW5nXCI7XG5cbkBDYXRjaCgpXG5leHBvcnQgY2xhc3MgRGVjYWZFeGNlcHRpb25GaWx0ZXIgaW1wbGVtZW50cyBFeGNlcHRpb25GaWx0ZXIge1xuICBjYXRjaChleGNlcHRpb246IEVycm9yLCBob3N0OiBBcmd1bWVudHNIb3N0KSB7XG4gICAgY29uc3QgY3R4ID0gaG9zdC5zd2l0Y2hUb0h0dHAoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGN0eC5nZXRSZXNwb25zZSgpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBjdHguZ2V0UmVxdWVzdCgpO1xuXG4gICAgY29uc3QgaXNQcm9kdWN0aW9uID0gTG9nZ2VkRW52aXJvbm1lbnQuZW52ID09PSBcInByb2R1Y3Rpb25cIjtcbiAgICBsZXQgc3RhdHVzQ29kZTtcblxuICAgIGlmIChcbiAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uIHx8XG4gICAgICBleGNlcHRpb24gaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEVycm9yXG4gICAgKSB7XG4gICAgICBleGNlcHRpb24gPSBuZXcgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICBzdGF0dXNDb2RlID0gKGV4Y2VwdGlvbiBhcyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKS5nZXRTdGF0dXMoKTtcbiAgICB9IGVsc2UgaWYgKCEoZXhjZXB0aW9uIGluc3RhbmNlb2YgQmFzZUVycm9yKSkge1xuICAgICAgaWYoKGV4Y2VwdGlvbiBhcyBhbnkpLnN0YXR1cyA9PT0gNDI5KXtcbiAgICAgICAgZXhjZXB0aW9uID0gbmV3IFRvTWFueVJlcXVlc3RzRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgfWVsc2V7XG4gICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBJbnRlcm5hbEVycm9yKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXNwb25zZS5zdGF0dXMoKGV4Y2VwdGlvbiBhcyBCYXNlRXJyb3IpLmNvZGUgfHwgc3RhdHVzQ29kZSkuanNvbih7XG4gICAgICBzdGF0dXM6IChleGNlcHRpb24gYXMgQmFzZUVycm9yKS5jb2RlIHx8IHN0YXR1c0NvZGUsXG4gICAgICBlcnJvcjogaXNQcm9kdWN0aW9uID8gZXhjZXB0aW9uLm5hbWUgOiBleGNlcHRpb24ubWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgcGF0aDogcmVxdWVzdC51cmwsXG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBVc2VGaWx0ZXJzLCBVc2VJbnRlcmNlcHRvcnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmRXhjZXB0aW9uRmlsdGVyIH0gZnJvbSBcIi4vRGVjYWZFcnJvckZpbHRlclwiO1xuaW1wb3J0IHsgRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIH0gZnJvbSBcIi4uLy4uL3JlcXVlc3QvaW5kZXhcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIFVzZURlY2FmRmlsdGVyKCkge1xuICByZXR1cm4gVXNlRmlsdGVycyhuZXcgRGVjYWZFeGNlcHRpb25GaWx0ZXIoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VEZWNhZkhlYWRlcnMoKSB7XG4gIHJldHVybiBVc2VJbnRlcmNlcHRvcnMoRGVjYWZSZXNwb25zZUludGVyY2VwdG9yKTtcbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBTZWN1cml0eVNjaGVtZU9iamVjdCB9IGZyb20gXCIuLi8uLi9zd2FnZ2VyLXR5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlck9wdGlvbnMge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB2ZXJzaW9uPzogc3RyaW5nO1xuICBhc3NldHNQYXRoPzogc3RyaW5nO1xuICBmYXZpY29uRmlsZVBhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckljb25GaWxlUGF0aD86IHN0cmluZztcbiAgcGVyc2lzdEF1dGhvcml6YXRpb24/OiBib29sZWFuO1xuICBwYXRoOiBzdHJpbmc7XG4gIGF1dGg/OiBTZWN1cml0eVNjaGVtZU9iamVjdDtcbiAgdG9wYmFyQmdDb2xvcj86IHN0cmluZztcbiAgZXh0cmFNb2RlbHM/OiBDb25zdHJ1Y3RvcltdO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIGV4cG9zZSB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGluIEpTT04gZm9ybWF0LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkuanNvblxuICAgKi9cbiAgb3BlbkFwaUpzb25QYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIGV4cG9zZSB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGluIFlBTUwgZm9ybWF0LlxuICAgKiBSZXF1aXJlcyAneWFtbCcgcGFja2FnZSBhcyBwZWVyIGRlcGVuZGVuY3kuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS55YW1sXG4gICAqL1xuICBvcGVuQXBpWWFtbFBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBTV0FHR0VSX1VJX0NPTlNUQU5UUzogU3dhZ2dlck9wdGlvbnMgPSB7XG4gIHRpdGxlOiBcIlN3YWdnZXIgfCBPcGVuQVBJIFNwZWNpZmljYXRpb24gKE9BUylcIixcbiAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmRpemVkIGZvcm1hdCBmb3IgZGVzY3JpYmluZyBSRVNUZnVsIEFQSXNcIixcbiAgdmVyc2lvbjogXCIwLjAuMVwiLFxuICBwYXRoOiBcImRvY3NcIixcbiAgZmF2aWNvbkZpbGVQYXRoOiBcIlwiLFxuICB0b3BiYXJJY29uRmlsZVBhdGg6IFwiXCIsXG4gIGF1dGg6IHtcbiAgICB0eXBlOiBcImh0dHBcIixcbiAgICBzY2hlbWU6IFwiYmVhcmVyXCIsXG4gICAgYmVhcmVyRm9ybWF0OiBcIkpXVFwiLFxuICAgIG5hbWU6IFwiQXV0aG9yaXphdGlvblwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkVudGVyIEpXVCB0b2tlblwiLFxuICAgIGluOiBcImhlYWRlclwiLFxuICB9LFxuICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdHJ1ZSxcbiAgdG9wYmFyQmdDb2xvcjogXCIjMDAwMDAwXCIsXG59O1xuIiwiaW1wb3J0IHsgU1dBR0dFUl9VSV9DT05TVEFOVFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJVSU9wdGlvbnMge1xuICB0aXRsZT86IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgcGVyc2lzdEF1dGhvcml6YXRpb246IGJvb2xlYW47XG4gIGFzc2V0c1BhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25QYXRoPzogc3RyaW5nO1xuICB0b3BiYXJJY29uUGF0aD86IHN0cmluZztcbiAgdG9wYmFyQmdDb2xvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFN3YWdnZXJDdXN0b21VSSB7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IFN3YWdnZXJVSU9wdGlvbnM7XG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgYXNzZXRzUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAvLyAgIF9fZGlybmFtZSxcbiAgLy8gICBcIi4uXCIsXG4gIC8vICAgXCIuLlwiLFxuICAvLyAgIFwid29ya2RvY3NcIixcbiAgLy8gICBcImFzc2V0c1wiXG4gIC8vICk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogU3dhZ2dlclVJT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3VzdG9tQ1NTKCkge1xuICAgIGxldCBjc3MgPSBcIlwiO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG9wYmFySWNvblBhdGgpIHtcbiAgICAgIGNvbnN0IGltZyA9IHRoaXMuYjY0KHRoaXMub3B0aW9ucy50b3BiYXJJY29uUGF0aCk7XG4gICAgICBjc3MgKz0gYC50b3BiYXItd3JhcHBlciB7IGNvbnRlbnQ6IHVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LCR7aW1nfScpOyB3aWR0aDogMjAwcHg7IGhlaWdodDogYXV0bzsgfVxcbmA7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBjc3MgK1xuICAgICAgYFxuICAgICAgICAudG9wYmFyLXdyYXBwZXIgc3ZnIHsgdmlzaWJpbGl0eTogaGlkZGVuOyB9XG4gICAgICAgIC5zd2FnZ2VyLXVpIC50b3BiYXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAke3RoaXMub3B0aW9ucy50b3BiYXJCZ0NvbG9yIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLnRvcGJhckJnQ29sb3J9OyB9XG4gICAgICBgXG4gICAgKTtcbiAgfVxuXG4gIGdldEN1c3RvbU9wdGlvbnMoKSB7XG4gICAgY29uc3QgZmF2aWNvbjogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZmF2aWNvblBhdGgpIHtcbiAgICAgIGZhdmljb25bXCJjdXN0b21mYXZJY29uXCJdID0gdGhpcy5iNjQodGhpcy5vcHRpb25zLmZhdmljb25QYXRoLCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY3VzdG9tU2l0ZVRpdGxlOiB0aGlzLm9wdGlvbnMudGl0bGUsXG4gICAgICAuLi5mYXZpY29uLFxuICAgICAgY3VzdG9tQ3NzOiB0aGlzLmN1c3RvbUNTUygpLFxuICAgICAgc3dhZ2dlck9wdGlvbnM6IHtcbiAgICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRoaXMub3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGI2NChmaWxlOiBzdHJpbmcsIGltZzogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5vcHRpb25zLmFzc2V0c1BhdGggfHwgXCJcIiwgZmlsZSk7XG4gICAgY29uc3QgYjY0ID0gcmVhZEZpbGVTeW5jKGZpbGVQYXRoLCB7IGVuY29kaW5nOiBcImJhc2U2NFwiIH0pO1xuICAgIHJldHVybiBpbWcgPyBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxcIiArIGI2NCA6IGI2NDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSU5lc3RBcHBsaWNhdGlvbiB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRG9jdW1lbnRCdWlsZGVyLCBTd2FnZ2VyTW9kdWxlIH0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHsgU3dhZ2dlckN1c3RvbVVJIH0gZnJvbSBcIi4vU3dhZ2dlckN1c3RvbVVJXCI7XG5pbXBvcnQgeyBTV0FHR0VSX1VJX0NPTlNUQU5UUywgU3dhZ2dlck9wdGlvbnMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCBZQU1MIGZyb20gXCJ5YW1sXCI7XG5cbmV4cG9ydCBjbGFzcyBTd2FnZ2VyQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBJTmVzdEFwcGxpY2F0aW9uLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogU3dhZ2dlck9wdGlvbnNcbiAgKSB7fVxuXG4gIHByaXZhdGUgY3JlYXRlRG9jdW1lbnQoKSB7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLm9wdGlvbnMucGF0aFxuICAgICAgPyB0aGlzLm9wdGlvbnMuZGVzY3JpcHRpb24gK1xuICAgICAgICBcIlwiICtcbiAgICAgICAgYDxicj48YnI+PGEgaHJlZj1cIiR7dGhpcy5vcHRpb25zLm9wZW5BcGlKc29uUGF0aH1cIj5PcGVuQVBJIEpTT04gU3BlYzwvYT4gfCBgICtcbiAgICAgICAgYDxhIGhyZWY9XCIke3RoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGh9XCI+T3BlbkFQSSBZQU1MIFNwZWM8L2E+YFxuICAgICAgOiB0aGlzLm9wdGlvbnMuZGVzY3JpcHRpb247XG5cbiAgICBjb25zdCBjb25maWcgPSBuZXcgRG9jdW1lbnRCdWlsZGVyKClcbiAgICAgIC5zZXRUaXRsZSh0aGlzLm9wdGlvbnMudGl0bGUpXG4gICAgICAuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pXG4gICAgICAuc2V0VmVyc2lvbih0aGlzLm9wdGlvbnMudmVyc2lvbiB8fCBcIjAuMC4xXCIpXG4gICAgICAuYWRkQmVhcmVyQXV0aCh0aGlzLm9wdGlvbnMuYXV0aCB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy5hdXRoKVxuICAgICAgLmJ1aWxkKCk7XG5cbiAgICByZXR1cm4gU3dhZ2dlck1vZHVsZS5jcmVhdGVEb2N1bWVudCh0aGlzLmFwcCwgY29uZmlnLCB7XG4gICAgICBleHRyYU1vZGVsczogdGhpcy5vcHRpb25zLmV4dHJhTW9kZWxzIHx8IFtdLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck9wZW5BcGlSb3V0ZShcbiAgICBwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiIHwgXCJhcHBsaWNhdGlvbi94LXlhbWxcIixcbiAgICBib2R5RmFjdG9yeTogKCkgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IGh0dHBBZGFwdGVyID0gdGhpcy5hcHAuZ2V0SHR0cEFkYXB0ZXIoKSBhcyBhbnk7XG4gICAgcGF0aCA9IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogYC8ke3BhdGh9YDtcbiAgICBodHRwQWRhcHRlci5nZXQocGF0aCwgKF9yZXE6IGFueSwgcmVzOiBhbnkpID0+IHtcbiAgICAgIGh0dHBBZGFwdGVyLnJlcGx5KHJlcywgYm9keUZhY3RvcnkoKSwgMjAwLCB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IGNvbnRlbnRUeXBlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0dXBTd2FnZ2VyKCkge1xuICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5jcmVhdGVEb2N1bWVudCgpO1xuICAgIGNvbnN0IHN3YWdnZXJVSSA9IG5ldyBTd2FnZ2VyQ3VzdG9tVUkoe1xuICAgICAgdGl0bGU6IHRoaXMub3B0aW9ucy50aXRsZSxcbiAgICAgIHBhdGg6IHRoaXMub3B0aW9ucy5wYXRoIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLnBhdGgsXG4gICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdGhpcy5vcHRpb25zLnBlcnNpc3RBdXRob3JpemF0aW9uID8/IHRydWUsXG4gICAgICBhc3NldHNQYXRoOiB0aGlzLm9wdGlvbnMuYXNzZXRzUGF0aCxcbiAgICAgIGZhdmljb25QYXRoOiB0aGlzLm9wdGlvbnMuZmF2aWNvbkZpbGVQYXRoLFxuICAgICAgdG9wYmFySWNvblBhdGg6IHRoaXMub3B0aW9ucy50b3BiYXJJY29uRmlsZVBhdGgsXG4gICAgICB0b3BiYXJCZ0NvbG9yOiB0aGlzLm9wdGlvbnMudG9wYmFyQmdDb2xvcixcbiAgICB9KTtcbiAgICBTd2FnZ2VyTW9kdWxlLnNldHVwKFxuICAgICAgdGhpcy5vcHRpb25zLnBhdGggfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMucGF0aCxcbiAgICAgIHRoaXMuYXBwLFxuICAgICAgZG9jdW1lbnQsXG4gICAgICB7XG4gICAgICAgIC4uLnN3YWdnZXJVSS5nZXRDdXN0b21PcHRpb25zKCksXG4gICAgICAgIGpzb25Eb2N1bWVudFVybDogdGhpcy5vcHRpb25zLm9wZW5BcGlKc29uUGF0aFxuICAgICAgICAgID8gYCR7dGhpcy5vcHRpb25zLm9wZW5BcGlKc29uUGF0aH1gXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHlhbWxEb2N1bWVudFVybDogdGhpcy5vcHRpb25zLm9wZW5BcGlZYW1sUGF0aFxuICAgICAgICAgID8gYCR7dGhpcy5vcHRpb25zLm9wZW5BcGlZYW1sUGF0aH1gXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJPcGVuQXBpUm91dGUoXG4gICAgICB0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRoLFxuICAgICAgXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAoKSA9PiBkb2N1bWVudFxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyT3BlbkFwaVJvdXRlKFxuICAgICAgdGhpcy5vcHRpb25zLm9wZW5BcGlZYW1sUGF0aCxcbiAgICAgIFwiYXBwbGljYXRpb24veC15YW1sXCIsXG4gICAgICAoKSA9PiBZQU1MLnN0cmluZ2lmeShkb2N1bWVudClcbiAgICApO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBnZXRWZXJzaW9uKCkge1xuICAvLyAgIC8vIGNvbnN0IHBhY2thZ2VKc29uID0gcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwicGFja2FnZS5qc29uXCIpO1xuICAvLyAgIC8vIGNvbnN0IHt2ZXJzaW9ufSA9IHJlcXVpcmUocGFja2FnZUpzb24pO1xuICAvLyAgIHJldHVybiBcInZlcnNpb25cIjtcbiAgLy8gfVxufVxuIiwiaW1wb3J0IHtcbiAgSU5lc3RBcHBsaWNhdGlvbixcbiAgTG9nZ2VyLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIFBpcGVUcmFuc2Zvcm0sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZFeGNlcHRpb25GaWx0ZXIgfSBmcm9tIFwiLi9leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBTd2FnZ2VyQnVpbGRlciB9IGZyb20gXCIuL29wZW5hcGlcIjtcbmltcG9ydCB7IENvcnNPcHRpb25zIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uL2ludGVyZmFjZXMvZXh0ZXJuYWwvY29ycy1vcHRpb25zLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgQ29yc0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZWZpbmVzIGFsbCBjdXN0b21pemFibGUgcGFyYW1ldGVycyBmb3IgU3dhZ2dlciBzZXR1cC5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGRldmVsb3BlcnMgdG8gY3VzdG9taXplIGhvdyBTd2FnZ2VyIFVJIGlzIGNvbmZpZ3VyZWRcbiAqIHdpdGhpbiB0aGUgTmVzdEpTIGFwcGxpY2F0aW9uLiBJdCBpbmNsdWRlcyBwYXJhbWV0ZXJzIGZvciB0aXRsZXMsIHBhdGhzLFxuICogY29sb3Igc2NoZW1lcywgYW5kIGFzc2V0IHBhdGhzIHRvIHRhaWxvciB0aGUgQVBJIGRvY3VtZW50YXRpb24gZXhwZXJpZW5jZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSBUaXRsZSBkaXNwbGF5ZWQgaW4gU3dhZ2dlciBVSS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiAtIERlc2NyaXB0aW9uIHNob3duIGJlbG93IHRoZSB0aXRsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gQVBJIHZlcnNpb24gZGlzcGxheWVkIGluIHRoZSBkb2N1bWVudGF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHBhdGggd2hlcmUgU3dhZ2dlciB3aWxsIGJlIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BlcnNpc3RBdXRob3JpemF0aW9uXSAtIFdoZXRoZXIgYXV0aG9yaXphdGlvbiB0b2tlbnMgcGVyc2lzdCBhY3Jvc3MgcmVsb2Fkcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXNzZXRzUGF0aF0gLSBQYXRoIHRvIGN1c3RvbSBhc3NldHMgZm9yIFN3YWdnZXIgVUkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RvcGJhckJnQ29sb3JdIC0gQ3VzdG9tIGJhY2tncm91bmQgY29sb3IgZm9yIHRoZSBTd2FnZ2VyIHRvcCBiYXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RvcGJhckljb25QYXRoXSAtIFBhdGggdG8gYSBjdXN0b20gaWNvbiBkaXNwbGF5ZWQgaW4gdGhlIHRvcCBiYXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Zhdmljb25QYXRoXSAtIFBhdGggdG8gYSBjdXN0b20gZmF2aWNvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyU2V0dXBPcHRpb25zIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbj86IGJvb2xlYW47XG4gIGFzc2V0c1BhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckJnQ29sb3I/OiBzdHJpbmc7XG4gIHRvcGJhckljb25QYXRoPzogc3RyaW5nO1xuICBmYXZpY29uUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gSlNPTiBmb3JtYXQuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS5qc29uXG4gICAqL1xuICBvcGVuQXBpSnNvblBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYXRoIHRvIGV4cG9zZSB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGluIFlBTUwgZm9ybWF0LlxuICAgKiBSZXF1aXJlcyAneWFtbCcgcGFja2FnZSBhcyBwZWVyIGRlcGVuZGVuY3kuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS55YW1sXG4gICAqL1xuICBvcGVuQXBpWWFtbFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIGZsdWVudCwgc3RhdGljIGJvb3RzdHJhcCBjbGFzcyBmb3IgaW5pdGlhbGl6aW5nIGFuZCBjb25maWd1cmluZyBhIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIGBOZXN0Qm9vdHN0cmFwZXJgIGNsYXNzIHByb3ZpZGVzIGEgY2hhaW5hYmxlIEFQSSBmb3IgY29uZmlndXJpbmdcbiAqIGEgTmVzdEpTIGFwcGxpY2F0aW9uIGluc3RhbmNlLiBJdCBpbmNsdWRlcyBidWlsdC1pbiBtZXRob2RzIGZvciBlbmFibGluZ1xuICogQ09SUywgSGVsbWV0IHNlY3VyaXR5LCBTd2FnZ2VyIGRvY3VtZW50YXRpb24sIGdsb2JhbCBwaXBlcywgZmlsdGVycyxcbiAqIGludGVyY2VwdG9ycywgYW5kIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuXG4gKlxuICogVGhpcyBjbGFzcyBwcm9tb3RlcyBjb25zaXN0ZW5jeSBhbmQgcmVkdWNlcyByZXBldGl0aXZlIHNldHVwIGNvZGVcbiAqIGFjcm9zcyBtdWx0aXBsZSBOZXN0SlMgcHJvamVjdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBOZXN0RmFjdG9yeSB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbiAqIGltcG9ydCB7IEFwcE1vZHVsZSB9IGZyb20gXCIuL2FwcC5tb2R1bGVcIjtcbiAqIGltcG9ydCB7IE15TG9nZ2VyIH0gZnJvbSBcIi4vTXlMb2dnZXJcIjtcbiAqIGltcG9ydCB7IE5lc3RCb290c3RyYXBlciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLW5lc3RcIjtcbiAqXG4gKiBhc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gKiAgIGNvbnN0IGFwcCA9IGF3YWl0IE5lc3RGYWN0b3J5LmNyZWF0ZShBcHBNb2R1bGUpO1xuICpcbiAqICAgYXdhaXQgTmVzdEJvb3RzdHJhcGVyXG4gKiAgICAgLmluaXRpYWxpemUoYXBwKVxuICogICAgIC5lbmFibGVMb2dnZXIobmV3IE15TG9nZ2VyKCkpXG4gKiAgICAgLmVuYWJsZUNvcnMoW1wiaHR0cDovL2xvY2FsaG9zdDo0MjAwXCJdKVxuICogICAgIC51c2VIZWxtZXQoKVxuICogICAgIC5zZXR1cFN3YWdnZXIoe1xuICogICAgICAgdGl0bGU6IFwiT3BlbkFQSSBieSBUcmFkZU1hcmvihKJcIixcbiAqICAgICAgIGRlc2NyaXB0aW9uOiBcIlRyYWRlTWFya+KEoiBBUEkgZG9jdW1lbnRhdGlvblwiLFxuICogICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICogICAgICAgcGF0aDogXCJhcGlcIixcbiAqICAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0cnVlLFxuICogICAgICAgdG9wYmFyQmdDb2xvcjogXCIjMkMzRTUwXCIsXG4gKiAgICAgICB0b3BiYXJJY29uUGF0aDogXCIvYXNzZXRzL2xvZ28uc3ZnXCIsXG4gKiAgICAgICBmYXZpY29uUGF0aDogXCIvYXNzZXRzL2Zhdmljb24uaWNvXCJcbiAqICAgICB9KVxuICogICAgIC51c2VHbG9iYWxGaWx0ZXJzKClcbiAqICAgICAudXNlR2xvYmFsUGlwZXMoLi4uKVxuICogICAgIC51c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uKVxuICogICAgIC5zdGFydCgzMDAwKTtcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoKTtcbiAqIGBgYFxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXN0Qm9vdHN0cmFwZXIge1xuICBwcml2YXRlIHN0YXRpYyBhcHA6IElOZXN0QXBwbGljYXRpb247XG4gIHByaXZhdGUgc3RhdGljIF9sb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbG9nZ2VyIGluc3RhbmNlLCBjcmVhdGluZyBhIGRlZmF1bHQgb25lIGlmIG5vdCBzZXQuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEVuc3VyZXMgdGhhdCBhIHZhbGlkIGBMb2dnZXJgIGluc3RhbmNlIGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICogZm9yIGxvZ2dpbmcgYm9vdHN0cmFwLXJlbGF0ZWQgbWVzc2FnZXMuXG4gICAqXG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gVGhlIGFjdGl2ZSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXQgbG9nZ2VyKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLl9sb2dnZXIpIHtcbiAgICAgIC8vIGZhbGxiYWNrXG4gICAgICB0aGlzLl9sb2dnZXIgPSBuZXcgTG9nZ2VyKFwiTmVzdEJvb3RzdHJhcFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5pdGlhbGl6ZXMgdGhlIGJvb3RzdHJhcHBlciB3aXRoIGEgZ2l2ZW4gTmVzdEpTIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBCaW5kcyB0aGUgcHJvdmlkZWQgTmVzdEpTIGFwcCBpbnN0YW5jZSB0byB0aGUgYm9vdHN0cmFwcGVyLCBlbmFibGluZ1xuICAgKiBjaGFpbmVkIGNvbmZpZ3VyYXRpb24gbWV0aG9kcy5cbiAgICpcbiAgICogQHBhcmFtIHtJTmVzdEFwcGxpY2F0aW9ufSBhcHAgLSBUaGUgTmVzdEpTIGFwcGxpY2F0aW9uIGluc3RhbmNlIHRvIGluaXRpYWxpemUuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24gbWV0aG9kcy5cbiAgICovXG4gIHN0YXRpYyBpbml0aWFsaXplKGFwcDogSU5lc3RBcHBsaWNhdGlvbikge1xuICAgIHRoaXMuYXBwID0gYXBwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFbmFibGVzIG9yIHJlcGxhY2VzIHRoZSBnbG9iYWwgbG9nZ2VyIGZvciB0aGUgTmVzdEpTIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJZiBhIGN1c3RvbSBsb2dnZXIgaXMgcHJvdmlkZWQsIGl0IHJlcGxhY2VzIHRoZSBkZWZhdWx0IGxvZ2dlci4gT3RoZXJ3aXNlLFxuICAgKiBhIG5ldyBsb2dnZXIgbmFtZWQgYFwiTmVzdEJvb3RzdHJhcFwiYCBpcyB1c2VkLiBUaGlzIGxvZ2dlciBpcyBhbHNvIHJlZ2lzdGVyZWRcbiAgICogd2l0aCB0aGUgTmVzdEpTIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0xvZ2dlcn0gW2N1c3RvbUxvZ2dlcl0gLSBPcHRpb25hbCBjdXN0b20gbG9nZ2VyIGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHN0YXRpYyBlbmFibGVMb2dnZXIoY3VzdG9tTG9nZ2VyPzogTG9nZ2VyKSB7XG4gICAgdGhpcy5fbG9nZ2VyID0gY3VzdG9tTG9nZ2VyIHx8IG5ldyBMb2dnZXIoXCJOZXN0Qm9vdHN0cmFwXCIpO1xuICAgIHRoaXMuYXBwLnVzZUxvZ2dlcih0aGlzLl9sb2dnZXIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFbmFibGVzIENyb3NzLU9yaWdpbiBSZXNvdXJjZSBTaGFyaW5nIChDT1JTKSBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBBbGxvd3MgZGVmaW5pbmcgZWl0aGVyIGEgd2lsZGNhcmQgb3JpZ2luIChgXCIqXCJgKSBvciBhIGxpc3Qgb2YgYWxsb3dlZCBvcmlnaW5zLlxuICAgKiBBdXRvbWF0aWNhbGx5IGFjY2VwdHMgbG9jYWwgZGV2ZWxvcG1lbnQgcmVxdWVzdHMgYW5kIHRob3NlIHdpdGhvdXQgb3JpZ2luIGhlYWRlcnMuXG4gICAqIFRocm93cyBhIGBDb3JzRXJyb3JgIGZvciB1bmF1dGhvcml6ZWQgb3JpZ2lucy5cbiAgICpcbiAgICogQHBhcmFtIHsnKicgfCBzdHJpbmdbXX0gW29yaWdpbnM9W11dIC0gTGlzdCBvZiBhbGxvd2VkIG9yaWdpbnMgb3IgYFwiKlwiYCB0byBhbGxvdyBhbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthbGxvd01ldGhvZHM9WydHRVQnLCAnUE9TVCcsICdQVVQnLCAnREVMRVRFJ11dIC0gQWxsb3dlZCBIVFRQIG1ldGhvZHMuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlQ29ycyhcbiAgICBvcmlnaW5zOiBcIipcIiB8IHN0cmluZ1tdID0gW10sXG4gICAgYWxsb3dNZXRob2RzOiBzdHJpbmdbXSA9IFtcIkdFVFwiLCBcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIl1cbiAgKSB7XG4gICAgY29uc3QgYWxsb3dlZE9yaWdpbnMgPVxuICAgICAgb3JpZ2lucyA9PT0gXCIqXCIgPyBcIipcIiA6IG9yaWdpbnMubWFwKChvKSA9PiBvLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcblxuICAgIGNvbnN0IGNvcnNPcHRpb25zOiBDb3JzT3B0aW9ucyA9IHtcbiAgICAgIG9yaWdpbjogKG9yaWdpbiwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgLy8gQWxsb3cgcmVxdWVzdCB3aXRob3V0IG9yaWdpbi4uLlxuICAgICAgICBpZiAoIW9yaWdpbikgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHRydWUpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBhbGxvd2VkT3JpZ2lucyA9PT0gXCIqXCIgfHxcbiAgICAgICAgICAoQXJyYXkuaXNBcnJheShhbGxvd2VkT3JpZ2lucykgJiZcbiAgICAgICAgICAgIGFsbG93ZWRPcmlnaW5zLmluY2x1ZGVzKG9yaWdpbi50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sobmV3IENvcnNFcnJvcihgT3JpZ2luICR7b3JpZ2lufSBub3QgYWxsb3dlZGApKTtcbiAgICAgIH0sXG4gICAgICBjcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIG1ldGhvZHM6IGFsbG93TWV0aG9kcy5qb2luKFwiLFwiKSxcbiAgICB9O1xuXG4gICAgdGhpcy5hcHAuZW5hYmxlQ29ycyhjb3JzT3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFwcGxpZXMgdGhlIEhlbG1ldCBtaWRkbGV3YXJlIGZvciBlbmhhbmNlZCBzZWN1cml0eS5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRHluYW1pY2FsbHkgbG9hZHMgdGhlIGBoZWxtZXRgIHBhY2thZ2UgaWYgYXZhaWxhYmxlIGFuZCByZWdpc3RlcnMgaXRcbiAgICogYXMgbWlkZGxld2FyZSB0byBpbXByb3ZlIEhUVFAgaGVhZGVyIHNlY3VyaXR5LiBJZiBub3QgaW5zdGFsbGVkLCBsb2dzIGEgd2FybmluZ1xuICAgKiBhbmQgY29udGludWVzIGV4ZWN1dGlvbiB3aXRob3V0IHRocm93aW5nIGVycm9ycy5cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbb3B0aW9uc10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhc3NlZCB0byBIZWxtZXQuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgdXNlSGVsbWV0KG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgICBjb25zdCBoZWxtZXQgPSByZXF1aXJlKFwiaGVsbWV0XCIpOyAvLyBEeW5hbWljIGltcG9ydCB0byBhdm9pZCBoYXJkIGRlcGVuZGVuY3lcbiAgICAgIHRoaXMuYXBwLnVzZShoZWxtZXQob3B0aW9ucykpO1xuICAgICAgdGhpcy5sb2dnZXIubG9nKFwiSGVsbWV0IG1pZGRsZXdhcmUgZW5hYmxlZCBzdWNjZXNzZnVsbHkuXCIpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcIkhlbG1ldCBub3QgaW5zdGFsbGVkLiBTa2lwcGluZyBtaWRkbGV3YXJlLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQ29uZmlndXJlcyBhbmQgaW5pdGlhbGl6ZXMgU3dhZ2dlciBVSSBmb3IgQVBJIGRvY3VtZW50YXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIFVzZXMgdGhlIGBTd2FnZ2VyQnVpbGRlcmAgdXRpbGl0eSB0byBjb25maWd1cmUgQVBJIGRvY3VtZW50YXRpb25cbiAgICogd2l0aCBkZXRhaWxlZCBjdXN0b21pemF0aW9uIGZvciB0aXRsZSwgdmVyc2lvbiwgcGF0aHMsIGFuZCBjb2xvcnMuXG4gICAqIFN3YWdnZXIgaXMgYXV0b21hdGljYWxseSBleHBvc2VkIGF0IHRoZSBjb25maWd1cmVkIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSB7U3dhZ2dlclNldHVwT3B0aW9uc30gb3B0aW9ucyAtIFN3YWdnZXIgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHNldHVwU3dhZ2dlcihvcHRpb25zOiBTd2FnZ2VyU2V0dXBPcHRpb25zKSB7XG4gICAgY29uc3Qgc3dhZ2dlciA9IG5ldyBTd2FnZ2VyQnVpbGRlcih0aGlzLmFwcCwge1xuICAgICAgdGl0bGU6IG9wdGlvbnMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbixcbiAgICAgIHBhdGg6IG9wdGlvbnMucGF0aCB8fCBcImFwaVwiLFxuICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IG9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24gPz8gdHJ1ZSxcbiAgICAgIGFzc2V0c1BhdGg6IG9wdGlvbnMuYXNzZXRzUGF0aCxcbiAgICAgIGZhdmljb25GaWxlUGF0aDogb3B0aW9ucy5mYXZpY29uUGF0aCxcbiAgICAgIHRvcGJhckljb25GaWxlUGF0aDogb3B0aW9ucy50b3BiYXJJY29uUGF0aCxcbiAgICAgIHRvcGJhckJnQ29sb3I6IG9wdGlvbnMudG9wYmFyQmdDb2xvcixcbiAgICAgIG9wZW5BcGlKc29uUGF0aDogb3B0aW9ucy5vcGVuQXBpSnNvblBhdGgsXG4gICAgICBvcGVuQXBpWWFtbFBhdGg6IG9wdGlvbnMub3BlbkFwaVlhbWxQYXRoLFxuICAgIH0pO1xuICAgIHN3YWdnZXIuc2V0dXBTd2FnZ2VyKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlZ2lzdGVycyBvbmUgb3IgbW9yZSBnbG9iYWwgdmFsaWRhdGlvbiBwaXBlcy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRW5hYmxlcyByZXF1ZXN0IHBheWxvYWQgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24gZ2xvYmFsbHkgYWNyb3NzXG4gICAqIHRoZSBlbnRpcmUgTmVzdEpTIGFwcGxpY2F0aW9uLiBNdWx0aXBsZSBwaXBlcyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlclxuICAgKiBmb3IgbW9kdWxhciBpbnB1dCB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLlBpcGVUcmFuc2Zvcm1bXX0gcGlwZXMgLSBQaXBlIGluc3RhbmNlcyB0byByZWdpc3RlciBnbG9iYWxseS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBzdGF0aWMgdXNlR2xvYmFsUGlwZXMoLi4ucGlwZXM6IFBpcGVUcmFuc2Zvcm1bXSkge1xuICAgIGlmIChwaXBlcy5sZW5ndGggPiAwKSB0aGlzLmFwcC51c2VHbG9iYWxQaXBlcyguLi5waXBlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlZ2lzdGVycyBvbmUgb3IgbW9yZSBnbG9iYWwgZXhjZXB0aW9uIGZpbHRlcnMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIElmIG5vIGZpbHRlcnMgYXJlIHByb3ZpZGVkLCBpdCBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVycyBhIGRlZmF1bHRcbiAgICogc2V0IG9mIHN0YW5kYXJkIGV4Y2VwdGlvbiBmaWx0ZXJzIGZvciBjb21tb24gZXJyb3IgdHlwZXMgbGlrZVxuICAgKiBgSHR0cEV4Y2VwdGlvbmAsIGBWYWxpZGF0aW9uRXhjZXB0aW9uYCwgYENvbmZsaWN0RXhjZXB0aW9uYCwgYW5kIG90aGVycy5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5FeGNlcHRpb25GaWx0ZXJbXX0gZmlsdGVycyAtIE9wdGlvbmFsIGZpbHRlcnMgdG8gYXBwbHkgZ2xvYmFsbHkuXG4gICAqL1xuICBzdGF0aWMgdXNlR2xvYmFsRmlsdGVycyguLi5maWx0ZXJzOiBhbnlbXSkge1xuICAgIHRoaXMuYXBwLnVzZUdsb2JhbEZpbHRlcnMoXG4gICAgICAuLi4oZmlsdGVycy5sZW5ndGggPiAwID8gZmlsdGVycyA6IFtuZXcgRGVjYWZFeGNlcHRpb25GaWx0ZXIoKV0pXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIGdsb2JhbCBpbnRlcmNlcHRvcnMgZm9yIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRyYW5zZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJbnRlcmNlcHRvcnMgYWxsb3cgYWR2YW5jZWQgcmVxdWVzdC9yZXNwb25zZSBtYW5pcHVsYXRpb24gc3VjaCBhc1xuICAgKiBzZXJpYWxpemF0aW9uLCBsb2dnaW5nLCBvciB0cmFuc2Zvcm1hdGlvbi4gTXVsdGlwbGUgaW50ZXJjZXB0b3JzXG4gICAqIGNhbiBiZSBhZGRlZCBmb3IgbW9kdWxhciBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLk5lc3RJbnRlcmNlcHRvcltdfSBpbnRlcmNlcHRvcnMgLSBJbnRlcmNlcHRvciBpbnN0YW5jZXMgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgdXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLmludGVyY2VwdG9yczogTmVzdEludGVyY2VwdG9yW10pIHtcbiAgICBpZiAoaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApXG4gICAgICB0aGlzLmFwcC51c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU3RhcnRzIHRoZSBOZXN0SlMgYXBwbGljYXRpb24gYW5kIGJpbmRzIGl0IHRvIHRoZSBnaXZlbiBwb3J0IGFuZCBob3N0LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBMaXN0ZW5zIG9uIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgb3B0aW9uYWxseSBhIGhvc3QuIE9uY2Ugc3RhcnRlZCxcbiAgICogbG9ncyB0aGUgYXBwbGljYXRpb24gVVJMIGZvciBlYXN5IGFjY2Vzcy4gVGhlIHN0YXJ0dXAgcHJvY2VzcyByZXNvbHZlc1xuICAgKiBvbmNlIHRoZSBhcHBsaWNhdGlvbiBpcyBzdWNjZXNzZnVsbHkgcnVubmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3J0PTMwMDBdIC0gUG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2hvc3RdIC0gT3B0aW9uYWwgaG9zdCBvciBJUCBhZGRyZXNzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xvZz10cnVlXSAtIFdoZXRoZXIgdG8gbG9nIHRoZSBhcHBsaWNhdGlvbiBVUkwgdXBvbiBzdGFydHVwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBvbmNlIHRoZSBhcHBsaWNhdGlvbiBzdGFydHMgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHN0YXJ0KFxuICAgIHBvcnQ6IG51bWJlciA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwLFxuICAgIGhvc3Q6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBsb2c6IGJvb2xlYW4gPSB0cnVlXG4gICkge1xuICAgIHRoaXMuYXBwLmxpc3Rlbihwb3J0LCBob3N0IGFzIGFueSkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAobG9nKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuYXBwLmdldFVybCgpO1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coYPCfmoAgQXBwbGljYXRpb24gaXMgcnVubmluZyBhdDogJHt1cmx9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEluamVjdCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIGluamVjdGFibGVTZXJ2aWNlS2V5LFxuICBNb2RlbFNlcnZpY2UsXG4gIFJlcG9zaXRvcnkgYXMgQ29yZVJlcG9zaXRvcnksXG4gIFNlcnZpY2UgYXMgQ29yZVNlcnZpY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCB0eXBlIERlY2FmRmFjdG9yeVByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBzdHJpbmc7XG4gIHVzZUZhY3Rvcnk6ICgpID0+IHVua25vd247XG59O1xuXG5jb25zdCBwZW5kaW5nUHJvdmlkZXJzID0gbmV3IE1hcDxzdHJpbmcsIERlY2FmRmFjdG9yeVByb3ZpZGVyPigpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEcmFpbnMgdGhlIHByb3ZpZGVycyByZWdpc3RlcmVkIGJ5IHtAbGluayBTZXJ2aWNlfS97QGxpbmsgUmVwb3NpdG9yeX0gdXNhZ2VzLlxuICogQHN1bW1hcnkgQ29uc3VtZWQgYnkge0BsaW5rIERlY2FmQ29yZU1vZHVsZS5mb3JSb290fSB0byB3aXJlIHRoZSB0b2tlbnMgdGhhdCB0aG9zZSBwYXJhbWV0ZXJcbiAqIGRlY29yYXRvcnMgcmVmZXJlbmNlIGJhY2sgaW50byBOZXN0J3MgREkgY29udGFpbmVyLCBzaW5jZSBhIHBhcmFtZXRlciBkZWNvcmF0b3IgYWxvbmUgY2Fubm90XG4gKiBzdXBwbHkgYSBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycygpOiBEZWNhZkZhY3RvcnlQcm92aWRlcltdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20ocGVuZGluZ1Byb3ZpZGVycy52YWx1ZXMoKSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUHJvdmlkZXIodG9rZW46IHN0cmluZywgdXNlRmFjdG9yeTogKCkgPT4gdW5rbm93bik6IHZvaWQge1xuICBpZiAocGVuZGluZ1Byb3ZpZGVycy5oYXModG9rZW4pKSByZXR1cm47XG4gIHBlbmRpbmdQcm92aWRlcnMuc2V0KHRva2VuLCB7IHByb3ZpZGU6IHRva2VuLCB1c2VGYWN0b3J5IH0pO1xufVxuXG5mdW5jdGlvbiBpc01vZGVsQ29uc3RydWN0b3IodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb25zdHJ1Y3Rvcjxhbnk+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIHZhbHVlLnByb3RvdHlwZSBpbnN0YW5jZW9mIE1vZGVsO1xufVxuXG5mdW5jdGlvbiBtb2RlbFNlcnZpY2VUb2tlbihtb2RlbDogQ29uc3RydWN0b3I8YW55Pik6IHN0cmluZyB7XG4gIHJldHVybiBgJHttb2RlbC5uYW1lfVNlcnZpY2VgO1xufVxuXG5mdW5jdGlvbiBtb2RlbFJlcG9zaXRvcnlUb2tlbihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIGZsYXZvdXI/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIHJldHVybiBmbGF2b3VyID8gYCR7bW9kZWwubmFtZX1SZXBvc2l0b3J5QCR7Zmxhdm91cn1gIDogYCR7bW9kZWwubmFtZX1SZXBvc2l0b3J5YDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uc3RydWN0b3IgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZWNhZiBzZXJ2aWNlLlxuICogQHN1bW1hcnkgVHJhbnNsYXRlcyBkZWNhZidzIHNlcnZpY2UgcmVzb2x1dGlvbiBBUElzIGludG8gYSBOZXN0IGBASW5qZWN0KClgIGNhbGw6XG4gKiAtIGBAU2VydmljZShTb21lTW9kZWwpYCBpbmplY3RzIHRoZSBgTW9kZWxTZXJ2aWNlPFNvbWVNb2RlbD5gIHNpbmdsZXRvbiBmb3IgdGhhdCBtb2RlbFxuICogICAodmlhIHtAbGluayBNb2RlbFNlcnZpY2UuZm9yTW9kZWx9KS5cbiAqIC0gYEBTZXJ2aWNlKFNvbWVTZXJ2aWNlQ2xhc3MpYCBvciBgQFNlcnZpY2UoXCJhbGlhc1wiKWAgaW5qZWN0cyB0aGUgbWF0Y2hpbmcgYEBzZXJ2aWNlKClgLWRlY29yYXRlZFxuICogICBkZWNhZiB7QGxpbmsgQ29yZVNlcnZpY2V9ICh2aWEge0BsaW5rIENvcmVTZXJ2aWNlLmdldH0pLlxuICogLSBgQFNlcnZpY2UoKWAgaW5mZXJzIHRoZSBwYXJhbWV0ZXIncyB0eXBlIGZyb20gZW1pdHRlZCBjb25zdHJ1Y3RvciBtZXRhZGF0YSBhbmQgcmVzb2x2ZXMgaXQgdGhlXG4gKiAgIHNhbWUgd2F5LCBwcm92aWRlZCB0aGUgcGFyYW1ldGVyIGlzIHR5cGVkIGFzIGEgY29uY3JldGUgY2xhc3MgKGdlbmVyaWNzIGxpa2UgYE1vZGVsU2VydmljZTxYPmBcbiAqICAgYXJlIGVyYXNlZCBhdCBydW50aW1lLCBzbyB0aGUgbW9kZWwtc2VydmljZSBmb3JtIGFsd2F5cyByZXF1aXJlcyBhbiBleHBsaWNpdCBhcmd1bWVudCkuXG4gKiBAcGFyYW0ga2V5IHRoZSBtb2RlbCBjbGFzcywgc2VydmljZSBjbGFzcywgb3IgYWxpYXMgdG8gcmVzb2x2ZS4gT21pdCB0byBpbmZlciBmcm9tIHRoZSBwYXJhbWV0ZXIgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNlcnZpY2Uoa2V5Pzogc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55Pik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBwYXJhbWV0ZXJJbmRleDogbnVtYmVyXG4gICk6IHZvaWQgPT4ge1xuICAgIGxldCByZXNvbHZlZDogc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZCA9IGtleTtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBwYXJhbVR5cGVzOiBhbnlbXSA9XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCB0YXJnZXQpIHx8IFtdO1xuICAgICAgcmVzb2x2ZWQgPSBwYXJhbVR5cGVzW3BhcmFtZXRlckluZGV4XTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQFNlcnZpY2UoKSBjb3VsZCBub3QgZGV0ZXJtaW5lIGFuIGluamVjdGlvbiB0eXBlIGZvciBwYXJhbWV0ZXIgJHtwYXJhbWV0ZXJJbmRleH0gb2YgJHsodGFyZ2V0IGFzIENvbnN0cnVjdG9yPGFueT4pLm5hbWV9LiBQcm92aWRlIGFuIGV4cGxpY2l0IGFyZ3VtZW50LCBlLmcuIEBTZXJ2aWNlKFNvbWVTZXJ2aWNlKS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGFzTW9kZWwgPSB0eXBlb2YgcmVzb2x2ZWQgIT09IFwic3RyaW5nXCIgJiYgaXNNb2RlbENvbnN0cnVjdG9yKHJlc29sdmVkKTtcbiAgICBjb25zdCB0b2tlbiA9IGFzTW9kZWxcbiAgICAgID8gbW9kZWxTZXJ2aWNlVG9rZW4ocmVzb2x2ZWQgYXMgQ29uc3RydWN0b3I8YW55PilcbiAgICAgIDogaW5qZWN0YWJsZVNlcnZpY2VLZXkocmVzb2x2ZWQgYXMgc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55Pik7XG5cbiAgICByZWdpc3RlclByb3ZpZGVyKHRva2VuLCAoKSA9PiB7XG4gICAgICBpZiAoYXNNb2RlbCkgcmV0dXJuIE1vZGVsU2VydmljZS5mb3JNb2RlbChyZXNvbHZlZCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KTtcbiAgICAgIHJldHVybiB0eXBlb2YgcmVzb2x2ZWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBDb3JlU2VydmljZS5nZXQocmVzb2x2ZWQpXG4gICAgICAgIDogQ29yZVNlcnZpY2UuZ2V0KHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIEluamVjdCh0b2tlbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgcGFyYW1ldGVySW5kZXgpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlY2FmIHtAbGluayBDb3JlUmVwb3NpdG9yeX0gZm9yIGBtb2RlbGAuXG4gKiBAc3VtbWFyeSBVbmxpa2Uge0BsaW5rIFNlcnZpY2V9LCBgbW9kZWxgIGlzIGFsd2F5cyB0cmVhdGVkIGFzIGEgTW9kZWwgY2xhc3M6IHRoZSBzYW1lIGNsYXNzIHBhc3NlZFxuICogdG8gYEBTZXJ2aWNlKG1vZGVsKWAgYW5kIGBAUmVwb3NpdG9yeShtb2RlbClgIHJlc29sdmVzIHRvIHR3byBkaWZmZXJlbnQgaW5qZWN0ZWQgb2JqZWN0cyAoYVxuICogYE1vZGVsU2VydmljZTxNPmAgdnMgYSBgUmVwb3NpdG9yeTxNPmAgcmVzcGVjdGl2ZWx5KSwgdmlhIHtAbGluayBDb3JlUmVwb3NpdG9yeS5mb3JNb2RlbH0uXG4gKiBAcGFyYW0gbW9kZWwgdGhlIG1vZGVsIGNsYXNzIHRvIHJlc29sdmUgYSByZXBvc2l0b3J5IGZvci5cbiAqIEBwYXJhbSBmbGF2b3VyIG9wdGlvbmFsIGFkYXB0ZXIgZmxhdm91ci9hbGlhcywgZm9yd2FyZGVkIHRvIHtAbGluayBDb3JlUmVwb3NpdG9yeS5mb3JNb2RlbH0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZXBvc2l0b3J5KFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgZmxhdm91cj86IHN0cmluZ1xuKTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIHBhcmFtZXRlckluZGV4OiBudW1iZXJcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSBtb2RlbFJlcG9zaXRvcnlUb2tlbihtb2RlbCwgZmxhdm91cik7XG4gICAgcmVnaXN0ZXJQcm92aWRlcih0b2tlbiwgKCkgPT4gQ29yZVJlcG9zaXRvcnkuZm9yTW9kZWwobW9kZWwsIGZsYXZvdXIpKTtcbiAgICByZXR1cm4gSW5qZWN0KHRva2VuKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBwYXJhbWV0ZXJJbmRleCk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBEeW5hbWljTW9kdWxlLFxuICBHbG9iYWwsXG4gIEluamVjdCxcbiAgTW9kdWxlLFxuICBPbkFwcGxpY2F0aW9uU2h1dGRvd24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQVBQX0lOVEVSQ0VQVE9SLCBNb2R1bGVSZWYgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IERlY2FmTW9kdWxlT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBERUNBRl9BREFQVEVSX0lELFxuICBERUNBRl9IQU5ETEVSUyxcbiAgREVDQUZfTU9EVUxFX09QVElPTlMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxufSBmcm9tIFwiLi9pbnRlcmNlcHRvcnNcIjtcbmltcG9ydCB7IERlY2FmSGFuZGxlckV4ZWN1dG9yLCBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFBlcnNpc3RlbmNlU2VydmljZSwgU2VydmljZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIsXG4gIHJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcixcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuQEdsb2JhbCgpXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmQ29yZU1vZHVsZTxDT05GLCBBREFQVEVSIGV4dGVuZHMgQWRhcHRlcjxDT05GLCBhbnksIGFueSwgYW55Pj5cbiAgaW1wbGVtZW50cyBPbkFwcGxpY2F0aW9uU2h1dGRvd25cbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIHByaXZhdGUgc3RhdGljIF9wZXJzaXN0ZW5jZT86IFBlcnNpc3RlbmNlU2VydmljZTxBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4+O1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0IHBlcnNpc3RlbmNlKCk6IFBlcnNpc3RlbmNlU2VydmljZTxBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4+IHtcbiAgICBpZiAoIXRoaXMuX3BlcnNpc3RlbmNlKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJQZXJzaXN0ZW5jZSBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICByZXR1cm4gdGhpcy5fcGVyc2lzdGVuY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZ2dlcikgdGhpcy5fbG9nZ2VyID0gTG9nZ2luZy5mb3IoRGVjYWZDb3JlTW9kdWxlKTtcbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChERUNBRl9NT0RVTEVfT1BUSU9OUylcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uczxDT05GLCBBREFQVEVSPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZVJlZjogTW9kdWxlUmVmXG4gICkge31cblxuICBzdGF0aWMgZm9yUm9vdChvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnMpOiBEeW5hbWljTW9kdWxlIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5mb3JSb290KTtcbiAgICBjb25zdCBkZWNhZlByb3ZpZGVycyA9IGdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycygpO1xuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmQ29yZU1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IERFQ0FGX01PRFVMRV9PUFRJT05TLCB1c2VWYWx1ZTogb3B0aW9ucyB9LFxuICAgICAgICB7IHByb3ZpZGU6IERFQ0FGX0FEQVBURVJfSUQsIHVzZVZhbHVlOiB0aGlzLnBlcnNpc3RlbmNlPy5jbGllbnQgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IERFQ0FGX0hBTkRMRVJTLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6ICgpID0+XG4gICAgICAgICAgICBvcHRpb25zLmhhbmRsZXJzPy5tYXAoKEgpID0+IHtcbiAgICAgICAgICAgICAgbG9nLmluZm8oYFJlZ2lzdGVyZWQgcmVxdWVzdCBoYW5kbGVyOiAke0gubmFtZX1gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIKCk7XG4gICAgICAgICAgICB9KSA/PyBbXSxcbiAgICAgICAgfSxcbiAgICAgICAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gICAgICAgICAgdXNlQ2xhc3M6IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbiAgICAgICAgfSxcbiAgICAgICAgLi4uZGVjYWZQcm92aWRlcnMsXG4gICAgICBdLFxuICAgICAgZXhwb3J0czogW1xuICAgICAgICBERUNBRl9NT0RVTEVfT1BUSU9OUyxcbiAgICAgICAgREVDQUZfQURBUFRFUl9JRCxcbiAgICAgICAgREVDQUZfSEFORExFUlMsXG4gICAgICAgIERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgICAgIERlY2FmSGFuZGxlckV4ZWN1dG9yLFxuICAgICAgICAuLi5kZWNhZlByb3ZpZGVycy5tYXAoKHByb3ZpZGVyKSA9PiBwcm92aWRlci5wcm92aWRlKSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBib290UGVyc2lzdGVuY2UoXG4gICAgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zXG4gICk6IFByb21pc2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W10+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ib290UGVyc2lzdGVuY2UpO1xuXG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSkge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IG9wdGlvbnMuY29uZi5tYXAoKFtjb250ciwgY2ZnLCAuLi5hcmdzXSkgPT4ge1xuICAgICAgICBjb25zdCBwb3NzaWJsZSA9IGFyZ3MucG9wKCk7XG4gICAgICAgIGlmICghcG9zc2libGUpIHJldHVybiBbY29udHIsIGNmZ107XG4gICAgICAgIHJldHVybiBbY29udHIsIGNmZywgLi4uYXJnc107XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gbmV3IFBlcnNpc3RlbmNlU2VydmljZSgpO1xuICAgICAgYXdhaXQgdGhpcy5fcGVyc2lzdGVuY2UuYm9vdCh0cmltbWVkKTtcbiAgICAgIGNvbnN0IGNsaWVudHMgPSB0aGlzLl9wZXJzaXN0ZW5jZS5jbGllbnQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsaWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IG9wdGlvbnMuY29uZltpXTtcbiAgICAgICAgY29uc3QgcG9zc2libGVUcmFuc2YgPSBjLnNsaWNlKDIsIGMubGVuZ3RoKTtcbiAgICAgICAgbGV0IHRyYW5zZm9ybWVyID0gcG9zc2libGVUcmFuc2YucG9wKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdHJhbnNmb3JtZXIgfHxcbiAgICAgICAgICAhKHRyYW5zZm9ybWVyIGFzIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+KS5mcm9tXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGNvbnRyID0gQWRhcHRlci50cmFuc2Zvcm1lckZvcihjbGllbnRzW2ldLmZsYXZvdXIpO1xuICAgICAgICAgIGlmICghY29udHIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgYE5vIHRyYW5zZm9ybWVyIGZvdW5kIGZvciBmbGF2b3VyICR7Y2xpZW50c1tpXS5mbGF2b3VyfS4geW91IHNob3VsZCBlaXRoZXIgQHJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciBvciBwcm92aWRlIGEgdHJhbnNmb3JtZXIgaW4gdGhlIGNvbmZpZ2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRyYW5zZm9ybWVyID0gKGNvbnRyIGFzIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+KS5mcm9tXG4gICAgICAgICAgICAgID8gY29udHJcbiAgICAgICAgICAgICAgOiBuZXcgKGNvbnRyIGFzIENvbnN0cnVjdG9yPFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+PikoKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBib290IHRyYW5zZm9ybWVyIGZvciAke2NsaWVudHNbaV0uZmxhdm91cn06ICR7ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIoY2xpZW50c1tpXS5mbGF2b3VyKSh0cmFuc2Zvcm1lcik7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhcInBlcnNpc3RlbmNlIGxheWVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IVwiKTtcblxuICAgICAgaWYgKG9wdGlvbnMuaW5pdGlhbGl6YXRpb24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXRpYWxpemF0aW9uKCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgYXBwbGljYXRpb246ICR7ZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLmNsaWVudDtcbiAgfVxuXG4gIGFzeW5jIG9uQXBwbGljYXRpb25TaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSBEZWNhZkNvcmVNb2R1bGUubG9nLmZvcih0aGlzLm9uQXBwbGljYXRpb25TaHV0ZG93bik7XG4gICAgY29uc3QgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdID1cbiAgICAgIHRoaXMubW9kdWxlUmVmLmdldDxhbnk+KERFQ0FGX0FEQVBURVJfSUQpO1xuICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiBhZGFwdGVycylcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFNodXR0aW5nIGRvd24gJHthZGFwdGVyLnRvU3RyaW5nKCl9YCk7XG4gICAgICAgICAgYXdhaXQgYWRhcHRlci5zaHV0ZG93bigpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIGFwcGxpY2F0aW9uYCwgZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFNlcnZpY2Uuc2h1dGRvd24oKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBzaHV0ZG93biBzZXJ2aWNlc2AsIGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyA9IFN5bWJvbChcbiAgXCJMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlNcIlxuKTtcbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRSZXNwb25zZShhcmdzOiBhbnlbXSk6IHVua25vd25bXSB7XG4gIGNvbnN0IFttb2RlbENvbnN0ciwgb3BlcmF0aW9uLCBpZCwgcGF5bG9hZF0gPSBhcmdzO1xuXG4gIGNvbnN0IG1vZGVsTmFtZSA9IG1vZGVsQ29uc3RyPy5uYW1lID8/IG1vZGVsQ29uc3RyO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZWRQYXlsb2FkID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKVxuICAgID8gcGF5bG9hZC5tYXAoKGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGUuc2VyaWFsaXplID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBlLnNlcmlhbGl6ZSgpO1xuXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFBheWxvYWQgaXRlbSBmb3IgJHttb2RlbE5hbWV9IGRvZXMgbm90IGhhdmUgc2VyaWFsaXplIG1ldGhvZCBhbmQgaXMgYW4gJHt0eXBlb2YgZX0sIGF0dGVtcHRpbmcgdG8gc3RyaW5naWZ5IGRpcmVjdGx5LiBJdGVtOiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSBcInN0cmluZ1wiID8gZSA6IEpTT04uc3RyaW5naWZ5KGUpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBzZXJpYWxpemUgcGF5bG9hZCBmb3IgJHttb2RlbE5hbWV9OiAke2Vycn1gKTtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIDogcGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZC5zZXJpYWxpemUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBwYXlsb2FkLnNlcmlhbGl6ZSgpXG4gICAgICA6IHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gcGF5bG9hZFxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuXG4gIGNvbnNvbGUuZGVidWcoXG4gICAgYE5vcm1hbGl6ZWQgZXZlbnQgcmVzcG9uc2UgZm9yIG1vZGVsICR7bW9kZWxOYW1lfSwgb3BlcmF0aW9uICR7b3BlcmF0aW9ufSwgaWQgJHtpZH06YCxcbiAgICBzZXJpYWxpemVkUGF5bG9hZFxuICApO1xuXG4gIHJldHVybiBbbW9kZWxOYW1lLCBvcGVyYXRpb24sIGlkLCBzZXJpYWxpemVkUGF5bG9hZF07XG59XG4iLCJpbXBvcnQgeyBEZWNhZkNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgQWRhcHRlciwgT2JzZXJ2ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2xsZXIsIEluamVjdCwgTWVzc2FnZUV2ZW50LCBRdWVyeSwgU3NlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBpbnRlcnZhbCwgbWVyZ2UsIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIH0gZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCB7IERlY2FmU2VydmVyQ3R4IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplRXZlbnRSZXNwb25zZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBtYXAsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5AQ29udHJvbGxlcigpXG5leHBvcnQgY2xhc3MgRXZlbnRzQ29udHJvbGxlciBleHRlbmRzIERlY2FmQ29udHJvbGxlcjxEZWNhZlNlcnZlckN0eD4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGFkYXB0ZXJzOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIEBJbmplY3QoTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTKSBmbGF2b3Vyczogc3RyaW5nW11cbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCwgRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcbiAgICB0aGlzLmFkYXB0ZXJzID0gZmxhdm91cnMubWFwKChmbGF2b3VyKSA9PiAoQWRhcHRlciBhcyBhbnkpLmdldChmbGF2b3VyKSk7IC8vIGNoYW5nZSB0byBBZGFwdGVyLmNhY2hlKFwiXCIpXG4gIH1cblxuICBAU3NlKClcbiAgbGlzdGVuKCk6IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5mb3IoRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcblxuICAgIGNvbnN0IGV2ZW50cyQgPSBuZXcgT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+KChvYnNlcnZlcikgPT4ge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJJZCA9XG4gICAgICAgIGBCLSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YC50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYENyZWF0aW5nIFNTRSBvYnNlcnZlcjogJHtvYnNlcnZlcklkfSBmb3IgY2xpZW50ICR7dGhpcy5jbGllbnRDb250ZXh0LnV1aWR9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNiID0gbmV3IChjbGFzcyBpbXBsZW1lbnRzIE9ic2VydmVyIHtcbiAgICAgICAgb2JzZXJ2ZXJJZCA9IG9ic2VydmVySWQ7XG4gICAgICAgIHJlZnJlc2goLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgU1NFIG9ic2VydmVyICR7dGhpcy5vYnNlcnZlcklkfSByZWNlaXZlZCByZWZyZXNoIGV2ZW50YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UoYXJncyk7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgdHlwZTogXCJtZXNzYWdlXCIsIGRhdGEgfSk7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBTU0Ugb2JzZXJ2ZXIgJHt0aGlzLm9ic2VydmVySWR9IGV2ZW50IHB1c2hlZCB0byBjbGllbnRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICBsb2dnZXIudmVyYm9zZShcbiAgICAgICAgYFJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gYWNyb3NzICR7dGhpcy5hZGFwdGVycy5sZW5ndGh9IGFkYXB0ZXIocylgXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgY29uc3QgYWRhcHRlck5hbWUgPSBhZGFwdGVyPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBcIlVua25vd25BZGFwdGVyXCI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGFkYXB0ZXIub2JzZXJ2ZShjYik7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVnaXN0ZXIgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBpbiBhZGFwdGVyICR7YWRhcHRlck5hbWV9OiAke2U/Lm1lc3NhZ2UgfHwgZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDbGVhbmluZyB1cCBTU0Ugb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfWApO1xuXG4gICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgY29uc3QgYWRhcHRlck5hbWUgPSBhZGFwdGVyPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBcIlVua25vd25BZGFwdGVyXCI7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFVucmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBmcm9tIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYWRhcHRlci51bk9ic2VydmUoY2IpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICBgRmFpbGVkIGR1cmluZyBjbGVhbnVwIG9mIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfTogJHtlPy5tZXNzYWdlIHx8IGV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBIRUFSVEJFQVRfSU5URVJWQUxfTVMgPSAxNTAwMDtcbiAgICBjb25zdCBoZWFydGJlYXQkID0gaW50ZXJ2YWwoSEVBUlRCRUFUX0lOVEVSVkFMX01TKS5waXBlKFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiU2VuZGluZyBoZWFydGJlYXRcIik7XG4gICAgICB9KSxcbiAgICAgIG1hcChcbiAgICAgICAgKCk6IE1lc3NhZ2VFdmVudCA9PiAoe1xuICAgICAgICAgIHR5cGU6IFwiaGVhcnRiZWF0XCIsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG5cbiAgICByZXR1cm4gbWVyZ2UoZXZlbnRzJCwgaGVhcnRiZWF0JCk7XG4gIH1cblxuICBAU3NlKFwiLzptb2RlbFwiKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGxpc3RlbkZvck1vZGVsKEBRdWVyeShcIm1vZGVsXCIpIG1vZGVsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKEV2ZW50c0NvbnRyb2xsZXIubmFtZSk7XG5cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50Pigob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IGNiID0gbmV3IChjbGFzcyBpbXBsZW1lbnRzIE9ic2VydmVyIHtcbiAgICAgICAgcmVmcmVzaCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBkYXRhOiBhcmdzIH0gYXMgYW55KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgICBhZGFwdGVyLm9ic2VydmUoY2IpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoYEZhaWxlZCB0byBvYnNlcnZlIGV2ZW50OiAke2UubWVzc2FnZSB8fCBlfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgICBhZGFwdGVyLnVuT2JzZXJ2ZShjYik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRXZlbnRzQ29udHJvbGxlciB9IGZyb20gXCIuL0V2ZW50c0NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyB9IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZlN0cmVhbU1vZHVsZSB7XG4gIHN0YXRpYyBmb3JGbGF2b3VycyhcbiAgICBmbGF2b3Vyczogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nID0gXCJldmVudHNcIlxuICApOiBEeW5hbWljTW9kdWxlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZlN0cmVhbU1vZHVsZSxcbiAgICAgIGNvbnRyb2xsZXJzOiBbRXZlbnRzQ29udHJvbGxlcl0sXG4gICAgICBpbXBvcnRzOiBbXG4gICAgICAgIFJvdXRlck1vZHVsZS5yZWdpc3RlcihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGF0aDogcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIiksXG4gICAgICAgICAgICBtb2R1bGU6IERlY2FmU3RyZWFtTW9kdWxlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgXSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTLFxuICAgICAgICAgIHVzZVZhbHVlOiBmbGF2b3VycyA/PyBbXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgRm9yd2FyZFJlZmVyZW5jZSwgTW9kdWxlLCBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZDb3JlTW9kdWxlIH0gZnJvbSBcIi4vY29yZS1tb2R1bGVcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGdldE1vZHVsZUZvciB9IGZyb20gXCIuL2RlY2FmLW1vZGVsL2luZGV4XCI7XG5pbXBvcnQgeyBEZWNhZlN0cmVhbU1vZHVsZSB9IGZyb20gXCIuL2V2ZW50cy1tb2R1bGVcIjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZNb2R1bGUge1xuICBzdGF0aWMgYXN5bmMgZm9yUm9vdEFzeW5jKFxuICAgIG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uc1xuICApOiBQcm9taXNlPER5bmFtaWNNb2R1bGU+IHtcbiAgICBjb25zdCB7IGF1dG9Db250cm9sbGVycywgYXV0b1NlcnZpY2VzIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdID1cbiAgICAgIGF3YWl0IERlY2FmQ29yZU1vZHVsZS5ib290UGVyc2lzdGVuY2Uob3B0aW9ucyk7XG4gICAgY29uc3QgZmxhdm91cnMgPSBhZGFwdGVycy5tYXAoKGFkYXB0ZXIpID0+IGFkYXB0ZXIuZmxhdm91cik7XG5cbiAgICBjb25zdCBpbXBvcnRzOlxuICAgICAgfCAoXG4gICAgICAgICAgfCBEeW5hbWljTW9kdWxlXG4gICAgICAgICAgfCBUeXBlPGFueT5cbiAgICAgICAgICB8IFByb21pc2U8RHluYW1pY01vZHVsZT5cbiAgICAgICAgICB8IEZvcndhcmRSZWZlcmVuY2U8YW55PlxuICAgICAgICApW11cbiAgICAgIHwgdW5kZWZpbmVkID0gW0RlY2FmQ29yZU1vZHVsZS5mb3JSb290KG9wdGlvbnMpXTtcblxuICAgIGlmIChhdXRvQ29udHJvbGxlcnMpIHtcbiAgICAgICAgZmxhdm91cnMuZm9yRWFjaCgoZmxhdm91cikgPT4ge1xuICAgICAgICAgIGltcG9ydHMucHVzaChcbiAgICAgICAgICAgIGdldE1vZHVsZUZvcihmbGF2b3VyKS5mb3JSb290KGZsYXZvdXIsIHtcbiAgICAgICAgICAgICAgYXV0b1NlcnZpY2VzLFxuICAgICAgICAgICAgICBjb250cm9sbGVyRXhwb3N1cmU6IG9wdGlvbnMuY29udHJvbGxlckV4cG9zdXJlLFxuICAgICAgICAgICAgICBjb250cm9sbGVyQ29uZmlnOiBvcHRpb25zLmNvbnRyb2xsZXJDb25maWcsXG4gICAgICAgICAgICAgIGFnZ3JlZ2F0aW9uczogb3B0aW9ucy5hZ2dyZWdhdGlvbnMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub2JzZXJ2ZXJPcHRpb25zPy5lbmFibGVPYnNlcnZlckV2ZW50cykge1xuICAgICAgaW1wb3J0cy5wdXNoKFxuICAgICAgICBEZWNhZlN0cmVhbU1vZHVsZS5mb3JGbGF2b3VycyhcbiAgICAgICAgICBvcHRpb25zLm9ic2VydmVyT3B0aW9ucy5vYnNlcnZlckZsYXZvdXJzIHx8IGZsYXZvdXJzXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZNb2R1bGUsXG4gICAgICBpbXBvcnRzOiBpbXBvcnRzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bk1pZ3JhdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7fVxuIiwiaW1wb3J0IHtNb2RlbH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtJbnRlcm5hbEVycm9yfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7UmVwb3NpdG9yeX0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvRm9yTW9kZWwobW9kZWw6IHN0cmluZykge1xuXHRjb25zdCBtID0gTW9kZWwuZ2V0KG1vZGVsKTtcblx0aWYgKCFtKVxuXHRcdHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gZmluZCByZXBvc2l0b3J5IGZvciAke21vZGVsfWApXG5cdGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKG0pO1xuXHRyZXR1cm4gcmVwbztcbn0iLCIvKipcbiAqIEBtb2R1bGUgZm9yLW5lc3RcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIG1vZHVsZSBzZXJ2ZXMgYXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSB0cy13b3Jrc3BhY2UgbGlicmFyeS4gSXQgYWdncmVnYXRlcyBhbmQgZXhwb3J0c1xuICogZnVuY3Rpb25hbGl0eSBmcm9tIHZhcmlvdXMgc3VibW9kdWxlcyBhbmQgdXRpbGl0aWVzIHdpdGhpbiB0aGUgcHJvamVjdC5cbiAqXG4gKiBUaGUgbW9kdWxlIGluY2x1ZGVzOlxuICogMS4gVXRpbGl0eSBmdW5jdGlvbnMgYW5kIHR5cGVzIGZyb20gdGhlIFwiLi91dGlsc1wiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhlc2UgbGlrZWx5IGNvbnRhaW4gaGVscGVyIGZ1bmN0aW9ucywgY29tbW9uIHR5cGVzLCBhbmQgc2hhcmVkIGZ1bmN0aW9uYWxpdHkgdXNlZCB0aHJvdWdob3V0IHRoZSBwcm9qZWN0LlxuICogICAgLSBNYXkgaW5jbHVkZSBvcGVyYXRpb25zIGZvciBkYXRhIG1hbmlwdWxhdGlvbiwgdHlwZSBjaGVja2luZywgb3Igb3RoZXIgZ2VuZXJhbC1wdXJwb3NlIHV0aWxpdGllcy5cbiAqXG4gKiAyLiBBIG5hbWVzcGFjZSBhbmQgcmVsYXRlZCB0eXBlcyBmcm9tIHRoZSBcIi4vbmFtZXNwYWNlXCIgZGlyZWN0b3J5OlxuICogICAgLSBUaGlzIGNvdWxkIGNvbnRhaW4gZG9tYWluLXNwZWNpZmljIGNvZGUgb3IgYSBjb2xsZWN0aW9uIG9mIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eS5cbiAqICAgIC0gTWlnaHQgaW5jbHVkZSBpbnRlcmZhY2VzLCB0eXBlcywgb3IgY2xhc3NlcyB0aGF0IHJlcHJlc2VudCBjb3JlIGNvbmNlcHRzIGluIHRoZSBsaWJyYXJ5LlxuICpcbiAqIDMuIEEgVkVSU0lPTiBjb25zdGFudDpcbiAqICAgIC0gUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUuXG4gKiAgICAtIFVzZWZ1bCBmb3IgdmVyc2lvbiBjaGVja2luZyBhbmQgY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAqXG4gKiBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyBhIGNsZWFuIGFuZCBvcmdhbml6ZWQgZXhwb3J0IG9mIHRoZSBtb2R1bGUncyBmdW5jdGlvbmFsaXR5LCBhbGxvd2luZyBjb25zdW1lcnNcbiAqIHRvIGVhc2lseSBpbXBvcnQgYW5kIHVzZSBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgbGlicmFyeSBhcyBuZWVkZWQuXG4gKi9cblxuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCBcIi4vZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7IC8vIG9uIHRvcCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNhZi1tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXV0aFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmFjdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJjZXB0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vdmVycmlkZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlcXVlc3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29udHJvbGxlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZHVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29yZS1tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXZlbnRzLW1vZHVsZVwiO1xuLy8gZXhwb3J0ICogZnJvbSBcIi4vd2ViaG9va3NcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRzLXdvcmtzcGFjZSBtb2R1bGUuXG4gKiBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAqIEBjb25zdGFudFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29tbWl0IGhhc2ggb2YgdGhlIG1vZHVsZSBidWlsZC5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBnaXQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLiBUaGUgYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgY29tbWl0IGhhc2ggYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IENPTU1JVFxuICovXG5leHBvcnQgY29uc3QgQ09NTUlUID0gXCIjI0NPTU1JVCMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGZ1bGwgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtdmVyIHZlcnNpb24gYW5kIGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS5cbiAqIFRoZSBidWlsZCByZXBsYWNlcyB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGA8dmVyc2lvbj4tPGNvbW1pdD5gIHZhbHVlIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBGVUxMX1ZFUlNJT05cbiAqL1xuZXhwb3J0IGNvbnN0IEZVTExfVkVSU0lPTiA9IFwiIyNGVUxMX1ZFUlNJT04jI1wiO1xuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5hbGxvd1JlcmVnaXN0cmF0aW9uKHRydWUpO1xuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7XG5NZXRhZGF0YS5hbGxvd1JlcmVnaXN0cmF0aW9uKGZhbHNlKTtcbiJdLCJuYW1lcyI6WyJERUNPUkFUT1JTX1BSRUZJWCIsIkRFQ09SQVRPUlMiLCJBUElfT1BFUkFUSU9OIiwiQVBJX1JFU1BPTlNFIiwiQVBJX1BST0RVQ0VTIiwiQVBJX0NPTlNVTUVTIiwiQVBJX1RBR1MiLCJBUElfQ0FMTEJBQ0tTIiwiQVBJX1BBUkFNRVRFUlMiLCJBUElfSEVBREVSUyIsIkFQSV9NT0RFTF9QUk9QRVJUSUVTIiwiQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVkiLCJBUElfU0VDVVJJVFkiLCJBUElfRVhDTFVERV9FTkRQT0lOVCIsIkFQSV9FWENMVURFX0NPTlRST0xMRVIiLCJBUElfRVhUUkFfTU9ERUxTIiwiQVBJX0VYVEVOU0lPTiIsIkFQSV9TQ0hFTUEiLCJBUElfREVGQVVMVF9HRVRURVIiLCJBUElfTElOSyIsImlzQ29uc3RydWN0b3IiLCJ2YWwiLCJNRVRBREFUQV9GQUNUT1JZX05BTUUiLCJNRVRIT0RfTUVUQURBVEEiLCJjcmVhdGVNZXRob2REZWNvcmF0b3IiLCJtZXRha2V5IiwibWV0YWRhdGEiLCJvdmVycmlkZUV4aXN0aW5nIiwidGFyZ2V0Iiwia2V5IiwiZGVzY3JpcHRvciIsInByZXZWYWx1ZSIsIlJlZmxlY3QiLCJnZXRNZXRhZGF0YSIsInZhbHVlIiwiZGVmaW5lTWV0YWRhdGEiLCJjcmVhdGVDbGFzc0RlY29yYXRvciIsImNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yIiwicHJvcGVydHlLZXkiLCJwcm9wZXJ0aWVzIiwiaW5jbHVkZXMiLCJleGlzdGluZ01ldGFkYXRhIiwibmV3TWV0YWRhdGEiLCJwaWNrQnkiLCJuZWdhdGUiLCJpc1VuZGVmaW5lZCIsIm1ldGFkYXRhVG9TYXZlIiwidHlwZSIsImNvbnN0cnVjdG9yIiwiY3JlYXRlTWl4ZWREZWNvcmF0b3IiLCJtZXRhZGF0YXMiLCJBcnJheSIsImlzQXJyYXkiLCJwcmV2aW91c01ldGFkYXRhIiwiT2JqZWN0IiwiYXNzaWduIiwiY3JlYXRlUGFyYW1EZWNvcmF0b3IiLCJpbml0aWFsIiwicGFyYW1PcHRpb25zIiwicGFyYW1ldGVycyIsInByb3BlcnR5S2V5cyIsImdldE93blByb3BlcnR5TmFtZXMiLCJwcm90b3R5cGUiLCJtZXRob2REZXNjcmlwdG9yIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiaXNBcGlNZXRob2QiLCJoYXNNZXRhZGF0YSIsImdldFR5cGVJc0FycmF5VHVwbGUiLCJpbnB1dCIsImlzQXJyYXlGbGFnIiwiaXNJbnB1dEFycmF5Iiwib2JqIiwiZ2V0RW51bVZhbHVlcyIsImVudW1UeXBlIiwibnVtZXJpY1ZhbHVlcyIsInZhbHVlcyIsImZpbHRlciIsIm1hcCIsInRvU3RyaW5nIiwia2V5cyIsImdldEVudW1UeXBlIiwiaGFzU3RyaW5nIiwiaXNTdHJpbmciLCJsZW5ndGgiLCJyZXF1aXJlZCIsImlzRW51bUFycmF5Iiwib3B0cyIsImVudW0iLCJ1bmRlZmluZWQiLCJBcGlQcm9wZXJ0eSIsIm9wdGlvbnMiLCJjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvciIsImVudW1WYWx1ZXMiLCJpdGVtcyIsIkFwaU9wZXJhdGlvbkZyb21Nb2RlbCIsIk1vZGVsQ29uc3RydWN0b3IiLCJ2ZXJiIiwicGF0aCIsImh0dHBUb0NydWQiLCJHRVQiLCJPcGVyYXRpb25LZXlzIiwiUkVBRCIsIkdldCIsIlBPU1QiLCJDUkVBVEUiLCJQb3N0IiwiUFVUIiwiVVBEQVRFIiwiUHV0IiwiUEFUQ0giLCJQYXRjaCIsIkRFTEVURSIsIkRlbGV0ZSIsImNydWRPcCIsIkh0dHBNZXRob2REZWNvcmF0b3IiLCJyZXNvbHZlQmxvY2tUYXJnZXQiLCJjb3JlSXNPcGVyYXRpb25CbG9ja2VkIiwia2luZCIsImFwcGx5IiwiQXBpRXhjbHVkZUVuZHBvaW50IiwiQnVsa0FwaU9wZXJhdGlvbkZyb21Nb2RlbCIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsIlJFQURfQUxMIiwiQ1JFQVRFX0FMTCIsIlVQREFURV9BTEwiLCJERUxFVEVfQUxMIiwibm9ybWFsaXplZCIsInJlcGxhY2UiLCJzdGF0ZW1lbnRUYXJnZXRzIiwiUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIiwiTElTVF9CWSIsIlBBR0VfQlkiLCJGSU5EIiwiUEFHRSIsIkZJTkRfT05FX0JZIiwiRklORF9CWSIsIkNPVU5UX09GIiwiTUFYX09GIiwiTUlOX09GIiwiQVZHX09GIiwiU1VNX09GIiwiRElTVElOQ1RfT0YiLCJHUk9VUF9PRiIsInN0YXJ0c1dpdGgiLCJzdGF0ZW1lbnRWYWx1ZSIsIkFwaVBhcmFtc0Zyb21Nb2RlbCIsInByb3BzIiwiZGVjb3JhdG9ycyIsInAiLCJBcGlQYXJhbURlYyIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlN0cmluZyIsImFwcGx5RGVjb3JhdG9ycyIsIkRlY2FmQm9keSIsImRhdGEiLCJjdHgiLCJyZXF1ZXN0Iiwic3dpdGNoVG9IdHRwIiwiZ2V0UmVxdWVzdCIsImJvZHkiLCJjb250cm9sbGVyIiwiZ2V0Q2xhc3MiLCJNb2RlbENvbnN0ciIsImNsYXNzIiwiSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiIsIml0ZW0iLCJPcmRlcmVkUGFyYW1zIiwib3JkZXIiLCJyZXEiLCJvcmlnaW5hbCIsInBhcmFtcyIsIm9yZGVyTGlzdCIsIm9yZGVyZWQiLCJrIiwicmF3IiwidmFsdWVzSW5PcmRlciIsImtleXNJbk9yZGVyIiwiRGVjYWZQYXJhbXMiLCJEZWNhZlF1ZXJ5IiwiXyIsInF1ZXJ5IiwicGFyc2VkIiwibGltaXQiLCJuIiwiTnVtYmVyIiwiaXNOYU4iLCJvZmZzZXQiLCJib29rbWFyayIsIkRFQ0FGX01PRFVMRV9PUFRJT05TIiwiREVDQUZfQURBUFRFUl9JRCIsIkRFQ0FGX1RBU0tfU0VSVklDRV9JRCIsIkRFQ0FGX1JPVVRFIiwiREVDQUZfSEFORExFUlMiLCJTeW1ib2wiLCJERUNBRl9FWFBPU0UiLCJERUNBRl9DT05UUk9MTEVSX0NPTkZJRyIsIkRFQ0FGX0NPTlRFWFRfS0VZIiwiZXhwb3NlIiwiZmxhdm91cnMiLCJNZXRhZGF0YSIsInNldCIsImNvbnRyb2xsZXJDb25maWciLCJjb25maWciLCJjb250cm9sbGVyQ29uZmlnRGVjb3JhdG9yIiwiQVVUSF9IQU5ETEVSIiwiQVVUSF9NRVRBX0tFWSIsIklTX1BVQkxJQ19LRVkiLCJSRVFVSVJFRF9ST0xFU19LRVkiLCJTS0lQX01PREVMX1JPTEVTX0tFWSIsIkRlY2FmUmVxdWVzdENvbnRleHQiLCJSZXF1ZXN0Q29udGV4dCIsInN1cGVyIiwiaGVhZGVyc09mIiwiaGVhZGVycyIsInRoaXMiLCJ1dWlkIiwiVVVJRCIsImluc3RhbmNlIiwiZ2VuZXJhdGUiLCJwdXQiLCJyZWNvcmQiLCJvdmVycmlkZXMiLCJnZXQiLCJlIiwiYWNjdW11bGF0ZSIsIl9fZGVjb3JhdGUiLCJJbmplY3RhYmxlIiwic2NvcGUiLCJTY29wZSIsIlJFUVVFU1QiLCJfX3BhcmFtIiwiSW5qZWN0IiwiQXV0aEludGVyY2VwdG9yIiwicmVmbGVjdG9yIiwicmVxdWVzdENvbnRleHQiLCJhdXRoSGFuZGxlciIsImludGVyY2VwdCIsIm5leHQiLCJsb2ciLCJMb2dnaW5nIiwiZm9yIiwiaXNQdWJsaWMiLCJnZXRBbGxBbmRPdmVycmlkZSIsImdldEhhbmRsZXIiLCJtb2RlbE5hbWUiLCJyZXF1aXJlZFJvbGVzIiwic2tpcE1vZGVsUm9sZXMiLCJlZmZlY3RpdmVNb2RlbCIsInZlcmJvc2UiLCJkZWJ1ZyIsImF1dGhvcml6ZSIsImFwcGx5VHJhbnNmb3JtZXJzIiwidXNlciIsImdldE9yVW5kZWZpbmVkIiwib3JnYW5pemF0aW9uIiwiY3VycmVudExvZyIsImNoaWxkTG9nIiwibG9nZ2VyIiwiaGFuZGxlIiwiQWRhcHRlciIsImZsYXZvdXJzVG9UcmFuc2Zvcm0iLCJmbGF2b3VyIiwidHJhbnNmb3JtZXIiLCJ0cmFuc2Zvcm1lckZvciIsImZyb20iLCJPcHRpb25hbCIsIlJlZmxlY3RvciIsIkF1dGgiLCJtb2RlbCIsInJlc291cmNlIiwiZGVjcyIsIkFwaUJlYXJlckF1dGgiLCJVc2VJbnRlcmNlcHRvcnMiLCJwdXNoIiwiU2V0TWV0YWRhdGEiLCJQdWJsaWMiLCJSZXF1aXJlUm9sZXMiLCJyb2xlcyIsIkFwaVNlY3VyaXR5IiwiSHR0cFZlcmJUb0RlY29yYXRvciIsImRlY29yYXRvciIsIkVycm9yIiwiZXh0cmFjdFBhdGhQYXJhbXMiLCJyb3V0ZVBhdGgiLCJzcGxpdCIsInNsaWNlIiwiYXBpUGFyYW1TcGVjIiwiZ2V0QXBpRGVjb3JhdG9ycyIsIm1ldGhvZE5hbWUiLCJodHRwVmVyYiIsImluY2x1ZGVRdWVyeVBhcmFtcyIsIk5lc3RIdHRwUm91dGVEZWMiLCJhcGlQYXRoUGFyYW1zIiwic3dhZ2dlclF1ZXJ5UGFyYW1zIiwiQXBpUXVlcnkiLCJPcmRlckRpcmVjdGlvbiIsIm1ldGhvZCIsIkFwaVBhcmFtIiwiQXBpT3BlcmF0aW9uIiwic3VtbWFyeSIsIkFwaU9rUmVzcG9uc2UiLCJBcGlOb0NvbnRlbnRSZXNwb25zZSIsIlF1ZXJ5IiwiYXBwbHlBcGlEZWNvcmF0b3JzIiwicHJvdG8iLCJmb3JFYWNoIiwiZCIsImluZGV4IiwicmVzb2x2ZVBlcnNpc3RlbmNlTWV0aG9kIiwicGVyc2lzdGVuY2UiLCJhcmdzIiwiTW9kZWxTZXJ2aWNlIiwic3RhdGVtZW50IiwiY3JlYXRlUm91dGVIYW5kbGVyIiwiYXN5bmMiLCJwYXRoUGFyYW1zIiwicXVlcnlQYXJhbXMiLCJKU09OIiwic3RyaW5naWZ5IiwiZGlyZWN0aW9uIiwiZXJyb3IiLCJkZWZpbmVSb3V0ZU1ldGhvZCIsIkNvbnRyb2xsZXJDbGFzcyIsImhhbmRsZXIiLCJkZWZpbmVQcm9wZXJ0eSIsIndyaXRhYmxlIiwiRGVjYWZBdXRoSGFuZGxlciIsIkF1dGhIYW5kbGVyIiwicGFyc2VSZXF1ZXN0IiwidXNlclJvbGUiLCJhdXRob3JpemF0aW9uIiwiZXh0cmFjdEZyb21BdXRoIiwiQXV0aG9yaXphdGlvbkVycm9yIiwiRGVjYWZSb2xlQXV0aEhhbmRsZXIiLCJ0b0NvbnRleHRGbGFncyIsImFkYXB0ZXIiLCJhbGlhcyIsImJpbmQiLCJyZXF1ZXN0VHJhbnNmb3JtZXJzIiwibWV0YSIsIkNvbnRleHQiLCJ0b1Jlc3BvbnNlIiwicmVzIiwicGVuZGluZyIsImhlYWRlciIsIk1vZGVsQnVpbGRlciIsImRlY29yYXRlQ2xhc3MiLCJfY2xhc3NEZWNvcmF0b3JzIiwiX19oYXNDbGFzc0RlY29yYXRvclN1cHBvcnQiLCJvcmlnaW5hbEJ1aWxkIiwiYnVpbGQiLCJyZXN1bHQiLCJjYWxsIiwiZGVjb3JhdGVkIiwiRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yIiwiRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yXzEiLCJleGVjdXRvciIsImNvbnRleHR1YWxpemUiLCJmbGFncyIsImlwIiwiZXh0cmFjdElwIiwiRGVmYXVsdEFkYXB0ZXJGbGFncyIsInRpbWVzdGFtcCIsIkRhdGUiLCJvcGVyYXRpb24iLCJ1cmwiLCJjb250ZXh0IiwiZ2V0UmVzcG9uc2UiLCJleGVjIiwiRGVjYWZIYW5kbGVyRXhlY3V0b3IiLCJwYXJzZUlwSGVhZGVyIiwiY2FuZGlkYXRlIiwic2VnbWVudCIsInRyaW0iLCJCb29sZWFuIiwiRGVjYWZBdXRoTW9kdWxlIiwiRGVjYWZBdXRoTW9kdWxlXzEiLCJmb3JSb290IiwicHJvdmlkZXJzIiwicHJvdmlkZSIsIkFQUF9JTlRFUkNFUFRPUiIsInVzZUNsYXNzIiwiZ2xvYmFsIiwidXNlRXhpc3RpbmciLCJtb2R1bGUiLCJleHBvcnRzIiwiTW9kdWxlIiwiRGVjYWZIYW5kbGVyRXhlY3V0b3JfMSIsImhhbmRsZXJzIiwiRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIiwicmVzcG9uc2UiLCJwaXBlIiwidGFwIiwiRGVjYWZDb250cm9sbGVyIiwiSHR0cERlY2FmQ29udHJvbGxlciIsImNsaWVudENvbnRleHQiLCJfbmFtZSIsIkRlY2FmTW9kZWxDb250cm9sbGVyIiwiX3BlcnNpc3RlbmNlIiwiU2VydmljZSIsImdldFNlcnZpY2UiLCJSZXBvc2l0b3J5IiwiZm9yTW9kZWwiLCJ0b092ZXJyaWRlcyIsIm92ZXJyaWRlIiwiZHRvQ2FjaGUiLCJNYXAiLCJEdG9Gb3IiLCJvcCIsInN0YWNrIiwiU2V0IiwiVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzIiwiY2FjaGUiLCJnZXREdG9DYWNoZSIsImNhY2hlZCIsImlzVXBkYXRlT3AiLCJEeW5hbWljRFRPIiwidG9QYXNjYWxDYXNlIiwicGtQcm9wIiwiTW9kZWwiLCJwayIsInBrUHJvcHNNZXRhZGF0YSIsInBrUHJvcHMiLCJwa0Rlc2lnblR5cGUiLCJwa1R5cGVJc051bWVyaWMiLCJCaWdJbnQiLCJwa0lzR2VuZXJhdGVkIiwiZ2VuZXJhdGVkIiwiZ2VuZXJhdGVkQnlTZXF1ZW5jZSIsImlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZSIsImFsbFByb3BzIiwicmVsYXRpb25zIiwic2NhbGFyUHJvcHMiLCJwcm9wIiwiaGFzIiwidmFsaWRhdGlvbiIsImdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZSIsImlzUmVxdWlyZWQiLCJWYWxpZGF0aW9uS2V5cyIsIlJFUVVJUkVEIiwidHlwZUhpbnQiLCJnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UiLCJhcGlPcHRpb25zIiwiZGVzaWduVHlwZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJyZWxhdGlvbiIsInJlbGF0aW9uTWV0YSIsIkludGVybmFsRXJyb3IiLCJyZWxhdGlvblR5cGUiLCJ2YWxpZGF0aW9uRm9yIiwiTElTVCIsImlzQ2lyY3VsYXIiLCJwa1R5cGVOYW1lIiwiZ2V0UGtPcGVuQXBpVHlwZSIsImFkZFJlbGF0aW9uUGtSZWYiLCJyZWxhdGlvbkR0byIsImFkZCIsImFkZFJlbGF0aW9uVXBkYXRlIiwiYWRkUmVsYXRpb24iLCJEdG9DbGFzcyIsImV4dHJhTW9kZWxzIiwiZHRvUmVmIiwib25lT2ZJdGVtcyIsIiRyZWYiLCJvbmVPZiIsInBrVHlwZSIsImN1cnJlbnQiLCJGdW5jdGlvbiIsImdldFByb3RvdHlwZU9mIiwiV2Vha01hcCIsIkZyb21Nb2RlbENvbnRyb2xsZXIiLCJnZXRQZXJzaXN0ZW5jZSIsIk1vZGVsQ2xhenoiLCJlMiIsImNyZWF0ZVF1ZXJ5Um91dGVzRnJvbVJlcG9zaXRvcnkiLCJwcmVmaXgiLCJQZXJzaXN0ZW5jZUtleXMiLCJRVUVSWSIsInJlcG8iLCJxdWVyeU1ldGhvZHMiLCJyb3V0ZU1ldGhvZHMiLCJRdWVyeUNvbnRyb2xsZXIiLCJlbnRyaWVzIiwiam9pbiIsImNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIiLCJkZWZpbmVNZXRob2QiLCJodHRwRGVjb3JhdG9yIiwiaHR0cE1ldGhvZCIsImdldFF1ZXJ5RGVjb3JhdG9ycyIsIm9ialZhbHVlcyIsImZpZWxkcyIsImYiLCJjcmVhdGUiLCJtb2R1bGVDb25maWdPdmVycmlkZXMiLCJnbG9iYWxEZWZhdWx0cyIsInRhYmxlTmFtZSIsInRvS2ViYWJDYXNlIiwibW9kZWxDbGF6ek5hbWUiLCJmYWN0b3J5UGVyc2lzdGVuY2UiLCJkZWNvcmF0b3JDb25maWciLCJtb2R1bGVPdmVycmlkZSIsIm1lcmdlZENvbmZpZyIsIkZhY3RvcnlDb250cm9sbGVyIiwiTW9kZWxDb250cm9sbGVyRmFjdG9yeSIsImZhY3RvcnlSb3V0ZXMiLCJfX3JvdXRlc19fIiwiZ2V0UEsiLCJhcGlQcm9wZXJ0aWVzIiwicGtQYXRoIiwiZ2V0Um91dGVQYXJhbWV0ZXJzRnJvbU1vZGVsIiwiYXV0aENvbmZpZyIsImF1dGgiLCJhcHBseUNsYXNzQXV0aCIsInB1YmxpYyIsIkR5bmFtaWNNb2RlbENvbnRyb2xsZXIiLCJEeW5hbWljTW9kZWxDb250cm9sbGVyXzEiLCJpbmZvIiwiQ29udHJvbGxlciIsIkFwaVRhZ3MiLCJBcGlFeHRyYU1vZGVscyIsInNvcnRlZFJvdXRlcyIsInNvcnQiLCJhIiwiYiIsImFTZWdtZW50cyIsImJTZWdtZW50cyIsImFQYXJhbUNvdW50IiwicyIsImJQYXJhbUNvdW50IiwiYUxpdGVyYWxDb3VudCIsImJMaXRlcmFsQ291bnQiLCJyb3V0ZSIsInJlZ2lzdHJhdGlvbiIsIm1hdGNoUm91dGUiLCJwYXJhbURlY29yYXRvcnMiLCJjb21wb3NlZCIsIkRCS2V5cyIsIkNPTVBPU0VEIiwiY29tcG9zZWRLZXlzIiwidW5pcXVlS2V5cyIsInNlcGFyYXRvciIsIm1ldGhvZERlY29yYXRvcnMiLCJub3JtYWxpemVkUGF0aCIsImNyZWF0ZVJlZ2lzdHJhdGlvbiIsImNyZWF0ZUNyZWF0ZUhhbmRsZXIiLCJjcmVhdGVDcmVhdGVEZWNvcmF0b3JzIiwiUmVzcG9uc2UiLCJwYXNzdGhyb3VnaCIsImNyZWF0ZUJ1bGtDcmVhdGVIYW5kbGVyIiwiYnVsa0NyZWF0ZURlY29yYXRvcnMiLCJjcmVhdGVCdWxrUmVhZEhhbmRsZXIiLCJidWxrUmVhZERlY29yYXRvcnMiLCJjcmVhdGVCdWxrVXBkYXRlSGFuZGxlciIsImJ1bGtVcGRhdGVEZWNvcmF0b3JzIiwiY3JlYXRlQnVsa0RlbGV0ZUhhbmRsZXIiLCJidWxrRGVsZXRlRGVjb3JhdG9ycyIsImNyZWF0ZVJlYWRIYW5kbGVyIiwicmVhZERlY29yYXRvcnMiLCJjcmVhdGVVcGRhdGVIYW5kbGVyIiwidXBkYXRlRGVjb3JhdG9ycyIsImNyZWF0ZURlbGV0ZUhhbmRsZXIiLCJkZWxldGVEZWNvcmF0b3JzIiwiZmFsbGJhY2tTZWdtZW50cyIsImlzQWxsUGFyYW1zIiwiZXZlcnkiLCJmYWxsYmFja0FwaVByb3BzIiwic3VmZml4IiwiY3JlYXRlU3RhdGVtZW50SGFuZGxlciIsInN0YXRlbWVudERlY29yYXRvcnMiLCJQYXJhbSIsInN0YXRlbWVudFJvdXRlcyIsInN0YXRlbWVudEtleSIsInN0YXRlbWVudE1ldGhvZE5hbWUiLCJjcmVhdGVTdGF0ZW1lbnRTaG9ydGN1dEhhbmRsZXIiLCJzdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMiLCJzdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyIsInF1ZXJ5TWV0aG9kIiwiY29tcGxleFF1ZXJ5UGFyYW1zIiwicGF0aFNlZ21lbnRzIiwia25vd25QcmVmaXhlcyIsInJvdXRlTWV0YWRhdGEiLCJtYXRjaGVkRW50cnkiLCJmaW5kIiwiYWN0dWFsTWV0aG9kTmFtZSIsInBhcmFtU2VnbWVudHMiLCJjcmVhdGVDdXN0b21Sb3V0ZUhhbmRsZXIiLCJmaXJzdFNlZ21lbnQiLCJzZWdtZW50cyIsInNlZyIsImkiLCJyZXNwIiwibG9nQ3R4IiwiY3JlYXRlZCIsImNyZWF0ZUFsbCIsInJlYWRBbGwiLCJpZHMiLCJub3JtYWxpemVkSWRzIiwicmVhZCIsInVwZGF0ZUFsbCIsInVwZGF0ZWQiLCJkZWxldGVBbGwiLCJyb3V0ZVBhcmFtcyIsImlkIiwiVmFsaWRhdGlvbkVycm9yIiwicmVhZFJlc3VsdCIsInVwZGF0ZSIsInBheWxvYWQiLCJwYXJzZSIsInJlbW92ZSIsImRlbCIsImRlbGV0ZSIsImRldGFpbHMiLCJTVEFURU1FTlQiLCJwYXJzZUludCIsInBhdGhEaXJlY3Rpb24iLCJyZXNvbHZlZERpcmVjdGlvbiIsInN0YXRlbWVudFNob3J0Y3V0IiwibGlzdEJ5IiwicGFnZSIsInBhZ2luYXRlQnkiLCJBU0MiLCJyZWYiLCJmaW5kT25lQnkiLCJmaW5kQnkiLCJmaWVsZCIsImNvbXBsZXhRdWVyeSIsInNwcmVhZEFyZ3MiLCJleHRyYWN0UXVlcnlBcmdzIiwiY3VzdG9tUm91dGUiLCJsYXN0IiwicXVlcnlPYmoiLCJwb3AiLCJoYXNEaXJlY3Rpb24iLCJoYXNMaW1pdCIsImhhc09mZnNldCIsImV4dHJhcyIsIkFwaUJvZHkiLCJBcGlDcmVhdGVkUmVzcG9uc2UiLCJzY2hlbWEiLCJnZXRTY2hlbWFQYXRoIiwiQXBpQmFkUmVxdWVzdFJlc3BvbnNlIiwiQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlIiwiQXBpTm90Rm91bmRSZXNwb25zZSIsImJhc2UiLCJnZXRNb2R1bGVGb3IiLCJEZWNhZk1vZGVsTW9kdWxlIiwiRGVjYWZNb2RlbE1vZHVsZV8xIiwiY3JlYXRlTW9kZWxTZXJ2aWNlcyIsIm1vZGVscyIsInVzZUZhY3RvcnkiLCJpc0V4cG9zZWQiLCJleHBvc3VyZSIsInRyYWNrZWRNb2RlbHMiLCJjb250cm9sbGVyRXhwb3N1cmUiLCJtb2RlbFNlcnZpY2VzIiwiYXV0b1NlcnZpY2VzIiwiYWdncmVnYXRpb25zIiwiYWxsb3dHcm91cGluZ1F1ZXJpZXMiLCJjb250cm9sbGVycyIsIkRlY29yYXRpb24iLCJJbmplY3RhYmxlc0tleXMiLCJJTkpFQ1RBQkxFIiwiZXh0ZW5kIiwibmVzdEluamVjdGFibGUiLCJjYXRlZ29yeSIsImNmZyIsIkRlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyIsInNpbmdsZXRvbiIsIkRFRkFVTFQiLCJkdXJhYmxlIiwiSU5KRUNUIiwibmVzdEluamVjdCIsImlubmVyTmVzdEluamVjdCIsIk1BWCIsIm1heERlYyIsIm1heCIsIm1heGltdW0iLCJNSU4iLCJtaW5EZWMiLCJtaW4iLCJtaW5pbXVtIiwiTUFYX0xFTkdUSCIsIm1heExlbmd0aERlYyIsIm1heExlbmd0aCIsIk1JTl9MRU5HVEgiLCJtaW5MZW5ndGhEZWMiLCJtaW5MZW5ndGgiLCJUWVBFIiwidHlwZURlYyIsIkRBVEUiLCJkYXRlRGVjIiwiZm9ybWF0IiwiRU5VTSIsIm9wdGlvbkRlYyIsIlBBVFRFUk4iLCJwYXR0ZXJuRGVjIiwicGF0IiwicGF0dGVybiIsInNvdXJjZSIsIkNPTFVNTiIsImNvbHVtbkRlYyIsIkRlY29yYXRpb25LZXlzIiwiREVTQ1JJUFRJT04iLCJkZXNjcmlwdGlvbkRlYyIsIkFVVEgiLCJDb3JzRXJyb3IiLCJGb3JiaWRkZW5FcnJvciIsIm1zZyIsIlRvTWFueVJlcXVlc3RzRXJyb3IiLCJCYXNlRXJyb3IiLCJEZWNhZkV4Y2VwdGlvbkZpbHRlciIsImV4Y2VwdGlvbiIsImhvc3QiLCJpc1Byb2R1Y3Rpb24iLCJMb2dnZWRFbnZpcm9ubWVudCIsImVudiIsInN0YXR1c0NvZGUiLCJOb3RGb3VuZEV4Y2VwdGlvbiIsIlVuc3VwcG9ydGVkRXJyb3IiLCJOb3RBY2NlcHRhYmxlRXhjZXB0aW9uIiwibWVzc2FnZSIsImdldFN0YXR1cyIsInN0YXR1cyIsImNvZGUiLCJqc29uIiwidG9JU09TdHJpbmciLCJDYXRjaCIsIlVzZURlY2FmRmlsdGVyIiwiVXNlRmlsdGVycyIsIlVzZURlY2FmSGVhZGVycyIsIlNXQUdHRVJfVUlfQ09OU1RBTlRTIiwidGl0bGUiLCJ2ZXJzaW9uIiwiZmF2aWNvbkZpbGVQYXRoIiwidG9wYmFySWNvbkZpbGVQYXRoIiwic2NoZW1lIiwiYmVhcmVyRm9ybWF0IiwiaW4iLCJwZXJzaXN0QXV0aG9yaXphdGlvbiIsInRvcGJhckJnQ29sb3IiLCJTd2FnZ2VyQ3VzdG9tVUkiLCJjdXN0b21DU1MiLCJjc3MiLCJ0b3BiYXJJY29uUGF0aCIsImltZyIsImI2NCIsImdldEN1c3RvbU9wdGlvbnMiLCJmYXZpY29uIiwiZmF2aWNvblBhdGgiLCJjdXN0b21TaXRlVGl0bGUiLCJjdXN0b21Dc3MiLCJzd2FnZ2VyT3B0aW9ucyIsImZpbGUiLCJmaWxlUGF0aCIsImFzc2V0c1BhdGgiLCJyZWFkRmlsZVN5bmMiLCJlbmNvZGluZyIsIlN3YWdnZXJCdWlsZGVyIiwiYXBwIiwiY3JlYXRlRG9jdW1lbnQiLCJvcGVuQXBpSnNvblBhdGgiLCJvcGVuQXBpWWFtbFBhdGgiLCJEb2N1bWVudEJ1aWxkZXIiLCJzZXRUaXRsZSIsInNldERlc2NyaXB0aW9uIiwic2V0VmVyc2lvbiIsImFkZEJlYXJlckF1dGgiLCJTd2FnZ2VyTW9kdWxlIiwicmVnaXN0ZXJPcGVuQXBpUm91dGUiLCJjb250ZW50VHlwZSIsImJvZHlGYWN0b3J5IiwiaHR0cEFkYXB0ZXIiLCJnZXRIdHRwQWRhcHRlciIsIl9yZXEiLCJyZXBseSIsInNldHVwU3dhZ2dlciIsImRvY3VtZW50Iiwic3dhZ2dlclVJIiwic2V0dXAiLCJqc29uRG9jdW1lbnRVcmwiLCJ5YW1sRG9jdW1lbnRVcmwiLCJZQU1MIiwiTmVzdEJvb3RzdHJhcGVyIiwiX2xvZ2dlciIsIkxvZ2dlciIsImluaXRpYWxpemUiLCJlbmFibGVMb2dnZXIiLCJjdXN0b21Mb2dnZXIiLCJ1c2VMb2dnZXIiLCJlbmFibGVDb3JzIiwib3JpZ2lucyIsImFsbG93TWV0aG9kcyIsImFsbG93ZWRPcmlnaW5zIiwibyIsInRvTG93ZXJDYXNlIiwiY29yc09wdGlvbnMiLCJvcmlnaW4iLCJjYWxsYmFjayIsImNyZWRlbnRpYWxzIiwibWV0aG9kcyIsInVzZUhlbG1ldCIsImhlbG1ldCIsInJlcXVpcmUiLCJ1c2UiLCJ3YXJuIiwic3dhZ2dlciIsInVzZUdsb2JhbFBpcGVzIiwicGlwZXMiLCJ1c2VHbG9iYWxGaWx0ZXJzIiwiZmlsdGVycyIsInVzZUdsb2JhbEludGVyY2VwdG9ycyIsImludGVyY2VwdG9ycyIsInN0YXJ0IiwicG9ydCIsInByb2Nlc3MiLCJQT1JUIiwibGlzdGVuIiwidGhlbiIsImdldFVybCIsInBlbmRpbmdQcm92aWRlcnMiLCJnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMiLCJyZWdpc3RlclByb3ZpZGVyIiwidG9rZW4iLCJpc01vZGVsQ29uc3RydWN0b3IiLCJtb2RlbFNlcnZpY2VUb2tlbiIsIm1vZGVsUmVwb3NpdG9yeVRva2VuIiwicGFyYW1ldGVySW5kZXgiLCJyZXNvbHZlZCIsInBhcmFtVHlwZXMiLCJhc01vZGVsIiwiaW5qZWN0YWJsZVNlcnZpY2VLZXkiLCJDb3JlU2VydmljZSIsIkNvcmVSZXBvc2l0b3J5IiwiRGVjYWZDb3JlTW9kdWxlIiwiRGVjYWZDb3JlTW9kdWxlXzEiLCJtb2R1bGVSZWYiLCJkZWNhZlByb3ZpZGVycyIsInVzZVZhbHVlIiwiY2xpZW50IiwiSCIsInByb3ZpZGVyIiwiYm9vdFBlcnNpc3RlbmNlIiwidHJpbW1lZCIsImNvbmYiLCJjb250ciIsInBvc3NpYmxlIiwiUGVyc2lzdGVuY2VTZXJ2aWNlIiwiYm9vdCIsImNsaWVudHMiLCJjIiwicG9zc2libGVUcmFuc2YiLCJyZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIiLCJpbml0aWFsaXphdGlvbiIsIm9uQXBwbGljYXRpb25TaHV0ZG93biIsImFkYXB0ZXJzIiwic2h1dGRvd24iLCJHbG9iYWwiLCJNb2R1bGVSZWYiLCJMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMiLCJub3JtYWxpemVFdmVudFJlc3BvbnNlIiwibW9kZWxDb25zdHIiLCJzZXJpYWxpemVkUGF5bG9hZCIsInNlcmlhbGl6ZSIsImNvbnNvbGUiLCJlcnIiLCJFdmVudHNDb250cm9sbGVyIiwiRXZlbnRzQ29udHJvbGxlcl8xIiwiZXZlbnRzJCIsIk9ic2VydmFibGUiLCJvYnNlcnZlciIsIm9ic2VydmVySWQiLCJNYXRoIiwicmFuZG9tIiwidG9VcHBlckNhc2UiLCJjYiIsInJlZnJlc2giLCJQcm9taXNlIiwicmVzb2x2ZSIsImFkYXB0ZXJOYW1lIiwib2JzZXJ2ZSIsInVuT2JzZXJ2ZSIsIkhFQVJUQkVBVF9JTlRFUlZBTF9NUyIsImhlYXJ0YmVhdCQiLCJpbnRlcnZhbCIsInRzIiwibWVyZ2UiLCJsaXN0ZW5Gb3JNb2RlbCIsIlNzZSIsIkRlY2FmU3RyZWFtTW9kdWxlIiwiRGVjYWZTdHJlYW1Nb2R1bGVfMSIsImZvckZsYXZvdXJzIiwiaW1wb3J0cyIsIlJvdXRlck1vZHVsZSIsInJlZ2lzdGVyIiwiRGVjYWZNb2R1bGUiLCJEZWNhZk1vZHVsZV8xIiwiZm9yUm9vdEFzeW5jIiwiYXV0b0NvbnRyb2xsZXJzIiwib2JzZXJ2ZXJPcHRpb25zIiwiZW5hYmxlT2JzZXJ2ZXJFdmVudHMiLCJvYnNlcnZlckZsYXZvdXJzIiwicnVuTWlncmF0aW9ucyIsInJlcG9Gb3JNb2RlbCIsIm0iLCJWRVJTSU9OIiwiQ09NTUlUIiwiRlVMTF9WRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwiYWxsb3dSZXJlZ2lzdHJhdGlvbiIsInJlZ2lzdGVyTGlicmFyeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQU8sTUFBTUEsb0JBQW9CO0lBQzFCLE1BQU1DLGFBQWE7UUFDeEJDLGVBQWUsR0FBR0Y7UUFDbEJHLGNBQWMsR0FBR0g7UUFDakJJLGNBQWMs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
2655
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvb3ZlcnJpZGVzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9vdmVycmlkZXMvaGVscGVycy50cyIsIi4uL3NyYy9vdmVycmlkZXMvZGVjb3JhdGlvbi50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0FwaU9wZXJhdGlvbkZyb21Nb2RlbC50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0FwaVBhcmFtc0Zyb21Nb2RlbC50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0RlY2FmQm9keS50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0RlY2FmUGFyYW1zLnRzIiwiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2V4cG9zZS50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2NvbnRyb2xsZXItY29uZmlnLnRzIiwiLi4vc3JjL2F1dGgvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dC50cyIsIi4uL3NyYy9hdXRoL0F1dGhJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9hdXRoL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvZGVjb3JhdG9ycy91dGlscy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC91dGlscy50cyIsIi4uL3NyYy9hdXRoL0RlY2FmQXV0aEhhbmRsZXIudHMiLCIuLi9zcmMvYXV0aC9EZWNhZkF1dGhNb2R1bGUudHMiLCIuLi9zcmMvcmVxdWVzdC9EZWNhZkhhbmRsZXJFeGVjdXRvci50cyIsIi4uL3NyYy9yZXF1ZXN0L0RlY2FmUmVzcG9uc2VJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9jb250cm9sbGVycy50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvRHRvQnVpbGRlci50cyIsIi4uL3NyYy9vdmVycmlkZXMvb3ZlcnJpZGVzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9Nb2RlbEJ1aWxkZXJFeHRlbnNpb25zLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL0Zyb21Nb2RlbENvbnRyb2xsZXIudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvRGVjYWZNb2RlbE1vZHVsZS50cyIsIi4uL3NyYy9kZWNvcmF0aW9uLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXJyb3JzL2NvcnMudHMiLCIuLi9zcmMvZmFjdG9yeS9lcnJvcnMvdGhyb3R0bGluZy50cyIsIi4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvRGVjYWZFcnJvckZpbHRlci50cyIsIi4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9Td2FnZ2VyQ3VzdG9tVUkudHMiLCIuLi9zcmMvZmFjdG9yeS9vcGVuYXBpL1N3YWdnZXJCdWlsZGVyLnRzIiwiLi4vc3JjL2ZhY3RvcnkvTmVzdEJvb3RzdHJhcGVyLnRzIiwiLi4vc3JjL2ludGVyY2VwdG9ycy9EZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9jb3JlLW1vZHVsZS50cyIsIi4uL3NyYy9ldmVudHMtbW9kdWxlL2NvbnN0YW50LnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvdXRpbHMudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS9FdmVudHNDb250cm9sbGVyLnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvRGVjYWZTdHJlYW1Nb2R1bGUudHMiLCIuLi9zcmMvbW9kdWxlLnRzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBERUNPUkFUT1JTX1BSRUZJWCA9IFwic3dhZ2dlclwiO1xuZXhwb3J0IGNvbnN0IERFQ09SQVRPUlMgPSB7XG4gIEFQSV9PUEVSQVRJT046IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlPcGVyYXRpb25gLFxuICBBUElfUkVTUE9OU0U6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlSZXNwb25zZWAsXG4gIEFQSV9QUk9EVUNFUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVByb2R1Y2VzYCxcbiAgQVBJX0NPTlNVTUVTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpQ29uc3VtZXNgLFxuICBBUElfVEFHUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVVzZVRhZ3NgLFxuICBBUElfQ0FMTEJBQ0tTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpQ2FsbGJhY2tzYCxcbiAgQVBJX1BBUkFNRVRFUlM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlQYXJhbWV0ZXJzYCxcbiAgQVBJX0hFQURFUlM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlIZWFkZXJzYCxcbiAgQVBJX01PREVMX1BST1BFUlRJRVM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlNb2RlbFByb3BlcnRpZXNgLFxuICBBUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWTogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU1vZGVsUHJvcGVydGllc0FycmF5YCxcbiAgQVBJX1NFQ1VSSVRZOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpU2VjdXJpdHlgLFxuICBBUElfRVhDTFVERV9FTkRQT0lOVDogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4Y2x1ZGVFbmRwb2ludGAsXG4gIEFQSV9FWENMVURFX0NPTlRST0xMRVI6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeGNsdWRlQ29udHJvbGxlcmAsXG4gIEFQSV9FWFRSQV9NT0RFTFM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeHRyYU1vZGVsc2AsXG4gIEFQSV9FWFRFTlNJT046IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeHRlbnNpb25gLFxuICBBUElfU0NIRU1BOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpU2NoZW1hYCxcbiAgQVBJX0RFRkFVTFRfR0VUVEVSOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpRGVmYXVsdEdldHRlcmAsXG4gIEFQSV9MSU5LOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpTGlua2AsXG59O1xuIiwiaW1wb3J0IHsgaXNBcnJheSwgaXNVbmRlZmluZWQsIG5lZ2F0ZSwgcGlja0J5IH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHsgREVDT1JBVE9SUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgY29uc3QgaXNDb25zdHJ1Y3RvciA9ICh2YWw6IGFueSk6IGJvb2xlYW4gPT4gdmFsID09PSBcImNvbnN0cnVjdG9yXCI7XG5leHBvcnQgY29uc3QgTUVUQURBVEFfRkFDVE9SWV9OQU1FID0gXCJfT1BFTkFQSV9NRVRBREFUQV9GQUNUT1JZXCI7XG5cbmV4cG9ydCBjb25zdCBNRVRIT0RfTUVUQURBVEEgPSBcIm1ldGhvZFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWV0aG9kRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBULFxuICB7IG92ZXJyaWRlRXhpc3RpbmcgfSA9IHsgb3ZlcnJpZGVFeGlzdGluZzogdHJ1ZSB9XG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIGtleTogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuICApID0+IHtcbiAgICBpZiAodHlwZW9mIG1ldGFkYXRhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgaWYgKHByZXZWYWx1ZSAmJiAhb3ZlcnJpZGVFeGlzdGluZykge1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgIH1cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIG1ldGFrZXksXG4gICAgICAgIHsgLi4ucHJldlZhbHVlLCAuLi5tZXRhZGF0YSB9LFxuICAgICAgICBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGEsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2xhc3NEZWNvcmF0b3I8VCBleHRlbmRzIEFycmF5PGFueT4gPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUID0gW10gYXMgYW55XG4pOiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAodGFyZ2V0KSA9PiB7XG4gICAgY29uc3QgcHJldlZhbHVlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQpIHx8IFtdO1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgWy4uLnByZXZWYWx1ZSwgLi4ubWV0YWRhdGFdLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiAoKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksIHRhcmdldCkgfHwgW107XG5cbiAgICBjb25zdCBrZXkgPSBgOiR7cHJvcGVydHlLZXl9YDtcbiAgICBpZiAoIXByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSxcbiAgICAgICAgWy4uLnByb3BlcnRpZXMsIGA6JHtwcm9wZXJ0eUtleX1gXSxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZ01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoZXhpc3RpbmdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBwaWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpO1xuICAgICAgY29uc3QgbWV0YWRhdGFUb1NhdmUgPSBvdmVycmlkZUV4aXN0aW5nXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YVRvU2F2ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPVxuICAgICAgICAodGFyZ2V0Py5jb25zdHJ1Y3RvciBhcyBhbnkpPy5bTUVUQURBVEFfRkFDVE9SWV9OQU1FIGFzIGFueV0/LigpW1xuICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgIF0/LnR5cGUgPz8gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfSkgYXMgUHJvcGVydHlEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNaXhlZERlY29yYXRvcjxUID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVFxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIGtleT86IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApOiBhbnkgPT4ge1xuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICBsZXQgbWV0YWRhdGFzOiBhbnk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YSkpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCBbXTtcbiAgICAgICAgbWV0YWRhdGFzID0gWy4uLnByZXZpb3VzTWV0YWRhdGEsIC4uLm1ldGFkYXRhXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPVxuICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgZGVzY3JpcHRvci52YWx1ZSkgfHwge307XG4gICAgICAgIG1ldGFkYXRhcyA9IHsgLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGEgfTtcbiAgICAgIH1cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YSkpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwgW107XG4gICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQpIHx8IHt9O1xuICAgICAgbWV0YWRhdGFzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2aW91c01ldGFkYXRhKSwgbWV0YWRhdGEpO1xuICAgIH1cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhcywgdGFyZ2V0KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFyYW1EZWNvcmF0b3I8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBhbnk+KFxuICBtZXRhZGF0YTogVCxcbiAgaW5pdGlhbDogUGFydGlhbDxUPlxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICB0YXJnZXQ6IG9iamVjdCB8IEZ1bmN0aW9uLFxuICAgIGtleT86IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApOiBhbnkgPT4ge1xuICAgIGNvbnN0IHBhcmFtT3B0aW9ucyA9IHtcbiAgICAgIC4uLmluaXRpYWwsXG4gICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgIH07XG5cbiAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgY29uc3QgcGFyYW1ldGVycyA9XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUywgZGVzY3JpcHRvci52YWx1ZSkgfHwgW107XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICBbLi4ucGFyYW1ldGVycywgcGFyYW1PcHRpb25zXSxcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldC5wcm90b3R5cGUpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eUtleSBvZiBwcm9wZXJ0eUtleXMpIHtcbiAgICAgIGlmIChpc0NvbnN0cnVjdG9yKHByb3BlcnR5S2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0aG9kRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgIHRhcmdldC5wcm90b3R5cGUsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuXG4gICAgICBpZiAoIW1ldGhvZERlc2NyaXB0b3IpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQXBpTWV0aG9kID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcbiAgICAgICAgTUVUSE9EX01FVEFEQVRBLFxuICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlzQXBpTWV0aG9kKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICAgKSB8fCBbXTtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgIFsuLi5wYXJhbWV0ZXJzLCBwYXJhbU9wdGlvbnNdLFxuICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVJc0FycmF5VHVwbGUoXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgaW5wdXQ6IEZ1bmN0aW9uIHwgW0Z1bmN0aW9uXSB8IHVuZGVmaW5lZCB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGlzQXJyYXlGbGFnOiBib29sZWFuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbik6IFtGdW5jdGlvbiB8IHVuZGVmaW5lZCwgYm9vbGVhbl0ge1xuICBpZiAoIWlucHV0KSB7XG4gICAgcmV0dXJuIFtpbnB1dCBhcyB1bmRlZmluZWQsIGlzQXJyYXlGbGFnXTtcbiAgfVxuICBpZiAoaXNBcnJheUZsYWcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgcmV0dXJuIFtpbnB1dCBhcyBGdW5jdGlvbiwgaXNBcnJheUZsYWddO1xuICB9XG4gIGNvbnN0IGlzSW5wdXRBcnJheSA9IGlzQXJyYXkoaW5wdXQpO1xuICBjb25zdCB0eXBlID0gaXNJbnB1dEFycmF5ID8gaW5wdXRbMF0gOiBpbnB1dDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICByZXR1cm4gW3R5cGUgYXMgRnVuY3Rpb24sIGlzSW5wdXRBcnJheV07XG59XG4iLCJpbXBvcnQgeyBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBpc1N0cmluZywgbmVnYXRlLCBwaWNrQnkgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRUeXBlSXNBcnJheVR1cGxlLCBNRVRBREFUQV9GQUNUT1JZX05BTUUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEVudW1BbGxvd2VkVHlwZXMsXG4gIEVudW1TY2hlbWFBdHRyaWJ1dGVzLFxuICBTY2hlbWFPYmplY3RNZXRhZGF0YSxcbiAgU3dhZ2dlckVudW1UeXBlLFxufSBmcm9tIFwiLi4vc3dhZ2dlci10eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgaXNVbmRlZmluZWQgPSAob2JqOiBhbnkpOiBvYmogaXMgdW5kZWZpbmVkID0+XG4gIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtVmFsdWVzKFxuICBlbnVtVHlwZTogU3dhZ2dlckVudW1UeXBlIHwgKCgpID0+IFN3YWdnZXJFbnVtVHlwZSlcbik6IHN0cmluZ1tdIHwgbnVtYmVyW10ge1xuICBpZiAodHlwZW9mIGVudW1UeXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZ2V0RW51bVZhbHVlcyhlbnVtVHlwZSgpKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGVudW1UeXBlKSkge1xuICAgIHJldHVybiBlbnVtVHlwZSBhcyBzdHJpbmdbXTtcbiAgfVxuICBpZiAodHlwZW9mIGVudW1UeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8vIEVudW1zIHdpdGggbnVtZXJpYyB2YWx1ZXNcbiAgLy8gICBlbnVtIFNpemUge1xuICAvLyAgICAgU01BTEwgPSAxLFxuICAvLyAgICAgQklHID0gMlxuICAvLyAgIH1cbiAgLy8gYXJlIHRyYW5zcGlsZWQgdG8gaW5jbHVkZSBhIHJldmVyc2UgbWFwcGluZ1xuICAvLyAgIGNvbnN0IFNpemUgPSB7XG4gIC8vICAgICBcIjFcIjogXCJTTUFMTFwiLFxuICAvLyAgICAgXCIyXCI6IFwiQklHXCIsXG4gIC8vICAgICBcIlNNQUxMXCI6IDEsXG4gIC8vICAgICBcIkJJR1wiOiAyLFxuICAvLyAgIH1cbiAgY29uc3QgbnVtZXJpY1ZhbHVlcyA9IE9iamVjdC52YWx1ZXMoZW51bVR5cGUpXG4gICAgLmZpbHRlcigodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAubWFwKCh2YWx1ZTogYW55KSA9PiB2YWx1ZS50b1N0cmluZygpKTtcblxuICByZXR1cm4gT2JqZWN0LmtleXMoZW51bVR5cGUpXG4gICAgLmZpbHRlcigoa2V5KSA9PiAhbnVtZXJpY1ZhbHVlcy5pbmNsdWRlcyhrZXkpKVxuICAgIC5tYXAoKGtleSkgPT4gZW51bVR5cGVba2V5IGFzIGFueV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW51bVR5cGUodmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIge1xuICBjb25zdCBoYXNTdHJpbmcgPSB2YWx1ZXMuZmlsdGVyKGlzU3RyaW5nKS5sZW5ndGggPiAwO1xuICByZXR1cm4gaGFzU3RyaW5nID8gXCJzdHJpbmdcIiA6IFwibnVtYmVyXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiAoKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksIHRhcmdldCkgfHwgW107XG5cbiAgICBjb25zdCBrZXkgPSBgOiR7cHJvcGVydHlLZXl9YDtcbiAgICBpZiAoIXByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSxcbiAgICAgICAgWy4uLnByb3BlcnRpZXMsIGA6JHtwcm9wZXJ0eUtleX1gXSxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZ01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoZXhpc3RpbmdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBwaWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpO1xuICAgICAgY29uc3QgbWV0YWRhdGFUb1NhdmUgPSBvdmVycmlkZUV4aXN0aW5nXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YVRvU2F2ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5lc3QganMgY29kZVxuICAgICAgICB0YXJnZXQ/LmNvbnN0cnVjdG9yPy5bTUVUQURBVEFfRkFDVE9SWV9OQU1FXT8uKClbcHJvcGVydHlLZXldPy50eXBlID8/XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgbWV0YWtleSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLCAvLyBEZWZhdWx0IHRvIG9wdGlvbmFsIHVubGVzcyBAcmVxdWlyZWQoKSBpcyB1c2VkXG4gICAgICAgICAgLi4ucGlja0J5KG1ldGFkYXRhLCBuZWdhdGUoaXNVbmRlZmluZWQpKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgKTtcbiAgICB9XG4gIH0pIGFzIFByb3BlcnR5RGVjb3JhdG9yO1xufVxuXG5leHBvcnQgdHlwZSBBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnMgPSBTY2hlbWFPYmplY3RNZXRhZGF0YSAmIHtcbiAgXCJ4LWVudW1OYW1lc1wiPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBMYXp5IGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdHlwZSBmb3Igd2hpY2ggdGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICAgKiBjYW4gYmUgdXNlZCBhcyBhbiBpZFxuICAgKlxuICAgKiBVc2UgdG9nZXRoZXIgd2l0aCBAQXBpRGVmYXVsdEdldHRlciBvbiB0aGUgZ2V0dGVyIHJvdXRlIG9mIHRoZSB0eXBlXG4gICAqIHRvIGdlbmVyYXRlIE9wZW5BUEkgbGluayBvYmplY3RzXG4gICAqXG4gICAqIEBzZWUgW1N3YWdnZXIgbGluayBvYmplY3RzXShodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL2xpbmtzLylcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgbGluaz86ICgpID0+IFR5cGU8dW5rbm93bj4gfCBGdW5jdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIEFwaVByb3BlcnR5T3B0aW9ucyA9XG4gIHwgQXBpUHJvcGVydHlDb21tb25PcHRpb25zXG4gIHwgKEFwaVByb3BlcnR5Q29tbW9uT3B0aW9ucyAmIHtcbiAgICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgICBlbnVtU2NoZW1hPzogRW51bVNjaGVtYUF0dHJpYnV0ZXM7XG4gICAgfSk7XG5cbmNvbnN0IGlzRW51bUFycmF5ID0gKFxuICBvcHRzOiBBcGlQcm9wZXJ0eU9wdGlvbnNcbik6IG9wdHMgaXMge1xuICBpc0FycmF5OiB0cnVlO1xuICBlbnVtOiBFbnVtQWxsb3dlZFR5cGVzO1xuICB0eXBlOiBhbnk7XG4gIGl0ZW1zOiBhbnk7XG59ID0+IChvcHRzLmlzQXJyYXkgJiYgXCJlbnVtXCIgaW4gb3B0cyAmJiBvcHRzLmVudW0gIT09IHVuZGVmaW5lZCkgYXMgYm9vbGVhbjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlQcm9wZXJ0eShcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge31cbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGNyZWF0ZUFwaVByb3BlcnR5RGVjb3JhdG9yKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3IoXG4gIG9wdGlvbnM6IEFwaVByb3BlcnR5T3B0aW9ucyA9IHt9LFxuICBvdmVycmlkZUV4aXN0aW5nID0gdHJ1ZVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICBjb25zdCBbdHlwZSwgaXNBcnJheV0gPSBnZXRUeXBlSXNBcnJheVR1cGxlKFxuICAgIG9wdGlvbnMudHlwZSxcbiAgICBvcHRpb25zLmlzQXJyYXkgYXMgYW55XG4gICk7XG4gIG9wdGlvbnMgPSB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICB0eXBlLFxuICAgIGlzQXJyYXksXG4gIH0gYXMgQXBpUHJvcGVydHlPcHRpb25zO1xuXG4gIGlmIChpc0VudW1BcnJheShvcHRpb25zKSkge1xuICAgIG9wdGlvbnMudHlwZSA9IFwiYXJyYXlcIjtcblxuICAgIGNvbnN0IGVudW1WYWx1ZXMgPSBnZXRFbnVtVmFsdWVzKG9wdGlvbnMuZW51bSk7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IGdldEVudW1UeXBlKGVudW1WYWx1ZXMpLFxuICAgICAgZW51bTogZW51bVZhbHVlcyxcbiAgICB9O1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVzdCBqcyBjb2RlXG4gICAgZGVsZXRlIG9wdGlvbnMuZW51bTtcbiAgfSBlbHNlIGlmIChcImVudW1cIiBpbiBvcHRpb25zICYmIG9wdGlvbnMuZW51bSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcblxuICAgIG9wdGlvbnMuZW51bSA9IGVudW1WYWx1ZXM7XG4gICAgb3B0aW9ucy50eXBlID0gZ2V0RW51bVR5cGUoZW51bVZhbHVlcyk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnR5cGUpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuICAgIG9wdGlvbnMuaXRlbXMgPSB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBpdGVtczoge1xuICAgICAgICB0eXBlOiBvcHRpb25zLnR5cGVbMF0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IoXG4gICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFUyxcbiAgICBvcHRpb25zLFxuICAgIG92ZXJyaWRlRXhpc3RpbmdcbiAgKTtcbn1cbiIsImltcG9ydCB7IGFwcGx5LCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQXBpRXhjbHVkZUVuZHBvaW50IH0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBPcGVyYXRpb25LZXlzLFxuICBDcnVkT3BlcmF0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRGVsZXRlLCBHZXQsIFBhdGNoLCBQb3N0LCBQdXQgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcblxuaW1wb3J0IHsgaXNPcGVyYXRpb25CbG9ja2VkIGFzIGNvcmVJc09wZXJhdGlvbkJsb2NrZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFByZXBhcmVkU3RhdGVtZW50S2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIENSVUQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgZm9yIGEgc3BlY2lmaWMgbW9kZWwgY29uc3RydWN0b3IuXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG9wZXJhdGlvbi1ibG9ja2luZyBoYW5kbGVyIG1ldGFkYXRhIHN0b3JlZCBvbiB0aGUgcHJvdmlkZWQgbW9kZWwgY29uc3RydWN0b3IgKHVuZGVyIGBPcGVyYXRpb25LZXlzLlJFRkxFQ1QgKyBPcGVyYXRpb25LZXlzLkJMT0NLYCksIGV4ZWN1dGVzIGl0IChpZiBwcmVzZW50KSB3aXRoIGl0cyBwZXJzaXN0ZWQgYXJndW1lbnRzIHBsdXMgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24sIGFuZCByZXR1cm5zIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBibG9ja2VkLiBJZiBubyBoYW5kbGVyIGV4aXN0cywgdGhlIG9wZXJhdGlvbiBpcyBjb25zaWRlcmVkIGFsbG93ZWQgKHJldHVybnMgYGZhbHNlYCkuXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3I8YW55Pn0gTW9kZWxDb25zdHJ1Y3RvciAtIFRoZSB0YXJnZXQgbW9kZWwgY29uc3RydWN0b3Igd2hvc2UgbWV0YWRhdGEgbWF5IGluY2x1ZGUgYSBibG9ja2luZyBoYW5kbGVyLlxuICogQHBhcmFtIHtDcnVkT3BlcmF0aW9uc30gb3AgLSBUaGUgQ1JVRCBvcGVyYXRpb24gdG8gZXZhbHVhdGUgKGUuZy4sIGBPcGVyYXRpb25LZXlzLkNSRUFURWAsIGBPcGVyYXRpb25LZXlzLlJFQURgLCBgT3BlcmF0aW9uS2V5cy5VUERBVEVgLCBgT3BlcmF0aW9uS2V5cy5ERUxFVEVgKS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCB3aGVuIHRoZSBvcGVyYXRpb24gaXMgZXhwbGljaXRseSBibG9ja2VkIGJ5IHRoZSBtb2RlbCdzIGhhbmRsZXI7IG90aGVyd2lzZSBgZmFsc2VgLlxuICogQGZ1bmN0aW9uIGlzT3BlcmF0aW9uQmxvY2tlZFxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25kaXRpb25hbGx5IGFwcGxpZXMgYW4gSFRUUCBtZXRob2QgZGVjb3JhdG9yIGZvciBhIGdpdmVuIG1vZGVsIGFuZCB2ZXJiLCBoaWRpbmcgdGhlIGVuZHBvaW50IGluIFN3YWdnZXIgKGFuZCBub3QgcmVnaXN0ZXJpbmcgdGhlIHJvdXRlKSB3aGVuIHRoZSBtb2RlbCBibG9ja3MgdGhhdCBDUlVEIG9wZXJhdGlvbi5cbiAqIEBzdW1tYXJ5IE1hcHMgYW4gSFRUUCB2ZXJiIHRvIGl0cyBjb3JyZXNwb25kaW5nIGBDcnVkT3BlcmF0aW9uc2Aga2V5IGFuZCBOZXN0IEhUVFAgZGVjb3JhdG9yIChgQEdldGAsIGBAUG9zdGAsIGV0Yy4pLiBJdCBjaGVja3MgYGlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCBjcnVkT3ApYCBhbmQsIGlmIGJsb2NrZWQsIGFwcGxpZXMgb25seSBgQEFwaUV4Y2x1ZGVFbmRwb2ludCgpYCAoU3dhZ2dlci1oaWRkZW4sIG5vIE5lc3Qgcm91dGUpLiBJZiBwZXJtaXR0ZWQsIGl0IGFwcGxpZXMgdGhlIGFwcHJvcHJpYXRlIEhUVFAgZGVjb3JhdG9yIHdpdGggdGhlIG9wdGlvbmFsIGBwYXRoYC5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHVzZWQgdG8gcmVzb2x2ZSBvcGVyYXRpb24tYmxvY2tpbmcgcnVsZXMuXG4gKiBAcGFyYW0ge0h0dHBWZXJic30gdmVyYiAtIFRoZSBIVFRQIHZlcmIgdG8gbWFwIChlLmcuLCBgXCJHRVRcIiB8IFwiUE9TVFwiIHwgXCJQVVRcIiB8IFwiUEFUQ0hcIiB8IFwiREVMRVRFXCJgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCByb3V0ZSBwYXRoIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5lc3QgSFRUUCBtZXRob2QgZGVjb3JhdG9yLlxuICogQHJldHVybiB7TWV0aG9kRGVjb3JhdG9yfSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCBlaXRoZXIgZXhjbHVkZXMgdGhlIGVuZHBvaW50IGZyb20gU3dhZ2dlciAoYW5kIHJvdXRlIHJlZ2lzdHJhdGlvbikgb3IgYXBwbGllcyB0aGUgY29ycmVjdCBIVFRQIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChcbiAgTW9kZWxDb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICB2ZXJiOiBIdHRwVmVyYnMsXG4gIHBhdGg/OiBzdHJpbmdcbik6IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxcbiAgICBIdHRwVmVyYnMsXG4gICAgW0NydWRPcGVyYXRpb25zLCAocGF0aD86IHN0cmluZykgPT4gTWV0aG9kRGVjb3JhdG9yXVxuICA+ID0ge1xuICAgIEdFVDogW09wZXJhdGlvbktleXMuUkVBRCwgR2V0XSxcbiAgICBQT1NUOiBbT3BlcmF0aW9uS2V5cy5DUkVBVEUsIFBvc3RdLFxuICAgIFBVVDogW09wZXJhdGlvbktleXMuVVBEQVRFLCBQdXRdLFxuICAgIFBBVENIOiBbT3BlcmF0aW9uS2V5cy5VUERBVEUsIFBhdGNoXSxcbiAgICBERUxFVEU6IFtPcGVyYXRpb25LZXlzLkRFTEVURSwgRGVsZXRlXSxcbiAgfTtcblxuICBjb25zdCBbY3J1ZE9wLCBIdHRwTWV0aG9kRGVjb3JhdG9yXSA9IGh0dHBUb0NydWRbdmVyYl07XG4gIGNvbnN0IHRhcmdldCA9IHJlc29sdmVCbG9ja1RhcmdldCh2ZXJiLCBwYXRoKTtcbiAgcmV0dXJuIHRhcmdldFxuICAgID8gY29yZUlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCB0YXJnZXQua2luZCBhcyBhbnksIHRhcmdldC52YWx1ZSlcbiAgICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgICA6IGFwcGx5KEh0dHBNZXRob2REZWNvcmF0b3IocGF0aCkpXG4gICAgOiBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClcbiAgICA/IGFwcGx5KEFwaUV4Y2x1ZGVFbmRwb2ludCgpKVxuICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25kaXRpb25hbGx5IGFwcGxpZXMgYW4gSFRUUCBtZXRob2QgZGVjb3JhdG9yIGZvciBhIGdpdmVuIG1vZGVsIGFuZCB2ZXJiLCBoaWRpbmcgdGhlIGVuZHBvaW50IGluIFN3YWdnZXIgKGFuZCBub3QgcmVnaXN0ZXJpbmcgdGhlIHJvdXRlKSB3aGVuIHRoZSBtb2RlbCBibG9ja3MgdGhhdCBDUlVEIG9wZXJhdGlvbi5cbiAqIEBzdW1tYXJ5IE1hcHMgYW4gSFRUUCB2ZXJiIHRvIGl0cyBjb3JyZXNwb25kaW5nIGBDcnVkT3BlcmF0aW9uc2Aga2V5IGFuZCBOZXN0IEhUVFAgZGVjb3JhdG9yIChgQEdldGAsIGBAUG9zdGAsIGV0Yy4pLiBJdCBjaGVja3MgYGlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCBjcnVkT3ApYCBhbmQsIGlmIGJsb2NrZWQsIGFwcGxpZXMgb25seSBgQEFwaUV4Y2x1ZGVFbmRwb2ludCgpYCAoU3dhZ2dlci1oaWRkZW4sIG5vIE5lc3Qgcm91dGUpLiBJZiBwZXJtaXR0ZWQsIGl0IGFwcGxpZXMgdGhlIGFwcHJvcHJpYXRlIEhUVFAgZGVjb3JhdG9yIHdpdGggdGhlIG9wdGlvbmFsIGBwYXRoYC5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHVzZWQgdG8gcmVzb2x2ZSBvcGVyYXRpb24tYmxvY2tpbmcgcnVsZXMuXG4gKiBAcGFyYW0ge0h0dHBWZXJic30gdmVyYiAtIFRoZSBIVFRQIHZlcmIgdG8gbWFwIChlLmcuLCBgXCJHRVRcIiB8IFwiUE9TVFwiIHwgXCJQVVRcIiB8IFwiUEFUQ0hcIiB8IFwiREVMRVRFXCJgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCByb3V0ZSBwYXRoIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5lc3QgSFRUUCBtZXRob2QgZGVjb3JhdG9yLlxuICogQHJldHVybiB7TWV0aG9kRGVjb3JhdG9yfSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCBlaXRoZXIgZXhjbHVkZXMgdGhlIGVuZHBvaW50IGZyb20gU3dhZ2dlciAoYW5kIHJvdXRlIHJlZ2lzdHJhdGlvbikgb3IgYXBwbGllcyB0aGUgY29ycmVjdCBIVFRQIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ1bGtBcGlPcGVyYXRpb25Gcm9tTW9kZWwoXG4gIE1vZGVsQ29uc3RydWN0b3I6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgdmVyYjogSHR0cFZlcmJzLFxuICBwYXRoPzogc3RyaW5nXG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICBjb25zdCBodHRwVG9DcnVkOiBSZWNvcmQ8XG4gICAgSHR0cFZlcmJzLFxuICAgIFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3JdXG4gID4gPSB7XG4gICAgR0VUOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLCBHZXRdLFxuICAgIFBPU1Q6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCwgUG9zdF0sXG4gICAgUFVUOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsIFB1dF0sXG4gICAgUEFUQ0g6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgUGF0Y2hdLFxuICAgIERFTEVURTogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLCBEZWxldGVdLFxuICB9O1xuXG4gIGNvbnN0IFtjcnVkT3AsIEh0dHBNZXRob2REZWNvcmF0b3JdID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcbiAgY29uc3QgdGFyZ2V0ID0gcGF0aCA/IHJlc29sdmVCbG9ja1RhcmdldCh2ZXJiLCBwYXRoKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRhcmdldFxuICAgID8gY29yZUlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCB0YXJnZXQua2luZCBhcyBhbnksIHRhcmdldC52YWx1ZSlcbiAgICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgICA6IGFwcGx5KEh0dHBNZXRob2REZWNvcmF0b3IocGF0aCkpXG4gICAgOiBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIFwiYnVsa1wiIGFzIGFueSwgY3J1ZE9wIGFzIGFueSlcbiAgICA/IGFwcGx5KEFwaUV4Y2x1ZGVFbmRwb2ludCgpKVxuICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSk7XG59XG5mdW5jdGlvbiByZXNvbHZlQmxvY2tUYXJnZXQoXG4gIHZlcmI6IEh0dHBWZXJicyxcbiAgcGF0aD86IHN0cmluZ1xuKTogeyBraW5kOiBcImNydWRcIiB8IFwic3RhdGVtZW50XCIgfCBcInF1ZXJ5XCIgfCBcImJ1bGtcIjsgdmFsdWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpO1xuICBjb25zdCBzdGF0ZW1lbnRUYXJnZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwibGlzdEJ5LzprZXlcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksXG4gICAgXCJwYWdpbmF0ZUJ5LzprZXkvOnBhZ2VcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksXG4gICAgXCJmaW5kLzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCxcbiAgICBcInBhZ2UvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLFxuICAgIFwiZmluZE9uZUJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWSxcbiAgICBcImZpbmRCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWSxcbiAgICBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCI6IFwic3RhdGVtZW50XCIsXG4gICAgXCJjb3VudE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YsXG4gICAgXCJtYXhPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRixcbiAgICBcIm1pbk9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLFxuICAgIFwiYXZnT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsXG4gICAgXCJzdW1PZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRixcbiAgICBcImRpc3RpbmN0T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRixcbiAgICBcImdyb3VwT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRixcbiAgfTtcblxuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgcmV0dXJuIHsga2luZDogXCJxdWVyeVwiLCB2YWx1ZTogbm9ybWFsaXplZC5yZXBsYWNlKC9ecXVlcnlcXC8vLCBcIlwiKSB9O1xuICB9XG5cbiAgY29uc3Qgc3RhdGVtZW50VmFsdWUgPSBzdGF0ZW1lbnRUYXJnZXRzW25vcm1hbGl6ZWRdO1xuICBpZiAoc3RhdGVtZW50VmFsdWUpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInN0YXRlbWVudFwiLCB2YWx1ZTogc3RhdGVtZW50VmFsdWUgfTtcbiAgfVxuXG4gIGlmICh2ZXJiID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWQgPT09IFwiXCIpIHtcbiAgICByZXR1cm4geyBraW5kOiBcImNydWRcIiwgdmFsdWU6IE9wZXJhdGlvbktleXMuUkVBRCB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB7IGFwcGx5RGVjb3JhdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXBpUGFyYW0gYXMgQXBpUGFyYW1EZWMgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IERlY2FmQXBpUHJvcGVydHkgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgc2V0IG9mIFN3YWdnZXIgYEBBcGlQYXJhbWAgZGVjb3JhdG9ycyBnZW5lcmF0ZWQgZnJvbSBhIHR5cGVkIHNwZWNpZmljYXRpb24gYXJyYXkuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIGVhY2ggZW50cnkgb2YgdGhlIHByb3ZpZGVkIGBBcGlQYXJhbVtdYCBpbnRvIGEgY29ycmVzcG9uZGluZyBgQEFwaVBhcmFtKClgIGRlY29yYXRvciAoZGVmYXVsdGluZyBgZGVzY3JpcHRpb25gLCBgcmVxdWlyZWRgLCBhbmQgYHR5cGVgIHdoZW4gb21pdHRlZCkgYW5kIGNvbXBvc2VzIHRoZW0gaW50byBhIHNpbmdsZSBkZWNvcmF0b3IgdmlhIE5lc3QncyBgYXBwbHlEZWNvcmF0b3JzYC4gVXNlZnVsIGZvciBzeW5jaHJvbml6aW5nIHJ1bnRpbWUgcm91dGUgcGFyYW1zIHdpdGggT3BlbkFQSSBkb2N1bWVudGF0aW9uIGluIGEgY29uY2lzZSwgZGVjbGFyYXRpdmUgd2F5LlxuICogQHBhcmFtIHtBcGlQYXJhbVtdfSBbcHJvcHM9W11dIEFycmF5IGRlc2NyaWJpbmcgcGF0aCBwYXJhbWV0ZXJzIHRvIGJlIGRvY3VtZW50ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcHNbXS5uYW1lIFRoZSBwYXJhbWV0ZXIncyBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIHJvdXRlIHRlbXBsYXRlIChlLmcuLCBgOmlkYCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BzW10uZGVzY3JpcHRpb25dIEh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXI7IGRlZmF1bHRzIHRvIGBcIlBhdGggcGFyYW1ldGVyOiA8bmFtZT5cImAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wc1tdLnJlcXVpcmVkPXRydWVdIFdoZXRoZXIgdGhlIHBhcmFtZXRlciBpcyByZXF1aXJlZDsgZGVmYXVsdHMgdG8gYHRydWVgLlxuICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBbcHJvcHNbXS50eXBlPVN0cmluZ10gQ29uc3RydWN0b3IvdHlwZSB1c2VkIGJ5IFN3YWdnZXIgdG8gaW5mZXIgc2NoZW1hIChlLmcuLCBgU3RyaW5nYCwgYE51bWJlcmAsIGBVVUlEYCwgY3VzdG9tIGNsYXNzKS5cbiAqIEByZXR1cm4ge2FueX0gQSBjb21wb3NlZCBkZWNvcmF0b3IgYXBwbHlpbmcgYWxsIGdlbmVyYXRlZCBgQEFwaVBhcmFtYCBkZWNvcmF0b3JzIHRvIHRoZSB0YXJnZXQgbWV0aG9kIG9yIGNvbnRyb2xsZXIuXG4gKiBAZnVuY3Rpb24gQXBpUGFyYW1zRnJvbU1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlQYXJhbXNGcm9tTW9kZWwoXG4gIHByb3BzOiBEZWNhZkFwaVByb3BlcnR5W10gPSBbXVxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICBjb25zdCBkZWNvcmF0b3JzID0gcHJvcHMubWFwKChwKSA9PlxuICAgIEFwaVBhcmFtRGVjKHtcbiAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwLmRlc2NyaXB0aW9uID8/IGBQYXRoIHBhcmFtZXRlcjogJHtwLm5hbWV9YCxcbiAgICAgIHJlcXVpcmVkOiBwLnJlcXVpcmVkID8/IHRydWUsXG4gICAgICAvLyBzY2hlbWE6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgIHR5cGU6IHAudHlwZSA/PyBTdHJpbmcsXG4gICAgfSlcbiAgKTtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyguLi5kZWNvcmF0b3JzKTtcbn1cbiIsImltcG9ydCB7XG4gIGNyZWF0ZVBhcmFtRGVjb3JhdG9yLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VzdG9tIGRlY29yYXRvciB0aGF0IGV4dHJhY3RzIHRoZSByZXF1ZXN0IGJvZHkgYW5kIGluc3RhbnRpYXRlcyBpdCB1c2luZyB0aGUgTW9kZWwgY29uc3RydWN0b3JcbiAqIGZvdW5kIG9uIHRoZSBjb250cm9sbGVyLiBIYW5kbGVzIGJvdGggc2luZ2xlIG9iamVjdHMgYW5kIGFycmF5cy5cbiAqL1xuZXhwb3J0IGNvbnN0IERlY2FmQm9keSA9IGNyZWF0ZVBhcmFtRGVjb3JhdG9yKFxuICAoZGF0YTogdW5rbm93biwgY3R4OiBFeGVjdXRpb25Db250ZXh0KSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgYm9keSA9IHJlcXVlc3QuYm9keTtcblxuICAgIC8vIFRoZSBEeW5hbWljTW9kZWxDb250cm9sbGVyIHdpbGwgaGF2ZSAnTW9kZWxDb25zdHInIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBjdHguZ2V0Q2xhc3MoKTtcbiAgICAvLyBXZSBhY2Nlc3MgdGhlIHN0YXRpYyBwcm9wZXJ0eSB3ZSB3aWxsIGFkZCB0byB0aGUgRHluYW1pY01vZGVsQ29udHJvbGxlclxuICAgIGNvbnN0IE1vZGVsQ29uc3RyID0gKGNvbnRyb2xsZXIgYXMgYW55KS5jbGFzcztcblxuICAgIGlmICghTW9kZWxDb25zdHIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKFxuICAgICAgICBgTW9kZWxDb25zdHJ1Y3RvciBub3QgZm91bmQgb24gY29udHJvbGxlciAke2NvbnRyb2xsZXIubmFtZX0uIEVuc3VyZSB0aGUgY29udHJvbGxlciB3YXMgY3JlYXRlZCB2aWEgRnJvbU1vZGVsQ29udHJvbGxlci5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghYm9keSkgcmV0dXJuIGJvZHk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShib2R5KSkge1xuICAgICAgcmV0dXJuIGJvZHkubWFwKChpdGVtKSA9PiBuZXcgTW9kZWxDb25zdHIoaXRlbSkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTW9kZWxDb25zdHIoYm9keSk7XG4gIH1cbik7XG4iLCJpbXBvcnQgeyBjcmVhdGVQYXJhbURlY29yYXRvciwgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZQYXJhbVByb3BzLCBEZWNhZkFwaVByb3BlcnR5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjdXN0b20gTmVzdEpTIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBleHRyYWN0cyBhbmQgcmV0dXJucyByb3V0ZSBwYXJhbWV0ZXJzIG9yZGVyZWQgYnkgYSBzcGVjaWZpYyBrZXkgc2VxdWVuY2UuXG4gKiBAc3VtbWFyeSBUaGUgYE9yZGVyZWRQYXJhbXNgIGRlY29yYXRvciByZWFkcyB0aGUgaW5jb21pbmcgSFRUUCByZXF1ZXN0J3MgYHBhcmFtc2Agb2JqZWN0LCBvcHRpb25hbGx5IG9yZGVycyBpdCBhY2NvcmRpbmcgdG8gYSBwcm92aWRlZCBsaXN0IG9mIHBhcmFtZXRlciBuYW1lcywgYW5kIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIHBhcmFtcywgdGhlIG9yZGVyZWQgdmFsdWVzLCBhbmQgdGhlIGFwcGxpZWQgb3JkZXIgbGlzdC4gVGhpcyBlbnN1cmVzIGRldGVybWluaXN0aWMgcGFyYW1ldGVyIGFjY2VzcyBmb3Igcm91dGVzIHdpdGggbXVsdGlwbGUgcGF0aCBwYXJhbWV0ZXJzLlxuICogQHRlbXBsYXRlIHtzdHJpbmdbXX0gVE9yZGVyIC0gUmVwcmVzZW50cyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2Ugb2YgcGFyYW1ldGVyIG5hbWVzLlxuICogQHBhcmFtIHtUT3JkZXIgfCB1bmRlZmluZWR9IG9yZGVyIEFuIG9wdGlvbmFsIGFycmF5IHNwZWNpZnlpbmcgdGhlIHBhcmFtZXRlciBuYW1lcycgZGVzaXJlZCBvcmRlci4gSWYgbm90IHByb3ZpZGVkLCB0aGUgZGVjb3JhdG9yIHdpbGwgcHJlc2VydmUgdGhlIG9yZGVyIG9mIHRoZSBrZXlzIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBvcmlnaW5hbCBgcmVxLnBhcmFtc2Agb2JqZWN0LlxuICogQHBhcmFtIHtFeGVjdXRpb25Db250ZXh0fSBjdHggVGhlIE5lc3RKUyBleGVjdXRpb24gY29udGV4dCwgdXNlZCB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBIVFRQIHJlcXVlc3Qgb2JqZWN0LlxuICogQHJldHVybiB7RGVjYWZQYXJhbVByb3BzfSBBbiBvYmplY3QgY29udGFpbmluZzpcbiAqIC0gYG9yaWdpbmFsYDogdGhlIHJhdyBwYXJhbWV0ZXIgbWFwIGZyb20gYHJlcS5wYXJhbXNgO1xuICogLSBgb3JkZXJlZGA6IGFuIGFycmF5IG9mIHBhcmFtZXRlciB2YWx1ZXMgaW4gdGhlIHJlcXVlc3RlZCBvcmRlcjtcbiAqIC0gYG9yZGVyYDogdGhlIGVmZmVjdGl2ZSBvcmRlciBsaXN0IHVzZWQuXG4gKiBAZnVuY3Rpb24gT3JkZXJlZFBhcmFtc1xuICovXG5jb25zdCBPcmRlcmVkUGFyYW1zID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChvcmRlcjogc3RyaW5nW10gfCB1bmRlZmluZWQsIGN0eDogRXhlY3V0aW9uQ29udGV4dCk6IERlY2FmUGFyYW1Qcm9wcyA9PiB7XG4gICAgY29uc3QgcmVxID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCBvcmlnaW5hbCA9IChyZXE/LnBhcmFtcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCBvcmRlckxpc3QgPSBvcmRlciA/PyBPYmplY3Qua2V5cyhvcmlnaW5hbCk7XG4gICAgY29uc3Qgb3JkZXJlZCA9IG9yZGVyTGlzdC5tYXAoKGspID0+IG9yaWdpbmFsW2tdKTtcbiAgICByZXR1cm4geyByYXc6IG9yaWdpbmFsLCB2YWx1ZXNJbk9yZGVyOiBvcmRlcmVkLCBrZXlzSW5PcmRlcjogb3JkZXJMaXN0IH07XG4gIH1cbik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgaGlnaGVyLWxldmVsIGRlY29yYXRvciBmYWN0b3J5IHRoYXQgbGV2ZXJhZ2VzIGBPcmRlcmVkUGFyYW1zYCB0byBleHRyYWN0IHJvdXRlIHBhcmFtZXRlcnMgaW4gYSBzcGVjaWZpYyBvcmRlciBkZXJpdmVkIGZyb20gYSBsaXN0IG9mIGBBcGlQYXJhbWAgZGVmaW5pdGlvbnMuXG4gKiBAc3VtbWFyeSBgRGVjYWZQYXJhbXNgIGNvbXB1dGVzIHRoZSBvcmRlciBvZiByb3V0ZSBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBgQXBpUGFyYW1bXWAgc3BlY2lmaWNhdGlvbiAodXNpbmcgZWFjaCBlbGVtZW504oCZcyBgbmFtZWApLCB0aGVuIGFwcGxpZXMgYE9yZGVyZWRQYXJhbXMob3JkZXIpYCBhcyBhIHBhcmFtZXRlciBkZWNvcmF0b3IuIFRoaXMgZW5hYmxlcyBwYXJhbWV0ZXItbGV2ZWwgYmluZGluZyB0aGF0IHJlbWFpbnMgY29uc2lzdGVudCB3aXRoIHRoZSBkb2N1bWVudGVkIEFQSSBwYXJhbWV0ZXIgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge0FwaVBhcmFtW119IFtwcm9wcz1bXV0gQXJyYXkgb2YgYEFwaVBhcmFtYCBkZWZpbml0aW9ucyB3aG9zZSBgbmFtZWAgZmllbGRzIGRldGVybWluZSB0aGUgcGFyYW1ldGVyIGV4dHJhY3Rpb24gb3JkZXIuXG4gKiBAcmV0dXJuIHtQYXJhbWV0ZXJEZWNvcmF0b3J9IEEgTmVzdEpTIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGFuIG9yZGVyZWQgbGlzdCBvZiBwYXJhbWV0ZXJzIGFuZCBtZXRhZGF0YSBpbnRvIHRoZSBjb250cm9sbGVyIG1ldGhvZCBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERlY2FmUGFyYW1zKFxuICBwcm9wczogRGVjYWZBcGlQcm9wZXJ0eVtdID0gW11cbik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gIGNvbnN0IG9yZGVyID0gcHJvcHMubWFwKChwKSA9PiBwLm5hbWUpO1xuICByZXR1cm4gT3JkZXJlZFBhcmFtcyhvcmRlcik7XG59XG5cbmV4cG9ydCBjb25zdCBEZWNhZlF1ZXJ5ID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChfOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gcmVxLnF1ZXJ5ID8/IHt9O1xuXG4gICAgY29uc3QgcGFyc2VkOiBhbnkgPSB7IC4uLnF1ZXJ5IH07XG5cbiAgICAvLyBQYXJzZSBsaW1pdCAmIG9mZnNldFxuICAgIGlmIChwYXJzZWQubGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQubGltaXQpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIHBhcnNlZC5saW1pdCA9IG47XG4gICAgfVxuXG4gICAgaWYgKHBhcnNlZC5vZmZzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQub2Zmc2V0KTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKG4pKSBwYXJzZWQub2Zmc2V0ID0gbjtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBib29rbWFyayBvbmx5IGlmIG51bWVyaWNcbiAgICBpZiAocGFyc2VkLmJvb2ttYXJrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG4gPSBOdW1iZXIocGFyc2VkLmJvb2ttYXJrKTtcbiAgICAgIHBhcnNlZC5ib29rbWFyayA9IE51bWJlci5pc05hTihuKSA/IHBhcnNlZC5ib29rbWFyayA6IG47XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuKTtcbiIsImltcG9ydCB7IEFkYXB0ZXJGbGFncywgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9NT0RVTEVfT1BUSU9OUyA9IFwiRGVjYWZNb2R1bGVPcHRpb25zXCI7XG5leHBvcnQgY29uc3QgREVDQUZfQURBUFRFUl9JRCA9IFwiRGVjYWZBZGFwdGVyXCI7XG5leHBvcnQgY29uc3QgREVDQUZfVEFTS19TRVJWSUNFX0lEID0gXCJEZWNhZlRhc2tTZXJ2aWNlXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9ST1VURSA9IFwiRGVjYWZSb3V0ZVwiO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0hBTkRMRVJTID0gU3ltYm9sKFwiRGVjYWZIYW5kbGVyc1wiKTtcbmV4cG9ydCBjb25zdCBERUNBRl9FWFBPU0UgPSBcIkRlY2FmRXhwb3NlXCI7XG5leHBvcnQgY29uc3QgREVDQUZfQ09OVFJPTExFUl9DT05GSUcgPSBcIkRlY2FmQ29udHJvbGxlckNvbmZpZ1wiO1xuXG5leHBvcnQgY29uc3QgREVDQUZfQ09OVEVYVF9LRVkgPSBTeW1ib2woXCJkZWNhZjpjb250ZXh0XCIpO1xuXG5leHBvcnQgdHlwZSBEZWNhZlNlcnZlckZsYWdzPExPRyBleHRlbmRzIExvZ2dlciA9IExvZ2dlcj4gPVxuICBBZGFwdGVyRmxhZ3M8TE9HPiAmIHtcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG92ZXJyaWRlczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGVjYWZTZXJ2ZXJDdHggPSBDb250ZXh0PERlY2FmU2VydmVyRmxhZ3M+O1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuaW1wb3J0IHsgREVDQUZfRVhQT1NFIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3NlKC4uLmZsYXZvdXJzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gZnVuY3Rpb24gZXhwb3NlKHRhcmdldDogYW55KSB7XG4gICAgTWV0YWRhdGEuc2V0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgREVDQUZfRVhQT1NFLFxuICAgICAgKGZsYXZvdXJzLmxlbmd0aCA/IGZsYXZvdXJzIDogdHJ1ZSkgYXMgYW55XG4gICAgKTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmltcG9ydCB7IERFQ0FGX0NPTlRST0xMRVJfQ09ORklHIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIENsYXNzIGRlY29yYXRvciB0aGF0IGF0dGFjaGVzIGEge0BsaW5rIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWd9IHRvIGEgTW9kZWwsXG4gKiBzbyBgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGUoKWAgY2FuIHBhc3MgaXQgdG8gYE1vZGVsQ29udHJvbGxlckZhY3RvcnkuY3JlYXRlKClgLlxuICpcbiAqIFRoZSBwZXItbW9kZWwgY29uZmlnIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBtb2R1bGUtbGV2ZWwgYGNvbnRyb2xsZXJDb25maWdgXG4gKiBvcHRpb24gaW4gYERlY2FmTW9kdWxlT3B0aW9uc2AuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBAY29udHJvbGxlckNvbmZpZyh7IGFsbG93R3JvdXBpbmdRdWVyaWVzOiB0cnVlLCBhbGxvd0J1bGtTdGF0ZW1lbnQ6IHsgY3JlYXRlOiB0cnVlLCByZWFkOiB0cnVlLCB1cGRhdGU6IGZhbHNlLCBkZWxldGU6IHRydWUgfSB9KVxuICogQG1vZGVsKClcbiAqIGNsYXNzIE9yZGVyIGV4dGVuZHMgTW9kZWw8T3JkZXI+IHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBGYWN0b3J5IGNvbmZpZ3VyYXRpb24ga25vYnMgKGFsbG93U3RhdGVtZW50bGVzc1F1ZXJ5LCBhbGxvd0dyb3VwaW5nUXVlcmllcywgYWxsb3dCdWxrU3RhdGVtZW50KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyb2xsZXJDb25maWcoY29uZmlnOiBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb250cm9sbGVyQ29uZmlnRGVjb3JhdG9yKHRhcmdldDogYW55KSB7XG4gICAgTWV0YWRhdGEuc2V0KHRhcmdldCwgREVDQUZfQ09OVFJPTExFUl9DT05GSUcsIGNvbmZpZyBhcyBhbnkpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG4iLCJleHBvcnQgY29uc3QgQVVUSF9IQU5ETEVSID0gU3ltYm9sKFwiQVVUSF9IQU5ETEVSXCIpO1xuZXhwb3J0IGNvbnN0IEFVVEhfTUVUQV9LRVkgPSBcImF1dGg6bWV0YVwiO1xuZXhwb3J0IGNvbnN0IElTX1BVQkxJQ19LRVkgPSBcImlzUHVibGljXCI7XG5leHBvcnQgY29uc3QgUkVRVUlSRURfUk9MRVNfS0VZID0gXCJyZXF1aXJlZFJvbGVzXCI7XG5leHBvcnQgY29uc3QgU0tJUF9NT0RFTF9ST0xFU19LRVkgPSBcInNraXBNb2RlbFJvbGVzXCI7XG4iLCJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBSRVFVRVNUIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHsgVVVJRCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0IH0gZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJDdHggfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZlJlcXVlc3RDb250ZXh0PEMgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4PiBleHRlbmRzIFJlcXVlc3RDb250ZXh0PFJlcXVlc3Q+IHtcbiAgdXVpZCA9IFVVSUQuaW5zdGFuY2UuZ2VuZXJhdGUoKTtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFJFUVVFU1QpIHByaXZhdGUgcmVhZG9ubHkgcmVxOiBSZXF1ZXN0KSB7XG4gICAgc3VwZXIoXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnNPZjogKHJlcXVlc3Q6IFJlcXVlc3QpID0+IChyZXF1ZXN0IGFzIGFueSk/LmhlYWRlcnMgfHwgdW5kZWZpbmVkLFxuICAgICAgfSBhcyBhbnksXG4gICAgICByZXFcbiAgICApO1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcTtcbiAgfVxuXG4gIGdldCBoZWFkZXJzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JVbmRlZmluZWQoXCJoZWFkZXJzXCIgYXMgYW55KTtcbiAgfVxuXG4gIHB1dChyZWNvcmQ6IFJlY29yZDxhbnksIGFueT4pIHtcbiAgICBsZXQgb3ZlcnJpZGVzOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIG92ZXJyaWRlcyA9IHRoaXMuZ2V0KFwib3ZlcnJpZGVzXCIpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIG92ZXJyaWRlcyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMuYWNjdW11bGF0ZSh7XG4gICAgICBvdmVycmlkZXM6IE9iamVjdC5hc3NpZ24ob3ZlcnJpZGVzLCByZWNvcmQpLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIENhbGxIYW5kbGVyLFxuICBJbmplY3QsXG4gIE9wdGlvbmFsLFxuICBTY29wZSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBSZWZsZWN0b3IgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmltcG9ydCB7XG4gIEFVVEhfSEFORExFUixcbiAgQVVUSF9NRVRBX0tFWSxcbiAgSVNfUFVCTElDX0tFWSxcbiAgUkVRVUlSRURfUk9MRVNfS0VZLFxuICBTS0lQX01PREVMX1JPTEVTX0tFWSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgQXV0aEludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWZsZWN0b3I6IFJlZmxlY3RvcixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVxdWVzdENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIX0hBTkRMRVIpIHByaXZhdGUgcmVhZG9ubHkgYXV0aEhhbmRsZXI/OiBBdXRoSGFuZGxlclxuICApIHt9XG5cbiAgYXN5bmMgaW50ZXJjZXB0KFxuICAgIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgICBuZXh0OiBDYWxsSGFuZGxlclxuICApOiBQcm9taXNlPE9ic2VydmFibGU8YW55Pj4ge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KS5mb3IodGhpcy5pbnRlcmNlcHQpO1xuXG4gICAgY29uc3QgaXNQdWJsaWMgPSB0aGlzLnJlZmxlY3Rvci5nZXRBbGxBbmRPdmVycmlkZTxib29sZWFuPihJU19QVUJMSUNfS0VZLCBbXG4gICAgICBjdHguZ2V0SGFuZGxlcigpLFxuICAgICAgY3R4LmdldENsYXNzKCksXG4gICAgXSk7XG5cbiAgICBjb25zdCBtb2RlbE5hbWUgPVxuICAgICAgdGhpcy5yZWZsZWN0b3IuZ2V0PHN0cmluZyB8IENvbnN0cnVjdG9yPihcbiAgICAgICAgQVVUSF9NRVRBX0tFWSxcbiAgICAgICAgY3R4LmdldEhhbmRsZXIoKVxuICAgICAgKSA/P1xuICAgICAgdGhpcy5yZWZsZWN0b3IuZ2V0PHN0cmluZyB8IENvbnN0cnVjdG9yPihBVVRIX01FVEFfS0VZLCBjdHguZ2V0Q2xhc3MoKSk7XG5cbiAgICBjb25zdCByZXF1aXJlZFJvbGVzID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8c3RyaW5nW10+KFxuICAgICAgUkVRVUlSRURfUk9MRVNfS0VZLFxuICAgICAgW2N0eC5nZXRIYW5kbGVyKCksIGN0eC5nZXRDbGFzcygpXVxuICAgICk7XG5cbiAgICBjb25zdCBza2lwTW9kZWxSb2xlcyA9IHRoaXMucmVmbGVjdG9yLmdldEFsbEFuZE92ZXJyaWRlPGJvb2xlYW4+KFxuICAgICAgU0tJUF9NT0RFTF9ST0xFU19LRVksXG4gICAgICBbY3R4LmdldEhhbmRsZXIoKSwgY3R4LmdldENsYXNzKCldXG4gICAgKTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZU1vZGVsID0gc2tpcE1vZGVsUm9sZXMgPyB1bmRlZmluZWQgOiBtb2RlbE5hbWU7XG5cbiAgICBsb2cudmVyYm9zZShgSW50ZXJjZXB0ZWQgcmVxdWVzdCR7bW9kZWxOYW1lID8gYCBmb3IgJHttb2RlbE5hbWV9YCA6IFwiXCJ9YCk7XG5cbiAgICBpZiAoaXNQdWJsaWMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgUHVibGljIHJvdXRlIOKAlCBza2lwcGluZyBhdXRoYCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmF1dGhIYW5kbGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmF1dGhIYW5kbGVyLmF1dGhvcml6ZShcbiAgICAgICAgY3R4LFxuICAgICAgICBlZmZlY3RpdmVNb2RlbCBhcyBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgICAgcmVxdWlyZWRSb2xlcyxcbiAgICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKGBObyBhdXRoIGhhbmRsZXIgcmVnaXN0ZXJlZGApO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybWVycyBydW4gQUZURVIgYXV0aCBzbyB0aGV5IGNhbiByZWFkIGF1dGgtcG9wdWxhdGVkIGZpZWxkc1xuICAgIC8vIChlLmcuIGB1c2VyYCkgZnJvbSB0aGUgY29udGV4dCBhbmQgbWFwIHRoZW0gdG8gYWRhcHRlci1zcGVjaWZpYyBrZXlzXG4gICAgLy8gKGUuZy4gYFVVSURgIGZvciBSYW1BZGFwdGVyJ3MgQGNyZWF0ZWRCeS9AdXBkYXRlZEJ5IGhhbmRsZXJzKS5cbiAgICBhd2FpdCB0aGlzLmFwcGx5VHJhbnNmb3JtZXJzKCk7XG5cbiAgICBjb25zdCB1c2VyID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRPclVuZGVmaW5lZChcInVzZXJcIiBhcyBhbnkpO1xuICAgIGNvbnN0IG9yZ2FuaXphdGlvbiA9IHRoaXMucmVxdWVzdENvbnRleHQuZ2V0T3JVbmRlZmluZWQoXG4gICAgICBcIm9yZ2FuaXphdGlvblwiIGFzIGFueVxuICAgICk7XG4gICAgaWYgKHVzZXIgfHwgb3JnYW5pemF0aW9uKSB7XG4gICAgICBjb25zdCBjdXJyZW50TG9nID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXQoXCJsb2dnZXJcIiBhcyBhbnkpO1xuICAgICAgY29uc3QgY2hpbGRMb2cgPSBjdXJyZW50TG9nLmZvcih7IHVzZXIsIG9yZ2FuaXphdGlvbiB9KTtcbiAgICAgIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZSh7IGxvZ2dlcjogY2hpbGRMb2cgfSBhcyBhbnkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFwcGx5VHJhbnNmb3JtZXJzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZsYXZvdXJzID0gQWRhcHRlci5mbGF2b3Vyc1RvVHJhbnNmb3JtKCk7XG4gICAgaWYgKCFmbGF2b3VycykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBmbGF2b3VyIG9mIGZsYXZvdXJzKSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IEFkYXB0ZXIudHJhbnNmb3JtZXJGb3IoXG4gICAgICAgIGZsYXZvdXJcbiAgICAgICkgYXMgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT47XG4gICAgICBpZiAoIXRyYW5zZm9ybWVyKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gKHRyYW5zZm9ybWVyIGFzIGFueSkuZnJvbVxuICAgICAgICA/IHRyYW5zZm9ybWVyXG4gICAgICAgIDogbmV3ICh0cmFuc2Zvcm1lciBhcyBhbnkpKCk7XG4gICAgICBjb25zdCBmcm9tID0gYXdhaXQgaW5zdGFuY2UuZnJvbSh0aGlzLnJlcXVlc3RDb250ZXh0KTtcbiAgICAgIGlmIChmcm9tKSB0aGlzLnJlcXVlc3RDb250ZXh0LmFjY3VtdWxhdGUoZnJvbSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseURlY29yYXRvcnMsIFNldE1ldGFkYXRhLCBVc2VJbnRlcmNlcHRvcnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFwaUJlYXJlckF1dGgsIEFwaVNlY3VyaXR5IH0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuaW1wb3J0IHsgQVVUSF9NRVRBX0tFWSwgSVNfUFVCTElDX0tFWSwgUkVRVUlSRURfUk9MRVNfS0VZIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9BdXRoSW50ZXJjZXB0b3JcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIEF1dGgobW9kZWw/OiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcikge1xuICBjb25zdCByZXNvdXJjZSA9IG1vZGVsXG4gICAgPyB0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCJcbiAgICAgID8gbW9kZWxcbiAgICAgIDogbW9kZWwubmFtZVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBkZWNzID0gW0FwaUJlYXJlckF1dGgoKSwgVXNlSW50ZXJjZXB0b3JzKEF1dGhJbnRlcmNlcHRvcildO1xuICBpZiAocmVzb3VyY2UpIGRlY3MucHVzaChTZXRNZXRhZGF0YShBVVRIX01FVEFfS0VZLCByZXNvdXJjZSkpO1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUHVibGljKCkge1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKFNldE1ldGFkYXRhKElTX1BVQkxJQ19LRVksIHRydWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJlcXVpcmVSb2xlcyguLi5yb2xlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyhcbiAgICBBcGlTZWN1cml0eShcImJlYXJlclwiKSxcbiAgICBTZXRNZXRhZGF0YShSRVFVSVJFRF9ST0xFU19LRVksIHJvbGVzKSxcbiAgICBVc2VJbnRlcmNlcHRvcnMoQXV0aEludGVyY2VwdG9yKVxuICApO1xufVxuIiwiaW1wb3J0IHsgRGVsZXRlLCBHZXQsIFBhdGNoLCBQb3N0LCBQdXQgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEh0dHBWZXJicyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgTmVzdEpTIG1ldGhvZCBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHZlcmIgLSBIVFRQIHZlcmIgdG8gYmUgY29udmVydGVkIChlLmcuIEdFVCwgUE9TVCwgUFVULCBQQVRDSCwgREVMRVRFKS5cbiAqIEByZXR1cm5zIEEgTmVzdEpTIG1ldGhvZCBkZWNvcmF0b3IgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIEhUVFAgdmVyYi5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb3ZpZGVkIEhUVFAgdmVyYiBpcyBub3Qgc3VwcG9ydGVkIG9yIG5vdCBtYXBwZWRcbiAqIHRvIGEgTmVzdEpTIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEh0dHBWZXJiVG9EZWNvcmF0b3IoXG4gIHZlcmI6IEh0dHBWZXJic1xuKTogKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxIdHRwVmVyYnMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3I+ID0ge1xuICAgIEdFVDogR2V0LFxuICAgIFBPU1Q6IFBvc3QsXG4gICAgUFVUOiBQdXQsXG4gICAgUEFUQ0g6IFBhdGNoLFxuICAgIERFTEVURTogRGVsZXRlLFxuICB9O1xuXG4gIGNvbnN0IGRlY29yYXRvciA9IGh0dHBUb0NydWRbdmVyYl07XG5cbiAgaWYgKCFkZWNvcmF0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVW5zdXBwb3J0ZWQgSFRUUCB2ZXJiIFwiJHt2ZXJifVwiLiBObyBOZXN0SlMgZGVjb3JhdG9yIG1hcHBpbmcgd2FzIGZvdW5kLmBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGRlY29yYXRvcjtcbn1cbiIsImltcG9ydCB7IFF1ZXJ5IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IHR5cGUgRGVjb3JhdG9yQnVuZGxlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIEFwaU5vQ29udGVudFJlc3BvbnNlLFxuICBBcGlPa1Jlc3BvbnNlLFxuICBBcGlPcGVyYXRpb24sXG4gIEFwaVBhcmFtLFxuICBBcGlRdWVyeSxcbn0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHtcbiAgRGVjYWZBcGlQcm9wZXJ0eSxcbiAgdHlwZSBEZWNhZlBhcmFtUHJvcHMsXG4gIERlY2FmUGFyYW1zLFxufSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7IEh0dHBWZXJicyB9IGZyb20gXCIuL2RlY29yYXRvcnMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIERpcmVjdGlvbkxpbWl0T2Zmc2V0LFxuICBNb2RlbFNlcnZpY2UsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBSZXBvLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSHR0cFZlcmJUb0RlY29yYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnMvdXRpbHNcIjtcbmltcG9ydCB7IERlY2FmTW9kZWxDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXJzXCI7XG5cbmNvbnN0IGV4dHJhY3RQYXRoUGFyYW1zID0gKHJvdXRlUGF0aDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICByZXR1cm4gcm91dGVQYXRoXG4gICAgLnNwbGl0KFwiL1wiKVxuICAgIC5maWx0ZXIoKHApID0+IHAuc3RhcnRzV2l0aChcIjpcIikpXG4gICAgLm1hcCgocCkgPT4gcC5zbGljZSgxKSk7XG59O1xuXG5jb25zdCBhcGlQYXJhbVNwZWMgPSAobmFtZTogc3RyaW5nKTogRGVjYWZBcGlQcm9wZXJ0eSA9PiAoe1xuICBuYW1lLFxuICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICByZXF1aXJlZDogdHJ1ZSxcbiAgdHlwZTogU3RyaW5nLFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcGlEZWNvcmF0b3JzKFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIHJvdXRlUGF0aDogc3RyaW5nLFxuICBodHRwVmVyYjogSHR0cFZlcmJzLFxuICBpbmNsdWRlUXVlcnlQYXJhbXM6IGJvb2xlYW4gPSBmYWxzZVxuKTogRGVjb3JhdG9yQnVuZGxlIHtcbiAgY29uc3QgTmVzdEh0dHBSb3V0ZURlYyA9IEh0dHBWZXJiVG9EZWNvcmF0b3IoaHR0cFZlcmIpO1xuICBjb25zdCBhcGlQYXRoUGFyYW1zID0gZXh0cmFjdFBhdGhQYXJhbXMocm91dGVQYXRoKS5tYXAoYXBpUGFyYW1TcGVjKTtcblxuICBjb25zdCBzd2FnZ2VyUXVlcnlQYXJhbXMgPSBbXTtcbiAgaWYgKGh0dHBWZXJiID09PSBcIkdFVFwiICYmIGluY2x1ZGVRdWVyeVBhcmFtcykge1xuICAgIHN3YWdnZXJRdWVyeVBhcmFtcy5wdXNoKFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcImRpcmVjdGlvblwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlciB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcImxpbWl0XCIsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwibGltaXQgb3IgcGFnZSBzaXplIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwib2Zmc2V0XCIsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwib2Zmc2V0IG9yIGJvb2ttYXJrIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtZXRob2Q6IFtcbiAgICAgIE5lc3RIdHRwUm91dGVEZWMocm91dGVQYXRoKSxcbiAgICAgIC4uLmFwaVBhdGhQYXJhbXMubWFwKEFwaVBhcmFtKSxcbiAgICAgIC4uLnN3YWdnZXJRdWVyeVBhcmFtcyxcbiAgICAgIEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBSZXRyaWV2ZSByZWNvcmRzIHVzaW5nIGFjY29yZGluZyB0byBcIiR7bWV0aG9kTmFtZX1cIi5gLFxuICAgICAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBSZXN1bHQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC5gLFxuICAgICAgfSksXG4gICAgICBBcGlOb0NvbnRlbnRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gY29udGVudCByZXR1cm5lZCBieSB0aGUgbWV0aG9kLmAsXG4gICAgICB9KSxcbiAgICBdLFxuICAgIHBhcmFtczogW0RlY2FmUGFyYW1zKGFwaVBhdGhQYXJhbXMpLCBRdWVyeSgpXSwgLy8gLCBEZWNhZkJvZHkoKV0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFwaURlY29yYXRvcnMoXG4gIHRhcmdldDogYW55LFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcixcbiAgZGVjb3JhdG9yczogRGVjb3JhdG9yQnVuZGxlXG4pIHtcbiAgY29uc3QgcHJvdG8gPSB0YXJnZXQ/LnByb3RvdHlwZSA/PyB0YXJnZXQ7XG4gIGRlY29yYXRvcnMubWV0aG9kLmZvckVhY2goKGQpID0+IGQocHJvdG8sIG1ldGhvZE5hbWUsIGRlc2NyaXB0b3IpKTtcbiAgZGVjb3JhdG9ycy5wYXJhbXM/LmZvckVhY2goKGQsIGluZGV4KSA9PiBkKHByb3RvLCBtZXRob2ROYW1lLCBpbmRleCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBlcnNpc3RlbmNlTWV0aG9kPFQgZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gIHBlcnNpc3RlbmNlOiBSZXBvPFQ+IHwgTW9kZWxTZXJ2aWNlPFQ+LFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIC4uLmFyZ3M6IGFueVtdXG4pOiBhbnkge1xuICBpZiAocGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBNb2RlbFNlcnZpY2UpIHtcbiAgICByZXR1cm4gdHlwZW9mIChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0oLi4uYXJncylcbiAgICAgIDogcGVyc2lzdGVuY2Uuc3RhdGVtZW50KG1ldGhvZE5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiKVxuICAgIHJldHVybiAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSguLi5hcmdzKTtcblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFBlcnNpc3RlbmNlIG1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBub3QgZm91bmQgb24gJHtwZXJzaXN0ZW5jZT8uY29uc3RydWN0b3I/Lm5hbWV9YFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGVIYW5kbGVyPFQ+KG1ldGhvZE5hbWU6IHN0cmluZykge1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgIHRoaXM6IERlY2FmTW9kZWxDb250cm9sbGVyPGFueT4sXG4gICAgcGF0aFBhcmFtczogRGVjYWZQYXJhbVByb3BzLFxuICAgIHF1ZXJ5UGFyYW1zOiBEaXJlY3Rpb25MaW1pdE9mZnNldFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBsb2c6IExvZ2dlciA9IHRoaXMubG9nLmZvcihtZXRob2ROYW1lKTtcblxuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBJbnZva2luZyBwZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgZ2l2ZW4gcGFyYW1ldGVyczogJHtKU09OLnN0cmluZ2lmeShwYXRoUGFyYW1zLnZhbHVlc0luT3JkZXIpfWBcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGRpcmVjdGlvbiwgbGltaXQsIG9mZnNldCB9ID0gcXVlcnlQYXJhbXM7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZVBlcnNpc3RlbmNlTWV0aG9kKFxuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlKCksXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIC4uLnBhdGhQYXJhbXMudmFsdWVzSW5PcmRlcixcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb2Zmc2V0XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgbG9nLmVycm9yKGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYCwgZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJvdXRlTWV0aG9kKFxuICBDb250cm9sbGVyQ2xhc3M6IG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueVxuKTogUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgIENvbnRyb2xsZXJDbGFzcy5wcm90b3R5cGUgfHwgQ29udHJvbGxlckNsYXNzLFxuICAgIG1ldGhvZE5hbWUsXG4gICAge1xuICAgICAgdmFsdWU6IGhhbmRsZXIsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfVxuICApO1xuXG4gIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgIENvbnRyb2xsZXJDbGFzcy5wcm90b3R5cGUgfHwgQ29udHJvbGxlckNsYXNzLFxuICAgIG1ldGhvZE5hbWVcbiAgKTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQXV0aEhhbmRsZXIsIEF1dGhEYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5cbi8qKlxuICogU2ltcGxlIGF1dGggaGFuZGxlciB0aGF0IHJlYWRzIGEgcm9sZSBzdHJpbmcgZnJvbSB0aGUgYEF1dGhvcml6YXRpb246IEJlYXJlciA8cm9sZT5gIGhlYWRlci5cbiAqXG4gKiBPbmx5IG92ZXJyaWRlcyB7QGxpbmsgQXV0aEhhbmRsZXIuZXh0cmFjdEZyb21BdXRofSB0byByZXR1cm4gdGhlIGJlYXJlciB0b2tlbiBhc1xuICogYm90aCB0aGUgdXNlciBpZGVudGlmaWVyIGFuZCB0aGUgc2luZ2xlIHJvbGUuIFRoZSBiYXNlIGNsYXNzIGBiaW5kVG9Db250ZXh0YFxuICogKGBjdHguYWNjdW11bGF0ZShkYXRhKWApIGlzIHN1ZmZpY2llbnQg4oCUIHRoZSB0cmFuc2Zvcm1lci9hZGFwdGVyIGlzIHJlc3BvbnNpYmxlXG4gKiBmb3IgbWFwcGluZyBjb250ZXh0IGZpZWxkcyB0byBhZGFwdGVyLXNwZWNpZmljIGtleXMgbGlrZSBgVVVJRGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNhZkF1dGhIYW5kbGVyIGV4dGVuZHMgQXV0aEhhbmRsZXI8XG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIERlY2FmUmVxdWVzdENvbnRleHQsXG4gIEF1dGhEYXRhXG4+IHtcbiAgcHJvdGVjdGVkIHBhcnNlUmVxdWVzdChyZXE6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgdXNlclJvbGUgPSByZXEuaGVhZGVycy5hdXRob3JpemF0aW9uPy5zcGxpdChcIiBcIilbMV0gYXMgc3RyaW5nO1xuICAgIHJldHVybiB1c2VyUm9sZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBleHRyYWN0RnJvbUF1dGgoY3R4OiBFeGVjdXRpb25Db250ZXh0KTogQXV0aERhdGEge1xuICAgIGNvbnN0IHJlcSA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgdXNlclJvbGUgPSB0aGlzLnBhcnNlUmVxdWVzdChyZXEpO1xuICAgIGlmICghdXNlclJvbGUpIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXCJVbmF1dGhlbnRpY2F0ZWRcIik7XG4gICAgcmV0dXJuIHsgdXNlcjogdXNlclJvbGUsIHJvbGVzOiBbdXNlclJvbGVdIH07XG4gIH1cbn1cblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIERlY2FmQXV0aEhhbmRsZXJ9IGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gKiBUaGUgXCJyb2xlXCIgdmFyaWFudCBwcmV2aW91c2x5IHJldHVybmVkIHJvbGVzIGZyb20gYGF1dGhvcml6ZWA7IHdpdGggdGhlIGJhc2VcbiAqIGNsYXNzIG5vdyBvcmNoZXN0cmF0aW5nIHJvbGUgY2hlY2tzIGludGVybmFsbHksIHRoZSB0d28gY2xhc3NlcyBhcmUgZXF1aXZhbGVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlY2FmUm9sZUF1dGhIYW5kbGVyIGV4dGVuZHMgRGVjYWZBdXRoSGFuZGxlciB7fVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgTW9kdWxlLCBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBUFBfSU5URVJDRVBUT1IgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5cbmltcG9ydCB7IEF1dGhJbnRlcmNlcHRvciB9IGZyb20gXCIuL0F1dGhJbnRlcmNlcHRvclwiO1xuaW1wb3J0IHsgQVVUSF9IQU5ETEVSIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBdXRoSGFuZGxlciB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBEZWNhZkF1dGhNb2R1bGVPcHRpb25zID0ge1xuICBnbG9iYWw/OiBib29sZWFuO1xuICBoYW5kbGVyPzogVHlwZTxBdXRoSGFuZGxlcj47XG59O1xuXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmQXV0aE1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KFxuICAgIG9wdGlvbnM6IERlY2FmQXV0aE1vZHVsZU9wdGlvbnMgPSB7fVxuICApOiBEeW5hbWljTW9kdWxlIHtcbiAgICBjb25zdCBwcm92aWRlcnM6IER5bmFtaWNNb2R1bGVbXCJwcm92aWRlcnNcIl0gPSBbXG4gICAgICBBdXRoSW50ZXJjZXB0b3IsXG4gICAgXTtcblxuICAgIGlmIChvcHRpb25zLmhhbmRsZXIpIHtcbiAgICAgIHByb3ZpZGVycy5wdXNoKG9wdGlvbnMuaGFuZGxlcik7XG4gICAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICAgIHByb3ZpZGU6IEFVVEhfSEFORExFUixcbiAgICAgICAgdXNlQ2xhc3M6IG9wdGlvbnMuaGFuZGxlcixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmdsb2JhbCkge1xuICAgICAgKHByb3ZpZGVycyBhcyBhbnlbXSkucHVzaCh7XG4gICAgICAgIHByb3ZpZGU6IEFQUF9JTlRFUkNFUFRPUixcbiAgICAgICAgdXNlRXhpc3Rpbmc6IEF1dGhJbnRlcmNlcHRvcixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmQXV0aE1vZHVsZSxcbiAgICAgIGdsb2JhbDogb3B0aW9ucy5nbG9iYWwgPz8gZmFsc2UsXG4gICAgICBwcm92aWRlcnMsXG4gICAgICBleHBvcnRzOiBbQXV0aEludGVyY2VwdG9yLCBBVVRIX0hBTkRMRVJdLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5pbXBvcnQgeyB0eXBlIERlY2FmUmVxdWVzdEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERFQ0FGX0hBTkRMRVJTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRXhlY3V0ZXMgYWxsIHJlZ2lzdGVyZWQge0BsaW5rIERlY2FmUmVxdWVzdEhhbmRsZXJ9IGluc3RhbmNlcyBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCxcbiAqIHByb3ZpZGluZyB0aGVtIHdpdGggYSBzaGFyZWQge0BsaW5rIERlY2FmUmVxdWVzdENvbnRleHR9LlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUge0BsaW5rIERlY2FmSGFuZGxlckV4ZWN1dG9yfSBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3Igb3JjaGVzdHJhdGluZyBhbmQgZXhlY3V0aW5nXG4gKiBhIHNlcXVlbmNlIG9mIHJlcXVlc3QgaGFuZGxlcnMuIEVhY2ggaGFuZGxlciByZWNlaXZlcyB0aGUgc2FtZSByZXF1ZXN0LXNjb3BlZCBjb250ZXh0LFxuICogYWxsb3dpbmcgY29vcmRpbmF0ZWQgcHJvY2Vzc2luZyBzdWNoIGFzIGF1dGhlbnRpY2F0aW9uLCBtZXRhZGF0YSBleHRyYWN0aW9uLCBhdWRpdGluZyxcbiAqIGFuZCBjdXN0b20gcGlwZWxpbmUgYmVoYXZpb3IuIEhhbmRsZXJzIGFyZSBpbmplY3RlZCB2aWEgdGhlIHtAbGluayBERUNBRl9IQU5ETEVSU30gdG9rZW4sXG4gKiBlbnN1cmluZyBleHRlbnNpYmlsaXR5IGFuZCBsb29zZSBjb3VwbGluZy5cbiAqXG4gKiBAY2xhc3MgRGVjYWZIYW5kbGVyRXhlY3V0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEV4YW1wbGUgaGFuZGxlcjpcbiAqIGNsYXNzIEF1dGhIYW5kbGVyIGltcGxlbWVudHMgRGVjYWZSZXF1ZXN0SGFuZGxlciB7XG4gKiAgIGFzeW5jIGhhbmRsZShjb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LCByZXE6IFJlcXVlc3QpIHtcbiAqICAgICBjb25zdCB0b2tlbiA9IHJlcS5oZWFkZXJzW1wiYXV0aG9yaXphdGlvblwiXTtcbiAqICAgICBjb25zdCByZXN1bHQgPSBNeVNlcnZpY2UuZG9Tb21ldGhpbmcodG9rZW4pO1xuICogICAgIGNvbnRleHQuc2V0KFwibXkta2V5XCIsIHJlc3VsdCk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBFeGVjdXRvciB1c2FnZSBpbiBhIHJlcXVlc3Q6XG4gKiBhd2FpdCBleGVjdXRvci5leGVjKHJlcXVlc3QpO1xuICogLy8gQWxsIGhhbmRsZXJzIHdpbGwgcnVuIGluIHNlcXVlbmNlXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgICAgcGFydGljaXBhbnQgRXhlY3V0b3JcbiAqICAgICBwYXJ0aWNpcGFudCBIYW5kbGVyQVxuICogICAgIHBhcnRpY2lwYW50IEhhbmRsZXJCXG4gKlxuICogICAgIENsaWVudC0+PkV4ZWN1dG9yOiBleGVjKHJlcSlcbiAqICAgICBFeGVjdXRvci0+PkhhbmRsZXJBOiBoYW5kbGUoY29udGV4dCwgcmVxKVxuICogICAgIEhhbmRsZXJBLS0+PkV4ZWN1dG9yOiBjb21wbGV0ZWRcbiAqICAgICBFeGVjdXRvci0+PkhhbmRsZXJCOiBoYW5kbGUoY29udGV4dCwgcmVxKVxuICogICAgIEhhbmRsZXJCLS0+PkV4ZWN1dG9yOiBjb21wbGV0ZWRcbiAqICAgICBFeGVjdXRvci0tPj5DbGllbnQ6IHByb2Nlc3NpbmcgZmluaXNoZWRcbiAqL1xuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmSGFuZGxlckV4ZWN1dG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChERUNBRl9IQU5ETEVSUykgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVyczogRGVjYWZSZXF1ZXN0SGFuZGxlcltdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dFxuICApIHt9XG5cbiAgYXN5bmMgZXhlYyhyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZkhhbmRsZXJFeGVjdXRvci5uYW1lKS5mb3IodGhpcy5leGVjKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ09OVEVYVCAke3RoaXMuY29udGV4dC51dWlkfSBydW5uaW5nICR7dGhpcy5oYW5kbGVycy5sZW5ndGh9IGhhbmRsZXJzIGZvciByZXF1ZXN0ICR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWBcbiAgICApO1xuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB0aGlzLmhhbmRsZXJzKSB7XG4gICAgICBhd2FpdCBoYW5kbGVyLmhhbmRsZSh0aGlzLmNvbnRleHQsIHJlcSwgcmVzKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgQ2FsbEhhbmRsZXIsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGFwIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBOZXN0SW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY3R4OiBEZWNhZlJlcXVlc3RDb250ZXh0KSB7fVxuXG4gIGludGVyY2VwdChjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBuZXh0OiBDYWxsSGFuZGxlcik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHJlc3BvbnNlID0gY29udGV4dC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXNwb25zZSgpO1xuXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKCkucGlwZShcbiAgICAgIHRhcCgoZGF0YSkgPT4ge1xuICAgICAgICByZXNwb25zZSA9IHRoaXMuY3R4LnRvUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyB0eXBlIFJlcXVlc3QgfSBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHsgRGVjYWZDb250cm9sbGVyIGFzIEh0dHBEZWNhZkNvbnRyb2xsZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgTW9kZWxTZXJ2aWNlLFxuICBSZXBvLFxuICBSZXBvc2l0b3J5LFxuICBTZXJ2aWNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsLCB0eXBlIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmltcG9ydCB7IERlY2FmU2VydmVyQ3R4IH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEZWNhZkNvbnRyb2xsZXI8XG4gIENPTlRFWFQgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4LFxuPiBleHRlbmRzIEh0dHBEZWNhZkNvbnRyb2xsZXI8UmVxdWVzdCwgYW55LCBEZWNhZlJlcXVlc3RDb250ZXh0PiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBfbmFtZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKGNsaWVudENvbnRleHQpO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBDIGV4dGVuZHMgRGVjYWZTZXJ2ZXJDdHggPSBEZWNhZlNlcnZlckN0eCxcbj4gZXh0ZW5kcyBEZWNhZkNvbnRyb2xsZXI8Qz4ge1xuICBwcml2YXRlIF9wZXJzaXN0ZW5jZT86IFJlcG88TT4gfCBNb2RlbFNlcnZpY2U8TT47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSByZWFkb25seSBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIF9uYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCwgX25hbWUpO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8TT47XG5cbiAgcGVyc2lzdGVuY2UoY3R4PzogQ29udGV4dDxhbnk+KTogUmVwbzxNPiB8IE1vZGVsU2VydmljZTxNPiB7XG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSlcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gU2VydmljZS5nZXQ8TW9kZWxTZXJ2aWNlPE0+Pih0aGlzLmNsYXNzKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gTW9kZWxTZXJ2aWNlLmdldFNlcnZpY2UoXG4gICAgICAgICAgICB0aGlzLmNsYXNzXG4gICAgICAgICAgKSBhcyBNb2RlbFNlcnZpY2U8TT47XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhpcy5fcGVyc2lzdGVuY2UgPSBSZXBvc2l0b3J5LmZvck1vZGVsKHRoaXMuY2xhc3MpIGFzIFJlcG88TT47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGNvbnN0IG92ZXJyaWRlcyA9IHRoaXMuY2xpZW50Q29udGV4dC50b092ZXJyaWRlcygpO1xuXG4gICAgcmV0dXJuIGN0eFxuICAgICAgPyB0aGlzLl9wZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIFJlcG9zaXRvcnlcbiAgICAgICAgPyB0aGlzLl9wZXJzaXN0ZW5jZS5vdmVycmlkZShvdmVycmlkZXMpXG4gICAgICAgIDogdGhpcy5fcGVyc2lzdGVuY2UuZm9yKG92ZXJyaWRlcylcbiAgICAgIDogdGhpcy5fcGVyc2lzdGVuY2U7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEFwaVByb3BlcnR5IH0gZnJvbSBcIi4uLy4uL292ZXJyaWRlcy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbCwgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IHRvUGFzY2FsQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgREVDT1JBVE9SUyB9IGZyb20gXCIuLi8uLi9vdmVycmlkZXMvY29uc3RhbnRzXCI7XG5cbmNvbnN0IGR0b0NhY2hlID0gbmV3IE1hcDxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgV2Vha01hcDxDb25zdHJ1Y3Rvcjxhbnk+LCBDb25zdHJ1Y3Rvcjxhbnk+PlxuPigpO1xuXG4vKipcbiAqIEJ1aWxkcyBhIE5lc3QvU3dhZ2dlciBEVE8gY2xhc3MgZm9yIHRoZSBnaXZlbiBtb2RlbCBhbmQgQ1JVRCBvcGVyYXRpb24uXG4gKlxuICogUnVsZXM6XG4gKiAgLSBPbmx5IENSRUFURSBhbmQgVVBEQVRFIChhbmQgdGhlaXIgYnVsayB2YXJpYW50cykgcHJvZHVjZSBhIERUTztcbiAqICAgIGFsbCBvdGhlciBvcGVyYXRpb25zIHJldHVybiB0aGUgb3JpZ2luYWwgbW9kZWwgY2xhc3MgdW5jaGFuZ2VkLlxuICogIC0gQGdlbmVyYXRlZCgpIHByb3BlcnRpZXMgKGNyZWF0ZWRBdCwgdXBkYXRlZEF0LCBjcmVhdGVkQnksIHVwZGF0ZWRCeSxcbiAqICAgIHV1aWQsIHZlcnNpb24sIEBjb21wb3NlZCBwa3MsIOKApikgYXJlICoqbmV2ZXIqKiBleHBvc2VkIGluIGFueSBEVE8uXG4gKiAgLSBUaGUgQHBrKCkgcHJvcGVydHk6XG4gKiAgICAgIOKAoiBVUERBVEUg4oCTIGFsd2F5cyBpbmNsdWRlZC5cbiAqICAgICAg4oCiIENSRUFURSAg4oCTIGluY2x1ZGVkIG9ubHkgd2hlbiB0aGUgcGsgaXMgTk9UIGF1dG8tZ2VuZXJhdGVkXG4gKiAgICAgICAgICAgICAgICAgIChjaGVja2VkIHZpYSBNb2RlbC5wa1Byb3BzKCkuZ2VuZXJhdGVkIEFORCBNb2RlbC5nZW5lcmF0ZWQoKSkuXG4gKiAgLSBSZWxhdGlvbiBwcm9wZXJ0aWVzIChAb25lVG9PbmUsIEBvbmVUb01hbnksIOKApik6XG4gKiAgICAgIOKAoiBDUkVBVEUgIOKAkyBuZXN0ZWQgYXMgRHRvRm9yKENSRUFURSwgUmVsYXRlZE1vZGVsKS4gV2hlbiB0aGUgcmVsYXRpb25cbiAqICAgICAgICAgICAgICAgICAgY3JlYXRlcyBhIGNpcmN1bGFyIHJlZmVyZW5jZSAobW9kZWwgQSDihpIgbW9kZWwgQiDihpIgbW9kZWwgQSksXG4gKiAgICAgICAgICAgICAgICAgIHRoZSBiYWNrLXJlZmVyZW5jZSB1c2VzIHRoZSByZWxhdGVkIG1vZGVsJ3MgUEsgdHlwZVxuICogICAgICAgICAgICAgICAgICAoc3RyaW5nL2ludGVnZXIpIGluc3RlYWQgb2YgdGhlIGZ1bGwgRFRPIHRvIGJyZWFrIHRoZSBjeWNsZS5cbiAqICAgICAg4oCiIFVQREFURSAg4oCTIHVuaW9uIG9mIER0b0ZvcihVUERBVEUsIFJlbGF0ZWRNb2RlbCkgKipvcioqIHRoZVxuICogICAgICAgICAgICAgICAgICByZWxhdGVkIG1vZGVsJ3MgcHJpbWFyeS1rZXkgdHlwZSAoc3RyaW5nIC8gaW50ZWdlciksXG4gKiAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhIFN3YWdnZXIgb25lT2YuIENpcmN1bGFyIGJhY2stcmVmZXJlbmNlc1xuICogICAgICAgICAgICAgICAgICBvbWl0IHRoZSBEVE8gJHJlZiBhbmQgb25seSBpbmNsdWRlIHRoZSBQSyB0eXBlLlxuICpcbiAqIE1ldGFkYXRhLnByb3BlcnRpZXMoKSBub3cgcmV0dXJucyBBTEwgcHJvcGVydGllcyBhY3Jvc3MgdGhlIHByb3RvdHlwZSBjaGFpbixcbiAqIHNvIERUTyBpbmhlcml0YW5jZSBpcyBubyBsb25nZXIgbmVlZGVkOyBldmVyeSBEVE8gaXMgYSBmbGF0IGNsYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRHRvRm9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG9wOiBPcGVyYXRpb25LZXlzLFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gIHN0YWNrOiBTZXQ8Q29uc3RydWN0b3I8YW55Pj4gPSBuZXcgU2V0KClcbik6IENvbnN0cnVjdG9yPGFueT4ge1xuICBpZiAoIVRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cy5pbmNsdWRlcyhvcCkpIHtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBjb25zdCBjYWNoZSA9IGdldER0b0NhY2hlKG9wKTtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KG1vZGVsKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBpc1VwZGF0ZU9wID0gW1xuICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICBdLmluY2x1ZGVzKG9wIGFzIGFueSk7XG5cbiAgY2xhc3MgRHluYW1pY0RUTyB7fVxuICBjYWNoZS5zZXQobW9kZWwsIER5bmFtaWNEVE8pO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEeW5hbWljRFRPLCBcIm5hbWVcIiwge1xuICAgIHZhbHVlOiBgJHt0b1Bhc2NhbENhc2UobW9kZWwubmFtZSl9JHt0b1Bhc2NhbENhc2Uob3ApfURUT2AsXG4gIH0pO1xuXG4gIGNvbnN0IHBrUHJvcCA9ICgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBNb2RlbC5wayhtb2RlbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSkoKTtcblxuICBjb25zdCBwa1Byb3BzTWV0YWRhdGEgPSBwa1Byb3AgPyBNb2RlbC5wa1Byb3BzKG1vZGVsIGFzIGFueSkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBrRGVzaWduVHlwZSA9IHBrUHJvcFxuICAgID8gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG1vZGVsLnByb3RvdHlwZSwgcGtQcm9wIGFzIHN0cmluZylcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcGtUeXBlSXNOdW1lcmljID1cbiAgICBwa0Rlc2lnblR5cGUgPT09IE51bWJlciB8fCBwa0Rlc2lnblR5cGUgPT09IEJpZ0ludDtcbiAgY29uc3QgcGtJc0dlbmVyYXRlZCA9XG4gICAgISFwa1Byb3BzTWV0YWRhdGE/LmdlbmVyYXRlZCB8fFxuICAgIChwa1Byb3BcbiAgICAgID8gTW9kZWwuZ2VuZXJhdGVkQnlTZXF1ZW5jZShtb2RlbCBhcyBhbnksIHBrUHJvcCBhcyBhbnkpIHx8XG4gICAgICAgIGlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcGtQcm9wIGFzIHN0cmluZykgfHxcbiAgICAgICAgcGtUeXBlSXNOdW1lcmljXG4gICAgICA6IGZhbHNlKTtcblxuICBjb25zdCBhbGxQcm9wcyA9IEFycmF5LmZyb20obmV3IFNldChNZXRhZGF0YS5wcm9wZXJ0aWVzKG1vZGVsKSB8fCBbXSkpO1xuICBjb25zdCByZWxhdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oKE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkgYXMgc3RyaW5nW10pIHx8IFtdKTtcbiAgY29uc3Qgc2NhbGFyUHJvcHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIGFsbFByb3BzKSB7XG4gICAgaWYgKCFwcm9wKSBjb250aW51ZTtcbiAgICBpZiAocmVsYXRpb25zLmhhcyhwcm9wKSkgY29udGludWU7XG5cbiAgICBpZiAocHJvcCA9PT0gcGtQcm9wICYmICFpc1VwZGF0ZU9wICYmIHBrSXNHZW5lcmF0ZWQpIGNvbnRpbnVlO1xuICAgIGlmIChwcm9wICE9PSBwa1Byb3AgJiYgaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwcm9wKSlcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgc2NhbGFyUHJvcHMucHVzaChwcm9wKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBzY2FsYXJQcm9wcykge1xuICAgIGNvbnN0IHZhbGlkYXRpb24gPSBnZXRWYWxpZGF0aW9uQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHByb3ApO1xuICAgIGNvbnN0IGlzUmVxdWlyZWQgPSAhIXZhbGlkYXRpb24/LltWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRF07XG4gICAgY29uc3QgdHlwZUhpbnQgPVxuICAgICAgZ2V0VHlwZUFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwcm9wKSA/P1xuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG1vZGVsLnByb3RvdHlwZSwgcHJvcCk7XG5cbiAgICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSB7XG4gICAgICByZXF1aXJlZDogaXNSZXF1aXJlZCxcbiAgICB9O1xuICAgIGlmICh0eXBlSGludCkgYXBpT3B0aW9ucy50eXBlID0gdHlwZUhpbnQ7XG5cbiAgICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEeW5hbWljRFRPLnByb3RvdHlwZSwgcHJvcCk7XG5cbiAgICBjb25zdCBkZXNpZ25UeXBlID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBtb2RlbC5wcm90b3R5cGUsIHByb3ApID8/IHR5cGVIaW50O1xuICAgIGlmICh0eXBlb2YgZGVzaWduVHlwZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgXCJkZXNpZ246dHlwZVwiLFxuICAgICAgICBkZXNpZ25UeXBlLFxuICAgICAgICBEeW5hbWljRFRPLnByb3RvdHlwZSxcbiAgICAgICAgcHJvcFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHluYW1pY0RUTy5wcm90b3R5cGUsIHByb3AsIHtcbiAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHJlbGF0aW9uIG9mIHJlbGF0aW9ucykge1xuICAgIGNvbnN0IHJlbGF0aW9uTWV0YSA9IE1ldGFkYXRhLnJlbGF0aW9ucyhtb2RlbCwgcmVsYXRpb24gYXMgYW55KTtcbiAgICBpZiAoIXJlbGF0aW9uTWV0YSkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE1ldGFkYXRhIGZvciByZWxhdGlvbiAke3JlbGF0aW9ufSBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICBsZXQgcmVsYXRpb25UeXBlOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkID1cbiAgICAgIHJlbGF0aW9uTWV0YS5jbGFzcyBhcyBDb25zdHJ1Y3Rvcjxhbnk+O1xuICAgIGlmICh0eXBlb2YgcmVsYXRpb25UeXBlID09PSBcImZ1bmN0aW9uXCIgJiYgIXJlbGF0aW9uVHlwZS5uYW1lKSB7XG4gICAgICByZWxhdGlvblR5cGUgPSAocmVsYXRpb25UeXBlIGFzIGFueSkoKTtcbiAgICB9XG4gICAgaWYgKCFyZWxhdGlvblR5cGUgfHwgdHlwZW9mIHJlbGF0aW9uVHlwZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVHlwZSBmb3IgcmVsYXRpb24gJHtyZWxhdGlvbn0gbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIGlmICghTW9kZWwuZ2V0KHJlbGF0aW9uVHlwZS5uYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLnZhbGlkYXRpb25Gb3IobW9kZWwsIHJlbGF0aW9uIGFzIGFueSk7XG4gICAgY29uc3QgaXNBcnJheSA9ICEhKG1ldGEgYXMgYW55KT8uW1ZhbGlkYXRpb25LZXlzLkxJU1RdO1xuICAgIGNvbnN0IGlzUmVxdWlyZWQgPSAhIShtZXRhIGFzIGFueSk/LltWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRF07XG5cbiAgICAvLyBEZXRlY3QgY2lyY3VsYXIgcmVmZXJlbmNlOiBpZiB0aGUgcmVsYXRlZCBtb2RlbCBpcyBhbHJlYWR5IGluIHRoZVxuICAgIC8vIHJlY3Vyc2lvbiBzdGFjaywgdXNlIHRoZSBQSyB0eXBlIGluc3RlYWQgb2YgdGhlIGZ1bGwgRFRPIHRvIGJyZWFrXG4gICAgLy8gdGhlIGN5Y2xlLiBUaGlzIHByZXZlbnRzIEBuZXN0anMvc3dhZ2dlcidzIFNjaGVtYU9iamVjdEZhY3RvcnkgZnJvbVxuICAgIC8vIGluZmluaXRlbHkgcmVjdXJzaW5nIHdoZW4gZXhwbG9yaW5nIHRoZSBzY2hlbWFzLlxuICAgIGNvbnN0IGlzQ2lyY3VsYXIgPSBzdGFjay5oYXMocmVsYXRpb25UeXBlKTtcblxuICAgIGlmIChpc0NpcmN1bGFyKSB7XG4gICAgICBjb25zdCBwa1R5cGVOYW1lID0gZ2V0UGtPcGVuQXBpVHlwZShyZWxhdGlvblR5cGUpO1xuICAgICAgYWRkUmVsYXRpb25Qa1JlZihEeW5hbWljRFRPLCByZWxhdGlvbiwgcGtUeXBlTmFtZSwgaXNBcnJheSwgaXNSZXF1aXJlZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGlvbkR0byA9IER0b0ZvcihvcCwgcmVsYXRpb25UeXBlLCBuZXcgU2V0KHN0YWNrKS5hZGQobW9kZWwpKTtcblxuICAgIGlmIChpc1VwZGF0ZU9wKSB7XG4gICAgICBhZGRSZWxhdGlvblVwZGF0ZShcbiAgICAgICAgRHluYW1pY0RUTyxcbiAgICAgICAgcmVsYXRpb24sXG4gICAgICAgIHJlbGF0aW9uVHlwZSxcbiAgICAgICAgcmVsYXRpb25EdG8sXG4gICAgICAgIGlzQXJyYXksXG4gICAgICAgIGlzUmVxdWlyZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZFJlbGF0aW9uKER5bmFtaWNEVE8sIHJlbGF0aW9uLCByZWxhdGlvbkR0bywgaXNBcnJheSwgaXNSZXF1aXJlZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIER5bmFtaWNEVE87XG59XG5cbmZ1bmN0aW9uIGFkZFJlbGF0aW9uKFxuICBEdG9DbGFzczogYW55LFxuICByZWxhdGlvbjogc3RyaW5nLFxuICByZWxhdGlvbkR0bzogYW55LFxuICBpc0FycmF5OiBib29sZWFuLFxuICBpc1JlcXVpcmVkOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0ge1xuICAgIHR5cGU6IHJlbGF0aW9uRHRvLFxuICAgIHJlcXVpcmVkOiBpc1JlcXVpcmVkLFxuICAgIGlzQXJyYXksXG4gIH07XG4gIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24pO1xuICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICBpc0FycmF5ID8gQXJyYXkgOiByZWxhdGlvbkR0byxcbiAgICBEdG9DbGFzcy5wcm90b3R5cGUsXG4gICAgcmVsYXRpb25cbiAgKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24sIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcbn1cblxuLyoqXG4gKiBBZGRzIGEgcmVsYXRpb24gcHJvcGVydHkgdGhhdCB1c2VzIHRoZSBQSyB0eXBlIChzdHJpbmcvaW50ZWdlcikgaW5zdGVhZCBvZlxuICogYSBmdWxsIERUTyBjbGFzcy4gVXNlZCB0byBicmVhayBjaXJjdWxhciByZWZlcmVuY2VzIChlLmcuIEN1c3RvbWVyIOKGkiBPcmRlciDihpIgQ3VzdG9tZXIpLlxuICovXG5mdW5jdGlvbiBhZGRSZWxhdGlvblBrUmVmKFxuICBEdG9DbGFzczogYW55LFxuICByZWxhdGlvbjogc3RyaW5nLFxuICBwa1R5cGVOYW1lOiBzdHJpbmcsXG4gIGlzQXJyYXk6IGJvb2xlYW4sXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSBpc0FycmF5XG4gICAgPyAoeyB0eXBlOiBcImFycmF5XCIsIGl0ZW1zOiB7IHR5cGU6IHBrVHlwZU5hbWUgfSwgcmVxdWlyZWQ6IGlzUmVxdWlyZWQgfSBhcyBhbnkpXG4gICAgOiAoeyB0eXBlOiBwa1R5cGVOYW1lID09PSBcImludGVnZXJcIiA/IE51bWJlciA6IFN0cmluZywgcmVxdWlyZWQ6IGlzUmVxdWlyZWQgfSBhcyBhbnkpO1xuICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uKTtcbiAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgaXNBcnJheSA/IEFycmF5IDogKHBrVHlwZU5hbWUgPT09IFwiaW50ZWdlclwiID8gTnVtYmVyIDogU3RyaW5nKSxcbiAgICBEdG9DbGFzcy5wcm90b3R5cGUsXG4gICAgcmVsYXRpb25cbiAgKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24sIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkUmVsYXRpb25VcGRhdGUoXG4gIER0b0NsYXNzOiBhbnksXG4gIHJlbGF0aW9uOiBzdHJpbmcsXG4gIHJlbGF0aW9uVHlwZTogQ29uc3RydWN0b3I8YW55PixcbiAgcmVsYXRpb25EdG86IGFueSxcbiAgaXNBcnJheTogYm9vbGVhbixcbiAgaXNSZXF1aXJlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IGV4dHJhTW9kZWxzID1cbiAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX0VYVFJBX01PREVMUywgRHRvQ2xhc3MpIHx8IFtdO1xuICBpZiAoIWV4dHJhTW9kZWxzLmluY2x1ZGVzKHJlbGF0aW9uRHRvKSkge1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBERUNPUkFUT1JTLkFQSV9FWFRSQV9NT0RFTFMsXG4gICAgICBbLi4uZXh0cmFNb2RlbHMsIHJlbGF0aW9uRHRvXSxcbiAgICAgIER0b0NsYXNzXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGR0b1JlZiA9IGAjL2NvbXBvbmVudHMvc2NoZW1hcy8ke3JlbGF0aW9uRHRvLm5hbWV9YDtcbiAgY29uc3QgcGtUeXBlTmFtZSA9IGdldFBrT3BlbkFwaVR5cGUocmVsYXRpb25UeXBlKTtcbiAgY29uc3Qgb25lT2ZJdGVtcyA9IFt7ICRyZWY6IGR0b1JlZiB9LCB7IHR5cGU6IHBrVHlwZU5hbWUgfV07XG5cbiAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0gaXNBcnJheVxuICAgID8gKHsgdHlwZTogXCJhcnJheVwiLCByZXF1aXJlZDogaXNSZXF1aXJlZCwgb25lT2Y6IG9uZU9mSXRlbXMgfSBhcyBhbnkpXG4gICAgOiAoeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiBpc1JlcXVpcmVkLCBvbmVPZjogb25lT2ZJdGVtcyB9IGFzIGFueSk7XG5cbiAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbik7XG4gIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgXCJkZXNpZ246dHlwZVwiLFxuICAgIGlzQXJyYXkgPyBBcnJheSA6IE9iamVjdCxcbiAgICBEdG9DbGFzcy5wcm90b3R5cGUsXG4gICAgcmVsYXRpb25cbiAgKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24sIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UGtPcGVuQXBpVHlwZShyZWxhdGlvblR5cGU6IENvbnN0cnVjdG9yPGFueT4pOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBrUHJvcHNNZXRhZGF0YSA9IE1vZGVsLnBrUHJvcHMocmVsYXRpb25UeXBlIGFzIGFueSk7XG4gICAgY29uc3QgcGtUeXBlID0gcGtQcm9wc01ldGFkYXRhPy50eXBlO1xuICAgIGlmIChwa1R5cGUgPT09IE51bWJlciB8fCBwa1R5cGUgPT09IEJpZ0ludCkgcmV0dXJuIFwiaW50ZWdlclwiO1xuICAgIHJldHVybiBcInN0cmluZ1wiO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UoXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBwcm9wOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBsZXQgY3VycmVudDogYW55ID0gbW9kZWw7XG4gIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IE9iamVjdCAmJiBjdXJyZW50ICE9PSBGdW5jdGlvbikge1xuICAgIGlmIChNb2RlbC5nZW5lcmF0ZWQoY3VycmVudCwgcHJvcCBhcyBhbnkpKSByZXR1cm4gdHJ1ZTtcbiAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsaWRhdGlvbkFjcm9zc0luaGVyaXRhbmNlKFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgcHJvcDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG1vZGVsO1xuICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QgJiYgY3VycmVudCAhPT0gRnVuY3Rpb24pIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gTWV0YWRhdGEudmFsaWRhdGlvbkZvcihjdXJyZW50LCBwcm9wIGFzIGFueSk7XG4gICAgaWYgKHZhbGlkYXRpb24pIHJldHVybiB2YWxpZGF0aW9uIGFzIGFueTtcbiAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFR5cGVBY3Jvc3NJbmhlcml0YW5jZShtb2RlbDogQ29uc3RydWN0b3I8YW55PiwgcHJvcDogc3RyaW5nKTogYW55IHtcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG1vZGVsO1xuICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QgJiYgY3VycmVudCAhPT0gRnVuY3Rpb24pIHtcbiAgICBjb25zdCB0eXBlID0gTWV0YWRhdGEudHlwZShjdXJyZW50LCBwcm9wKTtcbiAgICBpZiAodHlwZSkgcmV0dXJuIHR5cGU7XG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXREdG9DYWNoZShcbiAgb3A6IE9wZXJhdGlvbktleXNcbik6IFdlYWtNYXA8Q29uc3RydWN0b3I8YW55PiwgQ29uc3RydWN0b3I8YW55Pj4ge1xuICBpZiAoIWR0b0NhY2hlLmhhcyhvcCkpIHtcbiAgICBkdG9DYWNoZS5zZXQob3AsIG5ldyBXZWFrTWFwKCkpO1xuICB9XG4gIHJldHVybiBkdG9DYWNoZS5nZXQob3ApITtcbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIENvbnRleHRPZiwgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG4oQWRhcHRlciBhcyBhbnkpLnRyYW5zZm9ybWVyRm9yID0gZnVuY3Rpb24gdG9Db250ZXh0RmxhZ3M8XG4gIEEgZXh0ZW5kcyBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4sXG4+KGFkYXB0ZXI6IEEgfCBzdHJpbmcpOiBDb25zdHJ1Y3RvcjxSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8Q29udGV4dE9mPEE+Pj4ge1xuICBjb25zdCBhbGlhcyA9XG4gICAgdHlwZW9mIGFkYXB0ZXIgPT09IFwic3RyaW5nXCIgPyBhZGFwdGVyIDogKGFkYXB0ZXIuYWxpYXMgYXMgc3RyaW5nKTtcbiAgcmV0dXJuIE1ldGFkYXRhW1wiaW5uZXJHZXRcIl0oU3ltYm9sLmZvcihcInRyYW5zZm9ybWVyc1wiKSwgYWxpYXMpO1xufS5iaW5kKEFkYXB0ZXIpO1xuXG4oQWRhcHRlciBhcyBhbnkpLmZsYXZvdXJzVG9UcmFuc2Zvcm0gPSBmdW5jdGlvbiByZXF1ZXN0VHJhbnNmb3JtZXJzKCk6XG4gIHwgc3RyaW5nW11cbiAgfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXRhID0gTWV0YWRhdGFbXCJpbm5lckdldFwiXShTeW1ib2wuZm9yKFwidHJhbnNmb3JtZXJzXCIpKTtcbiAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gT2JqZWN0LmtleXMobWV0YSk7XG59LmJpbmQoQWRhcHRlcik7XG5cbihDb250ZXh0IGFzIGFueSkucHJvdG90eXBlLnRvUmVzcG9uc2UgPSBmdW5jdGlvbiB0b1Jlc3BvbnNlPFxuICBSRVMgZXh0ZW5kcyB7IGhlYWRlcjogYW55IH0sXG4+KHRoaXM6IENvbnRleHQsIHJlczogUkVTKTogUkVTIHtcbiAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZygpO1xuICBpZiAocGVuZGluZykgcmVzLmhlYWRlcihcIngtcGVuZGluZy10YXNrXCIsIEpTT04uc3RyaW5naWZ5KHBlbmRpbmcpKTtcbiAgcmV0dXJuIHJlcztcbn07XG4iLCJpbXBvcnQgXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbEJ1aWxkZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSBcIi4uL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvZGVjb3JhdG9yc1wiO1xuXG5kZWNsYXJlIG1vZHVsZSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiIHtcbiAgZXhwb3J0IGludGVyZmFjZSBNb2RlbEJ1aWxkZXI8TT4ge1xuICAgIEF1dGgobW9kZWw6IHN0cmluZyB8IENvbnN0cnVjdG9yKTogTW9kZWxCdWlsZGVyPE0+O1xuICAgIGRlY29yYXRlQ2xhc3MoZGVjb3JhdG9yOiBDbGFzc0RlY29yYXRvcik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgfVxufVxuXG5jb25zdCBwcm90b3R5cGUgPSBNb2RlbEJ1aWxkZXIucHJvdG90eXBlIGFzIE1vZGVsQnVpbGRlcjxhbnk+ICYge1xuICBBdXRoOiAobW9kZWw6IHN0cmluZyB8IENvbnN0cnVjdG9yKSA9PiBNb2RlbEJ1aWxkZXI8YW55Pjtcbn07XG5cbmlmICghcHJvdG90eXBlLmRlY29yYXRlQ2xhc3MpIHtcbiAgcHJvdG90eXBlLmRlY29yYXRlQ2xhc3MgPSBmdW5jdGlvbiAoZGVjb3JhdG9yOiBDbGFzc0RlY29yYXRvcikge1xuICAgIGlmICghKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzKSB7XG4gICAgICAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMgPSBbXTtcbiAgICB9XG4gICAgKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzLnB1c2goZGVjb3JhdG9yKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxucHJvdG90eXBlLkF1dGggPSBmdW5jdGlvbiAobW9kZWw6IHN0cmluZyB8IENvbnN0cnVjdG9yKSB7XG4gIHJldHVybiB0aGlzLmRlY29yYXRlQ2xhc3MoQXV0aChtb2RlbCkpO1xufTtcblxuaWYgKCEocHJvdG90eXBlIGFzIGFueSkuX19oYXNDbGFzc0RlY29yYXRvclN1cHBvcnQpIHtcbiAgY29uc3Qgb3JpZ2luYWxCdWlsZCA9IHByb3RvdHlwZS5idWlsZDtcbiAgcHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCByZXN1bHQgPSBvcmlnaW5hbEJ1aWxkLmNhbGwodGhpcyk7XG4gICAgY29uc3QgZGVjb3JhdG9ycyA9ICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycztcbiAgICBpZiAoZGVjb3JhdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRlZCA9IGRlY29yYXRvcihyZXN1bHQgYXMgYW55KSBhcyB0eXBlb2YgcmVzdWx0IHwgdm9pZDtcbiAgICAgICAgaWYgKGRlY29yYXRlZCkge1xuICAgICAgICAgIHJlc3VsdCA9IGRlY29yYXRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICAocHJvdG90eXBlIGFzIGFueSkuX19oYXNDbGFzc0RlY29yYXRvclN1cHBvcnQgPSB0cnVlO1xufVxuIiwiaW1wb3J0IHsgQ29udHJvbGxlciwgUGFyYW0sIFF1ZXJ5LCBSZXNwb25zZSwgU2V0TWV0YWRhdGEgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7XG4gIEFwaUJhZFJlcXVlc3RSZXNwb25zZSxcbiAgQXBpQm9keSxcbiAgQXBpQ3JlYXRlZFJlc3BvbnNlLFxuICBBcGlFeHRyYU1vZGVscyxcbiAgQXBpTm9Db250ZW50UmVzcG9uc2UsXG4gIEFwaU5vdEZvdW5kUmVzcG9uc2UsXG4gIEFwaU9rUmVzcG9uc2UsXG4gIEFwaU9wZXJhdGlvbixcbiAgQXBpUGFyYW0sXG4gIEFwaVF1ZXJ5LFxuICBBcGlUYWdzLFxuICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2UsXG4gIGdldFNjaGVtYVBhdGgsXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgRGlyZWN0aW9uTGltaXRPZmZzZXQsXG4gIE1vZGVsU2VydmljZSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLFxuICB0eXBlIFJlcG8sXG4gIFJlcG9zaXRvcnksXG4gIFNlcnZpY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnaW5nLCB0b0tlYmFiQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBEQktleXMsXG4gIE9wZXJhdGlvbktleXMsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIEFwaU9wZXJhdGlvbkZyb21Nb2RlbCxcbiAgQXBpUGFyYW1zRnJvbU1vZGVsLFxuICB0eXBlIERlY2FmQXBpUHJvcGVydHksXG4gIERlY2FmQm9keSxcbiAgRGVjYWZQYXJhbXMsXG4gIERlY2FmUXVlcnksXG59IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEh0dHBWZXJiVG9EZWNvcmF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEh0dHBWZXJicyB9IGZyb20gXCIuL2RlY29yYXRvcnMvdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgREVDQUZfQ09OVFJPTExFUl9DT05GSUcsIERFQ0FGX1JPVVRFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU0tJUF9NT0RFTF9ST0xFU19LRVkgfSBmcm9tIFwiLi4vYXV0aC9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGgsIFB1YmxpYywgUmVxdWlyZVJvbGVzIH0gZnJvbSBcIi4uL2F1dGgvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29udHJvbGxlckNvbnN0cnVjdG9yIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmTW9kZWxDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXJzXCI7XG5pbXBvcnQgeyBEdG9Gb3IgfSBmcm9tIFwiLi4vZmFjdG9yeS9vcGVuYXBpL0R0b0J1aWxkZXJcIjtcbmltcG9ydCBcIi4uL292ZXJyaWRlc1wiO1xuaW1wb3J0IHtcbiAgTW9kZWxDb250cm9sbGVyRmFjdG9yeSxcbiAgdHlwZSBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnLFxuICB0eXBlIEF1dGhDb25maWcsXG4gIHR5cGUgU2VydmVyUm91dGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmV4cG9ydCBjbGFzcyBGcm9tTW9kZWxDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9nID0gTG9nZ2luZy5mb3IoRnJvbU1vZGVsQ29udHJvbGxlci5uYW1lKTtcblxuICBzdGF0aWMgZ2V0UGVyc2lzdGVuY2U8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICBNb2RlbENsYXp6OiBNb2RlbENvbnN0cnVjdG9yPFQ+XG4gICk6IFJlcG88VD4gfCBNb2RlbFNlcnZpY2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gU2VydmljZS5nZXQ8TW9kZWxTZXJ2aWNlPFQ+PihNb2RlbENsYXp6KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gTW9kZWxTZXJ2aWNlLmdldFNlcnZpY2UoTW9kZWxDbGF6eikgYXMgTW9kZWxTZXJ2aWNlPFQ+O1xuICAgICAgfSBjYXRjaCAoZTI6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIFJlcG9zaXRvcnkuZm9yTW9kZWwoTW9kZWxDbGF6eikgYXMgUmVwbzxUPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUXVlcnlSb3V0ZXNGcm9tUmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgIHBlcnNpc3RlbmNlOiBSZXBvPFQ+IHwgTW9kZWxTZXJ2aWNlPFQ+LFxuICAgIHByZWZpeDogc3RyaW5nID0gUGVyc2lzdGVuY2VLZXlzLlFVRVJZXG4gICk6IENvbnRyb2xsZXJDb25zdHJ1Y3RvcjxUPiB7XG4gICAgY29uc3QgcmVwbzogUmVwbzxUPiA9XG4gICAgICBwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSA/IHBlcnNpc3RlbmNlLnJlcG8gOiBwZXJzaXN0ZW5jZTtcbiAgICBjb25zdCBNb2RlbENvbnN0cjogQ29uc3RydWN0b3IgPSByZXBvLmNsYXNzO1xuICAgIGNvbnN0IHF1ZXJ5TWV0aG9kczogUmVjb3JkPHN0cmluZywgeyBmaWVsZHM/OiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB9PiA9XG4gICAgICBNZXRhZGF0YS5nZXQoXG4gICAgICAgIHJlcG8uY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIE1ldGFkYXRhLmtleShQZXJzaXN0ZW5jZUtleXMuUVVFUlkpXG4gICAgICApID8/IHt9O1xuXG4gICAgY29uc3Qgcm91dGVNZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIE1ldGFkYXRhLmdldChcbiAgICAgICAgcGVyc2lzdGVuY2UuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIE1ldGFkYXRhLmtleShERUNBRl9ST1VURSlcbiAgICAgICkgPz8ge307XG5cbiAgICBjbGFzcyBRdWVyeUNvbnRyb2xsZXIgZXh0ZW5kcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxUPiB7XG4gICAgICBvdmVycmlkZSBnZXQgY2xhc3MoKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgICAgfVxuICAgICAgY29uc3RydWN0b3IoY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNsaWVudENvbnRleHQsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIHBhcmFtc10gb2YgT2JqZWN0LmVudHJpZXMocm91dGVNZXRob2RzKSkge1xuICAgICAgY29uc3Qgcm91dGVQYXRoID0gW3BhcmFtcy5wYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpXVxuICAgICAgICAuZmlsdGVyKChzZWdtZW50OiBzdHJpbmcpID0+IHNlZ21lbnQgJiYgc2VnbWVudC50cmltKCkpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgaGFuZGxlciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihcbiAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgKSBhcyBhbnk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChcbiAgICAgICAgUXVlcnlDb250cm9sbGVyLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBoYW5kbGVyXG4gICAgICApO1xuXG4gICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihwYXJhbXMuaHR0cE1ldGhvZCBhcyBIdHRwVmVyYnMpKHJvdXRlUGF0aCB8fCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgIHBhcmFtcy5odHRwTWV0aG9kXG4gICAgICApO1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5hcHBseURlY29yYXRvcnMoXG4gICAgICAgIFF1ZXJ5Q29udHJvbGxlcixcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgW2h0dHBEZWNvcmF0b3IsIC4uLmRlY29yYXRvcnNdXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIG9ialZhbHVlc10gb2YgT2JqZWN0LmVudHJpZXMocXVlcnlNZXRob2RzKSkge1xuICAgICAgY29uc3QgZmllbGRzID0gb2JqVmFsdWVzLmZpZWxkcyA/PyBbXTtcbiAgICAgIGNvbnN0IHJvdXRlUGF0aCA9IFtwcmVmaXgsIG1ldGhvZE5hbWUsIC4uLmZpZWxkcy5tYXAoKGYpID0+IGA6JHtmfWApXVxuICAgICAgICAuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50ICYmIHNlZ21lbnQudHJpbSgpKVxuICAgICAgICAuam9pbihcIi9cIik7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIoXG4gICAgICAgIG1ldGhvZE5hbWVcbiAgICAgICkgYXMgYW55O1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWZpbmVNZXRob2QoXG4gICAgICAgIFF1ZXJ5Q29udHJvbGxlcixcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgaGFuZGxlclxuICAgICAgKTtcblxuICAgICAgY29uc3QgaHR0cERlY29yYXRvciA9IEh0dHBWZXJiVG9EZWNvcmF0b3IoXCJHRVRcIiBhcyBIdHRwVmVyYnMpKHJvdXRlUGF0aCB8fCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgIFwiR0VUXCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmFwcGx5RGVjb3JhdG9ycyhcbiAgICAgICAgUXVlcnlDb250cm9sbGVyLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBbaHR0cERlY29yYXRvciwgLi4uZGVjb3JhdG9yc11cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFF1ZXJ5Q29udHJvbGxlcjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGU8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPFQ+LFxuICAgIG1vZHVsZUNvbmZpZ092ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+LFxuICAgIGdsb2JhbERlZmF1bHRzPzogUGFydGlhbDxNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnPlxuICApOiBDb250cm9sbGVyQ29uc3RydWN0b3I8VD4ge1xuICAgIGNvbnN0IGxvZyA9IEZyb21Nb2RlbENvbnRyb2xsZXIubG9nLmZvcihGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKE1vZGVsQ29uc3RyKTtcbiAgICBjb25zdCByb3V0ZVBhdGggPSB0b0tlYmFiQ2FzZSh0YWJsZU5hbWUpO1xuICAgIGNvbnN0IG1vZGVsQ2xhenpOYW1lID0gTW9kZWxDb25zdHIubmFtZTtcbiAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UGVyc2lzdGVuY2UoTW9kZWxDb25zdHIpO1xuXG4gICAgLy8gV2hlbiBwZXJzaXN0ZW5jZSBpcyBhIE1vZGVsU2VydmljZSwgdGhlIEBxdWVyeS9Acm91dGUgbWV0YWRhdGEgbGl2ZXMgb25cbiAgICAvLyB0aGUgdW5kZXJseWluZyByZXBvc2l0b3J5IGNsYXNzIChjdXN0b20gcmVwbyksIG5vdCBvbiBNb2RlbFNlcnZpY2UgaXRzZWxmLlxuICAgIC8vIFBhc3MgdGhlIHJlcG8gdG8gdGhlIGZhY3Rvcnkgc28gYWRkQ29tcGxleFF1ZXJpZXMoKSBjYW4gZGlzY292ZXIgdGhlbS5cbiAgICBjb25zdCBmYWN0b3J5UGVyc2lzdGVuY2UgPVxuICAgICAgcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBNb2RlbFNlcnZpY2UgPyBwZXJzaXN0ZW5jZS5yZXBvIDogcGVyc2lzdGVuY2U7XG5cbiAgICBjb25zdCBkZWNvcmF0b3JDb25maWcgPSBNZXRhZGF0YS5nZXQoXG4gICAgICBNb2RlbENvbnN0cixcbiAgICAgIE1ldGFkYXRhLmtleShERUNBRl9DT05UUk9MTEVSX0NPTkZJRylcbiAgICApIGFzIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbW9kdWxlT3ZlcnJpZGUgPSBtb2R1bGVDb25maWdPdmVycmlkZXM/LltNb2RlbENvbnN0ci5uYW1lXTtcbiAgICBjb25zdCBtZXJnZWRDb25maWc6IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgPSB7XG4gICAgICAuLi4oZ2xvYmFsRGVmYXVsdHMgfHwge30pLFxuICAgICAgLi4uKGRlY29yYXRvckNvbmZpZyB8fCB7fSksXG4gICAgICAuLi4obW9kdWxlT3ZlcnJpZGUgfHwge30pLFxuICAgIH07XG5cbiAgICBjb25zdCBGYWN0b3J5Q29udHJvbGxlciA9IE1vZGVsQ29udHJvbGxlckZhY3RvcnkuY3JlYXRlPFQ+KFxuICAgICAgTW9kZWxDb25zdHIsXG4gICAgICBmYWN0b3J5UGVyc2lzdGVuY2UsXG4gICAgICBtZXJnZWRDb25maWdcbiAgICApO1xuICAgIGNvbnN0IGZhY3RvcnlSb3V0ZXMgPSAoRmFjdG9yeUNvbnRyb2xsZXIgYXMgYW55KS5fX3JvdXRlc19fIGFzXG4gICAgICB8IFNlcnZlclJvdXRlW11cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgeyBnZXRQSywgYXBpUHJvcGVydGllcywgcGF0aDogcGtQYXRoIH0gPVxuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5nZXRSb3V0ZVBhcmFtZXRlcnNGcm9tTW9kZWwoTW9kZWxDb25zdHIpO1xuXG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIGNvbnRyb2xsZXIgZm9yIG1vZGVsOiAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7ZmFjdG9yeVJvdXRlcz8ubGVuZ3RoID8/IDB9IGZhY3Rvcnkgcm91dGVzYFxuICAgICk7XG5cbiAgICBjb25zdCBhdXRoQ29uZmlnOiBBdXRoQ29uZmlnIHwgdW5kZWZpbmVkID0gbWVyZ2VkQ29uZmlnLmF1dGg7XG5cbiAgICBmdW5jdGlvbiBhcHBseUNsYXNzQXV0aCh0YXJnZXQ6IGFueSkge1xuICAgICAgaWYgKGF1dGhDb25maWc/LnB1YmxpYykge1xuICAgICAgICBQdWJsaWMoKSh0YXJnZXQpO1xuICAgICAgfSBlbHNlIGlmIChhdXRoQ29uZmlnPy5yb2xlcz8ubGVuZ3RoKSB7XG4gICAgICAgIFJlcXVpcmVSb2xlcyguLi5hdXRoQ29uZmlnLnJvbGVzKSh0YXJnZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQXV0aChNb2RlbENvbnN0cikodGFyZ2V0KTtcbiAgICAgIH1cbiAgICAgIGlmIChhdXRoQ29uZmlnPy5za2lwTW9kZWxSb2xlcykge1xuICAgICAgICBTZXRNZXRhZGF0YShTS0lQX01PREVMX1JPTEVTX0tFWSwgdHJ1ZSkodGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBAQ29udHJvbGxlcihyb3V0ZVBhdGgpXG4gICAgQEFwaVRhZ3MobW9kZWxDbGF6ek5hbWUpXG4gICAgQEFwaUV4dHJhTW9kZWxzKE1vZGVsQ29uc3RyKVxuICAgIGNsYXNzIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgZXh0ZW5kcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxUPiB7XG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHBrOiBzdHJpbmcgPSBNb2RlbC5wayhNb2RlbENvbnN0cikgYXMgc3RyaW5nO1xuXG4gICAgICBwcm90ZWN0ZWQgc3RhdGljIGdldCBjbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIE1vZGVsQ29uc3RyO1xuICAgICAgfVxuXG4gICAgICBvdmVycmlkZSBnZXQgY2xhc3MoKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB7XG4gICAgICAgIHJldHVybiBNb2RlbENvbnN0cjtcbiAgICAgIH1cblxuICAgICAgY29uc3RydWN0b3IoY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCkge1xuICAgICAgICBzdXBlcihjbGllbnRDb250ZXh0LCBEeW5hbWljTW9kZWxDb250cm9sbGVyLm5hbWUpO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgUmVnaXN0ZXJpbmcgZHluYW1pYyBjb250cm9sbGVyIGZvciBtb2RlbDogJHt0aGlzLmNsYXNzLm5hbWV9IHJvdXRlOiAvJHtyb3V0ZVBhdGh9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFwcGx5Q2xhc3NBdXRoKER5bmFtaWNNb2RlbENvbnRyb2xsZXIpO1xuXG4gICAgaWYgKGZhY3RvcnlSb3V0ZXMpIHtcbiAgICAgIGNvbnN0IHNvcnRlZFJvdXRlcyA9IFsuLi5mYWN0b3J5Um91dGVzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFTZWdtZW50cyA9IGEucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBjb25zdCBiU2VnbWVudHMgPSBiLnBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgY29uc3QgYVBhcmFtQ291bnQgPSBhU2VnbWVudHMuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGJQYXJhbUNvdW50ID0gYlNlZ21lbnRzLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSkubGVuZ3RoO1xuICAgICAgICBjb25zdCBhTGl0ZXJhbENvdW50ID0gYVNlZ21lbnRzLmxlbmd0aCAtIGFQYXJhbUNvdW50O1xuICAgICAgICBjb25zdCBiTGl0ZXJhbENvdW50ID0gYlNlZ21lbnRzLmxlbmd0aCAtIGJQYXJhbUNvdW50O1xuICAgICAgICBpZiAoYUxpdGVyYWxDb3VudCAhPT0gYkxpdGVyYWxDb3VudClcbiAgICAgICAgICByZXR1cm4gYkxpdGVyYWxDb3VudCAtIGFMaXRlcmFsQ291bnQ7XG4gICAgICAgIGlmIChhUGFyYW1Db3VudCAhPT0gYlBhcmFtQ291bnQpXG4gICAgICAgICAgcmV0dXJuIGFQYXJhbUNvdW50IC0gYlBhcmFtQ291bnQ7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNvcnRlZFJvdXRlcykge1xuICAgICAgICBjb25zdCByZWdpc3RyYXRpb24gPSBGcm9tTW9kZWxDb250cm9sbGVyLm1hdGNoUm91dGUoXG4gICAgICAgICAgcm91dGUsXG4gICAgICAgICAgcGtQYXRoLFxuICAgICAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICAgICAgZ2V0UEssXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgZmFjdG9yeVBlcnNpc3RlbmNlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVnaXN0cmF0aW9uKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCB7IG1ldGhvZE5hbWUsIGhhbmRsZXIsIGRlY29yYXRvcnMsIHBhcmFtRGVjb3JhdG9ycyB9ID1cbiAgICAgICAgICByZWdpc3RyYXRpb247XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZGVmaW5lTWV0aG9kKFxuICAgICAgICAgIER5bmFtaWNNb2RlbENvbnRyb2xsZXIsXG4gICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICBoYW5kbGVyXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihyb3V0ZS5tZXRob2QgYXMgSHR0cFZlcmJzKShcbiAgICAgICAgICAgIHJvdXRlLnBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIikgfHwgdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmFwcGx5RGVjb3JhdG9ycyhcbiAgICAgICAgICAgIER5bmFtaWNNb2RlbENvbnRyb2xsZXIsXG4gICAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgICAgW2h0dHBEZWNvcmF0b3IsIC4uLmRlY29yYXRvcnNdLFxuICAgICAgICAgICAgcGFyYW1EZWNvcmF0b3JzXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBEeW5hbWljTW9kZWxDb250cm9sbGVyIGFzIGFueTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZVBhcmFtZXRlcnNGcm9tTW9kZWw8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ2xheno6IE1vZGVsQ29uc3RydWN0b3I8VD5cbiAgKToge1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXTtcbiAgICBnZXRQSzogKC4uLnBhcmFtczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBwayA9IE1vZGVsLnBrKE1vZGVsQ2xhenopIGFzIGtleW9mIE1vZGVsPGFueT47XG4gICAgY29uc3QgY29tcG9zZWQgPSBNZXRhZGF0YS5nZXQoXG4gICAgICBNb2RlbENsYXp6LFxuICAgICAgTWV0YWRhdGEua2V5KERCS2V5cy5DT01QT1NFRCwgcGspXG4gICAgKTtcbiAgICBjb25zdCBjb21wb3NlZEtleXMgPSBjb21wb3NlZD8uYXJncyA/PyBbXTtcblxuICAgIGNvbnN0IHVuaXF1ZUtleXMgPVxuICAgICAgQXJyYXkuaXNBcnJheShjb21wb3NlZEtleXMpICYmIGNvbXBvc2VkS2V5cy5sZW5ndGggPiAwXG4gICAgICAgID8gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5jb21wb3NlZEtleXNdKSlcbiAgICAgICAgOiBBcnJheS5mcm9tKG5ldyBTZXQoW3BrXSkpO1xuXG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBNZXRhZGF0YS5kZXNjcmlwdGlvbihNb2RlbENsYXp6KSA/PyBcIlwiO1xuICAgIGNvbnN0IHBhdGggPSBgOiR7dW5pcXVlS2V5cy5qb2luKFwiLzpcIil9YDtcbiAgICBjb25zdCBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10gPSB1bmlxdWVLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBNZXRhZGF0YS5kZXNjcmlwdGlvbihNb2RlbENsYXp6LCBrZXkpLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgZ2V0UEs6ICguLi5wYXJhbXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+XG4gICAgICAgIGNvbXBvc2VkPy5zZXBhcmF0b3IgPyBwYXJhbXMuam9pbihjb21wb3NlZC5zZXBhcmF0b3IpIDogcGFyYW1zLmpvaW4oXCJcIiksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRlZmluZU1ldGhvZChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgKTogUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICB0YXJnZXQucHJvdG90eXBlIHx8IHRhcmdldCxcbiAgICAgIG1ldGhvZE5hbWUsXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiBoYW5kbGVyLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgdGFyZ2V0LnByb3RvdHlwZSB8fCB0YXJnZXQsXG4gICAgICBtZXRob2ROYW1lXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFwcGx5RGVjb3JhdG9ycyhcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgbWV0aG9kRGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPixcbiAgICBwYXJhbURlY29yYXRvcnM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4gPSBbXVxuICApIHtcbiAgICBjb25zdCBwcm90byA9IHRhcmdldD8ucHJvdG90eXBlID8/IHRhcmdldDtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbWV0aG9kTmFtZSk7XG4gICAgbWV0aG9kRGVjb3JhdG9ycy5mb3JFYWNoKChkKSA9PiBkKHByb3RvLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSk7XG4gICAgcGFyYW1EZWNvcmF0b3JzLmZvckVhY2goKHsgZGVjb3JhdG9yLCBpbmRleCB9KSA9PlxuICAgICAgZGVjb3JhdG9yKHByb3RvLCBtZXRob2ROYW1lLCBpbmRleClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWF0Y2hSb3V0ZShcbiAgICByb3V0ZTogU2VydmVyUm91dGUsXG4gICAgcGtQYXRoOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIGdldFBLOiAoLi4ucDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nLFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBwZXJzaXN0ZW5jZT86IGFueVxuICApOiB7XG4gICAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuICAgIGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD47XG4gICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+O1xuICB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB7IG1ldGhvZCwgcGF0aCB9ID0gcm91dGU7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpO1xuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQT1NUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJjcmVhdGVcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDcmVhdGVIYW5kbGVyKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSwgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJjcmVhdGVBbGxcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVCdWxrQ3JlYXRlSGFuZGxlcihNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtDcmVhdGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFt7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LCB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwicmVhZEFsbFwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUJ1bGtSZWFkSGFuZGxlcihtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa1JlYWREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFt7IGRlY29yYXRvcjogUXVlcnkoXCJpZHNcIikgYXMgYW55LCBpbmRleDogMCB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInVwZGF0ZUFsbFwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUJ1bGtVcGRhdGVIYW5kbGVyKG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrVXBkYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSwgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImRlbGV0ZUFsbFwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUJ1bGtEZWxldGVIYW5kbGVyKG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrRGVsZXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IFF1ZXJ5KFwiaWRzXCIpIGFzIGFueSwgaW5kZXg6IDAgfSwgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJyZWFkXCIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVhZEhhbmRsZXIoZ2V0UEssIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yZWFkRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMsIHBrUGF0aCksXG4gICAgICAgIFt7IGRlY29yYXRvcjogRGVjYWZQYXJhbXMoYXBpUHJvcGVydGllcykgYXMgYW55LCBpbmRleDogMCB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJ1cGRhdGVcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVVcGRhdGVIYW5kbGVyKGdldFBLLCBNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnVwZGF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBhcGlQcm9wZXJ0aWVzLCBwa1BhdGgpLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmUGFyYW1zKGFwaVByb3BlcnRpZXMpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDIgfSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJkZWxldGVcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVEZWxldGVIYW5kbGVyKGdldFBLLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVsZXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMsIHBrUGF0aCksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZQYXJhbXMoYXBpUHJvcGVydGllcykgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb21wb3NlZCBQSyBmYWxsYmFjayByb3V0ZXMgKGZpbHRlckVtcHR5KSDigJQgcGF0aCBkaWZmZXJzIGZyb20gcGtQYXRoXG4gICAgY29uc3QgZmFsbGJhY2tTZWdtZW50cyA9IG5vcm1hbGl6ZWRQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgaXNBbGxQYXJhbXMgPSBmYWxsYmFja1NlZ21lbnRzLmxlbmd0aCA+IDAgJiYgZmFsbGJhY2tTZWdtZW50cy5ldmVyeSgocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgaWYgKGlzQWxsUGFyYW1zICYmIG5vcm1hbGl6ZWRQYXRoICE9PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrQXBpUHJvcHMgPSBmYWxsYmFja1NlZ21lbnRzLm1hcCgocykgPT4gcy5zbGljZSgxKSkubWFwKChuYW1lKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyYCxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IHN1ZmZpeCA9IGZhbGxiYWNrU2VnbWVudHMubWFwKChzKSA9PiBzLnNsaWNlKDEpKS5qb2luKFwiQW5kXCIpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgICAgYHJlYWRCeSR7c3VmZml4fWAsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWFkSGFuZGxlcihnZXRQSywgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucmVhZERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBmYWxsYmFja0FwaVByb3BzLCBub3JtYWxpemVkUGF0aCksXG4gICAgICAgICAgW3sgZGVjb3JhdG9yOiBEZWNhZlBhcmFtcyhmYWxsYmFja0FwaVByb3BzKSBhcyBhbnksIGluZGV4OiAwIH1dXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgdXBkYXRlQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlVXBkYXRlSGFuZGxlcihnZXRQSywgTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnVwZGF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBmYWxsYmFja0FwaVByb3BzLCBub3JtYWxpemVkUGF0aCksXG4gICAgICAgICAgW1xuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmUGFyYW1zKGZhbGxiYWNrQXBpUHJvcHMpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAyIH0sXG4gICAgICAgICAgXVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJERUxFVEVcIikge1xuICAgICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgICAgYGRlbGV0ZUJ5JHtzdWZmaXh9YCxcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZURlbGV0ZUhhbmRsZXIoZ2V0UEssIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlbGV0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBmYWxsYmFja0FwaVByb3BzLCBub3JtYWxpemVkUGF0aCksXG4gICAgICAgICAgW1xuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmUGFyYW1zKGZhbGxiYWNrQXBpUHJvcHMpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgICBdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJzdGF0ZW1lbnQvOm1ldGhvZC8qYXJnc1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwic3RhdGVtZW50XCIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlU3RhdGVtZW50SGFuZGxlcihtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50RGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFBhcmFtKFwibWV0aG9kXCIpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogUGFyYW0oXCJhcmdzXCIpIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZRdWVyeSgpIGFzIGFueSwgaW5kZXg6IDIgfSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRSb3V0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBcImxpc3RCeS86a2V5XCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZLFxuICAgICAgXCJwYWdpbmF0ZUJ5LzprZXkvOnBhZ2VcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksXG4gICAgICBcImZpbmQvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELFxuICAgICAgXCJwYWdlLzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRSxcbiAgICAgIFwiZmluZE9uZUJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWSxcbiAgICAgIFwiZmluZEJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLFxuICAgICAgXCJjb3VudE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YsXG4gICAgICBcIm1heE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLFxuICAgICAgXCJtaW5PZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1JTl9PRixcbiAgICAgIFwiYXZnT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsXG4gICAgICBcInN1bU9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GLFxuICAgICAgXCJkaXN0aW5jdE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0YsXG4gICAgICBcImdyb3VwT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRixcbiAgICB9O1xuXG4gICAgY29uc3Qgc3RhdGVtZW50S2V5ID0gc3RhdGVtZW50Um91dGVzW25vcm1hbGl6ZWRQYXRoXTtcbiAgICBpZiAoc3RhdGVtZW50S2V5ICYmIG1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudE1ldGhvZE5hbWUobm9ybWFsaXplZFBhdGgpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVN0YXRlbWVudFNob3J0Y3V0SGFuZGxlcihzdGF0ZW1lbnRLZXksIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBub3JtYWxpemVkUGF0aCwgc3RhdGVtZW50S2V5KSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgICBjb25zdCBxdWVyeU1ldGhvZCA9IG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL15xdWVyeVxcLy8sIFwiXCIpLnNwbGl0KFwiL1wiKVswXTtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgcXVlcnlNZXRob2QsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihxdWVyeU1ldGhvZCksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKHF1ZXJ5TWV0aG9kLCBub3JtYWxpemVkUGF0aCwgXCJHRVRcIiwgdHJ1ZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY29tcGxleFF1ZXJ5UGFyYW1zKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgY3VzdG9tIEByb3V0ZSgpIHBhdGhzIChlLmcuIFwibWV0YWRhdGEvZm9yLXByb2R1Y3QvOnByb2R1Y3RDb2RlXCIpXG4gICAgY29uc3QgcGF0aFNlZ21lbnRzID0gbm9ybWFsaXplZFBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBrbm93blByZWZpeGVzID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgICAgIFwibGlzdEJ5XCIsIFwiZmluZEJ5XCIsIFwiZmluZEJ5UGFnaW5hdGVcIiwgXCJmaW5kT25lQnlcIiwgXCJwYWdpbmF0ZUJ5XCIsXG4gICAgICBcImZpbmRcIiwgXCJwYWdlXCIsIFwiY291bnRPZlwiLCBcIm1heE9mXCIsIFwibWluT2ZcIiwgXCJhdmdPZlwiLCBcInN1bU9mXCIsXG4gICAgICBcImRpc3RpbmN0T2ZcIiwgXCJncm91cE9mXCIsIFwic3RhdGVtZW50XCIsIFwiYnVsa1wiLCBcInF1ZXJ5XCIsXG4gICAgXSk7XG4gICAgaWYgKFxuICAgICAgcGF0aFNlZ21lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKFwicXVlcnkvXCIpICYmXG4gICAgICAha25vd25QcmVmaXhlcy5oYXMocGF0aFNlZ21lbnRzWzBdKVxuICAgICkge1xuICAgICAgLy8gTG9vayB1cCB0aGUgYWN0dWFsIG1ldGhvZCBuYW1lIGZyb20gQHJvdXRlIG1ldGFkYXRhIGJ5IG1hdGNoaW5nIHRoZSBwYXRoLlxuICAgICAgLy8gVGhlIEByb3V0ZSBkZWNvcmF0b3Igc3RvcmVzIHsgcGF0aCwgaHR0cE1ldGhvZCwgaGFuZGxlciB9IGtleWVkIGJ5IG1ldGhvZCBuYW1lXG4gICAgICAvLyBvbiB0aGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3Rvci5cbiAgICAgIGNvbnN0IHJvdXRlTWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPVxuICAgICAgICBNZXRhZGF0YS5nZXQoXG4gICAgICAgICAgKHBlcnNpc3RlbmNlIGFzIGFueSk/LmNvbnN0cnVjdG9yLFxuICAgICAgICAgIE1ldGFkYXRhLmtleShERUNBRl9ST1VURSlcbiAgICAgICAgKSA/PyB7fTtcbiAgICAgIGNvbnN0IG1hdGNoZWRFbnRyeSA9IE9iamVjdC5lbnRyaWVzKHJvdXRlTWV0YWRhdGEpLmZpbmQoXG4gICAgICAgIChbLCBpbmZvXSkgPT5cbiAgICAgICAgICBpbmZvICYmXG4gICAgICAgICAgdHlwZW9mIGluZm8gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICBpbmZvLnBhdGg/LnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpID09PSBub3JtYWxpemVkUGF0aFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGFjdHVhbE1ldGhvZE5hbWUgPSBtYXRjaGVkRW50cnk/LlswXSB8fCBwYXRoU2VnbWVudHNbMF07XG5cbiAgICAgIGNvbnN0IHBhcmFtU2VnbWVudHMgPSBwYXRoU2VnbWVudHMuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICAgIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBwYXJhbVNlZ21lbnRzLm1hcCgocykgPT4gcy5zbGljZSgxKSkubWFwKChuYW1lKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIGFjdHVhbE1ldGhvZE5hbWUsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ3VzdG9tUm91dGVIYW5kbGVyKGFjdHVhbE1ldGhvZE5hbWUpLFxuICAgICAgICBbXG4gICAgICAgICAgLi4uYXBpUGF0aFBhcmFtcy5tYXAoKHApID0+IEFwaVBhcmFtKHApKSxcbiAgICAgICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBcIiR7YWN0dWFsTWV0aG9kTmFtZX1cIi5gIH0pLFxuICAgICAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJSZXN1bHQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC5cIiB9KSxcbiAgICAgICAgICBBcGlOb0NvbnRlbnRSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIk5vIGNvbnRlbnQgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC5cIiB9KSxcbiAgICAgICAgXSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jb21wbGV4UXVlcnlQYXJhbXMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICAgIGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4sXG4gICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+XG4gICkge1xuICAgIHJldHVybiB7IG1ldGhvZE5hbWUsIGhhbmRsZXIsIGRlY29yYXRvcnMsIHBhcmFtRGVjb3JhdG9ycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50TWV0aG9kTmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZpcnN0U2VnbWVudCA9IHBhdGguc3BsaXQoXCIvXCIpWzBdO1xuICAgIHJldHVybiBmaXJzdFNlZ21lbnQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgIGNvbnN0IHBhcmFtczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZywgaSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHNlZy5yZXBsYWNlKFwiOlwiLCBcIlwiKTtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBQYXJhbShuYW1lKSBhcyBhbnksIGluZGV4OiBpIH0pO1xuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImxpc3RCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kL1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIilcbiAgICApIHtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogc2VnbWVudHMubGVuZ3RoIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY29tcGxleFF1ZXJ5UGFyYW1zKFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgY29uc3QgcGFyYW1zOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnLCBpKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IFBhcmFtKG5hbWUpIGFzIGFueSwgaW5kZXg6IGkgfSk7XG4gICAgfSk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSkge1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiBzZWdtZW50cy5sZW5ndGggfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDcmVhdGVIYW5kbGVyKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY3JlYXRlKFxuICAgICAgdGhpczogYW55LFxuICAgICAgZGF0YTogYW55LFxuICAgICAgcmVzcD86IGFueVxuICAgICk6IFByb21pc2U8TW9kZWw8YW55Pj4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgT3BlcmF0aW9uS2V5cy5DUkVBVEUsIHRydWUpXG4gICAgICApLmZvcihjcmVhdGUpO1xuICAgICAgbG9nLnZlcmJvc2UoYGNyZWF0aW5nIG5ldyAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgbGV0IGNyZWF0ZWQ6IE1vZGVsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY3JlYXRlZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5jcmVhdGUoZGF0YSwgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIG5ldyAke21vZGVsQ2xhenpOYW1lfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYGNyZWF0ZWQgbmV3ICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHsoY3JlYXRlZCBhcyBhbnkpW3RoaXMucGtdfWApO1xuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUJ1bGtDcmVhdGVIYW5kbGVyKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY3JlYXRlQWxsKFxuICAgICAgdGhpczogYW55LFxuICAgICAgZGF0YTogYW55W10sXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbFtdPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCwgdHJ1ZSlcbiAgICAgICkuZm9yKGNyZWF0ZUFsbCk7XG4gICAgICBsb2cudmVyYm9zZShgY3JlYXRpbmcgbmV3ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICBsZXQgY3JlYXRlZDogYW55W107XG4gICAgICB0cnkge1xuICAgICAgICBjcmVhdGVkID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmNyZWF0ZUFsbChcbiAgICAgICAgICBkYXRhLm1hcCgoZCkgPT4gbmV3IE1vZGVsQ29uc3RyKGQpKSxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIG5ldyAke21vZGVsQ2xhenpOYW1lfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYGNyZWF0ZWQgbmV3ICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHsoY3JlYXRlZCBhcyBhbnkpW3RoaXMucGtdfWApO1xuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUJ1bGtSZWFkSGFuZGxlcihtb2RlbENsYXp6TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHJlYWRBbGwoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBpZHM6IHN0cmluZ1tdXG4gICAgKTogUHJvbWlzZTxNb2RlbFtdPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsIHRydWUpXG4gICAgICApLmZvcihyZWFkQWxsKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZHMgPSBBcnJheS5pc0FycmF5KGlkcykgPyBpZHMgOiBbaWRzXTtcbiAgICAgIGxldCByZWFkOiBNb2RlbFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGByZWFkaW5nICR7bm9ybWFsaXplZElkc30gJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgICAgcmVhZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5yZWFkQWxsKG5vcm1hbGl6ZWRJZHMgYXMgYW55LCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byByZWFkICR7bW9kZWxDbGF6ek5hbWV9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgcmVhZCAke3JlYWQubGVuZ3RofSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgcmV0dXJuIHJlYWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUJ1bGtVcGRhdGVIYW5kbGVyKG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gdXBkYXRlQWxsKFxuICAgICAgdGhpczogYW55LFxuICAgICAgYm9keTogYW55W10sXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsIHRydWUpXG4gICAgICApLmZvcih1cGRhdGVBbGwpO1xuICAgICAgbGV0IHVwZGF0ZWQ6IGFueVtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmluZm8oYHVwZGF0aW5nICR7Ym9keS5sZW5ndGh9ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICAgIHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkudXBkYXRlQWxsKGJvZHksIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVCdWxrRGVsZXRlSGFuZGxlcihtb2RlbENsYXp6TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFsbChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGlkczogc3RyaW5nW10sXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbFtdPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCwgdHJ1ZSlcbiAgICAgICkuZm9yKGRlbGV0ZUFsbCk7XG4gICAgICBjb25zdCBub3JtYWxpemVkSWRzID0gQXJyYXkuaXNBcnJheShpZHMpID8gaWRzIDogW2lkc107XG4gICAgICBsZXQgcmVhZDogTW9kZWxbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgZGVsZXRpbmcgJHtub3JtYWxpemVkSWRzLmxlbmd0aH0gJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgICAgcmVhZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5kZWxldGVBbGwobm9ybWFsaXplZElkcywgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlICR7bW9kZWxDbGF6ek5hbWV9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgZGVsZXRlZCAke3JlYWQubGVuZ3RofSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIHJlYWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVJlYWRIYW5kbGVyKFxuICAgIGdldFBLOiAoLi4ucDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nLFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHJlYWQoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICByb3V0ZVBhcmFtczogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbD4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKVxuICAgICAgKS5mb3IocmVhZCk7XG4gICAgICBjb25zdCBpZCA9IGdldFBLKC4uLnJvdXRlUGFyYW1zLnZhbHVlc0luT3JkZXIpO1xuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgTm8gJHt0aGlzLnBrfSBwcm92aWRlZGApO1xuICAgICAgbGV0IHJlYWRSZXN1bHQ6IE1vZGVsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGByZWFkaW5nICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHt0aGlzLnBrfSAke2lkfWApO1xuICAgICAgICByZWFkUmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnJlYWQoaWQsIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHJlYWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke2lkfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYHJlYWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAkeyhyZWFkUmVzdWx0IGFzIGFueSlbdGhpcy5wa119YCk7XG4gICAgICByZXR1cm4gcmVhZFJlc3VsdDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlVXBkYXRlSGFuZGxlcihcbiAgICBnZXRQSzogKC4uLnA6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZyxcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIHJvdXRlUGFyYW1zOiBhbnksXG4gICAgICBib2R5OiBhbnksXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIE9wZXJhdGlvbktleXMuVVBEQVRFLCB0cnVlKVxuICAgICAgKS5mb3IodXBkYXRlKTtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UEsoLi4ucm91dGVQYXJhbXMudmFsdWVzSW5PcmRlcik7XG4gICAgICBpZiAodHlwZW9mIGlkID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBObyAke3RoaXMucGt9IHByb3ZpZGVkYCk7XG4gICAgICBsZXQgdXBkYXRlZDogYW55O1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmluZm8oYHVwZGF0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHt0aGlzLnBrfSAke2lkfWApO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShib2R5KSk7XG4gICAgICAgIHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkudXBkYXRlKFxuICAgICAgICAgIG5ldyBNb2RlbENvbnN0cih7IC4uLnBheWxvYWQsIFt0aGlzLnBrXTogaWQgfSksXG4gICAgICAgICAgY3R4XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVEZWxldGVIYW5kbGVyKFxuICAgIGdldFBLOiAoLi4ucDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nLFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHJlbW92ZShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIHJvdXRlUGFyYW1zOiBhbnksXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbD4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsIHRydWUpXG4gICAgICApLmZvcihyZW1vdmUpO1xuICAgICAgY29uc3QgaWQgPSBnZXRQSyguLi5yb3V0ZVBhcmFtcy52YWx1ZXNJbk9yZGVyKTtcbiAgICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYE5vICR7dGhpcy5wa30gcHJvdmlkZWRgKTtcbiAgICAgIGxldCBkZWw6IE1vZGVsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGBkZWxldGluZyAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7dGhpcy5wa30gJHtpZH1gKTtcbiAgICAgICAgZGVsID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmRlbGV0ZShpZCwgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtpZH1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGBkZWxldGVkICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtpZH1gKTtcbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiBkZWw7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVN0YXRlbWVudEhhbmRsZXIobW9kZWxDbGF6ek5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBzdGF0ZW1lbnQoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICBhcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICAgICAgZGV0YWlsczogRGlyZWN0aW9uTGltaXRPZmZzZXRcbiAgICApOiBQcm9taXNlPGFueT4ge1xuICAgICAgY29uc3QgeyBjdHggfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIFBlcnNpc3RlbmNlS2V5cy5TVEFURU1FTlQsIHRydWUpXG4gICAgICApLmZvcihzdGF0ZW1lbnQpO1xuICAgICAgY29uc3QgeyBkaXJlY3Rpb24sIG9mZnNldCwgbGltaXQsIGJvb2ttYXJrIH0gPSBkZXRhaWxzO1xuICAgICAgYXJncyA9IGFyZ3MubWFwKFxuICAgICAgICAoYSkgPT4gKHR5cGVvZiBhID09PSBcInN0cmluZ1wiID8gcGFyc2VJbnQoYSBhcyBzdHJpbmcpIDogYSkgfHwgYVxuICAgICAgKSBhcyBhbnlbXTtcbiAgICAgIGNvbnN0IHBhdGhEaXJlY3Rpb24gPSBhcmdzLmxlbmd0aCA+IDEgPyBhcmdzWzFdIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmVzb2x2ZWREaXJlY3Rpb24gPSAoZGlyZWN0aW9uID8/IHBhdGhEaXJlY3Rpb24pIGFzXG4gICAgICAgIHwgc3RyaW5nXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHJlc29sdmVkRGlyZWN0aW9uICYmIGFyZ3MubGVuZ3RoID4gMSkgYXJnc1sxXSA9IHJlc29sdmVkRGlyZWN0aW9uO1xuICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQ6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlk6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlk6XG4gICAgICAgICAgYXJncy5wdXNoKGRpcmVjdGlvbiBhcyBzdHJpbmcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZOlxuICAgICAgICAgIGFyZ3MgPSBbXG4gICAgICAgICAgICBhcmdzWzBdLFxuICAgICAgICAgICAgcmVzb2x2ZWREaXJlY3Rpb24gYXMgYW55LFxuICAgICAgICAgICAgeyBsaW1pdCwgb2Zmc2V0LCBib29rbWFyayB9LFxuICAgICAgICAgIF07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0Y6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnN0YXRlbWVudChuYW1lLCAuLi5hcmdzLCBjdHgpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVTdGF0ZW1lbnRTaG9ydGN1dEhhbmRsZXIoXG4gICAgc3RhdGVtZW50S2V5OiBzdHJpbmcsXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gc3RhdGVtZW50U2hvcnRjdXQoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgc3RhdGVtZW50S2V5LCB0cnVlKVxuICAgICAgKS5mb3Ioc3RhdGVtZW50U2hvcnRjdXQpO1xuXG4gICAgICBzd2l0Y2ggKHN0YXRlbWVudEtleSkge1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZOiB7XG4gICAgICAgICAgY29uc3QgW2tleSwgZGV0YWlsc10gPSBhcmdzO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eCkubGlzdEJ5KFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgKGRldGFpbHMgYXMgYW55KT8uZGlyZWN0aW9uIGFzIE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICAgICAgY3R4XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZOiB7XG4gICAgICAgICAgY29uc3QgW2tleSwgcGFnZSwgZGV0YWlsc10gPSBhcmdzO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eCkucGFnaW5hdGVCeShcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIChkZXRhaWxzIGFzIGFueSk/LmRpcmVjdGlvbiBhcyBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGltaXQ6IChkZXRhaWxzIGFzIGFueSk/LmxpbWl0LFxuICAgICAgICAgICAgICBvZmZzZXQ6IChkZXRhaWxzIGFzIGFueSk/Lm9mZnNldCxcbiAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgY3R4XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EOiB7XG4gICAgICAgICAgY29uc3QgW3ZhbHVlLCBkZXRhaWxzXSA9IGFyZ3M7XG4gICAgICAgICAgY29uc3QgZGlyZWN0aW9uID1cbiAgICAgICAgICAgIChkZXRhaWxzIGFzIGFueSk/LmRpcmVjdGlvbiA/PyBPcmRlckRpcmVjdGlvbi5BU0M7XG4gICAgICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZS5maW5kID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2UuZmluZCh2YWx1ZSwgZGlyZWN0aW9uLCBjdHgpO1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQsIHZhbHVlLCBkaXJlY3Rpb24sIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRToge1xuICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgZGV0YWlsc10gPSBhcmdzO1xuICAgICAgICAgIGNvbnN0IHJlZiA9IHtcbiAgICAgICAgICAgIG9mZnNldDogKGRldGFpbHMgYXMgYW55KT8ub2Zmc2V0ID8/IDEsXG4gICAgICAgICAgICBsaW1pdDogKGRldGFpbHMgYXMgYW55KT8ubGltaXQgPz8gMTAsXG4gICAgICAgICAgICBib29rbWFyazogKGRldGFpbHMgYXMgYW55KT8uYm9va21hcmssXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IHRoaXMucGVyc2lzdGVuY2UoY3R4KTtcbiAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSAoZGV0YWlscyBhcyBhbnkpPy5kaXJlY3Rpb24gPz8gT3JkZXJEaXJlY3Rpb24uQVNDO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2UucGFnZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnBhZ2UodmFsdWUsIGRpcmVjdGlvbiwgcmVmLCBjdHgpO1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsIHZhbHVlLCBkaXJlY3Rpb24sIHJlZiwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWToge1xuICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGFyZ3M7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KS5maW5kT25lQnkoa2V5LCB2YWx1ZSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZOiB7XG4gICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gYXJncztcbiAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpXG4gICAgICAgICAgICAuZm9yKGN0eC50b092ZXJyaWRlcygpKVxuICAgICAgICAgICAgLmZpbmRCeShrZXksIHZhbHVlLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBbZmllbGRdID0gYXJncztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuc3RhdGVtZW50KHN0YXRlbWVudEtleSwgZmllbGQsIGN0eCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGF0ZW1lbnQ6ICR7c3RhdGVtZW50S2V5fWApO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKG1ldGhvZE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjb21wbGV4UXVlcnkoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCBsb2c6IGFueSA9IHRoaXMubG9nPy5mb3I/Lihjb21wbGV4UXVlcnkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGxvZykgbG9nLmRlYnVnKGBJbnZva2luZyBjdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCJgKTtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IChcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgbWV0aG9kTmFtZSwgdHJ1ZSlcbiAgICAgICAgKS5mb3IoY29tcGxleFF1ZXJ5KTtcbiAgICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICAgIGNvbnN0IHNwcmVhZEFyZ3MgPSBGcm9tTW9kZWxDb250cm9sbGVyLmV4dHJhY3RRdWVyeUFyZ3MoYXJncyk7XG4gICAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2VbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZVttZXRob2ROYW1lXSguLi5zcHJlYWRBcmdzLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2Uuc3RhdGVtZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2Uuc3RhdGVtZW50KG1ldGhvZE5hbWUsIC4uLnNwcmVhZEFyZ3MsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAobG9nKSBsb2cuZXJyb3IoYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgLCBlKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQ3VzdG9tUm91dGVIYW5kbGVyKG1ldGhvZE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjdXN0b21Sb3V0ZShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IGxvZzogYW55ID0gdGhpcy5sb2c/LmZvcj8uKGN1c3RvbVJvdXRlKTtcbiAgICAgIGNvbnN0IHsgY3R4IH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBtZXRob2ROYW1lLCB0cnVlKVxuICAgICAgKS5mb3IoY3VzdG9tUm91dGUpO1xuICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICBjb25zdCBzcHJlYWRBcmdzID0gRnJvbU1vZGVsQ29udHJvbGxlci5leHRyYWN0UXVlcnlBcmdzKGFyZ3MpO1xuXG4gICAgICAvLyBUcnkgdGhlIHBlcnNpc3RlbmNlIGRpcmVjdGx5ICh3b3JrcyB3aGVuIGl0J3MgYSBjdXN0b20gUmVwb3NpdG9yeSlcbiAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2VbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2VbbWV0aG9kTmFtZV0oLi4uc3ByZWFkQXJncywgY3R4KTtcbiAgICAgIH1cbiAgICAgIC8vIFdoZW4gcGVyc2lzdGVuY2UgaXMgYSBNb2RlbFNlcnZpY2UsIHRoZSBtZXRob2QgbGl2ZXMgb24gdGhlIHVuZGVybHlpbmcgcmVwb1xuICAgICAgaWYgKHBlcnNpc3RlbmNlPy5yZXBvICYmIHR5cGVvZiBwZXJzaXN0ZW5jZS5yZXBvW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnJlcG9bbWV0aG9kTmFtZV0oLi4uc3ByZWFkQXJncywgY3R4KTtcbiAgICAgIH1cbiAgICAgIC8vIEZhbGwgYmFjayB0byBzdGF0ZW1lbnQgZ2F0ZXdheVxuICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2Uuc3RhdGVtZW50KG1ldGhvZE5hbWUsIC4uLnNwcmVhZEFyZ3MsIGN0eCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfSBvciBpdHMgcmVwb2BcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGV4dHJhY3RRdWVyeUFyZ3MoYXJnczogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gYXJncztcbiAgICBjb25zdCBsYXN0ID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChcbiAgICAgIGxhc3QgJiZcbiAgICAgIHR5cGVvZiBsYXN0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShsYXN0KVxuICAgICkge1xuICAgICAgY29uc3QgcXVlcnlPYmogPSBhcmdzLnBvcCgpO1xuICAgICAgY29uc3QgaGFzRGlyZWN0aW9uID0gcXVlcnlPYmouZGlyZWN0aW9uICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNMaW1pdCA9IHF1ZXJ5T2JqLmxpbWl0ICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNPZmZzZXQgPSBxdWVyeU9iai5vZmZzZXQgIT09IHVuZGVmaW5lZDtcbiAgICAgIGlmICghaGFzRGlyZWN0aW9uICYmICFoYXNMaW1pdCAmJiAhaGFzT2Zmc2V0KSByZXR1cm4gYXJncztcbiAgICAgIGNvbnN0IGV4dHJhczogYW55W10gPSBbXTtcbiAgICAgIGlmIChoYXNEaXJlY3Rpb24pIGV4dHJhcy5wdXNoKHF1ZXJ5T2JqLmRpcmVjdGlvbik7XG4gICAgICBlbHNlIGlmIChoYXNMaW1pdCB8fCBoYXNPZmZzZXQpIGV4dHJhcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICBpZiAoaGFzTGltaXQpIGV4dHJhcy5wdXNoKHF1ZXJ5T2JqLmxpbWl0KTtcbiAgICAgIGlmIChoYXNPZmZzZXQpIGV4dHJhcy5wdXNoKHF1ZXJ5T2JqLm9mZnNldCk7XG4gICAgICByZXR1cm4gWy4uLmFyZ3MsIC4uLmV4dHJhc107XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQT1NUXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYENyZWF0ZSBhIG5ldyAke21vZGVsQ2xhenpOYW1lfS5gIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgJHttb2RlbENsYXp6TmFtZX1gLFxuICAgICAgICB0eXBlOiBEdG9Gb3IoT3BlcmF0aW9uS2V5cy5DUkVBVEUsIE1vZGVsQ29uc3RyKSxcbiAgICAgIH0pLFxuICAgICAgQXBpQ3JlYXRlZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KSxcbiAgICAgIEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJlcG9zaXRvcnkgcmVqZWN0ZWQgdGhlIHByb3ZpZGVkIHBheWxvYWQuXCIsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVsa0NyZWF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiUE9TVFwiLCBcImJ1bGtcIiksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgQ3JlYXRlIGEgbmV3ICR7bW9kZWxDbGF6ek5hbWV9LmAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlDcmVhdGVkUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgICAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVwb3NpdG9yeSByZWplY3RlZCB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cIixcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrUmVhZERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzIGJ5IGlkcy5gIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImlkc1wiLCByZXF1aXJlZDogdHJ1ZSwgdHlwZTogXCJhcnJheVwiIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrVXBkYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiUFVUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBSZXBsYWNlIGV4aXN0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMgd2l0aCBuZXcgcGF5bG9hZHMuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgcmVwbGFjaW5nIGV4aXN0aW5nIHJlY29yZHMgb2YgJHttb2RlbENsYXp6TmFtZX1gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgJHJlZjogZ2V0U2NoZW1hUGF0aChEdG9Gb3IoT3BlcmF0aW9uS2V5cy5VUERBVEUsIE1vZGVsQ29uc3RyKSksXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrRGVsZXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiREVMRVRFXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBEZWxldGUgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkcyBieSBpZHMuYCB9KSxcbiAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJpZHNcIiwgcmVxdWlyZWQ6IHRydWUsIHR5cGU6IFwiYXJyYXlcIiB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSBhICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBieSBpZC5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB1cGRhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQVVRcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBSZXBsYWNlIGFuIGV4aXN0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCB3aXRoIGEgbmV3IHBheWxvYWQuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgcmVwbGFjaW5nIGFuIGV4aXN0aW5nIHJlY29yZCBvZiAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHR5cGU6IER0b0ZvcihPcGVyYXRpb25LZXlzLlVQREFURSwgTW9kZWxDb25zdHIpLFxuICAgICAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVsZXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIHBrUGF0aDogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiREVMRVRFXCIsIHBrUGF0aCksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgRGVsZXRlIGEgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIGJ5IGlkLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBkZWxldGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYEV4ZWN1dGVzIGEgcHJlcGFyZWQgc3RhdGVtZW50IG9uICR7bW9kZWxDbGF6ek5hbWV9LmAsXG4gICAgICB9KSxcbiAgICAgIEFwaVBhcmFtKHsgbmFtZTogXCJtZXRob2RcIiwgZGVzY3JpcHRpb246IFwidGhlIHByZXBhcmVkIHN0YXRlbWVudCB0byBleGVjdXRlXCIgfSksXG4gICAgICBBcGlQYXJhbSh7XG4gICAgICAgIG5hbWU6IFwiYXJnc1wiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJjb25jYXRlbmF0ZWQgbGlzdCBvZiBhcmd1bWVudHMgdGhlIHByZXBhcmVkIHN0YXRlbWVudCBjYW4gYWNjZXB0XCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlciB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImxpbWl0XCIsIHJlcXVpcmVkOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJsaW1pdCBvciBwYWdlIHNpemUgd2hlbiBhcHBsaWNhYmxlXCIgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwib2Zmc2V0XCIsIHJlcXVpcmVkOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmsgd2hlbiBhcHBsaWNhYmxlXCIgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBsaXN0ZWQgZm91bmQuYCB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgc3RhdGVtZW50S2V5OiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgY29uc3QgYmFzZTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiA9IFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgcGF0aCksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgJHttb2RlbENsYXp6TmFtZX0gcmVjb3Jkcy5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gIH0pLFxuICAgIF07XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgYmFzZS5wdXNoKEFwaVBhcmFtKHsgbmFtZSwgZGVzY3JpcHRpb246IGBUaGUgJHtuYW1lfSBwYXJhbWV0ZXJgIH0pKTtcbiAgICB9KTtcblxuICAgIGlmIChcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImxpc3RCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kL1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIilcbiAgICApIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXJcIixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCJwYWdpbmF0ZUJ5L1wiKSB8fCBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKSkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwibGltaXRcIiwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogXCJwYWdlIHNpemVcIiB9KSxcbiAgICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcIm9mZnNldFwiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcInBhZ2UgbnVtYmVyXCIgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJib29rbWFya1wiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcImJvb2ttYXJrIGZvciBjdXJzb3IgcGFnaW5hdGlvblwiIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kT25lQnkvXCIpIHx8IHBhdGguc3RhcnRzV2l0aChcImZpbmRCeS9cIikpIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRiB8fFxuICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GIHx8XG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0ZcbiAgICApIHtcbiAgICAgIGJhc2UucHVzaChBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IGBSZXN1bHQgZm9yICR7bW9kZWxDbGF6ek5hbWV9LmAsIHR5cGU6IE51bWJlciB9KSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRikge1xuICAgICAgYmFzZS5wdXNoKEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogYERpc3RpbmN0IHZhbHVlcyBmb3IgJHttb2RlbENsYXp6TmFtZX0uYCwgdHlwZTogW1N0cmluZ10gfSkpO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICByb3V0ZVBhdGg6IHN0cmluZyxcbiAgICBodHRwVmVyYjogc3RyaW5nLFxuICAgIGluY2x1ZGVRdWVyeVBhcmFtczogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIGNvbnN0IGV4dHJhY3RQYXRoUGFyYW1zID0gKHA6IHN0cmluZyk6IHN0cmluZ1tdID0+XG4gICAgICBwLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpLm1hcCgocykgPT4gcy5zbGljZSgxKSk7XG5cbiAgICBjb25zdCBhcGlQYXRoUGFyYW1zID0gZXh0cmFjdFBhdGhQYXJhbXMocm91dGVQYXRoKS5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4gPSBbXG4gICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcCgocCkgPT4gQXBpUGFyYW0ocCkpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgXCIke21ldGhvZE5hbWV9XCIuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJSZXN1bHQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC5cIiB9KSxcbiAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiTm8gY29udGVudCByZXR1cm5lZCBieSB0aGUgbWV0aG9kLlwiIH0pLFxuICAgIF07XG5cbiAgICBpZiAoaHR0cFZlcmIgPT09IFwiR0VUXCIgJiYgaW5jbHVkZVF1ZXJ5UGFyYW1zKSB7XG4gICAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgICBuYW1lOiBcImRpcmVjdGlvblwiLFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlciB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgICAgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJsaW1pdFwiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZVwiIH0pLFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwib2Zmc2V0XCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwib2Zmc2V0IG9yIGJvb2ttYXJrXCIgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlY29yYXRvcnM7XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSwgUHJvdmlkZXIgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIsIE1vZGVsU2VydmljZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRnJvbU1vZGVsQ29udHJvbGxlciB9IGZyb20gXCIuL0Zyb21Nb2RlbENvbnRyb2xsZXJcIjtcbmltcG9ydCB7IERlY2FmTW9kdWxlT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgREVDQUZfRVhQT1NFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZHVsZUZvcihmbGF2b3VyOiBzdHJpbmcpIHtcbiAgQE1vZHVsZSh7fSlcbiAgY2xhc3MgRGVjYWZNb2RlbE1vZHVsZSB7XG4gICAgc3RhdGljIHJlYWRvbmx5IGxvZyA9IExvZ2dpbmcuZm9yKERlY2FmTW9kZWxNb2R1bGUubmFtZSkuZm9yKGZsYXZvdXIpO1xuXG4gICAgc3RhdGljIGNyZWF0ZU1vZGVsU2VydmljZXM8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICAgIG1vZGVsczogTW9kZWxDb25zdHJ1Y3RvcjxUPltdXG4gICAgKTogUHJvdmlkZXJbXSB7XG4gICAgICByZXR1cm4gbW9kZWxzLm1hcCgobW9kZWwpID0+ICh7XG4gICAgICAgIHByb3ZpZGU6IGAke21vZGVsLm5hbWV9U2VydmljZWAsXG4gICAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IE1vZGVsU2VydmljZS5mb3JNb2RlbChtb2RlbCBhcyBhbnkpLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBpc0V4cG9zZWQoXG4gICAgICBtb2RlbDogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgICAgZXhwb3N1cmU/OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgc3RyaW5nW10+XG4gICAgKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGV4cG9zdXJlPy5bbW9kZWwubmFtZV07XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgIHR5cGVvZiBvdmVycmlkZSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgID8gb3ZlcnJpZGVcbiAgICAgICAgICA6IE1ldGFkYXRhLmdldChtb2RlbCwgTWV0YWRhdGEua2V5KERFQ0FGX0VYUE9TRSkpO1xuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5pbmNsdWRlcyhmbGF2b3VyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZm9yUm9vdChcbiAgICAgIGZsYXZvdXI6IHN0cmluZyxcbiAgICAgIG9wdGlvbnM6IFBhcnRpYWw8RGVjYWZNb2R1bGVPcHRpb25zPiA9IHt9XG4gICAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5mb3JSb290KTtcbiAgICAgIGxvZy5pbmZvKGBHZW5lcmF0aW5nIGNvbnRyb2xsZXJzIGZvciBmbGF2b3VyLi4uYCk7XG5cbiAgICAgIGNvbnN0IHRyYWNrZWRNb2RlbHMgPSBBZGFwdGVyLm1vZGVscyhmbGF2b3VyKS5maWx0ZXIoKG1vZGVsKSA9PlxuICAgICAgICB0aGlzLmlzRXhwb3NlZChtb2RlbCwgb3B0aW9ucy5jb250cm9sbGVyRXhwb3N1cmUpXG4gICAgICApO1xuXG4gICAgICBsZXQgbW9kZWxTZXJ2aWNlczogUHJvdmlkZXJbXSA9IFtdO1xuICAgICAgaWYgKG9wdGlvbnMuYXV0b1NlcnZpY2VzKSB7XG4gICAgICAgIGxvZy5pbmZvKFwiQXV0by1zZXJ2aWNlcyBlbmFibGVkLiBJbml0aWFsaXppbmcgc2VydmljZSBnZW5lcmF0aW9uLlwiKTtcbiAgICAgICAgbW9kZWxTZXJ2aWNlcyA9IHRoaXMuY3JlYXRlTW9kZWxTZXJ2aWNlcyh0cmFja2VkTW9kZWxzKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYEF1dG8tc2VydmljZXMgY29tcGxldGVkLiAke21vZGVsU2VydmljZXMubGVuZ3RofSBzZXJ2aWNlcyBpbml0aWFsaXplZC5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdsb2JhbERlZmF1bHRzOiBQYXJ0aWFsPE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+ID0ge307XG4gICAgICBpZiAob3B0aW9ucy5hZ2dyZWdhdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICAgIGdsb2JhbERlZmF1bHRzLmFsbG93R3JvdXBpbmdRdWVyaWVzID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRyb2xsZXJzID0gdHJhY2tlZE1vZGVscy5tYXAoKG1vZGVsKSA9PlxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZShtb2RlbCwgb3B0aW9ucy5jb250cm9sbGVyQ29uZmlnLCBnbG9iYWxEZWZhdWx0cylcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhgR2VuZXJhdGVkICR7Y29udHJvbGxlcnMubGVuZ3RofSBjb250cm9sbGVyc2ApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb2R1bGU6IERlY2FmTW9kZWxNb2R1bGUsXG4gICAgICAgIGNvbnRyb2xsZXJzLFxuICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAuLi5tb2RlbFNlcnZpY2VzLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihEZWNhZk1vZGVsTW9kdWxlLCBcIm5hbWVcIiwge1xuICAgIHZhbHVlOiBgRGVjYWZNb2R1bGUke2ZsYXZvdXJ9YCxcbiAgfSk7XG4gIHJldHVybiBEZWNhZk1vZGVsTW9kdWxlO1xufVxuIiwiaW1wb3J0IHtcbiAgRGVmYXVsdEluamVjdGFibGVzQ29uZmlnLFxuICBJbmplY3RhYmxlQ29uZmlnLFxuICBJbmplY3RhYmxlc0tleXMsXG4gIEluamVjdE9wdGlvbnMsXG59IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgRGVjb3JhdGlvbiwgRGVjb3JhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL292ZXJyaWRlcy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSBcIi4vZGVjYWYtbW9kZWxcIjtcblxuRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbmVzdEluamVjdGFibGUoXG4gICAgICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICBjZmc/OiBJbmplY3RhYmxlQ29uZmlnXG4gICAgKSB7XG4gICAgICBjZmcgPVxuICAgICAgICBjZmcgfHxcbiAgICAgICAgKHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgY2F0ZWdvcnkgYXMgUmVjb3JkPGFueSwgYW55PixcbiAgICAgICAgICAgICAgRGVmYXVsdEluamVjdGFibGVzQ29uZmlnXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcpO1xuICAgICAgcmV0dXJuIEluamVjdGFibGUoe1xuICAgICAgICBzY29wZTogY2ZnLnNpbmdsZXRvbiA/IFNjb3BlLkRFRkFVTFQgOiBTY29wZS5SRVFVRVNULFxuICAgICAgICBkdXJhYmxlOiBjZmcuc2luZ2xldG9uID8gdW5kZWZpbmVkIDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG5lc3RJbmplY3QoXG4gICAgICBjYXRlZ29yeTogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjZmc6IEluamVjdE9wdGlvbnNcbiAgICApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbm5lck5lc3RJbmplY3QoXG4gICAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgICAgZGVzY3JpcHRvcj86IGFueVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBJbmplY3QoY2F0ZWdvcnkgfHwgKHRhcmdldCBhcyBDb25zdHJ1Y3RvcikpKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRClcbiAgLmV4dGVuZChcbiAgICBBcGlQcm9wZXJ0eSh7XG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KVxuICApXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NQVgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4RGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhpbXVtOiBtYXgsIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUlOKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkRlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluaW11bTogbWluLCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4TGVuZ3RoRGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhMZW5ndGg6IG1heCwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkxlbmd0aERlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluTGVuZ3RoOiBtaW4sIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuVFlQRSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0eXBlRGVjKFxuICAgICAgdHlwZTpcbiAgICAgICAgfCAoQ29uc3RydWN0b3IgfCAoKCkgPT4gQ29uc3RydWN0b3IpKVtdXG4gICAgICAgIHwgQ29uc3RydWN0b3JcbiAgICAgICAgfCAoKCkgPT4gQ29uc3RydWN0b3IpXG4gICAgKSB7XG4gICAgICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wOiBhbnkpID0+IHtcbiAgICAgICAgdHlwZSA9IEFycmF5LmlzQXJyYXkodHlwZSkgPyB0eXBlWzBdIDogdHlwZTtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSBcImZ1bmN0aW9uXCIgJiYgIXR5cGUubmFtZSlcbiAgICAgICAgICB0eXBlID0gKHR5cGUgYXMgKCkgPT4gQ29uc3RydWN0b3IpKCk7XG4gICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgICAgdHlwZTogdHlwZSBhcyBhbnksXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICB9KSh0YXJnZXQsIHByb3ApO1xuICAgICAgfTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5MSVNUKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGxpc3REZWMoXG4vLyAgICAgICBjbGF6ejpcbi8vICAgICAgICAgfCBDb25zdHJ1Y3RvclxuLy8gICAgICAgICB8ICgoKSA9PiBDb25zdHJ1Y3Rvcilcbi8vICAgICAgICAgfCAoQ29uc3RydWN0b3IgfCAoKCkgPT4gQ29uc3RydWN0b3IpKVtdLFxuLy8gICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuLy8gICAgICAgY29sbGVjdGlvbjogXCJBcnJheVwiIHwgXCJTZXRcIiA9IFwiQXJyYXlcIlxuLy8gICAgICkge1xuLy8gICAgICAgcmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgcHJvcDogYW55KSA9PiB7XG4vLyAgICAgICAgIGNsYXp6ID0gQXJyYXkuaXNBcnJheShjbGF6eikgPyBjbGF6elswXSA6IGNsYXp6O1xuLy8gICAgICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWUpXG4vLyAgICAgICAgICAgY2xhenogPSAoY2xhenogYXMgKCkgPT4gQ29uc3RydWN0b3IpKCk7XG4vLyAgICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IHR5cGU6IFtjbGF6eiBhcyBhbnldIH0pKHRhcmdldCwgcHJvcCk7XG4vLyAgICAgICB9O1xuLy8gICAgIH0sXG4vLyAgIH0pXG4vLyAgIC5hcHBseSgpO1xuLy8gLy9cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkRBVEUpXG4gIC5leHRlbmQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRhdGVEZWMoZm9ybWF0OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgZm9ybWF0OiBcImRhdGUtdGltZVwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIC8vIGV4YW1wbGU6IHBhcnNlRGF0ZShmb3JtYXQsIG5ldyBEYXRlKCkpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkVOVU0pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb3B0aW9uRGVjKG9wdGlvbnM6IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgY29uc3Qgb3B0cyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogT2JqZWN0LnZhbHVlcyhvcHRpb25zKTtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIGVudW06IG9wdHMsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5QQVRURVJOKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIHBhdHRlcm5EZWMocGF0OiBSZWdFeHAgfCBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIHBhdHRlcm46IHR5cGVvZiBwYXQgPT09IFwic3RyaW5nXCIgPyBwYXQgOiBwYXQuc291cmNlLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb2x1bW5EZWMobmFtZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoRGVjb3JhdGlvbktleXMuREVTQ1JJUFRJT04pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gZGVzY3JpcHRpb25EZWMoZGVzY3JpcHRpb246IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkFVVEgpLmV4dGVuZCh7IGRlY29yYXRvcjogQXV0aCB9KS5hcHBseSgpO1xuIiwiaW1wb3J0IHsgRm9yYmlkZGVuRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuZXhwb3J0IGNsYXNzIENvcnNFcnJvciBleHRlbmRzIEZvcmJpZGRlbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQ29yc0Vycm9yLm5hbWUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIFRvTWFueVJlcXVlc3RzRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yICkge1xuICAgIHN1cGVyKFRvTWFueVJlcXVlc3RzRXJyb3IubmFtZSwgbXNnICwgNDI5KTtcbiAgfVxufSIsImltcG9ydCB7XG4gIEFyZ3VtZW50c0hvc3QsXG4gIENhdGNoLFxuICBFeGNlcHRpb25GaWx0ZXIsXG4gIE5vdEFjY2VwdGFibGVFeGNlcHRpb24sXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEJhc2VFcnJvciwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VkRW52aXJvbm1lbnQgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFRvTWFueVJlcXVlc3RzRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzL3Rocm90dGxpbmdcIjtcblxuQENhdGNoKClcbmV4cG9ydCBjbGFzcyBEZWNhZkV4Y2VwdGlvbkZpbHRlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbkZpbHRlciB7XG4gIGNhdGNoKGV4Y2VwdGlvbjogRXJyb3IsIGhvc3Q6IEFyZ3VtZW50c0hvc3QpIHtcbiAgICBjb25zdCBjdHggPSBob3N0LnN3aXRjaFRvSHR0cCgpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gY3R4LmdldFJlc3BvbnNlKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IGN0eC5nZXRSZXF1ZXN0KCk7XG5cbiAgICBjb25zdCBpc1Byb2R1Y3Rpb24gPSBMb2dnZWRFbnZpcm9ubWVudC5lbnYgPT09IFwicHJvZHVjdGlvblwiO1xuICAgIGxldCBzdGF0dXNDb2RlO1xuXG4gICAgaWYgKFxuICAgICAgZXhjZXB0aW9uIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24gfHxcbiAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3JcbiAgICApIHtcbiAgICAgIGV4Y2VwdGlvbiA9IG5ldyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIHN0YXR1c0NvZGUgPSAoZXhjZXB0aW9uIGFzIE5vdEFjY2VwdGFibGVFeGNlcHRpb24pLmdldFN0YXR1cygpO1xuICAgIH0gZWxzZSBpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBCYXNlRXJyb3IpKSB7XG4gICAgICBpZigoZXhjZXB0aW9uIGFzIGFueSkuc3RhdHVzID09PSA0Mjkpe1xuICAgICAgICBleGNlcHRpb24gPSBuZXcgVG9NYW55UmVxdWVzdHNFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgZXhjZXB0aW9uID0gbmV3IEludGVybmFsRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3BvbnNlLnN0YXR1cygoZXhjZXB0aW9uIGFzIEJhc2VFcnJvcikuY29kZSB8fCBzdGF0dXNDb2RlKS5qc29uKHtcbiAgICAgIHN0YXR1czogKGV4Y2VwdGlvbiBhcyBCYXNlRXJyb3IpLmNvZGUgfHwgc3RhdHVzQ29kZSxcbiAgICAgIGVycm9yOiBpc1Byb2R1Y3Rpb24gPyBleGNlcHRpb24ubmFtZSA6IGV4Y2VwdGlvbi5tZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBwYXRoOiByZXF1ZXN0LnVybCxcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFVzZUZpbHRlcnMsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZFeGNlcHRpb25GaWx0ZXIgfSBmcm9tIFwiLi9EZWNhZkVycm9yRmlsdGVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi4vLi4vcmVxdWVzdC9pbmRleFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZGaWx0ZXIoKSB7XG4gIHJldHVybiBVc2VGaWx0ZXJzKG5ldyBEZWNhZkV4Y2VwdGlvbkZpbHRlcigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVzZURlY2FmSGVhZGVycygpIHtcbiAgcmV0dXJuIFVzZUludGVyY2VwdG9ycyhEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IpO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFNlY3VyaXR5U2NoZW1lT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3N3YWdnZXItdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyT3B0aW9ucyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGFzc2V0c1BhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25GaWxlUGF0aD86IHN0cmluZztcbiAgdG9wYmFySWNvbkZpbGVQYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbj86IGJvb2xlYW47XG4gIHBhdGg6IHN0cmluZztcbiAgYXV0aD86IFNlY3VyaXR5U2NoZW1lT2JqZWN0O1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xuICBleHRyYU1vZGVscz86IENvbnN0cnVjdG9yW107XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gSlNPTiBmb3JtYXQuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS5qc29uXG4gICAqL1xuICBvcGVuQXBpSnNvblBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFNXQUdHRVJfVUlfQ09OU1RBTlRTOiBTd2FnZ2VyT3B0aW9ucyA9IHtcbiAgdGl0bGU6IFwiU3dhZ2dlciB8IE9wZW5BUEkgU3BlY2lmaWNhdGlvbiAoT0FTKVwiLFxuICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZGl6ZWQgZm9ybWF0IGZvciBkZXNjcmliaW5nIFJFU1RmdWwgQVBJc1wiLFxuICB2ZXJzaW9uOiBcIjAuMC4xXCIsXG4gIHBhdGg6IFwiZG9jc1wiLFxuICBmYXZpY29uRmlsZVBhdGg6IFwiXCIsXG4gIHRvcGJhckljb25GaWxlUGF0aDogXCJcIixcbiAgYXV0aDoge1xuICAgIHR5cGU6IFwiaHR0cFwiLFxuICAgIHNjaGVtZTogXCJiZWFyZXJcIixcbiAgICBiZWFyZXJGb3JtYXQ6IFwiSldUXCIsXG4gICAgbmFtZTogXCJBdXRob3JpemF0aW9uXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRW50ZXIgSldUIHRva2VuXCIsXG4gICAgaW46IFwiaGVhZGVyXCIsXG4gIH0sXG4gIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0cnVlLFxuICB0b3BiYXJCZ0NvbG9yOiBcIiMwMDAwMDBcIixcbn07XG4iLCJpbXBvcnQgeyBTV0FHR0VSX1VJX0NPTlNUQU5UUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlclVJT3B0aW9ucyB7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbjogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgZmF2aWNvblBhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckljb25QYXRoPzogc3RyaW5nO1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3dhZ2dlckN1c3RvbVVJIHtcbiAgcmVhZG9ubHkgb3B0aW9uczogU3dhZ2dlclVJT3B0aW9ucztcbiAgLy8gcHJpdmF0ZSByZWFkb25seSBhc3NldHNQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gIC8vICAgX19kaXJuYW1lLFxuICAvLyAgIFwiLi5cIixcbiAgLy8gICBcIi4uXCIsXG4gIC8vICAgXCJ3b3JrZG9jc1wiLFxuICAvLyAgIFwiYXNzZXRzXCJcbiAgLy8gKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTd2FnZ2VyVUlPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjdXN0b21DU1MoKSB7XG4gICAgbGV0IGNzcyA9IFwiXCI7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50b3BiYXJJY29uUGF0aCkge1xuICAgICAgY29uc3QgaW1nID0gdGhpcy5iNjQodGhpcy5vcHRpb25zLnRvcGJhckljb25QYXRoKTtcbiAgICAgIGNzcyArPSBgLnRvcGJhci13cmFwcGVyIHsgY29udGVudDogdXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsJHtpbWd9Jyk7IHdpZHRoOiAyMDBweDsgaGVpZ2h0OiBhdXRvOyB9XFxuYDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGNzcyArXG4gICAgICBgXG4gICAgICAgIC50b3BiYXItd3JhcHBlciBzdmcgeyB2aXNpYmlsaXR5OiBoaWRkZW47IH1cbiAgICAgICAgLnN3YWdnZXItdWkgLnRvcGJhciB7IGJhY2tncm91bmQtY29sb3I6ICR7dGhpcy5vcHRpb25zLnRvcGJhckJnQ29sb3IgfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMudG9wYmFyQmdDb2xvcn07IH1cbiAgICAgIGBcbiAgICApO1xuICB9XG5cbiAgZ2V0Q3VzdG9tT3B0aW9ucygpIHtcbiAgICBjb25zdCBmYXZpY29uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgaWYgKHRoaXMub3B0aW9ucy5mYXZpY29uUGF0aCkge1xuICAgICAgZmF2aWNvbltcImN1c3RvbWZhdkljb25cIl0gPSB0aGlzLmI2NCh0aGlzLm9wdGlvbnMuZmF2aWNvblBhdGgsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjdXN0b21TaXRlVGl0bGU6IHRoaXMub3B0aW9ucy50aXRsZSxcbiAgICAgIC4uLmZhdmljb24sXG4gICAgICBjdXN0b21Dc3M6IHRoaXMuY3VzdG9tQ1NTKCksXG4gICAgICBzd2FnZ2VyT3B0aW9uczoge1xuICAgICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdGhpcy5vcHRpb25zLnBlcnNpc3RBdXRob3JpemF0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYjY0KGZpbGU6IHN0cmluZywgaW1nOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLm9wdGlvbnMuYXNzZXRzUGF0aCB8fCBcIlwiLCBmaWxlKTtcbiAgICBjb25zdCBiNjQgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwiYmFzZTY0XCIgfSk7XG4gICAgcmV0dXJuIGltZyA/IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LFwiICsgYjY0IDogYjY0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJTmVzdEFwcGxpY2F0aW9uIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEb2N1bWVudEJ1aWxkZXIsIFN3YWdnZXJNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgeyBTd2FnZ2VyQ3VzdG9tVUkgfSBmcm9tIFwiLi9Td2FnZ2VyQ3VzdG9tVUlcIjtcbmltcG9ydCB7IFNXQUdHRVJfVUlfQ09OU1RBTlRTLCBTd2FnZ2VyT3B0aW9ucyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IFlBTUwgZnJvbSBcInlhbWxcIjtcblxuZXhwb3J0IGNsYXNzIFN3YWdnZXJCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHA6IElOZXN0QXBwbGljYXRpb24sXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTd2FnZ2VyT3B0aW9uc1xuICApIHt9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEb2N1bWVudCgpIHtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMub3B0aW9ucy5wYXRoXG4gICAgICA/IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbiArXG4gICAgICAgIFwiXCIgK1xuICAgICAgICBgPGJyPjxicj48YSBocmVmPVwiJHt0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRofVwiPk9wZW5BUEkgSlNPTiBTcGVjPC9hPiB8IGAgK1xuICAgICAgICBgPGEgaHJlZj1cIiR7dGhpcy5vcHRpb25zLm9wZW5BcGlZYW1sUGF0aH1cIj5PcGVuQVBJIFlBTUwgU3BlYzwvYT5gXG4gICAgICA6IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbjtcblxuICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBEb2N1bWVudEJ1aWxkZXIoKVxuICAgICAgLnNldFRpdGxlKHRoaXMub3B0aW9ucy50aXRsZSlcbiAgICAgIC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbilcbiAgICAgIC5zZXRWZXJzaW9uKHRoaXMub3B0aW9ucy52ZXJzaW9uIHx8IFwiMC4wLjFcIilcbiAgICAgIC5hZGRCZWFyZXJBdXRoKHRoaXMub3B0aW9ucy5hdXRoIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLmF1dGgpXG4gICAgICAuYnVpbGQoKTtcblxuICAgIHJldHVybiBTd2FnZ2VyTW9kdWxlLmNyZWF0ZURvY3VtZW50KHRoaXMuYXBwLCBjb25maWcsIHtcbiAgICAgIGV4dHJhTW9kZWxzOiB0aGlzLm9wdGlvbnMuZXh0cmFNb2RlbHMgfHwgW10sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyT3BlbkFwaVJvdXRlKFxuICAgIHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIgfCBcImFwcGxpY2F0aW9uL3gteWFtbFwiLFxuICAgIGJvZHlGYWN0b3J5OiAoKSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGlmICghcGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaHR0cEFkYXB0ZXIgPSB0aGlzLmFwcC5nZXRIdHRwQWRhcHRlcigpIGFzIGFueTtcbiAgICBwYXRoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAgIGh0dHBBZGFwdGVyLmdldChwYXRoLCAoX3JlcTogYW55LCByZXM6IGFueSkgPT4ge1xuICAgICAgaHR0cEFkYXB0ZXIucmVwbHkocmVzLCBib2R5RmFjdG9yeSgpLCAyMDAsIHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogY29udGVudFR5cGUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXR1cFN3YWdnZXIoKSB7XG4gICAgY29uc3QgZG9jdW1lbnQgPSB0aGlzLmNyZWF0ZURvY3VtZW50KCk7XG4gICAgY29uc3Qgc3dhZ2dlclVJID0gbmV3IFN3YWdnZXJDdXN0b21VSSh7XG4gICAgICB0aXRsZTogdGhpcy5vcHRpb25zLnRpdGxlLFxuICAgICAgcGF0aDogdGhpcy5vcHRpb25zLnBhdGggfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMucGF0aCxcbiAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0aGlzLm9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24gPz8gdHJ1ZSxcbiAgICAgIGFzc2V0c1BhdGg6IHRoaXMub3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvblBhdGg6IHRoaXMub3B0aW9ucy5mYXZpY29uRmlsZVBhdGgsXG4gICAgICB0b3BiYXJJY29uUGF0aDogdGhpcy5vcHRpb25zLnRvcGJhckljb25GaWxlUGF0aCxcbiAgICAgIHRvcGJhckJnQ29sb3I6IHRoaXMub3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgIH0pO1xuICAgIFN3YWdnZXJNb2R1bGUuc2V0dXAoXG4gICAgICB0aGlzLm9wdGlvbnMucGF0aCB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy5wYXRoLFxuICAgICAgdGhpcy5hcHAsXG4gICAgICBkb2N1bWVudCxcbiAgICAgIHtcbiAgICAgICAgLi4uc3dhZ2dlclVJLmdldEN1c3RvbU9wdGlvbnMoKSxcbiAgICAgICAganNvbkRvY3VtZW50VXJsOiB0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRoXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRofWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgeWFtbERvY3VtZW50VXJsOiB0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRoXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRofWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3Rlck9wZW5BcGlSb3V0ZShcbiAgICAgIHRoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGgsXG4gICAgICBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICgpID0+IGRvY3VtZW50XG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJPcGVuQXBpUm91dGUoXG4gICAgICB0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRoLFxuICAgICAgXCJhcHBsaWNhdGlvbi94LXlhbWxcIixcbiAgICAgICgpID0+IFlBTUwuc3RyaW5naWZ5KGRvY3VtZW50KVxuICAgICk7XG4gIH1cblxuICAvLyBwcml2YXRlIGdldFZlcnNpb24oKSB7XG4gIC8vICAgLy8gY29uc3QgcGFja2FnZUpzb24gPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCJwYWNrYWdlLmpzb25cIik7XG4gIC8vICAgLy8gY29uc3Qge3ZlcnNpb259ID0gcmVxdWlyZShwYWNrYWdlSnNvbik7XG4gIC8vICAgcmV0dXJuIFwidmVyc2lvblwiO1xuICAvLyB9XG59XG4iLCJpbXBvcnQge1xuICBJTmVzdEFwcGxpY2F0aW9uLFxuICBMb2dnZXIsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgUGlwZVRyYW5zZm9ybSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB9IGZyb20gXCIuL2V4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFN3YWdnZXJCdWlsZGVyIH0gZnJvbSBcIi4vb3BlbmFwaVwiO1xuaW1wb3J0IHsgQ29yc09wdGlvbnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb24vaW50ZXJmYWNlcy9leHRlcm5hbC9jb3JzLW9wdGlvbnMuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBDb3JzRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERlZmluZXMgYWxsIGN1c3RvbWl6YWJsZSBwYXJhbWV0ZXJzIGZvciBTd2FnZ2VyIHNldHVwLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgZGV2ZWxvcGVycyB0byBjdXN0b21pemUgaG93IFN3YWdnZXIgVUkgaXMgY29uZmlndXJlZFxuICogd2l0aGluIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uIEl0IGluY2x1ZGVzIHBhcmFtZXRlcnMgZm9yIHRpdGxlcywgcGF0aHMsXG4gKiBjb2xvciBzY2hlbWVzLCBhbmQgYXNzZXQgcGF0aHMgdG8gdGFpbG9yIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBleHBlcmllbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRpdGxlIGRpc3BsYXllZCBpbiBTd2FnZ2VyIFVJLlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gRGVzY3JpcHRpb24gc2hvd24gYmVsb3cgdGhlIHRpdGxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBBUEkgdmVyc2lvbiBkaXNwbGF5ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdIC0gT3B0aW9uYWwgcGF0aCB3aGVyZSBTd2FnZ2VyIHdpbGwgYmUgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtib29sZWFufSBbcGVyc2lzdEF1dGhvcml6YXRpb25dIC0gV2hldGhlciBhdXRob3JpemF0aW9uIHRva2VucyBwZXJzaXN0IGFjcm9zcyByZWxvYWRzLlxuICogQHBhcmFtIHtzdHJpbmd9IFthc3NldHNQYXRoXSAtIFBhdGggdG8gY3VzdG9tIGFzc2V0cyBmb3IgU3dhZ2dlciBVSS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFyQmdDb2xvcl0gLSBDdXN0b20gYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIFN3YWdnZXIgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFySWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBpY29uIGRpc3BsYXllZCBpbiB0aGUgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmF2aWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBmYXZpY29uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJTZXR1cE9wdGlvbnMge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgdG9wYmFyQmdDb2xvcj86IHN0cmluZztcbiAgdG9wYmFySWNvblBhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25QYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBKU09OIGZvcm1hdC5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLmpzb25cbiAgICovXG4gIG9wZW5BcGlKc29uUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgZmx1ZW50LCBzdGF0aWMgYm9vdHN0cmFwIGNsYXNzIGZvciBpbml0aWFsaXppbmcgYW5kIGNvbmZpZ3VyaW5nIGEgTmVzdEpTIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYE5lc3RCb290c3RyYXBlcmAgY2xhc3MgcHJvdmlkZXMgYSBjaGFpbmFibGUgQVBJIGZvciBjb25maWd1cmluZ1xuICogYSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UuIEl0IGluY2x1ZGVzIGJ1aWx0LWluIG1ldGhvZHMgZm9yIGVuYWJsaW5nXG4gKiBDT1JTLCBIZWxtZXQgc2VjdXJpdHksIFN3YWdnZXIgZG9jdW1lbnRhdGlvbiwgZ2xvYmFsIHBpcGVzLCBmaWx0ZXJzLFxuICogaW50ZXJjZXB0b3JzLCBhbmQgc3RhcnRpbmcgdGhlIHNlcnZlci5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb21vdGVzIGNvbnNpc3RlbmN5IGFuZCByZWR1Y2VzIHJlcGV0aXRpdmUgc2V0dXAgY29kZVxuICogYWNyb3NzIG11bHRpcGxlIE5lc3RKUyBwcm9qZWN0cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IE5lc3RGYWN0b3J5IH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuICogaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSBcIi4vYXBwLm1vZHVsZVwiO1xuICogaW1wb3J0IHsgTXlMb2dnZXIgfSBmcm9tIFwiLi9NeUxvZ2dlclwiO1xuICogaW1wb3J0IHsgTmVzdEJvb3RzdHJhcGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItbmVzdFwiO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcbiAqICAgY29uc3QgYXBwID0gYXdhaXQgTmVzdEZhY3RvcnkuY3JlYXRlKEFwcE1vZHVsZSk7XG4gKlxuICogICBhd2FpdCBOZXN0Qm9vdHN0cmFwZXJcbiAqICAgICAuaW5pdGlhbGl6ZShhcHApXG4gKiAgICAgLmVuYWJsZUxvZ2dlcihuZXcgTXlMb2dnZXIoKSlcbiAqICAgICAuZW5hYmxlQ29ycyhbXCJodHRwOi8vbG9jYWxob3N0OjQyMDBcIl0pXG4gKiAgICAgLnVzZUhlbG1ldCgpXG4gKiAgICAgLnNldHVwU3dhZ2dlcih7XG4gKiAgICAgICB0aXRsZTogXCJPcGVuQVBJIGJ5IFRyYWRlTWFya+KEolwiLFxuICogICAgICAgZGVzY3JpcHRpb246IFwiVHJhZGVNYXJr4oSiIEFQSSBkb2N1bWVudGF0aW9uXCIsXG4gKiAgICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gKiAgICAgICBwYXRoOiBcImFwaVwiLFxuICogICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRydWUsXG4gKiAgICAgICB0b3BiYXJCZ0NvbG9yOiBcIiMyQzNFNTBcIixcbiAqICAgICAgIHRvcGJhckljb25QYXRoOiBcIi9hc3NldHMvbG9nby5zdmdcIixcbiAqICAgICAgIGZhdmljb25QYXRoOiBcIi9hc3NldHMvZmF2aWNvbi5pY29cIlxuICogICAgIH0pXG4gKiAgICAgLnVzZUdsb2JhbEZpbHRlcnMoKVxuICogICAgIC51c2VHbG9iYWxQaXBlcyguLi4pXG4gKiAgICAgLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi4pXG4gKiAgICAgLnN0YXJ0KDMwMDApO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcCgpO1xuICogYGBgXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIE5lc3RCb290c3RyYXBlciB7XG4gIHByaXZhdGUgc3RhdGljIGFwcDogSU5lc3RBcHBsaWNhdGlvbjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsb2dnZXIgaW5zdGFuY2UsIGNyZWF0aW5nIGEgZGVmYXVsdCBvbmUgaWYgbm90IHNldC5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRW5zdXJlcyB0aGF0IGEgdmFsaWQgYExvZ2dlcmAgaW5zdGFuY2UgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgKiBmb3IgbG9nZ2luZyBib290c3RyYXAtcmVsYXRlZCBtZXNzYWdlcy5cbiAgICpcbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgYWN0aXZlIGxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldCBsb2dnZXIoKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZ2dlcikge1xuICAgICAgLy8gZmFsbGJhY2tcbiAgICAgIHRoaXMuX2xvZ2dlciA9IG5ldyBMb2dnZXIoXCJOZXN0Qm9vdHN0cmFwXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbml0aWFsaXplcyB0aGUgYm9vdHN0cmFwcGVyIHdpdGggYSBnaXZlbiBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEJpbmRzIHRoZSBwcm92aWRlZCBOZXN0SlMgYXBwIGluc3RhbmNlIHRvIHRoZSBib290c3RyYXBwZXIsIGVuYWJsaW5nXG4gICAqIGNoYWluZWQgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKlxuICAgKiBAcGFyYW0ge0lOZXN0QXBwbGljYXRpb259IGFwcCAtIFRoZSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKi9cbiAgc3RhdGljIGluaXRpYWxpemUoYXBwOiBJTmVzdEFwcGxpY2F0aW9uKSB7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgb3IgcmVwbGFjZXMgdGhlIGdsb2JhbCBsb2dnZXIgZm9yIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIElmIGEgY3VzdG9tIGxvZ2dlciBpcyBwcm92aWRlZCwgaXQgcmVwbGFjZXMgdGhlIGRlZmF1bHQgbG9nZ2VyLiBPdGhlcndpc2UsXG4gICAqIGEgbmV3IGxvZ2dlciBuYW1lZCBgXCJOZXN0Qm9vdHN0cmFwXCJgIGlzIHVzZWQuIFRoaXMgbG9nZ2VyIGlzIGFsc28gcmVnaXN0ZXJlZFxuICAgKiB3aXRoIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBbY3VzdG9tTG9nZ2VyXSAtIE9wdGlvbmFsIGN1c3RvbSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZUxvZ2dlcihjdXN0b21Mb2dnZXI/OiBMb2dnZXIpIHtcbiAgICB0aGlzLl9sb2dnZXIgPSBjdXN0b21Mb2dnZXIgfHwgbmV3IExvZ2dlcihcIk5lc3RCb290c3RyYXBcIik7XG4gICAgdGhpcy5hcHAudXNlTG9nZ2VyKHRoaXMuX2xvZ2dlcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKENPUlMpIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEFsbG93cyBkZWZpbmluZyBlaXRoZXIgYSB3aWxkY2FyZCBvcmlnaW4gKGBcIipcImApIG9yIGEgbGlzdCBvZiBhbGxvd2VkIG9yaWdpbnMuXG4gICAqIEF1dG9tYXRpY2FsbHkgYWNjZXB0cyBsb2NhbCBkZXZlbG9wbWVudCByZXF1ZXN0cyBhbmQgdGhvc2Ugd2l0aG91dCBvcmlnaW4gaGVhZGVycy5cbiAgICogVGhyb3dzIGEgYENvcnNFcnJvcmAgZm9yIHVuYXV0aG9yaXplZCBvcmlnaW5zLlxuICAgKlxuICAgKiBAcGFyYW0geycqJyB8IHN0cmluZ1tdfSBbb3JpZ2lucz1bXV0gLSBMaXN0IG9mIGFsbG93ZWQgb3JpZ2lucyBvciBgXCIqXCJgIHRvIGFsbG93IGFsbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FsbG93TWV0aG9kcz1bJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXV0gLSBBbGxvd2VkIEhUVFAgbWV0aG9kcy5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICovXG4gIHN0YXRpYyBlbmFibGVDb3JzKFxuICAgIG9yaWdpbnM6IFwiKlwiIHwgc3RyaW5nW10gPSBbXSxcbiAgICBhbGxvd01ldGhvZHM6IHN0cmluZ1tdID0gW1wiR0VUXCIsIFwiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiXVxuICApIHtcbiAgICBjb25zdCBhbGxvd2VkT3JpZ2lucyA9XG4gICAgICBvcmlnaW5zID09PSBcIipcIiA/IFwiKlwiIDogb3JpZ2lucy5tYXAoKG8pID0+IG8udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgY29uc3QgY29yc09wdGlvbnM6IENvcnNPcHRpb25zID0ge1xuICAgICAgb3JpZ2luOiAob3JpZ2luLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICAvLyBBbGxvdyByZXF1ZXN0IHdpdGhvdXQgb3JpZ2luLi4uXG4gICAgICAgIGlmICghb3JpZ2luKSByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFsbG93ZWRPcmlnaW5zID09PSBcIipcIiB8fFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KGFsbG93ZWRPcmlnaW5zKSAmJlxuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnMuaW5jbHVkZXMob3JpZ2luLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhuZXcgQ29yc0Vycm9yKGBPcmlnaW4gJHtvcmlnaW59IG5vdCBhbGxvd2VkYCkpO1xuICAgICAgfSxcbiAgICAgIGNyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgbWV0aG9kczogYWxsb3dNZXRob2RzLmpvaW4oXCIsXCIpLFxuICAgIH07XG5cbiAgICB0aGlzLmFwcC5lbmFibGVDb3JzKGNvcnNPcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQXBwbGllcyB0aGUgSGVsbWV0IG1pZGRsZXdhcmUgZm9yIGVuaGFuY2VkIHNlY3VyaXR5LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBEeW5hbWljYWxseSBsb2FkcyB0aGUgYGhlbG1ldGAgcGFja2FnZSBpZiBhdmFpbGFibGUgYW5kIHJlZ2lzdGVycyBpdFxuICAgKiBhcyBtaWRkbGV3YXJlIHRvIGltcHJvdmUgSFRUUCBoZWFkZXIgc2VjdXJpdHkuIElmIG5vdCBpbnN0YWxsZWQsIGxvZ3MgYSB3YXJuaW5nXG4gICAqIGFuZCBjb250aW51ZXMgZXhlY3V0aW9uIHdpdGhvdXQgdGhyb3dpbmcgZXJyb3JzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtvcHRpb25zXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIEhlbG1ldC5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VIZWxtZXQob3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgIGNvbnN0IGhlbG1ldCA9IHJlcXVpcmUoXCJoZWxtZXRcIik7IC8vIER5bmFtaWMgaW1wb3J0IHRvIGF2b2lkIGhhcmQgZGVwZW5kZW5jeVxuICAgICAgdGhpcy5hcHAudXNlKGhlbG1ldChvcHRpb25zKSk7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coXCJIZWxtZXQgbWlkZGxld2FyZSBlbmFibGVkIHN1Y2Nlc3NmdWxseS5cIik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiSGVsbWV0IG5vdCBpbnN0YWxsZWQuIFNraXBwaW5nIG1pZGRsZXdhcmUuXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDb25maWd1cmVzIGFuZCBpbml0aWFsaXplcyBTd2FnZ2VyIFVJIGZvciBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogVXNlcyB0aGUgYFN3YWdnZXJCdWlsZGVyYCB1dGlsaXR5IHRvIGNvbmZpZ3VyZSBBUEkgZG9jdW1lbnRhdGlvblxuICAgKiB3aXRoIGRldGFpbGVkIGN1c3RvbWl6YXRpb24gZm9yIHRpdGxlLCB2ZXJzaW9uLCBwYXRocywgYW5kIGNvbG9ycy5cbiAgICogU3dhZ2dlciBpcyBhdXRvbWF0aWNhbGx5IGV4cG9zZWQgYXQgdGhlIGNvbmZpZ3VyZWQgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHtTd2FnZ2VyU2V0dXBPcHRpb25zfSBvcHRpb25zIC0gU3dhZ2dlciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgc2V0dXBTd2FnZ2VyKG9wdGlvbnM6IFN3YWdnZXJTZXR1cE9wdGlvbnMpIHtcbiAgICBjb25zdCBzd2FnZ2VyID0gbmV3IFN3YWdnZXJCdWlsZGVyKHRoaXMuYXBwLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uLFxuICAgICAgcGF0aDogb3B0aW9ucy5wYXRoIHx8IFwiYXBpXCIsXG4gICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogb3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbiA/PyB0cnVlLFxuICAgICAgYXNzZXRzUGF0aDogb3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvbkZpbGVQYXRoOiBvcHRpb25zLmZhdmljb25QYXRoLFxuICAgICAgdG9wYmFySWNvbkZpbGVQYXRoOiBvcHRpb25zLnRvcGJhckljb25QYXRoLFxuICAgICAgdG9wYmFyQmdDb2xvcjogb3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgICAgb3BlbkFwaUpzb25QYXRoOiBvcHRpb25zLm9wZW5BcGlKc29uUGF0aCxcbiAgICAgIG9wZW5BcGlZYW1sUGF0aDogb3B0aW9ucy5vcGVuQXBpWWFtbFBhdGgsXG4gICAgfSk7XG4gICAgc3dhZ2dlci5zZXR1cFN3YWdnZXIoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGdsb2JhbCB2YWxpZGF0aW9uIHBpcGVzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBFbmFibGVzIHJlcXVlc3QgcGF5bG9hZCB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvbiBnbG9iYWxseSBhY3Jvc3NcbiAgICogdGhlIGVudGlyZSBOZXN0SlMgYXBwbGljYXRpb24uIE11bHRpcGxlIHBpcGVzIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyXG4gICAqIGZvciBtb2R1bGFyIGlucHV0IHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uUGlwZVRyYW5zZm9ybVtdfSBwaXBlcyAtIFBpcGUgaW5zdGFuY2VzIHRvIHJlZ2lzdGVyIGdsb2JhbGx5LlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxQaXBlcyguLi5waXBlczogUGlwZVRyYW5zZm9ybVtdKSB7XG4gICAgaWYgKHBpcGVzLmxlbmd0aCA+IDApIHRoaXMuYXBwLnVzZUdsb2JhbFBpcGVzKC4uLnBpcGVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGdsb2JhbCBleGNlcHRpb24gZmlsdGVycy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSWYgbm8gZmlsdGVycyBhcmUgcHJvdmlkZWQsIGl0IGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJzIGEgZGVmYXVsdFxuICAgKiBzZXQgb2Ygc3RhbmRhcmQgZXhjZXB0aW9uIGZpbHRlcnMgZm9yIGNvbW1vbiBlcnJvciB0eXBlcyBsaWtlXG4gICAqIGBIdHRwRXhjZXB0aW9uYCwgYFZhbGlkYXRpb25FeGNlcHRpb25gLCBgQ29uZmxpY3RFeGNlcHRpb25gLCBhbmQgb3RoZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLkV4Y2VwdGlvbkZpbHRlcltdfSBmaWx0ZXJzIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSBnbG9iYWxseS5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxGaWx0ZXJzKC4uLmZpbHRlcnM6IGFueVtdKSB7XG4gICAgdGhpcy5hcHAudXNlR2xvYmFsRmlsdGVycyhcbiAgICAgIC4uLihmaWx0ZXJzLmxlbmd0aCA+IDAgPyBmaWx0ZXJzIDogW25ldyBEZWNhZkV4Y2VwdGlvbkZpbHRlcigpXSlcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgZ2xvYmFsIGludGVyY2VwdG9ycyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgdHJhbnNmb3JtYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEludGVyY2VwdG9ycyBhbGxvdyBhZHZhbmNlZCByZXF1ZXN0L3Jlc3BvbnNlIG1hbmlwdWxhdGlvbiBzdWNoIGFzXG4gICAqIHNlcmlhbGl6YXRpb24sIGxvZ2dpbmcsIG9yIHRyYW5zZm9ybWF0aW9uLiBNdWx0aXBsZSBpbnRlcmNlcHRvcnNcbiAgICogY2FuIGJlIGFkZGVkIGZvciBtb2R1bGFyIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uTmVzdEludGVyY2VwdG9yW119IGludGVyY2VwdG9ycyAtIEludGVyY2VwdG9yIGluc3RhbmNlcyB0byByZWdpc3Rlci5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzOiBOZXN0SW50ZXJjZXB0b3JbXSkge1xuICAgIGlmIChpbnRlcmNlcHRvcnMubGVuZ3RoID4gMClcbiAgICAgIHRoaXMuYXBwLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi5pbnRlcmNlcHRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTdGFydHMgdGhlIE5lc3RKUyBhcHBsaWNhdGlvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGdpdmVuIHBvcnQgYW5kIGhvc3QuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIExpc3RlbnMgb24gdGhlIHNwZWNpZmllZCBwb3J0IGFuZCBvcHRpb25hbGx5IGEgaG9zdC4gT25jZSBzdGFydGVkLFxuICAgKiBsb2dzIHRoZSBhcHBsaWNhdGlvbiBVUkwgZm9yIGVhc3kgYWNjZXNzLiBUaGUgc3RhcnR1cCBwcm9jZXNzIHJlc29sdmVzXG4gICAqIG9uY2UgdGhlIGFwcGxpY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBydW5uaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BvcnQ9MzAwMF0gLSBQb3J0IG51bWJlciB0byBsaXN0ZW4gb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbaG9zdF0gLSBPcHRpb25hbCBob3N0IG9yIElQIGFkZHJlc3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIHtib29sZWFufSBbbG9nPXRydWVdIC0gV2hldGhlciB0byBsb2cgdGhlIGFwcGxpY2F0aW9uIFVSTCB1cG9uIHN0YXJ0dXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIG9uY2UgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cyBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc3RhcnQoXG4gICAgcG9ydDogbnVtYmVyID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDAsXG4gICAgaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGxvZzogYm9vbGVhbiA9IHRydWVcbiAgKSB7XG4gICAgdGhpcy5hcHAubGlzdGVuKHBvcnQsIGhvc3QgYXMgYW55KS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5hcHAuZ2V0VXJsKCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhg8J+agCBBcHBsaWNhdGlvbiBpcyBydW5uaW5nIGF0OiAke3VybH1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2FsbEhhbmRsZXIsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgU2NvcGUsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZIYW5kbGVyRXhlY3V0b3IsIERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgRGVmYXVsdEFkYXB0ZXJGbGFncyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJGbGFncyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCBcIi4uL292ZXJyaWRlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogSW50ZXJjZXB0b3IgcmVzcG9uc2libGUgZm9yIGV4ZWN1dGluZyBhbGwgcmVnaXN0ZXJlZCBEZWNhZiByZXF1ZXN0IGhhbmRsZXJzXG4gKiBiZWZvcmUgdGhlIGNvbnRyb2xsZXIgbWV0aG9kIGlzIGludm9rZWQuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSB7QGxpbmsgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yfSBpbnRlZ3JhdGVzIHRoZSBEZWNhZiByZXF1ZXN0LWhhbmRsaW5nIHBpcGVsaW5lXG4gKiBpbnRvIE5lc3RKUycgaW50ZXJjZXB0b3IgbWVjaGFuaXNtLiBCZWZvcmUgcGFzc2luZyBleGVjdXRpb24gdG8gdGhlIG5leHQgaGFuZGxlciBpbiB0aGVcbiAqIE5lc3RKUyBjaGFpbiwgaXQgZGVsZWdhdGVzIHJlcXVlc3QgcHJvY2Vzc2luZyB0byB0aGUge0BsaW5rIERlY2FmSGFuZGxlckV4ZWN1dG9yfSwgd2hpY2hcbiAqIHNlcXVlbnRpYWxseSBydW5zIGFsbCByZWdpc3RlcmVkIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVyfSBpbnN0YW5jZXMuIFRoaXMgYWxsb3dzXG4gKiBiZWhhdmlvcnMgc3VjaCBhcyBhdXRoZW50aWNhdGlvbiwgbG9nZ2luZywgdGVuYW50IHJlc29sdXRpb24sIG9yIG1ldGFkYXRhIGVucmljaG1lbnRcbiAqIHRvIG9jY3VyIHByaW9yIHRvIGNvbnRyb2xsZXIgZXhlY3V0aW9uLlxuICpcbiAqIEBjbGFzcyBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEFwcGx5IGdsb2JhbGx5OlxuICogYXBwLnVzZUdsb2JhbEludGVyY2VwdG9ycyhuZXcgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yKGV4ZWN1dG9yKSk7XG4gKlxuICogLy8gT3IgaW4gYSBtb2R1bGU6XG4gKiBATW9kdWxlKHtcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gKiAgICAge1xuICogICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICogICAgICAgdXNlQ2xhc3M6IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbiAqICAgICB9LFxuICogICBdLFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgICBwYXJ0aWNpcGFudCBJbnRlcmNlcHRvclxuICogICAgIHBhcnRpY2lwYW50IEV4ZWN1dG9yXG4gKiAgICAgcGFydGljaXBhbnQgQ29udHJvbGxlclxuICpcbiAqICAgICBDbGllbnQtPj5JbnRlcmNlcHRvcjogSFRUUCBSZXF1ZXN0XG4gKiAgICAgSW50ZXJjZXB0b3ItPj5FeGVjdXRvcjogZXhlYyhyZXF1ZXN0KVxuICogICAgIEV4ZWN1dG9yLS0+PkludGVyY2VwdG9yOiBoYW5kbGVycyBjb21wbGV0ZWRcbiAqICAgICBJbnRlcmNlcHRvci0+PkNvbnRyb2xsZXI6IG5leHQuaGFuZGxlKClcbiAqICAgICBDb250cm9sbGVyLS0+PkNsaWVudDogUmVzcG9uc2VcbiAqL1xuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE5lc3RJbnRlcmNlcHRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXF1ZXN0Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXhlY3V0b3I6IERlY2FmSGFuZGxlckV4ZWN1dG9yXG4gICkge31cblxuICBwcm90ZWN0ZWQgYXN5bmMgY29udGV4dHVhbGl6ZShyZXE6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycztcbiAgICBjb25zdCBmbGFnczogRGVjYWZTZXJ2ZXJGbGFncyA9IHtcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBvdmVycmlkZXM6IHt9LFxuICAgIH0gYXMgYW55O1xuXG4gICAgY29uc3QgaXAgPSBleHRyYWN0SXAocmVxKTtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmdldCgpLmZvcih7IGlwIH0pO1xuXG4gICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIERlZmF1bHRBZGFwdGVyRmxhZ3MsXG4gICAgICAgIHtcbiAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIG9wZXJhdGlvbjogYCR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWAsXG4gICAgICAgIH0sXG4gICAgICAgIGZsYWdzXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGludGVyY2VwdChjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBuZXh0OiBDYWxsSGFuZGxlcikge1xuICAgIGNvbnN0IHJlcSA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHJlcyA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVzcG9uc2UoKTtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IpLmZvcih0aGlzLmludGVyY2VwdCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jb250ZXh0dWFsaXplKHJlcSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IGNvbnRleHR1YWxpemVkIC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG5cbiAgICBhd2FpdCB0aGlzLmV4ZWN1dG9yLmV4ZWMocmVxLCByZXMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDT05URVhUICR7dGhpcy5yZXF1ZXN0Q29udGV4dC51dWlkfSBleGVjdXRvcnMgZmluaXNoZWQgLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0SXAocmVxOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBoZWFkZXJzID0gcmVxLmhlYWRlcnM7XG4gIGZ1bmN0aW9uIHBhcnNlSXBIZWFkZXIodmFsdWU/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pWzBdO1xuICB9XG4gIHJldHVybiAoXG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJ4LWZvcndhcmRlZC1mb3JcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJ4LXJlYWwtaXBcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJYLUZvcndhcmRlZC1Gb3JcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJYLVJlYWwtSVBcIl0pID8/XG4gICAgcmVxLmlwXG4gICk7XG59XG4iLCJpbXBvcnQgeyBJbmplY3QgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBpbmplY3RhYmxlU2VydmljZUtleSxcbiAgTW9kZWxTZXJ2aWNlLFxuICBSZXBvc2l0b3J5IGFzIENvcmVSZXBvc2l0b3J5LFxuICBTZXJ2aWNlIGFzIENvcmVTZXJ2aWNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5leHBvcnQgdHlwZSBEZWNhZkZhY3RvcnlQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogc3RyaW5nO1xuICB1c2VGYWN0b3J5OiAoKSA9PiB1bmtub3duO1xufTtcblxuY29uc3QgcGVuZGluZ1Byb3ZpZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBEZWNhZkZhY3RvcnlQcm92aWRlcj4oKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRHJhaW5zIHRoZSBwcm92aWRlcnMgcmVnaXN0ZXJlZCBieSB7QGxpbmsgU2VydmljZX0ve0BsaW5rIFJlcG9zaXRvcnl9IHVzYWdlcy5cbiAqIEBzdW1tYXJ5IENvbnN1bWVkIGJ5IHtAbGluayBEZWNhZkNvcmVNb2R1bGUuZm9yUm9vdH0gdG8gd2lyZSB0aGUgdG9rZW5zIHRoYXQgdGhvc2UgcGFyYW1ldGVyXG4gKiBkZWNvcmF0b3JzIHJlZmVyZW5jZSBiYWNrIGludG8gTmVzdCdzIERJIGNvbnRhaW5lciwgc2luY2UgYSBwYXJhbWV0ZXIgZGVjb3JhdG9yIGFsb25lIGNhbm5vdFxuICogc3VwcGx5IGEgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMoKTogRGVjYWZGYWN0b3J5UHJvdmlkZXJbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHBlbmRpbmdQcm92aWRlcnMudmFsdWVzKCkpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclByb3ZpZGVyKHRva2VuOiBzdHJpbmcsIHVzZUZhY3Rvcnk6ICgpID0+IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKHBlbmRpbmdQcm92aWRlcnMuaGFzKHRva2VuKSkgcmV0dXJuO1xuICBwZW5kaW5nUHJvdmlkZXJzLnNldCh0b2tlbiwgeyBwcm92aWRlOiB0b2tlbiwgdXNlRmFjdG9yeSB9KTtcbn1cblxuZnVuY3Rpb24gaXNNb2RlbENvbnN0cnVjdG9yKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29uc3RydWN0b3I8YW55PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWx1ZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBNb2RlbDtcbn1cblxuZnVuY3Rpb24gbW9kZWxTZXJ2aWNlVG9rZW4obW9kZWw6IENvbnN0cnVjdG9yPGFueT4pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bW9kZWwubmFtZX1TZXJ2aWNlYDtcbn1cblxuZnVuY3Rpb24gbW9kZWxSZXBvc2l0b3J5VG9rZW4oXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gZmxhdm91ciA/IGAke21vZGVsLm5hbWV9UmVwb3NpdG9yeUAke2ZsYXZvdXJ9YCA6IGAke21vZGVsLm5hbWV9UmVwb3NpdG9yeWA7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdG9yIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVjYWYgc2VydmljZS5cbiAqIEBzdW1tYXJ5IFRyYW5zbGF0ZXMgZGVjYWYncyBzZXJ2aWNlIHJlc29sdXRpb24gQVBJcyBpbnRvIGEgTmVzdCBgQEluamVjdCgpYCBjYWxsOlxuICogLSBgQFNlcnZpY2UoU29tZU1vZGVsKWAgaW5qZWN0cyB0aGUgYE1vZGVsU2VydmljZTxTb21lTW9kZWw+YCBzaW5nbGV0b24gZm9yIHRoYXQgbW9kZWxcbiAqICAgKHZpYSB7QGxpbmsgTW9kZWxTZXJ2aWNlLmZvck1vZGVsfSkuXG4gKiAtIGBAU2VydmljZShTb21lU2VydmljZUNsYXNzKWAgb3IgYEBTZXJ2aWNlKFwiYWxpYXNcIilgIGluamVjdHMgdGhlIG1hdGNoaW5nIGBAc2VydmljZSgpYC1kZWNvcmF0ZWRcbiAqICAgZGVjYWYge0BsaW5rIENvcmVTZXJ2aWNlfSAodmlhIHtAbGluayBDb3JlU2VydmljZS5nZXR9KS5cbiAqIC0gYEBTZXJ2aWNlKClgIGluZmVycyB0aGUgcGFyYW1ldGVyJ3MgdHlwZSBmcm9tIGVtaXR0ZWQgY29uc3RydWN0b3IgbWV0YWRhdGEgYW5kIHJlc29sdmVzIGl0IHRoZVxuICogICBzYW1lIHdheSwgcHJvdmlkZWQgdGhlIHBhcmFtZXRlciBpcyB0eXBlZCBhcyBhIGNvbmNyZXRlIGNsYXNzIChnZW5lcmljcyBsaWtlIGBNb2RlbFNlcnZpY2U8WD5gXG4gKiAgIGFyZSBlcmFzZWQgYXQgcnVudGltZSwgc28gdGhlIG1vZGVsLXNlcnZpY2UgZm9ybSBhbHdheXMgcmVxdWlyZXMgYW4gZXhwbGljaXQgYXJndW1lbnQpLlxuICogQHBhcmFtIGtleSB0aGUgbW9kZWwgY2xhc3MsIHNlcnZpY2UgY2xhc3MsIG9yIGFsaWFzIHRvIHJlc29sdmUuIE9taXQgdG8gaW5mZXIgZnJvbSB0aGUgcGFyYW1ldGVyIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXJ2aWNlKGtleT86IHN0cmluZyB8IENvbnN0cnVjdG9yPGFueT4pOiBQYXJhbWV0ZXJEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWQsXG4gICAgcGFyYW1ldGVySW5kZXg6IG51bWJlclxuICApOiB2b2lkID0+IHtcbiAgICBsZXQgcmVzb2x2ZWQ6IHN0cmluZyB8IENvbnN0cnVjdG9yPGFueT4gfCB1bmRlZmluZWQgPSBrZXk7XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgcGFyYW1UeXBlczogYW55W10gPVxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgdGFyZ2V0KSB8fCBbXTtcbiAgICAgIHJlc29sdmVkID0gcGFyYW1UeXBlc1twYXJhbWV0ZXJJbmRleF07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEBTZXJ2aWNlKCkgY291bGQgbm90IGRldGVybWluZSBhbiBpbmplY3Rpb24gdHlwZSBmb3IgcGFyYW1ldGVyICR7cGFyYW1ldGVySW5kZXh9IG9mICR7KHRhcmdldCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KS5uYW1lfS4gUHJvdmlkZSBhbiBleHBsaWNpdCBhcmd1bWVudCwgZS5nLiBAU2VydmljZShTb21lU2VydmljZSkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhc01vZGVsID0gdHlwZW9mIHJlc29sdmVkICE9PSBcInN0cmluZ1wiICYmIGlzTW9kZWxDb25zdHJ1Y3RvcihyZXNvbHZlZCk7XG4gICAgY29uc3QgdG9rZW4gPSBhc01vZGVsXG4gICAgICA/IG1vZGVsU2VydmljZVRva2VuKHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pXG4gICAgICA6IGluamVjdGFibGVTZXJ2aWNlS2V5KHJlc29sdmVkIGFzIHN0cmluZyB8IENvbnN0cnVjdG9yPGFueT4pO1xuXG4gICAgcmVnaXN0ZXJQcm92aWRlcih0b2tlbiwgKCkgPT4ge1xuICAgICAgaWYgKGFzTW9kZWwpIHJldHVybiBNb2RlbFNlcnZpY2UuZm9yTW9kZWwocmVzb2x2ZWQgYXMgQ29uc3RydWN0b3I8YW55Pik7XG4gICAgICByZXR1cm4gdHlwZW9mIHJlc29sdmVkID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gQ29yZVNlcnZpY2UuZ2V0KHJlc29sdmVkKVxuICAgICAgICA6IENvcmVTZXJ2aWNlLmdldChyZXNvbHZlZCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBJbmplY3QodG9rZW4pKHRhcmdldCwgcHJvcGVydHlLZXksIHBhcmFtZXRlckluZGV4KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uc3RydWN0b3IgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZWNhZiB7QGxpbmsgQ29yZVJlcG9zaXRvcnl9IGZvciBgbW9kZWxgLlxuICogQHN1bW1hcnkgVW5saWtlIHtAbGluayBTZXJ2aWNlfSwgYG1vZGVsYCBpcyBhbHdheXMgdHJlYXRlZCBhcyBhIE1vZGVsIGNsYXNzOiB0aGUgc2FtZSBjbGFzcyBwYXNzZWRcbiAqIHRvIGBAU2VydmljZShtb2RlbClgIGFuZCBgQFJlcG9zaXRvcnkobW9kZWwpYCByZXNvbHZlcyB0byB0d28gZGlmZmVyZW50IGluamVjdGVkIG9iamVjdHMgKGFcbiAqIGBNb2RlbFNlcnZpY2U8TT5gIHZzIGEgYFJlcG9zaXRvcnk8TT5gIHJlc3BlY3RpdmVseSksIHZpYSB7QGxpbmsgQ29yZVJlcG9zaXRvcnkuZm9yTW9kZWx9LlxuICogQHBhcmFtIG1vZGVsIHRoZSBtb2RlbCBjbGFzcyB0byByZXNvbHZlIGEgcmVwb3NpdG9yeSBmb3IuXG4gKiBAcGFyYW0gZmxhdm91ciBvcHRpb25hbCBhZGFwdGVyIGZsYXZvdXIvYWxpYXMsIGZvcndhcmRlZCB0byB7QGxpbmsgQ29yZVJlcG9zaXRvcnkuZm9yTW9kZWx9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gUmVwb3NpdG9yeShcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIGZsYXZvdXI/OiBzdHJpbmdcbik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBwYXJhbWV0ZXJJbmRleDogbnVtYmVyXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRva2VuID0gbW9kZWxSZXBvc2l0b3J5VG9rZW4obW9kZWwsIGZsYXZvdXIpO1xuICAgIHJlZ2lzdGVyUHJvdmlkZXIodG9rZW4sICgpID0+IENvcmVSZXBvc2l0b3J5LmZvck1vZGVsKG1vZGVsLCBmbGF2b3VyKSk7XG4gICAgcmV0dXJuIEluamVjdCh0b2tlbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgcGFyYW1ldGVySW5kZXgpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgRHluYW1pY01vZHVsZSxcbiAgR2xvYmFsLFxuICBJbmplY3QsXG4gIE1vZHVsZSxcbiAgT25BcHBsaWNhdGlvblNodXRkb3duLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFQUF9JTlRFUkNFUFRPUiwgTW9kdWxlUmVmIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgREVDQUZfQURBUFRFUl9JRCxcbiAgREVDQUZfSEFORExFUlMsXG4gIERFQ0FGX01PRFVMRV9PUFRJT05TLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbn0gZnJvbSBcIi4vaW50ZXJjZXB0b3JzXCI7XG5pbXBvcnQgeyBEZWNhZkhhbmRsZXJFeGVjdXRvciwgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL3JlcXVlc3RcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBQZXJzaXN0ZW5jZVNlcnZpY2UsIFNlcnZpY2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycyB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyLFxuICByZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbkBHbG9iYWwoKVxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZkNvcmVNb2R1bGU8Q09ORiwgQURBUFRFUiBleHRlbmRzIEFkYXB0ZXI8Q09ORiwgYW55LCBhbnksIGFueT4+XG4gIGltcGxlbWVudHMgT25BcHBsaWNhdGlvblNodXRkb3duXG57XG4gIHByaXZhdGUgc3RhdGljIF9sb2dnZXI6IExvZ2dlcjtcblxuICBwcml2YXRlIHN0YXRpYyBfcGVyc2lzdGVuY2U/OiBQZXJzaXN0ZW5jZVNlcnZpY2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+PjtcblxuICBwcm90ZWN0ZWQgc3RhdGljIGdldCBwZXJzaXN0ZW5jZSgpOiBQZXJzaXN0ZW5jZVNlcnZpY2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+PiB7XG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiUGVyc2lzdGVuY2Ugc2VydmljZSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgcmV0dXJuIHRoaXMuX3BlcnNpc3RlbmNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLl9sb2dnZXIpIHRoaXMuX2xvZ2dlciA9IExvZ2dpbmcuZm9yKERlY2FmQ29yZU1vZHVsZSk7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2dlcjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREVDQUZfTU9EVUxFX09QVElPTlMpXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnM8Q09ORiwgQURBUFRFUj4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVSZWY6IE1vZHVsZVJlZlxuICApIHt9XG5cbiAgc3RhdGljIGZvclJvb3Qob3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zKTogRHluYW1pY01vZHVsZSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZm9yUm9vdCk7XG4gICAgY29uc3QgZGVjYWZQcm92aWRlcnMgPSBnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZkNvcmVNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBERUNBRl9NT0RVTEVfT1BUSU9OUywgdXNlVmFsdWU6IG9wdGlvbnMgfSxcbiAgICAgICAgeyBwcm92aWRlOiBERUNBRl9BREFQVEVSX0lELCB1c2VWYWx1ZTogdGhpcy5wZXJzaXN0ZW5jZT8uY2xpZW50IH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBERUNBRl9IQU5ETEVSUyxcbiAgICAgICAgICB1c2VGYWN0b3J5OiAoKSA9PlxuICAgICAgICAgICAgb3B0aW9ucy5oYW5kbGVycz8ubWFwKChIKSA9PiB7XG4gICAgICAgICAgICAgIGxvZy5pbmZvKGBSZWdpc3RlcmVkIHJlcXVlc3QgaGFuZGxlcjogJHtILm5hbWV9YCk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgSCgpO1xuICAgICAgICAgICAgfSkgPz8gW10sXG4gICAgICAgIH0sXG4gICAgICAgIERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgICAgIERlY2FmSGFuZGxlckV4ZWN1dG9yLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICAgICAgICAgIHVzZUNsYXNzOiBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmRlY2FmUHJvdmlkZXJzLFxuICAgICAgXSxcbiAgICAgIGV4cG9ydHM6IFtcbiAgICAgICAgREVDQUZfTU9EVUxFX09QVElPTlMsXG4gICAgICAgIERFQ0FGX0FEQVBURVJfSUQsXG4gICAgICAgIERFQ0FGX0hBTkRMRVJTLFxuICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICBEZWNhZkhhbmRsZXJFeGVjdXRvcixcbiAgICAgICAgLi4uZGVjYWZQcm92aWRlcnMubWFwKChwcm92aWRlcikgPT4gcHJvdmlkZXIucHJvdmlkZSksXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgYm9vdFBlcnNpc3RlbmNlKFxuICAgIG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uc1xuICApOiBQcm9taXNlPEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuYm9vdFBlcnNpc3RlbmNlKTtcblxuICAgIGlmICghdGhpcy5fcGVyc2lzdGVuY2UpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBvcHRpb25zLmNvbmYubWFwKChbY29udHIsIGNmZywgLi4uYXJnc10pID0+IHtcbiAgICAgICAgY29uc3QgcG9zc2libGUgPSBhcmdzLnBvcCgpO1xuICAgICAgICBpZiAoIXBvc3NpYmxlKSByZXR1cm4gW2NvbnRyLCBjZmddO1xuICAgICAgICByZXR1cm4gW2NvbnRyLCBjZmcsIC4uLmFyZ3NdO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9wZXJzaXN0ZW5jZSA9IG5ldyBQZXJzaXN0ZW5jZVNlcnZpY2UoKTtcbiAgICAgIGF3YWl0IHRoaXMuX3BlcnNpc3RlbmNlLmJvb3QodHJpbW1lZCk7XG4gICAgICBjb25zdCBjbGllbnRzID0gdGhpcy5fcGVyc2lzdGVuY2UuY2xpZW50O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGllbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGMgPSBvcHRpb25zLmNvbmZbaV07XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlVHJhbnNmID0gYy5zbGljZSgyLCBjLmxlbmd0aCk7XG4gICAgICAgIGxldCB0cmFuc2Zvcm1lciA9IHBvc3NpYmxlVHJhbnNmLnBvcCgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXRyYW5zZm9ybWVyIHx8XG4gICAgICAgICAgISh0cmFuc2Zvcm1lciBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PikuZnJvbVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBjb250ciA9IEFkYXB0ZXIudHJhbnNmb3JtZXJGb3IoY2xpZW50c1tpXS5mbGF2b3VyKTtcbiAgICAgICAgICBpZiAoIWNvbnRyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgIGBObyB0cmFuc2Zvcm1lciBmb3VuZCBmb3IgZmxhdm91ciAke2NsaWVudHNbaV0uZmxhdm91cn0uIHlvdSBzaG91bGQgZWl0aGVyIEByZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIgb3IgcHJvdmlkZSBhIHRyYW5zZm9ybWVyIGluIHRoZSBjb25maWdgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm1lciA9IChjb250ciBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PikuZnJvbVxuICAgICAgICAgICAgICA/IGNvbnRyXG4gICAgICAgICAgICAgIDogbmV3IChjb250ciBhcyBDb25zdHJ1Y3RvcjxSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55Pj4pKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gYm9vdCB0cmFuc2Zvcm1lciBmb3IgJHtjbGllbnRzW2ldLmZsYXZvdXJ9OiAke2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyKGNsaWVudHNbaV0uZmxhdm91cikodHJhbnNmb3JtZXIpO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oXCJwZXJzaXN0ZW5jZSBsYXllciBjcmVhdGVkIHN1Y2Nlc3NmdWxseSFcIik7XG5cbiAgICAgIGlmIChvcHRpb25zLmluaXRpYWxpemF0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0aWFsaXphdGlvbigpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIGFwcGxpY2F0aW9uOiAke2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5jbGllbnQ7XG4gIH1cblxuICBhc3luYyBvbkFwcGxpY2F0aW9uU2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gRGVjYWZDb3JlTW9kdWxlLmxvZy5mb3IodGhpcy5vbkFwcGxpY2F0aW9uU2h1dGRvd24pO1xuICAgIGNvbnN0IGFkYXB0ZXJzOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXSA9XG4gICAgICB0aGlzLm1vZHVsZVJlZi5nZXQ8YW55PihERUNBRl9BREFQVEVSX0lEKTtcbiAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgYWRhcHRlcnMpXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICAgIGxvZy5pbmZvKGBTaHV0dGluZyBkb3duICR7YWRhcHRlci50b1N0cmluZygpfWApO1xuICAgICAgICAgIGF3YWl0IGFkYXB0ZXIuc2h1dGRvd24oKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBzaHV0ZG93biBhcHBsaWNhdGlvbmAsIGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBTZXJ2aWNlLnNodXRkb3duKCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gc2VydmljZXNgLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMgPSBTeW1ib2woXG4gIFwiTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTXCJcbik7XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UoYXJnczogYW55W10pOiB1bmtub3duW10ge1xuICBjb25zdCBbbW9kZWxDb25zdHIsIG9wZXJhdGlvbiwgaWQsIHBheWxvYWRdID0gYXJncztcblxuICBjb25zdCBtb2RlbE5hbWUgPSBtb2RlbENvbnN0cj8ubmFtZSA/PyBtb2RlbENvbnN0cjtcblxuICBjb25zdCBzZXJpYWxpemVkUGF5bG9hZCA9IEFycmF5LmlzQXJyYXkocGF5bG9hZClcbiAgICA/IHBheWxvYWQubWFwKChlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBlLnNlcmlhbGl6ZSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZS5zZXJpYWxpemUoKTtcblxuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBQYXlsb2FkIGl0ZW0gZm9yICR7bW9kZWxOYW1lfSBkb2VzIG5vdCBoYXZlIHNlcmlhbGl6ZSBtZXRob2QgYW5kIGlzIGFuICR7dHlwZW9mIGV9LCBhdHRlbXB0aW5nIHRvIHN0cmluZ2lmeSBkaXJlY3RseS4gSXRlbTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gXCJzdHJpbmdcIiA/IGUgOiBKU09OLnN0cmluZ2lmeShlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gc2VyaWFsaXplIHBheWxvYWQgZm9yICR7bW9kZWxOYW1lfTogJHtlcnJ9YCk7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICA6IHBheWxvYWQgJiYgdHlwZW9mIHBheWxvYWQuc2VyaWFsaXplID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gcGF5bG9hZC5zZXJpYWxpemUoKVxuICAgICAgOiB0eXBlb2YgcGF5bG9hZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IHBheWxvYWRcbiAgICAgICAgOiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcblxuICBjb25zb2xlLmRlYnVnKFxuICAgIGBOb3JtYWxpemVkIGV2ZW50IHJlc3BvbnNlIGZvciBtb2RlbCAke21vZGVsTmFtZX0sIG9wZXJhdGlvbiAke29wZXJhdGlvbn0sIGlkICR7aWR9OmAsXG4gICAgc2VyaWFsaXplZFBheWxvYWRcbiAgKTtcblxuICByZXR1cm4gW21vZGVsTmFtZSwgb3BlcmF0aW9uLCBpZCwgc2VyaWFsaXplZFBheWxvYWRdO1xufVxuIiwiaW1wb3J0IHsgRGVjYWZDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXJzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIE9ic2VydmVyIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyLCBJbmplY3QsIE1lc3NhZ2VFdmVudCwgUXVlcnksIFNzZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgaW50ZXJ2YWwsIG1lcmdlLCBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyB9IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgbWFwLCB0YXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuQENvbnRyb2xsZXIoKVxuZXhwb3J0IGNsYXNzIEV2ZW50c0NvbnRyb2xsZXIgZXh0ZW5kcyBEZWNhZkNvbnRyb2xsZXI8RGVjYWZTZXJ2ZXJDdHg+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhZGFwdGVyczogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBASW5qZWN0KExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUykgZmxhdm91cnM6IHN0cmluZ1tdXG4gICkge1xuICAgIHN1cGVyKGNsaWVudENvbnRleHQsIEV2ZW50c0NvbnRyb2xsZXIubmFtZSk7XG4gICAgdGhpcy5hZGFwdGVycyA9IGZsYXZvdXJzLm1hcCgoZmxhdm91cikgPT4gKEFkYXB0ZXIgYXMgYW55KS5nZXQoZmxhdm91cikpOyAvLyBjaGFuZ2UgdG8gQWRhcHRlci5jYWNoZShcIlwiKVxuICB9XG5cbiAgQFNzZSgpXG4gIGxpc3RlbigpOiBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKEV2ZW50c0NvbnRyb2xsZXIubmFtZSk7XG5cbiAgICBjb25zdCBldmVudHMkID0gbmV3IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50Pigob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IG9ic2VydmVySWQgPVxuICAgICAgICBgQi0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpfWAudG9VcHBlckNhc2UoKTtcblxuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBDcmVhdGluZyBTU0Ugb2JzZXJ2ZXI6ICR7b2JzZXJ2ZXJJZH0gZm9yIGNsaWVudCAke3RoaXMuY2xpZW50Q29udGV4dC51dWlkfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBjYiA9IG5ldyAoY2xhc3MgaW1wbGVtZW50cyBPYnNlcnZlciB7XG4gICAgICAgIG9ic2VydmVySWQgPSBvYnNlcnZlcklkO1xuICAgICAgICByZWZyZXNoKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFNTRSBvYnNlcnZlciAke3RoaXMub2JzZXJ2ZXJJZH0gcmVjZWl2ZWQgcmVmcmVzaCBldmVudGBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBub3JtYWxpemVFdmVudFJlc3BvbnNlKGFyZ3MpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IHR5cGU6IFwibWVzc2FnZVwiLCBkYXRhIH0pO1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICBgU1NFIG9ic2VydmVyICR7dGhpcy5vYnNlcnZlcklkfSBldmVudCBwdXNoZWQgdG8gY2xpZW50YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgbG9nZ2VyLnZlcmJvc2UoXG4gICAgICAgIGBSZWdpc3RlcmluZyBvYnNlcnZlciAke29ic2VydmVySWR9IGFjcm9zcyAke3RoaXMuYWRhcHRlcnMubGVuZ3RofSBhZGFwdGVyKHMpYFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgIGNvbnN0IGFkYXB0ZXJOYW1lID0gYWRhcHRlcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gXCJVbmtub3duQWRhcHRlclwiO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBSZWdpc3RlcmluZyBvYnNlcnZlciAke29ic2VydmVySWR9IGluIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhZGFwdGVyLm9ic2VydmUoY2IpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHJlZ2lzdGVyIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfTogJHtlPy5tZXNzYWdlIHx8IGV9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2xlYW5pbmcgdXAgU1NFIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH1gKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICAgIGNvbnN0IGFkYXB0ZXJOYW1lID0gYWRhcHRlcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gXCJVbmtub3duQWRhcHRlclwiO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBVbnJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gZnJvbSBhZGFwdGVyICR7YWRhcHRlck5hbWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFkYXB0ZXIudW5PYnNlcnZlKGNiKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYEZhaWxlZCBkdXJpbmcgY2xlYW51cCBvZiBvYnNlcnZlciAke29ic2VydmVySWR9IGluIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX06ICR7ZT8ubWVzc2FnZSB8fCBlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgSEVBUlRCRUFUX0lOVEVSVkFMX01TID0gMTUwMDA7XG4gICAgY29uc3QgaGVhcnRiZWF0JCA9IGludGVydmFsKEhFQVJUQkVBVF9JTlRFUlZBTF9NUykucGlwZShcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcIlNlbmRpbmcgaGVhcnRiZWF0XCIpO1xuICAgICAgfSksXG4gICAgICBtYXAoXG4gICAgICAgICgpOiBNZXNzYWdlRXZlbnQgPT4gKHtcbiAgICAgICAgICB0eXBlOiBcImhlYXJ0YmVhdFwiLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgcmV0dXJuIG1lcmdlKGV2ZW50cyQsIGhlYXJ0YmVhdCQpO1xuICB9XG5cbiAgQFNzZShcIi86bW9kZWxcIilcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBsaXN0ZW5Gb3JNb2RlbChAUXVlcnkoXCJtb2RlbFwiKSBtb2RlbDogc3RyaW5nKTogT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihFdmVudHNDb250cm9sbGVyLm5hbWUpO1xuXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4oKG9ic2VydmVyKSA9PiB7XG4gICAgICBjb25zdCBjYiA9IG5ldyAoY2xhc3MgaW1wbGVtZW50cyBPYnNlcnZlciB7XG4gICAgICAgIHJlZnJlc2goLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZGF0YTogYXJncyB9IGFzIGFueSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgYWRhcHRlci5vYnNlcnZlKGNiKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGBGYWlsZWQgdG8gb2JzZXJ2ZSBldmVudDogJHtlLm1lc3NhZ2UgfHwgZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICAgICAgYWRhcHRlci51bk9ic2VydmUoY2IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEV2ZW50c0NvbnRyb2xsZXIgfSBmcm9tIFwiLi9FdmVudHNDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMgfSBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZTdHJlYW1Nb2R1bGUge1xuICBzdGF0aWMgZm9yRmxhdm91cnMoXG4gICAgZmxhdm91cnM6IHN0cmluZ1tdLFxuICAgIHBhdGg6IHN0cmluZyA9IFwiZXZlbnRzXCJcbiAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZTdHJlYW1Nb2R1bGUsXG4gICAgICBjb250cm9sbGVyczogW0V2ZW50c0NvbnRyb2xsZXJdLFxuICAgICAgaW1wb3J0czogW1xuICAgICAgICBSb3V0ZXJNb2R1bGUucmVnaXN0ZXIoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBhdGg6IHBhdGgucmVwbGFjZSgvXlxcLy8sIFwiXCIpLFxuICAgICAgICAgICAgbW9kdWxlOiBEZWNhZlN0cmVhbU1vZHVsZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIF0sXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyxcbiAgICAgICAgICB1c2VWYWx1ZTogZmxhdm91cnMgPz8gW10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIEZvcndhcmRSZWZlcmVuY2UsIE1vZHVsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmQ29yZU1vZHVsZSB9IGZyb20gXCIuL2NvcmUtbW9kdWxlXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBnZXRNb2R1bGVGb3IgfSBmcm9tIFwiLi9kZWNhZi1tb2RlbC9pbmRleFwiO1xuaW1wb3J0IHsgRGVjYWZTdHJlYW1Nb2R1bGUgfSBmcm9tIFwiLi9ldmVudHMtbW9kdWxlXCI7XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmTW9kdWxlIHtcbiAgc3RhdGljIGFzeW5jIGZvclJvb3RBc3luYyhcbiAgICBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxEeW5hbWljTW9kdWxlPiB7XG4gICAgY29uc3QgeyBhdXRvQ29udHJvbGxlcnMsIGF1dG9TZXJ2aWNlcyB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGFkYXB0ZXJzOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXSA9XG4gICAgICBhd2FpdCBEZWNhZkNvcmVNb2R1bGUuYm9vdFBlcnNpc3RlbmNlKG9wdGlvbnMpO1xuICAgIGNvbnN0IGZsYXZvdXJzID0gYWRhcHRlcnMubWFwKChhZGFwdGVyKSA9PiBhZGFwdGVyLmZsYXZvdXIpO1xuXG4gICAgY29uc3QgaW1wb3J0czpcbiAgICAgIHwgKFxuICAgICAgICAgIHwgRHluYW1pY01vZHVsZVxuICAgICAgICAgIHwgVHlwZTxhbnk+XG4gICAgICAgICAgfCBQcm9taXNlPER5bmFtaWNNb2R1bGU+XG4gICAgICAgICAgfCBGb3J3YXJkUmVmZXJlbmNlPGFueT5cbiAgICAgICAgKVtdXG4gICAgICB8IHVuZGVmaW5lZCA9IFtEZWNhZkNvcmVNb2R1bGUuZm9yUm9vdChvcHRpb25zKV07XG5cbiAgICBpZiAoYXV0b0NvbnRyb2xsZXJzKSB7XG4gICAgICAgIGZsYXZvdXJzLmZvckVhY2goKGZsYXZvdXIpID0+IHtcbiAgICAgICAgICBpbXBvcnRzLnB1c2goXG4gICAgICAgICAgICBnZXRNb2R1bGVGb3IoZmxhdm91cikuZm9yUm9vdChmbGF2b3VyLCB7XG4gICAgICAgICAgICAgIGF1dG9TZXJ2aWNlcyxcbiAgICAgICAgICAgICAgY29udHJvbGxlckV4cG9zdXJlOiBvcHRpb25zLmNvbnRyb2xsZXJFeHBvc3VyZSxcbiAgICAgICAgICAgICAgY29udHJvbGxlckNvbmZpZzogb3B0aW9ucy5jb250cm9sbGVyQ29uZmlnLFxuICAgICAgICAgICAgICBhZ2dyZWdhdGlvbnM6IG9wdGlvbnMuYWdncmVnYXRpb25zLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9ic2VydmVyT3B0aW9ucz8uZW5hYmxlT2JzZXJ2ZXJFdmVudHMpIHtcbiAgICAgIGltcG9ydHMucHVzaChcbiAgICAgICAgRGVjYWZTdHJlYW1Nb2R1bGUuZm9yRmxhdm91cnMoXG4gICAgICAgICAgb3B0aW9ucy5vYnNlcnZlck9wdGlvbnMub2JzZXJ2ZXJGbGF2b3VycyB8fCBmbGF2b3Vyc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmTW9kdWxlLFxuICAgICAgaW1wb3J0czogaW1wb3J0cyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5NaWdyYXRpb25zKCk6IFByb21pc2U8dm9pZD4ge31cbiIsImltcG9ydCB7TW9kZWx9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7SW50ZXJuYWxFcnJvcn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1JlcG9zaXRvcnl9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVwb0Zvck1vZGVsKG1vZGVsOiBzdHJpbmcpIHtcblx0Y29uc3QgbSA9IE1vZGVsLmdldChtb2RlbCk7XG5cdGlmICghbSlcblx0XHR0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGZpbmQgcmVwb3NpdG9yeSBmb3IgJHttb2RlbH1gKVxuXHRjb25zdCByZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbChtKTtcblx0cmV0dXJuIHJlcG87XG59IiwiLyoqXG4gKiBAbW9kdWxlIGZvci1uZXN0XG4gKiBAZGVzY3JpcHRpb24gVGhpcyBtb2R1bGUgc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgdHMtd29ya3NwYWNlIGxpYnJhcnkuIEl0IGFnZ3JlZ2F0ZXMgYW5kIGV4cG9ydHNcbiAqIGZ1bmN0aW9uYWxpdHkgZnJvbSB2YXJpb3VzIHN1Ym1vZHVsZXMgYW5kIHV0aWxpdGllcyB3aXRoaW4gdGhlIHByb2plY3QuXG4gKlxuICogVGhlIG1vZHVsZSBpbmNsdWRlczpcbiAqIDEuIFV0aWxpdHkgZnVuY3Rpb25zIGFuZCB0eXBlcyBmcm9tIHRoZSBcIi4vdXRpbHNcIiBkaXJlY3Rvcnk6XG4gKiAgICAtIFRoZXNlIGxpa2VseSBjb250YWluIGhlbHBlciBmdW5jdGlvbnMsIGNvbW1vbiB0eXBlcywgYW5kIHNoYXJlZCBmdW5jdGlvbmFsaXR5IHVzZWQgdGhyb3VnaG91dCB0aGUgcHJvamVjdC5cbiAqICAgIC0gTWF5IGluY2x1ZGUgb3BlcmF0aW9ucyBmb3IgZGF0YSBtYW5pcHVsYXRpb24sIHR5cGUgY2hlY2tpbmcsIG9yIG90aGVyIGdlbmVyYWwtcHVycG9zZSB1dGlsaXRpZXMuXG4gKlxuICogMi4gQSBuYW1lc3BhY2UgYW5kIHJlbGF0ZWQgdHlwZXMgZnJvbSB0aGUgXCIuL25hbWVzcGFjZVwiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhpcyBjb3VsZCBjb250YWluIGRvbWFpbi1zcGVjaWZpYyBjb2RlIG9yIGEgY29sbGVjdGlvbiBvZiByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuXG4gKiAgICAtIE1pZ2h0IGluY2x1ZGUgaW50ZXJmYWNlcywgdHlwZXMsIG9yIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgY29yZSBjb25jZXB0cyBpbiB0aGUgbGlicmFyeS5cbiAqXG4gKiAzLiBBIFZFUlNJT04gY29uc3RhbnQ6XG4gKiAgICAtIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLlxuICogICAgLSBVc2VmdWwgZm9yIHZlcnNpb24gY2hlY2tpbmcgYW5kIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gKlxuICogVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBjbGVhbiBhbmQgb3JnYW5pemVkIGV4cG9ydCBvZiB0aGUgbW9kdWxlJ3MgZnVuY3Rpb25hbGl0eSwgYWxsb3dpbmcgY29uc3VtZXJzXG4gKiB0byBlYXNpbHkgaW1wb3J0IGFuZCB1c2Ugc3BlY2lmaWMgcGFydHMgb2YgdGhlIGxpYnJhcnkgYXMgbmVlZGVkLlxuICovXG5cbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgXCIuL2RlY29yYXRpb25cIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdGlvblwiOyAvLyBvbiB0b3Agb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vZGVjYWYtbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2F1dGhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZhY3RvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyY2VwdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3ZlcnJpZGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXF1ZXN0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnRyb2xsZXJzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvcmUtbW9kdWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V2ZW50cy1tb2R1bGVcIjtcbi8vIGV4cG9ydCAqIGZyb20gXCIuL3dlYmhvb2tzXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSB0cy13b3Jrc3BhY2UgbW9kdWxlLlxuICogVGhlIGFjdHVhbCB2ZXJzaW9uIG51bWJlciBpcyByZXBsYWNlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuXG4gKiBAY29uc3RhbnRcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbW1pdCBoYXNoIG9mIHRoZSBtb2R1bGUgYnVpbGQuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgZ2l0IGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS4gVGhlIGJ1aWxkIHJlcGxhY2VzXG4gKiB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGNvbW1pdCBoYXNoIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBDT01NSVRcbiAqL1xuZXhwb3J0IGNvbnN0IENPTU1JVCA9IFwiIyNDT01NSVQjI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBmdWxsIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBtb2R1bGUuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbXZlciB2ZXJzaW9uIGFuZCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuXG4gKiBUaGUgYnVpbGQgcmVwbGFjZXMgdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBgPHZlcnNpb24+LTxjb21taXQ+YCB2YWx1ZSBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgRlVMTF9WRVJTSU9OXG4gKi9cbmV4cG9ydCBjb25zdCBGVUxMX1ZFUlNJT04gPSBcIiMjRlVMTF9WRVJTSU9OIyNcIjtcblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFIyNcIjtcblxuTWV0YWRhdGEuYWxsb3dSZXJlZ2lzdHJhdGlvbih0cnVlKTtcbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuTWV0YWRhdGEuYWxsb3dSZXJlZ2lzdHJhdGlvbihmYWxzZSk7XG4iXSwibmFtZXMiOlsiREVDT1JBVE9SU19QUkVGSVgiLCJERUNPUkFUT1JTIiwiQVBJX09QRVJBVElPTiIsIkFQSV9SRVNQT05TRSIsIkFQSV9QUk9EVUNFUyIsIkFQSV9DT05TVU1FUyIsIkFQSV9UQUdTIiwiQVBJX0NBTExCQUNLUyIsIkFQSV9QQVJBTUVURVJTIiwiQVBJX0hFQURFUlMiLCJBUElfTU9ERUxfUFJPUEVSVElFUyIsIkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZIiwiQVBJX1NFQ1VSSVRZIiwiQVBJX0VYQ0xVREVfRU5EUE9JTlQiLCJBUElfRVhDTFVERV9DT05UUk9MTEVSIiwiQVBJX0VYVFJBX01PREVMUyIsIkFQSV9FWFRFTlNJT04iLCJBUElfU0NIRU1BIiwiQVBJX0RFRkFVTFRfR0VUVEVSIiwiQVBJX0xJTksiLCJpc0NvbnN0cnVjdG9yIiwidmFsIiwiTUVUQURBVEFfRkFDVE9SWV9OQU1FIiwiTUVUSE9EX01FVEFEQVRBIiwiY3JlYXRlTWV0aG9kRGVjb3JhdG9yIiwibWV0YWtleSIsIm1ldGFkYXRhIiwib3ZlcnJpZGVFeGlzdGluZyIsInRhcmdldCIsImtleSIsImRlc2NyaXB0b3IiLCJwcmV2VmFsdWUiLCJSZWZsZWN0IiwiZ2V0TWV0YWRhdGEiLCJ2YWx1ZSIsImRlZmluZU1ldGFkYXRhIiwiY3JlYXRlQ2xhc3NEZWNvcmF0b3IiLCJjcmVhdGVQcm9wZXJ0eURlY29yYXRvciIsInByb3BlcnR5S2V5IiwicHJvcGVydGllcyIsImluY2x1ZGVzIiwiZXhpc3RpbmdNZXRhZGF0YSIsIm5ld01ldGFkYXRhIiwicGlja0J5IiwibmVnYXRlIiwiaXNVbmRlZmluZWQiLCJtZXRhZGF0YVRvU2F2ZSIsInR5cGUiLCJjb25zdHJ1Y3RvciIsImNyZWF0ZU1peGVkRGVjb3JhdG9yIiwibWV0YWRhdGFzIiwiQXJyYXkiLCJpc0FycmF5IiwicHJldmlvdXNNZXRhZGF0YSIsIk9iamVjdCIsImFzc2lnbiIsImNyZWF0ZVBhcmFtRGVjb3JhdG9yIiwiaW5pdGlhbCIsInBhcmFtT3B0aW9ucyIsInBhcmFtZXRlcnMiLCJwcm9wZXJ0eUtleXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwicHJvdG90eXBlIiwibWV0aG9kRGVzY3JpcHRvciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImlzQXBpTWV0aG9kIiwiaGFzTWV0YWRhdGEiLCJnZXRUeXBlSXNBcnJheVR1cGxlIiwiaW5wdXQiLCJpc0FycmF5RmxhZyIsImlzSW5wdXRBcnJheSIsIm9iaiIsImdldEVudW1WYWx1ZXMiLCJlbnVtVHlwZSIsIm51bWVyaWNWYWx1ZXMiLCJ2YWx1ZXMiLCJmaWx0ZXIiLCJtYXAiLCJ0b1N0cmluZyIsImtleXMiLCJnZXRFbnVtVHlwZSIsImhhc1N0cmluZyIsImlzU3RyaW5nIiwibGVuZ3RoIiwicmVxdWlyZWQiLCJpc0VudW1BcnJheSIsIm9wdHMiLCJlbnVtIiwidW5kZWZpbmVkIiwiQXBpUHJvcGVydHkiLCJvcHRpb25zIiwiY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3IiLCJlbnVtVmFsdWVzIiwiaXRlbXMiLCJBcGlPcGVyYXRpb25Gcm9tTW9kZWwiLCJNb2RlbENvbnN0cnVjdG9yIiwidmVyYiIsInBhdGgiLCJodHRwVG9DcnVkIiwiR0VUIiwiT3BlcmF0aW9uS2V5cyIsIlJFQUQiLCJHZXQiLCJQT1NUIiwiQ1JFQVRFIiwiUG9zdCIsIlBVVCIsIlVQREFURSIsIlB1dCIsIlBBVENIIiwiUGF0Y2giLCJERUxFVEUiLCJEZWxldGUiLCJjcnVkT3AiLCJIdHRwTWV0aG9kRGVjb3JhdG9yIiwicmVzb2x2ZUJsb2NrVGFyZ2V0IiwiY29yZUlzT3BlcmF0aW9uQmxvY2tlZCIsImtpbmQiLCJhcHBseSIsIkFwaUV4Y2x1ZGVFbmRwb2ludCIsIkJ1bGtBcGlPcGVyYXRpb25Gcm9tTW9kZWwiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJSRUFEX0FMTCIsIkNSRUFURV9BTEwiLCJVUERBVEVfQUxMIiwiREVMRVRFX0FMTCIsIm5vcm1hbGl6ZWQiLCJyZXBsYWNlIiwic3RhdGVtZW50VGFyZ2V0cyIsIlByZXBhcmVkU3RhdGVtZW50S2V5cyIsIkxJU1RfQlkiLCJQQUdFX0JZIiwiRklORCIsIlBBR0UiLCJGSU5EX09ORV9CWSIsIkZJTkRfQlkiLCJDT1VOVF9PRiIsIk1BWF9PRiIsIk1JTl9PRiIsIkFWR19PRiIsIlNVTV9PRiIsIkRJU1RJTkNUX09GIiwiR1JPVVBfT0YiLCJzdGFydHNXaXRoIiwic3RhdGVtZW50VmFsdWUiLCJBcGlQYXJhbXNGcm9tTW9kZWwiLCJwcm9wcyIsImRlY29yYXRvcnMiLCJwIiwiQXBpUGFyYW1EZWMiLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJTdHJpbmciLCJhcHBseURlY29yYXRvcnMiLCJEZWNhZkJvZHkiLCJkYXRhIiwiY3R4IiwicmVxdWVzdCIsInN3aXRjaFRvSHR0cCIsImdldFJlcXVlc3QiLCJib2R5IiwiY29udHJvbGxlciIsImdldENsYXNzIiwiTW9kZWxDb25zdHIiLCJjbGFzcyIsIkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24iLCJpdGVtIiwiT3JkZXJlZFBhcmFtcyIsIm9yZGVyIiwicmVxIiwib3JpZ2luYWwiLCJwYXJhbXMiLCJvcmRlckxpc3QiLCJvcmRlcmVkIiwiayIsInJhdyIsInZhbHVlc0luT3JkZXIiLCJrZXlzSW5PcmRlciIsIkRlY2FmUGFyYW1zIiwiRGVjYWZRdWVyeSIsIl8iLCJxdWVyeSIsInBhcnNlZCIsImxpbWl0IiwibiIsIk51bWJlciIsImlzTmFOIiwib2Zmc2V0IiwiYm9va21hcmsiLCJERUNBRl9NT0RVTEVfT1BUSU9OUyIsIkRFQ0FGX0FEQVBURVJfSUQiLCJERUNBRl9UQVNLX1NFUlZJQ0VfSUQiLCJERUNBRl9ST1VURSIsIkRFQ0FGX0hBTkRMRVJTIiwiU3ltYm9sIiwiREVDQUZfRVhQT1NFIiwiREVDQUZfQ09OVFJPTExFUl9DT05GSUciLCJERUNBRl9DT05URVhUX0tFWSIsImV4cG9zZSIsImZsYXZvdXJzIiwiTWV0YWRhdGEiLCJzZXQiLCJjb250cm9sbGVyQ29uZmlnIiwiY29uZmlnIiwiY29udHJvbGxlckNvbmZpZ0RlY29yYXRvciIsIkFVVEhfSEFORExFUiIsIkFVVEhfTUVUQV9LRVkiLCJJU19QVUJMSUNfS0VZIiwiUkVRVUlSRURfUk9MRVNfS0VZIiwiU0tJUF9NT0RFTF9ST0xFU19LRVkiLCJEZWNhZlJlcXVlc3RDb250ZXh0IiwiUmVxdWVzdENvbnRleHQiLCJzdXBlciIsImhlYWRlcnNPZiIsImhlYWRlcnMiLCJ0aGlzIiwidXVpZCIsIlVVSUQiLCJpbnN0YW5jZSIsImdlbmVyYXRlIiwiZ2V0T3JVbmRlZmluZWQiLCJwdXQiLCJyZWNvcmQiLCJvdmVycmlkZXMiLCJnZXQiLCJlIiwiYWNjdW11bGF0ZSIsIl9fZGVjb3JhdGUiLCJJbmplY3RhYmxlIiwic2NvcGUiLCJTY29wZSIsIlJFUVVFU1QiLCJfX3BhcmFtIiwiSW5qZWN0IiwiQXV0aEludGVyY2VwdG9yIiwicmVmbGVjdG9yIiwicmVxdWVzdENvbnRleHQiLCJhdXRoSGFuZGxlciIsImludGVyY2VwdCIsIm5leHQiLCJsb2ciLCJMb2dnaW5nIiwiZm9yIiwiaXNQdWJsaWMiLCJnZXRBbGxBbmRPdmVycmlkZSIsImdldEhhbmRsZXIiLCJtb2RlbE5hbWUiLCJyZXF1aXJlZFJvbGVzIiwic2tpcE1vZGVsUm9sZXMiLCJlZmZlY3RpdmVNb2RlbCIsInZlcmJvc2UiLCJkZWJ1ZyIsImF1dGhvcml6ZSIsImFwcGx5VHJhbnNmb3JtZXJzIiwidXNlciIsIm9yZ2FuaXphdGlvbiIsImN1cnJlbnRMb2ciLCJjaGlsZExvZyIsImxvZ2dlciIsImhhbmRsZSIsIkFkYXB0ZXIiLCJmbGF2b3Vyc1RvVHJhbnNmb3JtIiwiZmxhdm91ciIsInRyYW5zZm9ybWVyIiwidHJhbnNmb3JtZXJGb3IiLCJmcm9tIiwiT3B0aW9uYWwiLCJSZWZsZWN0b3IiLCJBdXRoIiwibW9kZWwiLCJyZXNvdXJjZSIsImRlY3MiLCJBcGlCZWFyZXJBdXRoIiwiVXNlSW50ZXJjZXB0b3JzIiwicHVzaCIsIlNldE1ldGFkYXRhIiwiUHVibGljIiwiUmVxdWlyZVJvbGVzIiwicm9sZXMiLCJBcGlTZWN1cml0eSIsIkh0dHBWZXJiVG9EZWNvcmF0b3IiLCJkZWNvcmF0b3IiLCJFcnJvciIsImV4dHJhY3RQYXRoUGFyYW1zIiwicm91dGVQYXRoIiwic3BsaXQiLCJzbGljZSIsImFwaVBhcmFtU3BlYyIsImdldEFwaURlY29yYXRvcnMiLCJtZXRob2ROYW1lIiwiaHR0cFZlcmIiLCJpbmNsdWRlUXVlcnlQYXJhbXMiLCJOZXN0SHR0cFJvdXRlRGVjIiwiYXBpUGF0aFBhcmFtcyIsInN3YWdnZXJRdWVyeVBhcmFtcyIsIkFwaVF1ZXJ5IiwiT3JkZXJEaXJlY3Rpb24iLCJtZXRob2QiLCJBcGlQYXJhbSIsIkFwaU9wZXJhdGlvbiIsInN1bW1hcnkiLCJBcGlPa1Jlc3BvbnNlIiwiQXBpTm9Db250ZW50UmVzcG9uc2UiLCJRdWVyeSIsImFwcGx5QXBpRGVjb3JhdG9ycyIsInByb3RvIiwiZm9yRWFjaCIsImQiLCJpbmRleCIsInJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZCIsInBlcnNpc3RlbmNlIiwiYXJncyIsIk1vZGVsU2VydmljZSIsInN0YXRlbWVudCIsImNyZWF0ZVJvdXRlSGFuZGxlciIsImFzeW5jIiwicGF0aFBhcmFtcyIsInF1ZXJ5UGFyYW1zIiwiSlNPTiIsInN0cmluZ2lmeSIsImRpcmVjdGlvbiIsImVycm9yIiwiZGVmaW5lUm91dGVNZXRob2QiLCJDb250cm9sbGVyQ2xhc3MiLCJoYW5kbGVyIiwiZGVmaW5lUHJvcGVydHkiLCJ3cml0YWJsZSIsIkRlY2FmQXV0aEhhbmRsZXIiLCJBdXRoSGFuZGxlciIsInBhcnNlUmVxdWVzdCIsInVzZXJSb2xlIiwiYXV0aG9yaXphdGlvbiIsImV4dHJhY3RGcm9tQXV0aCIsIkF1dGhvcml6YXRpb25FcnJvciIsIkRlY2FmUm9sZUF1dGhIYW5kbGVyIiwiRGVjYWZBdXRoTW9kdWxlIiwiRGVjYWZBdXRoTW9kdWxlXzEiLCJmb3JSb290IiwicHJvdmlkZXJzIiwicHJvdmlkZSIsInVzZUNsYXNzIiwiZ2xvYmFsIiwiQVBQX0lOVEVSQ0VQVE9SIiwidXNlRXhpc3RpbmciLCJtb2R1bGUiLCJleHBvcnRzIiwiTW9kdWxlIiwiRGVjYWZIYW5kbGVyRXhlY3V0b3IiLCJEZWNhZkhhbmRsZXJFeGVjdXRvcl8xIiwiaGFuZGxlcnMiLCJjb250ZXh0IiwiZXhlYyIsInJlcyIsInVybCIsIkRlY2FmUmVzcG9uc2VJbnRlcmNlcHRvciIsInJlc3BvbnNlIiwiZ2V0UmVzcG9uc2UiLCJwaXBlIiwidGFwIiwidG9SZXNwb25zZSIsIkRlY2FmQ29udHJvbGxlciIsIkh0dHBEZWNhZkNvbnRyb2xsZXIiLCJjbGllbnRDb250ZXh0IiwiX25hbWUiLCJEZWNhZk1vZGVsQ29udHJvbGxlciIsIl9wZXJzaXN0ZW5jZSIsIlNlcnZpY2UiLCJnZXRTZXJ2aWNlIiwiUmVwb3NpdG9yeSIsImZvck1vZGVsIiwidG9PdmVycmlkZXMiLCJvdmVycmlkZSIsImR0b0NhY2hlIiwiTWFwIiwiRHRvRm9yIiwib3AiLCJzdGFjayIsIlNldCIsIlRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cyIsImNhY2hlIiwiZ2V0RHRvQ2FjaGUiLCJjYWNoZWQiLCJpc1VwZGF0ZU9wIiwiRHluYW1pY0RUTyIsInRvUGFzY2FsQ2FzZSIsInBrUHJvcCIsIk1vZGVsIiwicGsiLCJwa1Byb3BzTWV0YWRhdGEiLCJwa1Byb3BzIiwicGtEZXNpZ25UeXBlIiwicGtUeXBlSXNOdW1lcmljIiwiQmlnSW50IiwicGtJc0dlbmVyYXRlZCIsImdlbmVyYXRlZCIsImdlbmVyYXRlZEJ5U2VxdWVuY2UiLCJpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UiLCJhbGxQcm9wcyIsInJlbGF0aW9ucyIsInNjYWxhclByb3BzIiwicHJvcCIsImhhcyIsInZhbGlkYXRpb24iLCJnZXRWYWxpZGF0aW9uQWNyb3NzSW5oZXJpdGFuY2UiLCJpc1JlcXVpcmVkIiwiVmFsaWRhdGlvbktleXMiLCJSRVFVSVJFRCIsInR5cGVIaW50IiwiZ2V0VHlwZUFjcm9zc0luaGVyaXRhbmNlIiwiYXBpT3B0aW9ucyIsImRlc2lnblR5cGUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwicmVsYXRpb24iLCJyZWxhdGlvbk1ldGEiLCJJbnRlcm5hbEVycm9yIiwicmVsYXRpb25UeXBlIiwibWV0YSIsInZhbGlkYXRpb25Gb3IiLCJMSVNUIiwiaXNDaXJjdWxhciIsInBrVHlwZU5hbWUiLCJnZXRQa09wZW5BcGlUeXBlIiwiYWRkUmVsYXRpb25Qa1JlZiIsInJlbGF0aW9uRHRvIiwiYWRkIiwiYWRkUmVsYXRpb25VcGRhdGUiLCJhZGRSZWxhdGlvbiIsIkR0b0NsYXNzIiwiZXh0cmFNb2RlbHMiLCJkdG9SZWYiLCJvbmVPZkl0ZW1zIiwiJHJlZiIsIm9uZU9mIiwicGtUeXBlIiwiY3VycmVudCIsIkZ1bmN0aW9uIiwiZ2V0UHJvdG90eXBlT2YiLCJXZWFrTWFwIiwidG9Db250ZXh0RmxhZ3MiLCJhZGFwdGVyIiwiYWxpYXMiLCJiaW5kIiwicmVxdWVzdFRyYW5zZm9ybWVycyIsIkNvbnRleHQiLCJwZW5kaW5nIiwiaGVhZGVyIiwiTW9kZWxCdWlsZGVyIiwiZGVjb3JhdGVDbGFzcyIsIl9jbGFzc0RlY29yYXRvcnMiLCJfX2hhc0NsYXNzRGVjb3JhdG9yU3VwcG9ydCIsIm9yaWdpbmFsQnVpbGQiLCJidWlsZCIsInJlc3VsdCIsImNhbGwiLCJkZWNvcmF0ZWQiLCJGcm9tTW9kZWxDb250cm9sbGVyIiwiZ2V0UGVyc2lzdGVuY2UiLCJNb2RlbENsYXp6IiwiZTIiLCJjcmVhdGVRdWVyeVJvdXRlc0Zyb21SZXBvc2l0b3J5IiwicHJlZml4IiwiUGVyc2lzdGVuY2VLZXlzIiwiUVVFUlkiLCJyZXBvIiwicXVlcnlNZXRob2RzIiwicm91dGVNZXRob2RzIiwiUXVlcnlDb250cm9sbGVyIiwiZW50cmllcyIsInNlZ21lbnQiLCJ0cmltIiwiam9pbiIsImNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIiLCJkZWZpbmVNZXRob2QiLCJodHRwRGVjb3JhdG9yIiwiaHR0cE1ldGhvZCIsImdldFF1ZXJ5RGVjb3JhdG9ycyIsIm9ialZhbHVlcyIsImZpZWxkcyIsImYiLCJjcmVhdGUiLCJtb2R1bGVDb25maWdPdmVycmlkZXMiLCJnbG9iYWxEZWZhdWx0cyIsInRhYmxlTmFtZSIsInRvS2ViYWJDYXNlIiwibW9kZWxDbGF6ek5hbWUiLCJmYWN0b3J5UGVyc2lzdGVuY2UiLCJkZWNvcmF0b3JDb25maWciLCJtb2R1bGVPdmVycmlkZSIsIm1lcmdlZENvbmZpZyIsIkZhY3RvcnlDb250cm9sbGVyIiwiTW9kZWxDb250cm9sbGVyRmFjdG9yeSIsImZhY3RvcnlSb3V0ZXMiLCJfX3JvdXRlc19fIiwiZ2V0UEsiLCJhcGlQcm9wZXJ0aWVzIiwicGtQYXRoIiwiZ2V0Um91dGVQYXJhbWV0ZXJzRnJvbU1vZGVsIiwiYXV0aENvbmZpZyIsImF1dGgiLCJhcHBseUNsYXNzQXV0aCIsInB1YmxpYyIsIkR5bmFtaWNNb2RlbENvbnRyb2xsZXIiLCJEeW5hbWljTW9kZWxDb250cm9sbGVyXzEiLCJpbmZvIiwiQ29udHJvbGxlciIsIkFwaVRhZ3MiLCJBcGlFeHRyYU1vZGVscyIsInNvcnRlZFJvdXRlcyIsInNvcnQiLCJhIiwiYiIsImFTZWdtZW50cyIsIkJvb2xlYW4iLCJiU2VnbWVudHMiLCJhUGFyYW1Db3VudCIsInMiLCJiUGFyYW1Db3VudCIsImFMaXRlcmFsQ291bnQiLCJiTGl0ZXJhbENvdW50Iiwicm91dGUiLCJyZWdpc3RyYXRpb24iLCJtYXRjaFJvdXRlIiwicGFyYW1EZWNvcmF0b3JzIiwiY29tcG9zZWQiLCJEQktleXMiLCJDT01QT1NFRCIsImNvbXBvc2VkS2V5cyIsInVuaXF1ZUtleXMiLCJzZXBhcmF0b3IiLCJtZXRob2REZWNvcmF0b3JzIiwibm9ybWFsaXplZFBhdGgiLCJjcmVhdGVSZWdpc3RyYXRpb24iLCJjcmVhdGVDcmVhdGVIYW5kbGVyIiwiY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyIsIlJlc3BvbnNlIiwicGFzc3Rocm91Z2giLCJjcmVhdGVCdWxrQ3JlYXRlSGFuZGxlciIsImJ1bGtDcmVhdGVEZWNvcmF0b3JzIiwiY3JlYXRlQnVsa1JlYWRIYW5kbGVyIiwiYnVsa1JlYWREZWNvcmF0b3JzIiwiY3JlYXRlQnVsa1VwZGF0ZUhhbmRsZXIiLCJidWxrVXBkYXRlRGVjb3JhdG9ycyIsImNyZWF0ZUJ1bGtEZWxldGVIYW5kbGVyIiwiYnVsa0RlbGV0ZURlY29yYXRvcnMiLCJjcmVhdGVSZWFkSGFuZGxlciIsInJlYWREZWNvcmF0b3JzIiwiY3JlYXRlVXBkYXRlSGFuZGxlciIsInVwZGF0ZURlY29yYXRvcnMiLCJjcmVhdGVEZWxldGVIYW5kbGVyIiwiZGVsZXRlRGVjb3JhdG9ycyIsImZhbGxiYWNrU2VnbWVudHMiLCJpc0FsbFBhcmFtcyIsImV2ZXJ5IiwiZmFsbGJhY2tBcGlQcm9wcyIsInN1ZmZpeCIsImNyZWF0ZVN0YXRlbWVudEhhbmRsZXIiLCJzdGF0ZW1lbnREZWNvcmF0b3JzIiwiUGFyYW0iLCJzdGF0ZW1lbnRSb3V0ZXMiLCJzdGF0ZW1lbnRLZXkiLCJzdGF0ZW1lbnRNZXRob2ROYW1lIiwiY3JlYXRlU3RhdGVtZW50U2hvcnRjdXRIYW5kbGVyIiwic3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzIiwic3RhdGVtZW50U2hvcnRjdXRQYXJhbXMiLCJxdWVyeU1ldGhvZCIsImNvbXBsZXhRdWVyeVBhcmFtcyIsInBhdGhTZWdtZW50cyIsImtub3duUHJlZml4ZXMiLCJyb3V0ZU1ldGFkYXRhIiwibWF0Y2hlZEVudHJ5IiwiZmluZCIsImFjdHVhbE1ldGhvZE5hbWUiLCJwYXJhbVNlZ21lbnRzIiwiY3JlYXRlQ3VzdG9tUm91dGVIYW5kbGVyIiwiZmlyc3RTZWdtZW50Iiwic2VnbWVudHMiLCJzZWciLCJpIiwicmVzcCIsImxvZ0N0eCIsImNyZWF0ZWQiLCJjcmVhdGVBbGwiLCJyZWFkQWxsIiwiaWRzIiwibm9ybWFsaXplZElkcyIsInJlYWQiLCJ1cGRhdGVBbGwiLCJ1cGRhdGVkIiwiZGVsZXRlQWxsIiwicm91dGVQYXJhbXMiLCJpZCIsIlZhbGlkYXRpb25FcnJvciIsInJlYWRSZXN1bHQiLCJ1cGRhdGUiLCJwYXlsb2FkIiwicGFyc2UiLCJyZW1vdmUiLCJkZWwiLCJkZWxldGUiLCJkZXRhaWxzIiwiU1RBVEVNRU5UIiwicGFyc2VJbnQiLCJwYXRoRGlyZWN0aW9uIiwicmVzb2x2ZWREaXJlY3Rpb24iLCJzdGF0ZW1lbnRTaG9ydGN1dCIsImxpc3RCeSIsInBhZ2UiLCJwYWdpbmF0ZUJ5IiwiQVNDIiwicmVmIiwiZmluZE9uZUJ5IiwiZmluZEJ5IiwiZmllbGQiLCJjb21wbGV4UXVlcnkiLCJzcHJlYWRBcmdzIiwiZXh0cmFjdFF1ZXJ5QXJncyIsImN1c3RvbVJvdXRlIiwibGFzdCIsInF1ZXJ5T2JqIiwicG9wIiwiaGFzRGlyZWN0aW9uIiwiaGFzTGltaXQiLCJoYXNPZmZzZXQiLCJleHRyYXMiLCJBcGlCb2R5IiwiQXBpQ3JlYXRlZFJlc3BvbnNlIiwic2NoZW1hIiwiZ2V0U2NoZW1hUGF0aCIsIkFwaUJhZFJlcXVlc3RSZXNwb25zZSIsIkFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSIsIkFwaU5vdEZvdW5kUmVzcG9uc2UiLCJiYXNlIiwiZ2V0TW9kdWxlRm9yIiwiRGVjYWZNb2RlbE1vZHVsZSIsIkRlY2FmTW9kZWxNb2R1bGVfMSIsImNyZWF0ZU1vZGVsU2VydmljZXMiLCJtb2RlbHMiLCJ1c2VGYWN0b3J5IiwiaXNFeHBvc2VkIiwiZXhwb3N1cmUiLCJ0cmFja2VkTW9kZWxzIiwiY29udHJvbGxlckV4cG9zdXJlIiwibW9kZWxTZXJ2aWNlcyIsImF1dG9TZXJ2aWNlcyIsImFnZ3JlZ2F0aW9ucyIsImFsbG93R3JvdXBpbmdRdWVyaWVzIiwiY29udHJvbGxlcnMiLCJEZWNvcmF0aW9uIiwiSW5qZWN0YWJsZXNLZXlzIiwiSU5KRUNUQUJMRSIsImV4dGVuZCIsIm5lc3RJbmplY3RhYmxlIiwiY2F0ZWdvcnkiLCJjZmciLCJEZWZhdWx0SW5qZWN0YWJsZXNDb25maWciLCJzaW5nbGV0b24iLCJERUZBVUxUIiwiZHVyYWJsZSIsIklOSkVDVCIsIm5lc3RJbmplY3QiLCJpbm5lck5lc3RJbmplY3QiLCJNQVgiLCJtYXhEZWMiLCJtYXgiLCJtYXhpbXVtIiwiTUlOIiwibWluRGVjIiwibWluIiwibWluaW11bSIsIk1BWF9MRU5HVEgiLCJtYXhMZW5ndGhEZWMiLCJtYXhMZW5ndGgiLCJNSU5fTEVOR1RIIiwibWluTGVuZ3RoRGVjIiwibWluTGVuZ3RoIiwiVFlQRSIsInR5cGVEZWMiLCJEQVRFIiwiZGF0ZURlYyIsImZvcm1hdCIsIkVOVU0iLCJvcHRpb25EZWMiLCJQQVRURVJOIiwicGF0dGVybkRlYyIsInBhdCIsInBhdHRlcm4iLCJzb3VyY2UiLCJDT0xVTU4iLCJjb2x1bW5EZWMiLCJEZWNvcmF0aW9uS2V5cyIsIkRFU0NSSVBUSU9OIiwiZGVzY3JpcHRpb25EZWMiLCJBVVRIIiwiQ29yc0Vycm9yIiwiRm9yYmlkZGVuRXJyb3IiLCJtc2ciLCJUb01hbnlSZXF1ZXN0c0Vycm9yIiwiQmFzZUVycm9yIiwiRGVjYWZFeGNlcHRpb25GaWx0ZXIiLCJleGNlcHRpb24iLCJob3N0IiwiaXNQcm9kdWN0aW9uIiwiTG9nZ2VkRW52aXJvbm1lbnQiLCJlbnYiLCJzdGF0dXNDb2RlIiwiTm90Rm91bmRFeGNlcHRpb24iLCJVbnN1cHBvcnRlZEVycm9yIiwiTm90QWNjZXB0YWJsZUV4Y2VwdGlvbiIsIm1lc3NhZ2UiLCJnZXRTdGF0dXMiLCJzdGF0dXMiLCJjb2RlIiwianNvbiIsInRpbWVzdGFtcCIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsIkNhdGNoIiwiVXNlRGVjYWZGaWx0ZXIiLCJVc2VGaWx0ZXJzIiwiVXNlRGVjYWZIZWFkZXJzIiwiU1dBR0dFUl9VSV9DT05TVEFOVFMiLCJ0aXRsZSIsInZlcnNpb24iLCJmYXZpY29uRmlsZVBhdGgiLCJ0b3BiYXJJY29uRmlsZVBhdGgiLCJzY2hlbWUiLCJiZWFyZXJGb3JtYXQiLCJpbiIsInBlcnNpc3RBdXRob3JpemF0aW9uIiwidG9wYmFyQmdDb2xvciIsIlN3YWdnZXJDdXN0b21VSSIsImN1c3RvbUNTUyIsImNzcyIsInRvcGJhckljb25QYXRoIiwiaW1nIiwiYjY0IiwiZ2V0Q3VzdG9tT3B0aW9ucyIsImZhdmljb24iLCJmYXZpY29uUGF0aCIsImN1c3RvbVNpdGVUaXRsZSIsImN1c3RvbUNzcyIsInN3YWdnZXJPcHRpb25zIiwiZmlsZSIsImZpbGVQYXRoIiwiYXNzZXRzUGF0aCIsInJlYWRGaWxlU3luYyIsImVuY29kaW5nIiwiU3dhZ2dlckJ1aWxkZXIiLCJhcHAiLCJjcmVhdGVEb2N1bWVudCIsIm9wZW5BcGlKc29uUGF0aCIsIm9wZW5BcGlZYW1sUGF0aCIsIkRvY3VtZW50QnVpbGRlciIsInNldFRpdGxlIiwic2V0RGVzY3JpcHRpb24iLCJzZXRWZXJzaW9uIiwiYWRkQmVhcmVyQXV0aCIsIlN3YWdnZXJNb2R1bGUiLCJyZWdpc3Rlck9wZW5BcGlSb3V0ZSIsImNvbnRlbnRUeXBlIiwiYm9keUZhY3RvcnkiLCJodHRwQWRhcHRlciIsImdldEh0dHBBZGFwdGVyIiwiX3JlcSIsInJlcGx5Iiwic2V0dXBTd2FnZ2VyIiwiZG9jdW1lbnQiLCJzd2FnZ2VyVUkiLCJzZXR1cCIsImpzb25Eb2N1bWVudFVybCIsInlhbWxEb2N1bWVudFVybCIsIllBTUwiLCJOZXN0Qm9vdHN0cmFwZXIiLCJfbG9nZ2VyIiwiTG9nZ2VyIiwiaW5pdGlhbGl6ZSIsImVuYWJsZUxvZ2dlciIsImN1c3RvbUxvZ2dlciIsInVzZUxvZ2dlciIsImVuYWJsZUNvcnMiLCJvcmlnaW5zIiwiYWxsb3dNZXRob2RzIiwiYWxsb3dlZE9yaWdpbnMiLCJvIiwidG9Mb3dlckNhc2UiLCJjb3JzT3B0aW9ucyIsIm9yaWdpbiIsImNhbGxiYWNrIiwiY3JlZGVudGlhbHMiLCJtZXRob2RzIiwidXNlSGVsbWV0IiwiaGVsbWV0IiwicmVxdWlyZSIsInVzZSIsIndhcm4iLCJzd2FnZ2VyIiwidXNlR2xvYmFsUGlwZXMiLCJwaXBlcyIsInVzZUdsb2JhbEZpbHRlcnMiLCJmaWx0ZXJzIiwidXNlR2xvYmFsSW50ZXJjZXB0b3JzIiwiaW50ZXJjZXB0b3JzIiwic3RhcnQiLCJwb3J0IiwicHJvY2VzcyIsIlBPUlQiLCJsaXN0ZW4iLCJ0aGVuIiwiZ2V0VXJsIiwiRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yIiwiRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yXzEiLCJleGVjdXRvciIsImNvbnRleHR1YWxpemUiLCJmbGFncyIsImlwIiwiZXh0cmFjdElwIiwiRGVmYXVsdEFkYXB0ZXJGbGFncyIsIm9wZXJhdGlvbiIsInBhcnNlSXBIZWFkZXIiLCJjYW5kaWRhdGUiLCJwZW5kaW5nUHJvdmlkZXJzIiwiZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzIiwicmVnaXN0ZXJQcm92aWRlciIsInRva2VuIiwiaXNNb2RlbENvbnN0cnVjdG9yIiwibW9kZWxTZXJ2aWNlVG9rZW4iLCJtb2RlbFJlcG9zaXRvcnlUb2tlbiIsInBhcmFtZXRlckluZGV4IiwicmVzb2x2ZWQiLCJwYXJhbVR5cGVzIiwiYXNNb2RlbCIsImluamVjdGFibGVTZXJ2aWNlS2V5IiwiQ29yZVNlcnZpY2UiLCJDb3JlUmVwb3NpdG9yeSIsIkRlY2FmQ29yZU1vZHVsZSIsIkRlY2FmQ29yZU1vZHVsZV8xIiwibW9kdWxlUmVmIiwiZGVjYWZQcm92aWRlcnMiLCJ1c2VWYWx1ZSIsImNsaWVudCIsIkgiLCJwcm92aWRlciIsImJvb3RQZXJzaXN0ZW5jZSIsInRyaW1tZWQiLCJjb25mIiwiY29udHIiLCJwb3NzaWJsZSIsIlBlcnNpc3RlbmNlU2VydmljZSIsImJvb3QiLCJjbGllbnRzIiwiYyIsInBvc3NpYmxlVHJhbnNmIiwicmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIiwiaW5pdGlhbGl6YXRpb24iLCJvbkFwcGxpY2F0aW9uU2h1dGRvd24iLCJhZGFwdGVycyIsInNodXRkb3duIiwiR2xvYmFsIiwiTW9kdWxlUmVmIiwiTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIiwibm9ybWFsaXplRXZlbnRSZXNwb25zZSIsIm1vZGVsQ29uc3RyIiwic2VyaWFsaXplZFBheWxvYWQiLCJzZXJpYWxpemUiLCJjb25zb2xlIiwiZXJyIiwiRXZlbnRzQ29udHJvbGxlciIsIkV2ZW50c0NvbnRyb2xsZXJfMSIsImV2ZW50cyQiLCJPYnNlcnZhYmxlIiwib2JzZXJ2ZXIiLCJvYnNlcnZlcklkIiwiTWF0aCIsInJhbmRvbSIsInRvVXBwZXJDYXNlIiwiY2IiLCJyZWZyZXNoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJhZGFwdGVyTmFtZSIsIm9ic2VydmUiLCJ1bk9ic2VydmUiLCJIRUFSVEJFQVRfSU5URVJWQUxfTVMiLCJoZWFydGJlYXQkIiwiaW50ZXJ2YWwiLCJ0cyIsIm1lcmdlIiwibGlzdGVuRm9yTW9kZWwiLCJTc2UiLCJEZWNhZlN0cmVhbU1vZHVsZSIsIkRlY2FmU3RyZWFtTW9kdWxlXzEiLCJmb3JGbGF2b3VycyIsImltcG9ydHMiLCJSb3V0ZXJNb2R1bGUiLCJyZWdpc3RlciIsIkRlY2FmTW9kdWxlIiwiRGVjYWZNb2R1bGVfMSIsImZvclJvb3RBc3luYyIsImF1dG9Db250cm9sbGVycyIsIm9ic2VydmVyT3B0aW9ucyIsImVuYWJsZU9ic2VydmVyRXZlbnRzIiwib2JzZXJ2ZXJGbGF2b3VycyIsInJ1bk1pZ3JhdGlvbnMiLCJyZXBvRm9yTW9kZWwiLCJtIiwiVkVSU0lPTiIsIkNPTU1JVCIsIkZVTExfVkVSU0lPTiIsIlBBQ0tBR0VfTkFNRSIsImFsbG93UmVyZWdpc3RyYXRpb24iLCJyZWdpc3RlckxpYnJhcnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFPLE1BQU1BLG9CQUFvQjtJQUMxQixNQUFNQyxhQUFhO1FBQ3hCQyxlQUFlLEdBQUdGO1FBQ2xCRyxjQUFjLEdBQUdIO1FBQ2pCSSxjQUFjLEdBQUdKO1FBQ2pCSyxjQUFjLEdBQUdMO1FBQ2pCTSxVQUFVLEdBQUdOO1FBQ2JPLGVBQWUsR0FBR1A7UUFDbEJRLGdCQUFnQixHQUFHUjtRQUNuQlMsYUFBYSxHQUFHVDtRQUNoQlUsc0JBQXNCLEdBQUdWO1FBQ3pCVyw0QkFBNEIsR0FBR1g7UUFDL0JZLGNBQWMsR0FBR1o7UUFDakJhLHNCQUFzQixHQUFHYjtRQUN6QmMsd0JBQXdCLEdBQUdkO1FBQzNCZSxrQkFBa0IsR0FBR2Y7UUFDckJnQixlQUFlLEdBQUdoQjtRQUNsQmlCLFlBQVksR0FBR2pCO1FBQ2ZrQixvQkFBb0IsR0FBR2xCO1FBQ3ZCbUIsVUFBVSxHQUFHbkI7O0lDaEJSLE1BQU1vQixnQkFBaUJDLE9BQXNCQSxRQUFRO0lBQ3JELE1BQU1DLHdCQUF3QjtJQUU5QixNQUFNQyxrQkFBa0I7SUFFekIsU0FBVUMsc0JBQ2RDLFNBQ0FDLFdBQ0FDLGtCQUFFQSxvQkFBcUI7UUFBRUEsa0JBQWtCOztRQUUzQyxPQUFPLENBQ0xDLFFBQ0FDLEtBQ0FDO1lBRUEsV0FBV0osYUFBYSxVQUFVO2dCQUNoQyxNQUFNSyxZQUFZQyxRQUFRQyxZQUFZUixTQUFTSyxXQUFXSTtnQkFDMUQsSUFBSUgsY0FBY0osa0JBQWtCO29CQUNsQyxPQUFPRztBQUNUO2dCQUNBRSxRQUFRRyxlQUNOVixTQUNBO3VCQUFLTTt1QkFBY0w7bUJBQ25CSSxXQUFXSTtnQkFFYixPQUFPSjtBQUNUO1lBQ0FFLFFBQVFHLGVBQWVWLFNBQVNDLFVBQVVJLFdBQVdJO1lBQ3JELE9BQU9KOztBQUVYO2FBRWdCTSxxQkFDZFgsU0FDQUMsV0FBYztRQUVkLE9BQVFFO1lBQ04sTUFBTUcsWUFBWUMsUUFBUUMsWUFBWVIsU0FBU0csV0FBVztZQUMxREksUUFBUUcsZUFBZVYsU0FBUyxLQUFJTSxjQUFjTCxZQUFXRTtZQUM3RCxPQUFPQTs7QUFFWDtJQUVNLFNBQVVTLDBCQUNkWixTQUNBQyxVQUNBQyxtQkFBbUI7UUFFbkIsT0FBQSxDQUFTQyxRQUFnQlU7WUFDdkIsTUFBTUMsYUFDSlAsUUFBUUMsWUFBWWhDLFdBQVdVLDRCQUE0QmlCLFdBQVc7WUFFeEUsTUFBTUMsTUFBTSxJQUFJUztZQUNoQixLQUFLQyxXQUFXQyxTQUFTWCxNQUFNO2dCQUM3QkcsUUFBUUcsZUFDTmxDLFdBQVdVLDRCQUNYLEtBQUk0QixZQUFZLElBQUlELGlCQUNwQlY7QUFFSjtZQUNBLE1BQU1hLG1CQUFtQlQsUUFBUUMsWUFBWVIsU0FBU0csUUFBUVU7WUFDOUQsSUFBSUcsa0JBQWtCO2dCQUNwQixNQUFNQyxjQUFjQyxPQUFBQSxPQUFPakIsVUFBVWtCLE9BQUFBLE9BQU9DLE9BQUFBO2dCQUM1QyxNQUFNQyxpQkFBaUJuQixtQkFDbkI7dUJBQ0tjO3VCQUNBQztvQkFFTDt1QkFDS0E7dUJBQ0FEOztnQkFHVFQsUUFBUUcsZUFBZVYsU0FBU3FCLGdCQUFnQmxCLFFBQVFVO0FBQzFELG1CQUFPO2dCQUNMLE1BQU1TLE9BQ0huQixRQUFRb0IsY0FBc0IxQiwyQkFDN0JnQixjQUNDUyxRQUFRZixRQUFRQyxZQUFZLGVBQWVMLFFBQVFVO2dCQUV4RE4sUUFBUUcsZUFDTlYsU0FDQTtvQkFDRXNCO3VCQUNHSixjQUFPakIsVUFBVWtCLE9BQUFBLE9BQU9DLE9BQUFBO21CQUU3QmpCLFFBQ0FVO0FBRUo7QUFDRDtBQUNIO0lBRU0sU0FBVVcscUJBQ2R4QixTQUNBQztRQUVBLE9BQU8sQ0FDTEUsUUFDQUMsS0FDQUM7WUFFQSxJQUFJQSxZQUFZO2dCQUNkLElBQUlvQjtnQkFDSixJQUFJQyxNQUFNQyxRQUFRMUIsV0FBVztvQkFDM0IsTUFBTTJCLG1CQUNKckIsUUFBUUMsWUFBWVIsU0FBU0ssV0FBV0ksVUFBVTtvQkFDcERnQixZQUFZLEtBQUlHLHFCQUFxQjNCO0FBQ3ZDLHVCQUFPO29CQUNMLE1BQU0yQixtQkFDSnJCLFFBQVFDLFlBQVlSLFNBQVNLLFdBQVdJLFVBQVUsQ0FBQTtvQkFDcERnQixZQUFZOzJCQUFLRzsyQkFBcUIzQjs7QUFDeEM7Z0JBQ0FNLFFBQVFHLGVBQWVWLFNBQVN5QixXQUFXcEIsV0FBV0k7Z0JBQ3RELE9BQU9KO0FBQ1Q7WUFFQSxJQUFJb0I7WUFDSixJQUFJQyxNQUFNQyxRQUFRMUIsV0FBVztnQkFDM0IsTUFBTTJCLG1CQUFtQnJCLFFBQVFDLFlBQVlSLFNBQVNHLFdBQVc7Z0JBQ2pFc0IsWUFBWSxLQUFJRyxxQkFBcUIzQjtBQUN2QyxtQkFBTztnQkFDTCxNQUFNMkIsbUJBQW1CckIsUUFBUUMsWUFBWVIsU0FBU0csV0FBVyxDQUFBO2dCQUNqRXNCLFlBQVlJLE9BQU9DLE9BQU9ELE9BQU9DLE9BQU8sSUFBSUYsbUJBQW1CM0I7QUFDakU7WUFDQU0sUUFBUUcsZUFBZVYsU0FBU3lCLFdBQVd0QjtZQUMzQyxPQUFPQTs7QUFFWDtJQUVNLFNBQVU0QixxQkFDZDlCLFVBQ0ErQjtRQUVBLE9BQU8sQ0FFTDdCLFFBQ0FDLEtBQ0FDO1lBRUEsTUFBTTRCLGVBQWU7bUJBQ2hCRDttQkFDQWQsY0FBT2pCLFVBQVVrQixPQUFBQSxPQUFPQyxPQUFBQTs7WUFHN0IsSUFBSWYsWUFBWTtnQkFDZCxNQUFNNkIsYUFDSjNCLFFBQVFDLFlBQVloQyxXQUFXTyxnQkFBZ0JzQixXQUFXSSxVQUFVO2dCQUN0RUYsUUFBUUcsZUFDTmxDLFdBQVdPLGdCQUNYLEtBQUltRCxZQUFZRCxnQkFDaEI1QixXQUFXSTtnQkFFYixPQUFPSjtBQUNUO1lBRUEsV0FBV0YsV0FBVyxVQUFVO2dCQUM5QixPQUFPQTtBQUNUO1lBRUEsTUFBTWdDLGVBQWVOLE9BQU9PLG9CQUFvQmpDLE9BQU9rQztZQUV2RCxLQUFLLE1BQU14QixlQUFlc0IsY0FBYztnQkFDdEMsSUFBSXhDLGNBQWNrQixjQUFjO29CQUM5QjtBQUNGO2dCQUVBLE1BQU15QixtQkFBbUJULE9BQU9VLHlCQUM5QnBDLE9BQU9rQyxXQUNQeEI7Z0JBR0YsS0FBS3lCLGtCQUFrQjtvQkFDckI7QUFDRjtnQkFFQSxNQUFNRSxjQUFjakMsUUFBUWtDLFlBQzFCM0MsaUJBQ0F3QyxpQkFBaUI3QjtnQkFHbkIsS0FBSytCLGFBQWE7b0JBQ2hCO0FBQ0Y7Z0JBRUEsTUFBTU4sYUFDSjNCLFFBQVFDLFlBQ05oQyxXQUFXTyxnQkFDWHVELGlCQUFpQjdCLFVBQ2Q7Z0JBQ1BGLFFBQVFHLGVBQ05sQyxXQUFXTyxnQkFDWCxLQUFJbUQsWUFBWUQsZ0JBQ2hCSyxpQkFBaUI3QjtBQUVyQjs7QUFFSjthQUVnQmlDLG9CQUVkQyxPQUNBQztRQUdBLEtBQUtELE9BQU87WUFDVixPQUFPLEVBQUNBLE9BQW9CQztBQUM5QjtRQUNBLElBQUlBLGFBQWE7WUFFZixPQUFPLEVBQUNELE9BQW1CQztBQUM3QjtRQUNBLE1BQU1DLGVBQWVsQixPQUFBQSxRQUFRZ0I7UUFDN0IsTUFBTXJCLE9BQU91QixlQUFlRixNQUFNLEtBQUtBO1FBRXZDLE9BQU8sRUFBQ3JCLE1BQWtCdUI7QUFDNUI7SUNoTk8sTUFBTXpCLGNBQWUwQixjQUNuQkEsUUFBUTtJQUVYLFNBQVVDLGNBQ2RDO1FBRUEsV0FBV0EsYUFBYSxZQUFZO1lBQ2xDLE9BQU9ELGNBQWNDO0FBQ3ZCO1FBRUEsSUFBSXRCLE1BQU1DLFFBQVFxQixXQUFXO1lBQzNCLE9BQU9BO0FBQ1Q7UUFDQSxXQUFXQSxhQUFhLFVBQVU7WUFDaEMsT0FBTztBQUNUO1FBYUEsTUFBTUMsZ0JBQWdCcEIsT0FBT3FCLE9BQU9GLFVBQ2pDRyxPQUFRMUMsZ0JBQWlCQSxVQUFVLFVBQ25DMkMsSUFBSzNDLFNBQWVBLE1BQU00QztRQUU3QixPQUFPeEIsT0FBT3lCLEtBQUtOLFVBQ2hCRyxPQUFRL0MsUUFBUzZDLGNBQWNsQyxTQUFTWCxNQUN4Q2dELElBQUtoRCxPQUFRNEMsU0FBUzVDO0FBQzNCO0lBRU0sU0FBVW1ELFlBQVlMO1FBQzFCLE1BQU1NLFlBQVlOLE9BQU9DLE9BQU9NLE9BQUFBLFVBQVVDLFNBQVM7UUFDbkQsT0FBT0YsWUFBWSxXQUFXO0FBQ2hDO0lBRU0sU0FBVTVDLHdCQUNkWixTQUNBQyxVQUNBQyxtQkFBbUI7UUFFbkIsT0FBQSxDQUFTQyxRQUFnQlU7WUFDdkIsTUFBTUMsYUFDSlAsUUFBUUMsWUFBWWhDLFdBQVdVLDRCQUE0QmlCLFdBQVc7WUFFeEUsTUFBTUMsTUFBTSxJQUFJUztZQUNoQixLQUFLQyxXQUFXQyxTQUFTWCxNQUFNO2dCQUM3QkcsUUFBUUcsZUFDTmxDLFdBQVdVLDRCQUNYLEtBQUk0QixZQUFZLElBQUlELGlCQUNwQlY7QUFFSjtZQUNBLE1BQU1hLG1CQUFtQlQsUUFBUUMsWUFBWVIsU0FBU0csUUFBUVU7WUFDOUQsSUFBSUcsa0JBQWtCO2dCQUNwQixNQUFNQyxjQUFjQyxPQUFBQSxPQUFPakIsVUFBVWtCLE9BQUFBLE9BQU9DO2dCQUM1QyxNQUFNQyxpQkFBaUJuQixtQkFDbkI7dUJBQ0tjO3VCQUNBQztvQkFFTDt1QkFDS0E7dUJBQ0FEOztnQkFHVFQsUUFBUUcsZUFBZVYsU0FBU3FCLGdCQUFnQmxCLFFBQVFVO0FBQzFELG1CQUFPO2dCQUNMLE1BQU1TLE9BRUpuQixRQUFRb0IsY0FBYzFCLDJCQUEyQmdCLGNBQWNTLFFBQy9EZixRQUFRQyxZQUFZLGVBQWVMLFFBQVFVO2dCQUU3Q04sUUFBUUcsZUFDTlYsU0FDQTtvQkFDRXNCO29CQUNBcUMsVUFBVTt1QkFDUHpDLGNBQU9qQixVQUFVa0IsT0FBQUEsT0FBT0M7bUJBRTdCakIsUUFDQVU7QUFFSjtBQUNEO0FBQ0g7SUF3QkEsTUFBTStDLGNBQ0pDLFFBTUlBLEtBQUtsQyxXQUFXLFVBQVVrQyxRQUFRQSxLQUFLQyxTQUFTQztJQUtoRCxTQUFVQyxZQUNkQyxVQUE4QjtRQUU5QixPQUFPQywyQkFBMkJEO0FBQ3BDO0lBRU0sU0FBVUMsMkJBQ2RELFVBQThCLElBQzlCL0QsbUJBQW1CO1FBRW5CLE9BQU9vQixNQUFNSyxXQUFXZSxvQkFDdEJ1QixRQUFRM0MsTUFDUjJDLFFBQVF0QztRQUVWc0MsVUFBVTtlQUNMQTtZQUNIM0M7WUFDQUs7O1FBR0YsSUFBSWlDLFlBQVlLLFVBQVU7WUFDeEJBLFFBQVEzQyxPQUFPO1lBRWYsTUFBTTZDLGFBQWFwQixjQUFja0IsUUFBUUg7WUFDekNHLFFBQVFHLFFBQVE7Z0JBQ2Q5QyxNQUFNaUMsWUFBWVk7Z0JBQ2xCTCxNQUFNSzs7bUJBR0RGLFFBQVFIO0FBQ2pCLGVBQU8sSUFBSSxVQUFVRyxXQUFXQSxRQUFRSCxTQUFTQyxXQUFXO1lBQzFELE1BQU1JLGFBQWFwQixjQUFja0IsUUFBUUg7WUFFekNHLFFBQVFILE9BQU9LO1lBQ2ZGLFFBQVEzQyxPQUFPaUMsWUFBWVk7QUFDN0I7UUFFQSxJQUFJekMsTUFBTUMsUUFBUXNDLFFBQVEzQyxPQUFPO1lBQy9CMkMsUUFBUTNDLE9BQU87WUFDZjJDLFFBQVFHLFFBQVE7Z0JBQ2Q5QyxNQUFNO2dCQUNOOEMsT0FBTztvQkFDTDlDLE1BQU0yQyxRQUFRM0MsS0FBSzs7O0FBR3pCO1FBRUEsT0FBT1Ysd0JBQ0xwQyxXQUFXUyxzQkFDWGdGLFNBQ0EvRDtBQUVKO2FDaEtnQm1FLHNCQUNkQyxrQkFDQUMsTUFDQUM7UUFFQSxNQUFNQyxhQUdGO1lBQ0ZDLEtBQUssRUFBQ0MsYUFBQUEsY0FBY0MsTUFBTUM7WUFDMUJDLE1BQU0sRUFBQ0gsYUFBQUEsY0FBY0ksUUFBUUM7WUFDN0JDLEtBQUssRUFBQ04sYUFBQUEsY0FBY08sUUFBUUM7WUFDNUJDLE9BQU8sRUFBQ1QsYUFBQUEsY0FBY08sUUFBUUc7WUFDOUJDLFFBQVEsRUFBQ1gsYUFBQUEsY0FBY1csUUFBUUM7O1FBR2pDLE9BQU9DLFFBQVFDLHVCQUF1QmhCLFdBQVdGO1FBQ2pELE1BQU1wRSxTQUFTdUYsbUJBQW1CbkIsTUFBTUM7UUFDeEMsT0FBT3JFLFNBQ0h3RixLQUFBQSxtQkFBdUJyQixrQkFBa0JuRSxPQUFPeUYsTUFBYXpGLE9BQU9NLFNBQ2xFb0YsV0FBQUEsTUFBTUMsUUFBQUEsd0JBQ05ELFdBQUFBLE1BQU1KLG9CQUFvQmpCLFNBQzVCbUIsS0FBQUEsbUJBQXVCckIsa0JBQWtCa0IsVUFDekNLLFdBQUFBLE1BQU1DLFFBQUFBLHdCQUNORCxpQkFBTUosb0JBQW9CakI7QUFDaEM7YUFTZ0J1QiwwQkFDZHpCLGtCQUNBQyxNQUNBQztRQUVBLE1BQU1DLGFBR0Y7WUFDRkMsS0FBSyxFQUFDc0IsYUFBQUEsc0JBQXNCQyxVQUFVcEI7WUFDdENDLE1BQU0sRUFBQ2tCLGFBQUFBLHNCQUFzQkUsWUFBWWxCO1lBQ3pDQyxLQUFLLEVBQUNlLGFBQUFBLHNCQUFzQkcsWUFBWWhCO1lBQ3hDQyxPQUFPLEVBQUNZLGFBQUFBLHNCQUFzQkcsWUFBWWQ7WUFDMUNDLFFBQVEsRUFBQ1UsYUFBQUEsc0JBQXNCSSxZQUFZYjs7UUFHN0MsT0FBT0MsUUFBUUMsdUJBQXVCaEIsV0FBV0Y7UUFDakQsTUFBTXBFLFNBQVNxRSxPQUFPa0IsbUJBQW1CbkIsTUFBTUMsUUFBUVQ7UUFDdkQsT0FBTzVELFNBQ0h3RixLQUFBQSxtQkFBdUJyQixrQkFBa0JuRSxPQUFPeUYsTUFBYXpGLE9BQU9NLFNBQ2xFb0YsV0FBQUEsTUFBTUMsUUFBQUEsd0JBQ05ELFdBQUFBLE1BQU1KLG9CQUFvQmpCLFNBQzVCbUIsd0JBQXVCckIsa0JBQWtCLFFBQWVrQixVQUN4REssV0FBQUEsTUFBTUMsUUFBQUEsd0JBQ05ELGlCQUFNSixvQkFBb0JqQjtBQUNoQztJQUNBLFNBQVNrQixtQkFDUG5CLE1BQ0FDO1FBRUEsS0FBS0EsTUFBTSxPQUFPVDtRQUVsQixNQUFNc0MsYUFBYTdCLEtBQUs4QixRQUFRLGNBQWM7UUFDOUMsTUFBTUMsbUJBQTJDO1lBQy9DLGVBQWVDLEtBQUFBLHNCQUFzQkM7WUFDckMseUJBQXlCRCxLQUFBQSxzQkFBc0JFO1lBQy9DLGVBQWVGLEtBQUFBLHNCQUFzQkc7WUFDckMsZUFBZUgsS0FBQUEsc0JBQXNCSTtZQUNyQyx5QkFBeUJKLEtBQUFBLHNCQUFzQks7WUFDL0Msc0JBQXNCTCxLQUFBQSxzQkFBc0JNO1lBQzVDLDJCQUEyQjtZQUMzQixrQkFBa0JOLEtBQUFBLHNCQUFzQk87WUFDeEMsZ0JBQWdCUCxLQUFBQSxzQkFBc0JRO1lBQ3RDLGdCQUFnQlIsS0FBQUEsc0JBQXNCUztZQUN0QyxnQkFBZ0JULEtBQUFBLHNCQUFzQlU7WUFDdEMsZ0JBQWdCVixLQUFBQSxzQkFBc0JXO1lBQ3RDLHFCQUFxQlgsS0FBQUEsc0JBQXNCWTtZQUMzQyxrQkFBa0JaLEtBQUFBLHNCQUFzQmE7O1FBRzFDLElBQUloQixXQUFXaUIsV0FBVyxXQUFXO1lBQ25DLE9BQU87Z0JBQUUxQixNQUFNO2dCQUFTbkYsT0FBTzRGLFdBQVdDLFFBQVEsWUFBWTs7QUFDaEU7UUFFQSxNQUFNaUIsaUJBQWlCaEIsaUJBQWlCRjtRQUN4QyxJQUFJa0IsZ0JBQWdCO1lBQ2xCLE9BQU87Z0JBQUUzQixNQUFNO2dCQUFhbkYsT0FBTzhHOztBQUNyQztRQUVBLElBQUloRCxTQUFTLFNBQVM4QixlQUFlLElBQUk7WUFDdkMsT0FBTztnQkFBRVQsTUFBTTtnQkFBUW5GLE9BQU9rRSxhQUFBQSxjQUFjQzs7QUFDOUM7UUFFQSxPQUFPYjtBQUNUO0lDakhNLFNBQVV5RCxtQkFDZEMsUUFBNEI7UUFFNUIsTUFBTUMsYUFBYUQsTUFBTXJFLElBQUt1RSxLQUM1QkMsUUFBQUEsU0FBWTtZQUNWQyxNQUFNRixFQUFFRTtZQUNSQyxhQUFhSCxFQUFFRyxlQUFlLG1CQUFtQkgsRUFBRUU7WUFDbkRsRSxVQUFVZ0UsRUFBRWhFLFlBQVk7WUFFeEJyQyxNQUFNcUcsRUFBRXJHLFFBQVF5Rzs7UUFHcEIsT0FBT0MsT0FBQUEsbUJBQW1CTjtBQUM1QjtJQ2xCTyxNQUFNTyxZQUFZbEcsT0FBQUEscUJBQ3ZCLENBQUNtRyxNQUFlQztRQUNkLE1BQU1DLFVBQVVELElBQUlFLGVBQWVDO1FBQ25DLE1BQU1DLE9BQU9ILFFBQVFHO1FBR3JCLE1BQU1DLGFBQWFMLElBQUlNO1FBRXZCLE1BQU1DLGNBQWVGLFdBQW1CRztRQUV4QyxLQUFLRCxhQUFhO1lBQ2hCLE1BQU0sSUFBSUUsT0FBQUEsNkJBQ1IsNENBQTRDSixXQUFXWDtBQUUzRDtRQUVBLEtBQUtVLE1BQU0sT0FBT0E7UUFFbEIsSUFBSTdHLE1BQU1DLFFBQVE0RyxPQUFPO1lBQ3ZCLE9BQU9BLEtBQUtuRixJQUFLeUYsUUFBUyxJQUFJSCxZQUFZRztBQUM1QztRQUVBLE9BQU8sSUFBSUgsWUFBWUg7O0lDbEIzQixNQUFNTyxnQkFBZ0IvRyxPQUFBQSxxQkFDcEIsQ0FBQ2dILE9BQTZCWjtRQUM1QixNQUFNYSxNQUFNYixJQUFJRSxlQUFlQztRQUMvQixNQUFNVyxXQUFZRCxLQUFLRSxVQUFVO1FBQ2pDLE1BQU1DLFlBQVlKLFNBQVNsSCxPQUFPeUIsS0FBSzJGO1FBQ3ZDLE1BQU1HLFVBQVVELFVBQVUvRixJQUFLaUcsS0FBTUosU0FBU0k7UUFDOUMsT0FBTztZQUFFQyxLQUFLTDtZQUFVTSxlQUFlSDtZQUFTSSxhQUFhTDs7O0lBVTNELFNBQVVNLFlBQ2RoQyxRQUE0QjtRQUU1QixNQUFNc0IsUUFBUXRCLE1BQU1yRSxJQUFLdUUsS0FBTUEsRUFBRUU7UUFDakMsT0FBT2lCLGNBQWNDO0FBQ3ZCO0lBRU8sTUFBTVcsYUFBYTNILE9BQUFBLHFCQUN4QixDQUFDNEgsR0FBWXhCO1FBQ1gsTUFBTWEsTUFBTWIsSUFBSUUsZUFBZUM7UUFDL0IsTUFBTXNCLFFBQVFaLElBQUlZLFNBQVMsQ0FBQTtRQUUzQixNQUFNQyxTQUFjO2VBQUtEOztRQUd6QixJQUFJQyxPQUFPQyxVQUFVL0YsV0FBVztZQUM5QixNQUFNZ0csSUFBSUMsT0FBT0gsT0FBT0M7WUFDeEIsS0FBS0UsT0FBT0MsTUFBTUYsSUFBSUYsT0FBT0MsUUFBUUM7QUFDdkM7UUFFQSxJQUFJRixPQUFPSyxXQUFXbkcsV0FBVztZQUMvQixNQUFNZ0csSUFBSUMsT0FBT0gsT0FBT0s7WUFDeEIsS0FBS0YsT0FBT0MsTUFBTUYsSUFBSUYsT0FBT0ssU0FBU0g7QUFDeEM7UUFHQSxJQUFJRixPQUFPTSxhQUFhcEcsV0FBVztZQUNqQyxNQUFNZ0csSUFBSUMsT0FBT0gsT0FBT007WUFDeEJOLE9BQU9NLFdBQVdILE9BQU9DLE1BQU1GLEtBQUtGLE9BQU9NLFdBQVdKO0FBQ3hEO1FBRUEsT0FBT0Y7O0lDMURKLE1BQU1PLHVCQUF1QjtJQUM3QixNQUFNQyxtQkFBbUI7SUFDekIsTUFBTUMsd0JBQXdCO0lBRTlCLE1BQU1DLGNBQWM7VUFDZEMsaUJBQWlCQyxPQUFPO0lBQzlCLE1BQU1DLGVBQWU7SUFDckIsTUFBTUMsMEJBQTBCO1VBRTFCQyxvQkFBb0JILE9BQU87SUNSbEMsU0FBVUksVUFBVUM7UUFDeEIsT0FBTyxTQUFTRCxPQUFPMUs7WUFDckI0SyxXQUFBQSxTQUFTQyxJQUNQN0ssUUFDQXVLLGNBQ0NJLFNBQVNwSCxTQUFTb0gsV0FBVztZQUVoQyxPQUFPM0s7QUFDVDtBQUNGO0lDUU0sU0FBVThLLGlCQUFpQkM7UUFDL0IsT0FBTyxTQUFTQywwQkFBMEJoTDtZQUN4QzRLLFdBQUFBLFNBQVNDLElBQUk3SyxRQUFRd0sseUJBQXlCTztZQUM5QyxPQUFPL0s7QUFDVDtBQUNGO1VDMUJhaUwsZUFBZVgsT0FBTztJQUM1QixNQUFNWSxnQkFBZ0I7SUFDdEIsTUFBTUMsZ0JBQWdCO0lBQ3RCLE1BQU1DLHFCQUFxQjtJQUMzQixNQUFNQyx1QkFBdUI7SUNLdkJDLFFBQUFBLHNCQUFOLE1BQU1BLDRCQUF1RUM7UUFJbEYsV0FBQW5LLENBQTZCeUg7WUFDM0IyQyxNQUNFO2dCQUNFQyxXQUFZeEQsV0FBc0JBLFNBQWlCeUQsV0FBVzlIO2VBRWhFaUY7WUFMMEM4QyxLQUFBOUMsTUFBQUE7WUFIOUM4QyxLQUFBQyxPQUFPQyxVQUFLQyxTQUFTQztZQVVuQkosS0FBSzFELFVBQVVZO0FBQ2pCO1FBRUEsV0FBSTZDO1lBQ0YsT0FBT0MsS0FBS0ssZUFBZTtBQUM3QjtRQUVBLEdBQUFDLENBQUlDO1lBQ0YsSUFBSUM7WUFDSjtnQkFDRUEsWUFBWVIsS0FBS1MsSUFBSTtBQUV2QixjQUFFLE9BQU9DO2dCQUNQRixZQUFZLENBQUE7QUFDZDtZQUVBUixLQUFLVyxXQUFXO2dCQUNkSCxXQUFXekssT0FBT0MsT0FBT3dLLFdBQVdEOztBQUV4Qzs7SUE5QldaLFFBQUFBLHNCQUFtQmlCLGlCQUFBLEVBRC9CQyxPQUFBQSxXQUFXO1FBQUVDLE9BQU9DLE9BQUFBLE1BQU1DO1FBS1pDLE1BQUFBLFFBQUEsR0FBQUMsY0FBT0YsT0FBQUEsZ0VBSlRyQjtJQ21CQXdCLFFBQUFBLGtCQUFOLE1BQU1BO1FBQ1gsV0FBQTFMLENBQ21CMkwsV0FDRUMsZ0JBQ2dDQztZQUZsQ3RCLEtBQUFvQixZQUFBQTtZQUNFcEIsS0FBQXFCLGlCQUFBQTtZQUNnQ3JCLEtBQUFzQixjQUFBQTtBQUNsRDtRQUVILGVBQU1DLENBQ0psRixLQUNBbUY7WUFFQSxNQUFNQyxNQUFNQyxRQUFBQSxRQUFRQyxJQUFJM0IsTUFBYTJCLElBQUkzQixLQUFLdUI7WUFFOUMsTUFBTUssV0FBVzVCLEtBQUtvQixVQUFVUyxrQkFBMkJyQyxlQUFlLEVBQ3hFbkQsSUFBSXlGLGNBQ0p6RixJQUFJTTtZQUdOLE1BQU1vRixZQUNKL0IsS0FBS29CLFVBQVVYLElBQ2JsQixlQUNBbEQsSUFBSXlGLGlCQUVOOUIsS0FBS29CLFVBQVVYLElBQTBCbEIsZUFBZWxELElBQUlNO1lBRTlELE1BQU1xRixnQkFBZ0JoQyxLQUFLb0IsVUFBVVMsa0JBQ25DcEMsb0JBQ0EsRUFBQ3BELElBQUl5RixjQUFjekYsSUFBSU07WUFHekIsTUFBTXNGLGlCQUFpQmpDLEtBQUtvQixVQUFVUyxrQkFDcENuQyxzQkFDQSxFQUFDckQsSUFBSXlGLGNBQWN6RixJQUFJTTtZQUd6QixNQUFNdUYsaUJBQWlCRCxpQkFBaUJoSyxZQUFZOEo7WUFFcEROLElBQUlVLFFBQVEsc0JBQXNCSixZQUFZLFFBQVFBLGNBQWM7WUFFcEUsSUFBSUgsVUFBVTtnQkFDWkgsSUFBSVcsTUFBTTtBQUNaLG1CQUFPLElBQUlwQyxLQUFLc0IsYUFBYTtzQkFDckJ0QixLQUFLc0IsWUFBWWUsVUFDckJoRyxLQUNBNkYsZ0JBQ0FGLGVBQ0FoQyxLQUFLcUI7QUFFVCxtQkFBTztnQkFDTEksSUFBSVcsTUFBTTtBQUNaO2tCQUtNcEMsS0FBS3NDO1lBRVgsTUFBTUMsT0FBT3ZDLEtBQUtxQixlQUFlaEIsZUFBZTtZQUNoRCxNQUFNbUMsZUFBZXhDLEtBQUtxQixlQUFlaEIsZUFDdkM7WUFFRixJQUFJa0MsUUFBUUMsY0FBYztnQkFDeEIsTUFBTUMsYUFBYXpDLEtBQUtxQixlQUFlWixJQUFJO2dCQUMzQyxNQUFNaUMsV0FBV0QsV0FBV2QsSUFBSTtvQkFBRVk7b0JBQU1DOztnQkFDeEN4QyxLQUFLcUIsZUFBZVYsV0FBVztvQkFBRWdDLFFBQVFEOztBQUMzQztZQUVBLE9BQU9sQixLQUFLb0I7QUFDZDtRQUVVLHVCQUFNTjtZQUNkLE1BQU10RCxXQUFXNkQsS0FBQUEsUUFBUUM7WUFDekIsS0FBSzlELFVBQVU7WUFFZixLQUFLLE1BQU0rRCxXQUFXL0QsVUFBVTtnQkFDOUIsTUFBTWdFLGNBQWNILEtBQUFBLFFBQVFJLGVBQzFCRjtnQkFFRixLQUFLQyxhQUFhO2dCQUNsQixNQUFNN0MsV0FBWTZDLFlBQW9CRSxPQUNsQ0YsY0FDQSxJQUFLQTtnQkFDVCxNQUFNRSxhQUFhL0MsU0FBUytDLEtBQUtsRCxLQUFLcUI7Z0JBQ3RDLElBQUk2QixNQUFNbEQsS0FBS3FCLGVBQWVWLFdBQVd1QztBQUMzQztBQUNGOztJQXJGVy9CLFFBQUFBLGtCQUFlUCxpQkFBQSxFQUQzQkMsT0FBQUEsV0FBVztRQUFFQyxPQUFPQyxPQUFBQSxNQUFNQztRQUt0QkMsY0FBQSxHQUFBa0MsT0FBQUEsYUFBWWxDLE1BQUFBLFFBQUEsR0FBQUMsY0FBTzVCLHdEQUZROEQsT0FBQUEsV0FDT3pELFFBQUFBLHFCQUFtQjVKLGFBSDdDb0w7SUNyQlAsU0FBVWtDLEtBQUtDO1FBQ25CLE1BQU1DLFdBQVdELGVBQ05BLFVBQVUsV0FDZkEsUUFDQUEsTUFBTXZILE9BQ1I5RDtRQUNKLE1BQU11TCxPQUFPLEVBQUNDLFFBQUFBLGlCQUFpQkMsT0FBQUEsZ0JBQWdCdkMsUUFBQUE7UUFDL0MsSUFBSW9DLFVBQVVDLEtBQUtHLEtBQUtDLE9BQUFBLFlBQVlyRSxlQUFlZ0U7UUFDbkQsT0FBT3JILE9BQUFBLG1CQUFtQnNIO0FBQzVCO2FBRWdCSztRQUNkLE9BQU8zSCx1QkFBZ0IwSCxPQUFBQSxZQUFZcEUsZUFBZTtBQUNwRDtJQUVNLFNBQVVzRSxnQkFBZ0JDO1FBQzlCLE9BQU83SCxPQUFBQSxnQkFDTDhILG9CQUFZLFdBQ1pKLE9BQUFBLFlBQVluRSxvQkFBb0JzRSxRQUNoQ0wsdUJBQWdCdkMsUUFBQUE7QUFFcEI7SUNoQk0sU0FBVThDLG9CQUNkeEw7UUFFQSxNQUFNRSxhQUFvRTtZQUN4RUMsS0FBS0csT0FBQUE7WUFDTEMsTUFBTUUsT0FBQUE7WUFDTkMsS0FBS0UsT0FBQUE7WUFDTEMsT0FBT0MsT0FBQUE7WUFDUEMsUUFBUUMsT0FBQUE7O1FBR1YsTUFBTXlLLFlBQVl2TCxXQUFXRjtRQUU3QixLQUFLeUwsV0FBVztZQUNkLE1BQU0sSUFBSUMsTUFDUiwwQkFBMEIxTDtBQUU5QjtRQUVBLE9BQU95TDtBQUNUO0lDTkEsTUFBTUUsb0JBQXFCQyxhQUNsQkEsVUFDSkMsTUFBTSxLQUNOak4sT0FBUXdFLEtBQU1BLEVBQUVMLFdBQVcsTUFDM0JsRSxJQUFLdUUsS0FBTUEsRUFBRTBJLE1BQU07SUFHeEIsTUFBTUMsZUFBZ0J6SSxTQUFZO1FBQ2hDQTtRQUNBQyxhQUFhLEdBQUdEO1FBQ2hCbEUsVUFBVTtRQUNWckMsTUFBTXlHOztJQUdGLFNBQVV3SSxpQkFDZEMsWUFDQUwsV0FDQU0sVUFDQUMscUJBQThCO1FBRTlCLE1BQU1DLG1CQUFtQlosb0JBQW9CVTtRQUM3QyxNQUFNRyxnQkFBZ0JWLGtCQUFrQkMsV0FBVy9NLElBQUlrTjtRQUV2RCxNQUFNTyxxQkFBcUI7UUFDM0IsSUFBSUosYUFBYSxTQUFTQyxvQkFBb0I7WUFDNUNHLG1CQUFtQnBCLEtBQ2pCcUIsaUJBQVM7Z0JBQ1BqSixNQUFNO2dCQUNObEUsVUFBVTtnQkFDVkcsTUFBTWlOLEtBQUFBO2dCQUNOakosYUFBYTtnQkFFZmdKLFFBQUFBLFNBQVM7Z0JBQ1BqSixNQUFNO2dCQUNObEUsVUFBVTtnQkFDVm1FLGFBQWE7Z0JBRWZnSixRQUFBQSxTQUFTO2dCQUNQakosTUFBTTtnQkFDTmxFLFVBQVU7Z0JBQ1ZtRSxhQUFhOztBQUduQjtRQUVBLE9BQU87WUFDTGtKLFFBQVEsRUFDTkwsaUJBQWlCUixlQUNkUyxjQUFjeE4sSUFBSTZOLHNCQUNsQkosb0JBQ0hLLHFCQUFhO2dCQUNYQyxTQUFTLHdDQUF3Q1g7Z0JBRW5EWSxzQkFBYztnQkFDWnRKLGFBQWE7Z0JBRWZ1Siw2QkFBcUI7Z0JBQ25CdkosYUFBYTs7WUFHakJvQixRQUFRLEVBQUNPLFlBQVltSCxnQkFBZ0JVLE9BQUFBOztBQUV6QztJQUVNLFNBQVVDLG1CQUNkcFIsUUFDQXFRLFlBQ0FuUSxZQUNBcUg7UUFFQSxNQUFNOEosUUFBUXJSLFFBQVFrQyxhQUFhbEM7UUFDbkN1SCxXQUFXc0osT0FBT1MsUUFBU0MsS0FBTUEsRUFBRUYsT0FBT2hCLFlBQVluUTtRQUN0RHFILFdBQVd3QixRQUFRdUksUUFBUSxDQUFDQyxHQUFHQyxVQUFVRCxFQUFFRixPQUFPaEIsWUFBWW1CO0FBQ2hFO0lBRU0sU0FBVUMseUJBQ2RDLGFBQ0FyQixlQUNHc0I7UUFFSCxJQUFJRCx1QkFBdUJFLEtBQUFBLGNBQWM7WUFDdkMsY0FBZUYsWUFBb0JyQixnQkFBZ0IsYUFDOUNxQixZQUFvQnJCLGVBQWVzQixRQUNwQ0QsWUFBWUcsVUFBVXhCLGVBQWVzQjtBQUMzQztRQUVBLFdBQVlELFlBQW9CckIsZ0JBQWdCLFlBQzlDLE9BQVFxQixZQUFvQnJCLGVBQWVzQjtRQUU3QyxNQUFNLElBQUk3QixNQUNSLHVCQUF1Qk8sNEJBQTRCcUIsYUFBYXRRLGFBQWFzRztBQUVqRjtJQUVNLFNBQVVvSyxtQkFBc0J6QjtRQUNwQyxPQUFPMEIsZUFFTEMsWUFDQUM7WUFFQSxNQUFNN0UsTUFBY3pCLEtBQUt5QixJQUFJRSxJQUFJK0M7WUFFakM7Z0JBQ0VqRCxJQUFJVyxNQUNGLGdDQUFnQ3NDLGlDQUFpQzZCLEtBQUtDLFVBQVVILFdBQVc1STtnQkFFN0YsT0FBTWdKLFdBQUVBLFdBQVN6SSxPQUFFQSxPQUFLSSxRQUFFQSxVQUFXa0k7Z0JBQ3JDLGFBQWFSLHlCQUNYOUYsS0FBSytGLGVBQ0xyQixlQUNHMkIsV0FBVzVJLGVBQ2RnSixXQUNBekksT0FDQUk7QUFFSixjQUFFLE9BQU9zQztnQkFDUGUsSUFBSWlGLE1BQU0saUJBQWlCaEMsc0JBQXNCaEU7Z0JBQ2pELE1BQU1BO0FBQ1I7QUFDRjtBQUNGO2FBRWdCaUcsa0JBQ2RDLGlCQUNBbEMsWUFDQW1DO1FBRUE5USxPQUFPK1EsZUFDTEYsZ0JBQWdCclEsYUFBYXFRLGlCQUM3QmxDLFlBQ0E7WUFDRS9QLE9BQU9rUztZQUNQRSxVQUFVOztRQUlkLE9BQU9oUixPQUFPVSx5QkFDWm1RLGdCQUFnQnJRLGFBQWFxUSxpQkFDN0JsQztBQUVKO0lDekpNLE1BQU9zQyx5QkFBeUJDLE9BQUFBO1FBSzFCLFlBQUFDLENBQWFoSztZQUNyQixNQUFNaUssV0FBV2pLLElBQUk2QyxRQUFRcUgsZUFBZTlDLE1BQU0sS0FBSztZQUN2RCxPQUFPNkM7QUFDVDtRQUVVLGVBQUFFLENBQWdCaEw7WUFDeEIsTUFBTWEsTUFBTWIsSUFBSUUsZUFBZUM7WUFDL0IsTUFBTTJLLFdBQVduSCxLQUFLa0gsYUFBYWhLO1lBQ25DLEtBQUtpSyxVQUFVLE1BQU0sSUFBSUcsS0FBQUEsbUJBQW1CO1lBQzVDLE9BQU87Z0JBQUUvRSxNQUFNNEU7Z0JBQVVwRCxPQUFPLEVBQUNvRDs7QUFDbkM7O0lBUUksTUFBT0ksNkJBQTZCUDs7SUN2QjdCUSxRQUFBQSxrQkFBZUMsb0JBQXJCLE1BQU1EO1FBQ1gsY0FBT0UsQ0FDTHZQLFVBQWtDO1lBRWxDLE1BQU13UCxZQUF3QyxFQUM1Q3hHLFFBQUFBO1lBR0YsSUFBSWhKLFFBQVEwTyxTQUFTO2dCQUNuQmMsVUFBVWhFLEtBQUt4TCxRQUFRME87Z0JBQ3ZCYyxVQUFVaEUsS0FBSztvQkFDYmlFLFNBQVN0STtvQkFDVHVJLFVBQVUxUCxRQUFRME87O0FBRXRCO1lBRUEsSUFBSTFPLFFBQVEyUCxRQUFRO2dCQUNqQkgsVUFBb0JoRSxLQUFLO29CQUN4QmlFLFNBQVNHLE9BQUFBO29CQUNUQyxhQUFhN0csUUFBQUE7O0FBRWpCO1lBRUEsT0FBTztnQkFDTDhHLFFBQVFSO2dCQUNSSyxRQUFRM1AsUUFBUTJQLFVBQVU7Z0JBQzFCSDtnQkFDQU8sU0FBUyxFQUFDL0csUUFBQUEsaUJBQWlCN0I7O0FBRS9COztJQTdCV2tJLFFBQUFBLGtCQUFlQyxvQkFBQTdHLE1BQUFBLFdBQUEsRUFEM0J1SCxPQUFBQSxPQUFPLENBQUEsTUFDS1g7O0lDc0NBWSxRQUFBQSx1QkFBb0JDLHlCQUExQixNQUFNRDtRQUNYLFdBQUEzUyxDQUMyQzZTLFVBQ3hCQztZQUR3QnZJLEtBQUFzSSxXQUFBQTtZQUN4QnRJLEtBQUF1SSxVQUFBQTtBQUNoQjtRQUVILFVBQU1DLENBQUt0TCxLQUFjdUw7WUFDdkIsTUFBTWhILE1BQU1DLFFBQUFBLFFBQVFDLElBQUkwRyx1QkFBcUJ0TSxNQUFNNEYsSUFBSTNCLEtBQUt3STtZQUM1RC9HLElBQUlXLE1BQ0YsV0FBV3BDLEtBQUt1SSxRQUFRdEksZ0JBQWdCRCxLQUFLc0ksU0FBUzFRLCtCQUErQnNGLElBQUlnSSxVQUFVaEksSUFBSXdMO1lBRXpHLEtBQUssTUFBTTdCLFdBQVc3RyxLQUFLc0ksVUFBVTtzQkFDN0J6QixRQUFRakUsT0FBTzVDLEtBQUt1SSxTQUFTckwsS0FBS3VMO0FBQzFDO0FBQ0Y7O0lBZFdMLFFBQUFBLHVCQUFvQkMseUJBQUF6SCxNQUFBQSxXQUFBLEVBRGhDQyxPQUFBQSxXQUFXO1FBQUVDLE9BQU9DLE9BQUFBLE1BQU1DO1FBR3RCQyxNQUFBQSxRQUFBLEdBQUFDLGNBQU94QyxpRUFDa0JpQixrQ0FIakJ5STtJQ3pDQU8sUUFBQUEsMkJBQU4sTUFBTUE7UUFDWCxXQUFBbFQsQ0FBc0I0RztZQUFBMkQsS0FBQTNELE1BQUFBO0FBQTJCO1FBRWpELFNBQUFrRixDQUFVZ0gsU0FBMkIvRztZQUNuQyxJQUFJb0gsV0FBV0wsUUFBUWhNLGVBQWVzTTtZQUV0QyxPQUFPckgsS0FBS29CLFNBQVNrRyxLQUNuQkMsS0FBQUEsSUFBSzNNO2dCQUNId00sV0FBVzVJLEtBQUszRCxJQUFJMk0sV0FBV0o7O0FBR3JDOztJQVhXRCxRQUFBQSwyQkFBd0IvSCxpQkFBQSxFQURwQ0MsNkRBRTRCbEIsa0NBRGhCZ0o7SUNJUCxNQUFnQk0sd0JBRVpDLE9BQUFBO1FBQ1IsV0FBQXpULENBQ3FCMFQsZUFDbkJDO1lBRUF2SixNQUFNc0o7WUFIYW5KLEtBQUFtSixnQkFBQUE7QUFJckI7O0lBR0ksTUFBZ0JFLDZCQUdaSjtRQUdSLFdBQUF4VCxDQUM4QjBULGVBQzVCQztZQUVBdkosTUFBTXNKLGVBQWVDO1lBSE9wSixLQUFBbUosZ0JBQUFBO0FBSTlCO1FBSUEsV0FBQXBELENBQVkxSjtZQUNWLEtBQUsyRCxLQUFLc0osY0FDUjtnQkFDRXRKLEtBQUtzSixlQUFlQyxLQUFBQSxRQUFROUksSUFBcUJULEtBQUtuRDtBQUV4RCxjQUFFLE9BQU82RDtnQkFDUDtvQkFDRVYsS0FBS3NKLGVBQWVyRCxLQUFBQSxhQUFhdUQsV0FDL0J4SixLQUFLbkQ7QUFHVCxrQkFBRSxPQUFPNkQ7b0JBQ1BWLEtBQUtzSixlQUFlRyxLQUFBQSxXQUFXQyxTQUFTMUosS0FBS25EO0FBQy9DO0FBQ0Y7WUFFRixNQUFNMkQsWUFBWVIsS0FBS21KLGNBQWNRO1lBRXJDLE9BQU90TixNQUNIMkQsS0FBS3NKLHdCQUF3QkcsS0FBQUEsYUFDM0J6SixLQUFLc0osYUFBYU0sU0FBU3BKLGFBQzNCUixLQUFLc0osYUFBYTNILElBQUluQixhQUN4QlIsS0FBS3NKO0FBQ1g7O0lDbkRGLE1BQU1PLFdBQVcsSUFBSUM7SUE4QmYsU0FBVUMsT0FDZEMsSUFDQTFHLE9BQ0EyRyxRQUErQixJQUFJQztRQUVuQyxLQUFLQyxLQUFBQSx5QkFBeUJsVixTQUFTK1UsS0FBSztZQUMxQyxPQUFPMUc7QUFDVDtRQUVBLE1BQU04RyxRQUFRQyxZQUFZTDtRQUMxQixNQUFNTSxTQUFTRixNQUFNM0osSUFBSTZDO1FBQ3pCLElBQUlnSCxRQUFRLE9BQU9BO1FBRW5CLE1BQU1DLGFBQWEsRUFDakIxUixhQUFBQSxjQUFjTyxRQUNkYyxhQUFBQSxzQkFBc0JHLGFBQ3RCcEYsU0FBUytVO1FBRVgsTUFBTVE7UUFDTkosTUFBTWxMLElBQUlvRSxPQUFPa0g7UUFFakJ6VSxPQUFPK1EsZUFBZTBELFlBQVksUUFBUTtZQUN4QzdWLE9BQU8sR0FBRzhWLFFBQUFBLGFBQWFuSCxNQUFNdkgsUUFBUTBPLFFBQUFBLGFBQWFUOztRQUdwRCxNQUFNVSxTQUFTO1lBQ2I7Z0JBQ0UsT0FBT0Msb0JBQUFBLE1BQU1DLEdBQUd0SDtBQUNsQixjQUFFO2dCQUNBLE9BQU9yTDtBQUNUO0FBQ0QsVUFOYztRQVFmLE1BQU00UyxrQkFBa0JILFNBQVNDLG9CQUFBQSxNQUFNRyxRQUFReEgsU0FBZ0JyTDtRQUMvRCxNQUFNOFMsZUFBZUwsU0FDakJqVyxRQUFRQyxZQUFZLGVBQWU0TyxNQUFNL00sV0FBV21VLFVBQ3BEelM7UUFDSixNQUFNK1Msa0JBQ0pELGlCQUFpQjdNLFVBQVU2TSxpQkFBaUJFO1FBQzlDLE1BQU1DLGtCQUNGTCxpQkFBaUJNLGNBQ2xCVCxTQUNHQywwQkFBTVMsb0JBQW9COUgsT0FBY29ILFdBQ3hDVyxxQ0FBcUMvSCxPQUFPb0gsV0FDNUNNLGtCQUNBO1FBRU4sTUFBTU0sV0FBVzFWLE1BQU1zTixLQUFLLElBQUlnSCxJQUFJakwsV0FBQUEsU0FBU2pLLFdBQVdzTyxVQUFVO1FBQ2xFLE1BQU1pSSxZQUFZLElBQUlyQixJQUFhUyxvQkFBQUEsTUFBTVksVUFBVWpJLFVBQXVCO1FBQzFFLE1BQU1rSSxjQUF3QjtRQUU5QixLQUFLLE1BQU1DLFFBQVFILFVBQVU7WUFDM0IsS0FBS0csTUFBTTtZQUNYLElBQUlGLFVBQVVHLElBQUlELE9BQU87WUFFekIsSUFBSUEsU0FBU2YsV0FBV0gsY0FBY1csZUFBZTtZQUNyRCxJQUFJTyxTQUFTZixVQUFVVyxxQ0FBcUMvSCxPQUFPbUksT0FDakU7WUFFRkQsWUFBWTdILEtBQUs4SDtBQUNuQjtRQUVBLEtBQUssTUFBTUEsUUFBUUQsYUFBYTtZQUM5QixNQUFNRyxhQUFhQywrQkFBK0J0SSxPQUFPbUk7WUFDekQsTUFBTUksZUFBZUYsYUFBYUcsb0JBQUFBLGVBQWVDO1lBQ2pELE1BQU1DLFdBQ0pDLHlCQUF5QjNJLE9BQU9tSSxTQUNoQ2hYLFFBQVFDLFlBQVksZUFBZTRPLE1BQU0vTSxXQUFXa1Y7WUFFdEQsTUFBTVMsYUFBZ0Q7Z0JBQ3BEclUsVUFBVWdVOztZQUVaLElBQUlHLFVBQVVFLFdBQVcxVyxPQUFPd1c7WUFFaEM5VCxZQUFZZ1UsV0FBWmhVLENBQXdCc1MsV0FBV2pVLFdBQVdrVjtZQUU5QyxNQUFNVSxhQUNKMVgsUUFBUUMsWUFBWSxlQUFlNE8sTUFBTS9NLFdBQVdrVixTQUFTTztZQUMvRCxXQUFXRyxlQUFlLGFBQWE7Z0JBQ3JDMVgsUUFBUUcsZUFDTixlQUNBdVgsWUFDQTNCLFdBQVdqVSxXQUNYa1Y7QUFFSjtZQUVBMVYsT0FBTytRLGVBQWUwRCxXQUFXalUsV0FBV2tWLE1BQU07Z0JBQ2hEOVcsT0FBT3NEO2dCQUNQOE8sVUFBVTtnQkFDVnFGLFlBQVk7Z0JBQ1pDLGNBQWM7O0FBRWxCO1FBRUEsS0FBSyxNQUFNQyxZQUFZZixXQUFXO1lBQ2hDLE1BQU1nQixlQUFldE4sV0FBQUEsU0FBU3NNLFVBQVVqSSxPQUFPZ0o7WUFDL0MsS0FBS0MsY0FBYztnQkFDakIsTUFBTSxJQUFJQyxhQUFBQSxjQUFjLHlCQUF5QkY7QUFDbkQ7WUFFQSxJQUFJRyxlQUNGRixhQUFhMVA7WUFDZixXQUFXNFAsaUJBQWlCLGVBQWVBLGFBQWExUSxNQUFNO2dCQUM1RDBRLGVBQWdCQTtBQUNsQjtZQUNBLEtBQUtBLHVCQUF1QkEsaUJBQWlCLFlBQVk7Z0JBQ3ZELE1BQU0sSUFBSUQsYUFBQUEsY0FBYyxxQkFBcUJGO0FBQy9DO1lBQ0EsS0FBSzNCLG9CQUFBQSxNQUFNbEssSUFBSWdNLGFBQWExUSxPQUFPO2dCQUNqQztBQUNGO1lBRUEsTUFBTTJRLE9BQU96TixXQUFBQSxTQUFTME4sY0FBY3JKLE9BQU9nSjtZQUMzQyxNQUFNelcsWUFBYTZXLE9BQWVaLG9CQUFBQSxlQUFlYztZQUNqRCxNQUFNZixlQUFnQmEsT0FBZVosb0JBQUFBLGVBQWVDO1lBTXBELE1BQU1jLGFBQWE1QyxNQUFNeUIsSUFBSWU7WUFFN0IsSUFBSUksWUFBWTtnQkFDZCxNQUFNQyxhQUFhQyxpQkFBaUJOO2dCQUNwQ08saUJBQWlCeEMsWUFBWThCLFVBQVVRLFlBQVlqWCxTQUFTZ1c7Z0JBQzVEO0FBQ0Y7WUFFQSxNQUFNb0IsY0FBY2xELE9BQU9DLElBQUl5QyxjQUFjLElBQUl2QyxJQUFJRCxPQUFPaUQsSUFBSTVKO1lBRWhFLElBQUlpSCxZQUFZO2dCQUNkNEMsa0JBQ0UzQyxZQUNBOEIsVUFDQUcsY0FDQVEsYUFDQXBYLFNBQ0FnVztBQUVKLG1CQUFPO2dCQUNMdUIsWUFBWTVDLFlBQVk4QixVQUFVVyxhQUFhcFgsU0FBU2dXO0FBQzFEO0FBQ0Y7UUFFQSxPQUFPckI7QUFDVDtJQUVBLFNBQVM0QyxZQUNQQyxVQUNBZixVQUNBVyxhQUNBcFgsU0FDQWdXO1FBRUEsTUFBTUssYUFBZ0Q7WUFDcEQxVyxNQUFNeVg7WUFDTnBWLFVBQVVnVTtZQUNWaFc7O1FBRUZxQyxZQUFZZ1UsV0FBWmhVLENBQXdCbVYsU0FBUzlXLFdBQVcrVjtRQUM1QzdYLFFBQVFHLGVBQ04sZUFDQWlCLFVBQVVELFFBQVFxWCxhQUNsQkksU0FBUzlXLFdBQ1QrVjtRQUVGdlcsT0FBTytRLGVBQWV1RyxTQUFTOVcsV0FBVytWLFVBQVU7WUFDbEQzWCxPQUFPc0Q7WUFDUDhPLFVBQVU7WUFDVnFGLFlBQVk7WUFDWkMsY0FBYzs7QUFFbEI7SUFNQSxTQUFTVyxpQkFDUEssVUFDQWYsVUFDQVEsWUFDQWpYLFNBQ0FnVztRQUVBLE1BQU1LLGFBQWdEclcsVUFDakQ7WUFBRUwsTUFBTTtZQUFTOEMsT0FBTztnQkFBRTlDLE1BQU1zWDs7WUFBY2pWLFVBQVVnVTtZQUN4RDtZQUFFclcsTUFBTXNYLGVBQWUsWUFBWTVPLFNBQVNqQztZQUFRcEUsVUFBVWdVOztRQUNuRTNULFlBQVlnVSxXQUFaaFUsQ0FBd0JtVixTQUFTOVcsV0FBVytWO1FBQzVDN1gsUUFBUUcsZUFDTixlQUNBaUIsVUFBVUQsUUFBU2tYLGVBQWUsWUFBWTVPLFNBQVNqQyxRQUN2RG9SLFNBQVM5VyxXQUNUK1Y7UUFFRnZXLE9BQU8rUSxlQUFldUcsU0FBUzlXLFdBQVcrVixVQUFVO1lBQ2xEM1gsT0FBT3NEO1lBQ1A4TyxVQUFVO1lBQ1ZxRixZQUFZO1lBQ1pDLGNBQWM7O0FBRWxCO0lBRUEsU0FBU2Msa0JBQ1BFLFVBQ0FmLFVBQ0FHLGNBQ0FRLGFBQ0FwWCxTQUNBZ1c7UUFFQSxNQUFNeUIsY0FDSjdZLFFBQVFDLFlBQVloQyxXQUFXYyxrQkFBa0I2WixhQUFhO1FBQ2hFLEtBQUtDLFlBQVlyWSxTQUFTZ1ksY0FBYztZQUN0Q3hZLFFBQVFHLGVBQ05sQyxXQUFXYyxrQkFDWCxLQUFJOFosYUFBYUwsZUFDakJJO0FBRUo7UUFFQSxNQUFNRSxTQUFTLHdCQUF3Qk4sWUFBWWxSO1FBQ25ELE1BQU0rUSxhQUFhQyxpQkFBaUJOO1FBQ3BDLE1BQU1lLGFBQWEsRUFBQztZQUFFQyxNQUFNRjtXQUFVO1lBQUUvWCxNQUFNc1g7O1FBRTlDLE1BQU1aLGFBQWdEclcsVUFDakQ7WUFBRUwsTUFBTTtZQUFTcUMsVUFBVWdVO1lBQVk2QixPQUFPRjtZQUM5QztZQUFFaFksTUFBTU87WUFBUThCLFVBQVVnVTtZQUFZNkIsT0FBT0Y7O1FBRWxEdFYsWUFBWWdVLFdBQVpoVSxDQUF3Qm1WLFNBQVM5VyxXQUFXK1Y7UUFDNUM3WCxRQUFRRyxlQUNOLGVBQ0FpQixVQUFVRCxRQUFRRyxRQUNsQnNYLFNBQVM5VyxXQUNUK1Y7UUFFRnZXLE9BQU8rUSxlQUFldUcsU0FBUzlXLFdBQVcrVixVQUFVO1lBQ2xEM1gsT0FBT3NEO1lBQ1A4TyxVQUFVO1lBQ1ZxRixZQUFZO1lBQ1pDLGNBQWM7O0FBRWxCO0lBRUEsU0FBU1UsaUJBQWlCTjtRQUN4QjtZQUNFLE1BQU01QixrQkFBa0JGLG9CQUFBQSxNQUFNRyxRQUFRMkI7WUFDdEMsTUFBTWtCLFNBQVM5QyxpQkFBaUJyVjtZQUNoQyxJQUFJbVksV0FBV3pQLFVBQVV5UCxXQUFXMUMsUUFBUSxPQUFPO1lBQ25ELE9BQU87QUFDVCxVQUFFO1lBQ0EsT0FBTztBQUNUO0FBQ0Y7SUFFQSxTQUFTSSxxQ0FDUC9ILE9BQ0FtSTtRQUVBLElBQUltQyxVQUFldEs7UUFDbkIsT0FBT3NLLFdBQVdBLFlBQVk3WCxVQUFVNlgsWUFBWUMsVUFBVTtZQUM1RCxJQUFJbEQsMEJBQU1RLFVBQVV5QyxTQUFTbkMsT0FBYyxPQUFPO1lBQ2xEbUMsVUFBVTdYLE9BQU8rWCxlQUFlRjtBQUNsQztRQUNBLE9BQU87QUFDVDtJQUVBLFNBQVNoQywrQkFDUHRJLE9BQ0FtSTtRQUVBLElBQUltQyxVQUFldEs7UUFDbkIsT0FBT3NLLFdBQVdBLFlBQVk3WCxVQUFVNlgsWUFBWUMsVUFBVTtZQUM1RCxNQUFNbEMsYUFBYTFNLFdBQUFBLFNBQVMwTixjQUFjaUIsU0FBU25DO1lBQ25ELElBQUlFLFlBQVksT0FBT0E7WUFDdkJpQyxVQUFVN1gsT0FBTytYLGVBQWVGO0FBQ2xDO1FBQ0EsT0FBTzNWO0FBQ1Q7SUFFQSxTQUFTZ1UseUJBQXlCM0ksT0FBeUJtSTtRQUN6RCxJQUFJbUMsVUFBZXRLO1FBQ25CLE9BQU9zSyxXQUFXQSxZQUFZN1gsVUFBVTZYLFlBQVlDLFVBQVU7WUFDNUQsTUFBTXJZLE9BQU95SixXQUFBQSxTQUFTekosS0FBS29ZLFNBQVNuQztZQUNwQyxJQUFJalcsTUFBTSxPQUFPQTtZQUNqQm9ZLFVBQVU3WCxPQUFPK1gsZUFBZUY7QUFDbEM7UUFDQSxPQUFPM1Y7QUFDVDtJQUVBLFNBQVNvUyxZQUNQTDtRQUVBLEtBQUtILFNBQVM2QixJQUFJMUIsS0FBSztZQUNyQkgsU0FBUzNLLElBQUk4SyxJQUFJLElBQUkrRDtBQUN2QjtRQUNBLE9BQU9sRSxTQUFTcEosSUFBSXVKO0FBQ3RCO0lDaFZDbkgsS0FBQUEsUUFBZ0JJLGlCQUFpQixTQUFTK0ssZUFFekNDO1FBQ0EsTUFBTUMsZUFDR0QsWUFBWSxXQUFXQSxVQUFXQSxRQUFRQztRQUNuRCxPQUFPalAsV0FBQUEsU0FBUyxZQUFZTixPQUFPZ0QsSUFBSSxpQkFBaUJ1TTtBQUMxRCxNQUFFQyxLQUFLdEwsS0FBQUE7SUFFTkEsS0FBQUEsUUFBZ0JDLHNCQUFzQixTQUFTc0w7UUFHOUMsTUFBTTFCLE9BQU96TixXQUFBQSxTQUFTLFlBQVlOLE9BQU9nRCxJQUFJO1FBQzdDLEtBQUsrSyxNQUFNLE9BQU96VTtRQUNsQixPQUFPbEMsT0FBT3lCLEtBQUtrVjtBQUNyQixNQUFFeUIsS0FBS3RMLEtBQUFBO0lBRU53TCxLQUFBQSxRQUFnQjlYLFVBQVV5UyxhQUFhLFNBQVNBLFdBRWhDUDtRQUNmLE1BQU02RixVQUFVdE8sS0FBS3NPO1FBQ3JCLElBQUlBLFNBQVM3RixJQUFJOEYsT0FBTyxrQkFBa0JoSSxLQUFLQyxVQUFVOEg7UUFDekQsT0FBTzdGO0FBQ1Q7SUNkQSxNQUFNbFMsWUFBWWlZLG9CQUFBQSxhQUFhalk7SUFJL0IsS0FBS0EsVUFBVWtZLGVBQWU7UUFDNUJsWSxVQUFVa1ksZ0JBQWdCLFNBQVV2SztZQUNsQyxLQUFNbEUsS0FBYTBPLGtCQUFrQjtnQkFDbEMxTyxLQUFhME8sbUJBQW1CO0FBQ25DO1lBQ0MxTyxLQUFhME8saUJBQWlCL0ssS0FBS087WUFDcEMsT0FBT2xFO0FBQ1Q7QUFDRjtJQUVBekosVUFBVThNLE9BQU8sU0FBVUM7UUFDekIsT0FBT3RELEtBQUt5TyxjQUFjcEwsS0FBS0M7QUFDakM7SUFFQSxLQUFNL00sVUFBa0JvWSw0QkFBNEI7UUFDbEQsTUFBTUMsZ0JBQWdCclksVUFBVXNZO1FBQ2hDdFksVUFBVXNZLFFBQVE7WUFDaEIsSUFBSUMsU0FBU0YsY0FBY0csS0FBSy9PO1lBQ2hDLE1BQU1wRSxhQUFjb0UsS0FBYTBPO1lBQ2pDLElBQUk5UyxZQUFZaEUsUUFBUTtnQkFDdEIsS0FBSyxNQUFNc00sYUFBYXRJLFlBQVk7b0JBQ2xDLE1BQU1vVCxZQUFZOUssVUFBVTRLO29CQUM1QixJQUFJRSxXQUFXO3dCQUNiRixTQUFTRTtBQUNYO0FBQ0Y7QUFDRjtZQUNBLE9BQU9GO0FBQ1Q7UUFDQ3ZZLFVBQWtCb1ksNkJBQTZCO0FBQ2xEOztVQ2NhTTs7WUFDYWpQLEtBQUF5QixNQUFNQyxRQUFBQSxRQUFRQyxJQUFJc04sb0JBQW9CbFQ7QUFBTTtRQUVwRSxxQkFBT21ULENBQ0xDO1lBRUE7Z0JBQ0UsT0FBTzVGLEtBQUFBLFFBQVE5SSxJQUFxQjBPO0FBQ3RDLGNBQUUsT0FBT3pPO2dCQUNQO29CQUNFLE9BQU91RixLQUFBQSxhQUFhdUQsV0FBVzJGO0FBQ2pDLGtCQUFFLE9BQU9DO29CQUNQLE9BQU8zRixLQUFBQSxXQUFXQyxTQUFTeUY7QUFDN0I7QUFDRjtBQUNGO1FBRUEsc0NBQU9FLENBQ0x0SixhQUNBdUosU0FBaUJDLEtBQUFBLGdCQUFnQkM7WUFFakMsTUFBTUMsT0FDSjFKLHVCQUF1QkUsS0FBQUEsZUFBZUYsWUFBWTBKLE9BQU8xSjtZQUMzRCxNQUFNbkosY0FBMkI2UyxLQUFLNVM7WUFDdEMsTUFBTTZTLGVBQ0p6USxXQUFBQSxTQUFTd0IsSUFDUGdQLEtBQUtoYSxhQUNMd0osV0FBQUEsU0FBUzNLLElBQUlpYixLQUFBQSxnQkFBZ0JDLFdBQzFCLENBQUE7WUFFUCxNQUFNRyxlQUNKMVEsb0JBQVN3QixJQUNQc0YsWUFBWXRRLGFBQ1p3SixXQUFBQSxTQUFTM0ssSUFBSW1LLGlCQUNWLENBQUE7WUFFUCxNQUFNbVIsd0JBQXdCdkc7Z0JBQzVCLFNBQWE7b0JBQ1gsTUFBTSxJQUFJbEYsTUFBTTtBQUNsQjtnQkFDQSxXQUFBMU8sQ0FBWTBULGVBQW9DcE47b0JBQzlDOEQsTUFBTXNKLGVBQWVwTjtBQUN2Qjs7WUFHRixLQUFLLE9BQU8ySSxZQUFZdEgsV0FBV3JILE9BQU84WixRQUFRRixlQUFlO2dCQUMvRCxNQUFNdEwsWUFBWSxFQUFDakgsT0FBTzFFLEtBQUs4QixRQUFRLGNBQWMsTUFDbERuRCxPQUFReVksV0FBb0JBLFdBQVdBLFFBQVFDLFFBQy9DQyxLQUFLO2dCQUVSLE1BQU1uSixVQUFVb0ksb0JBQW9CZ0IsMEJBQ2xDdkw7Z0JBRUZ1SyxvQkFBb0JpQixhQUNsQk4saUJBQ0FsTCxZQUNBbUM7Z0JBR0YsTUFBTXNKLGdCQUFnQmxNLG9CQUFvQjdHLE9BQU9nVCxXQUEzQm5NLENBQW9ESSxhQUFhcE07Z0JBQ3ZGLE1BQU0yRCxhQUFhcVQsb0JBQW9Cb0IsbUJBQ3JDM0wsWUFDQUwsV0FDQWpILE9BQU9nVDtnQkFFVG5CLG9CQUFvQi9TLGdCQUNsQjBULGlCQUNBbEwsWUFDQSxFQUFDeUwsa0JBQWtCdlU7QUFFdkI7WUFFQSxLQUFLLE9BQU84SSxZQUFZNEwsY0FBY3ZhLE9BQU84WixRQUFRSCxlQUFlO2dCQUNsRSxNQUFNYSxTQUFTRCxVQUFVQyxVQUFVO2dCQUNuQyxNQUFNbE0sWUFBWSxFQUFDaUwsUUFBUTVLLGVBQWU2TCxPQUFPalosSUFBS2taLEtBQU0sSUFBSUEsT0FDN0RuWixPQUFReVksV0FBWUEsV0FBV0EsUUFBUUMsUUFDdkNDLEtBQUs7Z0JBRVIsTUFBTW5KLFVBQVVvSSxvQkFBb0JnQiwwQkFDbEN2TDtnQkFFRnVLLG9CQUFvQmlCLGFBQ2xCTixpQkFDQWxMLFlBQ0FtQztnQkFHRixNQUFNc0osZ0JBQWdCbE0sb0JBQW9CLE1BQXBCQSxDQUF3Q0ksYUFBYXBNO2dCQUMzRSxNQUFNMkQsYUFBYXFULG9CQUFvQm9CLG1CQUNyQzNMLFlBQ0FMLFdBQ0EsT0FDQTtnQkFFRjRLLG9CQUFvQi9TLGdCQUNsQjBULGlCQUNBbEwsWUFDQSxFQUFDeUwsa0JBQWtCdlU7QUFFdkI7WUFFQSxPQUFPZ1U7QUFDVDtRQUVPLGFBQUFhLENBQ0w3VCxhQUNBOFQsdUJBQ0FDO1lBRUEsTUFBTWxQLE1BQU13TixvQkFBb0J4TixJQUFJRSxJQUFJc04sb0JBQW9Cd0I7WUFDNUQsTUFBTUcsWUFBWWpHLG9CQUFBQSxNQUFNaUcsVUFBVWhVO1lBQ2xDLE1BQU15SCxZQUFZd00sUUFBQUEsWUFBWUQ7WUFDOUIsTUFBTUUsaUJBQWlCbFUsWUFBWWI7WUFDbkMsTUFBTWdLLGNBQWNrSixvQkFBb0JDLGVBQWV0UztZQUt2RCxNQUFNbVUscUJBQ0poTCx1QkFBdUJFLEtBQUFBLGVBQWVGLFlBQVkwSixPQUFPMUo7WUFFM0QsTUFBTWlMLGtCQUFrQi9SLFdBQUFBLFNBQVN3QixJQUMvQjdELGFBQ0FxQyxvQkFBUzNLLElBQUl1SztZQUVmLE1BQU1vUyxpQkFBaUJQLHdCQUF3QjlULFlBQVliO1lBQzNELE1BQU1tVixlQUE2QzttQkFDN0NQLGtCQUFrQixDQUFBO21CQUNsQkssbUJBQW1CLENBQUE7bUJBQ25CQyxrQkFBa0IsQ0FBQTs7WUFHeEIsTUFBTUUsb0JBQW9CQyxPQUFBQSx1QkFBdUJYLE9BQy9DN1QsYUFDQW1VLG9CQUNBRztZQUVGLE1BQU1HLGdCQUFpQkYsa0JBQTBCRztZQUlqRCxPQUFNQyxPQUFFQSxPQUFLQyxlQUFFQSxlQUFlOVksTUFBTStZLFVBQ2xDeEMsb0JBQW9CeUMsNEJBQTRCOVU7WUFFbEQ2RSxJQUFJVyxNQUNGLGtDQUFrQzBPLHVCQUF1Qk8sZUFBZXpaLFVBQVU7WUFHcEYsTUFBTStaLGFBQXFDVCxhQUFhVTtZQUV4RCxTQUFTQyxlQUFleGQ7Z0JBQ3RCLElBQUlzZCxZQUFZRyxRQUFRO29CQUN0QmpPLFNBQVN4UDtBQUNYLHVCQUFPLElBQUlzZCxZQUFZNU4sT0FBT25NLFFBQVE7b0JBQ3BDa00sZ0JBQWdCNk4sV0FBVzVOLE1BQTNCRCxDQUFrQ3pQO0FBQ3BDLHVCQUFPO29CQUNMZ1AsS0FBS3pHLFlBQUx5RyxDQUFrQmhQO0FBQ3BCO2dCQUNBLElBQUlzZCxZQUFZMVAsZ0JBQWdCO29CQUM5QjJCLE9BQUFBLFlBQVlsRSxzQkFBc0IsS0FBbENrRSxDQUF3Q3ZQO0FBQzFDO0FBQ0Y7WUFFQSxJQUdNMGQseUJBQXNCQywyQkFINUIsTUFHTUQsK0JBQStCMUk7Z0JBR3pCLGdCQUFXO29CQUNuQixPQUFPek07QUFDVDtnQkFFQSxTQUFhO29CQUNYLE9BQU9BO0FBQ1Q7Z0JBRUEsV0FBQW5ILENBQVkwVDtvQkFDVnRKLE1BQU1zSixlQUFlNkkseUJBQXVCalc7b0JBWDdCaUUsS0FBQTRLLEtBQWFELDBCQUFNQyxHQUFHaE87b0JBWXJDNkUsSUFBSXdRLEtBQ0YsNkNBQTZDalMsS0FBS25ELE1BQU1kLGdCQUFnQnNJO0FBRTVFOztZQWhCSTBOLHlCQUFzQkMsMkJBQUFwUixpQkFBQSxFQUgzQnNSLE9BQUFBLFdBQVc3TixZQUNYOE4sUUFBQUEsUUFBUXJCLGlCQUNSc0IsUUFBQUEsZUFBZXhWLHNEQVlhK0Msa0NBWHZCb1M7WUFtQk5GLGVBQWVFO1lBRWYsSUFBSVYsZUFBZTtnQkFDakIsTUFBTWdCLGVBQWUsS0FBSWhCLGdCQUFlaUIsS0FBSyxDQUFDQyxHQUFHQztvQkFDL0MsTUFBTUMsWUFBWUYsRUFBRTdaLEtBQUs0TCxNQUFNLEtBQUtqTixPQUFPcWI7b0JBQzNDLE1BQU1DLFlBQVlILEVBQUU5WixLQUFLNEwsTUFBTSxLQUFLak4sT0FBT3FiO29CQUMzQyxNQUFNRSxjQUFjSCxVQUFVcGIsT0FBUXdiLEtBQU1BLEVBQUVyWCxXQUFXLE1BQU01RDtvQkFDL0QsTUFBTWtiLGNBQWNILFVBQVV0YixPQUFRd2IsS0FBTUEsRUFBRXJYLFdBQVcsTUFBTTVEO29CQUMvRCxNQUFNbWIsZ0JBQWdCTixVQUFVN2EsU0FBU2diO29CQUN6QyxNQUFNSSxnQkFBZ0JMLFVBQVUvYSxTQUFTa2I7b0JBQ3pDLElBQUlDLGtCQUFrQkMsZUFDcEIsT0FBT0EsZ0JBQWdCRDtvQkFDekIsSUFBSUgsZ0JBQWdCRSxhQUNsQixPQUFPRixjQUFjRTtvQkFDdkIsT0FBTzs7Z0JBRVQsS0FBSyxNQUFNRyxTQUFTWixjQUFjO29CQUNoQyxNQUFNYSxlQUFlakUsb0JBQW9Ca0UsV0FDdkNGLE9BQ0F4QixRQUNBRCxlQUNBRCxPQUNBM1UsYUFDQWtVLGdCQUNBQztvQkFFRixLQUFLbUMsY0FBYztvQkFFbkIsT0FBTXhPLFlBQUVBLFlBQVVtQyxTQUFFQSxTQUFPakwsWUFBRUEsWUFBVXdYLGlCQUFFQSxtQkFDdkNGO29CQUVGLE1BQU0zZSxhQUFhMGEsb0JBQW9CaUIsYUFDckM2Qix3QkFDQXJOLFlBQ0FtQztvQkFHRixJQUFJdFMsWUFBWTt3QkFDZCxNQUFNNGIsZ0JBQWdCbE0sb0JBQW9CZ1AsTUFBTS9OLE9BQTFCakIsQ0FDcEJnUCxNQUFNdmEsS0FBSzhCLFFBQVEsY0FBYyxPQUFPdkM7d0JBRTFDZ1gsb0JBQW9CL1MsZ0JBQ2xCNlYsd0JBQ0FyTixZQUNBLEVBQUN5TCxrQkFBa0J2VSxjQUNuQndYO0FBRUo7QUFDRjtBQUNGO1lBRUEsT0FBT3JCO0FBQ1Q7UUFFQSxrQ0FBT0wsQ0FDTHZDO1lBT0EsTUFBTXZFLEtBQUtELG9CQUFBQSxNQUFNQyxHQUFHdUU7WUFDcEIsTUFBTWtFLFdBQVdwVSxvQkFBU3dCLElBQ3hCME8sWUFDQWxRLG9CQUFTM0ssSUFBSWdmLGFBQUFBLE9BQU9DLFVBQVUzSTtZQUVoQyxNQUFNNEksZUFBZUgsVUFBVXJOLFFBQVE7WUFFdkMsTUFBTXlOLGFBQ0o3ZCxNQUFNQyxRQUFRMmQsaUJBQWlCQSxhQUFhNWIsU0FBUyxJQUNqRGhDLE1BQU1zTixLQUFLLElBQUlnSCxJQUFJLEtBQUlzSixtQkFDdkI1ZCxNQUFNc04sS0FBSyxJQUFJZ0gsSUFBSSxFQUFDVTtZQUUxQixNQUFNNU8sY0FBY2lELFdBQUFBLFNBQVNqRCxZQUFZbVQsZUFBZTtZQUN4RCxNQUFNelcsT0FBTyxJQUFJK2EsV0FBV3pELEtBQUs7WUFDakMsTUFBTXdCLGdCQUFvQ2lDLFdBQVduYyxJQUFLaEQsUUFDakQ7Z0JBQ0x5SCxNQUFNekg7Z0JBQ04wSCxhQUFhaUQsV0FBQUEsU0FBU2pELFlBQVltVCxZQUFZN2E7Z0JBQzlDdUQsVUFBVTtnQkFDVnJDLE1BQU15Rzs7WUFJVixPQUFPO2dCQUNMdkQ7Z0JBQ0FzRDtnQkFDQXdWO2dCQUNBRCxPQUFPLElBQUluVSxXQUNUaVcsVUFBVUssWUFBWXRXLE9BQU80UyxLQUFLcUQsU0FBU0ssYUFBYXRXLE9BQU80UyxLQUFLOztBQUUxRTtRQUVRLG1CQUFPRSxDQUNiN2IsUUFDQXFRLFlBQ0FtQztZQUVBOVEsT0FBTytRLGVBQ0x6UyxPQUFPa0MsYUFBYWxDLFFBQ3BCcVEsWUFDQTtnQkFDRS9QLE9BQU9rUztnQkFDUEUsVUFBVTtnQkFDVnNGLGNBQWM7Z0JBQ2RELFlBQVk7O1lBSWhCLE9BQU9yVyxPQUFPVSx5QkFDWnBDLE9BQU9rQyxhQUFhbEMsUUFDcEJxUTtBQUVKO1FBRVEsc0JBQU94SSxDQUNiN0gsUUFDQXFRLFlBQ0FpUCxrQkFDQVAsa0JBQTJFO1lBRTNFLE1BQU0xTixRQUFRclIsUUFBUWtDLGFBQWFsQztZQUNuQyxNQUFNRSxhQUFhd0IsT0FBT1UseUJBQXlCaVAsT0FBT2hCO1lBQzFEaVAsaUJBQWlCaE8sUUFBU0MsS0FBTUEsRUFBRUYsT0FBT2hCLFlBQVluUTtZQUNyRDZlLGdCQUFnQnpOLFFBQVEsRUFBR3pCLHNCQUFXMkIsa0JBQ3BDM0IsVUFBVXdCLE9BQU9oQixZQUFZbUI7QUFFakM7UUFFUSxpQkFBT3NOLENBQ2JGLE9BQ0F4QixRQUNBRCxlQUNBRCxPQUNBM1UsYUFDQWtVLGdCQUNBL0s7WUFPQSxPQUFNYixRQUFFQSxRQUFNeE0sTUFBRUEsUUFBU3VhO1lBQ3pCLE1BQU1XLGlCQUFpQmxiLEtBQUs4QixRQUFRLGNBQWM7WUFFbEQsSUFBSTBLLFdBQVcsVUFBVTBPLG1CQUFtQixJQUFJO2dCQUM5QyxPQUFPM0Usb0JBQW9CNEUsbUJBQ3pCLFVBQ0E1RSxvQkFBb0I2RSxvQkFBb0JsWCxhQUFha1UsaUJBQ3JEN0Isb0JBQW9COEUsdUJBQXVCblgsYUFBYWtVLGlCQUN4RCxFQUFDO29CQUFFNU0sV0FBVy9IO29CQUFvQjBKLE9BQU87bUJBQUs7b0JBQUUzQixXQUFXOFAsT0FBQUEsU0FBUzt3QkFBRUMsYUFBYTs7b0JBQWdCcE8sT0FBTzs7QUFFOUc7WUFFQSxJQUFJWCxXQUFXLFVBQVUwTyxtQkFBbUIsUUFBUTtnQkFDbEQsT0FBTzNFLG9CQUFvQjRFLG1CQUN6QixhQUNBNUUsb0JBQW9CaUYsd0JBQXdCdFgsYUFBYWtVLGlCQUN6RDdCLG9CQUFvQmtGLHFCQUFxQnZYLGFBQWFrVSxpQkFDdEQsRUFBQztvQkFBRTVNLFdBQVcvSDtvQkFBb0IwSixPQUFPO21CQUFLO29CQUFFM0IsV0FBVzhQLE9BQUFBLFNBQVM7d0JBQUVDLGFBQWE7O29CQUFnQnBPLE9BQU87O0FBRTlHO1lBRUEsSUFBSVgsV0FBVyxTQUFTME8sbUJBQW1CLFFBQVE7Z0JBQ2pELE9BQU8zRSxvQkFBb0I0RSxtQkFDekIsV0FDQTVFLG9CQUFvQm1GLHNCQUFzQnRELGlCQUMxQzdCLG9CQUFvQm9GLG1CQUFtQnpYLGFBQWFrVSxpQkFDcEQsRUFBQztvQkFBRTVNLFdBQVdzQixPQUFBQSxNQUFNO29CQUFlSyxPQUFPOztBQUU5QztZQUVBLElBQUlYLFdBQVcsU0FBUzBPLG1CQUFtQixRQUFRO2dCQUNqRCxPQUFPM0Usb0JBQW9CNEUsbUJBQ3pCLGFBQ0E1RSxvQkFBb0JxRix3QkFBd0J4RCxpQkFDNUM3QixvQkFBb0JzRixxQkFBcUIzWCxhQUFha1UsZ0JBQWdCVSxnQkFDdEUsRUFBQztvQkFBRXROLFdBQVcvSDtvQkFBb0IwSixPQUFPO21CQUFLO29CQUFFM0IsV0FBVzhQLE9BQUFBLFNBQVM7d0JBQUVDLGFBQWE7O29CQUFnQnBPLE9BQU87O0FBRTlHO1lBRUEsSUFBSVgsV0FBVyxZQUFZME8sbUJBQW1CLFFBQVE7Z0JBQ3BELE9BQU8zRSxvQkFBb0I0RSxtQkFDekIsYUFDQTVFLG9CQUFvQnVGLHdCQUF3QjFELGlCQUM1QzdCLG9CQUFvQndGLHFCQUFxQjdYLGFBQWFrVSxnQkFBZ0JVLGdCQUN0RSxFQUFDO29CQUFFdE4sV0FBV3NCLE9BQUFBLE1BQU07b0JBQWVLLE9BQU87bUJBQUs7b0JBQUUzQixXQUFXOFAsT0FBQUEsU0FBUzt3QkFBRUMsYUFBYTs7b0JBQWdCcE8sT0FBTzs7QUFFL0c7WUFFQSxJQUFJWCxXQUFXLFNBQVMwTyxtQkFBbUJuQyxRQUFRO2dCQUNqRCxPQUFPeEMsb0JBQW9CNEUsbUJBQ3pCLFFBQ0E1RSxvQkFBb0J5RixrQkFBa0JuRCxPQUFPVCxpQkFDN0M3QixvQkFBb0IwRixlQUFlL1gsYUFBYWtVLGdCQUFnQlUsZUFBZUMsU0FDL0UsRUFBQztvQkFBRXZOLFdBQVd2RyxZQUFZNlQ7b0JBQXVCM0wsT0FBTzs7QUFFNUQ7WUFFQSxJQUFJWCxXQUFXLFNBQVMwTyxtQkFBbUJuQyxRQUFRO2dCQUNqRCxPQUFPeEMsb0JBQW9CNEUsbUJBQ3pCLFVBQ0E1RSxvQkFBb0IyRixvQkFBb0JyRCxPQUFPM1UsYUFBYWtVLGlCQUM1RDdCLG9CQUFvQjRGLGlCQUFpQmpZLGFBQWFrVSxnQkFBZ0JVLGVBQWVDLFNBQ2pGLEVBQ0U7b0JBQUV2TixXQUFXdkcsWUFBWTZUO29CQUF1QjNMLE9BQU87bUJBQ3ZEO29CQUFFM0IsV0FBVy9IO29CQUFvQjBKLE9BQU87bUJBQ3hDO29CQUFFM0IsV0FBVzhQLE9BQUFBLFNBQVM7d0JBQUVDLGFBQWE7O29CQUFnQnBPLE9BQU87O0FBR2xFO1lBRUEsSUFBSVgsV0FBVyxZQUFZME8sbUJBQW1CbkMsUUFBUTtnQkFDcEQsT0FBT3hDLG9CQUFvQjRFLG1CQUN6QixVQUNBNUUsb0JBQW9CNkYsb0JBQW9CdkQsT0FBT1QsaUJBQy9DN0Isb0JBQW9COEYsaUJBQWlCblksYUFBYWtVLGdCQUFnQlUsZUFBZUMsU0FDakYsRUFDRTtvQkFBRXZOLFdBQVd2RyxZQUFZNlQ7b0JBQXVCM0wsT0FBTzttQkFDdkQ7b0JBQUUzQixXQUFXOFAsT0FBQUEsU0FBUzt3QkFBRUMsYUFBYTs7b0JBQWdCcE8sT0FBTzs7QUFHbEU7WUFHQSxNQUFNbVAsbUJBQW1CcEIsZUFBZXRQLE1BQU0sS0FBS2pOLE9BQU9xYjtZQUMxRCxNQUFNdUMsY0FBY0QsaUJBQWlCcGQsU0FBUyxLQUFLb2QsaUJBQWlCRSxNQUFPckMsS0FBTUEsRUFBRXJYLFdBQVc7WUFDOUYsSUFBSXlaLGVBQWVyQixtQkFBbUJuQyxRQUFRO2dCQUM1QyxNQUFNMEQsbUJBQW1CSCxpQkFBaUIxZCxJQUFLdWIsS0FBTUEsRUFBRXRPLE1BQU0sSUFBSWpOLElBQUt5RSxTQUFJO29CQUN4RUE7b0JBQ0FDLGFBQWEsR0FBR0Q7b0JBQ2hCbEUsVUFBVTtvQkFDVnJDLE1BQU15Rzs7Z0JBRVIsTUFBTW1aLFNBQVNKLGlCQUFpQjFkLElBQUt1YixLQUFNQSxFQUFFdE8sTUFBTSxJQUFJeUwsS0FBSztnQkFDNUQsSUFBSTlLLFdBQVcsT0FBTztvQkFDcEIsT0FBTytKLG9CQUFvQjRFLG1CQUN6QixTQUFTdUIsVUFDVG5HLG9CQUFvQnlGLGtCQUFrQm5ELE9BQU9ULGlCQUM3QzdCLG9CQUFvQjBGLGVBQWUvWCxhQUFha1UsZ0JBQWdCcUUsa0JBQWtCdkIsaUJBQ2xGLEVBQUM7d0JBQUUxUCxXQUFXdkcsWUFBWXdYO3dCQUEwQnRQLE9BQU87O0FBRS9EO2dCQUNBLElBQUlYLFdBQVcsT0FBTztvQkFDcEIsT0FBTytKLG9CQUFvQjRFLG1CQUN6QixXQUFXdUIsVUFDWG5HLG9CQUFvQjJGLG9CQUFvQnJELE9BQU8zVSxhQUFha1UsaUJBQzVEN0Isb0JBQW9CNEYsaUJBQWlCalksYUFBYWtVLGdCQUFnQnFFLGtCQUFrQnZCLGlCQUNwRixFQUNFO3dCQUFFMVAsV0FBV3ZHLFlBQVl3WDt3QkFBMEJ0UCxPQUFPO3VCQUMxRDt3QkFBRTNCLFdBQVcvSDt3QkFBb0IwSixPQUFPO3VCQUN4Qzt3QkFBRTNCLFdBQVc4UCxPQUFBQSxTQUFTOzRCQUFFQyxhQUFhOzt3QkFBZ0JwTyxPQUFPOztBQUdsRTtnQkFDQSxJQUFJWCxXQUFXLFVBQVU7b0JBQ3ZCLE9BQU8rSixvQkFBb0I0RSxtQkFDekIsV0FBV3VCLFVBQ1huRyxvQkFBb0I2RixvQkFBb0J2RCxPQUFPVCxpQkFDL0M3QixvQkFBb0I4RixpQkFBaUJuWSxhQUFha1UsZ0JBQWdCcUUsa0JBQWtCdkIsaUJBQ3BGLEVBQ0U7d0JBQUUxUCxXQUFXdkcsWUFBWXdYO3dCQUEwQnRQLE9BQU87dUJBQzFEO3dCQUFFM0IsV0FBVzhQLE9BQUFBLFNBQVM7NEJBQUVDLGFBQWE7O3dCQUFnQnBPLE9BQU87O0FBR2xFO0FBQ0Y7WUFFQSxJQUFJWCxXQUFXLFNBQVMwTyxtQkFBbUIsMkJBQTJCO2dCQUNwRSxPQUFPM0Usb0JBQW9CNEUsbUJBQ3pCLGFBQ0E1RSxvQkFBb0JvRyx1QkFBdUJ2RSxpQkFDM0M3QixvQkFBb0JxRyxvQkFBb0IxWSxhQUFha1UsaUJBQ3JELEVBQ0U7b0JBQUU1TSxXQUFXcVIsT0FBQUEsTUFBTTtvQkFBa0IxUCxPQUFPO21CQUM1QztvQkFBRTNCLFdBQVdxUixPQUFBQSxNQUFNO29CQUFnQjFQLE9BQU87bUJBQzFDO29CQUFFM0IsV0FBV3RHO29CQUFxQmlJLE9BQU87O0FBRy9DO1lBRUEsTUFBTTJQLGtCQUEwQztnQkFDOUMsZUFBZTlhLEtBQUFBLHNCQUFzQkM7Z0JBQ3JDLHlCQUF5QkQsS0FBQUEsc0JBQXNCRTtnQkFDL0MsZUFBZUYsS0FBQUEsc0JBQXNCRztnQkFDckMsZUFBZUgsS0FBQUEsc0JBQXNCSTtnQkFDckMseUJBQXlCSixLQUFBQSxzQkFBc0JLO2dCQUMvQyxzQkFBc0JMLEtBQUFBLHNCQUFzQk07Z0JBQzVDLGtCQUFrQk4sS0FBQUEsc0JBQXNCTztnQkFDeEMsZ0JBQWdCUCxLQUFBQSxzQkFBc0JRO2dCQUN0QyxnQkFBZ0JSLEtBQUFBLHNCQUFzQlM7Z0JBQ3RDLGdCQUFnQlQsS0FBQUEsc0JBQXNCVTtnQkFDdEMsZ0JBQWdCVixLQUFBQSxzQkFBc0JXO2dCQUN0QyxxQkFBcUJYLEtBQUFBLHNCQUFzQlk7Z0JBQzNDLGtCQUFrQlosS0FBQUEsc0JBQXNCYTs7WUFHMUMsTUFBTWthLGVBQWVELGdCQUFnQjVCO1lBQ3JDLElBQUk2QixnQkFBZ0J2USxXQUFXLE9BQU87Z0JBQ3BDLE9BQU8rSixvQkFBb0I0RSxtQkFDekI1RSxvQkFBb0J5RyxvQkFBb0I5QixpQkFDeEMzRSxvQkFBb0IwRywrQkFBK0JGLGNBQWMzRSxpQkFDakU3QixvQkFBb0IyRyw0QkFBNEJoWixhQUFha1UsZ0JBQWdCOEMsZ0JBQWdCNkIsZUFDN0Z4RyxvQkFBb0I0Ryx3QkFBd0JqQztBQUVoRDtZQUVBLElBQUkxTyxXQUFXLFNBQVMwTyxlQUFlcFksV0FBVyxXQUFXO2dCQUMzRCxNQUFNc2EsY0FBY2xDLGVBQWVwWixRQUFRLFlBQVksSUFBSThKLE1BQU0sS0FBSztnQkFDdEUsT0FBTzJLLG9CQUFvQjRFLG1CQUN6QmlDLGFBQ0E3RyxvQkFBb0JnQiwwQkFBMEI2RixjQUM5QzdHLG9CQUFvQm9CLG1CQUFtQnlGLGFBQWFsQyxnQkFBZ0IsT0FBTyxPQUMzRTNFLG9CQUFvQjhHLG1CQUFtQm5DO0FBRTNDO1lBR0EsTUFBTW9DLGVBQWVwQyxlQUFldFAsTUFBTSxLQUFLak4sT0FBT3FiO1lBQ3RELE1BQU11RCxnQkFBZ0IsSUFBSS9MLElBQVksRUFDcEMsVUFBVSxVQUFVLGtCQUFrQixhQUFhLGNBQ25ELFFBQVEsUUFBUSxXQUFXLFNBQVMsU0FBUyxTQUFTLFNBQ3RELGNBQWMsV0FBVyxhQUFhLFFBQVE7WUFFaEQsSUFDRThMLGFBQWFwZSxTQUFTLE1BQ3JCZ2MsZUFBZXBZLFdBQVcsY0FDMUJ5YSxjQUFjdkssSUFBSXNLLGFBQWEsS0FDaEM7Z0JBSUEsTUFBTUUsZ0JBQ0pqWCxvQkFBU3dCLElBQ05zRixhQUFxQnRRLGFBQ3RCd0osV0FBQUEsU0FBUzNLLElBQUltSyxpQkFDVixDQUFBO2dCQUNQLE1BQU0wWCxlQUFlcGdCLE9BQU84WixRQUFRcUcsZUFBZUUsS0FDakQsSUFBSW5FLFVBQ0ZBLGVBQ09BLFNBQVMsWUFDaEJBLEtBQUt2WixNQUFNOEIsUUFBUSxjQUFjLFFBQVFvWjtnQkFFN0MsTUFBTXlDLG1CQUFtQkYsZUFBZSxNQUFNSCxhQUFhO2dCQUUzRCxNQUFNTSxnQkFBZ0JOLGFBQWEzZSxPQUFRd2IsS0FBTUEsRUFBRXJYLFdBQVc7Z0JBQzlELE1BQU1zSixnQkFBZ0J3UixjQUFjaGYsSUFBS3ViLEtBQU1BLEVBQUV0TyxNQUFNLElBQUlqTixJQUFLeUUsU0FBSTtvQkFDbEVBO29CQUNBQyxhQUFhLEdBQUdEO29CQUNoQmxFLFVBQVU7b0JBQ1ZyQyxNQUFNeUc7O2dCQUdSLE9BQU9nVCxvQkFBb0I0RSxtQkFDekJ3QyxrQkFDQXBILG9CQUFvQnNILHlCQUF5QkYsbUJBQzdDLEtBQ0t2UixjQUFjeE4sSUFBS3VFLEtBQU1zSixRQUFBQSxTQUFTdEosS0FDckN1SixRQUFBQSxhQUFhO29CQUFFQyxTQUFTLDJCQUEyQmdSO29CQUNuRC9RLHNCQUFjO29CQUFFdEosYUFBYTtvQkFDN0J1Siw2QkFBcUI7b0JBQUV2SixhQUFhO3NCQUV0Q2lULG9CQUFvQjhHLG1CQUFtQm5DO0FBRTNDO1lBRUEsT0FBTzNiO0FBQ1Q7UUFFUSx5QkFBTzRiLENBQ2JuUCxZQUNBbUMsU0FDQWpMLFlBQ0F3WDtZQUVBLE9BQU87Z0JBQUUxTztnQkFBWW1DO2dCQUFTakw7Z0JBQVl3WDs7QUFDNUM7UUFFUSwwQkFBT3NDLENBQW9CaGQ7WUFDakMsTUFBTThkLGVBQWU5ZCxLQUFLNEwsTUFBTSxLQUFLO1lBQ3JDLE9BQU9rUztBQUNUO1FBRVEsOEJBQU9YLENBQ2JuZDtZQUVBLE1BQU0rZCxXQUFXL2QsS0FBSzRMLE1BQU0sS0FBS2pOLE9BQVF3YixLQUFNQSxFQUFFclgsV0FBVztZQUM1RCxNQUFNNEIsU0FBa0U7WUFDeEVxWixTQUFTOVEsUUFBUSxDQUFDK1EsS0FBS0M7Z0JBQ3JCLE1BQU01YSxPQUFPMmEsSUFBSWxjLFFBQVEsS0FBSztnQkFDOUI0QyxPQUFPdUcsS0FBSztvQkFBRU8sV0FBV3FSLE9BQUFBLE1BQU14WjtvQkFBYzhKLE9BQU84UTs7O1lBRXRELElBQ0VqZSxLQUFLOEMsV0FBVyxjQUNoQjlDLEtBQUs4QyxXQUFXLGtCQUNoQjlDLEtBQUs4QyxXQUFXLFlBQ2hCOUMsS0FBSzhDLFdBQVcsVUFDaEI7Z0JBQ0E0QixPQUFPdUcsS0FBSztvQkFBRU8sV0FBV3RHO29CQUFxQmlJLE9BQU80USxTQUFTN2U7O0FBQ2hFO1lBQ0EsT0FBT3dGO0FBQ1Q7UUFFUSx5QkFBTzJZLENBQ2JyZDtZQUVBLE1BQU0rZCxXQUFXL2QsS0FBSzRMLE1BQU0sS0FBS2pOLE9BQVF3YixLQUFNQSxFQUFFclgsV0FBVztZQUM1RCxNQUFNNEIsU0FBa0U7WUFDeEVxWixTQUFTOVEsUUFBUSxDQUFDK1EsS0FBS0M7Z0JBQ3JCLE1BQU01YSxPQUFPMmEsSUFBSWxjLFFBQVEsS0FBSztnQkFDOUI0QyxPQUFPdUcsS0FBSztvQkFBRU8sV0FBV3FSLE9BQUFBLE1BQU14WjtvQkFBYzhKLE9BQU84UTs7O1lBRXRELElBQUlqZSxLQUFLOEMsV0FBVyxXQUFXO2dCQUM3QjRCLE9BQU91RyxLQUFLO29CQUFFTyxXQUFXdEc7b0JBQXFCaUksT0FBTzRRLFNBQVM3ZTs7QUFDaEU7WUFDQSxPQUFPd0Y7QUFDVDtRQUVRLDBCQUFPMFcsQ0FDYmxYLGFBQ0FrVTtZQUVBLE9BQU8xSyxlQUFlcUssT0FFcEJyVSxNQUNBd2E7Z0JBRUEsT0FBTXZhLEtBQUVBLEtBQUdvRixLQUFFQSxjQUNMekIsS0FBSzZXLE9BQU8sSUFBSWhlLGFBQUFBLGNBQWNJLFFBQVEsT0FDNUMwSSxJQUFJOE87Z0JBQ05oUCxJQUFJVSxRQUFRLGdCQUFnQjJPO2dCQUM1QixJQUFJZ0c7Z0JBQ0o7b0JBQ0VBLGdCQUFnQjlXLEtBQUsrRixZQUFZMUosS0FBS29VLE9BQU9yVSxNQUFNQztBQUNyRCxrQkFBRSxPQUFPcUU7b0JBQ1BlLElBQUlpRixNQUFNLHdCQUF3Qm9LLGtCQUFrQnBRO29CQUNwRCxNQUFNQTtBQUNSO2dCQUNBZSxJQUFJd1EsS0FBSyxlQUFlbkIsMEJBQTJCZ0csUUFBZ0I5VyxLQUFLNEs7Z0JBQ3hFLElBQUlnTSxNQUFNdmEsSUFBSTJNLFdBQVc0TjtnQkFDekIsT0FBT0U7QUFDVDtBQUNGO1FBRVEsOEJBQU81QyxDQUNidFgsYUFDQWtVO1lBRUEsT0FBTzFLLGVBQWUyUSxVQUVwQjNhLE1BQ0F3YTtnQkFFQSxPQUFNdmEsS0FBRUEsS0FBR29GLEtBQUVBLGNBQ0x6QixLQUFLNlcsT0FBTyxJQUFJM2MsYUFBQUEsc0JBQXNCRSxZQUFZLE9BQ3hEdUgsSUFBSW9WO2dCQUNOdFYsSUFBSVUsUUFBUSxnQkFBZ0IyTztnQkFDNUIsSUFBSWdHO2dCQUNKO29CQUNFQSxnQkFBZ0I5VyxLQUFLK0YsWUFBWTFKLEtBQUswYSxVQUNwQzNhLEtBQUs5RSxJQUFLc08sS0FBTSxJQUFJaEosWUFBWWdKLEtBQ2hDdko7QUFFSixrQkFBRSxPQUFPcUU7b0JBQ1BlLElBQUlpRixNQUFNLHdCQUF3Qm9LLGtCQUFrQnBRO29CQUNwRCxNQUFNQTtBQUNSO2dCQUNBZSxJQUFJd1EsS0FBSyxlQUFlbkIsMEJBQTJCZ0csUUFBZ0I5VyxLQUFLNEs7Z0JBQ3hFLElBQUlnTSxNQUFNdmEsSUFBSTJNLFdBQVc0TjtnQkFDekIsT0FBT0U7QUFDVDtBQUNGO1FBRVEsNEJBQU8xQyxDQUFzQnREO1lBQ25DLE9BQU8xSyxlQUFlNFEsUUFFcEJDO2dCQUVBLE9BQU01YSxLQUFFQSxLQUFHb0YsS0FBRUEsY0FDTHpCLEtBQUs2VyxPQUFPLElBQUkzYyxhQUFBQSxzQkFBc0JDLFVBQVUsT0FDdER3SCxJQUFJcVY7Z0JBQ04sTUFBTUUsZ0JBQWdCdGhCLE1BQU1DLFFBQVFvaEIsT0FBT0EsTUFBTSxFQUFDQTtnQkFDbEQsSUFBSUU7Z0JBQ0o7b0JBQ0UxVixJQUFJVyxNQUFNLFdBQVc4VSxpQkFBaUJwRztvQkFDdENxRyxhQUFhblgsS0FBSytGLFlBQVkxSixLQUFLMmEsUUFBUUUsZUFBc0I3YTtBQUNuRSxrQkFBRSxPQUFPcUU7b0JBQ1BlLElBQUlpRixNQUFNLGtCQUFrQm9LLGtCQUFrQnBRO29CQUM5QyxNQUFNQTtBQUNSO2dCQUNBZSxJQUFJd1EsS0FBSyxRQUFRa0YsS0FBS3ZmLFVBQVVrWjtnQkFDaEMsT0FBT3FHO0FBQ1Q7QUFDRjtRQUVRLDhCQUFPN0MsQ0FBd0J4RDtZQUNyQyxPQUFPMUssZUFBZWdSLFVBRXBCM2EsTUFDQW1hO2dCQUVBLE9BQU12YSxLQUFFQSxLQUFHb0YsS0FBRUEsY0FDTHpCLEtBQUs2VyxPQUFPLElBQUkzYyxhQUFBQSxzQkFBc0JHLFlBQVksT0FDeERzSCxJQUFJeVY7Z0JBQ04sSUFBSUM7Z0JBQ0o7b0JBQ0U1VixJQUFJd1EsS0FBSyxZQUFZeFYsS0FBSzdFLFVBQVVrWjtvQkFDcEN1RyxnQkFBZ0JyWCxLQUFLK0YsWUFBWTFKLEtBQUsrYSxVQUFVM2EsTUFBTUo7QUFDeEQsa0JBQUUsT0FBT3FFO29CQUNQZSxJQUFJaUYsTUFBTWhHO29CQUNWLE1BQU1BO0FBQ1I7Z0JBQ0EsSUFBSWtXLE1BQU12YSxJQUFJMk0sV0FBVzROO2dCQUN6QixPQUFPUztBQUNUO0FBQ0Y7UUFFUSw4QkFBTzdDLENBQXdCMUQ7WUFDckMsT0FBTzFLLGVBQWVrUixVQUVwQkwsS0FDQUw7Z0JBRUEsT0FBTXZhLEtBQUVBLEtBQUdvRixLQUFFQSxjQUNMekIsS0FBSzZXLE9BQU8sSUFBSTNjLGFBQUFBLHNCQUFzQkksWUFBWSxPQUN4RHFILElBQUkyVjtnQkFDTixNQUFNSixnQkFBZ0J0aEIsTUFBTUMsUUFBUW9oQixPQUFPQSxNQUFNLEVBQUNBO2dCQUNsRCxJQUFJRTtnQkFDSjtvQkFDRTFWLElBQUlXLE1BQU0sWUFBWThVLGNBQWN0ZixVQUFVa1o7b0JBQzlDcUcsYUFBYW5YLEtBQUsrRixZQUFZMUosS0FBS2liLFVBQVVKLGVBQWU3YTtBQUM5RCxrQkFBRSxPQUFPcUU7b0JBQ1BlLElBQUlpRixNQUFNLG9CQUFvQm9LLGtCQUFrQnBRO29CQUNoRCxNQUFNQTtBQUNSO2dCQUNBZSxJQUFJd1EsS0FBSyxXQUFXa0YsS0FBS3ZmLFVBQVVrWjtnQkFDbkMsSUFBSThGLE1BQU12YSxJQUFJMk0sV0FBVzROO2dCQUN6QixPQUFPTztBQUNUO0FBQ0Y7UUFFUSx3QkFBT3pDLENBQ2JuRCxPQUNBVDtZQUVBLE9BQU8xSyxlQUFlK1EsS0FFcEJJO2dCQUVBLE9BQU1sYixLQUFFQSxLQUFHb0YsS0FBRUEsY0FDTHpCLEtBQUs2VyxPQUFPLElBQUloZSxhQUFBQSxjQUFjQyxNQUFNLE9BQzFDNkksSUFBSXdWO2dCQUNOLE1BQU1LLEtBQUtqRyxTQUFTZ0csWUFBWTlaO2dCQUNoQyxXQUFXK1osT0FBTyxhQUNoQixNQUFNLElBQUlDLGFBQUFBLGdCQUFnQixNQUFNelgsS0FBSzRLO2dCQUN2QyxJQUFJOE07Z0JBQ0o7b0JBQ0VqVyxJQUFJVyxNQUFNLFdBQVcwTyx1QkFBdUI5USxLQUFLNEssTUFBTTRNO29CQUN2REUsbUJBQW1CMVgsS0FBSytGLFlBQVkxSixLQUFLOGEsS0FBS0ssSUFBSW5iO0FBQ3BELGtCQUFFLE9BQU9xRTtvQkFDUGUsSUFBSWlGLE1BQU0sa0JBQWtCb0ssMEJBQTBCMEcsTUFBTTlXO29CQUM1RCxNQUFNQTtBQUNSO2dCQUNBZSxJQUFJd1EsS0FBSyxRQUFRbkIsMEJBQTJCNEcsV0FBbUIxWCxLQUFLNEs7Z0JBQ3BFLE9BQU84TTtBQUNUO0FBQ0Y7UUFFUSwwQkFBTzlDLENBQ2JyRCxPQUNBM1UsYUFDQWtVO1lBRUEsT0FBTzFLLGVBQWV1UixPQUVwQkosYUFDQTlhLE1BQ0FtYTtnQkFFQSxPQUFNdmEsS0FBRUEsS0FBR29GLEtBQUVBLGNBQ0x6QixLQUFLNlcsT0FBTyxJQUFJaGUsYUFBQUEsY0FBY08sUUFBUSxPQUM1Q3VJLElBQUlnVztnQkFDTixNQUFNSCxLQUFLakcsU0FBU2dHLFlBQVk5WjtnQkFDaEMsV0FBVytaLE9BQU8sYUFDaEIsTUFBTSxJQUFJQyxhQUFBQSxnQkFBZ0IsTUFBTXpYLEtBQUs0SztnQkFDdkMsSUFBSXlNO2dCQUNKO29CQUNFNVYsSUFBSXdRLEtBQUssWUFBWW5CLHVCQUF1QjlRLEtBQUs0SyxNQUFNNE07b0JBQ3ZELE1BQU1JLFVBQVVyUixLQUFLc1IsTUFBTXRSLEtBQUtDLFVBQVUvSjtvQkFDMUM0YSxnQkFBZ0JyWCxLQUFLK0YsWUFBWTFKLEtBQUtzYixPQUNwQyxJQUFJL2EsWUFBWTsyQkFBS2diO3dCQUFTLENBQUM1WCxLQUFLNEssS0FBSzRNO3dCQUN6Q25iO0FBRUosa0JBQUUsT0FBT3FFO29CQUNQZSxJQUFJaUYsTUFBTWhHO29CQUNWLE1BQU1BO0FBQ1I7Z0JBQ0EsSUFBSWtXLE1BQU12YSxJQUFJMk0sV0FBVzROO2dCQUN6QixPQUFPUztBQUNUO0FBQ0Y7UUFFUSwwQkFBT3ZDLENBQ2J2RCxPQUNBVDtZQUVBLE9BQU8xSyxlQUFlMFIsT0FFcEJQLGFBQ0FYO2dCQUVBLE9BQU12YSxLQUFFQSxLQUFHb0YsS0FBRUEsY0FDTHpCLEtBQUs2VyxPQUFPLElBQUloZSxhQUFBQSxjQUFjVyxRQUFRLE9BQzVDbUksSUFBSW1XO2dCQUNOLE1BQU1OLEtBQUtqRyxTQUFTZ0csWUFBWTlaO2dCQUNoQyxXQUFXK1osT0FBTyxhQUNoQixNQUFNLElBQUlDLGFBQUFBLGdCQUFnQixNQUFNelgsS0FBSzRLO2dCQUN2QyxJQUFJbU47Z0JBQ0o7b0JBQ0V0VyxJQUFJVyxNQUFNLFlBQVkwTyx1QkFBdUI5USxLQUFLNEssTUFBTTRNO29CQUN4RE8sWUFBWS9YLEtBQUsrRixZQUFZMUosS0FBSzJiLE9BQU9SLElBQUluYjtBQUMvQyxrQkFBRSxPQUFPcUU7b0JBQ1BlLElBQUlpRixNQUFNLG9CQUFvQm9LLDBCQUEwQjBHLE1BQU05VztvQkFDOUQsTUFBTUE7QUFDUjtnQkFDQWUsSUFBSXdRLEtBQUssV0FBV25CLDBCQUEwQjBHO2dCQUM5QyxJQUFJWixNQUFNdmEsSUFBSTJNLFdBQVc0TjtnQkFDekIsT0FBT21CO0FBQ1Q7QUFDRjtRQUVRLDZCQUFPMUMsQ0FBdUJ2RTtZQUNwQyxPQUFPMUssZUFBZUYsVUFFcEJuSyxNQUNBaUssTUFDQWlTO2dCQUVBLE9BQU01YixLQUFFQSxjQUNBMkQsS0FBSzZXLE9BQU8sSUFBSXRILEtBQUFBLGdCQUFnQjJJLFdBQVcsT0FDakR2VyxJQUFJdUU7Z0JBQ04sT0FBTU8sV0FBRUEsV0FBU3JJLFFBQUVBLFFBQU1KLE9BQUVBLE9BQUtLLFVBQUVBLFlBQWE0WjtnQkFDL0NqUyxPQUFPQSxLQUFLMU8sSUFDVGliLGFBQWNBLE1BQU0sV0FBVzRGLFNBQVM1RixLQUFlQSxNQUFNQTtnQkFFaEUsTUFBTTZGLGdCQUFnQnBTLEtBQUtwTyxTQUFTLElBQUlvTyxLQUFLLEtBQUsvTjtnQkFDbEQsTUFBTW9nQixvQkFBcUI1UixhQUFhMlI7Z0JBR3hDLElBQUlDLHFCQUFxQnJTLEtBQUtwTyxTQUFTLEdBQUdvTyxLQUFLLEtBQUtxUztnQkFDcEQsUUFBUXRjO2tCQUNOLEtBQUtyQixLQUFBQSxzQkFBc0JHO2tCQUMzQixLQUFLSCxLQUFBQSxzQkFBc0JNO29CQUN6Qjs7a0JBQ0YsS0FBS04sS0FBQUEsc0JBQXNCQztvQkFDekJxTCxLQUFLckMsS0FBSzhDO29CQUNWOztrQkFDRixLQUFLL0wsS0FBQUEsc0JBQXNCSTtrQkFDM0IsS0FBS0osS0FBQUEsc0JBQXNCRTtvQkFDekJvTCxPQUFPLEVBQ0xBLEtBQUssSUFDTHFTLG1CQUNBO3dCQUFFcmE7d0JBQU9JO3dCQUFRQzs7b0JBRW5COztrQkFDRixLQUFLM0QsS0FBQUEsc0JBQXNCSztvQkFDekI7O2tCQUNGLEtBQUtMLEtBQUFBLHNCQUFzQk87a0JBQzNCLEtBQUtQLEtBQUFBLHNCQUFzQlE7a0JBQzNCLEtBQUtSLEtBQUFBLHNCQUFzQlM7a0JBQzNCLEtBQUtULEtBQUFBLHNCQUFzQlU7a0JBQzNCLEtBQUtWLEtBQUFBLHNCQUFzQlc7a0JBQzNCLEtBQUtYLEtBQUFBLHNCQUFzQlk7a0JBQzNCLEtBQUtaLEtBQUFBLHNCQUFzQmE7b0JBQ3pCOztnQkFFSixPQUFPeUUsS0FBSytGLFlBQVkxSixLQUFLNkosVUFBVW5LLFNBQVNpSyxNQUFNM0o7QUFDeEQ7QUFDRjtRQUVRLHFDQUFPc1osQ0FDYkYsY0FDQTNFO1lBRUEsT0FBTzFLLGVBQWVrUyxxQkFFakJ0UztnQkFFSCxPQUFNM0osS0FBRUEsY0FDQTJELEtBQUs2VyxPQUFPLElBQUlwQixjQUFjLE9BQ3BDOVQsSUFBSTJXO2dCQUVOLFFBQVE3QztrQkFDTixLQUFLL2EsS0FBQUEsc0JBQXNCQztvQkFBUzt3QkFDbEMsT0FBT3JHLEtBQUsyakIsV0FBV2pTO3dCQUN2QixPQUFPaEcsS0FBSytGLFlBQVkxSixLQUFLa2MsT0FDM0Jqa0IsS0FDQzJqQixTQUFpQnhSLFdBQ2xCcEs7QUFFSjs7a0JBQ0EsS0FBSzNCLEtBQUFBLHNCQUFzQkU7b0JBQVM7d0JBQ2xDLE9BQU90RyxLQUFLa2tCLE1BQU1QLFdBQVdqUzt3QkFDN0IsT0FBT2hHLEtBQUsrRixZQUFZMUosS0FBS29jLFdBQzNCbmtCLEtBQ0MyakIsU0FBaUJ4UixXQUNsQjs0QkFDRXpJLE9BQVFpYSxTQUFpQmphOzRCQUN6QkksUUFBUzZaLFNBQWlCN1o7NEJBQzFCb2E7MkJBRUZuYztBQUVKOztrQkFDQSxLQUFLM0IsS0FBQUEsc0JBQXNCRztvQkFBTTt3QkFDL0IsT0FBT2xHLE9BQU9zakIsV0FBV2pTO3dCQUN6QixNQUFNUyxZQUNId1IsU0FBaUJ4UixhQUFheEIsS0FBQUEsZUFBZXlUO3dCQUNoRCxNQUFNM1MsY0FBYy9GLEtBQUsrRixZQUFZMUo7d0JBQ3JDLFdBQVcwSixZQUFZcVEsU0FBUyxZQUM5QixPQUFPclEsWUFBWXFRLEtBQUt6aEIsT0FBTzhSLFdBQVdwSzt3QkFDNUMsT0FBTzBKLFlBQVlHLFVBQVV4TCxLQUFBQSxzQkFBc0JHLE1BQU1sRyxPQUFPOFIsV0FBV3BLO0FBQzdFOztrQkFDQSxLQUFLM0IsS0FBQUEsc0JBQXNCSTtvQkFBTTt3QkFDL0IsT0FBT25HLE9BQU9zakIsV0FBV2pTO3dCQUN6QixNQUFNMlMsTUFBTTs0QkFDVnZhLFFBQVM2WixTQUFpQjdaLFVBQVU7NEJBQ3BDSixPQUFRaWEsU0FBaUJqYSxTQUFTOzRCQUNsQ0ssVUFBVzRaLFNBQWlCNVo7O3dCQUU5QixNQUFNMEgsY0FBYy9GLEtBQUsrRixZQUFZMUo7d0JBQ3JDLE1BQU1vSyxZQUFhd1IsU0FBaUJ4UixhQUFheEIsS0FBQUEsZUFBZXlUO3dCQUNoRSxXQUFXM1MsWUFBWXlTLFNBQVMsWUFDOUIsT0FBT3pTLFlBQVl5UyxLQUFLN2pCLE9BQU84UixXQUFXa1MsS0FBS3RjO3dCQUNqRCxPQUFPMEosWUFBWUcsVUFBVXhMLDJCQUFzQkksTUFBTW5HLE9BQU84UixXQUFXa1MsS0FBS3RjO0FBQ2xGOztrQkFDQSxLQUFLM0IsS0FBQUEsc0JBQXNCSztvQkFBYTt3QkFDdEMsT0FBT3pHLEtBQUtLLFNBQVNxUjt3QkFDckIsT0FBT2hHLEtBQUsrRixZQUFZMUosS0FBS3VjLFVBQVV0a0IsS0FBS0ssT0FBTzBIO0FBQ3JEOztrQkFDQSxLQUFLM0IsS0FBQUEsc0JBQXNCTTtvQkFBUzt3QkFDbEMsT0FBTzFHLEtBQUtLLFNBQVNxUjt3QkFDckIsT0FBT2hHLEtBQUsrRixZQUFZMUosS0FDckJzRixJQUFJdEYsSUFBSXNOLGVBQ1JrUCxPQUFPdmtCLEtBQUtLLE9BQU8wSDtBQUN4Qjs7a0JBQ0E7b0JBQ0UsSUFDRW9aLGlCQUFpQi9hLEtBQUFBLHNCQUFzQk8sWUFDdkN3YSxpQkFBaUIvYSxLQUFBQSxzQkFBc0JRLFVBQ3ZDdWEsaUJBQWlCL2EsS0FBQUEsc0JBQXNCUyxVQUN2Q3NhLGlCQUFpQi9hLEtBQUFBLHNCQUFzQlUsVUFDdkNxYSxpQkFBaUIvYSxLQUFBQSxzQkFBc0JXLFVBQ3ZDb2EsaUJBQWlCL2EsS0FBQUEsc0JBQXNCWSxlQUN2Q21hLGlCQUFpQi9hLEtBQUFBLHNCQUFzQmEsVUFDdkM7d0JBQ0EsT0FBT3VkLFNBQVM5Uzt3QkFDaEIsT0FBT2hHLEtBQUsrRixZQUFZMUosS0FBSzZKLFVBQVV1UCxjQUFjcUQsT0FBT3pjO0FBQzlEO29CQUNBLE1BQU0sSUFBSThILE1BQU0sc0JBQXNCc1I7O0FBRTVDO0FBQ0Y7UUFFUSxnQ0FBT3hGLENBQTBCdkw7WUFDdkMsT0FBTzBCLGVBQWUyUyxnQkFFakIvUztnQkFFSCxNQUFNdkUsTUFBV3pCLEtBQUt5QixLQUFLRSxNQUFNb1g7Z0JBQ2pDO29CQUNFLElBQUl0WCxLQUFLQSxJQUFJVyxNQUFNLDBCQUEwQnNDO29CQUM3QyxPQUFNckksS0FBRUEsY0FDQTJELEtBQUs2VyxPQUFPLElBQUluUyxZQUFZLE9BQ2xDL0MsSUFBSW9YO29CQUNOLE1BQU1oVCxjQUFjL0YsS0FBSytGLFlBQVkxSjtvQkFDckMsTUFBTTJjLGFBQWEvSixvQkFBb0JnSyxpQkFBaUJqVDtvQkFDeEQsV0FBV0QsWUFBWXJCLGdCQUFnQixZQUFZO3dCQUNqRCxPQUFPcUIsWUFBWXJCLGVBQWVzVSxZQUFZM2M7QUFDaEQ7b0JBQ0EsV0FBVzBKLFlBQVlHLGNBQWMsWUFBWTt3QkFDL0MsT0FBT0gsWUFBWUcsVUFBVXhCLGVBQWVzVSxZQUFZM2M7QUFDMUQ7b0JBQ0EsTUFBTSxJQUFJOEgsTUFDUix1QkFBdUJPLDRCQUE0QnFCLGFBQWF0USxhQUFhc0c7QUFFakYsa0JBQUUsT0FBTzJFO29CQUNQLElBQUllLEtBQUtBLElBQUlpRixNQUFNLGlCQUFpQmhDLHNCQUFzQmhFO29CQUMxRCxNQUFNQTtBQUNSO0FBQ0Y7QUFDRjtRQUVRLCtCQUFPNlYsQ0FBeUI3UjtZQUN0QyxPQUFPMEIsZUFBZThTLGVBRWpCbFQ7Z0JBRUgsTUFBTXZFLE1BQVd6QixLQUFLeUIsS0FBS0UsTUFBTXVYO2dCQUNqQyxPQUFNN2MsS0FBRUEsY0FDQTJELEtBQUs2VyxPQUFPLElBQUluUyxZQUFZLE9BQ2xDL0MsSUFBSXVYO2dCQUNOLE1BQU1uVCxjQUFjL0YsS0FBSytGLFlBQVkxSjtnQkFDckMsTUFBTTJjLGFBQWEvSixvQkFBb0JnSyxpQkFBaUJqVDtnQkFHeEQsV0FBV0QsWUFBWXJCLGdCQUFnQixZQUFZO29CQUNqRCxPQUFPcUIsWUFBWXJCLGVBQWVzVSxZQUFZM2M7QUFDaEQ7Z0JBRUEsSUFBSTBKLGFBQWEwSixlQUFlMUosWUFBWTBKLEtBQUsvSyxnQkFBZ0IsWUFBWTtvQkFDM0UsT0FBT3FCLFlBQVkwSixLQUFLL0ssZUFBZXNVLFlBQVkzYztBQUNyRDtnQkFFQSxXQUFXMEosWUFBWUcsY0FBYyxZQUFZO29CQUMvQyxPQUFPSCxZQUFZRyxVQUFVeEIsZUFBZXNVLFlBQVkzYztBQUMxRDtnQkFDQSxNQUFNLElBQUk4SCxNQUNSLFdBQVdPLDRCQUE0QnFCLGFBQWF0USxhQUFhc0c7QUFFckU7QUFDRjtRQUVRLHVCQUFPa2QsQ0FBaUJqVDtZQUM5QixJQUFJQSxLQUFLcE8sV0FBVyxHQUFHLE9BQU9vTztZQUM5QixNQUFNbVQsT0FBT25ULEtBQUtBLEtBQUtwTyxTQUFTO1lBQ2hDLElBQ0V1aEIsZUFDT0EsU0FBUyxhQUNmdmpCLE1BQU1DLFFBQVFzakIsT0FDZjtnQkFDQSxNQUFNQyxXQUFXcFQsS0FBS3FUO2dCQUN0QixNQUFNQyxlQUFlRixTQUFTM1MsY0FBY3hPO2dCQUM1QyxNQUFNc2hCLFdBQVdILFNBQVNwYixVQUFVL0Y7Z0JBQ3BDLE1BQU11aEIsWUFBWUosU0FBU2hiLFdBQVduRztnQkFDdEMsS0FBS3FoQixpQkFBaUJDLGFBQWFDLFdBQVcsT0FBT3hUO2dCQUNyRCxNQUFNeVQsU0FBZ0I7Z0JBQ3RCLElBQUlILGNBQWNHLE9BQU85VixLQUFLeVYsU0FBUzNTLGlCQUNsQyxJQUFJOFMsWUFBWUMsV0FBV0MsT0FBTzlWLEtBQUsxTDtnQkFDNUMsSUFBSXNoQixVQUFVRSxPQUFPOVYsS0FBS3lWLFNBQVNwYjtnQkFDbkMsSUFBSXdiLFdBQVdDLE9BQU85VixLQUFLeVYsU0FBU2hiO2dCQUNwQyxPQUFPLEtBQUk0SCxTQUFTeVQ7QUFDdEI7WUFDQSxPQUFPelQ7QUFDVDtRQUVRLDZCQUFPK04sQ0FDYm5YLGFBQ0FrVTtZQUVBLE9BQU8sRUFDTHZZLHNCQUFzQnFFLGFBQWEsU0FDbkN3SSxRQUFBQSxhQUFhO2dCQUFFQyxTQUFTLGdCQUFnQnlMO2dCQUN4QzRJLGdCQUFRO2dCQUNOMWQsYUFBYSxlQUFlOFU7Z0JBQzVCdGIsTUFBTXVVLE9BQU9sUiwyQkFBY0ksUUFBUTJEO2dCQUVyQytjLDJCQUFtQjtnQkFDakIzZCxhQUFhLEdBQUc4VTtnQkFDaEI4SSxRQUFRO29CQUFFbk0sTUFBTW9NLFFBQUFBLGNBQWNqZDs7Z0JBRWhDa2QsOEJBQXNCO2dCQUFFOWQsYUFBYTtnQkFDckMrZCx1Q0FBK0I7Z0JBQzdCL2QsYUFBYTs7QUFHbkI7UUFFUSwyQkFBT21ZLENBQ2J2WCxhQUNBa1U7WUFFQSxPQUFPLEVBQ0x2WSxzQkFBc0JxRSxhQUFhLFFBQVEsU0FDM0N3SSxRQUFBQSxhQUFhO2dCQUFFQyxTQUFTLGdCQUFnQnlMO2dCQUN4QzRJLGdCQUFRO2dCQUNOMWQsYUFBYSxlQUFlOFU7Z0JBQzVCOEksUUFBUTtvQkFDTnBrQixNQUFNO29CQUNOOEMsT0FBTzt3QkFBRW1WLE1BQU1vTSxRQUFBQSxjQUFjamQ7OztnQkFHakMrYywyQkFBbUI7Z0JBQ2pCM2QsYUFBYSxHQUFHOFU7Z0JBQ2hCOEksUUFBUTtvQkFDTnBrQixNQUFNO29CQUNOOEMsT0FBTzt3QkFBRW1WLE1BQU1vTSxRQUFBQSxjQUFjamQ7OztnQkFHakNrZCw4QkFBc0I7Z0JBQUU5ZCxhQUFhO2dCQUNyQytkLHVDQUErQjtnQkFDN0IvZCxhQUFhOztBQUduQjtRQUVRLHlCQUFPcVksQ0FDYnpYLGFBQ0FrVTtZQUVBLE9BQU8sRUFDTHZZLHNCQUFzQnFFLGFBQWEsT0FBTyxTQUMxQ3dJLFFBQUFBLGFBQWE7Z0JBQUVDLFNBQVMsWUFBWXlMO2dCQUNwQzlMLFFBQUFBLFNBQVM7Z0JBQUVqSixNQUFNO2dCQUFPbEUsVUFBVTtnQkFBTXJDLE1BQU07Z0JBQzlDOFAsc0JBQWM7Z0JBQ1p0SixhQUFhLEdBQUc4VTtnQkFDaEI4SSxRQUFRO29CQUNOcGtCLE1BQU07b0JBQ044QyxPQUFPO3dCQUFFbVYsTUFBTW9NLFFBQUFBLGNBQWNqZDs7O2dCQUdqQ29kLDRCQUFvQjtnQkFDbEJoZSxhQUFhLE1BQU04VTs7QUFHekI7UUFFUSwyQkFBT3lELENBQ2IzWCxhQUNBa1UsZ0JBQ0FVO1lBRUEsT0FBTyxFQUNMalosc0JBQXNCcUUsYUFBYSxPQUFPLFNBQzFDbEIsbUJBQW1COFYsZ0JBQ25CcE0scUJBQWE7Z0JBQ1hDLFNBQVMsb0JBQW9CeUw7Z0JBRS9CNEksZ0JBQVE7Z0JBQ04xZCxhQUFhLDZDQUE2QzhVO2dCQUMxRDhJLFFBQVE7b0JBQ05wa0IsTUFBTTtvQkFDTmlZLE1BQU1vTSxRQUFBQSxjQUFjOVAsT0FBT2xSLGFBQUFBLGNBQWNPLFFBQVF3RDs7Z0JBR3JEMEksc0JBQWM7Z0JBQ1p0SixhQUFhLEdBQUc4VTtnQkFDaEI4SSxRQUFRO29CQUNOcGtCLE1BQU07b0JBQ044QyxPQUFPO3dCQUFFbVYsTUFBTW9NLFFBQUFBLGNBQWNqZDs7O2dCQUdqQ29kLDRCQUFvQjtnQkFDbEJoZSxhQUFhLE1BQU04VTtnQkFFckJnSiw4QkFBc0I7Z0JBQUU5ZCxhQUFhOztBQUV6QztRQUVRLDJCQUFPeVksQ0FDYjdYLGFBQ0FrVSxnQkFDQVU7WUFFQSxPQUFPLEVBQ0xqWixzQkFBc0JxRSxhQUFhLFVBQVUsU0FDN0NsQixtQkFBbUI4VixnQkFDbkJwTSxRQUFBQSxhQUFhO2dCQUFFQyxTQUFTLFVBQVV5TDtnQkFDbEM5TCxRQUFBQSxTQUFTO2dCQUFFakosTUFBTTtnQkFBT2xFLFVBQVU7Z0JBQU1yQyxNQUFNO2dCQUM5QzhQLHNCQUFjO2dCQUNadEosYUFBYSxHQUFHOFU7Z0JBQ2hCOEksUUFBUTtvQkFDTnBrQixNQUFNO29CQUNOOEMsT0FBTzt3QkFBRW1WLE1BQU1vTSxRQUFBQSxjQUFjamQ7OztnQkFHakNvZCw0QkFBb0I7Z0JBQ2xCaGUsYUFBYSxNQUFNOFU7O0FBR3pCO1FBRVEscUJBQU82RCxDQUNiL1gsYUFDQWtVLGdCQUNBVSxlQUNBQztZQUVBLE9BQU8sRUFDTGxaLHNCQUFzQnFFLGFBQWEsT0FBTzZVLFNBQzFDL1YsbUJBQW1COFYsZ0JBQ25CcE0sUUFBQUEsYUFBYTtnQkFBRUMsU0FBUyxjQUFjeUw7Z0JBQ3RDeEwsc0JBQWM7Z0JBQ1p0SixhQUFhLEdBQUc4VTtnQkFDaEI4SSxRQUFRO29CQUFFbk0sTUFBTW9NLFFBQUFBLGNBQWNqZDs7Z0JBRWhDb2QsNEJBQW9CO2dCQUNsQmhlLGFBQWEsTUFBTThVOztBQUd6QjtRQUVRLHVCQUFPK0QsQ0FDYmpZLGFBQ0FrVSxnQkFDQVUsZUFDQUM7WUFFQSxPQUFPLEVBQ0xsWixzQkFBc0JxRSxhQUFhLE9BQU82VSxTQUMxQy9WLG1CQUFtQjhWLGdCQUNuQnBNLHFCQUFhO2dCQUNYQyxTQUFTLHVCQUF1QnlMO2dCQUVsQzRJLGdCQUFRO2dCQUNOMWQsYUFBYSwrQ0FBK0M4VTtnQkFDNUR0YixNQUFNdVUsT0FBT2xSLDJCQUFjTyxRQUFRd0Q7Z0JBRXJDMEksc0JBQWM7Z0JBQ1p0SixhQUFhLEdBQUc4VTtnQkFDaEI4SSxRQUFRO29CQUFFbk0sTUFBTW9NLFFBQUFBLGNBQWNqZDs7Z0JBRWhDb2QsNEJBQW9CO2dCQUNsQmhlLGFBQWEsTUFBTThVO2dCQUVyQmdKLDhCQUFzQjtnQkFBRTlkLGFBQWE7O0FBRXpDO1FBRVEsdUJBQU8rWSxDQUNiblksYUFDQWtVLGdCQUNBVSxlQUNBQztZQUVBLE9BQU8sRUFDTGxaLHNCQUFzQnFFLGFBQWEsVUFBVTZVLFNBQzdDL1YsbUJBQW1COFYsZ0JBQ25CcE0sUUFBQUEsYUFBYTtnQkFBRUMsU0FBUyxZQUFZeUw7Z0JBQ3BDeEwsc0JBQWM7Z0JBQ1p0SixhQUFhLEdBQUc4VTtnQkFDaEI4SSxRQUFRO29CQUFFbk0sTUFBTW9NLFFBQUFBLGNBQWNqZDs7Z0JBRWhDb2QsNEJBQW9CO2dCQUNsQmhlLGFBQWEsTUFBTThVOztBQUd6QjtRQUVRLDBCQUFPd0UsQ0FDYjFZLGFBQ0FrVTtZQUVBLE9BQU8sRUFDTHZZLHNCQUFzQnFFLGFBQWEsT0FBTyw0QkFDMUN3SSxxQkFBYTtnQkFDWEMsU0FBUyxvQ0FBb0N5TDtnQkFFL0MzTCxRQUFBQSxTQUFTO2dCQUFFcEosTUFBTTtnQkFBVUMsYUFBYTtnQkFDeENtSixpQkFBUztnQkFDUHBKLE1BQU07Z0JBQ05DLGFBQWE7Z0JBRWZnSixpQkFBUztnQkFDUGpKLE1BQU07Z0JBQ05sRSxVQUFVO2dCQUNWRyxNQUFNaU4sS0FBQUE7Z0JBQ05qSixhQUFhO2dCQUVmZ0osUUFBQUEsU0FBUztnQkFBRWpKLE1BQU07Z0JBQVNsRSxVQUFVO2dCQUFNbUUsYUFBYTtnQkFDdkRnSixRQUFBQSxTQUFTO2dCQUFFakosTUFBTTtnQkFBVWxFLFVBQVU7Z0JBQU1tRSxhQUFhO2dCQUN4RHNKLFFBQUFBLGNBQWM7Z0JBQUV0SixhQUFhLEdBQUc4VTtnQkFDaENrSiw0QkFBb0I7Z0JBQ2xCaGUsYUFBYSxNQUFNOFU7O0FBR3pCO1FBRVEsa0NBQU84RSxDQUNiaFosYUFDQWtVLGdCQUNBcFksTUFDQStjO1lBRUEsTUFBTXdFLE9BQTZELEVBQ2pFMWhCLHNCQUFzQnFFLGFBQWEsT0FBT2xFLE9BQzFDME0sUUFBQUEsYUFBYTtnQkFBRUMsU0FBUyxZQUFZeUw7Z0JBQ3BDeEwsUUFBQUEsY0FBYztnQkFBRXRKLGFBQWEsR0FBRzhVOztZQUdsQyxNQUFNMkYsV0FBVy9kLEtBQUs0TCxNQUFNLEtBQUtqTixPQUFRd2IsS0FBTUEsRUFBRXJYLFdBQVc7WUFDNURpYixTQUFTOVEsUUFBUytRO2dCQUNoQixNQUFNM2EsT0FBTzJhLElBQUlsYyxRQUFRLEtBQUs7Z0JBQzlCeWYsS0FBS3RXLEtBQUt3QixpQkFBUztvQkFBRXBKO29CQUFNQyxhQUFhLE9BQU9EOzs7WUFHakQsSUFDRXJELEtBQUs4QyxXQUFXLGNBQ2hCOUMsS0FBSzhDLFdBQVcsa0JBQ2hCOUMsS0FBSzhDLFdBQVcsWUFDaEI5QyxLQUFLOEMsV0FBVyxVQUNoQjtnQkFDQXllLEtBQUt0VyxLQUNIcUIsaUJBQVM7b0JBQ1BqSixNQUFNO29CQUNObEUsVUFBVTtvQkFDVkcsTUFBTWlOLEtBQUFBO29CQUNOakosYUFBYTs7QUFHbkI7WUFDQSxJQUFJdEQsS0FBSzhDLFdBQVcsa0JBQWtCOUMsS0FBSzhDLFdBQVcsVUFBVTtnQkFDOUR5ZSxLQUFLdFcsS0FDSHFCLFFBQUFBLFNBQVM7b0JBQUVqSixNQUFNO29CQUFTbEUsVUFBVTtvQkFBT21FLGFBQWE7b0JBQ3hEZ0osUUFBQUEsU0FBUztvQkFBRWpKLE1BQU07b0JBQVVsRSxVQUFVO29CQUFPbUUsYUFBYTtvQkFDekRnSixRQUFBQSxTQUFTO29CQUFFakosTUFBTTtvQkFBWWxFLFVBQVU7b0JBQU9tRSxhQUFhOztBQUUvRDtZQUVBLElBQUl0RCxLQUFLOEMsV0FBVyxpQkFBaUI5QyxLQUFLOEMsV0FBVyxZQUFZO2dCQUMvRHllLEtBQUt0VyxLQUNIcVcsNEJBQW9CO29CQUNsQmhlLGFBQWEsTUFBTThVOztBQUd6QjtZQUVBLElBQ0UyRSxpQkFBaUIvYSxLQUFBQSxzQkFBc0JPLFlBQ3ZDd2EsaUJBQWlCL2EsS0FBQUEsc0JBQXNCVSxVQUN2Q3FhLGlCQUFpQi9hLEtBQUFBLHNCQUFzQlcsUUFDdkM7Z0JBQ0E0ZSxLQUFLdFcsS0FBSzJCLHNCQUFjO29CQUFFdEosYUFBYSxjQUFjOFU7b0JBQW1CdGIsTUFBTTBJOztBQUNoRjtZQUNBLElBQUl1WCxpQkFBaUIvYSxLQUFBQSxzQkFBc0JZLGFBQWE7Z0JBQ3REMmUsS0FBS3RXLEtBQUsyQixRQUFBQSxjQUFjO29CQUFFdEosYUFBYSx1QkFBdUI4VTtvQkFBbUJ0YixNQUFNLEVBQUN5Rzs7QUFDMUY7WUFFQSxPQUFPZ2U7QUFDVDtRQUVRLHlCQUFPNUosQ0FDYjNMLFlBQ0FMLFdBQ0FNLFVBQ0FDLHFCQUE4QjtZQUU5QixNQUFNUixvQkFBcUJ2SSxLQUN6QkEsRUFBRXlJLE1BQU0sS0FBS2pOLE9BQVF3YixLQUFNQSxFQUFFclgsV0FBVyxNQUFNbEUsSUFBS3ViLEtBQU1BLEVBQUV0TyxNQUFNO1lBRW5FLE1BQU1PLGdCQUFnQlYsa0JBQWtCQyxXQUFXL00sSUFBS3lFLFNBQUk7Z0JBQzFEQTtnQkFDQUMsYUFBYSxHQUFHRDtnQkFDaEJsRSxVQUFVO2dCQUNWckMsTUFBTXlHOztZQUdSLE1BQU1MLGFBQW1FLEtBQ3BFa0osY0FBY3hOLElBQUt1RSxLQUFNc0osUUFBQUEsU0FBU3RKLEtBQ3JDdUosUUFBQUEsYUFBYTtnQkFBRUMsU0FBUywyQkFBMkJYO2dCQUNuRFksc0JBQWM7Z0JBQUV0SixhQUFhO2dCQUM3QnVKLDZCQUFxQjtnQkFBRXZKLGFBQWE7O1lBR3RDLElBQUkySSxhQUFhLFNBQVNDLG9CQUFvQjtnQkFDNUNoSixXQUFXK0gsS0FDVHFCLGlCQUFTO29CQUNQakosTUFBTTtvQkFDTmxFLFVBQVU7b0JBQ1ZHLE1BQU1pTixLQUFBQTtvQkFDTmpKLGFBQWE7b0JBRWZnSixRQUFBQSxTQUFTO29CQUFFakosTUFBTTtvQkFBU2xFLFVBQVU7b0JBQU9tRSxhQUFhO29CQUN4RGdKLGlCQUFTO29CQUFFakosTUFBTTtvQkFBVWxFLFVBQVU7b0JBQU9tRSxhQUFhOztBQUU3RDtZQUVBLE9BQU9KO0FBQ1Q7O0lDNzNDSSxTQUFVc2UsYUFBYW5YOztRQUUzQixJQUFNb1gsbUJBQU4sTUFBTUE7Ozs7O2dCQUNZbmEsS0FBQXlCLE1BQU1DLFFBQUFBLFFBQVFDLElBQUl5WSxtQkFBaUJyZSxNQUFNNEYsSUFBSW9CO0FBQVM7WUFFdEUsMEJBQU9zWCxDQUNMQztnQkFFQSxPQUFPQSxPQUFPaGpCLElBQUtnTSxVQUFLO29CQUN0QnNFLFNBQVMsR0FBR3RFLE1BQU12SDtvQkFDbEJ3ZSxZQUFZLE1BQU10VSxLQUFBQSxhQUFheUQsU0FBU3BHOztBQUU1QztZQUVBLGdCQUFPa1gsQ0FDTGxYLE9BQ0FtWDtnQkFFQSxNQUFNN1EsV0FBVzZRLFdBQVduWCxNQUFNdkg7Z0JBQ2xDLE1BQU1wSCxlQUNHaVYsYUFBYSxjQUNoQkEsV0FDQTNLLFdBQUFBLFNBQVN3QixJQUFJNkMsT0FBT3JFLFdBQUFBLFNBQVMzSyxJQUFJc0s7Z0JBRXZDLFdBQVdqSyxVQUFVLGFBQWEsT0FBTztnQkFDekMsSUFBSUEsVUFBVSxNQUFNLE9BQU87Z0JBQzNCLElBQUlpQixNQUFNQyxRQUFRbEIsUUFBUSxPQUFPQSxNQUFNTSxTQUFTOE47Z0JBQ2hELE9BQU87QUFDVDtZQUVBLGNBQU8yRSxDQUNMM0UsU0FDQTVLLFVBQXVDO2dCQUV2QyxNQUFNc0osTUFBTXpCLEtBQUt5QixJQUFJRSxJQUFJM0IsS0FBSzBIO2dCQUM5QmpHLElBQUl3USxLQUFLO2dCQUVULE1BQU15SSxnQkFBZ0I3WCxLQUFBQSxRQUFReVgsT0FBT3ZYLFNBQVMxTCxPQUFRaU0sU0FDcER0RCxLQUFLd2EsVUFBVWxYLE9BQU9uTCxRQUFRd2lCO2dCQUdoQyxJQUFJQyxnQkFBNEI7Z0JBQ2hDLElBQUl6aUIsUUFBUTBpQixjQUFjO29CQUN4QnBaLElBQUl3USxLQUFLO29CQUNUMkksZ0JBQWdCNWEsS0FBS3FhLG9CQUFvQks7b0JBQ3pDalosSUFBSXdRLEtBQ0YsNEJBQTRCMkksY0FBY2hqQjtBQUU5QztnQkFFQSxNQUFNK1ksaUJBQXdELENBQUE7Z0JBQzlELElBQUl4WSxRQUFRMmlCLGlCQUFpQixPQUFPO29CQUNsQ25LLGVBQWVvSyx1QkFBdUI7QUFDeEM7Z0JBRUEsTUFBTUMsY0FBY04sY0FBY3BqQixJQUFLZ00sU0FDckMyTCxvQkFBb0J3QixPQUFPbk4sT0FBT25MLFFBQVFnSCxrQkFBa0J3UjtnQkFFOURsUCxJQUFJd1EsS0FBSyxhQUFhK0ksWUFBWXBqQjtnQkFFbEMsT0FBTztvQkFDTHFRLFFBQVFtUztvQkFDUlk7b0JBQ0FyVCxXQUFXLEtBQ05pVDs7QUFHVDs7UUFqRUlULG1CQUFnQkMscUJBQUF4WixpQkFBQSxFQURyQnVILE9BQUFBLE9BQU8sQ0FBQSxNQUNGZ1M7UUFtRU5wa0IsT0FBT0MsT0FBT21rQixrQkFBa0IsUUFBUTtZQUN0Q3hsQixPQUFPLGNBQWNvTzs7UUFFdkIsT0FBT29YO0FBQ1Q7SUN0RUFjLFdBQUFBLFdBQVd0WixJQUFJdVoscUJBQUFBLGdCQUFnQkMsWUFDNUJDLE9BQU87UUFDTmxYLFdBQVcsU0FBU21YLGVBQ2xCQyxVQUNBQztZQUVBQSxNQUNFQSxlQUNRRCxhQUFhLFdBQ2pCdmxCLE9BQU9DLE9BQ0xzbEIsVUFDQUUscUJBQUFBLDRCQUVGQTtZQUNOLE9BQU8zYSxrQkFBVztnQkFDaEJDLE9BQU95YSxJQUFJRSxZQUFZMWEsT0FBQUEsTUFBTTJhLFVBQVUzYSxPQUFBQSxNQUFNQztnQkFDN0MyYSxTQUFTSixJQUFJRSxZQUFZeGpCLFlBQVk7O0FBRXpDO09BRUQ4QjtJQUVIa2hCLFdBQUFBLFdBQVd0WixJQUFJdVoscUJBQUFBLGdCQUFnQlUsUUFDNUJSLE9BQU87UUFDTmxYLFdBQVcsU0FBUzJYLFdBQ2xCUCxVQUVBQztZQUVBLE9BQU8sU0FBU08sZ0JBQ2R6bkIsUUFDQVUsYUFDQVI7Z0JBRUEsT0FBTzJNLE9BQUFBLE9BQU9vYSxZQUFham5CLE9BQXBCNk0sQ0FDTDdNLFFBQ0FVLGFBQ0FSO0FBRUo7QUFDRjtPQUVEd0Y7SUFFSGtoQixXQUFBQSxXQUFXdFosSUFBSW1LLG9CQUFBQSxlQUFlQyxVQUMzQnFQLE9BQ0NsakIsWUFBWTtRQUNWTCxVQUFVO1FBR2JrQztJQUVIa2hCLFdBQUFBLFdBQVd0WixJQUFJbUssb0JBQUFBLGVBQWVpUSxLQUMzQlgsT0FBTztRQUNObFgsV0FBVyxTQUFTOFgsT0FBT0M7WUFDekIsT0FBTy9qQixZQUFZO2dCQUFFZ2tCLFNBQVNEO2dCQUFLcGtCLFVBQVU7O0FBQy9DO09BRURrQztJQUVIa2hCLFdBQUFBLFdBQVd0WixJQUFJbUssb0JBQUFBLGVBQWVxUSxLQUMzQmYsT0FBTztRQUNObFgsV0FBVyxTQUFTa1ksT0FBT0M7WUFDekIsT0FBT25rQixZQUFZO2dCQUFFb2tCLFNBQVNEO2dCQUFLeGtCLFVBQVU7O0FBQy9DO09BRURrQztJQUVIa2hCLFdBQUFBLFdBQVd0WixJQUFJbUssb0JBQUFBLGVBQWV5USxZQUMzQm5CLE9BQU87UUFDTmxYLFdBQVcsU0FBU3NZLGFBQWFQO1lBQy9CLE9BQU8vakIsWUFBWTtnQkFBRXVrQixXQUFXUjtnQkFBS3BrQixVQUFVOztBQUNqRDtPQUVEa0M7SUFFSGtoQixXQUFBQSxXQUFXdFosSUFBSW1LLG9CQUFBQSxlQUFlNFEsWUFDM0J0QixPQUFPO1FBQ05sWCxXQUFXLFNBQVN5WSxhQUFhTjtZQUMvQixPQUFPbmtCLFlBQVk7Z0JBQUUwa0IsV0FBV1A7Z0JBQUt4a0IsVUFBVTs7QUFDakQ7T0FFRGtDO0lBRUhraEIsV0FBQUEsV0FBV3RaLElBQUltSyxvQkFBQUEsZUFBZStRLE1BQzNCekIsT0FBTztRQUNObFgsV0FBVyxTQUFTNFksUUFDbEJ0bkI7WUFLQSxPQUFPLENBQUNuQixRQUFnQm9YO2dCQUN0QmpXLE9BQU9JLE1BQU1DLFFBQVFMLFFBQVFBLEtBQUssS0FBS0E7Z0JBQ3ZDLFdBQVdBLFNBQVMsZUFBZUEsS0FBS3VHLE1BQ3RDdkcsT0FBUUE7Z0JBQ1YsT0FBTzBDLFlBQVk7b0JBQ2pCMUMsTUFBTUE7b0JBQ05xQyxVQUFVO2tCQUZMSyxDQUdKN0QsUUFBUW9YOztBQUVmO09BRUQxUjtJQXNCSGtoQixXQUFBQSxXQUFXdFosSUFBSW1LLG9CQUFBQSxlQUFlaVIsTUFDM0IzQixPQUFPO1FBRU5sWCxXQUFXLFNBQVM4WSxRQUFRQztZQUMxQixPQUFPL2tCLFlBQVk7Z0JBQ2pCMUMsTUFBTXlHO2dCQUNOZ2hCLFFBQVE7Z0JBQ1JwbEIsVUFBVTs7QUFHZDtPQUVEa0M7SUFFSGtoQixXQUFBQSxXQUFXdFosSUFBSW1LLG9CQUFBQSxlQUFlb1IsTUFDM0I5QixPQUFPO1FBQ05sWCxXQUFXLFNBQVNpWixVQUFVaGxCO1lBQzVCLE1BQU1KLE9BQU9uQyxNQUFNQyxRQUFRc0MsV0FBV0EsVUFBVXBDLE9BQU9xQixPQUFPZTtZQUM5RCxPQUFPRCxZQUFZO2dCQUNqQkYsTUFBTUQ7Z0JBQ05GLFVBQVU7O0FBRWQ7T0FFRGtDO0lBRUhraEIsV0FBQUEsV0FBV3RaLElBQUltSyxvQkFBQUEsZUFBZXNSLFNBQzNCaEMsT0FBTztRQUNObFgsV0FBVyxTQUFTbVosV0FBV0M7WUFDN0IsT0FBT3BsQixZQUFZO2dCQUNqQnFsQixnQkFBZ0JELFFBQVEsV0FBV0EsTUFBTUEsSUFBSUU7Z0JBQzdDM2xCLFVBQVU7O0FBRWQ7T0FFRGtDO0lBRUhraEIsV0FBQUEsV0FBV3RaLElBQUk0TixLQUFBQSxnQkFBZ0JrTyxRQUM1QnJDLE9BQU87UUFDTmxYLFdBQVcsU0FBU3daLFVBQVUzaEI7WUFDNUIsT0FBTzdELFlBQVk7Z0JBQ2pCNkQsTUFBTUE7Z0JBQ05sRSxVQUFVOztBQUVkO09BRURrQztJQUVIa2hCLFdBQUFBLFdBQVd0WixJQUFJZ2MsV0FBQUEsZUFBZUMsYUFDM0J4QyxPQUFPO1FBQ05sWCxXQUFXLFNBQVMyWixlQUFlN2hCO1lBQ2pDLE9BQU85RCxZQUFZO2dCQUNqQjhELGFBQWFBO2dCQUNibkUsVUFBVTs7QUFFZDtPQUVEa0M7SUFFSGtoQixXQUFBQSxXQUFXdFosSUFBSTROLHFCQUFnQnVPLE1BQU0xQyxPQUFPO1FBQUVsWCxXQUFXYjtPQUFRdEo7SUNuTTNELE1BQU9na0Isa0JBQWtCQyxLQUFBQTtRQUM3QixXQUFBdm9CLENBQVl3b0I7WUFDVnBlLE1BQU1vZSxLQUFLRixVQUFVaGlCO0FBQ3ZCOztJQ0hJLE1BQU9taUIsNEJBQTRCQyxhQUFBQTtRQUN2QyxXQUFBMW9CLENBQVl3b0I7WUFDVnBlLE1BQU1xZSxvQkFBb0JuaUIsTUFBTWtpQixLQUFNO0FBQ3hDOztJQ1FXRyxRQUFBQSx1QkFBTixNQUFNQTtRQUNYLE1BQU1DLFdBQWtCQztZQUN0QixNQUFNamlCLE1BQU1paUIsS0FBSy9oQjtZQUNqQixNQUFNcU0sV0FBV3ZNLElBQUl3TTtZQUNyQixNQUFNdk0sVUFBVUQsSUFBSUc7WUFFcEIsTUFBTStoQixlQUFlQywwQkFBa0JDLFFBQVE7WUFDL0MsSUFBSUM7WUFFSixJQUNFTCxxQkFBcUJNLE9BQUFBLHFCQUNyQk4scUJBQXFCTyxLQUFBQSxrQkFDckI7Z0JBQ0FQLFlBQVksSUFBSVEsT0FBQUEsdUJBQXVCUixVQUFVUztnQkFDakRKLGFBQWNMLFVBQXFDVTtBQUNyRCxtQkFBTyxNQUFNVixxQkFBcUJGLGFBQUFBLFlBQVk7Z0JBQzVDLElBQUlFLFVBQWtCVyxXQUFXLEtBQUk7b0JBQ25DWCxZQUFZLElBQUlILG9CQUFvQkcsVUFBVVM7QUFDaEQsdUJBQUs7b0JBQ0hULFlBQVksSUFBSTdSLGFBQUFBLGNBQWM2UixVQUFVUztBQUMxQztBQUNGO1lBRUFsVyxTQUFTb1csT0FBUVgsVUFBd0JZLFFBQVFQLFlBQVlRLEtBQUs7Z0JBQ2hFRixRQUFTWCxVQUF3QlksUUFBUVA7Z0JBQ3pDaFksT0FBTzZYLGVBQWVGLFVBQVV0aUIsT0FBT3NpQixVQUFVUztnQkFDakRLLFlBQVcsSUFBSUMsTUFBT0M7Z0JBQ3RCM21CLE1BQU00RCxRQUFRb007Z0JBQ2R4RCxRQUFRNUksUUFBUTRJOztBQUVwQjs7SUE5QldrWixRQUFBQSx1QkFBb0J4ZCxpQkFBQSxFQURoQzBlLE9BQUFBLFdBQ1lsQjthQ1RHbUI7UUFDZCxPQUFPQyxPQUFBQSxXQUFXLElBQUlwQixRQUFBQTtBQUN4QjthQUVnQnFCO1FBQ2QsT0FBTy9iLE9BQUFBLGdCQUFnQmlGLFFBQUFBO0FBQ3pCO0lDb0JPLE1BQU0rVyx1QkFBdUM7UUFDbERDLE9BQU87UUFDUDNqQixhQUFhO1FBQ2I0akIsU0FBUztRQUNUbG5CLE1BQU07UUFDTm1uQixpQkFBaUI7UUFDakJDLG9CQUFvQjtRQUNwQmxPLE1BQU07WUFDSnBjLE1BQU07WUFDTnVxQixRQUFRO1lBQ1JDLGNBQWM7WUFDZGprQixNQUFNO1lBQ05DLGFBQWE7WUFDYmlrQixJQUFJOztRQUVOQyxzQkFBc0I7UUFDdEJDLGVBQWU7O1VDaENKQztRQVVYLFdBQUEzcUIsQ0FBWTBDO1lBQ1Y2SCxLQUFLN0gsVUFBVTttQkFDVkE7O0FBRVA7UUFFUSxTQUFBa29CO1lBQ04sSUFBSUMsTUFBTTtZQUNWLElBQUl0Z0IsS0FBSzdILFFBQVFvb0IsZ0JBQWdCO2dCQUMvQixNQUFNQyxNQUFNeGdCLEtBQUt5Z0IsSUFBSXpnQixLQUFLN0gsUUFBUW9vQjtnQkFDbENELE9BQU8seURBQXlERTtBQUNsRTtZQUNBLE9BQ0VGLE1BQ0EsMEdBRTRDdGdCLEtBQUs3SCxRQUFRZ29CLGlCQUFpQlQscUJBQXFCUztBQUduRztRQUVBLGdCQUFBTztZQUNFLE1BQU1DLFVBQStCLENBQUE7WUFDckMsSUFBSTNnQixLQUFLN0gsUUFBUXlvQixhQUFhO2dCQUM1QkQsUUFBUSxtQkFBbUIzZ0IsS0FBS3lnQixJQUFJemdCLEtBQUs3SCxRQUFReW9CLGFBQWE7QUFDaEU7WUFFQSxPQUFPO2dCQUNMQyxpQkFBaUI3Z0IsS0FBSzdILFFBQVF3bkI7bUJBQzNCZ0I7Z0JBQ0hHLFdBQVc5Z0IsS0FBS3FnQjtnQkFDaEJVLGdCQUFnQjtvQkFDZGIsc0JBQXNCbGdCLEtBQUs3SCxRQUFRK25COzs7QUFHekM7UUFFQSxHQUFBTyxDQUFJTyxNQUFjUixNQUFlO1lBQy9CLE1BQU1TLFdBQVd2b0IsZ0JBQUtzWCxLQUFLaFEsS0FBSzdILFFBQVErb0IsY0FBYyxJQUFJRjtZQUMxRCxNQUFNUCxNQUFNVSxHQUFBQSxhQUFhRixVQUFVO2dCQUFFRyxVQUFVOztZQUMvQyxPQUFPWixNQUFNLDJCQUEyQkMsTUFBTUE7QUFDaEQ7O1VDM0RXWTtRQUNYLFdBQUE1ckIsQ0FDbUI2ckIsS0FDQW5wQjtZQURBNkgsS0FBQXNoQixNQUFBQTtZQUNBdGhCLEtBQUE3SCxVQUFBQTtBQUNoQjtRQUVLLGNBQUFvcEI7WUFDTixNQUFNdmxCLGNBQWNnRSxLQUFLN0gsUUFBUU8sT0FDN0JzSCxLQUFLN0gsUUFBUTZELGNBQ2IsS0FDQSxvQkFBb0JnRSxLQUFLN0gsUUFBUXFwQiw4Q0FDakMsWUFBWXhoQixLQUFLN0gsUUFBUXNwQiwyQ0FDekJ6aEIsS0FBSzdILFFBQVE2RDtZQUVqQixNQUFNb0QsVUFBUyxJQUFJc2lCLFFBQUFBLGlCQUNoQkMsU0FBUzNoQixLQUFLN0gsUUFBUXduQixPQUN0QmlDLGVBQWU1bEIsYUFDZjZsQixXQUFXN2hCLEtBQUs3SCxRQUFReW5CLFdBQVcsU0FDbkNrQyxjQUFjOWhCLEtBQUs3SCxRQUFReVosUUFBUThOLHFCQUFxQjlOLE1BQ3hEL0M7WUFFSCxPQUFPa1QsUUFBQUEsY0FBY1IsZUFBZXZoQixLQUFLc2hCLEtBQUtsaUIsUUFBUTtnQkFDcERrTyxhQUFhdE4sS0FBSzdILFFBQVFtVixlQUFlOztBQUU3QztRQUVRLG9CQUFBMFUsQ0FDTnRwQixNQUNBdXBCLGFBQ0FDO1lBRUEsS0FBS3hwQixNQUFNO1lBRVgsTUFBTXlwQixjQUFjbmlCLEtBQUtzaEIsSUFBSWM7WUFDN0IxcEIsT0FBT0EsS0FBSzhDLFdBQVcsT0FBTzlDLE9BQU8sSUFBSUE7WUFDekN5cEIsWUFBWTFoQixJQUFJL0gsTUFBTSxDQUFDMnBCLE1BQVc1WjtnQkFDaEMwWixZQUFZRyxNQUFNN1osS0FBS3laLGVBQWUsS0FBSztvQkFDekMsZ0JBQWdCRDs7O0FBR3RCO1FBRU8sWUFBQU07WUFDTCxNQUFNQyxXQUFXeGlCLEtBQUt1aEI7WUFDdEIsTUFBTWtCLFlBQVksSUFBSXJDLGdCQUFnQjtnQkFDcENULE9BQU8zZixLQUFLN0gsUUFBUXduQjtnQkFDcEJqbkIsTUFBTXNILEtBQUs3SCxRQUFRTyxRQUFRZ25CLHFCQUFxQmhuQjtnQkFDaER3bkIsc0JBQXNCbGdCLEtBQUs3SCxRQUFRK25CLHdCQUF3QjtnQkFDM0RnQixZQUFZbGhCLEtBQUs3SCxRQUFRK29CO2dCQUN6Qk4sYUFBYTVnQixLQUFLN0gsUUFBUTBuQjtnQkFDMUJVLGdCQUFnQnZnQixLQUFLN0gsUUFBUTJuQjtnQkFDN0JLLGVBQWVuZ0IsS0FBSzdILFFBQVFnb0I7O1lBRTlCNEIsc0JBQWNXLE1BQ1oxaUIsS0FBSzdILFFBQVFPLFFBQVFnbkIscUJBQXFCaG5CLE1BQzFDc0gsS0FBS3NoQixLQUNMa0IsVUFDQTttQkFDS0MsVUFBVS9CO2dCQUNiaUMsaUJBQWlCM2lCLEtBQUs3SCxRQUFRcXBCLGtCQUMxQixHQUFHeGhCLEtBQUs3SCxRQUFRcXBCLG9CQUNoQnZwQjtnQkFDSjJxQixpQkFBaUI1aUIsS0FBSzdILFFBQVFzcEIsa0JBQzFCLEdBQUd6aEIsS0FBSzdILFFBQVFzcEIsb0JBQ2hCeHBCOztZQUlSK0gsS0FBS2dpQixxQkFDSGhpQixLQUFLN0gsUUFBUXFwQixpQkFDYixvQkFDQSxNQUFNZ0I7WUFHUnhpQixLQUFLZ2lCLHFCQUNIaGlCLEtBQUs3SCxRQUFRc3BCLGlCQUNiLHNCQUNBLE1BQU1vQixLQUFLcmMsVUFBVWdjO0FBRXpCOztVQ2dCV007UUFjSCxpQkFBV25nQjtZQUNqQixLQUFLM0MsS0FBSytpQixTQUFTO2dCQUVqQi9pQixLQUFLK2lCLFVBQVUsSUFBSUMsT0FBQUEsT0FBTztBQUM1QjtZQUNBLE9BQU9oakIsS0FBSytpQjtBQUNkO1FBYUEsaUJBQU9FLENBQVczQjtZQUNoQnRoQixLQUFLc2hCLE1BQU1BO1lBQ1gsT0FBT3RoQjtBQUNUO1FBY0EsbUJBQU9rakIsQ0FBYUM7WUFDbEJuakIsS0FBSytpQixVQUFVSSxnQkFBZ0IsSUFBSUgsT0FBQUEsT0FBTztZQUMxQ2hqQixLQUFLc2hCLElBQUk4QixVQUFVcGpCLEtBQUsraUI7WUFDeEIsT0FBTy9pQjtBQUNUO1FBZ0JBLGlCQUFPcWpCLENBQ0xDLFVBQTBCLElBQzFCQyxlQUF5QixFQUFDLE9BQU8sUUFBUSxPQUFPO1lBRWhELE1BQU1DLGlCQUNKRixZQUFZLE1BQU0sTUFBTUEsUUFBUWhzQixJQUFLbXNCLEtBQU1BLEVBQUUxVCxPQUFPMlQ7WUFFdEQsTUFBTUMsY0FBMkI7Z0JBQy9CQyxRQUFRLENBQUNBLFFBQVFDO29CQUVmLEtBQUtELFFBQVEsT0FBT0MsU0FBUyxNQUFNO29CQUVuQyxJQUNFTCxtQkFBbUIsT0FDbEI1dEIsTUFBTUMsUUFBUTJ0QixtQkFDYkEsZUFBZXZ1QixTQUFTMnVCLE9BQU9GLGdCQUNqQzt3QkFDQSxPQUFPRyxTQUFTLE1BQU07QUFDeEI7b0JBRUFBLFNBQVMsSUFBSTlGLFVBQVUsVUFBVTZGOztnQkFFbkNFLGFBQWE7Z0JBQ2JDLFNBQVNSLGFBQWF2VCxLQUFLOztZQUc3QmhRLEtBQUtzaEIsSUFBSStCLFdBQVdNO1lBQ3BCLE9BQU8zakI7QUFDVDtRQWNBLGdCQUFPZ2tCLENBQVU3ckI7WUFDZjtnQkFFRSxNQUFNOHJCLFNBQVNDLFFBQVE7Z0JBQ3ZCbGtCLEtBQUtzaEIsSUFBSTZDLElBQUlGLE9BQU85ckI7Z0JBQ3BCNkgsS0FBSzJDLE9BQU9sQixJQUFJO0FBRWxCLGNBQUUsT0FBT2Y7Z0JBQ1BWLEtBQUsyQyxPQUFPeWhCLEtBQUs7QUFDbkI7WUFFQSxPQUFPcGtCO0FBQ1Q7UUFjQSxtQkFBT3VpQixDQUFhcHFCO1lBQ2xCLE1BQU1rc0IsVUFBVSxJQUFJaEQsZUFBZXJoQixLQUFLc2hCLEtBQUs7Z0JBQzNDM0IsT0FBT3huQixRQUFRd25CO2dCQUNmM2pCLGFBQWE3RCxRQUFRNkQ7Z0JBQ3JCNGpCLFNBQVN6bkIsUUFBUXluQjtnQkFDakJsbkIsTUFBTVAsUUFBUU8sUUFBUTtnQkFDdEJ3bkIsc0JBQXNCL25CLFFBQVErbkIsd0JBQXdCO2dCQUN0RGdCLFlBQVkvb0IsUUFBUStvQjtnQkFDcEJyQixpQkFBaUIxbkIsUUFBUXlvQjtnQkFDekJkLG9CQUFvQjNuQixRQUFRb29CO2dCQUM1QkosZUFBZWhvQixRQUFRZ29CO2dCQUN2QnFCLGlCQUFpQnJwQixRQUFRcXBCO2dCQUN6QkMsaUJBQWlCdHBCLFFBQVFzcEI7O1lBRTNCNEMsUUFBUTlCO1lBQ1IsT0FBT3ZpQjtBQUNUO1FBY0EscUJBQU9za0IsSUFBa0JDO1lBQ3ZCLElBQUlBLE1BQU0zc0IsU0FBUyxHQUFHb0ksS0FBS3NoQixJQUFJZ0Qsa0JBQWtCQztZQUNqRCxPQUFPdmtCO0FBQ1Q7UUFhQSx1QkFBT3drQixJQUFvQkM7WUFDekJ6a0IsS0FBS3NoQixJQUFJa0Qsb0JBQ0hDLFFBQVE3c0IsU0FBUyxJQUFJNnNCLFVBQVUsRUFBQyxJQUFJckcsUUFBQUE7WUFFMUMsT0FBT3BlO0FBQ1Q7UUFjQSw0QkFBTzBrQixJQUF5QkM7WUFDOUIsSUFBSUEsYUFBYS9zQixTQUFTLEdBQ3hCb0ksS0FBS3NoQixJQUFJb0QseUJBQXlCQztZQUNwQyxPQUFPM2tCO0FBQ1Q7UUFnQkEsa0JBQWE0a0IsQ0FDWEMsT0FBZTNtQixPQUFPNG1CLFFBQVFyRyxJQUFJc0csU0FBUyxLQUMzQ3pHLE9BQTJCcm1CLFdBQzNCd0osTUFBZTtZQUVmekIsS0FBS3NoQixJQUFJMEQsT0FBT0gsTUFBTXZHLE1BQWEyRyxLQUFLN2U7Z0JBQ3RDLElBQUkzRSxLQUFLO29CQUNQLE1BQU1pSCxZQUFZMUksS0FBS3NoQixJQUFJNEQ7b0JBQzNCbGxCLEtBQUsyQyxPQUFPbEIsSUFBSSxpQ0FBaUNpSDtBQUNuRDs7QUFFSjs7O0lDblJXeWMsUUFBQUEsaUNBQThCQyxtQ0FBcEMsTUFBTUQ7UUFDWCxXQUFBMXZCLENBQ3FCNEwsZ0JBQ0Fna0I7WUFEQXJsQixLQUFBcUIsaUJBQUFBO1lBQ0FyQixLQUFBcWxCLFdBQUFBO0FBQ2xCO1FBRU8sbUJBQU1DLENBQWNwb0I7WUFDNUIsTUFBTTZDLFVBQVU3QyxJQUFJNkM7WUFDcEIsTUFBTXdsQixRQUEwQjtnQkFDOUJ4bEIsU0FBU0E7Z0JBQ1RTLFdBQVcsQ0FBQTs7WUFHYixNQUFNZ2xCLEtBQUtDLFVBQVV2b0I7WUFDckIsTUFBTXlGLFNBQVNqQixRQUFBQSxRQUFRakIsTUFBTWtCLElBQUk7Z0JBQUU2akI7O1lBRW5DeGxCLEtBQUtxQixlQUFlVixXQUNsQjVLLE9BQU9DLE9BQ0wsQ0FBQSxHQUNBMHZCLDBCQUNBO2dCQUNFL2lCO2dCQUNBd2MsV0FBVyxJQUFJQztnQkFDZnVHLFdBQVcsR0FBR3pvQixJQUFJZ0ksVUFBVWhJLElBQUl3TDtlQUVsQzZjO0FBR047UUFFQSxlQUFNaGtCLENBQVVnSCxTQUEyQi9HO1lBQ3pDLE1BQU10RSxNQUFNcUwsUUFBUWhNLGVBQWVDO1lBQ25DLE1BQU1pTSxNQUFNRixRQUFRaE0sZUFBZXNNO1lBQ25DLE1BQU1wSCxNQUFNQyxRQUFBQSxRQUFRQyxJQUFJeWpCLGtDQUFnQ3pqQixJQUFJM0IsS0FBS3VCO1lBQ2pFRSxJQUFJVyxNQUNGLFdBQVdwQyxLQUFLcUIsZUFBZXBCLG1CQUFtQi9DLElBQUlnSSxVQUFVaEksSUFBSXdMO2tCQUVoRTFJLEtBQUtzbEIsY0FBY3BvQjtZQUN6QnVFLElBQUlXLE1BQ0YsV0FBV3BDLEtBQUtxQixlQUFlcEIsa0NBQWtDL0MsSUFBSWdJLFVBQVVoSSxJQUFJd0w7a0JBRy9FMUksS0FBS3FsQixTQUFTN2MsS0FBS3RMLEtBQUt1TDtZQUM5QmhILElBQUlXLE1BQ0YsV0FBV3BDLEtBQUtxQixlQUFlcEIsc0NBQXNDL0MsSUFBSWdJLFVBQVVoSSxJQUFJd0w7WUFFekYsT0FBT2xILEtBQUtvQjtBQUNkOztJQS9DV3VpQixRQUFBQSxpQ0FBOEJDLG1DQUFBeGtCLE1BQUFBLFdBQUEsRUFEMUNDLE9BQUFBLFdBQVc7UUFBRUMsT0FBT0MsT0FBQUEsTUFBTUM7Z0RBR1lyQixRQUFBQSxxQkFDTnlJLG1DQUhwQitjO0lBa0RiLFNBQVNNLFVBQVV2b0I7UUFDakIsTUFBTTZDLFVBQVU3QyxJQUFJNkM7UUFDcEIsU0FBUzZsQixjQUFjanhCO1lBQ3JCLEtBQUtBLE9BQU8sT0FBT3NEO1lBQ25CLE1BQU00dEIsWUFBWWp3QixNQUFNQyxRQUFRbEIsU0FBU0EsTUFBTSxLQUFLQTtZQUNwRCxPQUFPa3hCLFVBQ0p2aEIsTUFBTSxLQUNOaE4sSUFBS3dZLFdBQVlBLFFBQVFDLFFBQ3pCMVksT0FBT3FiLFNBQVM7QUFDckI7UUFDQSxPQUNFa1QsY0FBYzdsQixVQUFVLHVCQUN4QjZsQixjQUFjN2xCLFVBQVUsaUJBQ3hCNmxCLGNBQWM3bEIsVUFBVSx1QkFDeEI2bEIsY0FBYzdsQixVQUFVLGlCQUN4QjdDLElBQUlzb0I7QUFFUjtJQ2hIQSxNQUFNTSxtQkFBbUIsSUFBSWhjO2FBUWJpYztRQUNkLE9BQU9ud0IsTUFBTXNOLEtBQUs0aUIsaUJBQWlCMXVCO0FBQ3JDO0lBRUEsU0FBUzR1QixpQkFBaUJDLE9BQWUxTDtRQUN2QyxJQUFJdUwsaUJBQWlCcGEsSUFBSXVhLFFBQVE7UUFDakNILGlCQUFpQjVtQixJQUFJK21CLE9BQU87WUFBRXJlLFNBQVNxZTtZQUFPMUw7O0FBQ2hEO0lBRUEsU0FBUzJMLG1CQUFtQnZ4QjtRQUMxQixjQUFjQSxVQUFVLGNBQWNBLE1BQU00QixxQkFBcUJvVSxvQkFBQUE7QUFDbkU7SUFFQSxTQUFTd2Isa0JBQWtCN2lCO1FBQ3pCLE9BQU8sR0FBR0EsTUFBTXZIO0FBQ2xCO0lBRUEsU0FBU3FxQixxQkFDUDlpQixPQUNBUDtRQUVBLE9BQU9BLFVBQVUsR0FBR08sTUFBTXZILGtCQUFrQmdILFlBQVksR0FBR08sTUFBTXZIO0FBQ25FO0lBY00sU0FBVXdOLFFBQVFqVjtRQUN0QixPQUFPLENBQ0xELFFBQ0FVLGFBQ0FzeEI7WUFFQSxJQUFJQyxXQUFrRGh5QjtZQUN0RCxXQUFXZ3lCLGFBQWEsYUFBYTtnQkFDbkMsTUFBTUMsYUFDSjl4QixRQUFRQyxZQUFZLHFCQUFxQkwsV0FBVztnQkFDdERpeUIsV0FBV0MsV0FBV0Y7QUFDeEI7WUFDQSxXQUFXQyxhQUFhLGFBQWE7Z0JBQ25DLE1BQU0sSUFBSW5pQixNQUNSLGtFQUFrRWtpQixxQkFBc0JoeUIsT0FBNEIwSDtBQUV4SDtZQUVBLE1BQU15cUIsaUJBQWlCRixhQUFhLFlBQVlKLG1CQUFtQkk7WUFDbkUsTUFBTUwsUUFBUU8sVUFDVkwsa0JBQWtCRyxZQUNsQkcsS0FBQUEscUJBQXFCSDtZQUV6Qk4saUJBQWlCQyxPQUFPO2dCQUN0QixJQUFJTyxTQUFTLE9BQU92Z0IsS0FBQUEsYUFBYXlELFNBQVM0YztnQkFDMUMsY0FBY0EsYUFBYSxXQUN2QkksS0FBQUEsUUFBWWptQixJQUFJNmxCLFlBQ2hCSSxLQUFBQSxRQUFZam1CLElBQUk2bEI7O1lBR3RCLE9BQU9wbEIsT0FBQUEsT0FBTytrQixNQUFQL2tCLENBQWM3TSxRQUFRVSxhQUFhc3hCOztBQUU5QztJQVVNLFNBQVU1YyxXQUNkbkcsT0FDQVA7UUFFQSxPQUFPLENBQ0wxTyxRQUNBVSxhQUNBc3hCO1lBRUEsTUFBTUosUUFBUUcscUJBQXFCOWlCLE9BQU9QO1lBQzFDaWpCLGlCQUFpQkMsT0FBTyxNQUFNVSxLQUFBQSxXQUFlamQsU0FBU3BHLE9BQU9QO1lBQzdELE9BQU83QixPQUFBQSxPQUFPK2tCLE1BQVAva0IsQ0FBYzdNLFFBQVFVLGFBQWFzeEI7O0FBRTlDOztJQ3BGYU8sUUFBQUEsa0JBQU4sTUFBTUE7Ozs7UUFPRCxzQkFBVzdnQjtZQUNuQixLQUFLL0YsS0FBS3NKLGNBQ1IsTUFBTSxJQUFJa0QsYUFBQUEsY0FBYztZQUMxQixPQUFPeE0sS0FBS3NKO0FBQ2Q7UUFFVSxjQUFXN0g7WUFDbkIsS0FBS3pCLEtBQUsraUIsU0FBUy9pQixLQUFLK2lCLFVBQVVyaEIsZ0JBQVFDLElBQUlrbEI7WUFDOUMsT0FBTzdtQixLQUFLK2lCO0FBQ2Q7UUFFQSxXQUFBdHRCLENBRW1CMEMsU0FDQTJ1QjtZQURBOW1CLEtBQUE3SCxVQUFBQTtZQUNBNkgsS0FBQThtQixZQUFBQTtBQUNoQjtRQUVILGNBQU9wZixDQUFRdlA7WUFDYixNQUFNc0osTUFBTXpCLEtBQUt5QixJQUFJRSxJQUFJM0IsS0FBSzBIO1lBQzlCLE1BQU1xZixpQkFBaUJoQjtZQUN2QixPQUFPO2dCQUNMOWQsUUFBUTRlO2dCQUNSbGYsV0FBVyxFQUNUO29CQUFFQyxTQUFTdEo7b0JBQXNCMG9CLFVBQVU3dUI7bUJBQzNDO29CQUFFeVAsU0FBU3JKO29CQUFrQnlvQixVQUFVaG5CLEtBQUsrRixhQUFha2hCO21CQUN6RDtvQkFDRXJmLFNBQVNsSjtvQkFDVDZiLFlBQVksTUFDVnBpQixRQUFRbVEsVUFBVWhSLElBQUs0dkI7d0JBQ3JCemxCLElBQUl3USxLQUFLLCtCQUErQmlWLEVBQUVuckI7d0JBQzFDLE9BQU8sSUFBSW1yQjswQkFDUDttQkFFVnZuQixRQUFBQSxxQkFDQXlJLFFBQUFBLHNCQUNBO29CQUNFUixTQUFTRyxPQUFBQTtvQkFDVEYsVUFBVXNkLFFBQUFBO3NCQUVUNEI7Z0JBRUw3ZSxTQUFTLEVBQ1A1SixzQkFDQUMsa0JBQ0FHLGdCQUNBaUIsUUFBQUEscUJBQ0F5SSxRQUFBQSx5QkFDRzJlLGVBQWV6dkIsSUFBSzZ2QixZQUFhQSxTQUFTdmY7O0FBR25EO1FBRUEsNEJBQWF3ZixDQUNYanZCO1lBRUEsTUFBTXNKLE1BQU16QixLQUFLeUIsSUFBSUUsSUFBSTNCLEtBQUtvbkI7WUFFOUIsS0FBS3BuQixLQUFLc0osY0FBYztnQkFDdEIsTUFBTStkLFVBQVVsdkIsUUFBUW12QixLQUFLaHdCLElBQUksRUFBRWl3QixPQUFPaE0sUUFBUXZWO29CQUNoRCxNQUFNd2hCLFdBQVd4aEIsS0FBS3FUO29CQUN0QixLQUFLbU8sVUFBVSxPQUFPLEVBQUNELE9BQU9oTTtvQkFDOUIsT0FBTyxFQUFDZ00sT0FBT2hNLFFBQVF2Vjs7Z0JBRXpCaEcsS0FBS3NKLGVBQWUsSUFBSW1lO3NCQUNsQnpuQixLQUFLc0osYUFBYW9lLEtBQUtMO2dCQUM3QixNQUFNTSxVQUFVM25CLEtBQUtzSixhQUFhMmQ7Z0JBQ2xDLEtBQUssSUFBSXRRLElBQUksR0FBR0EsSUFBSWdSLFFBQVEvdkIsUUFBUStlLEtBQUs7b0JBQ3ZDLE1BQU1pUixJQUFJenZCLFFBQVFtdkIsS0FBSzNRO29CQUN2QixNQUFNa1IsaUJBQWlCRCxFQUFFcmpCLE1BQU0sR0FBR3FqQixFQUFFaHdCO29CQUNwQyxJQUFJb0wsY0FBYzZrQixlQUFleE87b0JBQ2pDLEtBQ0dyVyxnQkFDQ0EsWUFBaURFLE1BQ25EO3dCQUNBLE1BQU1xa0IsUUFBUTFrQixLQUFBQSxRQUFRSSxlQUFlMGtCLFFBQVFoUixHQUFHNVQ7d0JBQ2hELEtBQUt3a0IsT0FDSCxNQUFNLElBQUkvYSxhQUFBQSxjQUNSLG9DQUFvQ21iLFFBQVFoUixHQUFHNVQ7d0JBRW5EOzRCQUNFQyxjQUFldWtCLE1BQTJDcmtCLE9BQ3REcWtCLFFBQ0EsSUFBS0E7QUFDWCwwQkFBRSxPQUFPN21COzRCQUNQLE1BQU0sSUFBSThMLGFBQUFBLGNBQ1Isa0NBQWtDbWIsUUFBUWhSLEdBQUc1VCxZQUFZckM7QUFFN0Q7QUFDRjtvQkFDQW9uQixPQUFBQSw0QkFBNEJILFFBQVFoUixHQUFHNVQsUUFBdkMra0IsQ0FBZ0Q5a0I7QUFDbEQ7Z0JBQ0F2QixJQUFJd1EsS0FBSztnQkFFVCxJQUFJOVosUUFBUTR2QixnQkFBZ0I7b0JBQzFCOzhCQUNRNXZCLFFBQVE0dkI7QUFDaEIsc0JBQUUsT0FBT3JuQjt3QkFDUCxNQUFNLElBQUk4TCxhQUFBQSxjQUFjLHFDQUFxQzlMO0FBQy9EO0FBQ0Y7QUFDRjtZQUVBLE9BQU9WLEtBQUsrRixZQUFZa2hCO0FBQzFCO1FBRUEsMkJBQU1lO1lBQ0osTUFBTXZtQixNQUFNb2xCLGtCQUFnQnBsQixJQUFJRSxJQUFJM0IsS0FBS2dvQjtZQUN6QyxNQUFNQyxXQUNKam9CLEtBQUs4bUIsVUFBVXJtQixJQUFTbEM7WUFDMUIsS0FBSyxNQUFNMFAsV0FBV2dhLFVBQ3BCO2dCQUNFLElBQUloYSxTQUFTO29CQUNYeE0sSUFBSXdRLEtBQUssaUJBQWlCaEUsUUFBUTFXOzBCQUM1QjBXLFFBQVFpYTtBQUNoQjtBQUNGLGNBQUUsT0FBT3huQjtnQkFDUGUsSUFBSWlGLE1BQU0sa0NBQWtDaEc7QUFDOUM7WUFDRjtzQkFDUTZJLEtBQUFBLFFBQVEyZTtBQUNoQixjQUFFLE9BQU94bkI7Z0JBQ1BlLElBQUlpRixNQUFNLCtCQUErQmhHO0FBQzNDO0FBQ0Y7O0lBbElXa21CLFFBQUFBLGtCQUFlQyxvQkFBQWptQixNQUFBQSxXQUFBLEVBRjNCdW5CLGlCQUNBaGdCLE9BQUFBLE9BQU8sQ0FBQSxJQW9CSGxILE1BQUFBLFFBQUEsR0FBQUMsY0FBTzVDLHdFQUVvQjhwQix1QkFyQm5CeEI7SUM5Qk4sTUFBTXlCLDhCQUE4QjFwQixPQUN6QztJQ0NJLFNBQVUycEIsdUJBQXVCdGlCO1FBQ3JDLE9BQU91aUIsYUFBYTVDLFdBQVduTyxJQUFJSSxXQUFXNVI7UUFFOUMsTUFBTWpFLFlBQVl3bUIsYUFBYXhzQixRQUFRd3NCO1FBRXZDLE1BQU1DLG9CQUFvQjV5QixNQUFNQyxRQUFRK2hCLFdBQ3BDQSxRQUFRdGdCLElBQUtvSjtZQUNYO2dCQUNFLFdBQVdBLEVBQUUrbkIsY0FBYyxZQUFZLE9BQU8vbkIsRUFBRStuQjtnQkFFaERDLFFBQVF0RSxLQUNOLG9CQUFvQnJpQiw2REFBNkRyQiw4Q0FBOENBO2dCQUVqSSxjQUFjQSxNQUFNLFdBQVdBLElBQUk2RixLQUFLQyxVQUFVOUY7QUFDcEQsY0FBRSxPQUFPaW9CO2dCQUNQRCxRQUFRdEUsS0FBSyxtQ0FBbUNyaUIsY0FBYzRtQjtnQkFDOUQsT0FBTzF3QjtBQUNUO2FBRUYyZixrQkFBa0JBLFFBQVE2USxjQUFjLGFBQ3RDN1EsUUFBUTZRLHFCQUNEN1EsWUFBWSxXQUNqQkEsVUFDQXJSLEtBQUtDLFVBQVVvUjtRQUV2QjhRLFFBQVF0bUIsTUFDTix1Q0FBdUNMLHdCQUF3QjRqQixpQkFBaUJuTyxPQUNoRmdSO1FBR0YsT0FBTyxFQUFDem1CLFdBQVc0akIsV0FBV25PLElBQUlnUjtBQUNwQzs7SUNyQmFJLFFBQUFBLG1CQUFnQkMscUJBQXRCLE1BQU1ELHlCQUF5QjNmO1FBR3BDLFdBQUF4VCxDQUNFMFQsZUFDcUNuSztZQUVyQ2EsTUFBTXNKLGVBQWUwZixtQkFBaUI5c0I7WUFDdENpRSxLQUFLaW9CLFdBQVdqcEIsU0FBUzFILElBQUt5TCxXQUFhRixhQUFnQnBDLElBQUlzQztBQUNqRTtRQUdBLE1BQUFpaUI7WUFDRSxNQUFNcmlCLFNBQVNqQixRQUFBQSxRQUFRQyxJQUFJa25CLG1CQUFpQjlzQjtZQUU1QyxNQUFNK3NCLFVBQVUsSUFBSUMsZ0JBQTBCQztnQkFDNUMsTUFBTUMsYUFDSixLQUFLQyxLQUFLQyxTQUFTNXhCLFNBQVMsSUFBSWdOLE1BQU0sR0FBRyxLQUFLNmtCO2dCQUVoRHptQixPQUFPc1AsS0FDTCwwQkFBMEJnWCx5QkFBeUJqcEIsS0FBS21KLGNBQWNsSjtnQkFFeEUsTUFBTW9wQixLQUFLLElBQUE7b0JBQUssV0FBQTV6Qjt3QkFDZHVLLEtBQUFpcEIsYUFBYUE7QUFhZjtvQkFaRSxPQUFBSyxJQUFXdGpCO3dCQUNUckQsT0FBT1AsTUFDTCxnQkFBZ0JwQyxLQUFLaXBCO3dCQUV2QixPQUFPTSxRQUFRQyxVQUFVdkUsS0FBSzs0QkFDNUIsTUFBTTdvQixPQUFPa3NCLHVCQUF1QnRpQjs0QkFDcENnakIsU0FBU3huQixLQUFLO2dDQUFFaE0sTUFBTTtnQ0FBVzRHOzs0QkFDakN1RyxPQUFPUCxNQUNMLGdCQUFnQnBDLEtBQUtpcEI7O0FBRzNCOztnQkFHRnRtQixPQUFPUixRQUNMLHdCQUF3QjhtQixxQkFBcUJqcEIsS0FBS2lvQixTQUFTcndCO2dCQUU3RCxLQUFLLE1BQU1xVyxXQUFXak8sS0FBS2lvQixVQUFVO29CQUNuQyxNQUFNd0IsY0FBY3hiLFNBQVN4WSxhQUFhc0csUUFBUTtvQkFDbEQ7d0JBQ0U0RyxPQUFPUCxNQUNMLHdCQUF3QjZtQix5QkFBeUJRO3dCQUVuRHhiLFFBQVF5YixRQUFRTDtBQUNsQixzQkFBRSxPQUFPM29CO3dCQUNQaUMsT0FBT1AsTUFDTCwrQkFBK0I2bUIseUJBQXlCUSxnQkFBZ0Ivb0IsR0FBR29lLFdBQVdwZTt3QkFFeEZpQyxPQUFPK0QsTUFBTWhHO0FBQ2Y7QUFDRjtnQkFFQSxPQUFPO29CQUNMaUMsT0FBT1AsTUFBTSw0QkFBNEI2bUI7b0JBRXpDLEtBQUssTUFBTWhiLFdBQVdqTyxLQUFLaW9CLFVBQVU7d0JBQ25DLE1BQU13QixjQUFjeGIsU0FBU3hZLGFBQWFzRyxRQUFRO3dCQUNsRDs0QkFDRTRHLE9BQU9QLE1BQ0wsMEJBQTBCNm1CLDJCQUEyQlE7NEJBRXZEeGIsUUFBUTBiLFVBQVVOO0FBQ3BCLDBCQUFFLE9BQU8zb0I7NEJBQ1BpQyxPQUFPUCxNQUNMLHFDQUFxQzZtQix5QkFBeUJRLGdCQUFnQi9vQixHQUFHb2UsV0FBV3BlOzRCQUU5RmlDLE9BQU8rRCxNQUFNaEc7QUFDZjtBQUNGOzs7WUFJSixNQUFNa3BCLHdCQUF3QjtZQUM5QixNQUFNQyxhQUFhQyxLQUFBQSxTQUFTRix1QkFBdUI5Z0IsS0FDakRDLFVBQUFBLElBQUk7Z0JBQ0ZwRyxPQUFPUCxNQUFNO2dCQUVmOUssVUFBQUEsSUFDRSxPQUFBO2dCQUNFOUIsTUFBTTtnQkFDTjRHLE1BQU07b0JBQ0oydEIsS0FBSSxJQUFJM0ssTUFBT0M7OztZQU12QixPQUFPMkssS0FBQUEsTUFBTWxCLFNBQVNlO0FBQ3hCO1FBSUEsY0FBQUksQ0FBK0IzbUI7WUFDN0IsTUFBTVgsU0FBU2pCLFFBQUFBLFFBQVFDLElBQUlrbkIsbUJBQWlCOXNCO1lBRTVDLE9BQU8sSUFBSWd0QixLQUFBQSxXQUEwQkM7Z0JBQ25DLE1BQU1LLEtBQUssSUFBQTtvQkFDVCxPQUFBQyxJQUFXdGpCO3dCQUNULE9BQU91akIsUUFBUUMsVUFBVXZFLEtBQUs7NEJBQzVCK0QsU0FBU3huQixLQUFLO2dDQUFFcEYsTUFBTTRKOzs7QUFFMUI7O2dCQUdGO29CQUNFLEtBQUssTUFBTWlJLFdBQVdqTyxLQUFLaW9CLFVBQVU7d0JBQ25DaGEsUUFBUXliLFFBQVFMO0FBQ2xCO0FBQ0Ysa0JBQUUsT0FBTzNvQjtvQkFDUHNvQixTQUFTdGlCLE1BQU0sNEJBQTRCaEcsRUFBRW9lLFdBQVdwZTtBQUMxRDtnQkFFQSxPQUFPO29CQUNMO3dCQUNFLEtBQUssTUFBTXVOLFdBQVdqTyxLQUFLaW9CLFVBQVU7NEJBQ25DaGEsUUFBUTBiLFVBQVVOO0FBQ3BCO0FBQ0Ysc0JBQUUsT0FBTzNvQjt3QkFDUGlDLE9BQU8rRCxNQUFNaEc7QUFDZjs7O0FBR047O0lBbEhBRSxNQUFBQSxXQUFBLEVBRENzcEIsMElBQ1NuQixLQUFBQSxlQWdGVEgseUJBQUFyeUIsV0FBQSxVQUFBO0lBSURxSyxNQUFBQSxXQUFBLEVBRkNzcEIsT0FBQUEsSUFBSSxZQUVXanBCLE1BQUFBLFFBQUEsR0FBQXVFLGFBQU0sK0lBQXlCdWpCLEtBQUFBLGVBOEI5Q0gseUJBQUFyeUIsV0FBQSxrQkFBQTtJQTlIVXF5QixRQUFBQSxtQkFBZ0JDLHFCQUFBam9CLE1BQUFBLFdBQUEsRUFENUJzUixxQkFNSWpSLE1BQUFBLFFBQUEsR0FBQUMsY0FBT21uQix1RUFETzFvQixRQUFBQSxxQkFBbUIvSixZQUp6Qmd6Qjs7SUNMQXVCLFFBQUFBLG9CQUFpQkMsc0JBQXZCLE1BQU1EO1FBQ1gsa0JBQU9FLENBQ0xyckIsVUFDQXRHLE9BQWU7WUFFZixPQUFPO2dCQUNMdVAsUUFBUW1pQjtnQkFDUnBQLGFBQWEsRUFBQzROLFFBQUFBO2dCQUNkMEIsU0FBUyxFQUNQQyxPQUFBQSxhQUFhQyxTQUFTLEVBQ3BCO29CQUNFOXhCLE1BQU1BLEtBQUs4QixRQUFRLE9BQU87b0JBQzFCeU4sUUFBUW1pQjs7Z0JBSWR6aUIsV0FBVyxFQUNUaEksUUFBQUEscUJBQ0E7b0JBQ0VpSSxTQUFTeWdCO29CQUNUckIsVUFBVWhvQixZQUFZOzs7QUFJOUI7O0lBeEJXbXJCLFFBQUFBLG9CQUFpQkMsc0JBQUF4cEIsTUFBQUEsV0FBQSxFQUQ3QnVILE9BQUFBLE9BQU8sQ0FBQSxNQUNLZ2lCOztJQ0lBTSxRQUFBQSxjQUFXQyxnQkFBakIsTUFBTUQ7UUFDWCx5QkFBYUUsQ0FDWHh5QjtZQUVBLE9BQU15eUIsaUJBQUVBLGlCQUFlL1AsY0FBRUEsZ0JBQWlCMWlCO1lBRTFDLE1BQU04dkIsaUJBQ0VyQix3QkFBZ0JRLGdCQUFnQmp2QjtZQUN4QyxNQUFNNkcsV0FBV2lwQixTQUFTM3dCLElBQUsyVyxXQUFZQSxRQUFRbEw7WUFFbkQsTUFBTXVuQixVQU9VLEVBQUMxRCxRQUFBQSxnQkFBZ0JsZixRQUFRdlA7WUFFekMsSUFBSXl5QixpQkFBaUI7Z0JBQ2pCNXJCLFNBQVMyRyxRQUFTNUM7b0JBQ2hCdW5CLFFBQVEzbUIsS0FDTnVXLGFBQWFuWCxTQUFTMkUsUUFBUTNFLFNBQVM7d0JBQ3JDOFg7d0JBQ0FGLG9CQUFvQnhpQixRQUFRd2lCO3dCQUM1QnhiLGtCQUFrQmhILFFBQVFnSDt3QkFDMUIyYixjQUFjM2lCLFFBQVEyaUI7OztBQUk5QjtZQUVGLElBQUkzaUIsUUFBUTB5QixpQkFBaUJDLHNCQUFzQjtnQkFDakRSLFFBQVEzbUIsS0FDTndtQixRQUFBQSxrQkFBa0JFLFlBQ2hCbHlCLFFBQVEweUIsZ0JBQWdCRSxvQkFBb0IvckI7QUFHbEQ7WUFFQSxPQUFPO2dCQUNMaUosUUFBUXlpQjtnQkFDUkosU0FBU0E7O0FBRWI7O0lBNUNXRyxRQUFBQSxjQUFXQyxnQkFBQTlwQixNQUFBQSxXQUFBLEVBRHZCdUgsT0FBQUEsT0FBTyxDQUFBLE1BQ0tzaUI7SUErQ05ya0IsZUFBZTRrQixpQkFBZ0M7SUN0RGhELFNBQVVDLGFBQWEzbkI7UUFDNUIsTUFBTTRuQixJQUFJdmdCLG9CQUFBQSxNQUFNbEssSUFBSTZDO1FBQ3BCLEtBQUs0bkIsR0FDSixNQUFNLElBQUkxZSxhQUFBQSxjQUFjLGlDQUFpQ2xKO1FBQzFELE1BQU1tTSxPQUFPaEcsS0FBQUEsV0FBV0MsU0FBU3doQjtRQUNqQyxPQUFPemI7QUFDUjtJQ3NDTyxNQUFNMGIsVUFBVTtJQVFoQixNQUFNQyxTQUFTO0lBUWYsTUFBTUMsZUFBZTtJQUVyQixNQUFNQyxlQUFlO0lBRTVCcnNCLFdBQUFBLFNBQVNzc0Isb0JBQW9CO0lBQzdCdHNCLFdBQUFBLFNBQVN1c0IsZ0JBQWdCRixjQUFjSDtJQUN2Q2xzQixXQUFBQSxTQUFTc3NCLG9CQUFvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsifQ==